diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index 436e2d4ad0f..763b48ab1d9 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -4,6 +4,11 @@ # # https://docs.github.com/en/repositories/managing-your-repositorys-settings-and-features/customizing-your-repository/about-code-owners +## Desktop native module ## +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 + ## Auth team files ## apps/browser/src/auth @bitwarden/team-auth-dev apps/cli/src/auth @bitwarden/team-auth-dev @@ -86,9 +91,13 @@ apps/web/src/app/shared @bitwarden/team-platform-dev apps/web/src/translation-constants.ts @bitwarden/team-platform-dev # Workflows .github/workflows/brew-bump-desktop.yml @bitwarden/team-platform-dev +.github/workflows/build-browser-target.yml @bitwarden/team-platform-dev .github/workflows/build-browser.yml @bitwarden/team-platform-dev +.github/workflows/build-cli-target.yml @bitwarden/team-platform-dev .github/workflows/build-cli.yml @bitwarden/team-platform-dev +.github/workflows/build-desktop-target.yml @bitwarden/team-platform-dev .github/workflows/build-desktop.yml @bitwarden/team-platform-dev +.github/workflows/build-web-target.yml @bitwarden/team-platform-dev .github/workflows/build-web.yml @bitwarden/team-platform-dev .github/workflows/chromatic.yml @bitwarden/team-platform-dev .github/workflows/lint.yml @bitwarden/team-platform-dev @@ -120,10 +129,6 @@ apps/browser/src/platform/popup/layout @bitwarden/team-ui-foundation apps/browser/src/popup/app-routing.animations.ts @bitwarden/team-ui-foundation apps/web/src/app/layouts @bitwarden/team-ui-foundation -## Desktop native module ## -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 ## Key management team files ## apps/desktop/src/key-management @bitwarden/team-key-management-dev diff --git a/.github/renovate.json b/.github/renovate.json5 similarity index 58% rename from .github/renovate.json rename to .github/renovate.json5 index f1efcbaffbe..6d6fbbd2539 100644 --- a/.github/renovate.json +++ b/.github/renovate.json5 @@ -1,46 +1,46 @@ { - "$schema": "https://docs.renovatebot.com/renovate-schema.json", - "extends": ["github>bitwarden/renovate-config"], - "enabledManagers": ["cargo", "github-actions", "npm"], - "packageRules": [ + $schema: "https://docs.renovatebot.com/renovate-schema.json", + extends: ["github>bitwarden/renovate-config"], // Extends our base config for pinned dependencies + enabledManagers: ["cargo", "github-actions", "npm"], + packageRules: [ { - "groupName": "github-action minor", - "matchManagers": ["github-actions"], - "matchUpdateTypes": ["minor"] + groupName: "github-action minor", + matchManagers: ["github-actions"], + matchUpdateTypes: ["minor"], }, { - "matchManagers": ["cargo"], - "commitMessagePrefix": "[deps] Platform:" + matchManagers: ["cargo"], + commitMessagePrefix: "[deps] Platform:", }, { - "groupName": "napi", - "matchPackageNames": ["napi", "napi-build", "napi-derive"] + groupName: "napi", + matchPackageNames: ["napi", "napi-build", "napi-derive"], }, { - "matchPackageNames": ["typescript", "zone.js"], - "matchUpdateTypes": ["major", "minor"], - "description": "Determined by Angular", - "enabled": false + matchPackageNames: ["typescript", "zone.js"], + matchUpdateTypes: ["major", "minor"], + description: "Determined by Angular", + enabled: false, }, { - "matchPackageNames": ["typescript", "zone.js"], - "matchUpdateTypes": "patch" + matchPackageNames: ["typescript", "zone.js"], + matchUpdateTypes: "patch", }, { - "groupName": "jest", - "matchPackageNames": ["@types/jest", "jest", "ts-jest", "jest-preset-angular"], - "matchUpdateTypes": "major" + groupName: "jest", + matchPackageNames: ["@types/jest", "jest", "ts-jest", "jest-preset-angular"], + matchUpdateTypes: "major", }, { - "groupName": "macOS/iOS bindings", - "matchPackageNames": ["core-foundation", "security-framework", "security-framework-sys"] + groupName: "macOS/iOS bindings", + matchPackageNames: ["core-foundation", "security-framework", "security-framework-sys"], }, { - "groupName": "zbus", - "matchPackageNames": ["zbus", "zbus_polkit"] + groupName: "zbus", + matchPackageNames: ["zbus", "zbus_polkit"], }, { - "matchPackageNames": [ + matchPackageNames: [ "base64-loader", "buffer", "bufferutil", @@ -56,20 +56,20 @@ "style-loader", "ts-loader", "url", - "util" + "util", ], - "description": "Admin Console owned dependencies", - "commitMessagePrefix": "[deps] AC:", - "reviewers": ["team:team-admin-console-dev"] + description: "Admin Console owned dependencies", + commitMessagePrefix: "[deps] AC:", + reviewers: ["team:team-admin-console-dev"], }, { - "matchPackageNames": ["qrious"], - "description": "Auth owned dependencies", - "commitMessagePrefix": "[deps] Auth:", - "reviewers": ["team:team-auth-dev"] + matchPackageNames: ["qrious"], + description: "Auth owned dependencies", + commitMessagePrefix: "[deps] Auth:", + reviewers: ["team:team-auth-dev"], }, { - "matchPackageNames": [ + matchPackageNames: [ "@angular-eslint/schematics", "angular-eslint", "eslint-config-prettier", @@ -82,14 +82,14 @@ "eslint", "husky", "lint-staged", - "typescript-eslint" + "typescript-eslint", ], - "description": "Architecture owned dependencies", - "commitMessagePrefix": "[deps] Architecture:", - "reviewers": ["team:dept-architecture"] + description: "Architecture owned dependencies", + commitMessagePrefix: "[deps] Architecture:", + reviewers: ["team:dept-architecture"], }, { - "matchPackageNames": [ + matchPackageNames: [ "@angular-eslint/eslint-plugin-template", "@angular-eslint/eslint-plugin", "@angular-eslint/schematics", @@ -105,13 +105,13 @@ "eslint-plugin-tailwindcss", "eslint", "husky", - "lint-staged" + "lint-staged", ], - "groupName": "Linting minor-patch", - "matchUpdateTypes": ["minor", "patch"] + groupName: "Linting minor-patch", + matchUpdateTypes: ["minor", "patch"], }, { - "matchPackageNames": [ + matchPackageNames: [ "@emotion/css", "@webcomponents/custom-elements", "concurrently", @@ -126,20 +126,20 @@ "@storybook/web-components-webpack5", "tabbable", "tldts", - "wait-on" + "wait-on", ], - "description": "Autofill owned dependencies", - "commitMessagePrefix": "[deps] Autofill:", - "reviewers": ["team:team-autofill-dev"] + description: "Autofill owned dependencies", + commitMessagePrefix: "[deps] Autofill:", + reviewers: ["team:team-autofill-dev"], }, { - "matchPackageNames": ["braintree-web-drop-in"], - "description": "Billing owned dependencies", - "commitMessagePrefix": "[deps] Billing:", - "reviewers": ["team:team-billing-dev"] + matchPackageNames: ["braintree-web-drop-in"], + description: "Billing owned dependencies", + commitMessagePrefix: "[deps] Billing:", + reviewers: ["team:team-billing-dev"], }, { - "matchPackageNames": [ + matchPackageNames: [ "@babel/core", "@babel/preset-env", "@bitwarden/sdk-internal", @@ -167,6 +167,7 @@ "electron-updater", "html-webpack-injector", "html-webpack-plugin", + "json5", "lowdb", "node-forge", "node-ipc", @@ -179,14 +180,14 @@ "webpack", "webpack-cli", "webpack-dev-server", - "webpack-node-externals" + "webpack-node-externals", ], - "description": "Platform owned dependencies", - "commitMessagePrefix": "[deps] Platform:", - "reviewers": ["team:team-platform-dev"] + description: "Platform owned dependencies", + commitMessagePrefix: "[deps] Platform:", + reviewers: ["team:team-platform-dev"], }, { - "matchPackageNames": [ + matchPackageNames: [ "@angular-devkit/build-angular", "@angular/animations", "@angular/cdk", @@ -208,6 +209,7 @@ "@storybook/addon-essentials", "@storybook/addon-interactions", "@storybook/addon-links", + "@storybook/addon-themes", "@storybook/angular", "@storybook/manager-api", "@storybook/theming", @@ -225,27 +227,27 @@ "remark-gfm", "storybook", "tailwindcss", - "zone.js" + "zone.js", ], - "description": "UI Foundation owned dependencies", - "commitMessagePrefix": "[deps] UI Foundation:", - "reviewers": ["team:team-ui-foundation"] + description: "UI Foundation owned dependencies", + commitMessagePrefix: "[deps] UI Foundation:", + reviewers: ["team:team-ui-foundation"], }, { - "matchPackageNames": [ + matchPackageNames: [ "@types/jest", "jest-junit", "jest-mock-extended", "jest-preset-angular", "jest-diff", - "ts-jest" + "ts-jest", ], - "description": "Secrets Manager owned dependencies", - "commitMessagePrefix": "[deps] SM:", - "reviewers": ["team:team-secrets-manager-dev"] + description: "Secrets Manager owned dependencies", + commitMessagePrefix: "[deps] SM:", + reviewers: ["team:team-secrets-manager-dev"], }, { - "matchPackageNames": [ + matchPackageNames: [ "@microsoft/signalr-protocol-msgpack", "@microsoft/signalr", "@types/jsdom", @@ -256,14 +258,14 @@ "oidc-client-ts", "papaparse", "utf-8-validate", - "zxcvbn" + "zxcvbn", ], - "description": "Tools owned dependencies", - "commitMessagePrefix": "[deps] Tools:", - "reviewers": ["team:team-tools-dev"] + description: "Tools owned dependencies", + commitMessagePrefix: "[deps] Tools:", + reviewers: ["team:team-tools-dev"], }, { - "matchPackageNames": [ + matchPackageNames: [ "@koa/multer", "@koa/router", "@types/inquirer", @@ -289,18 +291,18 @@ "node-fetch", "open", "proper-lockfile", - "qrcode-parser" + "qrcode-parser", ], - "description": "Vault owned dependencies", - "commitMessagePrefix": "[deps] Vault:", - "reviewers": ["team:team-vault-dev"] + description: "Vault owned dependencies", + commitMessagePrefix: "[deps] Vault:", + reviewers: ["team:team-vault-dev"], }, { - "matchPackageNames": ["@types/argon2-browser", "argon2", "argon2-browser", "big-integer"], - "description": "Key Management owned dependencies", - "commitMessagePrefix": "[deps] KM:", - "reviewers": ["team:team-key-management-dev"] - } + matchPackageNames: ["@types/argon2-browser", "argon2", "argon2-browser", "big-integer"], + description: "Key Management owned dependencies", + commitMessagePrefix: "[deps] KM:", + reviewers: ["team:team-key-management-dev"], + }, ], - "ignoreDeps": ["@types/koa-bodyparser", "bootstrap", "node-ipc", "node", "npm"] + ignoreDeps: ["@types/koa-bodyparser", "bootstrap", "node-ipc", "node", "npm"], } diff --git a/.github/workflows/build-browser-target.yml b/.github/workflows/build-browser-target.yml new file mode 100644 index 00000000000..3334326920c --- /dev/null +++ b/.github/workflows/build-browser-target.yml @@ -0,0 +1,33 @@ +name: Build Browser on PR Target + +on: + pull_request: + types: [opened, synchronize] + branches-ignore: + - 'l10n_master' + - 'cf-pages' + paths: + - 'apps/browser/**' + - 'libs/**' + - '*' + - '!*.md' + - '!*.txt' + workflow_call: + inputs: {} + +defaults: + run: + shell: bash + +jobs: + check-run: + name: Check PR run + uses: bitwarden/gh-actions/.github/workflows/check-run.yml@main + + run-workflow: + name: Run Build Browser on PR Target + needs: check-run + if: ${{ github.event.pull_request.head.repo.full_name != github.repository }} + uses: ./.github/workflows/build-browser.yml + secrets: inherit + diff --git a/.github/workflows/build-browser.yml b/.github/workflows/build-browser.yml index c9e9f588c83..b9a26f68eeb 100644 --- a/.github/workflows/build-browser.yml +++ b/.github/workflows/build-browser.yml @@ -1,7 +1,7 @@ name: Build Browser on: - pull_request_target: + pull_request: types: [opened, synchronize] branches-ignore: - 'l10n_master' @@ -38,19 +38,14 @@ defaults: shell: bash jobs: - check-run: - name: Check PR run - uses: bitwarden/gh-actions/.github/workflows/check-run.yml@main - setup: name: Setup runs-on: ubuntu-22.04 - needs: - - check-run outputs: repo_url: ${{ steps.gen_vars.outputs.repo_url }} adj_build_number: ${{ steps.gen_vars.outputs.adj_build_number }} node_version: ${{ steps.retrieve-node-version.outputs.node_version }} + has_secrets: ${{ steps.check-secrets.outputs.has_secrets }} steps: - name: Check out repo uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 @@ -74,6 +69,14 @@ jobs: NODE_VERSION=${NODE_NVMRC/v/''} echo "node_version=$NODE_VERSION" >> $GITHUB_OUTPUT + - 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 != '' }} + echo "has_secrets=$has_secrets" >> $GITHUB_OUTPUT + locales-test: name: Locales Test @@ -197,22 +200,14 @@ jobs: npm_command: "dist:edge" archive_name: "dist-edge.zip" artifact_name: "dist-edge-MV3" - - name: "firefox" - npm_command: "dist:firefox" - archive_name: "dist-firefox.zip" - artifact_name: "dist-firefox" - name: "firefox-mv3" npm_command: "dist:firefox:mv3" archive_name: "dist-firefox.zip" - artifact_name: "DO-NOT-USE-FOR-PROD-dist-firefox-MV3" - - name: "opera" - npm_command: "dist:opera" - archive_name: "dist-opera.zip" - artifact_name: "dist-opera" + artifact_name: "dist-firefox-MV3" - name: "opera-mv3" npm_command: "dist:opera:mv3" archive_name: "dist-opera.zip" - artifact_name: "DO-NOT-USE-FOR-PROD-dist-opera-MV3" + artifact_name: "dist-opera-MV3" steps: - name: Check out repo uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 @@ -281,6 +276,7 @@ jobs: needs: - setup - locales-test + if: ${{ needs.setup.outputs.has_secrets == 'true' }} env: _BUILD_NUMBER: ${{ needs.setup.outputs.adj_build_number }} _NODE_VERSION: ${{ needs.setup.outputs.node_version }} diff --git a/.github/workflows/build-cli-target.yml b/.github/workflows/build-cli-target.yml new file mode 100644 index 00000000000..81ec4178681 --- /dev/null +++ b/.github/workflows/build-cli-target.yml @@ -0,0 +1,33 @@ +name: Build CLI on PR Target + +on: + pull_request: + types: [opened, synchronize] + branches-ignore: + - 'l10n_master' + - 'cf-pages' + paths: + - 'apps/cli/**' + - 'libs/**' + - '*' + - '!*.md' + - '!*.txt' + - '.github/workflows/build-cli.yml' + - 'bitwarden_license/bit-cli/**' + +defaults: + run: + shell: bash + +jobs: + check-run: + name: Check PR run + uses: bitwarden/gh-actions/.github/workflows/check-run.yml@main + + run-workflow: + name: Run Build CLI on PR Target + needs: check-run + if: ${{ github.event.pull_request.head.repo.full_name != github.repository }} + uses: ./.github/workflows/build-cli.yml + secrets: inherit + diff --git a/.github/workflows/build-cli.yml b/.github/workflows/build-cli.yml index d5d78811cda..b3694ac423b 100644 --- a/.github/workflows/build-cli.yml +++ b/.github/workflows/build-cli.yml @@ -1,7 +1,7 @@ name: Build CLI on: - pull_request_target: + pull_request: types: [opened, synchronize] branches-ignore: - 'l10n_master' @@ -27,6 +27,8 @@ on: - '!*.txt' - '.github/workflows/build-cli.yml' - 'bitwarden_license/bit-cli/**' + workflow_call: + inputs: {} workflow_dispatch: inputs: sdk_branch: @@ -39,18 +41,13 @@ defaults: working-directory: apps/cli jobs: - check-run: - name: Check PR run - uses: bitwarden/gh-actions/.github/workflows/check-run.yml@main - setup: name: Setup runs-on: ubuntu-22.04 - needs: - - check-run outputs: package_version: ${{ steps.retrieve-package-version.outputs.package_version }} node_version: ${{ steps.retrieve-node-version.outputs.node_version }} + has_secrets: ${{ steps.check-secrets.outputs.has_secrets }} steps: - name: Check out repo uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 @@ -71,6 +68,14 @@ jobs: NODE_VERSION=${NODE_NVMRC/v/''} echo "node_version=$NODE_VERSION" >> $GITHUB_OUTPUT + - 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 != '' }} + echo "has_secrets=$has_secrets" >> $GITHUB_OUTPUT + cli: name: CLI ${{ matrix.os.base }} - ${{ matrix.license_type.readable }} strategy: @@ -117,7 +122,7 @@ jobs: working-directory: ./ - name: Download SDK Artifacts - if: ${{ inputs.sdk_branch != '' }} + if: ${{ inputs.sdk_branch != '' && needs.setup.outputs.has_secrets == 'true' }} uses: bitwarden/gh-actions/download-artifacts@main with: github_token: ${{secrets.GITHUB_TOKEN}} @@ -130,7 +135,7 @@ jobs: if_no_artifact_found: fail - name: Override SDK - if: ${{ inputs.sdk_branch != '' }} + if: ${{ inputs.sdk_branch != '' && needs.setup.outputs.has_secrets == 'true' }} working-directory: ./ run: | ls -l ../ @@ -272,7 +277,7 @@ jobs: working-directory: ./ - name: Download SDK Artifacts - if: ${{ inputs.sdk_branch != '' }} + if: ${{ inputs.sdk_branch != '' && needs.setup.outputs.has_secrets == 'true' }} uses: bitwarden/gh-actions/download-artifacts@main with: github_token: ${{secrets.GITHUB_TOKEN}} @@ -285,7 +290,7 @@ jobs: if_no_artifact_found: fail - name: Override SDK - if: ${{ inputs.sdk_branch != '' }} + if: ${{ inputs.sdk_branch != '' && needs.setup.outputs.has_secrets == 'true' }} working-directory: ./ run: | ls -l ../ diff --git a/.github/workflows/build-desktop-target.yml b/.github/workflows/build-desktop-target.yml new file mode 100644 index 00000000000..8c26f991174 --- /dev/null +++ b/.github/workflows/build-desktop-target.yml @@ -0,0 +1,32 @@ +name: Build Desktop on PR Target + +on: + pull_request: + types: [opened, synchronize] + branches-ignore: + - 'l10n_master' + - 'cf-pages' + paths: + - 'apps/desktop/**' + - 'libs/**' + - '*' + - '!*.md' + - '!*.txt' + - '.github/workflows/build-desktop.yml' + +defaults: + run: + shell: bash + +jobs: + check-run: + name: Check PR run + uses: bitwarden/gh-actions/.github/workflows/check-run.yml@main + + run-workflow: + name: Run Build Desktop on PR Target + needs: check-run + if: ${{ github.event.pull_request.head.repo.full_name != github.repository }} + uses: ./.github/workflows/build-desktop.yml + secrets: inherit + diff --git a/.github/workflows/build-desktop.yml b/.github/workflows/build-desktop.yml index ca681dac6b0..23722e7c7df 100644 --- a/.github/workflows/build-desktop.yml +++ b/.github/workflows/build-desktop.yml @@ -1,7 +1,7 @@ name: Build Desktop on: - pull_request_target: + pull_request: types: [opened, synchronize] branches-ignore: - 'l10n_master' @@ -25,6 +25,8 @@ on: - '!*.md' - '!*.txt' - '.github/workflows/build-desktop.yml' + workflow_call: + inputs: {} workflow_dispatch: inputs: sdk_branch: @@ -37,15 +39,9 @@ defaults: shell: bash jobs: - check-run: - name: Check PR run - uses: bitwarden/gh-actions/.github/workflows/check-run.yml@main - electron-verify: name: Verify Electron Version runs-on: ubuntu-22.04 - needs: - - check-run steps: - name: Check out repo uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 @@ -67,8 +63,6 @@ jobs: setup: name: Setup runs-on: ubuntu-22.04 - needs: - - check-run outputs: package_version: ${{ steps.retrieve-version.outputs.package_version }} release_channel: ${{ steps.release-channel.outputs.channel }} @@ -76,6 +70,7 @@ jobs: rc_branch_exists: ${{ steps.branch-check.outputs.rc_branch_exists }} hotfix_branch_exists: ${{ steps.branch-check.outputs.hotfix_branch_exists }} node_version: ${{ steps.retrieve-node-version.outputs.node_version }} + has_secrets: ${{ steps.check-secrets.outputs.has_secrets }} defaults: run: working-directory: apps/desktop @@ -138,6 +133,14 @@ jobs: NODE_VERSION=${NODE_NVMRC/v/''} echo "node_version=$NODE_VERSION" >> $GITHUB_OUTPUT + - 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 != '' }} + echo "has_secrets=$has_secrets" >> $GITHUB_OUTPUT + linux: name: Linux Build # Note, before updating the ubuntu version of the workflow, ensure the snap base image @@ -333,12 +336,14 @@ jobs: rustup show - name: Login to Azure + if: ${{ needs.setup.outputs.has_secrets == 'true' }} uses: Azure/login@e15b166166a8746d1a47596803bd8c1b595455cf # v1.6.0 with: creds: ${{ secrets.AZURE_KV_CI_SERVICE_PRINCIPAL }} - name: Retrieve secrets id: retrieve-secrets + if: ${{ needs.setup.outputs.has_secrets == 'true' }} uses: bitwarden/gh-actions/get-keyvault-secrets@main with: keyvault: "bitwarden-ci" @@ -353,7 +358,7 @@ jobs: working-directory: ./ - name: Download SDK Artifacts - if: ${{ inputs.sdk_branch != '' }} + if: ${{ inputs.sdk_branch != '' && needs.setup.outputs.has_secrets == 'true' }} uses: bitwarden/gh-actions/download-artifacts@main with: github_token: ${{secrets.GITHUB_TOKEN}} @@ -366,7 +371,7 @@ jobs: if_no_artifact_found: fail - name: Override SDK - if: ${{ inputs.sdk_branch != '' }} + if: ${{ inputs.sdk_branch != '' && needs.setup.outputs.has_secrets == 'true' }} working-directory: ./ run: | ls -l ../ @@ -386,7 +391,17 @@ jobs: working-directory: apps/desktop/desktop_native run: node build.js cross-platform - - name: Build & Sign (dev) + - name: Build + run: | + npm run build + + - name: Pack + if: ${{ needs.setup.outputs.has_secrets == 'false' }} + run: | + npm run pack:win + + - name: Pack & Sign (dev) + if: ${{ needs.setup.outputs.has_secrets == 'true' }} env: ELECTRON_BUILDER_SIGN: 1 SIGNING_VAULT_URL: ${{ steps.retrieve-secrets.outputs.code-signing-vault-url }} @@ -395,10 +410,10 @@ jobs: SIGNING_CLIENT_SECRET: ${{ steps.retrieve-secrets.outputs.code-signing-client-secret }} SIGNING_CERT_NAME: ${{ steps.retrieve-secrets.outputs.code-signing-cert-name }} run: | - npm run build npm run pack:win - name: Rename appx files for store + if: ${{ needs.setup.outputs.has_secrets == 'true' }} run: | Copy-Item "./dist/Bitwarden-${{ env._PACKAGE_VERSION }}-ia32.appx" ` -Destination "./dist/Bitwarden-${{ env._PACKAGE_VERSION }}-ia32-store.appx" @@ -408,6 +423,7 @@ jobs: -Destination "./dist/Bitwarden-${{ env._PACKAGE_VERSION }}-arm64-store.appx" - name: Package for Chocolatey + if: ${{ needs.setup.outputs.has_secrets == 'true' }} run: | Copy-Item -Path ./stores/chocolatey -Destination ./dist/chocolatey -Recurse Copy-Item -Path ./dist/nsis-web/Bitwarden-Installer-${{ env._PACKAGE_VERSION }}.exe ` @@ -419,6 +435,7 @@ jobs: choco pack ./dist/chocolatey/bitwarden.nuspec --version "$env:_PACKAGE_VERSION" --out ./dist/chocolatey - name: Fix NSIS artifact names for auto-updater + if: ${{ needs.setup.outputs.has_secrets == 'true' }} run: | Rename-Item -Path .\dist\nsis-web\Bitwarden-${{ env._PACKAGE_VERSION }}-ia32.nsis.7z ` -NewName bitwarden-${{ env._PACKAGE_VERSION }}-ia32.nsis.7z @@ -435,6 +452,7 @@ jobs: if-no-files-found: error - name: Upload installer exe artifact + if: ${{ needs.setup.outputs.has_secrets == 'true' }} uses: actions/upload-artifact@65c4c4a1ddee5b72f698fdd19549f0f0fb45cf08 # v4.6.0 with: name: Bitwarden-Installer-${{ env._PACKAGE_VERSION }}.exe @@ -442,6 +460,7 @@ jobs: if-no-files-found: error - name: Upload appx ia32 artifact + if: ${{ needs.setup.outputs.has_secrets == 'true' }} uses: actions/upload-artifact@65c4c4a1ddee5b72f698fdd19549f0f0fb45cf08 # v4.6.0 with: name: Bitwarden-${{ env._PACKAGE_VERSION }}-ia32.appx @@ -449,6 +468,7 @@ jobs: if-no-files-found: error - name: Upload store appx ia32 artifact + if: ${{ needs.setup.outputs.has_secrets == 'true' }} uses: actions/upload-artifact@65c4c4a1ddee5b72f698fdd19549f0f0fb45cf08 # v4.6.0 with: name: Bitwarden-${{ env._PACKAGE_VERSION }}-ia32-store.appx @@ -456,6 +476,7 @@ jobs: if-no-files-found: error - name: Upload NSIS ia32 artifact + if: ${{ needs.setup.outputs.has_secrets == 'true' }} uses: actions/upload-artifact@65c4c4a1ddee5b72f698fdd19549f0f0fb45cf08 # v4.6.0 with: name: bitwarden-${{ env._PACKAGE_VERSION }}-ia32.nsis.7z @@ -463,6 +484,7 @@ jobs: if-no-files-found: error - name: Upload appx x64 artifact + if: ${{ needs.setup.outputs.has_secrets == 'true' }} uses: actions/upload-artifact@65c4c4a1ddee5b72f698fdd19549f0f0fb45cf08 # v4.6.0 with: name: Bitwarden-${{ env._PACKAGE_VERSION }}-x64.appx @@ -470,6 +492,7 @@ jobs: if-no-files-found: error - name: Upload store appx x64 artifact + if: ${{ needs.setup.outputs.has_secrets == 'true' }} uses: actions/upload-artifact@65c4c4a1ddee5b72f698fdd19549f0f0fb45cf08 # v4.6.0 with: name: Bitwarden-${{ env._PACKAGE_VERSION }}-x64-store.appx @@ -477,6 +500,7 @@ jobs: if-no-files-found: error - name: Upload NSIS x64 artifact + if: ${{ needs.setup.outputs.has_secrets == 'true' }} uses: actions/upload-artifact@65c4c4a1ddee5b72f698fdd19549f0f0fb45cf08 # v4.6.0 with: name: bitwarden-${{ env._PACKAGE_VERSION }}-x64.nsis.7z @@ -484,6 +508,7 @@ jobs: if-no-files-found: error - name: Upload appx ARM64 artifact + if: ${{ needs.setup.outputs.has_secrets == 'true' }} uses: actions/upload-artifact@65c4c4a1ddee5b72f698fdd19549f0f0fb45cf08 # v4.6.0 with: name: Bitwarden-${{ env._PACKAGE_VERSION }}-arm64.appx @@ -491,6 +516,7 @@ jobs: if-no-files-found: error - name: Upload store appx ARM64 artifact + if: ${{ needs.setup.outputs.has_secrets == 'true' }} uses: actions/upload-artifact@65c4c4a1ddee5b72f698fdd19549f0f0fb45cf08 # v4.6.0 with: name: Bitwarden-${{ env._PACKAGE_VERSION }}-arm64-store.appx @@ -498,6 +524,7 @@ jobs: if-no-files-found: error - name: Upload NSIS ARM64 artifact + if: ${{ needs.setup.outputs.has_secrets == 'true' }} uses: actions/upload-artifact@65c4c4a1ddee5b72f698fdd19549f0f0fb45cf08 # v4.6.0 with: name: bitwarden-${{ env._PACKAGE_VERSION }}-arm64.nsis.7z @@ -505,6 +532,7 @@ jobs: if-no-files-found: error - name: Upload nupkg artifact + if: ${{ needs.setup.outputs.has_secrets == 'true' }} uses: actions/upload-artifact@65c4c4a1ddee5b72f698fdd19549f0f0fb45cf08 # v4.6.0 with: name: bitwarden.${{ env._PACKAGE_VERSION }}.nupkg @@ -512,6 +540,7 @@ jobs: if-no-files-found: error - name: Upload auto-update artifact + if: ${{ needs.setup.outputs.has_secrets == 'true' }} uses: actions/upload-artifact@65c4c4a1ddee5b72f698fdd19549f0f0fb45cf08 # v4.6.0 with: name: ${{ needs.setup.outputs.release_channel }}.yml @@ -574,11 +603,13 @@ jobs: key: ${{ runner.os }}-${{ github.run_id }}-safari-extension - name: Login to Azure + if: ${{ needs.setup.outputs.has_secrets == 'true' }} uses: Azure/login@e15b166166a8746d1a47596803bd8c1b595455cf # v1.6.0 with: creds: ${{ secrets.AZURE_KV_CI_SERVICE_PRINCIPAL }} - name: Download Provisioning Profiles secrets + if: ${{ needs.setup.outputs.has_secrets == 'true' }} env: ACCOUNT_NAME: bitwardenci CONTAINER_NAME: profiles @@ -591,6 +622,7 @@ jobs: --output none - name: Get certificates + if: ${{ needs.setup.outputs.has_secrets == 'true' }} run: | mkdir -p $HOME/certificates @@ -613,6 +645,7 @@ jobs: jq -r .value | base64 -d > $HOME/certificates/macdev-cert.p12 - name: Set up keychain + if: ${{ needs.setup.outputs.has_secrets == 'true' }} env: KEYCHAIN_PASSWORD: ${{ secrets.KEYCHAIN_PASSWORD }} run: | @@ -642,6 +675,7 @@ jobs: security set-key-partition-list -S apple-tool:,apple:,codesign: -s -k $KEYCHAIN_PASSWORD build.keychain - name: Set up provisioning profiles + if: ${{ needs.setup.outputs.has_secrets == 'true' }} run: | cp $HOME/secrets/bitwarden_desktop_appstore.provisionprofile \ $GITHUB_WORKSPACE/apps/desktop/bitwarden_desktop_appstore.provisionprofile @@ -661,7 +695,7 @@ jobs: working-directory: ./ - name: Download SDK Artifacts - if: ${{ inputs.sdk_branch != '' }} + if: ${{ inputs.sdk_branch != '' && needs.setup.outputs.has_secrets == 'true' }} uses: bitwarden/gh-actions/download-artifacts@main with: github_token: ${{secrets.GITHUB_TOKEN}} @@ -674,7 +708,7 @@ jobs: if_no_artifact_found: fail - name: Override SDK - if: ${{ inputs.sdk_branch != '' }} + if: ${{ inputs.sdk_branch != '' && needs.setup.outputs.has_secrets == 'true' }} working-directory: ./ run: | ls -l ../ @@ -701,6 +735,7 @@ jobs: browser-build: name: Browser Build needs: setup + if: ${{ needs.setup.outputs.has_secrets == 'true' }} uses: ./.github/workflows/build-browser.yml secrets: inherit @@ -708,6 +743,7 @@ jobs: macos-package-github: name: MacOS Package GitHub Release Assets runs-on: macos-13 + if: ${{ needs.setup.outputs.has_secrets == 'true' }} needs: - browser-build - macos-build @@ -949,6 +985,7 @@ jobs: macos-package-mas: name: MacOS Package Prod Release Asset runs-on: macos-13 + if: ${{ needs.setup.outputs.has_secrets == 'true' }} needs: - browser-build - macos-build @@ -1217,6 +1254,7 @@ jobs: macos-package-dev: name: MacOS Package Dev Release Asset runs-on: macos-13 + if: ${{ needs.setup.outputs.has_secrets == 'true' }} needs: - browser-build - macos-build diff --git a/.github/workflows/build-web-target.yml b/.github/workflows/build-web-target.yml new file mode 100644 index 00000000000..fb7074292b5 --- /dev/null +++ b/.github/workflows/build-web-target.yml @@ -0,0 +1,32 @@ +name: Build Web on PR Target + +on: + pull_request: + types: [opened, synchronize] + branches-ignore: + - 'l10n_master' + - 'cf-pages' + paths: + - 'apps/web/**' + - 'libs/**' + - '*' + - '!*.md' + - '!*.txt' + - '.github/workflows/build-web.yml' + +defaults: + run: + shell: bash + +jobs: + check-run: + name: Check PR run + uses: bitwarden/gh-actions/.github/workflows/check-run.yml@main + + run-workflow: + name: Run Build Web on PR Target + needs: check-run + if: ${{ github.event.pull_request.head.repo.full_name != github.repository }} + uses: ./.github/workflows/build-web.yml + secrets: inherit + diff --git a/.github/workflows/build-web.yml b/.github/workflows/build-web.yml index b7e8a51897c..423b15372ae 100644 --- a/.github/workflows/build-web.yml +++ b/.github/workflows/build-web.yml @@ -1,7 +1,7 @@ name: Build Web on: - pull_request_target: + pull_request: types: [opened, synchronize] branches-ignore: - 'l10n_master' @@ -27,6 +27,8 @@ on: - '.github/workflows/build-web.yml' release: types: [published] + workflow_call: + inputs: {} workflow_dispatch: inputs: custom_tag_extension: @@ -41,18 +43,13 @@ env: _AZ_REGISTRY: bitwardenprod.azurecr.io jobs: - check-run: - name: Check PR run - uses: bitwarden/gh-actions/.github/workflows/check-run.yml@main - setup: name: Setup runs-on: ubuntu-22.04 - needs: - - check-run outputs: version: ${{ steps.version.outputs.value }} node_version: ${{ steps.retrieve-node-version.outputs.node_version }} + has_secrets: ${{ steps.check-secrets.outputs.has_secrets }} steps: - name: Check out repo uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 @@ -70,6 +67,14 @@ jobs: NODE_VERSION=${NODE_NVMRC/v/''} echo "node_version=$NODE_VERSION" >> $GITHUB_OUTPUT + - 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 != '' }} + echo "has_secrets=$has_secrets" >> $GITHUB_OUTPUT + build-artifacts: name: Build artifacts runs-on: ubuntu-22.04 @@ -128,7 +133,7 @@ jobs: run: npm ci - name: Download SDK Artifacts - if: ${{ inputs.sdk_branch != '' }} + if: ${{ inputs.sdk_branch != '' && needs.setup.outputs.has_secrets == 'true' }} uses: bitwarden/gh-actions/download-artifacts@main with: github_token: ${{secrets.GITHUB_TOKEN}} @@ -141,7 +146,7 @@ jobs: if_no_artifact_found: fail - name: Override SDK - if: ${{ inputs.sdk_branch != '' }} + if: ${{ inputs.sdk_branch != '' && needs.setup.outputs.has_secrets == 'true' }} working-directory: ./ run: | ls -l ../ @@ -213,19 +218,23 @@ jobs: ########## ACRs ########## - name: Login to Prod Azure + if: ${{ needs.setup.outputs.has_secrets == 'true' }} uses: Azure/login@e15b166166a8746d1a47596803bd8c1b595455cf # v1.6.0 with: creds: ${{ secrets.AZURE_PROD_KV_CREDENTIALS }} - name: Log into Prod container registry + if: ${{ needs.setup.outputs.has_secrets == 'true' }} run: az acr login -n bitwardenprod - name: Login to Azure - CI Subscription + if: ${{ needs.setup.outputs.has_secrets == 'true' }} uses: Azure/login@e15b166166a8746d1a47596803bd8c1b595455cf # v1.6.0 with: creds: ${{ secrets.AZURE_KV_CI_SERVICE_PRINCIPAL }} - name: Retrieve github PAT secrets + if: ${{ needs.setup.outputs.has_secrets == 'true' }} id: retrieve-secret-pat uses: bitwarden/gh-actions/get-keyvault-secrets@main with: @@ -273,6 +282,7 @@ jobs: run: echo "name=$_AZ_REGISTRY/${PROJECT_NAME}:${IMAGE_TAG}" >> $GITHUB_OUTPUT - name: Build Docker image + if: ${{ needs.setup.outputs.has_secrets == 'true' }} id: build-docker uses: docker/build-push-action@67a2d409c0a876cbe6b11854e3e25193efe4e62d # v6.12.0 with: @@ -283,7 +293,7 @@ jobs: tags: ${{ steps.image-name.outputs.name }} secrets: | "GH_PAT=${{ steps.retrieve-secret-pat.outputs.github-pat-bitwarden-devops-bot-repo-scope }}" - + - name: Install Cosign if: github.event_name != 'pull_request_target' && github.ref == 'refs/heads/main' uses: sigstore/cosign-installer@dc72c7d5c4d10cd6bcb8cf6e3fd625a9e5e537da # v3.7.0 diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml index 5bc566202c6..4fbef027c7c 100644 --- a/.github/workflows/lint.yml +++ b/.github/workflows/lint.yml @@ -1,12 +1,20 @@ name: Lint on: - push: + pull_request: + types: [opened, synchronize] branches-ignore: - 'l10n_master' - 'cf-pages' paths-ignore: - '.github/workflows/**' + push: + branches: + - 'main' + - 'rc' + - 'hotfix-rc-*' + paths-ignore: + - '.github/workflows/**' workflow_dispatch: inputs: {} diff --git a/.github/workflows/scan.yml b/.github/workflows/scan.yml index ac7f0ae6f71..c5e189c4666 100644 --- a/.github/workflows/scan.yml +++ b/.github/workflows/scan.yml @@ -77,3 +77,4 @@ jobs: -Dsonar.sources=. -Dsonar.test.inclusions=**/*.spec.ts -Dsonar.exclusions=**/*.spec.ts + -Dsonar.pullrequest.key=${{ github.event.pull_request.number }} diff --git a/.storybook/main.ts b/.storybook/main.ts index d98ca06ead3..9583d1fc6f2 100644 --- a/.storybook/main.ts +++ b/.storybook/main.ts @@ -29,6 +29,7 @@ const config: StorybookConfig = { getAbsolutePath("@storybook/addon-a11y"), getAbsolutePath("@storybook/addon-designs"), getAbsolutePath("@storybook/addon-interactions"), + getAbsolutePath("@storybook/addon-themes"), { // @storybook/addon-docs is part of @storybook/addon-essentials // eslint-disable-next-line storybook/no-uninstalled-addons diff --git a/.storybook/preview.tsx b/.storybook/preview.tsx index d1ba27e108d..6bd28cfe809 100644 --- a/.storybook/preview.tsx +++ b/.storybook/preview.tsx @@ -1,96 +1,30 @@ import { setCompodocJson } from "@storybook/addon-docs/angular"; +import { withThemeByClassName } from "@storybook/addon-themes"; import { componentWrapperDecorator } from "@storybook/angular"; import type { Preview } from "@storybook/angular"; import docJson from "../documentation.json"; setCompodocJson(docJson); -const decorator = componentWrapperDecorator( - (story) => { - return ` - -
- ${story} -
-
- -
- ${story} -
-
- -
- ${story} -
-
- -
- ${story} -
-
- - - - - +const wrapperDecorator = componentWrapperDecorator((story) => { + return /*html*/ ` +
+ ${story} +
`; - }, - ({ globals }) => { - return { theme: `${globals["theme"]}` }; - }, -); +}); const preview: Preview = { - decorators: [decorator], - globalTypes: { - theme: { - description: "Global theme for components", - defaultValue: "both", - toolbar: { - title: "Theme", - icon: "circlehollow", - items: [ - { - title: "Light & Dark", - value: "both", - icon: "sidebyside", - }, - { - title: "Light", - value: "light", - icon: "sun", - }, - { - title: "Dark", - value: "dark", - icon: "moon", - }, - { - title: "Nord", - value: "nord", - left: "⛰", - }, - { - title: "Solarized", - value: "solarized", - left: "☯", - }, - ], - dynamicTitle: true, + decorators: [ + withThemeByClassName({ + themes: { + light: "theme_light", + dark: "theme_dark", }, - }, - }, + defaultTheme: "light", + }), + wrapperDecorator, + ], parameters: { controls: { matchers: { @@ -105,6 +39,9 @@ const preview: Preview = { }, }, docs: { source: { type: "dynamic", excludeDecorators: true } }, + backgrounds: { + disable: true, + }, }, tags: ["autodocs"], }; diff --git a/apps/browser/package.json b/apps/browser/package.json index 202ec1c4fe1..4cd1b36bd60 100644 --- a/apps/browser/package.json +++ b/apps/browser/package.json @@ -1,12 +1,12 @@ { "name": "@bitwarden/browser", - "version": "2025.1.3", + "version": "2025.2.1", "scripts": { "build": "npm run build:chrome", "build:chrome": "cross-env BROWSER=chrome MANIFEST_VERSION=3 NODE_OPTIONS=\"--max-old-space-size=8192\" webpack", "build:edge": "cross-env BROWSER=edge MANIFEST_VERSION=3 NODE_OPTIONS=\"--max-old-space-size=8192\" webpack", - "build:firefox": "cross-env BROWSER=firefox NODE_OPTIONS=\"--max-old-space-size=8192\" webpack", - "build:opera": "cross-env BROWSER=opera NODE_OPTIONS=\"--max-old-space-size=8192\" webpack", + "build:firefox": "cross-env BROWSER=firefox MANIFEST_VERSION=3 NODE_OPTIONS=\"--max-old-space-size=8192\" webpack", + "build:opera": "cross-env BROWSER=opera MANIFEST_VERSION=3 NODE_OPTIONS=\"--max-old-space-size=8192\" webpack", "build:safari": "cross-env BROWSER=safari NODE_OPTIONS=\"--max-old-space-size=8192\" webpack", "build:watch": "npm run build:watch:chrome", "build:watch:chrome": "npm run build:chrome -- --watch", diff --git a/apps/browser/src/_locales/ar/messages.json b/apps/browser/src/_locales/ar/messages.json index 269c9d9937a..de432971e83 100644 --- a/apps/browser/src/_locales/ar/messages.json +++ b/apps/browser/src/_locales/ar/messages.json @@ -2363,6 +2363,70 @@ "autofillBlockedNoticeGuidance": { "message": "Change this in settings" }, + "change": { + "message": "Change" + }, + "changeButtonTitle": { + "message": "Change password - $ITEMNAME$", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "atRiskPasswords": { + "message": "At-risk passwords" + }, + "atRiskPasswordsDescSingleOrg": { + "message": "$ORGANIZATION$ is requesting you change the $COUNT$ passwords because they are at risk.", + "placeholders": { + "organization": { + "content": "$1", + "example": "Acme Corp" + }, + "count": { + "content": "$2", + "example": "2" + } + } + }, + "atRiskPasswordsDescMultiOrg": { + "message": "Your organizations are requesting you change the $COUNT$ passwords because they are at risk.", + "placeholders": { + "count": { + "content": "$1", + "example": "2" + } + } + }, + "reviewAndChangeAtRiskPassword": { + "message": "Review and change one at-risk password" + }, + "reviewAndChangeAtRiskPasswordsPlural": { + "message": "Review and change $COUNT$ at-risk passwords", + "placeholders": { + "count": { + "content": "$1", + "example": "2" + } + } + }, + "changeAtRiskPasswordsFaster": { + "message": "Change at-risk passwords faster" + }, + "changeAtRiskPasswordsFasterDesc": { + "message": "Update your settings so you can quickly autofill your passwords and generate new ones" + }, + "turnOnAutofill": { + "message": "Turn on autofill" + }, + "turnedOnAutofill": { + "message": "Turned on autofill" + }, + "dismiss": { + "message": "Dismiss" + }, "websiteItemLabel": { "message": "الموقع $number$ (URI)", "placeholders": { @@ -3123,12 +3187,18 @@ "notificationSentDevice": { "message": "تم إرسال إشعار إلى جهازك." }, + "notificationSentDevicePart1": { + "message": "Unlock Bitwarden on your device or on the" + }, + "notificationSentDeviceAnchor": { + "message": "web app" + }, + "notificationSentDevicePart2": { + "message": "Make sure the Fingerprint phrase matches the one below before approving." + }, "aNotificationWasSentToYourDevice": { "message": "A notification was sent to your device" }, - "makeSureYourAccountIsUnlockedAndTheFingerprintEtc": { - "message": "Make sure your account is unlocked and the fingerprint phrase matches on the other device" - }, "youWillBeNotifiedOnceTheRequestIsApproved": { "message": "You will be notified once the request is approved" }, @@ -3138,6 +3208,9 @@ "loginInitiated": { "message": "بَدْء تسجيل الدخول" }, + "logInRequestSent": { + "message": "Request sent" + }, "exposedMasterPassword": { "message": "كلمة المرور الرئيسية مكشوفة" }, @@ -4146,15 +4219,6 @@ "itemName": { "message": "Item name" }, - "cannotRemoveViewOnlyCollections": { - "message": "You cannot remove collections with View only permissions: $COLLECTIONS$", - "placeholders": { - "collections": { - "content": "$1", - "example": "Work, Personal" - } - } - }, "organizationIsDeactivated": { "message": "Organization is deactivated" }, @@ -4887,6 +4951,15 @@ "extraWide": { "message": "Extra wide" }, + "cannotRemoveViewOnlyCollections": { + "message": "You cannot remove collections with View only permissions: $COLLECTIONS$", + "placeholders": { + "collections": { + "content": "$1", + "example": "Work, Personal" + } + } + }, "updateDesktopAppOrDisableFingerprintDialogTitle": { "message": "Please update your desktop application" }, diff --git a/apps/browser/src/_locales/az/messages.json b/apps/browser/src/_locales/az/messages.json index e06f7117e49..00f2a9e4253 100644 --- a/apps/browser/src/_locales/az/messages.json +++ b/apps/browser/src/_locales/az/messages.json @@ -2363,6 +2363,70 @@ "autofillBlockedNoticeGuidance": { "message": "Bunu ayarlarda dəyişdir" }, + "change": { + "message": "Change" + }, + "changeButtonTitle": { + "message": "Change password - $ITEMNAME$", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "atRiskPasswords": { + "message": "At-risk passwords" + }, + "atRiskPasswordsDescSingleOrg": { + "message": "$ORGANIZATION$ is requesting you change the $COUNT$ passwords because they are at risk.", + "placeholders": { + "organization": { + "content": "$1", + "example": "Acme Corp" + }, + "count": { + "content": "$2", + "example": "2" + } + } + }, + "atRiskPasswordsDescMultiOrg": { + "message": "Your organizations are requesting you change the $COUNT$ passwords because they are at risk.", + "placeholders": { + "count": { + "content": "$1", + "example": "2" + } + } + }, + "reviewAndChangeAtRiskPassword": { + "message": "Review and change one at-risk password" + }, + "reviewAndChangeAtRiskPasswordsPlural": { + "message": "Review and change $COUNT$ at-risk passwords", + "placeholders": { + "count": { + "content": "$1", + "example": "2" + } + } + }, + "changeAtRiskPasswordsFaster": { + "message": "Change at-risk passwords faster" + }, + "changeAtRiskPasswordsFasterDesc": { + "message": "Update your settings so you can quickly autofill your passwords and generate new ones" + }, + "turnOnAutofill": { + "message": "Turn on autofill" + }, + "turnedOnAutofill": { + "message": "Turned on autofill" + }, + "dismiss": { + "message": "Dismiss" + }, "websiteItemLabel": { "message": "Veb sayt $number$ (URI)", "placeholders": { @@ -3123,12 +3187,18 @@ "notificationSentDevice": { "message": "Cihazınıza bir bildiriş göndərildi." }, + "notificationSentDevicePart1": { + "message": "Cihazınızda Bitwarden kilidini açın, ya da " + }, + "notificationSentDeviceAnchor": { + "message": "veb tətbiqinizdə" + }, + "notificationSentDevicePart2": { + "message": "Təsdiqləməzdən əvvəl Barmaq izi ifadəsinin aşağıdakı ifadə ilə uyuşduğuna əmin olun." + }, "aNotificationWasSentToYourDevice": { "message": "Cihazınıza bir bildiriş göndərildi" }, - "makeSureYourAccountIsUnlockedAndTheFingerprintEtc": { - "message": "Hesabınızın kilidinin açıq olduğuna və barmaq izi ifadəsinin digər cihazda uyuşduğuna əmin olun" - }, "youWillBeNotifiedOnceTheRequestIsApproved": { "message": "Tələbiniz təsdiqləndikdə bildiriş alacaqsınız" }, @@ -3138,6 +3208,9 @@ "loginInitiated": { "message": "Giriş başladıldı" }, + "logInRequestSent": { + "message": "Tələb göndərildi" + }, "exposedMasterPassword": { "message": "İfşa olunmuş ana parol" }, @@ -4146,15 +4219,6 @@ "itemName": { "message": "Element adı" }, - "cannotRemoveViewOnlyCollections": { - "message": "\"Yalnız baxma\" icazələrinə sahib kolleksiyaları silə bilməzsiniz: $COLLECTIONS$", - "placeholders": { - "collections": { - "content": "$1", - "example": "Work, Personal" - } - } - }, "organizationIsDeactivated": { "message": "Təşkilat deaktiv edildi" }, @@ -4887,6 +4951,15 @@ "extraWide": { "message": "Ekstra enli" }, + "cannotRemoveViewOnlyCollections": { + "message": "\"Yalnız baxma\" icazələrinə sahib kolleksiyaları silə bilməzsiniz: $COLLECTIONS$", + "placeholders": { + "collections": { + "content": "$1", + "example": "Work, Personal" + } + } + }, "updateDesktopAppOrDisableFingerprintDialogTitle": { "message": "Lütfən masaüstü tətbiqinizi güncəlləyin" }, diff --git a/apps/browser/src/_locales/be/messages.json b/apps/browser/src/_locales/be/messages.json index 04d3ad78982..075afecde51 100644 --- a/apps/browser/src/_locales/be/messages.json +++ b/apps/browser/src/_locales/be/messages.json @@ -2363,6 +2363,70 @@ "autofillBlockedNoticeGuidance": { "message": "Change this in settings" }, + "change": { + "message": "Change" + }, + "changeButtonTitle": { + "message": "Change password - $ITEMNAME$", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "atRiskPasswords": { + "message": "At-risk passwords" + }, + "atRiskPasswordsDescSingleOrg": { + "message": "$ORGANIZATION$ is requesting you change the $COUNT$ passwords because they are at risk.", + "placeholders": { + "organization": { + "content": "$1", + "example": "Acme Corp" + }, + "count": { + "content": "$2", + "example": "2" + } + } + }, + "atRiskPasswordsDescMultiOrg": { + "message": "Your organizations are requesting you change the $COUNT$ passwords because they are at risk.", + "placeholders": { + "count": { + "content": "$1", + "example": "2" + } + } + }, + "reviewAndChangeAtRiskPassword": { + "message": "Review and change one at-risk password" + }, + "reviewAndChangeAtRiskPasswordsPlural": { + "message": "Review and change $COUNT$ at-risk passwords", + "placeholders": { + "count": { + "content": "$1", + "example": "2" + } + } + }, + "changeAtRiskPasswordsFaster": { + "message": "Change at-risk passwords faster" + }, + "changeAtRiskPasswordsFasterDesc": { + "message": "Update your settings so you can quickly autofill your passwords and generate new ones" + }, + "turnOnAutofill": { + "message": "Turn on autofill" + }, + "turnedOnAutofill": { + "message": "Turned on autofill" + }, + "dismiss": { + "message": "Dismiss" + }, "websiteItemLabel": { "message": "Вэб-сайт $number$ (URI)", "placeholders": { @@ -3123,12 +3187,18 @@ "notificationSentDevice": { "message": "Апавяшчэнне было адпраўлена на вашу прыладу." }, + "notificationSentDevicePart1": { + "message": "Unlock Bitwarden on your device or on the" + }, + "notificationSentDeviceAnchor": { + "message": "web app" + }, + "notificationSentDevicePart2": { + "message": "Make sure the Fingerprint phrase matches the one below before approving." + }, "aNotificationWasSentToYourDevice": { "message": "A notification was sent to your device" }, - "makeSureYourAccountIsUnlockedAndTheFingerprintEtc": { - "message": "Make sure your account is unlocked and the fingerprint phrase matches on the other device" - }, "youWillBeNotifiedOnceTheRequestIsApproved": { "message": "You will be notified once the request is approved" }, @@ -3138,6 +3208,9 @@ "loginInitiated": { "message": "Ініцыяваны ўваход" }, + "logInRequestSent": { + "message": "Request sent" + }, "exposedMasterPassword": { "message": "Скампраметаваны асноўны пароль" }, @@ -4146,15 +4219,6 @@ "itemName": { "message": "Назва элемента" }, - "cannotRemoveViewOnlyCollections": { - "message": "You cannot remove collections with View only permissions: $COLLECTIONS$", - "placeholders": { - "collections": { - "content": "$1", - "example": "Work, Personal" - } - } - }, "organizationIsDeactivated": { "message": "Organization is deactivated" }, @@ -4887,6 +4951,15 @@ "extraWide": { "message": "Extra wide" }, + "cannotRemoveViewOnlyCollections": { + "message": "You cannot remove collections with View only permissions: $COLLECTIONS$", + "placeholders": { + "collections": { + "content": "$1", + "example": "Work, Personal" + } + } + }, "updateDesktopAppOrDisableFingerprintDialogTitle": { "message": "Please update your desktop application" }, diff --git a/apps/browser/src/_locales/bg/messages.json b/apps/browser/src/_locales/bg/messages.json index 1423e64e8a3..d1006e85d49 100644 --- a/apps/browser/src/_locales/bg/messages.json +++ b/apps/browser/src/_locales/bg/messages.json @@ -2363,6 +2363,70 @@ "autofillBlockedNoticeGuidance": { "message": "Променете това в настройките" }, + "change": { + "message": "Промяна" + }, + "changeButtonTitle": { + "message": "Промяна на паролата – $ITEMNAME$", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "atRiskPasswords": { + "message": "Пароли в риск" + }, + "atRiskPasswordsDescSingleOrg": { + "message": "$ORGANIZATION$ изисква да промените $COUNT$ пароли, тъй като са в риск.", + "placeholders": { + "organization": { + "content": "$1", + "example": "Acme Corp" + }, + "count": { + "content": "$2", + "example": "2" + } + } + }, + "atRiskPasswordsDescMultiOrg": { + "message": "Вашата организация изисква да промените $COUNT$ пароли, тъй като са в риск.", + "placeholders": { + "count": { + "content": "$1", + "example": "2" + } + } + }, + "reviewAndChangeAtRiskPassword": { + "message": "Преглед и промяна на една парола в риск" + }, + "reviewAndChangeAtRiskPasswordsPlural": { + "message": "Преглед и промяна на $COUNT$ пароли в риск", + "placeholders": { + "count": { + "content": "$1", + "example": "2" + } + } + }, + "changeAtRiskPasswordsFaster": { + "message": "По-бърза промяна на паролите в риск" + }, + "changeAtRiskPasswordsFasterDesc": { + "message": "Променете настройките си, така че да можете бързо да попълвате автоматично паролите си, както и да генерирате нови" + }, + "turnOnAutofill": { + "message": "Включване на автоматичното попълване" + }, + "turnedOnAutofill": { + "message": "Автоматичното попълване беше включено" + }, + "dismiss": { + "message": "Отхвърляне" + }, "websiteItemLabel": { "message": "Уеб сайт $number$ (адрес)", "placeholders": { @@ -3123,12 +3187,18 @@ "notificationSentDevice": { "message": "Към устройството Ви е изпратено известие." }, + "notificationSentDevicePart1": { + "message": "Отключете Битоурден на устройството си или в" + }, + "notificationSentDeviceAnchor": { + "message": "приложението по уеб" + }, + "notificationSentDevicePart2": { + "message": "Уверете се, че уникалната фраза съвпада с тази по-долу, преди да одобрите." + }, "aNotificationWasSentToYourDevice": { "message": "Към устройството Ви е изпратено известие" }, - "makeSureYourAccountIsUnlockedAndTheFingerprintEtc": { - "message": "Уверете се, че регистрацията Ви е отключена и че уникалната фраза съвпада с другото устройство" - }, "youWillBeNotifiedOnceTheRequestIsApproved": { "message": "Ще получите уведомление когато заявката бъде одобрена" }, @@ -3138,6 +3208,9 @@ "loginInitiated": { "message": "Вписването е стартирано" }, + "logInRequestSent": { + "message": "Заявката е изпратена" + }, "exposedMasterPassword": { "message": "Разобличена главна парола" }, @@ -4146,15 +4219,6 @@ "itemName": { "message": "Име на елемента" }, - "cannotRemoveViewOnlyCollections": { - "message": "Не можете да премахвате колекции с права „Само за преглед“: $COLLECTIONS$", - "placeholders": { - "collections": { - "content": "$1", - "example": "Work, Personal" - } - } - }, "organizationIsDeactivated": { "message": "Организацията е деактивирана" }, @@ -4887,6 +4951,15 @@ "extraWide": { "message": "Много широко" }, + "cannotRemoveViewOnlyCollections": { + "message": "Не можете да премахвате колекции с права „Само за преглед“: $COLLECTIONS$", + "placeholders": { + "collections": { + "content": "$1", + "example": "Work, Personal" + } + } + }, "updateDesktopAppOrDisableFingerprintDialogTitle": { "message": "Моля, обновете самостоятелното приложение" }, diff --git a/apps/browser/src/_locales/bn/messages.json b/apps/browser/src/_locales/bn/messages.json index a4459b177e4..4ab178cc021 100644 --- a/apps/browser/src/_locales/bn/messages.json +++ b/apps/browser/src/_locales/bn/messages.json @@ -2363,6 +2363,70 @@ "autofillBlockedNoticeGuidance": { "message": "Change this in settings" }, + "change": { + "message": "Change" + }, + "changeButtonTitle": { + "message": "Change password - $ITEMNAME$", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "atRiskPasswords": { + "message": "At-risk passwords" + }, + "atRiskPasswordsDescSingleOrg": { + "message": "$ORGANIZATION$ is requesting you change the $COUNT$ passwords because they are at risk.", + "placeholders": { + "organization": { + "content": "$1", + "example": "Acme Corp" + }, + "count": { + "content": "$2", + "example": "2" + } + } + }, + "atRiskPasswordsDescMultiOrg": { + "message": "Your organizations are requesting you change the $COUNT$ passwords because they are at risk.", + "placeholders": { + "count": { + "content": "$1", + "example": "2" + } + } + }, + "reviewAndChangeAtRiskPassword": { + "message": "Review and change one at-risk password" + }, + "reviewAndChangeAtRiskPasswordsPlural": { + "message": "Review and change $COUNT$ at-risk passwords", + "placeholders": { + "count": { + "content": "$1", + "example": "2" + } + } + }, + "changeAtRiskPasswordsFaster": { + "message": "Change at-risk passwords faster" + }, + "changeAtRiskPasswordsFasterDesc": { + "message": "Update your settings so you can quickly autofill your passwords and generate new ones" + }, + "turnOnAutofill": { + "message": "Turn on autofill" + }, + "turnedOnAutofill": { + "message": "Turned on autofill" + }, + "dismiss": { + "message": "Dismiss" + }, "websiteItemLabel": { "message": "Website $number$ (URI)", "placeholders": { @@ -3123,12 +3187,18 @@ "notificationSentDevice": { "message": "A notification has been sent to your device." }, + "notificationSentDevicePart1": { + "message": "Unlock Bitwarden on your device or on the" + }, + "notificationSentDeviceAnchor": { + "message": "web app" + }, + "notificationSentDevicePart2": { + "message": "Make sure the Fingerprint phrase matches the one below before approving." + }, "aNotificationWasSentToYourDevice": { "message": "A notification was sent to your device" }, - "makeSureYourAccountIsUnlockedAndTheFingerprintEtc": { - "message": "Make sure your account is unlocked and the fingerprint phrase matches on the other device" - }, "youWillBeNotifiedOnceTheRequestIsApproved": { "message": "You will be notified once the request is approved" }, @@ -3138,6 +3208,9 @@ "loginInitiated": { "message": "Login initiated" }, + "logInRequestSent": { + "message": "Request sent" + }, "exposedMasterPassword": { "message": "Exposed Master Password" }, @@ -4146,15 +4219,6 @@ "itemName": { "message": "Item name" }, - "cannotRemoveViewOnlyCollections": { - "message": "You cannot remove collections with View only permissions: $COLLECTIONS$", - "placeholders": { - "collections": { - "content": "$1", - "example": "Work, Personal" - } - } - }, "organizationIsDeactivated": { "message": "Organization is deactivated" }, @@ -4887,6 +4951,15 @@ "extraWide": { "message": "Extra wide" }, + "cannotRemoveViewOnlyCollections": { + "message": "You cannot remove collections with View only permissions: $COLLECTIONS$", + "placeholders": { + "collections": { + "content": "$1", + "example": "Work, Personal" + } + } + }, "updateDesktopAppOrDisableFingerprintDialogTitle": { "message": "Please update your desktop application" }, diff --git a/apps/browser/src/_locales/bs/messages.json b/apps/browser/src/_locales/bs/messages.json index f826d33ae35..f95512b0952 100644 --- a/apps/browser/src/_locales/bs/messages.json +++ b/apps/browser/src/_locales/bs/messages.json @@ -2363,6 +2363,70 @@ "autofillBlockedNoticeGuidance": { "message": "Change this in settings" }, + "change": { + "message": "Change" + }, + "changeButtonTitle": { + "message": "Change password - $ITEMNAME$", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "atRiskPasswords": { + "message": "At-risk passwords" + }, + "atRiskPasswordsDescSingleOrg": { + "message": "$ORGANIZATION$ is requesting you change the $COUNT$ passwords because they are at risk.", + "placeholders": { + "organization": { + "content": "$1", + "example": "Acme Corp" + }, + "count": { + "content": "$2", + "example": "2" + } + } + }, + "atRiskPasswordsDescMultiOrg": { + "message": "Your organizations are requesting you change the $COUNT$ passwords because they are at risk.", + "placeholders": { + "count": { + "content": "$1", + "example": "2" + } + } + }, + "reviewAndChangeAtRiskPassword": { + "message": "Review and change one at-risk password" + }, + "reviewAndChangeAtRiskPasswordsPlural": { + "message": "Review and change $COUNT$ at-risk passwords", + "placeholders": { + "count": { + "content": "$1", + "example": "2" + } + } + }, + "changeAtRiskPasswordsFaster": { + "message": "Change at-risk passwords faster" + }, + "changeAtRiskPasswordsFasterDesc": { + "message": "Update your settings so you can quickly autofill your passwords and generate new ones" + }, + "turnOnAutofill": { + "message": "Turn on autofill" + }, + "turnedOnAutofill": { + "message": "Turned on autofill" + }, + "dismiss": { + "message": "Dismiss" + }, "websiteItemLabel": { "message": "Website $number$ (URI)", "placeholders": { @@ -3123,12 +3187,18 @@ "notificationSentDevice": { "message": "A notification has been sent to your device." }, + "notificationSentDevicePart1": { + "message": "Unlock Bitwarden on your device or on the" + }, + "notificationSentDeviceAnchor": { + "message": "web app" + }, + "notificationSentDevicePart2": { + "message": "Make sure the Fingerprint phrase matches the one below before approving." + }, "aNotificationWasSentToYourDevice": { "message": "A notification was sent to your device" }, - "makeSureYourAccountIsUnlockedAndTheFingerprintEtc": { - "message": "Make sure your account is unlocked and the fingerprint phrase matches on the other device" - }, "youWillBeNotifiedOnceTheRequestIsApproved": { "message": "You will be notified once the request is approved" }, @@ -3138,6 +3208,9 @@ "loginInitiated": { "message": "Login initiated" }, + "logInRequestSent": { + "message": "Request sent" + }, "exposedMasterPassword": { "message": "Exposed Master Password" }, @@ -4146,15 +4219,6 @@ "itemName": { "message": "Item name" }, - "cannotRemoveViewOnlyCollections": { - "message": "You cannot remove collections with View only permissions: $COLLECTIONS$", - "placeholders": { - "collections": { - "content": "$1", - "example": "Work, Personal" - } - } - }, "organizationIsDeactivated": { "message": "Organization is deactivated" }, @@ -4887,6 +4951,15 @@ "extraWide": { "message": "Extra wide" }, + "cannotRemoveViewOnlyCollections": { + "message": "You cannot remove collections with View only permissions: $COLLECTIONS$", + "placeholders": { + "collections": { + "content": "$1", + "example": "Work, Personal" + } + } + }, "updateDesktopAppOrDisableFingerprintDialogTitle": { "message": "Please update your desktop application" }, diff --git a/apps/browser/src/_locales/ca/messages.json b/apps/browser/src/_locales/ca/messages.json index ca168332c12..5349e244c45 100644 --- a/apps/browser/src/_locales/ca/messages.json +++ b/apps/browser/src/_locales/ca/messages.json @@ -879,7 +879,7 @@ "message": "Enllaç caducat" }, "pleaseRestartRegistrationOrTryLoggingIn": { - "message": "Please restart registration or try logging in." + "message": "Reinicieu el registre o proveu d'iniciar sessió." }, "youMayAlreadyHaveAnAccount": { "message": "És possible que ja tingueu un compte" @@ -2062,7 +2062,7 @@ "message": "Generador de nom d'usuari" }, "useThisEmail": { - "message": "Use this email" + "message": "Utilitza aquest correu" }, "useThisPassword": { "message": "Utilitzeu aquesta contrasenya" @@ -2085,7 +2085,7 @@ "message": "Acció quan acabe el temps d'espera de la caixa forta" }, "vaultTimeoutAction1": { - "message": "Timeout action" + "message": "Acció després del temps d'espera" }, "lock": { "message": "Bloqueja", @@ -2363,6 +2363,70 @@ "autofillBlockedNoticeGuidance": { "message": "Canvieu-ho a la configuració" }, + "change": { + "message": "Canvia" + }, + "changeButtonTitle": { + "message": "Change password - $ITEMNAME$", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "atRiskPasswords": { + "message": "At-risk passwords" + }, + "atRiskPasswordsDescSingleOrg": { + "message": "$ORGANIZATION$ is requesting you change the $COUNT$ passwords because they are at risk.", + "placeholders": { + "organization": { + "content": "$1", + "example": "Acme Corp" + }, + "count": { + "content": "$2", + "example": "2" + } + } + }, + "atRiskPasswordsDescMultiOrg": { + "message": "Your organizations are requesting you change the $COUNT$ passwords because they are at risk.", + "placeholders": { + "count": { + "content": "$1", + "example": "2" + } + } + }, + "reviewAndChangeAtRiskPassword": { + "message": "Review and change one at-risk password" + }, + "reviewAndChangeAtRiskPasswordsPlural": { + "message": "Review and change $COUNT$ at-risk passwords", + "placeholders": { + "count": { + "content": "$1", + "example": "2" + } + } + }, + "changeAtRiskPasswordsFaster": { + "message": "Change at-risk passwords faster" + }, + "changeAtRiskPasswordsFasterDesc": { + "message": "Update your settings so you can quickly autofill your passwords and generate new ones" + }, + "turnOnAutofill": { + "message": "Turn on autofill" + }, + "turnedOnAutofill": { + "message": "Turned on autofill" + }, + "dismiss": { + "message": "Descarta" + }, "websiteItemLabel": { "message": "Website $number$ (URI)", "placeholders": { @@ -2826,7 +2890,7 @@ "message": "Error de desxifrat" }, "couldNotDecryptVaultItemsBelow": { - "message": "Bitwarden could not decrypt the vault item(s) listed below." + "message": "Bitwarden no ha pogut desxifrar els elements de la caixa forta que s'indiquen a continuació." }, "contactCSToAvoidDataLossPart1": { "message": "Contacteu amb el servei d'atenció al client", @@ -3123,12 +3187,18 @@ "notificationSentDevice": { "message": "S'ha enviat una notificació al vostre dispositiu." }, + "notificationSentDevicePart1": { + "message": "Unlock Bitwarden on your device or on the" + }, + "notificationSentDeviceAnchor": { + "message": "aplicació web" + }, + "notificationSentDevicePart2": { + "message": "Make sure the Fingerprint phrase matches the one below before approving." + }, "aNotificationWasSentToYourDevice": { "message": "S'ha enviat una notificació al vostre dispositiu" }, - "makeSureYourAccountIsUnlockedAndTheFingerprintEtc": { - "message": "Assegureu-vos que la vostra caixa forta estiga desbloquejada i que la frase d'empremta digital coincidisca en l'altre dispositiu" - }, "youWillBeNotifiedOnceTheRequestIsApproved": { "message": "Se us notificarà un vegada s'haja aprovat la sol·licitud" }, @@ -3138,6 +3208,9 @@ "loginInitiated": { "message": "S'ha iniciat la sessió" }, + "logInRequestSent": { + "message": "Sol·licitud enviada" + }, "exposedMasterPassword": { "message": "Contrasenya mestra exposada" }, @@ -3917,7 +3990,7 @@ "description": "Label indicating the most common import formats" }, "confirmContinueToBrowserSettingsTitle": { - "message": "Continue to browser settings?", + "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" }, "confirmContinueToHelpCenter": { @@ -4146,15 +4219,6 @@ "itemName": { "message": "Nom d'element" }, - "cannotRemoveViewOnlyCollections": { - "message": "You cannot remove collections with View only permissions: $COLLECTIONS$", - "placeholders": { - "collections": { - "content": "$1", - "example": "Work, Personal" - } - } - }, "organizationIsDeactivated": { "message": "Organization is deactivated" }, @@ -4184,7 +4248,7 @@ "message": "Enllaçat" }, "copySuccessful": { - "message": "Copy Successful" + "message": "Còpia correcta" }, "upload": { "message": "Puja" @@ -4196,7 +4260,7 @@ "message": "La mida màxima del fitxer és de 500 MB" }, "deleteAttachmentName": { - "message": "Delete attachment $NAME$", + "message": "Suprimeix adjunt $NAME$", "placeholders": { "name": { "content": "$1", @@ -4214,7 +4278,7 @@ } }, "permanentlyDeleteAttachmentConfirmation": { - "message": "Are you sure you want to permanently delete this attachment?" + "message": "Esteu segur que voleu suprimir definitivament aquest adjunt?" }, "premium": { "message": "Premium" @@ -4511,13 +4575,13 @@ } }, "successfullyAssignedCollections": { - "message": "Successfully assigned collections" + "message": "Col·leccions assignades correctament" }, "nothingSelected": { - "message": "You have not selected anything." + "message": "No heu seleccionat res." }, "movedItemsToOrg": { - "message": "Selected items moved to $ORGNAME$", + "message": "Els elements seleccionats s'han desplaçat a $ORGNAME$", "placeholders": { "orgname": { "content": "$1", @@ -4526,7 +4590,7 @@ } }, "itemsMovedToOrg": { - "message": "Items moved to $ORGNAME$", + "message": "S'han desplaçat elements a $ORGNAME$", "placeholders": { "orgname": { "content": "$1", @@ -4535,7 +4599,7 @@ } }, "itemMovedToOrg": { - "message": "Item moved to $ORGNAME$", + "message": "S'ha desplaçat un element a $ORGNAME$", "placeholders": { "orgname": { "content": "$1", @@ -4564,19 +4628,19 @@ "message": "Item Location" }, "fileSend": { - "message": "File Send" + "message": "Send de fitxer" }, "fileSends": { - "message": "File Sends" + "message": "Sends de fitxer" }, "textSend": { - "message": "Text Send" + "message": "Send de text" }, "textSends": { - "message": "Text Sends" + "message": "Sends de text" }, "accountActions": { - "message": "Account actions" + "message": "Accions del compte" }, "showNumberOfAutofillSuggestions": { "message": "Mostra el nombre de suggeriments d'emplenament automàtic d'inici de sessió a la icona d'extensió" @@ -4585,10 +4649,10 @@ "message": "Mostra accions de còpia ràpida a la caixa forta" }, "systemDefault": { - "message": "System default" + "message": "Per defecte del sistema" }, "enterprisePolicyRequirementsApplied": { - "message": "Enterprise policy requirements have been applied to this setting" + "message": "Els requisits de la política empresarial s'han aplicat a aquesta configuració" }, "sshPrivateKey": { "message": "Clau privada" @@ -4618,7 +4682,7 @@ "message": "Torneu-ho a provar" }, "vaultCustomTimeoutMinimum": { - "message": "Minimum custom timeout is 1 minute." + "message": "El temps d'espera personalitzat mínim és d'1 minut." }, "additionalContentAvailable": { "message": "Additional content is available" @@ -4627,10 +4691,10 @@ "message": "File saved to device. Manage from your device downloads." }, "showCharacterCount": { - "message": "Show character count" + "message": "Mostra el recompte de caràcters" }, "hideCharacterCount": { - "message": "Hide character count" + "message": "Amaga el recompte de caràcters" }, "itemsInTrash": { "message": "Items in trash" @@ -4642,7 +4706,7 @@ "message": "Items you delete will appear here and be permanently deleted after 30 days" }, "trashWarning": { - "message": "Items that have been in trash more than 30 days will automatically be deleted" + "message": "Els elements que porten més de 30 dies a la paperera se suprimiran automàticament" }, "restore": { "message": "Restaura" @@ -4651,7 +4715,7 @@ "message": "Suprimeix per sempre" }, "noEditPermissions": { - "message": "You don't have permission to edit this item" + "message": "No tens permisos per editar aquest fitxer" }, "biometricsStatusHelptextUnlockNeeded": { "message": "Biometric unlock is unavailable because PIN or password unlock is required first." @@ -4688,7 +4752,7 @@ "description": "Heading for the password generator within the inline menu" }, "passwordRegenerated": { - "message": "Password regenerated", + "message": "Contrasenya regenerada", "description": "Notification message for when a password has been regenerated" }, "saveLoginToBitwarden": { @@ -4696,7 +4760,7 @@ "description": "Confirmation message for saving a login to Bitwarden" }, "spaceCharacterDescriptor": { - "message": "Space", + "message": "Espai", "description": "Represents the space key in screen reader content as a readable word" }, "tildeCharacterDescriptor": { @@ -4708,7 +4772,7 @@ "description": "Represents the ` key in screen reader content as a readable word" }, "exclamationCharacterDescriptor": { - "message": "Exclamation mark", + "message": "Signe d'exclamació", "description": "Represents the ! key in screen reader content as a readable word" }, "atSignCharacterDescriptor": { @@ -4728,7 +4792,7 @@ "description": "Represents the % key in screen reader content as a readable word" }, "caretCharacterDescriptor": { - "message": "Caret", + "message": "Circumflex", "description": "Represents the ^ key in screen reader content as a readable word" }, "ampersandCharacterDescriptor": { @@ -4748,11 +4812,11 @@ "description": "Represents the ) key in screen reader content as a readable word" }, "hyphenCharacterDescriptor": { - "message": "Underscore", + "message": "Subratllat", "description": "Represents the _ key in screen reader content as a readable word" }, "underscoreCharacterDescriptor": { - "message": "Hyphen", + "message": "Guió", "description": "Represents the - key in screen reader content as a readable word" }, "plusCharacterDescriptor": { @@ -4764,19 +4828,19 @@ "description": "Represents the = key in screen reader content as a readable word" }, "braceLeftCharacterDescriptor": { - "message": "Left brace", + "message": "Clau esquerra", "description": "Represents the { key in screen reader content as a readable word" }, "braceRightCharacterDescriptor": { - "message": "Right brace", + "message": "Clau dreta", "description": "Represents the } key in screen reader content as a readable word" }, "bracketLeftCharacterDescriptor": { - "message": "Left bracket", + "message": "Claudàtor esquerra", "description": "Represents the [ key in screen reader content as a readable word" }, "bracketRightCharacterDescriptor": { - "message": "Right bracket", + "message": "Claudàtor dret", "description": "Represents the ] key in screen reader content as a readable word" }, "pipeCharacterDescriptor": { @@ -4867,25 +4931,34 @@ } }, "newDeviceVerificationNoticePageOneEmailAccessNo": { - "message": "No, I do not" + "message": "No, jo no" }, "newDeviceVerificationNoticePageOneEmailAccessYes": { "message": "Yes, I can reliably access my email" }, "turnOnTwoStepLogin": { - "message": "Turn on two-step login" + "message": "Activa l'inici de sessió en dos passos" }, "changeAcctEmail": { "message": "Change account email" }, "extensionWidth": { - "message": "Extension width" + "message": "Amplada d'extensió" }, "wide": { "message": "Ample" }, "extraWide": { - "message": "Extra wide" + "message": "Extra ample" + }, + "cannotRemoveViewOnlyCollections": { + "message": "You cannot remove collections with View only permissions: $COLLECTIONS$", + "placeholders": { + "collections": { + "content": "$1", + "example": "Work, Personal" + } + } }, "updateDesktopAppOrDisableFingerprintDialogTitle": { "message": "Please update your desktop application" diff --git a/apps/browser/src/_locales/cs/messages.json b/apps/browser/src/_locales/cs/messages.json index 9c427edf5cf..389a74e42fd 100644 --- a/apps/browser/src/_locales/cs/messages.json +++ b/apps/browser/src/_locales/cs/messages.json @@ -2363,6 +2363,70 @@ "autofillBlockedNoticeGuidance": { "message": "Změňte to v nastavení" }, + "change": { + "message": "Změnit" + }, + "changeButtonTitle": { + "message": "Změnit heslo - $ITEMNAME$", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "atRiskPasswords": { + "message": "Ohrožená hesla" + }, + "atRiskPasswordsDescSingleOrg": { + "message": "$ORGANIZATION$ Vás žádá o změnu $COUNT$ hesel, protože jsou v ohrožení.", + "placeholders": { + "organization": { + "content": "$1", + "example": "Acme Corp" + }, + "count": { + "content": "$2", + "example": "2" + } + } + }, + "atRiskPasswordsDescMultiOrg": { + "message": "Vaše organizace Vás žádají o změnu $COUNT$ hesel, protože jsou v ohrožení.", + "placeholders": { + "count": { + "content": "$1", + "example": "2" + } + } + }, + "reviewAndChangeAtRiskPassword": { + "message": "Zkontrolovat a změnit jedno ohrožené heslo" + }, + "reviewAndChangeAtRiskPasswordsPlural": { + "message": "Zkontrolovat a změnit $COUNT$ ohrožených hesel", + "placeholders": { + "count": { + "content": "$1", + "example": "2" + } + } + }, + "changeAtRiskPasswordsFaster": { + "message": "Změnit ohrožená hesla rychleji" + }, + "changeAtRiskPasswordsFasterDesc": { + "message": "Aktualizujte svá nastavení, abyste mohli rychle automaticky vyplňovat hesla a generovat nová hesla." + }, + "turnOnAutofill": { + "message": "Zapnout automatické vyplňování" + }, + "turnedOnAutofill": { + "message": "Automatické vyplňování bylo zapnuto" + }, + "dismiss": { + "message": "Zavřít" + }, "websiteItemLabel": { "message": "Webová stránka $number$ (URI)", "placeholders": { @@ -3123,12 +3187,18 @@ "notificationSentDevice": { "message": "Na Vaše zařízení bylo odesláno oznámení." }, + "notificationSentDevicePart1": { + "message": "Odemknout Bitwarden na Vašem zařízení nebo na" + }, + "notificationSentDeviceAnchor": { + "message": "webová aplikace" + }, + "notificationSentDevicePart2": { + "message": "Před schválením se ujistěte, že fráze otisku prstu odpovídá frázi níže." + }, "aNotificationWasSentToYourDevice": { "message": "Na Vaše zařízení bylo odesláno oznámení" }, - "makeSureYourAccountIsUnlockedAndTheFingerprintEtc": { - "message": "Ujistěte se, že je Váš trezor odemčen a fráze otisku prstu se shodují s druhým zařízením" - }, "youWillBeNotifiedOnceTheRequestIsApproved": { "message": "Budete upozorněni, jakmile bude žádost schválena" }, @@ -3138,6 +3208,9 @@ "loginInitiated": { "message": "Bylo zahájeno přihlášení" }, + "logInRequestSent": { + "message": "Požadavek odeslán" + }, "exposedMasterPassword": { "message": "Odhalené hlavní heslo" }, @@ -4146,15 +4219,6 @@ "itemName": { "message": "Název položky" }, - "cannotRemoveViewOnlyCollections": { - "message": "Nemůžete odebrat kolekce s oprávněními jen pro zobrazení: $COLLECTIONS$", - "placeholders": { - "collections": { - "content": "$1", - "example": "Work, Personal" - } - } - }, "organizationIsDeactivated": { "message": "Organizace je deaktivována" }, @@ -4887,6 +4951,15 @@ "extraWide": { "message": "Extra široký" }, + "cannotRemoveViewOnlyCollections": { + "message": "Nemůžete odebrat kolekce s oprávněními jen pro zobrazení: $COLLECTIONS$", + "placeholders": { + "collections": { + "content": "$1", + "example": "Work, Personal" + } + } + }, "updateDesktopAppOrDisableFingerprintDialogTitle": { "message": "Aktualizujte aplikaci pro stolní počítač" }, diff --git a/apps/browser/src/_locales/cy/messages.json b/apps/browser/src/_locales/cy/messages.json index 31208e2e020..b44bfa3ce6d 100644 --- a/apps/browser/src/_locales/cy/messages.json +++ b/apps/browser/src/_locales/cy/messages.json @@ -2363,6 +2363,70 @@ "autofillBlockedNoticeGuidance": { "message": "Change this in settings" }, + "change": { + "message": "Change" + }, + "changeButtonTitle": { + "message": "Change password - $ITEMNAME$", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "atRiskPasswords": { + "message": "At-risk passwords" + }, + "atRiskPasswordsDescSingleOrg": { + "message": "$ORGANIZATION$ is requesting you change the $COUNT$ passwords because they are at risk.", + "placeholders": { + "organization": { + "content": "$1", + "example": "Acme Corp" + }, + "count": { + "content": "$2", + "example": "2" + } + } + }, + "atRiskPasswordsDescMultiOrg": { + "message": "Your organizations are requesting you change the $COUNT$ passwords because they are at risk.", + "placeholders": { + "count": { + "content": "$1", + "example": "2" + } + } + }, + "reviewAndChangeAtRiskPassword": { + "message": "Review and change one at-risk password" + }, + "reviewAndChangeAtRiskPasswordsPlural": { + "message": "Review and change $COUNT$ at-risk passwords", + "placeholders": { + "count": { + "content": "$1", + "example": "2" + } + } + }, + "changeAtRiskPasswordsFaster": { + "message": "Change at-risk passwords faster" + }, + "changeAtRiskPasswordsFasterDesc": { + "message": "Update your settings so you can quickly autofill your passwords and generate new ones" + }, + "turnOnAutofill": { + "message": "Turn on autofill" + }, + "turnedOnAutofill": { + "message": "Turned on autofill" + }, + "dismiss": { + "message": "Dismiss" + }, "websiteItemLabel": { "message": "Website $number$ (URI)", "placeholders": { @@ -3123,12 +3187,18 @@ "notificationSentDevice": { "message": "A notification has been sent to your device." }, + "notificationSentDevicePart1": { + "message": "Unlock Bitwarden on your device or on the" + }, + "notificationSentDeviceAnchor": { + "message": "web app" + }, + "notificationSentDevicePart2": { + "message": "Make sure the Fingerprint phrase matches the one below before approving." + }, "aNotificationWasSentToYourDevice": { "message": "A notification was sent to your device" }, - "makeSureYourAccountIsUnlockedAndTheFingerprintEtc": { - "message": "Make sure your account is unlocked and the fingerprint phrase matches on the other device" - }, "youWillBeNotifiedOnceTheRequestIsApproved": { "message": "You will be notified once the request is approved" }, @@ -3138,6 +3208,9 @@ "loginInitiated": { "message": "Login initiated" }, + "logInRequestSent": { + "message": "Request sent" + }, "exposedMasterPassword": { "message": "Exposed Master Password" }, @@ -4146,15 +4219,6 @@ "itemName": { "message": "Item name" }, - "cannotRemoveViewOnlyCollections": { - "message": "You cannot remove collections with View only permissions: $COLLECTIONS$", - "placeholders": { - "collections": { - "content": "$1", - "example": "Work, Personal" - } - } - }, "organizationIsDeactivated": { "message": "Organization is deactivated" }, @@ -4887,6 +4951,15 @@ "extraWide": { "message": "Extra wide" }, + "cannotRemoveViewOnlyCollections": { + "message": "You cannot remove collections with View only permissions: $COLLECTIONS$", + "placeholders": { + "collections": { + "content": "$1", + "example": "Work, Personal" + } + } + }, "updateDesktopAppOrDisableFingerprintDialogTitle": { "message": "Please update your desktop application" }, diff --git a/apps/browser/src/_locales/da/messages.json b/apps/browser/src/_locales/da/messages.json index b553afdbe2f..009864512a8 100644 --- a/apps/browser/src/_locales/da/messages.json +++ b/apps/browser/src/_locales/da/messages.json @@ -2363,6 +2363,70 @@ "autofillBlockedNoticeGuidance": { "message": "Ændr dette i Indstillinger" }, + "change": { + "message": "Change" + }, + "changeButtonTitle": { + "message": "Change password - $ITEMNAME$", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "atRiskPasswords": { + "message": "At-risk passwords" + }, + "atRiskPasswordsDescSingleOrg": { + "message": "$ORGANIZATION$ is requesting you change the $COUNT$ passwords because they are at risk.", + "placeholders": { + "organization": { + "content": "$1", + "example": "Acme Corp" + }, + "count": { + "content": "$2", + "example": "2" + } + } + }, + "atRiskPasswordsDescMultiOrg": { + "message": "Your organizations are requesting you change the $COUNT$ passwords because they are at risk.", + "placeholders": { + "count": { + "content": "$1", + "example": "2" + } + } + }, + "reviewAndChangeAtRiskPassword": { + "message": "Review and change one at-risk password" + }, + "reviewAndChangeAtRiskPasswordsPlural": { + "message": "Review and change $COUNT$ at-risk passwords", + "placeholders": { + "count": { + "content": "$1", + "example": "2" + } + } + }, + "changeAtRiskPasswordsFaster": { + "message": "Change at-risk passwords faster" + }, + "changeAtRiskPasswordsFasterDesc": { + "message": "Update your settings so you can quickly autofill your passwords and generate new ones" + }, + "turnOnAutofill": { + "message": "Turn on autofill" + }, + "turnedOnAutofill": { + "message": "Turned on autofill" + }, + "dismiss": { + "message": "Dismiss" + }, "websiteItemLabel": { "message": "Websted $number$ (URI)", "placeholders": { @@ -3123,12 +3187,18 @@ "notificationSentDevice": { "message": "En notifikation er sendt til din enhed." }, + "notificationSentDevicePart1": { + "message": "Unlock Bitwarden on your device or on the" + }, + "notificationSentDeviceAnchor": { + "message": "web app" + }, + "notificationSentDevicePart2": { + "message": "Make sure the Fingerprint phrase matches the one below before approving." + }, "aNotificationWasSentToYourDevice": { "message": "En notifikation er sendt til enheden" }, - "makeSureYourAccountIsUnlockedAndTheFingerprintEtc": { - "message": "Sørg for, at boksen er oplåst, samt at fingeraftrykssætningen matcher på den anden enhed" - }, "youWillBeNotifiedOnceTheRequestIsApproved": { "message": "Man vil få besked, når anmodningen er godkendt" }, @@ -3138,6 +3208,9 @@ "loginInitiated": { "message": "Indlogning påbegyndt" }, + "logInRequestSent": { + "message": "Request sent" + }, "exposedMasterPassword": { "message": "Kompromitteret hovedadgangskode" }, @@ -4146,15 +4219,6 @@ "itemName": { "message": "Emnenavn" }, - "cannotRemoveViewOnlyCollections": { - "message": "Samlinger med kun tilladelsen Vis kan ikke fjernes: $COLLECTIONS$", - "placeholders": { - "collections": { - "content": "$1", - "example": "Work, Personal" - } - } - }, "organizationIsDeactivated": { "message": "Organisation er deaktiveret" }, @@ -4887,6 +4951,15 @@ "extraWide": { "message": "Ekstra bred" }, + "cannotRemoveViewOnlyCollections": { + "message": "Samlinger med kun tilladelsen Vis kan ikke fjernes: $COLLECTIONS$", + "placeholders": { + "collections": { + "content": "$1", + "example": "Work, Personal" + } + } + }, "updateDesktopAppOrDisableFingerprintDialogTitle": { "message": "Opdatér venligst computerapplikationen" }, diff --git a/apps/browser/src/_locales/de/messages.json b/apps/browser/src/_locales/de/messages.json index 1dca0804873..c27bc1ec862 100644 --- a/apps/browser/src/_locales/de/messages.json +++ b/apps/browser/src/_locales/de/messages.json @@ -2363,6 +2363,70 @@ "autofillBlockedNoticeGuidance": { "message": "Dies in den Einstellungen ändern" }, + "change": { + "message": "Ändern" + }, + "changeButtonTitle": { + "message": "Passwort ändern - $ITEMNAME$", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "atRiskPasswords": { + "message": "Risikoreiche Passwörter" + }, + "atRiskPasswordsDescSingleOrg": { + "message": "$ORGANIZATION$ fordert dich auf, diese $COUNT$ Passwörter zu ändern, da diese in risikoreich sind.", + "placeholders": { + "organization": { + "content": "$1", + "example": "Acme Corp" + }, + "count": { + "content": "$2", + "example": "2" + } + } + }, + "atRiskPasswordsDescMultiOrg": { + "message": "Deine Organisationen fordern dich auf, diese $COUNT$ Passwörter zu ändern, da diese risikoreich sind.", + "placeholders": { + "count": { + "content": "$1", + "example": "2" + } + } + }, + "reviewAndChangeAtRiskPassword": { + "message": "Überprüfe und ändere ein risikoreiches Passwort" + }, + "reviewAndChangeAtRiskPasswordsPlural": { + "message": "Überprüfe und ändere $COUNT$ risikoreiche Passwörter", + "placeholders": { + "count": { + "content": "$1", + "example": "2" + } + } + }, + "changeAtRiskPasswordsFaster": { + "message": "Ändere risikoreiche Passwörter schneller" + }, + "changeAtRiskPasswordsFasterDesc": { + "message": "Aktualisiere deine Einstellungen, damit du deine Passwörter schnell automatisch ausfüllen kannst und neue generieren kannst" + }, + "turnOnAutofill": { + "message": "Auto-Ausfüllen aktivieren" + }, + "turnedOnAutofill": { + "message": "Auto-Ausfüllen aktiviert" + }, + "dismiss": { + "message": "Verwerfen" + }, "websiteItemLabel": { "message": "Website $number$ (URI)", "placeholders": { @@ -3123,12 +3187,18 @@ "notificationSentDevice": { "message": "Eine Benachrichtigung wurde an dein Gerät gesendet." }, + "notificationSentDevicePart1": { + "message": "Entsperre Bitwarden auf deinem Gerät oder mit der" + }, + "notificationSentDeviceAnchor": { + "message": "Web-App" + }, + "notificationSentDevicePart2": { + "message": "Stelle vor der Genehmigung sicher, dass die Fingerabdruck-Phrase mit der unten stehenden übereinstimmt." + }, "aNotificationWasSentToYourDevice": { "message": "Eine Benachrichtigung wurde an dein Gerät gesendet" }, - "makeSureYourAccountIsUnlockedAndTheFingerprintEtc": { - "message": "Stelle sicher, dass dein Konto entsperrt ist und die Fingerabdruck-Phrase mit der vom anderen Gerät übereinstimmt" - }, "youWillBeNotifiedOnceTheRequestIsApproved": { "message": "Du wirst benachrichtigt, sobald die Anfrage genehmigt wurde" }, @@ -3138,6 +3208,9 @@ "loginInitiated": { "message": "Anmeldung eingeleitet" }, + "logInRequestSent": { + "message": "Anfrage gesendet" + }, "exposedMasterPassword": { "message": "Kompromittiertes Master-Passwort" }, @@ -3994,7 +4067,7 @@ "message": "Passkey entfernt" }, "autofillSuggestions": { - "message": "Vorschläge zum Auto-Ausfüllen" + "message": "Auto-Ausfüllen-Vorschläge" }, "itemSuggestions": { "message": "Vorgeschlagene Einträge" @@ -4146,15 +4219,6 @@ "itemName": { "message": "Eintrags-Name" }, - "cannotRemoveViewOnlyCollections": { - "message": "Du kannst Sammlungen mit Leseberechtigung nicht entfernen: $COLLECTIONS$", - "placeholders": { - "collections": { - "content": "$1", - "example": "Work, Personal" - } - } - }, "organizationIsDeactivated": { "message": "Organisation ist deaktiviert" }, @@ -4579,7 +4643,7 @@ "message": "Konto-Aktionen" }, "showNumberOfAutofillSuggestions": { - "message": "Anzahl der Vorschläge zum Auto-Ausfüllen von Zugangsdaten auf dem Erweiterungssymbol anzeigen" + "message": "Anzahl der Auto-Ausfüllen-Vorschläge von Zugangsdaten auf dem Erweiterungssymbol anzeigen" }, "showQuickCopyActions": { "message": "Schnellkopier-Aktionen im Tresor anzeigen" @@ -4887,6 +4951,15 @@ "extraWide": { "message": "Extra breit" }, + "cannotRemoveViewOnlyCollections": { + "message": "Du kannst Sammlungen mit Leseberechtigung nicht entfernen: $COLLECTIONS$", + "placeholders": { + "collections": { + "content": "$1", + "example": "Work, Personal" + } + } + }, "updateDesktopAppOrDisableFingerprintDialogTitle": { "message": "Bitte aktualisiere deine Desktop-Anwendung" }, diff --git a/apps/browser/src/_locales/el/messages.json b/apps/browser/src/_locales/el/messages.json index 7d2afbf9969..b659718b412 100644 --- a/apps/browser/src/_locales/el/messages.json +++ b/apps/browser/src/_locales/el/messages.json @@ -2363,6 +2363,70 @@ "autofillBlockedNoticeGuidance": { "message": "Change this in settings" }, + "change": { + "message": "Change" + }, + "changeButtonTitle": { + "message": "Change password - $ITEMNAME$", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "atRiskPasswords": { + "message": "At-risk passwords" + }, + "atRiskPasswordsDescSingleOrg": { + "message": "$ORGANIZATION$ is requesting you change the $COUNT$ passwords because they are at risk.", + "placeholders": { + "organization": { + "content": "$1", + "example": "Acme Corp" + }, + "count": { + "content": "$2", + "example": "2" + } + } + }, + "atRiskPasswordsDescMultiOrg": { + "message": "Your organizations are requesting you change the $COUNT$ passwords because they are at risk.", + "placeholders": { + "count": { + "content": "$1", + "example": "2" + } + } + }, + "reviewAndChangeAtRiskPassword": { + "message": "Review and change one at-risk password" + }, + "reviewAndChangeAtRiskPasswordsPlural": { + "message": "Review and change $COUNT$ at-risk passwords", + "placeholders": { + "count": { + "content": "$1", + "example": "2" + } + } + }, + "changeAtRiskPasswordsFaster": { + "message": "Change at-risk passwords faster" + }, + "changeAtRiskPasswordsFasterDesc": { + "message": "Update your settings so you can quickly autofill your passwords and generate new ones" + }, + "turnOnAutofill": { + "message": "Turn on autofill" + }, + "turnedOnAutofill": { + "message": "Turned on autofill" + }, + "dismiss": { + "message": "Dismiss" + }, "websiteItemLabel": { "message": "Ιστοσελίδα $number$ (URI)", "placeholders": { @@ -3123,12 +3187,18 @@ "notificationSentDevice": { "message": "Μια ειδοποίηση έχει σταλεί στη συσκευή σας." }, + "notificationSentDevicePart1": { + "message": "Unlock Bitwarden on your device or on the" + }, + "notificationSentDeviceAnchor": { + "message": "web app" + }, + "notificationSentDevicePart2": { + "message": "Make sure the Fingerprint phrase matches the one below before approving." + }, "aNotificationWasSentToYourDevice": { "message": "Μια ειδοποίηση στάλθηκε στη συσκευή σας" }, - "makeSureYourAccountIsUnlockedAndTheFingerprintEtc": { - "message": "Βεβαιωθείτε ότι ο λογαριασμός σας είναι ξεκλείδωτος και ότι η φράση δακτυλικού αποτυπώματος ταιριάζει στην άλλη συσκευή" - }, "youWillBeNotifiedOnceTheRequestIsApproved": { "message": "Θα ειδοποιηθείτε μόλις εγκριθεί η αίτηση" }, @@ -3138,6 +3208,9 @@ "loginInitiated": { "message": "Η σύνδεση ξεκίνησε" }, + "logInRequestSent": { + "message": "Request sent" + }, "exposedMasterPassword": { "message": "Εκτεθειμένος Κύριος Κωδικός Πρόσβασης" }, @@ -4146,15 +4219,6 @@ "itemName": { "message": "Όνομα αντικειμένου" }, - "cannotRemoveViewOnlyCollections": { - "message": "Δεν μπορείτε να αφαιρέσετε συλλογές που έχουν μόνο δικαιώματα Προβολής: $COLLECTIONS$", - "placeholders": { - "collections": { - "content": "$1", - "example": "Work, Personal" - } - } - }, "organizationIsDeactivated": { "message": "Ο οργανισμός απενεργοποιήθηκε" }, @@ -4887,6 +4951,15 @@ "extraWide": { "message": "Εξαιρετικά φαρδύ" }, + "cannotRemoveViewOnlyCollections": { + "message": "Δεν μπορείτε να αφαιρέσετε συλλογές που έχουν μόνο δικαιώματα Προβολής: $COLLECTIONS$", + "placeholders": { + "collections": { + "content": "$1", + "example": "Work, Personal" + } + } + }, "updateDesktopAppOrDisableFingerprintDialogTitle": { "message": "Please update your desktop application" }, diff --git a/apps/browser/src/_locales/en/messages.json b/apps/browser/src/_locales/en/messages.json index 8698315b57c..7eec2804ece 100644 --- a/apps/browser/src/_locales/en/messages.json +++ b/apps/browser/src/_locales/en/messages.json @@ -2363,6 +2363,70 @@ "autofillBlockedNoticeGuidance": { "message": "Change this in settings" }, + "change": { + "message": "Change" + }, + "changeButtonTitle": { + "message": "Change password - $ITEMNAME$", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "atRiskPasswords": { + "message": "At-risk passwords" + }, + "atRiskPasswordsDescSingleOrg": { + "message": "$ORGANIZATION$ is requesting you change the $COUNT$ passwords because they are at risk.", + "placeholders": { + "organization": { + "content": "$1", + "example": "Acme Corp" + }, + "count": { + "content": "$2", + "example": "2" + } + } + }, + "atRiskPasswordsDescMultiOrg": { + "message": "Your organizations are requesting you change the $COUNT$ passwords because they are at risk.", + "placeholders": { + "count": { + "content": "$1", + "example": "2" + } + } + }, + "reviewAndChangeAtRiskPassword": { + "message": "Review and change one at-risk password" + }, + "reviewAndChangeAtRiskPasswordsPlural": { + "message": "Review and change $COUNT$ at-risk passwords", + "placeholders": { + "count": { + "content": "$1", + "example": "2" + } + } + }, + "changeAtRiskPasswordsFaster": { + "message": "Change at-risk passwords faster" + }, + "changeAtRiskPasswordsFasterDesc": { + "message": "Update your settings so you can quickly autofill your passwords and generate new ones" + }, + "turnOnAutofill": { + "message": "Turn on autofill" + }, + "turnedOnAutofill": { + "message": "Turned on autofill" + }, + "dismiss": { + "message": "Dismiss" + }, "websiteItemLabel": { "message": "Website $number$ (URI)", "placeholders": { diff --git a/apps/browser/src/_locales/en_GB/messages.json b/apps/browser/src/_locales/en_GB/messages.json index 6ede9cab724..8a7e0a10afd 100644 --- a/apps/browser/src/_locales/en_GB/messages.json +++ b/apps/browser/src/_locales/en_GB/messages.json @@ -2363,6 +2363,70 @@ "autofillBlockedNoticeGuidance": { "message": "Change this in settings" }, + "change": { + "message": "Change" + }, + "changeButtonTitle": { + "message": "Change password - $ITEMNAME$", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "atRiskPasswords": { + "message": "At-risk passwords" + }, + "atRiskPasswordsDescSingleOrg": { + "message": "$ORGANIZATION$ is requesting you change the $COUNT$ passwords because they are at risk.", + "placeholders": { + "organization": { + "content": "$1", + "example": "Acme Corp" + }, + "count": { + "content": "$2", + "example": "2" + } + } + }, + "atRiskPasswordsDescMultiOrg": { + "message": "Your organisations are requesting you change the $COUNT$ passwords because they are at risk.", + "placeholders": { + "count": { + "content": "$1", + "example": "2" + } + } + }, + "reviewAndChangeAtRiskPassword": { + "message": "Review and change one at-risk password" + }, + "reviewAndChangeAtRiskPasswordsPlural": { + "message": "Review and change $COUNT$ at-risk passwords", + "placeholders": { + "count": { + "content": "$1", + "example": "2" + } + } + }, + "changeAtRiskPasswordsFaster": { + "message": "Change at-risk passwords faster" + }, + "changeAtRiskPasswordsFasterDesc": { + "message": "Update your settings so you can quickly autofill your passwords and generate new ones" + }, + "turnOnAutofill": { + "message": "Turn on autofill" + }, + "turnedOnAutofill": { + "message": "Turned on autofill" + }, + "dismiss": { + "message": "Dismiss" + }, "websiteItemLabel": { "message": "Website $number$ (URI)", "placeholders": { @@ -3123,12 +3187,18 @@ "notificationSentDevice": { "message": "A notification has been sent to your device." }, + "notificationSentDevicePart1": { + "message": "Unlock Bitwarden on your device or on the" + }, + "notificationSentDeviceAnchor": { + "message": "web app" + }, + "notificationSentDevicePart2": { + "message": "Make sure the Fingerprint phrase matches the one below before approving." + }, "aNotificationWasSentToYourDevice": { "message": "A notification was sent to your device" }, - "makeSureYourAccountIsUnlockedAndTheFingerprintEtc": { - "message": "Make sure your account is unlocked and the fingerprint phrase matches on the other device" - }, "youWillBeNotifiedOnceTheRequestIsApproved": { "message": "You will be notified once the request is approved" }, @@ -3138,6 +3208,9 @@ "loginInitiated": { "message": "Login initiated" }, + "logInRequestSent": { + "message": "Request sent" + }, "exposedMasterPassword": { "message": "Exposed Master Password" }, @@ -4146,15 +4219,6 @@ "itemName": { "message": "Item name" }, - "cannotRemoveViewOnlyCollections": { - "message": "You cannot remove collections with View only permissions: $COLLECTIONS$", - "placeholders": { - "collections": { - "content": "$1", - "example": "Work, Personal" - } - } - }, "organizationIsDeactivated": { "message": "Organisation is deactivated" }, @@ -4887,6 +4951,15 @@ "extraWide": { "message": "Extra wide" }, + "cannotRemoveViewOnlyCollections": { + "message": "You cannot remove collections with View only permissions: $COLLECTIONS$", + "placeholders": { + "collections": { + "content": "$1", + "example": "Work, Personal" + } + } + }, "updateDesktopAppOrDisableFingerprintDialogTitle": { "message": "Please update your desktop application" }, diff --git a/apps/browser/src/_locales/en_IN/messages.json b/apps/browser/src/_locales/en_IN/messages.json index 1be001abea4..0189404c002 100644 --- a/apps/browser/src/_locales/en_IN/messages.json +++ b/apps/browser/src/_locales/en_IN/messages.json @@ -2363,6 +2363,70 @@ "autofillBlockedNoticeGuidance": { "message": "Change this in settings" }, + "change": { + "message": "Change" + }, + "changeButtonTitle": { + "message": "Change password - $ITEMNAME$", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "atRiskPasswords": { + "message": "At-risk passwords" + }, + "atRiskPasswordsDescSingleOrg": { + "message": "$ORGANIZATION$ is requesting you change the $COUNT$ passwords because they are at risk.", + "placeholders": { + "organization": { + "content": "$1", + "example": "Acme Corp" + }, + "count": { + "content": "$2", + "example": "2" + } + } + }, + "atRiskPasswordsDescMultiOrg": { + "message": "Your organisations are requesting you change the $COUNT$ passwords because they are at risk.", + "placeholders": { + "count": { + "content": "$1", + "example": "2" + } + } + }, + "reviewAndChangeAtRiskPassword": { + "message": "Review and change one at-risk password" + }, + "reviewAndChangeAtRiskPasswordsPlural": { + "message": "Review and change $COUNT$ at-risk passwords", + "placeholders": { + "count": { + "content": "$1", + "example": "2" + } + } + }, + "changeAtRiskPasswordsFaster": { + "message": "Change at-risk passwords faster" + }, + "changeAtRiskPasswordsFasterDesc": { + "message": "Update your settings so you can quickly autofill your passwords and generate new ones" + }, + "turnOnAutofill": { + "message": "Turn on autofill" + }, + "turnedOnAutofill": { + "message": "Turned on autofill" + }, + "dismiss": { + "message": "Dismiss" + }, "websiteItemLabel": { "message": "Website $number$ (URI)", "placeholders": { @@ -3123,12 +3187,18 @@ "notificationSentDevice": { "message": "A notification has been sent to your device." }, + "notificationSentDevicePart1": { + "message": "Unlock Bitwarden on your device or on the" + }, + "notificationSentDeviceAnchor": { + "message": "web app" + }, + "notificationSentDevicePart2": { + "message": "Make sure the Fingerprint phrase matches the one below before approving." + }, "aNotificationWasSentToYourDevice": { "message": "A notification was sent to your device" }, - "makeSureYourAccountIsUnlockedAndTheFingerprintEtc": { - "message": "Make sure your account is unlocked and the fingerprint phrase matches on the other device" - }, "youWillBeNotifiedOnceTheRequestIsApproved": { "message": "You will be notified once the request is approved" }, @@ -3138,6 +3208,9 @@ "loginInitiated": { "message": "Login initiated" }, + "logInRequestSent": { + "message": "Request sent" + }, "exposedMasterPassword": { "message": "Exposed Master Password" }, @@ -4146,15 +4219,6 @@ "itemName": { "message": "Item name" }, - "cannotRemoveViewOnlyCollections": { - "message": "You cannot remove collections with View only permissions: $COLLECTIONS$", - "placeholders": { - "collections": { - "content": "$1", - "example": "Work, Personal" - } - } - }, "organizationIsDeactivated": { "message": "Organisation is deactivated" }, @@ -4887,6 +4951,15 @@ "extraWide": { "message": "Extra wide" }, + "cannotRemoveViewOnlyCollections": { + "message": "You cannot remove collections with View only permissions: $COLLECTIONS$", + "placeholders": { + "collections": { + "content": "$1", + "example": "Work, Personal" + } + } + }, "updateDesktopAppOrDisableFingerprintDialogTitle": { "message": "Please update your desktop application" }, diff --git a/apps/browser/src/_locales/es/messages.json b/apps/browser/src/_locales/es/messages.json index df5f38f878c..9fcdc4acf2b 100644 --- a/apps/browser/src/_locales/es/messages.json +++ b/apps/browser/src/_locales/es/messages.json @@ -2363,6 +2363,70 @@ "autofillBlockedNoticeGuidance": { "message": "Change this in settings" }, + "change": { + "message": "Change" + }, + "changeButtonTitle": { + "message": "Change password - $ITEMNAME$", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "atRiskPasswords": { + "message": "At-risk passwords" + }, + "atRiskPasswordsDescSingleOrg": { + "message": "$ORGANIZATION$ is requesting you change the $COUNT$ passwords because they are at risk.", + "placeholders": { + "organization": { + "content": "$1", + "example": "Acme Corp" + }, + "count": { + "content": "$2", + "example": "2" + } + } + }, + "atRiskPasswordsDescMultiOrg": { + "message": "Your organizations are requesting you change the $COUNT$ passwords because they are at risk.", + "placeholders": { + "count": { + "content": "$1", + "example": "2" + } + } + }, + "reviewAndChangeAtRiskPassword": { + "message": "Review and change one at-risk password" + }, + "reviewAndChangeAtRiskPasswordsPlural": { + "message": "Review and change $COUNT$ at-risk passwords", + "placeholders": { + "count": { + "content": "$1", + "example": "2" + } + } + }, + "changeAtRiskPasswordsFaster": { + "message": "Change at-risk passwords faster" + }, + "changeAtRiskPasswordsFasterDesc": { + "message": "Update your settings so you can quickly autofill your passwords and generate new ones" + }, + "turnOnAutofill": { + "message": "Turn on autofill" + }, + "turnedOnAutofill": { + "message": "Turned on autofill" + }, + "dismiss": { + "message": "Dismiss" + }, "websiteItemLabel": { "message": "Website $number$ (URI)", "placeholders": { @@ -3123,12 +3187,18 @@ "notificationSentDevice": { "message": "Se ha enviado una notificación a tu dispositivo." }, + "notificationSentDevicePart1": { + "message": "Unlock Bitwarden on your device or on the" + }, + "notificationSentDeviceAnchor": { + "message": "web app" + }, + "notificationSentDevicePart2": { + "message": "Make sure the Fingerprint phrase matches the one below before approving." + }, "aNotificationWasSentToYourDevice": { "message": "A notification was sent to your device" }, - "makeSureYourAccountIsUnlockedAndTheFingerprintEtc": { - "message": "Make sure your account is unlocked and the fingerprint phrase matches on the other device" - }, "youWillBeNotifiedOnceTheRequestIsApproved": { "message": "You will be notified once the request is approved" }, @@ -3138,6 +3208,9 @@ "loginInitiated": { "message": "Inicio de sesión en proceso" }, + "logInRequestSent": { + "message": "Request sent" + }, "exposedMasterPassword": { "message": "Contraseña maestra comprometida" }, @@ -4146,15 +4219,6 @@ "itemName": { "message": "Nombre del elemento" }, - "cannotRemoveViewOnlyCollections": { - "message": "No puedes eliminar colecciones con permisos de solo visualización: $COLLECTIONS$", - "placeholders": { - "collections": { - "content": "$1", - "example": "Work, Personal" - } - } - }, "organizationIsDeactivated": { "message": "La organización está desactivada" }, @@ -4887,6 +4951,15 @@ "extraWide": { "message": "Extra wide" }, + "cannotRemoveViewOnlyCollections": { + "message": "No puedes eliminar colecciones con permisos de solo visualización: $COLLECTIONS$", + "placeholders": { + "collections": { + "content": "$1", + "example": "Work, Personal" + } + } + }, "updateDesktopAppOrDisableFingerprintDialogTitle": { "message": "Please update your desktop application" }, diff --git a/apps/browser/src/_locales/et/messages.json b/apps/browser/src/_locales/et/messages.json index a5c69ed7cac..ac6945461fa 100644 --- a/apps/browser/src/_locales/et/messages.json +++ b/apps/browser/src/_locales/et/messages.json @@ -2363,6 +2363,70 @@ "autofillBlockedNoticeGuidance": { "message": "Change this in settings" }, + "change": { + "message": "Change" + }, + "changeButtonTitle": { + "message": "Change password - $ITEMNAME$", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "atRiskPasswords": { + "message": "At-risk passwords" + }, + "atRiskPasswordsDescSingleOrg": { + "message": "$ORGANIZATION$ is requesting you change the $COUNT$ passwords because they are at risk.", + "placeholders": { + "organization": { + "content": "$1", + "example": "Acme Corp" + }, + "count": { + "content": "$2", + "example": "2" + } + } + }, + "atRiskPasswordsDescMultiOrg": { + "message": "Your organizations are requesting you change the $COUNT$ passwords because they are at risk.", + "placeholders": { + "count": { + "content": "$1", + "example": "2" + } + } + }, + "reviewAndChangeAtRiskPassword": { + "message": "Review and change one at-risk password" + }, + "reviewAndChangeAtRiskPasswordsPlural": { + "message": "Review and change $COUNT$ at-risk passwords", + "placeholders": { + "count": { + "content": "$1", + "example": "2" + } + } + }, + "changeAtRiskPasswordsFaster": { + "message": "Change at-risk passwords faster" + }, + "changeAtRiskPasswordsFasterDesc": { + "message": "Update your settings so you can quickly autofill your passwords and generate new ones" + }, + "turnOnAutofill": { + "message": "Turn on autofill" + }, + "turnedOnAutofill": { + "message": "Turned on autofill" + }, + "dismiss": { + "message": "Dismiss" + }, "websiteItemLabel": { "message": "Website $number$ (URI)", "placeholders": { @@ -3123,12 +3187,18 @@ "notificationSentDevice": { "message": "Sinu seadmesse saadeti teavitus." }, + "notificationSentDevicePart1": { + "message": "Unlock Bitwarden on your device or on the" + }, + "notificationSentDeviceAnchor": { + "message": "web app" + }, + "notificationSentDevicePart2": { + "message": "Make sure the Fingerprint phrase matches the one below before approving." + }, "aNotificationWasSentToYourDevice": { "message": "A notification was sent to your device" }, - "makeSureYourAccountIsUnlockedAndTheFingerprintEtc": { - "message": "Make sure your account is unlocked and the fingerprint phrase matches on the other device" - }, "youWillBeNotifiedOnceTheRequestIsApproved": { "message": "You will be notified once the request is approved" }, @@ -3138,6 +3208,9 @@ "loginInitiated": { "message": "Sisselogimine on käivitatud" }, + "logInRequestSent": { + "message": "Request sent" + }, "exposedMasterPassword": { "message": "Ülemparool on haavatav" }, @@ -4146,15 +4219,6 @@ "itemName": { "message": "Item name" }, - "cannotRemoveViewOnlyCollections": { - "message": "You cannot remove collections with View only permissions: $COLLECTIONS$", - "placeholders": { - "collections": { - "content": "$1", - "example": "Work, Personal" - } - } - }, "organizationIsDeactivated": { "message": "Organization is deactivated" }, @@ -4887,6 +4951,15 @@ "extraWide": { "message": "Extra wide" }, + "cannotRemoveViewOnlyCollections": { + "message": "You cannot remove collections with View only permissions: $COLLECTIONS$", + "placeholders": { + "collections": { + "content": "$1", + "example": "Work, Personal" + } + } + }, "updateDesktopAppOrDisableFingerprintDialogTitle": { "message": "Please update your desktop application" }, diff --git a/apps/browser/src/_locales/eu/messages.json b/apps/browser/src/_locales/eu/messages.json index 7f0da4e1d41..23060f7b5c3 100644 --- a/apps/browser/src/_locales/eu/messages.json +++ b/apps/browser/src/_locales/eu/messages.json @@ -2363,6 +2363,70 @@ "autofillBlockedNoticeGuidance": { "message": "Change this in settings" }, + "change": { + "message": "Change" + }, + "changeButtonTitle": { + "message": "Change password - $ITEMNAME$", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "atRiskPasswords": { + "message": "At-risk passwords" + }, + "atRiskPasswordsDescSingleOrg": { + "message": "$ORGANIZATION$ is requesting you change the $COUNT$ passwords because they are at risk.", + "placeholders": { + "organization": { + "content": "$1", + "example": "Acme Corp" + }, + "count": { + "content": "$2", + "example": "2" + } + } + }, + "atRiskPasswordsDescMultiOrg": { + "message": "Your organizations are requesting you change the $COUNT$ passwords because they are at risk.", + "placeholders": { + "count": { + "content": "$1", + "example": "2" + } + } + }, + "reviewAndChangeAtRiskPassword": { + "message": "Review and change one at-risk password" + }, + "reviewAndChangeAtRiskPasswordsPlural": { + "message": "Review and change $COUNT$ at-risk passwords", + "placeholders": { + "count": { + "content": "$1", + "example": "2" + } + } + }, + "changeAtRiskPasswordsFaster": { + "message": "Change at-risk passwords faster" + }, + "changeAtRiskPasswordsFasterDesc": { + "message": "Update your settings so you can quickly autofill your passwords and generate new ones" + }, + "turnOnAutofill": { + "message": "Turn on autofill" + }, + "turnedOnAutofill": { + "message": "Turned on autofill" + }, + "dismiss": { + "message": "Dismiss" + }, "websiteItemLabel": { "message": "Website $number$ (URI)", "placeholders": { @@ -3123,12 +3187,18 @@ "notificationSentDevice": { "message": "A notification has been sent to your device." }, + "notificationSentDevicePart1": { + "message": "Unlock Bitwarden on your device or on the" + }, + "notificationSentDeviceAnchor": { + "message": "web app" + }, + "notificationSentDevicePart2": { + "message": "Make sure the Fingerprint phrase matches the one below before approving." + }, "aNotificationWasSentToYourDevice": { "message": "A notification was sent to your device" }, - "makeSureYourAccountIsUnlockedAndTheFingerprintEtc": { - "message": "Make sure your account is unlocked and the fingerprint phrase matches on the other device" - }, "youWillBeNotifiedOnceTheRequestIsApproved": { "message": "You will be notified once the request is approved" }, @@ -3138,6 +3208,9 @@ "loginInitiated": { "message": "Login initiated" }, + "logInRequestSent": { + "message": "Request sent" + }, "exposedMasterPassword": { "message": "Exposed Master Password" }, @@ -4146,15 +4219,6 @@ "itemName": { "message": "Item name" }, - "cannotRemoveViewOnlyCollections": { - "message": "You cannot remove collections with View only permissions: $COLLECTIONS$", - "placeholders": { - "collections": { - "content": "$1", - "example": "Work, Personal" - } - } - }, "organizationIsDeactivated": { "message": "Organization is deactivated" }, @@ -4887,6 +4951,15 @@ "extraWide": { "message": "Extra wide" }, + "cannotRemoveViewOnlyCollections": { + "message": "You cannot remove collections with View only permissions: $COLLECTIONS$", + "placeholders": { + "collections": { + "content": "$1", + "example": "Work, Personal" + } + } + }, "updateDesktopAppOrDisableFingerprintDialogTitle": { "message": "Please update your desktop application" }, diff --git a/apps/browser/src/_locales/fa/messages.json b/apps/browser/src/_locales/fa/messages.json index 034a79b3d35..3ee7770dcfe 100644 --- a/apps/browser/src/_locales/fa/messages.json +++ b/apps/browser/src/_locales/fa/messages.json @@ -2363,6 +2363,70 @@ "autofillBlockedNoticeGuidance": { "message": "Change this in settings" }, + "change": { + "message": "Change" + }, + "changeButtonTitle": { + "message": "Change password - $ITEMNAME$", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "atRiskPasswords": { + "message": "At-risk passwords" + }, + "atRiskPasswordsDescSingleOrg": { + "message": "$ORGANIZATION$ is requesting you change the $COUNT$ passwords because they are at risk.", + "placeholders": { + "organization": { + "content": "$1", + "example": "Acme Corp" + }, + "count": { + "content": "$2", + "example": "2" + } + } + }, + "atRiskPasswordsDescMultiOrg": { + "message": "Your organizations are requesting you change the $COUNT$ passwords because they are at risk.", + "placeholders": { + "count": { + "content": "$1", + "example": "2" + } + } + }, + "reviewAndChangeAtRiskPassword": { + "message": "Review and change one at-risk password" + }, + "reviewAndChangeAtRiskPasswordsPlural": { + "message": "Review and change $COUNT$ at-risk passwords", + "placeholders": { + "count": { + "content": "$1", + "example": "2" + } + } + }, + "changeAtRiskPasswordsFaster": { + "message": "Change at-risk passwords faster" + }, + "changeAtRiskPasswordsFasterDesc": { + "message": "Update your settings so you can quickly autofill your passwords and generate new ones" + }, + "turnOnAutofill": { + "message": "Turn on autofill" + }, + "turnedOnAutofill": { + "message": "Turned on autofill" + }, + "dismiss": { + "message": "Dismiss" + }, "websiteItemLabel": { "message": "Website $number$ (URI)", "placeholders": { @@ -3123,12 +3187,18 @@ "notificationSentDevice": { "message": "یک اعلان به دستگاه شما ارسال شده است." }, + "notificationSentDevicePart1": { + "message": "Unlock Bitwarden on your device or on the" + }, + "notificationSentDeviceAnchor": { + "message": "web app" + }, + "notificationSentDevicePart2": { + "message": "Make sure the Fingerprint phrase matches the one below before approving." + }, "aNotificationWasSentToYourDevice": { "message": "A notification was sent to your device" }, - "makeSureYourAccountIsUnlockedAndTheFingerprintEtc": { - "message": "Make sure your account is unlocked and the fingerprint phrase matches on the other device" - }, "youWillBeNotifiedOnceTheRequestIsApproved": { "message": "You will be notified once the request is approved" }, @@ -3138,6 +3208,9 @@ "loginInitiated": { "message": "ورود به سیستم آغاز شد" }, + "logInRequestSent": { + "message": "Request sent" + }, "exposedMasterPassword": { "message": "کلمه عبور اصلی افشا شده" }, @@ -4146,15 +4219,6 @@ "itemName": { "message": "Item name" }, - "cannotRemoveViewOnlyCollections": { - "message": "You cannot remove collections with View only permissions: $COLLECTIONS$", - "placeholders": { - "collections": { - "content": "$1", - "example": "Work, Personal" - } - } - }, "organizationIsDeactivated": { "message": "Organization is deactivated" }, @@ -4887,6 +4951,15 @@ "extraWide": { "message": "Extra wide" }, + "cannotRemoveViewOnlyCollections": { + "message": "You cannot remove collections with View only permissions: $COLLECTIONS$", + "placeholders": { + "collections": { + "content": "$1", + "example": "Work, Personal" + } + } + }, "updateDesktopAppOrDisableFingerprintDialogTitle": { "message": "Please update your desktop application" }, diff --git a/apps/browser/src/_locales/fi/messages.json b/apps/browser/src/_locales/fi/messages.json index 8e327cbe222..ae6e780a00f 100644 --- a/apps/browser/src/_locales/fi/messages.json +++ b/apps/browser/src/_locales/fi/messages.json @@ -2363,6 +2363,70 @@ "autofillBlockedNoticeGuidance": { "message": "Muuta tätä asetuksissa" }, + "change": { + "message": "Change" + }, + "changeButtonTitle": { + "message": "Change password - $ITEMNAME$", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "atRiskPasswords": { + "message": "At-risk passwords" + }, + "atRiskPasswordsDescSingleOrg": { + "message": "$ORGANIZATION$ is requesting you change the $COUNT$ passwords because they are at risk.", + "placeholders": { + "organization": { + "content": "$1", + "example": "Acme Corp" + }, + "count": { + "content": "$2", + "example": "2" + } + } + }, + "atRiskPasswordsDescMultiOrg": { + "message": "Your organizations are requesting you change the $COUNT$ passwords because they are at risk.", + "placeholders": { + "count": { + "content": "$1", + "example": "2" + } + } + }, + "reviewAndChangeAtRiskPassword": { + "message": "Review and change one at-risk password" + }, + "reviewAndChangeAtRiskPasswordsPlural": { + "message": "Review and change $COUNT$ at-risk passwords", + "placeholders": { + "count": { + "content": "$1", + "example": "2" + } + } + }, + "changeAtRiskPasswordsFaster": { + "message": "Change at-risk passwords faster" + }, + "changeAtRiskPasswordsFasterDesc": { + "message": "Update your settings so you can quickly autofill your passwords and generate new ones" + }, + "turnOnAutofill": { + "message": "Turn on autofill" + }, + "turnedOnAutofill": { + "message": "Turned on autofill" + }, + "dismiss": { + "message": "Dismiss" + }, "websiteItemLabel": { "message": "Verkkotunnus $number$ (URI)", "placeholders": { @@ -3123,12 +3187,18 @@ "notificationSentDevice": { "message": "Laitteellesi on lähetetty ilmoitus." }, + "notificationSentDevicePart1": { + "message": "Unlock Bitwarden on your device or on the" + }, + "notificationSentDeviceAnchor": { + "message": "web app" + }, + "notificationSentDevicePart2": { + "message": "Make sure the Fingerprint phrase matches the one below before approving." + }, "aNotificationWasSentToYourDevice": { "message": "Laitteeseesi lähetettiin ilmoitus" }, - "makeSureYourAccountIsUnlockedAndTheFingerprintEtc": { - "message": "Varmista, että vahvistavan laitteen holvi on avattu ja että se näyttää saman tunnistelausekkeen" - }, "youWillBeNotifiedOnceTheRequestIsApproved": { "message": "Sinulle ilmoitetaan, kun pyyntö on hyväksytty" }, @@ -3138,6 +3208,9 @@ "loginInitiated": { "message": "Kirjautuminen aloitettu" }, + "logInRequestSent": { + "message": "Request sent" + }, "exposedMasterPassword": { "message": "Paljastunut pääsalasana" }, @@ -4146,15 +4219,6 @@ "itemName": { "message": "Kohteen nimi" }, - "cannotRemoveViewOnlyCollections": { - "message": "Et voi poistaa kokoelmia, joihin sinulla on vain tarkasteluoikeus: $COLLECTIONS$", - "placeholders": { - "collections": { - "content": "$1", - "example": "Work, Personal" - } - } - }, "organizationIsDeactivated": { "message": "Organisaatio on poistettu käytöstä" }, @@ -4887,6 +4951,15 @@ "extraWide": { "message": "Erittäin leveä" }, + "cannotRemoveViewOnlyCollections": { + "message": "Et voi poistaa kokoelmia, joihin sinulla on vain tarkasteluoikeus: $COLLECTIONS$", + "placeholders": { + "collections": { + "content": "$1", + "example": "Work, Personal" + } + } + }, "updateDesktopAppOrDisableFingerprintDialogTitle": { "message": "Päivitä työpöytäsovellus" }, diff --git a/apps/browser/src/_locales/fil/messages.json b/apps/browser/src/_locales/fil/messages.json index a37756ece9a..01587793c32 100644 --- a/apps/browser/src/_locales/fil/messages.json +++ b/apps/browser/src/_locales/fil/messages.json @@ -2363,6 +2363,70 @@ "autofillBlockedNoticeGuidance": { "message": "Change this in settings" }, + "change": { + "message": "Change" + }, + "changeButtonTitle": { + "message": "Change password - $ITEMNAME$", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "atRiskPasswords": { + "message": "At-risk passwords" + }, + "atRiskPasswordsDescSingleOrg": { + "message": "$ORGANIZATION$ is requesting you change the $COUNT$ passwords because they are at risk.", + "placeholders": { + "organization": { + "content": "$1", + "example": "Acme Corp" + }, + "count": { + "content": "$2", + "example": "2" + } + } + }, + "atRiskPasswordsDescMultiOrg": { + "message": "Your organizations are requesting you change the $COUNT$ passwords because they are at risk.", + "placeholders": { + "count": { + "content": "$1", + "example": "2" + } + } + }, + "reviewAndChangeAtRiskPassword": { + "message": "Review and change one at-risk password" + }, + "reviewAndChangeAtRiskPasswordsPlural": { + "message": "Review and change $COUNT$ at-risk passwords", + "placeholders": { + "count": { + "content": "$1", + "example": "2" + } + } + }, + "changeAtRiskPasswordsFaster": { + "message": "Change at-risk passwords faster" + }, + "changeAtRiskPasswordsFasterDesc": { + "message": "Update your settings so you can quickly autofill your passwords and generate new ones" + }, + "turnOnAutofill": { + "message": "Turn on autofill" + }, + "turnedOnAutofill": { + "message": "Turned on autofill" + }, + "dismiss": { + "message": "Dismiss" + }, "websiteItemLabel": { "message": "Website $number$ (URI)", "placeholders": { @@ -3123,12 +3187,18 @@ "notificationSentDevice": { "message": "Naipadala na ang notification sa iyong device." }, + "notificationSentDevicePart1": { + "message": "Unlock Bitwarden on your device or on the" + }, + "notificationSentDeviceAnchor": { + "message": "web app" + }, + "notificationSentDevicePart2": { + "message": "Make sure the Fingerprint phrase matches the one below before approving." + }, "aNotificationWasSentToYourDevice": { "message": "A notification was sent to your device" }, - "makeSureYourAccountIsUnlockedAndTheFingerprintEtc": { - "message": "Make sure your account is unlocked and the fingerprint phrase matches on the other device" - }, "youWillBeNotifiedOnceTheRequestIsApproved": { "message": "You will be notified once the request is approved" }, @@ -3138,6 +3208,9 @@ "loginInitiated": { "message": "Login initiated" }, + "logInRequestSent": { + "message": "Request sent" + }, "exposedMasterPassword": { "message": "Nakalantad na Master Password" }, @@ -4146,15 +4219,6 @@ "itemName": { "message": "Item name" }, - "cannotRemoveViewOnlyCollections": { - "message": "You cannot remove collections with View only permissions: $COLLECTIONS$", - "placeholders": { - "collections": { - "content": "$1", - "example": "Work, Personal" - } - } - }, "organizationIsDeactivated": { "message": "Organization is deactivated" }, @@ -4887,6 +4951,15 @@ "extraWide": { "message": "Extra wide" }, + "cannotRemoveViewOnlyCollections": { + "message": "You cannot remove collections with View only permissions: $COLLECTIONS$", + "placeholders": { + "collections": { + "content": "$1", + "example": "Work, Personal" + } + } + }, "updateDesktopAppOrDisableFingerprintDialogTitle": { "message": "Please update your desktop application" }, diff --git a/apps/browser/src/_locales/fr/messages.json b/apps/browser/src/_locales/fr/messages.json index 26d3c1c352e..270499ab506 100644 --- a/apps/browser/src/_locales/fr/messages.json +++ b/apps/browser/src/_locales/fr/messages.json @@ -455,7 +455,7 @@ "message": "Nom d'utilisateur généré" }, "emailGenerated": { - "message": "Email generated" + "message": "Courriel généré" }, "regeneratePassword": { "message": "Régénérer un mot de passe" @@ -2363,6 +2363,70 @@ "autofillBlockedNoticeGuidance": { "message": "Change this in settings" }, + "change": { + "message": "Change" + }, + "changeButtonTitle": { + "message": "Change password - $ITEMNAME$", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "atRiskPasswords": { + "message": "At-risk passwords" + }, + "atRiskPasswordsDescSingleOrg": { + "message": "$ORGANIZATION$ is requesting you change the $COUNT$ passwords because they are at risk.", + "placeholders": { + "organization": { + "content": "$1", + "example": "Acme Corp" + }, + "count": { + "content": "$2", + "example": "2" + } + } + }, + "atRiskPasswordsDescMultiOrg": { + "message": "Your organizations are requesting you change the $COUNT$ passwords because they are at risk.", + "placeholders": { + "count": { + "content": "$1", + "example": "2" + } + } + }, + "reviewAndChangeAtRiskPassword": { + "message": "Review and change one at-risk password" + }, + "reviewAndChangeAtRiskPasswordsPlural": { + "message": "Review and change $COUNT$ at-risk passwords", + "placeholders": { + "count": { + "content": "$1", + "example": "2" + } + } + }, + "changeAtRiskPasswordsFaster": { + "message": "Change at-risk passwords faster" + }, + "changeAtRiskPasswordsFasterDesc": { + "message": "Update your settings so you can quickly autofill your passwords and generate new ones" + }, + "turnOnAutofill": { + "message": "Turn on autofill" + }, + "turnedOnAutofill": { + "message": "Turned on autofill" + }, + "dismiss": { + "message": "Dismiss" + }, "websiteItemLabel": { "message": "Site web $number$ (URI)", "placeholders": { @@ -3123,12 +3187,18 @@ "notificationSentDevice": { "message": "Une notification a été envoyée à votre appareil." }, + "notificationSentDevicePart1": { + "message": "Unlock Bitwarden on your device or on the" + }, + "notificationSentDeviceAnchor": { + "message": "web app" + }, + "notificationSentDevicePart2": { + "message": "Make sure the Fingerprint phrase matches the one below before approving." + }, "aNotificationWasSentToYourDevice": { "message": "Une notification a été envoyée à votre appareil" }, - "makeSureYourAccountIsUnlockedAndTheFingerprintEtc": { - "message": "Assurez-vous que votre compte est déverrouillé et que la phrase d'empreinte correspond à l'autre appareil" - }, "youWillBeNotifiedOnceTheRequestIsApproved": { "message": "Vous serez notifié une fois que la demande sera approuvée" }, @@ -3138,6 +3208,9 @@ "loginInitiated": { "message": "Connexion initiée" }, + "logInRequestSent": { + "message": "Request sent" + }, "exposedMasterPassword": { "message": "Mot de passe principal exposé" }, @@ -4146,15 +4219,6 @@ "itemName": { "message": "Nom de l’élément" }, - "cannotRemoveViewOnlyCollections": { - "message": "Vous ne pouvez pas supprimer des collections avec les autorisations d'affichage uniquement : $COLLECTIONS$", - "placeholders": { - "collections": { - "content": "$1", - "example": "Work, Personal" - } - } - }, "organizationIsDeactivated": { "message": "L'organisation est désactivée" }, @@ -4887,6 +4951,15 @@ "extraWide": { "message": "Très large" }, + "cannotRemoveViewOnlyCollections": { + "message": "Vous ne pouvez pas supprimer des collections avec les autorisations d'affichage uniquement : $COLLECTIONS$", + "placeholders": { + "collections": { + "content": "$1", + "example": "Work, Personal" + } + } + }, "updateDesktopAppOrDisableFingerprintDialogTitle": { "message": "Please update your desktop application" }, diff --git a/apps/browser/src/_locales/gl/messages.json b/apps/browser/src/_locales/gl/messages.json index 423f5f4c471..a5b22ae7932 100644 --- a/apps/browser/src/_locales/gl/messages.json +++ b/apps/browser/src/_locales/gl/messages.json @@ -382,7 +382,7 @@ "message": "Aniñar un cartafol engadindo o nome do cartafol pai seguido dun \"/\". Exemplo: Social/Foros" }, "noFoldersAdded": { - "message": "Sen cartafois" + "message": "Sen cartafoles" }, "createFoldersToOrganize": { "message": "Crea cartafoles para organizar as entradas da túa caixa forte" @@ -394,10 +394,10 @@ "message": "Eliminar cartafol" }, "folders": { - "message": "Cartafois" + "message": "Cartafoles" }, "noFolders": { - "message": "Non hai cartafois que listar." + "message": "Non hai cartafoles que listar." }, "helpFeedback": { "message": "Axuda e comentarios" @@ -2363,6 +2363,70 @@ "autofillBlockedNoticeGuidance": { "message": "Cambia isto en axustes" }, + "change": { + "message": "Change" + }, + "changeButtonTitle": { + "message": "Change password - $ITEMNAME$", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "atRiskPasswords": { + "message": "At-risk passwords" + }, + "atRiskPasswordsDescSingleOrg": { + "message": "$ORGANIZATION$ is requesting you change the $COUNT$ passwords because they are at risk.", + "placeholders": { + "organization": { + "content": "$1", + "example": "Acme Corp" + }, + "count": { + "content": "$2", + "example": "2" + } + } + }, + "atRiskPasswordsDescMultiOrg": { + "message": "Your organizations are requesting you change the $COUNT$ passwords because they are at risk.", + "placeholders": { + "count": { + "content": "$1", + "example": "2" + } + } + }, + "reviewAndChangeAtRiskPassword": { + "message": "Review and change one at-risk password" + }, + "reviewAndChangeAtRiskPasswordsPlural": { + "message": "Review and change $COUNT$ at-risk passwords", + "placeholders": { + "count": { + "content": "$1", + "example": "2" + } + } + }, + "changeAtRiskPasswordsFaster": { + "message": "Change at-risk passwords faster" + }, + "changeAtRiskPasswordsFasterDesc": { + "message": "Update your settings so you can quickly autofill your passwords and generate new ones" + }, + "turnOnAutofill": { + "message": "Turn on autofill" + }, + "turnedOnAutofill": { + "message": "Turned on autofill" + }, + "dismiss": { + "message": "Dismiss" + }, "websiteItemLabel": { "message": "Web $number$ (URI)", "placeholders": { @@ -3123,12 +3187,18 @@ "notificationSentDevice": { "message": "Enviouse unha notificación ó teu dispositivo." }, + "notificationSentDevicePart1": { + "message": "Unlock Bitwarden on your device or on the" + }, + "notificationSentDeviceAnchor": { + "message": "web app" + }, + "notificationSentDevicePart2": { + "message": "Make sure the Fingerprint phrase matches the one below before approving." + }, "aNotificationWasSentToYourDevice": { "message": "Enviouse unha notificación ó teu dispositivo" }, - "makeSureYourAccountIsUnlockedAndTheFingerprintEtc": { - "message": "Por favor asegúrate de que a sesión está aberta e a frase de pegada dixital coincide ca do outro dispositivo" - }, "youWillBeNotifiedOnceTheRequestIsApproved": { "message": "Serás notificado unha vez se aprobe a solicitude" }, @@ -3138,6 +3208,9 @@ "loginInitiated": { "message": "Inicio de sesión comezado" }, + "logInRequestSent": { + "message": "Request sent" + }, "exposedMasterPassword": { "message": "Contrasinal mestre filtrado" }, @@ -3810,7 +3883,7 @@ "message": "Autenticación multifactor fallida" }, "includeSharedFolders": { - "message": "Incluír cartafois compartidos" + "message": "Incluír cartafoles compartidos" }, "lastPassEmail": { "message": "Correo de LastPass" @@ -4146,15 +4219,6 @@ "itemName": { "message": "Nome da entrada" }, - "cannotRemoveViewOnlyCollections": { - "message": "Non podes eliminar coleccións con permisos de Só lectura: $COLLECTIONS$", - "placeholders": { - "collections": { - "content": "$1", - "example": "Work, Personal" - } - } - }, "organizationIsDeactivated": { "message": "A organización está desactivada" }, @@ -4887,6 +4951,15 @@ "extraWide": { "message": "Moi ancho" }, + "cannotRemoveViewOnlyCollections": { + "message": "Non podes eliminar coleccións con permisos de Só lectura: $COLLECTIONS$", + "placeholders": { + "collections": { + "content": "$1", + "example": "Work, Personal" + } + } + }, "updateDesktopAppOrDisableFingerprintDialogTitle": { "message": "Please update your desktop application" }, diff --git a/apps/browser/src/_locales/he/messages.json b/apps/browser/src/_locales/he/messages.json index 93600eaf6a9..58e8cd1e36a 100644 --- a/apps/browser/src/_locales/he/messages.json +++ b/apps/browser/src/_locales/he/messages.json @@ -3,42 +3,42 @@ "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": "כניסה ארגונית אחידה" + "message": "כניסה יחידה ארגונית" }, "cancel": { "message": "בטל" @@ -62,7 +62,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", @@ -78,10 +78,10 @@ "message": "הקלד שוב סיסמה ראשית" }, "masterPassHint": { - "message": "רמז לסיסמה ראשית (אופציונאלי)" + "message": "רמז לסיסמה ראשית (אופציונלי)" }, "joinOrganization": { - "message": "Join organization" + "message": "הצטרף לארגון" }, "joinOrganizationName": { "message": "הצטרפות אל $ORGANIZATIONNAME$", @@ -93,7 +93,7 @@ } }, "finishJoiningThisOrganizationBySettingAMasterPassword": { - "message": "Finish joining this organization by setting a master password." + "message": "סיים להצטרף לארגון זה על ידי הגדרת סיסמה ראשית." }, "tab": { "message": "לשונית" @@ -114,16 +114,16 @@ "message": "הגדרות" }, "currentTab": { - "message": "לשונית נוכחית" + "message": "כרטיסייה נוכחית" }, "copyPassword": { "message": "העתק סיסמה" }, "copyPassphrase": { - "message": "Copy passphrase" + "message": "העתק ביטוי סיסמה" }, "copyNote": { - "message": "העתק פתק" + "message": "העתק הערה" }, "copyUri": { "message": "העתק שורת כתובת" @@ -138,31 +138,31 @@ "message": "העתק קוד אבטחה" }, "copyName": { - "message": "Copy name" + "message": "העתק שם" }, "copyCompany": { - "message": "Copy company" + "message": "העתק חברה" }, "copySSN": { - "message": "Copy Social Security number" + "message": "העתק מספר תעודת זהות" }, "copyPassportNumber": { - "message": "Copy passport number" + "message": "העתק מספר דרכון" }, "copyLicenseNumber": { - "message": "Copy license number" + "message": "העתק מספר רישיון" }, "copyPrivateKey": { - "message": "Copy private key" + "message": "העתק מפתח פרטי" }, "copyPublicKey": { - "message": "Copy public key" + "message": "העתק מפתח ציבורי" }, "copyFingerprint": { - "message": "Copy fingerprint" + "message": "העתק טביעת אצבע" }, "copyCustomField": { - "message": "Copy $FIELD$", + "message": "העתק $FIELD$", "placeholders": { "field": { "content": "$1", @@ -171,42 +171,42 @@ } }, "copyWebsite": { - "message": "Copy website" + "message": "העתק אתר אינטרנט" }, "copyNotes": { - "message": "Copy notes" + "message": "העתק הערות" }, "fill": { - "message": "Fill", + "message": "מילוי", "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": "השלמה אוטומטית" + "message": "מילוי אוטומטי" }, "autoFillLogin": { - "message": "מילוי פרטי כניסה אוטומטית" + "message": "מילוי כניסה אוטומטי" }, "autoFillCard": { - "message": "מילוי פרטי כרטיס אוטומטית" + "message": "מילוי כרטיס אוטומטי" }, "autoFillIdentity": { - "message": "מילוי פרטי זיהוי אוטומטית" + "message": "מילוי זהות אוטומטי" }, "fillVerificationCode": { - "message": "Fill verification code" + "message": "מילוי קוד אימות" }, "fillVerificationCodeAria": { - "message": "Fill Verification Code", + "message": "מילוי קוד אימות", "description": "Aria label for the heading displayed the inline menu for totp code autofill" }, "generatePasswordCopied": { - "message": "צור סיסמה (העתק)" + "message": "צור סיסמה (והעתק)" }, "copyElementIdentifier": { - "message": "העתקת שם שדה מותאם אישית" + "message": "העתק שם שדה מותאם אישית" }, "noMatchingLogins": { - "message": "לא נמצאו פרטי כניסה תואמים." + "message": "אין כניסות תואמות" }, "noCards": { "message": "אין כרטיסים" @@ -215,40 +215,40 @@ "message": "אין זהויות" }, "addLoginMenu": { - "message": "הוספת פרטי כניסה" + "message": "הוסף כניסה" }, "addCardMenu": { - "message": "הוספת כרטיס" + "message": "הוסף כרטיס" }, "addIdentityMenu": { - "message": "הוספת זהות" + "message": "הוסף זהות" }, "unlockVaultMenu": { - "message": "שחרור הכספת שלך" + "message": "פתח את הכספת שלך" }, "loginToVaultMenu": { "message": "כניסה לכספת שלך" }, "autoFillInfo": { - "message": "לא נמצאו פרטי כניסה להשלמה אוטומטית בלשונית הנוכחית בדפדפן." + "message": "לא נמצאו כניסות למילוי אוטומטי בכרטיסיית הדפדפן הנוכחית." }, "addLogin": { - "message": "הוסף פרטי כניסה" + "message": "הוסף כניסה" }, "addItem": { "message": "הוסף פריט" }, "accountEmail": { - "message": "Account email" + "message": "דוא\"ל חשבון" }, "requestHint": { - "message": "Request hint" + "message": "בקש רמז" }, "requestPasswordHint": { - "message": "Request password hint" + "message": "בקש רמז לסיסמה" }, "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { - "message": "Enter your account email address and your password hint will be sent to you" + "message": "הזן את כתובת דוא\"ל החשבון שלך והרמז לסיסמה שלך יישלח אליך" }, "passwordHint": { "message": "רמז לסיסמה" @@ -263,10 +263,10 @@ "message": "המשך" }, "sendVerificationCode": { - "message": "שליחת קוד אימות לדוא״ל שלך" + "message": "שלח קוד אימות לדוא\"ל שלך" }, "sendCode": { - "message": "שליחת קוד" + "message": "שלח קוד" }, "codeSent": { "message": "קוד נשלח" @@ -281,28 +281,28 @@ "message": "החלף סיסמה ראשית" }, "continueToWebApp": { - "message": "Continue to web app?" + "message": "להמשיך ליישום רשת?" }, "continueToWebAppDesc": { - "message": "Explore more features of your Bitwarden account on the web app." + "message": "גלה עוד תכונות של חשבון ה־Bitwarden שלך ביישום הרשת." }, "continueToHelpCenter": { - "message": "Continue to Help Center?" + "message": "להמשיך למרכז עזרה?" }, "continueToHelpCenterDesc": { - "message": "Learn more about how to use Bitwarden on the Help Center." + "message": "למד עוד אודות אופן השימוש ב־Bitwarden במרכז העזרה." }, "continueToBrowserExtensionStore": { - "message": "Continue to browser extension store?" + "message": "להמשיך לחנות הרחבות דפדפן?" }, "continueToBrowserExtensionStoreDesc": { - "message": "Help others find out if Bitwarden is right for them. Visit your browser's extension store and leave a rating now." + "message": "עזור לאחרים לגלות אם Bitwarden מתאים להם. בקר בחנות הרחבות הדפדפן שלך והשאר דירוג עכשיו." }, "changeMasterPasswordOnWebConfirmation": { - "message": "You can change your master password on the Bitwarden web app." + "message": "אתה יכול לשנות את הסיסמה הראשית שלך ביישום הרשת של Bitwarden." }, "fingerprintPhrase": { - "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." }, "yourAccountsFingerprint": { @@ -310,49 +310,49 @@ "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": "התנתק" }, "aboutBitwarden": { - "message": "About Bitwarden" + "message": "אודות Bitwarden" }, "about": { "message": "אודות" }, "moreFromBitwarden": { - "message": "More from Bitwarden" + "message": "עוד מאת Bitwarden" }, "continueToBitwardenDotCom": { - "message": "Continue to bitwarden.com?" + "message": "להמשיך אל bitwarden.com?" }, "bitwardenForBusiness": { - "message": "Bitwarden for Business" + "message": "Bitwarden לעסקים" }, "bitwardenAuthenticator": { - "message": "Bitwarden Authenticator" + "message": "מאמת Bitwarden" }, "continueToAuthenticatorPageDesc": { - "message": "Bitwarden Authenticator allows you to store authenticator keys and generate TOTP codes for 2-step verification flows. Learn more on the bitwarden.com website" + "message": "מאמת Bitwarden מאפשר לך לאחסון מפתחות מאמת וליצור קודי TOTP עבור זרימת אימות דו-שלבית. למד עוד באתר האינטרנט bitwarden.com" }, "bitwardenSecretsManager": { - "message": "Bitwarden Secrets Manager" + "message": "מנהל סודות Bitwarden" }, "continueToSecretsManagerPageDesc": { - "message": "Securely store, manage, and share developer secrets with Bitwarden Secrets Manager. Learn more on the bitwarden.com website." + "message": "אחסן, נהל, ושתף בבטחה סודות מפתח עם מנהל סודות Bitwarden. למד עוד באתר האינטרנט bitwarden.com." }, "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. למד עוד באתר האינטרנט bitwarden.com." }, "freeBitwardenFamilies": { - "message": "Free Bitwarden Families" + "message": "משפחות Bitwarden בחינם" }, "freeBitwardenFamiliesPageDesc": { - "message": "You are eligible for Free Bitwarden Families. Redeem this offer today in the web app." + "message": "אתה זכאי למשפחות Bitwarden בחינם. ממש הצעה זו היום ביישום הרשת." }, "version": { "message": "גירסה" @@ -361,7 +361,7 @@ "message": "שמור" }, "move": { - "message": "העברה" + "message": "העבר" }, "addFolder": { "message": "הוסף תיקייה" @@ -373,22 +373,22 @@ "message": "ערוך תיקייה" }, "newFolder": { - "message": "New folder" + "message": "תיקיה חדשה" }, "folderName": { - "message": "Folder name" + "message": "שם תיקיה" }, "folderHintText": { - "message": "Nest a folder by adding the parent folder's name followed by a “/”. Example: Social/Forums" + "message": "קונן תיקיה על ידי הוספת שם תיקיית האב ואחריו “/”. דוגמה: חברתי/פורומים" }, "noFoldersAdded": { - "message": "No folders added" + "message": "לא נוספו תיקיות" }, "createFoldersToOrganize": { - "message": "Create folders to organize your vault items" + "message": "צור תיקיות כדי לארגן את פריטי הכספת שלך" }, "deleteFolderPermanently": { - "message": "Are you sure you want to permanently delete this folder?" + "message": "האם אתה בטוח שברצונך למחוק תיקיה זו לצמיתות?" }, "deleteFolder": { "message": "מחק תיקייה" @@ -400,16 +400,16 @@ "message": "אין תיקיות להצגה." }, "helpFeedback": { - "message": "עזרה ומשוב" + "message": "עזרה & משוב" }, "helpCenter": { "message": "מרכז העזרה של Bitwarden" }, "communityForums": { - "message": "Explore Bitwarden community forums" + "message": "גלה את פורומי קהילת Bitwarden" }, "contactSupport": { - "message": "Contact Bitwarden support" + "message": "פנה לתמיכת Bitwarden" }, "sync": { "message": "סנכרן" @@ -421,7 +421,7 @@ "message": "סנכרון אחרון:" }, "passGen": { - "message": "יוצר הסיסמאות" + "message": "מחולל סיסמאות" }, "generator": { "message": "מייצר", @@ -431,10 +431,10 @@ "message": "צור אוטומטית סיסמאות חזקות ויחודיות עבור פרטי הכניסה שלך." }, "bitWebVaultApp": { - "message": "Bitwarden web app" + "message": "יישום רשת Bitwarden" }, "importItems": { - "message": "יבא פריטים" + "message": "ייבא פריטים" }, "select": { "message": "בחר" @@ -443,22 +443,22 @@ "message": "צור סיסמה" }, "generatePassphrase": { - "message": "Generate passphrase" + "message": "צור ביטוי סיסמה" }, "passwordGenerated": { - "message": "Password generated" + "message": "נוצרה סיסמה" }, "passphraseGenerated": { - "message": "Passphrase generated" + "message": "נוצר ביטוי סיסמה" }, "usernameGenerated": { - "message": "Username generated" + "message": "נוצר שם משתמש" }, "emailGenerated": { - "message": "Email generated" + "message": "נוצר דוא\"ל" }, "regeneratePassword": { - "message": "צור סיסמה חדשה" + "message": "צור סיסמה מחדש" }, "options": { "message": "אפשרויות" @@ -467,27 +467,27 @@ "message": "אורך" }, "uppercase": { - "message": "Uppercase (A-Z)", + "message": "אות גדולה (A-Z)", "description": "deprecated. Use uppercaseLabel instead." }, "lowercase": { - "message": "Lowercase (a-z)", + "message": "אות קטנה (a-z)", "description": "deprecated. Use lowercaseLabel instead." }, "numbers": { - "message": "Numbers (0-9)", + "message": "מספרים (0-9)", "description": "deprecated. Use numbersLabel instead." }, "specialCharacters": { - "message": "Special characters (!@#$%^&*)", + "message": "תווים מיוחדים (*&^%$#@!)", "description": "deprecated. Use specialCharactersLabel instead." }, "include": { - "message": "Include", + "message": "כלול", "description": "Card header for password generator include block" }, "uppercaseDescription": { - "message": "Include uppercase characters", + "message": "כלול תווי אות גדולה", "description": "Tooltip for the password generator uppercase character checkbox" }, "uppercaseLabel": { @@ -495,7 +495,7 @@ "description": "Label for the password generator uppercase character checkbox" }, "lowercaseDescription": { - "message": "Include lowercase characters", + "message": "כלול תווי אות קטנה", "description": "Full description for the password generator lowercase character checkbox" }, "lowercaseLabel": { @@ -503,7 +503,7 @@ "description": "Label for the password generator lowercase character checkbox" }, "numbersDescription": { - "message": "Include numbers", + "message": "כלול מספרים", "description": "Full description for the password generator numbers checkbox" }, "numbersLabel": { @@ -511,15 +511,15 @@ "description": "Label for the password generator numbers checkbox" }, "specialCharactersDescription": { - "message": "Include special characters", + "message": "כלול תווים מיוחדים", "description": "Full description for the password generator special characters checkbox" }, "specialCharactersLabel": { - "message": "!@#$%^&*", + "message": "*&^%$#@!", "description": "Label for the password generator special characters checkbox" }, "numWords": { - "message": "מספר מילים" + "message": "מספר המילים" }, "wordSeparator": { "message": "מפריד מילים" @@ -535,14 +535,14 @@ "message": "מינימום ספרות" }, "minSpecial": { - "message": "מינימום תוים מיוחדים" + "message": "מינימום מיוחדים" }, "avoidAmbiguous": { - "message": "Avoid ambiguous characters", + "message": "הימנע מתווים דו-משמעיים", "description": "Label for the avoid ambiguous characters checkbox." }, "generatorPolicyInEffect": { - "message": "Enterprise policy requirements have been applied to your generator options.", + "message": "דרישות מדיניות ארגונית הוחלו על אפשרויות המחולל שלך.", "description": "Indicates that a policy limits the credential generator screen." }, "searchVault": { @@ -567,7 +567,7 @@ "message": "סיסמה" }, "totp": { - "message": "Authenticator secret" + "message": "סוד מאמת" }, "passphrase": { "message": "משפט סיסמה" @@ -576,7 +576,7 @@ "message": "מועדף" }, "unfavorite": { - "message": "Unfavorite" + "message": "מחק ממועדפים" }, "itemAddedToFavorites": { "message": "פריט נוסף למועדפים" @@ -588,7 +588,7 @@ "message": "הערות" }, "privateNote": { - "message": "Private note" + "message": "הערה פרטית" }, "note": { "message": "הערה" @@ -609,10 +609,10 @@ "message": "הפעל" }, "launchWebsite": { - "message": "Launch website" + "message": "פתח אתר" }, "launchWebsiteName": { - "message": "Launch website $ITEMNAME$", + "message": "פתח אתר $ITEMNAME$", "placeholders": { "itemname": { "content": "$1", @@ -624,7 +624,7 @@ "message": "אתר" }, "toggleVisibility": { - "message": "הצג או הסתר" + "message": "שנה נראות" }, "manage": { "message": "נהל" @@ -633,49 +633,49 @@ "message": "אחר" }, "unlockMethods": { - "message": "Unlock options" + "message": "אפשרויות ביטול נעילה" }, "unlockMethodNeededToChangeTimeoutActionDesc": { - "message": "Set up an unlock method to change your vault timeout action." + "message": "הגדר שיטת ביטול נעילה כדי לשנות את פעולת פסק זמן הכספת שלך." }, "unlockMethodNeeded": { - "message": "Set up an unlock method in Settings" + "message": "הגדר שיטת ביטול נעילה בהגדרות" }, "sessionTimeoutHeader": { - "message": "Session timeout" + "message": "זמן קצוב להפעלה" }, "vaultTimeoutHeader": { - "message": "Vault timeout" + "message": "זמן קצוב לכספת" }, "otherOptions": { - "message": "Other options" + "message": "אפשרויות אחרות" }, "rateExtension": { - "message": "דירוג הרחבה" + "message": "דרג את ההרחבה" }, "browserNotSupportClipboard": { "message": "הדפדפן שלך לא תומך בהעתקה ללוח. אנא העתק בצורה ידנית." }, "verifyIdentity": { - "message": "אימות זהות" + "message": "אמת זהות" }, "weDontRecognizeThisDevice": { - "message": "We don't recognize this device. Enter the code sent to your email to verify your identity." + "message": "אנחנו לא מזהים את המכשיר הזה. הזן את הקוד שנשלח לדוא\"ל שלך כדי לאמת את זהותך." }, "continueLoggingIn": { - "message": "Continue logging in" + "message": "המשך להתחבר" }, "yourVaultIsLocked": { - "message": "הכספת שלך נעולה. הזן את הסיסמה הראשית שלך כדי להמשיך." + "message": "הכספת שלך נעולה. אמת את זהותך כדי להמשיך." }, "yourVaultIsLockedV2": { - "message": "Your vault is locked" + "message": "הכספת שלך נעולה" }, "yourAccountIsLocked": { - "message": "Your account is locked" + "message": "החשבון שלך נעול" }, "or": { - "message": "or" + "message": "או" }, "unlock": { "message": "בטל נעילה" @@ -697,16 +697,16 @@ "message": "סיסמה ראשית שגויה" }, "vaultTimeout": { - "message": "משך זמן מירבי עבור חיבור לכספת" + "message": "פסק זמן כספת" }, "vaultTimeout1": { - "message": "Timeout" + "message": "פסק זמן" }, "lockNow": { "message": "נעל עכשיו" }, "lockAll": { - "message": "Lock all" + "message": "נעל הכל" }, "immediately": { "message": "באופן מיידי" @@ -742,7 +742,7 @@ "message": "4 שעות" }, "onLocked": { - "message": "בזמן נעילת המערכת" + "message": "בנעילת המערכת" }, "onRestart": { "message": "בהפעלת הדפדפן מחדש" @@ -754,16 +754,16 @@ "message": "אבטחה" }, "confirmMasterPassword": { - "message": "Confirm master password" + "message": "אמת סיסמה ראשית" }, "masterPassword": { - "message": "Master password" + "message": "סיסמה ראשית" }, "masterPassImportant": { - "message": "Your master password cannot be recovered if you forget it!" + "message": "לא ניתן לשחזר את הסיסמה הראשית שלך אם אתה שוכח אותה!" }, "masterPassHintLabel": { - "message": "Master password hint" + "message": "רמז סיסמה ראשית" }, "errorOccurred": { "message": "אירעה שגיאה" @@ -775,13 +775,13 @@ "message": "כתובת אימייל לא תקינה." }, "masterPasswordRequired": { - "message": "Master password is required." + "message": "דרושה סיסמה ראשית." }, "confirmMasterPasswordRequired": { - "message": "Master password retype is required." + "message": "דרושה הקלדה מחדש של הסיסמה הראשית." }, "masterPasswordMinlength": { - "message": "Master password must be at least $VALUE$ characters long.", + "message": "סיסמה ראשית חייבת להיות לפחות באורך $VALUE$ תווים.", "description": "The Master Password must be at least a specific number of characters long.", "placeholders": { "value": { @@ -797,16 +797,16 @@ "message": "החשבון שלך נוצר בהצלחה! כעת ניתן להכנס למערכת." }, "newAccountCreated2": { - "message": "Your new account has been created!" + "message": "החשבון החדש שלך נוצר!" }, "youHaveBeenLoggedIn": { - "message": "You have been logged in!" + "message": "התחברת!" }, "youSuccessfullyLoggedIn": { - "message": "You successfully logged in" + "message": "התחברת בהצלחה" }, "youMayCloseThisWindow": { - "message": "You may close this window" + "message": "אתה רשאי לסגור חלון זה" }, "masterPassSent": { "message": "שלחנו לך אימייל עם רמז לסיסמה הראשית." @@ -815,7 +815,7 @@ "message": "נדרש קוד אימות." }, "webauthnCancelOrTimeout": { - "message": "The authentication was cancelled or took too long. Please try again." + "message": "האימות בוטל או לקח יותר מדי זמן. נא לנסות שוב." }, "invalidVerificationCode": { "message": "קוד אימות שגוי" @@ -831,58 +831,58 @@ } }, "autofillError": { - "message": "לא הצלחנו לבצע פעולת השלמה האוטומטית בעמוד זה. אנא העתק והדבק את המידע הנחוץ בצורה ידנית." + "message": "לא ניתן למלא אוטומטית את הפריט שנבחר בדף זה. העתק והדבק את המידע במקום זאת." }, "totpCaptureError": { - "message": "Unable to scan QR code from the current webpage" + "message": "אי אפשר לסרוק קוד QR מהדף הנוכחי" }, "totpCaptureSuccess": { - "message": "Authenticator key added" + "message": "נוסף מפתח מאמת" }, "totpCapture": { - "message": "Scan authenticator QR code from current webpage" + "message": "סרוק קוד QR מאמת מהדף הנוכחי" }, "totpHelperTitle": { - "message": "Make 2-step verification seamless" + "message": "הפוך את האימות הדו-שלבי לחלק" }, "totpHelper": { - "message": "Bitwarden can store and fill 2-step verification codes. Copy and paste the key into this field." + "message": "Bitwarden יכול לאחסון ולמלא קודים של אימות דו-שלבי. העתק והדבק את המפתח לשדה זה." }, "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 יכול לאחסון ולמלא קודים של אימות דו-שלבי. בחר את סמל המצלמה כדי לצלם את הקוד QR המאמת של אתר זה, או העתק והדבק את המפתח לתוך שדה זה." }, "learnMoreAboutAuthenticators": { - "message": "Learn more about authenticators" + "message": "למד עוד על מאמתים" }, "copyTOTP": { - "message": "Copy Authenticator key (TOTP)" + "message": "העתק קוד מאמת (TOTP)" }, "loggedOut": { "message": "בוצעה יציאה" }, "loggedOutDesc": { - "message": "You have been logged out of your account." + "message": "התנתקת מהחשבון שלך." }, "loginExpired": { "message": "תוקף החיבור שלך הסתיים." }, "logIn": { - "message": "Log in" + "message": "התחבר" }, "logInToBitwarden": { - "message": "Log in to Bitwarden" + "message": "התחבר ל־Bitwarden" }, "restartRegistration": { - "message": "Restart registration" + "message": "אתחל הרשמה" }, "expiredLink": { - "message": "Expired link" + "message": "קישור פג תוקף" }, "pleaseRestartRegistrationOrTryLoggingIn": { - "message": "Please restart registration or try logging in." + "message": "נא לאתחל הרשמה או לנסות להתחבר." }, "youMayAlreadyHaveAnAccount": { - "message": "You may already have an account" + "message": "ייתכן שכבר יש לך חשבון" }, "logOutConfirmation": { "message": "האם אתה בטוח שברצונך להתנתק?" @@ -900,28 +900,28 @@ "message": "דרוש שם." }, "addedFolder": { - "message": "נוספה תיקייה" + "message": "התיקייה נוספה" }, "twoStepLoginConfirmation": { - "message": "התחברות בשני-שלבים הופכת את החשבון שלך למאובטח יותר בכך שאתה נדרש לוודא בכל כניסה בעזרת מכשיר אחר כדוגמת מפתח אבטחה, תוכנת אימות, SMS, שיחת טלפון, או אימייל. ניתן להפעיל את \"התחברות בשני-שלבים\" בכספת שבאתר bitwarden.com. האם ברצונך לפתוח את האתר כעת?" + "message": "כניסה דו-שלבית הופכת את החשבון שלך למאובטח יותר בכך שאתה נדרש לאמת את הכניסה שלך עם מכשיר אחר כמו מפתח אבטחה, יישום מאמת, מסרון, שיחת טלפון, או דוא\"ל. ניתן להגדיר כניסה דו-שלבית בכספת הרשת bitwarden.com. האם ברצונך לבקר באתר כעת?" }, "twoStepLoginConfirmationContent": { - "message": "Make your account more secure by setting up two-step login in the Bitwarden web app." + "message": "הפוך את החשבון שלך לבטוח יותר על ידי הגדרת התחברות דו-שלבית ביישום הרשת Bitwarden." }, "twoStepLoginConfirmationTitle": { - "message": "Continue to web app?" + "message": "להמשיך ביישום הרשת?" }, "editedFolder": { - "message": "תיקייה שנערכה" + "message": "התיקייה נשמרה" }, "deleteFolderConfirmation": { "message": "האם אתה בטוח שברצונך למחוק את התיקייה?" }, "deletedFolder": { - "message": "תיקייה שנמחקה" + "message": "התיקייה נמחקה" }, "gettingStartedTutorial": { - "message": "מדריך שימוש ראשוני" + "message": "מדריך תחילת עבודה" }, "gettingStartedTutorialVideo": { "message": "צפה במדריך השימוש הראשוני כדי ללמוד איך לנצל את המקסימום שהתוסף לדפדפן יכול להציע." @@ -952,20 +952,20 @@ "message": "כתובת חדשה" }, "addDomain": { - "message": "Add domain", + "message": "הוסף דומיין", "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": "פריט שהתווסף" + "message": "פריט נוסף" }, "editedItem": { - "message": "פריט שנערך" + "message": "פריט נשמר" }, "deleteItemConfirmation": { "message": "האם אתה בטוח שברצונך למחוק פריט זה?" }, "deletedItem": { - "message": "פריט נשלח לסל המחזור" + "message": "פריט נשלח לאשפה" }, "overwritePassword": { "message": "דרוס סיסמה" @@ -974,10 +974,10 @@ "message": "האם אתה בטוח שברצונך לדרוס את הסיסמה הנוכחית?" }, "overwriteUsername": { - "message": "Overwrite username" + "message": "החלף שם משתמש" }, "overwriteUsernameConfirmation": { - "message": "Are you sure you want to overwrite the current username?" + "message": "האם אתה בטוח שברצונך להחליף את שם המשתמש הנוכחי?" }, "searchFolder": { "message": "חפש תיקייה" @@ -993,37 +993,37 @@ "description": "This is the folder for uncategorized items" }, "enableAddLoginNotification": { - "message": "Ask to add login" + "message": "שאל אם לשמור פרטי כניסה" }, "vaultSaveOptionsTitle": { - "message": "Save to vault options" + "message": "שמור בהגדרות כספת" }, "addLoginNotificationDesc": { - "message": "ההודעה \"שמור פרטי כניסה\" מופיעה בכל פעם שתכנס לאתר חדש בפעם הראשונה." + "message": "שאל האם להוסיף פריט כשאין אחד בכספת שלך." }, "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" + "message": "הצג תמיד כרטיסים כהצעות מילוי אוטומטי בתצוגת כספת" }, "showCardsCurrentTab": { - "message": "Show cards on Tab page" + "message": "הצג כרטיסים בדף הכרטיסיות" }, "showCardsCurrentTabDesc": { - "message": "List card items on the Tab page for easy autofill." + "message": "רשום פריטי כרטיס בדף הכרטיסיות עבור מילוי אוטומטי קל." }, "showIdentitiesInVaultViewV2": { - "message": "Always show identities as Autofill suggestions on Vault view" + "message": "הצג תמיד זהויות כהצעות למילוי אוטומטי בתצוגת כספת" }, "showIdentitiesCurrentTab": { - "message": "Show identities on Tab page" + "message": "הצג זהויות בדף הכרטיסיות" }, "showIdentitiesCurrentTabDesc": { - "message": "List identity items on the Tab page for easy autofill." + "message": "הצג פריטי זהות בדף הכרטיסיות עבור מילוי אוטומטי קל." }, "clickToAutofillOnVault": { - "message": "Click items to autofill on Vault view" + "message": "לחץ על פריטים כדי למלא אוטומטית בתצוגת כספת" }, "clearClipboard": { "message": "נקה לוח העתקות", @@ -1037,53 +1037,53 @@ "message": "האם ברצונך שתוכנת Bitwarden תזכור סיסמה זו עבורך?" }, "notificationAddSave": { - "message": "כן, שמור עכשיו" + "message": "שמור" }, "enableChangedPasswordNotification": { - "message": "Ask to update existing login" + "message": "שאל אם לעדכן פרטי כניסה קיימת" }, "changedPasswordNotificationDesc": { - "message": "Ask to update a login's password when a change is detected on a website." + "message": "שאל אם לעדכן סיסמת כניסה כאשר זוהה שינוי באתר אינטרנט." }, "changedPasswordNotificationDescAlt": { - "message": "Ask to update a login's password when a change is detected on a website. Applies to all logged in accounts." + "message": "שאל אם לעדכן סיסמת כניסה כאשר זוהה שינוי באתר אינטרנט. חל על כל החשבונות המחוברים." }, "enableUsePasskeys": { - "message": "Ask to save and use passkeys" + "message": "שאל אם לשמור ולהשתמש במפתחות גישה" }, "usePasskeysDesc": { - "message": "Ask to save new passkeys or log in with passkeys stored in your vault. Applies to all logged in accounts." + "message": "שאל אם לשמור מפתחות גישה חדשים או להתחבר עם מפתחות גישה השמורים בכספת שלך. חל על כל המשתמשים המחוברים." }, "notificationChangeDesc": { "message": "האם ברצונך לעדכן את הסיסמה הזו בתוכנת Bitwarden?" }, "notificationChangeSave": { - "message": "כן, עדכן עכשיו" + "message": "עדכן" }, "notificationUnlockDesc": { - "message": "Unlock your Bitwarden vault to complete the autofill request." + "message": "בטל נעילת כספת ה־Bitwarden שלך כדי להשלים את בקשת המילוי האוטומטי." }, "notificationUnlock": { - "message": "Unlock" + "message": "בטל נעילה" }, "additionalOptions": { - "message": "Additional options" + "message": "אפשרויות נוספות" }, "enableContextMenuItem": { - "message": "Show context menu options" + "message": "הצג אפשרויות תפריט הקשר" }, "contextMenuItemDesc": { - "message": "Use a secondary click to access password generation and matching logins for the website." + "message": "השתמש בלחיצה משנית כדי לגשת לחילול סיסמה וכניסות תואמות עבור אתר האינטרנט." }, "contextMenuItemDescAlt": { - "message": "Use a secondary click to access password generation and matching logins for the website. Applies to all logged in accounts." + "message": "השתמש בלחיצה משנית כדי לגשת לחילול סיסמה וכניסות תואמות עבור אתר האינטרנט. חל על כל החשבונות המחוברים." }, "defaultUriMatchDetection": { - "message": "ברירת מחדל לזיהוי התאמת כתובות", + "message": "ברירת מחדל לזיהוי התאמת URI", "description": "Default URI match detection for autofill." }, "defaultUriMatchDetectionDesc": { - "message": "בחר את שיטת ברירת המחדל עבור זיהוי התאמת כתובות כשמבצעים פעולות השלמה אוטומטית." + "message": "בחר את דרך ברירת המחדל לטיפול בזיהוי התאמת URI עבור כניסות כשמבצעים פעולות כגון מילוי אוטומטי." }, "theme": { "message": "ערכת נושא" @@ -1092,7 +1092,7 @@ "message": "שנה את ערכת הצבע של האפליקציה." }, "themeDescAlt": { - "message": "Change the application's color theme. Applies to all logged in accounts." + "message": "שנה את צבעי ערכת הנושא של היישום. חל על כל החשבונות המחוברים." }, "dark": { "message": "כהה", @@ -1103,52 +1103,52 @@ "description": "Light color" }, "solarizedDark": { - "message": "Solarized dark", + "message": "כהה סולארי", "description": "'Solarized' is a noun and the name of a color scheme. It should not be translated." }, "exportFrom": { - "message": "Export from" + "message": "ייצוא מ-" }, "exportVault": { - "message": "יצוא כספת" + "message": "ייצוא כספת" }, "fileFormat": { - "message": "פורמט קובץ" + "message": "פורמט הקובץ" }, "fileEncryptedExportWarningDesc": { - "message": "This file export will be password protected and require the file password to decrypt." + "message": "קובץ ייצוא זה יהיה מוגן סיסמה ודורש את סיסמת הקובץ כדי לפענח." }, "filePassword": { - "message": "File password" + "message": "סיסמת קובץ" }, "exportPasswordDescription": { - "message": "This password will be used to export and import this file" + "message": "סיסמה זו תשמש כדי לייצא ולייבא קובץ זה" }, "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": "השתמש במפתח הצפנת החשבון שלך, הנגזר משם המשתמש שלך והסיסמה הראשית, כדי להצפין את הייצוא ולהגביל את הייבוא רק לחשבון Bitwarden הנוכחי." }, "passwordProtectedOptionDescription": { - "message": "Set a file password to encrypt the export and import it to any Bitwarden account using the password for decryption." + "message": "הגדר סיסמת קובץ כדי להצפין את הייצוא ולייבא אותו לכל חשבון Bitwarden באמצעות הסיסמה לפענוח." }, "exportTypeHeading": { - "message": "Export type" + "message": "סוג ייצוא" }, "accountRestricted": { - "message": "Account restricted" + "message": "מוגבל חשבון" }, "filePasswordAndConfirmFilePasswordDoNotMatch": { - "message": "“File password” and “Confirm file password“ do not match." + "message": "\"סיסמת קובץ\" ו-\"אשר סיסמת קובץ\" אינם תואמים." }, "warning": { "message": "אזהרה", "description": "WARNING (should stay in capitalized letters if the language permits)" }, "warningCapitalized": { - "message": "Warning", + "message": "אזהרה", "description": "Warning (should maintain locale-relevant capitalization)" }, "confirmVaultExport": { - "message": "אישור ייצוא כספת" + "message": "אשר ייצוא הכספת" }, "exportWarningDesc": { "message": "הקובץ מכיל את פרטי הכספת שלך בפורמט לא מוצפן. מומלץ להעביר את הקובץ רק בדרכים מוצפנות, ומאוד לא מומלץ לשמור או לשלוח את הקובץ הזה בדרכים לא מוצפנות (כדוגמת סתם אימייל). מחק את הקובץ מיד לאחר שסיימת את השימוש בו." @@ -1157,7 +1157,7 @@ "message": "ייצוא זה מצפין את המידע שלך באמצעות שימוש במפתח ההצפנה של חשבונך. אם אי-פעם תבצע החלפה (רוטציה) למפתח ההצפנה של חשבונך, עליך לבצע ייצוא זה שוב אחרת לא תוכל לפענח קובץ ייצוא זה." }, "encExportAccountWarningDesc": { - "message": "Account encryption keys are unique to each Bitwarden user account, so you can't import an encrypted export into a different account." + "message": "מפתחות הצפנת חשבון הם ייחודים לכל חשבון משתמש Bitwarden, לכן אינך יכול לייבא ייצוא מוצפן לתוך חשבון אחר." }, "exportMasterPassword": { "message": "הזן את הסיסמה הראשית שלך עבור יצוא המידע מהכספת." @@ -1166,13 +1166,13 @@ "message": "משותף" }, "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": "Bitwarden לעסקים מאפשר לך לשתף את פריטי הכספת שלך עם אחרים על ידי שימוש בארגון. למד עוד באתר האינטרנט bitwarden.com." }, "moveToOrganization": { - "message": "Move to organization" + "message": "העבר לארגון" }, "movedItemToOrg": { - "message": "$ITEMNAME$ הועבר ל- $ORGNAME$", + "message": "$ITEMNAME$ הועבר ל־$ORGNAME$", "placeholders": { "itemname": { "content": "$1", @@ -1185,13 +1185,13 @@ } }, "moveToOrgDesc": { - "message": "Choose an organization that you wish to move this item to. Moving to an organization transfers ownership of the item to that organization. You will no longer be the direct owner of this item once it has been moved." + "message": "בחר ארגון שאליו ברצונך להעביר פריט זה. העברה אל ארגון מעבירה בעלות של הפריט אל אותו ארגון. לא תוכל להיות הבעלים הישיר של פריט זה ברגע שהוא הועבר." }, "learnMore": { "message": "למידע נוסף" }, "authenticatorKeyTotp": { - "message": "מפתח אימות (TOTP)" + "message": "מפתח מאמת (TOTP)" }, "verificationCodeTotp": { "message": "קוד אימות (TOTP)" @@ -1209,61 +1209,61 @@ "message": "האם אתה בטוח שברצונך למחוק קובץ מצורף זה?" }, "deletedAttachment": { - "message": "קובץ מצורף שנמחק" + "message": "הקובץ המצורף נמחק" }, "newAttachment": { - "message": "צרף קובץ חדש" + "message": "צרף קובץ מצורף חדש" }, "noAttachments": { "message": "אין קבצים מצורפים." }, "attachmentSaved": { - "message": "הקובץ המצורף נשמר." + "message": "הקובץ המצורף נשמר" }, "file": { "message": "קובץ" }, "fileToShare": { - "message": "File to share" + "message": "קובץ לשיתוף" }, "selectFile": { - "message": "בחר קובץ." + "message": "בחר קובץ" }, "maxFileSize": { - "message": "גודל הקובץ המירבי הוא 500 מגה." + "message": "גודל הקובץ המרבי הוא 500MB." }, "featureUnavailable": { - "message": "יכולת זו לא זמינה" + "message": "תכונה זו לא זמינה" }, "encryptionKeyMigrationRequired": { - "message": "Encryption key migration required. Please login through the web vault to update your encryption key." + "message": "דרושה הגירת מפתח הצפנה. נא להתחבר דרך כספת הרשת כדי לעדכן את מפתח ההצפנה שלך." }, "premiumMembership": { - "message": "חשבון פרימיום" + "message": "חברות פרימיום" }, "premiumManage": { - "message": "נהל חשבון" + "message": "נהל חברות" }, "premiumManageAlert": { "message": "באפשרותך לנהל את החשבון שלך דרך הכספת באתר bitwarden.com. האם ברצונך לפתוח את האתר כעת?" }, "premiumRefresh": { - "message": "רענן פרטי חשבון" + "message": "רענן חברות" }, "premiumNotCurrentMember": { - "message": "חשבונך אינו חשבון פרמיום כרגע." + "message": "אתה לא כרגע חבר פרימיום." }, "premiumSignUpAndGet": { - "message": "צור חשבון פרמיום לשנה, וקבל:" + "message": "הרשם לחברות פרימיום וקבל:" }, "ppremiumSignUpStorage": { "message": "1 ג'יגה של מקום אחסון עבור קבצים מצורפים." }, "premiumSignUpEmergency": { - "message": "Emergency access." + "message": "גישת חירום." }, "premiumSignUpTwoStepOptions": { - "message": "Proprietary two-step login options such as YubiKey and Duo." + "message": "אפשרויות כניסה דו-שלבית קנייניות כגון YubiKey ו־Duo." }, "ppremiumSignUpReports": { "message": "היגיינת סיסמאות, מצב בריאות החשבון, ודיווחים מעודכנים על פרצות חדשות בכדי לשמור על הכספת שלך בטוחה." @@ -1275,22 +1275,22 @@ "message": "קדימות בתמיכה הטכנית." }, "ppremiumSignUpFuture": { - "message": "כל יכולות הפרימיום העתידיות שנפתח. עוד יכולות מגיעות בקרוב!" + "message": "כל תכונות הפרימיום העתידיות. עוד מגיעות בקרוב!" }, "premiumPurchase": { "message": "רכוש פרימיום" }, "premiumPurchaseAlertV2": { - "message": "You can purchase Premium from your account settings on the Bitwarden web app." + "message": "אתה יכול לרכוש פרימיום מהגדרות החשבון שלך ביישום הרשת Bitwarden." }, "premiumCurrentMember": { - "message": "אתה מנוי פרימיום!" + "message": "אתה חבר פרימיום!" }, "premiumCurrentMemberThanks": { "message": "תודה על תמיכתך בBitwarden." }, "premiumFeatures": { - "message": "Upgrade to Premium and receive:" + "message": "שדרג לפרימיום וקבל:" }, "premiumPrice": { "message": "הכל רק ב$PRICE$ לשנה!", @@ -1302,7 +1302,7 @@ } }, "premiumPriceV2": { - "message": "All for just $PRICE$ per year!", + "message": "הכל תמורת $PRICE$ בלבד לשנה!", "placeholders": { "price": { "content": "$1", @@ -1314,28 +1314,28 @@ "message": "הרענון הושלם" }, "enableAutoTotpCopy": { - "message": "Copy TOTP automatically" + "message": "העתק TOTP אוטומטי" }, "disableAutoTotpCopyDesc": { - "message": "אם פרטי הכניסה שלך מקושרים לאפליקציית אימות, קוד האימות TOTP מועתק אוטומטית ללוח שלך ברגע שמתבצעת ההשלמה האוטומטית לטופס הכניסה." + "message": "אם לכניסה שלך יש מפתח מאמת, העתק את קוד האימות TOTP ללוח ההעתקה שלך כאשר אתה ממלא אוטומטית את הכניסה." }, "enableAutoBiometricsPrompt": { - "message": "Ask for biometrics on launch" + "message": "בקש זיהוי ביומטרי בפתיחה" }, "premiumRequired": { - "message": "נדרש חשבון פרימיום" + "message": "נדרש פרימיום" }, "premiumRequiredDesc": { - "message": "בכדי להשתמש ביכולת זו יש צורך בחשבון פרימיום." + "message": "יש צורך בחברות פרימיום כדי להשתמש בתכונה זו." }, "enterVerificationCodeApp": { "message": "הכנס את קוד האימות בן 6 הספרות מאפליקציית האימות שלך." }, "authenticationTimeout": { - "message": "Authentication timeout" + "message": "זמן קצוב לאימות" }, "authenticationSessionTimedOut": { - "message": "The authentication session timed out. Please restart the login process." + "message": "תם הזמן הקצוב לאימות ההפעלה. נא להתחיל מחדש את תהליך הכניסה." }, "enterVerificationCodeEmail": { "message": "הכנס את קוד האימות בן 6 הספרות שנשלח ל-$EMAIL$.", @@ -1371,47 +1371,47 @@ "message": "הכנס את מפתח האבטחה שלך אל כניסת ה-USB במחשבך. אם יש לו כפתור, לחץ עליו." }, "webAuthnNewTab": { - "message": "To start the WebAuthn 2FA verification. Click the button below to open a new tab and follow the instructions provided in the new tab." + "message": "על מנת להתחיל אימות WebAuthn דו-שלבי. לחץ על הכפתור למטה כדי לפתוח כרטיסייה חדשה ועקוב אחר ההוראות המסופקת בכרטיסייה החדשה." }, "webAuthnNewTabOpen": { - "message": "פתיחת לשונית חדשה" + "message": "פתח כרטיסייה חדשה" }, "webAuthnAuthenticate": { - "message": "Authenticate WebAuthn" + "message": "אמת WebAuthn" }, "loginUnavailable": { - "message": "פרטי כניסה לא זמינים" + "message": "כניסה לא זמינה" }, "noTwoStepProviders": { - "message": "כניסה דו-שלבית פעילה בחשבון זה, אך אף אחד מספקי הכניסה הדו-שלבית לא נתמכים בדפדפן זה." + "message": "לחשבון זה מוגדרת כניסה דו-שלבית, עם זאת, אף אחד מהספקים הדו-שלביים המוגדרים אינו נתמך על ידי דפדפן זה." }, "noTwoStepProviders2": { "message": "אנא השתמש בדפדפן נתמך (כמו לדוגמא Chrome) ו\\או הוסף ספק כניסה דו-שלבית הנתמך בדפדפן זה (כמו לדוגמא אפליקצית אימות)." }, "twoStepOptions": { - "message": "אפשרויות כניסה דו שלבית" + "message": "אפשרויות כניסה דו-שלבית" }, "recoveryCodeDesc": { - "message": "איבדת גישה לכל ספקי האימות הדו-שלבי שלך? השתמש בקוד השחזור בכדי לבטל את כל ספקי האימות הדו-שלבי דרך החשבון שלך." + "message": "איבדת גישה לכל הספקים הדו-שלביים שלך? השתמש בקוד השחזור שלך בכדי לבטל את כל ספקי האימות הדו-שלבי מהחשבון שלך." }, "recoveryCodeTitle": { "message": "קוד שחזור" }, "authenticatorAppTitle": { - "message": "אפליקציית אימות" + "message": "יישום מאמת" }, "authenticatorAppDescV2": { - "message": "Enter a code generated by an authenticator app like Bitwarden Authenticator.", + "message": "הזן קוד שנוצר על ידי יישום מאמת כמו מאמת Bitwarden.", "description": "'Bitwarden Authenticator' is a product name and should not be translated." }, "yubiKeyTitleV2": { - "message": "Yubico OTP Security Key" + "message": "מפתח אבטחה OTP של YubiKey" }, "yubiKeyDesc": { "message": "השתמש בYubiKey עבור גישה לחשבון שלך. עובד עם YubiKey בגירסאות 4, 4C, 4Nano, ומכשירי NEO." }, "duoDescV2": { - "message": "Enter a code generated by Duo Security.", + "message": "הזן קוד שנוצר על ידי Duo Security.", "description": "'Duo Security' and 'Duo Mobile' are product names and should not be translated." }, "duoOrganizationDesc": { @@ -1422,28 +1422,28 @@ "message": "FIDO2 WebAuthn" }, "webAuthnDesc": { - "message": "Use any WebAuthn compatible security key to access your account." + "message": "השתמש בכל מפתח אבטחה תואם WebAuthn כדי לגשת לחשבונך." }, "emailTitle": { "message": "אימייל" }, "emailDescV2": { - "message": "Enter a code sent to your email." + "message": "הזן קוד שנשלח לדוא\"ל שלך." }, "selfHostedEnvironment": { - "message": "סביבה על שרתים מקומיים" + "message": "סביבה באירוח עצמי" }, "selfHostedEnvironmentFooter": { "message": "הזן את כתובת השרת המקומי של Bitwarden." }, "selfHostedBaseUrlHint": { - "message": "Specify the base URL of your on-premises hosted Bitwarden installation. Example: https://bitwarden.company.com" + "message": "ציין את בסיס ה־URL של התקנת Bitwarden באירוח מקומי שלך. דוגמה: https://bitwarden.company.com" }, "selfHostedCustomEnvHeader": { - "message": "For advanced configuration, you can specify the base URL of each service independently." + "message": "עבור תצורות מתקדמות, באפשרותך לציין את בסיס ה־URL של כל שירות בנפרד." }, "selfHostedEnvFormInvalid": { - "message": "You must add either the base Server URL or at least one custom environment." + "message": "אתה מוכרח להוסיף או את בסיס ה־URL של השרת או לפחות סביבה מותאמת אישית אחת." }, "customEnvironment": { "message": "סביבה מותאמת אישית" @@ -1455,102 +1455,102 @@ "message": "כתובת שרת" }, "selfHostBaseUrl": { - "message": "Self-host server URL", + "message": "URL שרת אירוח עצמי", "description": "Label for field requesting a self-hosted integration service URL" }, "apiUrl": { - "message": "כתובת שרת הAPI" + "message": "URL של שרת ה־API" }, "webVaultUrl": { - "message": "כתובת שרת הכספת" + "message": "URL של שרת כספת הרשת" }, "identityUrl": { - "message": "כתובת שרת הזהות" + "message": "URL של שרת הזהות" }, "notificationsUrl": { - "message": "כתובת שרת הודעות" + "message": "URL של שרת ההודעות" }, "iconsUrl": { - "message": "כתובת שרת אייקונים" + "message": "URL של שרת הסמלים" }, "environmentSaved": { - "message": "כתובות הסביבה נשמרו." + "message": "URL־ים של הסביבה נשמרו" }, "showAutoFillMenuOnFormFields": { - "message": "Show autofill menu on form fields", + "message": "הצג תפריט מילוי אוטומטי על שדות טופס", "description": "Represents the message for allowing the user to enable the autofill overlay" }, "autofillSuggestionsSectionTitle": { - "message": "Autofill suggestions" + "message": "הצעות למילוי אוטומטי" }, "showInlineMenuLabel": { - "message": "Show autofill suggestions on form fields" + "message": "הצג הצעות למילוי אוטומטי על שדות טופס" }, "showInlineMenuIdentitiesLabel": { - "message": "Display identities as suggestions" + "message": "הצג זהויות כהצעות" }, "showInlineMenuCardsLabel": { - "message": "Display cards as suggestions" + "message": "הצג כרטיסים כהצעות" }, "showInlineMenuOnIconSelectionLabel": { - "message": "Display suggestions when icon is selected" + "message": "הצג הצעות כאשר נבחר סמל" }, "showInlineMenuOnFormFieldsDescAlt": { - "message": "Applies to all logged in accounts." + "message": "חל על כל החשבונות המחוברים." }, "turnOffBrowserBuiltInPasswordManagerSettings": { - "message": "Turn off your browser's built in password manager settings to avoid conflicts." + "message": "כבה את הגדרות מנהל הסיסמאות המובנה של הדפדפן שלך כדי להימנע מקונפליקטים." }, "turnOffBrowserBuiltInPasswordManagerSettingsLink": { - "message": "Edit browser settings." + "message": "ערוך הגדרות דפדפן." }, "autofillOverlayVisibilityOff": { - "message": "Off", + "message": "כבוי", "description": "Overlay setting select option for disabling autofill overlay" }, "autofillOverlayVisibilityOnFieldFocus": { - "message": "When field is selected (on focus)", + "message": "כאשר נבחר שדה (בפוקוס)", "description": "Overlay appearance select option for showing the field on focus of the input element" }, "autofillOverlayVisibilityOnButtonClick": { - "message": "When autofill icon is selected", + "message": "כאשר נבחר סמל מילוי אוטומטי", "description": "Overlay appearance select option for showing the field on click of the overlay icon" }, "enableAutoFillOnPageLoadSectionTitle": { - "message": "Autofill on page load" + "message": "מילוי אוטומטי בעת טעינת עמוד" }, "enableAutoFillOnPageLoad": { - "message": "הפעל השלמה אוטומטית בזמן טעינת העמוד" + "message": "מילוי אוטומטי בעת טעינת עמוד" }, "enableAutoFillOnPageLoadDesc": { - "message": "אם זוהה טופס כניסה, בצע אוטומטית מילוי-אוטומטי כשהעמוד נטען." + "message": "אם זוהה טופס כניסה, בצע מילוי אוטומטי כשהעמוד נטען." }, "experimentalFeature": { - "message": "Compromised or untrusted websites can exploit autofill on page load." + "message": "אתרים פרוצים או לא מהימנים יכולים לנצל מילוי אוטומטי בעת טעינת עמוד." }, "learnMoreAboutAutofillOnPageLoadLinkText": { - "message": "Learn more about risks" + "message": "למד עוד על סיכונים" }, "learnMoreAboutAutofill": { - "message": "Learn more about autofill" + "message": "למד עוד על מילוי אוטומטי" }, "defaultAutoFillOnPageLoad": { - "message": "הגדרת ברירת מחדל למילוי אוטומטי של פרטי התחברות" + "message": "הגדרת ברירת המחדל של מילוי אוטומטי לפריטי כניסה" }, "defaultAutoFillOnPageLoadDesc": { - "message": "לאחר הפעלת מילוי אוטומטי של פרטים בעת טעינת דפים, אפשר להפעיל או לכבות את האפשרות לפרטי התחברות ספציפיים. זו הגדרת ברירת המחדל לפרטי התחברות שלא הוגדרו בנפרד." + "message": "אתה יכול לכבות מילוי אוטומטי בעת טעינת עמוד עבור פריטי כניסה בודדים מתצוגת העריכה של הפריט." }, "itemAutoFillOnPageLoad": { - "message": "מילוי אוטומטי בעת טעינת דפים (אם מופעל בהגדרות)" + "message": "מילוי אוטומטי בעת טעינת עמוד (אם מוגדר באפשרויות)" }, "autoFillOnPageLoadUseDefault": { - "message": "שימוש בהגדרות ברירת המחדל" + "message": "השתמש בהגדרת ברירת המחדל" }, "autoFillOnPageLoadYes": { - "message": "מילוי אוטומטי אחרי טעינת דפים" + "message": "מילוי אוטומטי בעת טעינת עמוד" }, "autoFillOnPageLoadNo": { - "message": "Do not autofill on page load" + "message": "אל תמלא אוטומטית בעת טעינת עמוד" }, "commandOpenPopup": { "message": "פתיחת כספת בחלונית צפה" @@ -1559,13 +1559,13 @@ "message": "פתיחת כספת בסרגל צד" }, "commandAutofillLoginDesc": { - "message": "Autofill the last used login for the current website" + "message": "מלא אוטומטית את הכניסה האחרונה בה השתמשת עבור האתר הנוכחי" }, "commandAutofillCardDesc": { - "message": "Autofill the last used card for the current website" + "message": "מלא אוטומטית את הכרטיס האחרון בו השתמשת עבור האתר הנוכחי" }, "commandAutofillIdentityDesc": { - "message": "Autofill the last used identity for the current website" + "message": "מלא אוטומטית את הזהות האחרונה בה השתמשת עבור האתר הנוכחי" }, "commandGeneratePasswordDesc": { "message": "צור והעתק סיסמה רנדומלית חדשה." @@ -1598,7 +1598,7 @@ "message": "אמת או שקר" }, "cfTypeCheckbox": { - "message": "Checkbox" + "message": "תיבת סימון" }, "cfTypeLinked": { "message": "מקושר", @@ -1615,19 +1615,19 @@ "message": "דפדפן זה לא יכול לעבד בקשות U2F בחלון צף זה. האם ברצונך לפתוח את החלון הצף כחלון חדש רגיל כדי שתוכל להכנס באמצעות U2F?" }, "enableFavicon": { - "message": "Show website icons" + "message": "הצג סמלים של אתרי אינטרנט" }, "faviconDesc": { - "message": "Show a recognizable image next to each login." + "message": "הצג תמונה ניתנת לזיהוי ליד כל כניסה." }, "faviconDescAlt": { - "message": "Show a recognizable image next to each login. Applies to all logged in accounts." + "message": "הצג תמונה ניתנת לזיהוי ליד כל כניסה. חל על כל החשבונות המחוברים." }, "enableBadgeCounter": { - "message": "Show badge counter" + "message": "הצג מונה סמל" }, "badgeCounterDesc": { - "message": "Indicate how many logins you have for the current web page." + "message": "מציין כמה כניסות יש לך עבור דף הרשת הנוכחי." }, "cardholderName": { "message": "שם בעל הכרטיס" @@ -1639,10 +1639,10 @@ "message": "מותג" }, "expirationMonth": { - "message": "תוקף אשראי - חודש" + "message": "חודש תפוגה" }, "expirationYear": { - "message": "תוקף אשראי - שנה" + "message": "שנת תפוגה" }, "expiration": { "message": "תוקף" @@ -1705,7 +1705,7 @@ "message": "דוקטור" }, "mx": { - "message": "Mx" + "message": "מיקס" }, "firstName": { "message": "שם פרטי" @@ -1726,13 +1726,13 @@ "message": "חברה" }, "ssn": { - "message": "מספר ביטוח לאומי" + "message": "מספר תעודת זהות" }, "passportNumber": { "message": "מספר דרכון" }, "licenseNumber": { - "message": "מספר רשיון" + "message": "מספר רישיון" }, "email": { "message": "אימייל" @@ -1783,10 +1783,10 @@ "message": "זהות" }, "typeSshKey": { - "message": "SSH key" + "message": "מפתח SSH" }, "newItemHeader": { - "message": "New $TYPE$", + "message": "$TYPE$ חדש", "placeholders": { "type": { "content": "$1", @@ -1795,7 +1795,7 @@ } }, "editItemHeader": { - "message": "Edit $TYPE$", + "message": "ערוך $TYPE$", "placeholders": { "type": { "content": "$1", @@ -1804,7 +1804,7 @@ } }, "viewItemHeader": { - "message": "View $TYPE$", + "message": "הצג $TYPE$", "placeholders": { "type": { "content": "$1", @@ -1816,13 +1816,13 @@ "message": "היסטוריית סיסמאות" }, "generatorHistory": { - "message": "Generator history" + "message": "היסטוריית מחולל" }, "clearGeneratorHistoryTitle": { - "message": "Clear generator history" + "message": "נקה היסטוריית מחולל" }, "cleargGeneratorHistoryDescription": { - "message": "If you continue, all entries will be permanently deleted from generator's history. Are you sure you want to continue?" + "message": "אם תמשיך, כל הרשומות יימחקו מהיסטוריית המחולל. האם אתה בטוח שברצונך להמשיך?" }, "back": { "message": "הקודם" @@ -1831,7 +1831,7 @@ "message": "אוספים" }, "nCollections": { - "message": "$COUNT$ collections", + "message": "$COUNT$ אוספים", "placeholders": { "count": { "content": "$1", @@ -1858,10 +1858,10 @@ "message": "פרטי התחברות" }, "secureNotes": { - "message": "פתקים מאובטחים" + "message": "הערות מאובטחות" }, "sshKeys": { - "message": "SSH Keys" + "message": "מפתחות SSH" }, "clear": { "message": "נקה", @@ -1887,11 +1887,11 @@ "description": "Domain name. Ex. website.com" }, "baseDomainOptionRecommended": { - "message": "Base domain (recommended)", + "message": "בסיס דומיין (מומלץ)", "description": "Domain name. Ex. website.com" }, "domainName": { - "message": "שם תחום", + "message": "שם דומיין", "description": "Domain name. Ex. website.com" }, "host": { @@ -1941,13 +1941,13 @@ "message": "אין סיסמאות להצגה ברשימה." }, "clearHistory": { - "message": "Clear history" + "message": "נקה היסטוריה" }, "nothingToShow": { - "message": "Nothing to show" + "message": "אין מה להראות" }, "nothingGeneratedRecently": { - "message": "You haven't generated anything recently" + "message": "לא חוללת כלום לאחרונה" }, "remove": { "message": "הסר" @@ -1960,7 +1960,7 @@ "description": "ex. Date this item was updated" }, "dateCreated": { - "message": "Created", + "message": "נוצר", "description": "ex. Date this item was created" }, "datePasswordUpdated": { @@ -2008,16 +2008,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." + "message": "ה־PIN שלך ישמש לביטול נעילת Bitwarden במקום הסיסמה הראשית שלך. ה־PIN שלך יאופס אם אי פעם תצא באופן מלא מ־Bitwarden." }, "pinRequired": { "message": "נדרש קוד PIN." @@ -2026,25 +2026,25 @@ "message": "קוד PIN לא תקין." }, "tooManyInvalidPinEntryAttemptsLoggingOut": { - "message": "Too many invalid PIN entry attempts. Logging out." + "message": "יותר מדי ניסיונות פסולים להזנת PIN. מתנתק." }, "unlockWithBiometrics": { "message": "פתח נעילה עם זיהוי ביומטרי" }, "unlockWithMasterPassword": { - "message": "Unlock with master password" + "message": "בטל נעילה עם סיסמה ראשית" }, "awaitDesktop": { "message": "ממתין לאישור משולחן העבודה" }, "awaitDesktopDesc": { - "message": "אנא אשר בעזרת אמצעים ביומטרים באפליקציית Bitwarden של שולחן העבודה בכדי לאפשר אמצעים ביומטריים בדפדפן." + "message": "אנא אשר באמצעות זיהוי ביומטרי ביישום Bitwarden של שולחן העבודה בכדי להגדיר זיהוי ביומטרי עבור דפדפן." }, "lockWithMasterPassOnRestart": { "message": "נעל בעזרת הסיסמה הראשית בהפעלת הדפדפן מחדש" }, "lockWithMasterPassOnRestart1": { - "message": "Require master password on browser restart" + "message": "דרוש סיסמה ראשית בעת הפעלה מחדש של הדפדפן" }, "selectOneCollection": { "message": "עליך לבחור לפחות אוסף אחד." @@ -2056,36 +2056,36 @@ "message": "שכפול" }, "passwordGenerator": { - "message": "Password generator" + "message": "מחולל סיסמאות" }, "usernameGenerator": { - "message": "Username generator" + "message": "מחולל שם משתמש" }, "useThisEmail": { - "message": "Use this email" + "message": "השתמש בדוא\"ל זה" }, "useThisPassword": { - "message": "Use this password" + "message": "השתמש בסיסמה זו" }, "useThisUsername": { - "message": "Use this username" + "message": "השתמש בשם משתמש זה" }, "securePasswordGenerated": { - "message": "Secure password generated! Don't forget to also update your password on the website." + "message": "סיסמה מאובטחת נוצרה! אל תשכח גם לעדכן את הסיסמה שלך באתר האינטרנט." }, "useGeneratorHelpTextPartOne": { - "message": "Use the generator", + "message": "השתמש במחולל", "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": "כדי ליצור סיסמה חזקה וייחודית", "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'" }, "vaultTimeoutAction": { - "message": "פעולה לביצוע בכספת בתום זמן החיבור" + "message": "פעולת פסק זמן כספת" }, "vaultTimeoutAction1": { - "message": "Timeout action" + "message": "פעולת פסק זמן" }, "lock": { "message": "נעילה", @@ -2099,52 +2099,52 @@ "message": "חפש בסל המחזור" }, "permanentlyDeleteItem": { - "message": "מחק לצמיתות פריט שנבחר" + "message": "מחק פריט לצמיתות" }, "permanentlyDeleteItemConfirmation": { "message": "האם אתה בטוח שברצונך למחוק את הפריט הזה?" }, "permanentlyDeletedItem": { - "message": "פריט שנמחק לצמיתות" + "message": "הפריט נמחק לצמיתות" }, "restoreItem": { "message": "שחזר פריט" }, "restoredItem": { - "message": "פריט ששוחזר" + "message": "הפריט שוחזר" }, "alreadyHaveAccount": { - "message": "Already have an account?" + "message": "כבר יש לך חשבון?" }, "vaultTimeoutLogOutConfirmation": { "message": "יציאה מהחשבון תסיר את כל הגישה לכספת ויידרש אימות מקוון לאחר משך הזמן שהוקצב. האם אתה בטוח שברצונך להשתמש בהגדרה זו?" }, "vaultTimeoutLogOutConfirmationTitle": { - "message": "אישור פעולת אימות לאחר חוסר פעילות" + "message": "אישור פעולת פסק זמן" }, "autoFillAndSave": { - "message": "בצע השלמה אוטומטית ושמור" + "message": "מלא אוטומטית ושמור" }, "fillAndSave": { - "message": "Fill and save" + "message": "מלא ושמור" }, "autoFillSuccessAndSavedUri": { - "message": "בוצעה השלמה אוטומטית והכתובת נשמרה" + "message": "פריט התמלא אוטומטית וה־URI נשמר" }, "autoFillSuccess": { - "message": "בוצעה השלמה אוטומטית" + "message": "פריט התמלא אוטומטית " }, "insecurePageWarning": { - "message": "Warning: This is an unsecured HTTP page, and any information you submit can potentially be seen and changed by others. This Login was originally saved on a secure (HTTPS) page." + "message": "אזהרה: זהו דף HTTP לא מאובטח, וכל מידע שאתה שולח יכול באופן פוטנציאלי להיראות ולהשתנות על ידי אחרים. הכניסה הזאת נשמרה במקור בדף מאובטח (HTTPS)." }, "insecurePageWarningFillPrompt": { - "message": "Do you still wish to fill this login?" + "message": "האם עדיין ברצונך להשלים כניסה זו?" }, "autofillIframeWarning": { - "message": "The form is hosted by a different domain than the URI of your saved login. Choose OK to autofill anyway, or Cancel to stop." + "message": "הטופס מאורח על ידי דומיין שונה מה־URI של הכניסה השמורה שלך. בחר \"בסדר\" כדי להשלים אוטומטית בכל זאת, או \"ביטול\" כדי לעצור." }, "autofillIframeWarningTip": { - "message": "To prevent this warning in the future, save this URI, $HOSTNAME$, to your Bitwarden login item for this site.", + "message": "כדי למנוע אזהרה זו בעתיד, שמור את URI זה, $HOSTNAME$, בפריט כניסת Bitwarden שלך עבור אתר זה.", "placeholders": { "hostname": { "content": "$1", @@ -2156,13 +2156,13 @@ "message": "הגדר סיסמה ראשית" }, "currentMasterPass": { - "message": "Current master password" + "message": "סיסמה ראשית נוכחית" }, "newMasterPass": { - "message": "New master password" + "message": "סיסמה ראשית חדשה" }, "confirmNewMasterPass": { - "message": "Confirm new master password" + "message": "אמת סיסמה ראשית חדשה" }, "masterPasswordPolicyInEffect": { "message": "אחד או יותר מאילוצי המדיניות של הארגון דורשים שהסיסמה הראשית שלך תעמוד בדרישות הבאות:" @@ -2207,25 +2207,25 @@ "message": "הסיסמה הראשית החדשה השלך לא עומדת בדרישות המדיניות." }, "receiveMarketingEmailsV2": { - "message": "Get advice, announcements, and research opportunities from Bitwarden in your inbox." + "message": "קבל עצות, הכרזות, והזדמנויות מחקר מאת Bitwarden בדואר הנכנס שלך." }, "unsubscribe": { - "message": "Unsubscribe" + "message": "בטל הרשמה" }, "atAnyTime": { - "message": "at any time." + "message": "בכל זמן." }, "byContinuingYouAgreeToThe": { - "message": "By continuing, you agree to the" + "message": "על ידי המשך אתה מסכים ל" }, "and": { - "message": "and" + "message": "ו" }, "acceptPolicies": { "message": "סימון תיבה זו מהווה את הסכמתך לתנאים הבאים:" }, "acceptPoliciesRequired": { - "message": "Terms of Service and Privacy Policy have not been acknowledged." + "message": "תנאי השימוש ומדיניות הפרטיות לא הוכרו." }, "termsOfService": { "message": "תנאי השירות" @@ -2240,10 +2240,10 @@ "message": "אישור" }, "errorRefreshingAccessToken": { - "message": "Access Token Refresh Error" + "message": "שגיאת רענון אסימון גישה" }, "errorRefreshingAccessTokenDesc": { - "message": "No refresh token or API keys found. Please try logging out and logging back in." + "message": "לא נמצאו אסימון רענון או מפתחות API. נא לנסות לצאת ולהיכנס חזרה." }, "desktopSyncVerificationTitle": { "message": "אימות סנכרון מול שולחן העבודה" @@ -2252,19 +2252,19 @@ "message": "אנא ודא כי אפליקציית שולחן העבודה שלך מציגה את טביעת האצבע הזו: " }, "desktopIntegrationDisabledTitle": { - "message": "אינטגרציית הדפדפן לא מופעלת" + "message": "שילוב הדפדפן אינו מוגדר" }, "desktopIntegrationDisabledDesc": { - "message": "אינטגרציית הדפדפן לא מופעלת באפליקציית Bitwarden בשולחן העבודה. אנא אפשר זאת בהגדרות האפליקציה." + "message": "שילוב הדפדפן אינו מוגדר ביישום Bitwarden של שולחן העבודה. אנא הגדר אותו בהגדרות שבתוך יישום שולחן העבודה." }, "startDesktopTitle": { - "message": "הפעל את אפליקציית Bitwarden בשולחן העבודה" + "message": "הפעל את יישום Bitwarden של שולחן העבודה" }, "startDesktopDesc": { - "message": "יש להפעיל את אפליקציית Bitwarden בשולחן העבודה בכדי להשתמש בפונקציה זו." + "message": "היישום Bitwarden של שולחן העבודה צריך להיות מופעל לפני שניתן לבטל נעילה עם זיהוי ביומטרי." }, "errorEnableBiometricTitle": { - "message": "לא ניתן להפעיל זיהוי ביומטרי" + "message": "לא ניתן להגדיר זיהוי ביומטרי" }, "errorEnableBiometricDesc": { "message": "הפעולה בוטלה על ידי אפליקציית שולחן העבודה" @@ -2282,16 +2282,16 @@ "message": "חוסר התאמה בין חשבונות" }, "nativeMessagingWrongUserKeyTitle": { - "message": "Biometric key missmatch" + "message": "אי-התאמה של מפתח זיהוי ביומטרי" }, "nativeMessagingWrongUserKeyDesc": { - "message": "Biometric unlock failed. The biometric secret key failed to unlock the vault. Please try to set up biometrics again." + "message": "ביטול נעילה ביומטרי נכשל. מפתח הסוד הביומטרי נכשל בביטול נעילת הכספת. נא לנסות להגדיר זיהוי ביומטרי שוב." }, "biometricsNotEnabledTitle": { - "message": "אמצעי זיהוי ביומטרים לא מאופשרים" + "message": "זיהוי ביומטרי אינו מוגדר" }, "biometricsNotEnabledDesc": { - "message": "בכדי להשתמש באמצעים ביומטרים בדפדפן יש לאפשר תכונה זו באפליקציה בשולחן העבודה." + "message": "זיהוי ביומטרי בדפדפן דורש שזיהוי ביומטרי בשולחן העבודה יהיה מוגדר בהגדרות קודם." }, "biometricsNotSupportedTitle": { "message": "אמצעי זיהוי ביומטרים לא נתמכים" @@ -2300,22 +2300,22 @@ "message": "מכשיר זה לא תומך בזיהוי ביומטרי בדפדפן." }, "biometricsNotUnlockedTitle": { - "message": "User locked or logged out" + "message": "משתמש נעול או מנותק" }, "biometricsNotUnlockedDesc": { - "message": "Please unlock this user in the desktop application and try again." + "message": "נא לבטל נעילת משתמש זה ביישום שולחן העבודה ולנסות שוב." }, "biometricsNotAvailableTitle": { - "message": "Biometric unlock unavailable" + "message": "ביטול נעילה ביומטרי לא זמין" }, "biometricsNotAvailableDesc": { - "message": "Biometric unlock is currently unavailable. Please try again later." + "message": "ביטול נעילה ביומטרי לא זמין כרגע. נא לנסות שוב מאוחר יותר." }, "biometricsFailedTitle": { - "message": "Biometrics failed" + "message": "זיהוי ביומטרי נכשל" }, "biometricsFailedDesc": { - "message": "Biometrics cannot be completed, consider using a master password or logging out. If this persists, please contact Bitwarden support." + "message": "לא ניתן להשלים זיהוי ביומטרי, שקול להשתמש במפתח ראשי או להתנתק. אם הדבר נמשך, אנא צור קשר עם תמיכת Bitwarden." }, "nativeMessaginPermissionErrorTitle": { "message": "הרשאה לא סופקה" @@ -2324,47 +2324,111 @@ "message": "ללא הרשאות לתקשר עם אפליקציית שולחן העבודה אין באפשרותנו לספק תמיכה באמצעים ביומטריים בדפדפן. אנא נסה שוב." }, "nativeMessaginPermissionSidebarTitle": { - "message": "Permission request error" + "message": "שגיאת בקשת הרשאה" }, "nativeMessaginPermissionSidebarDesc": { - "message": "This action cannot be done in the sidebar, please retry the action in the popup or popout." + "message": "לא ניתן לבצע את הפעולה בסרגל הצד, נא לנסות שוב את הפעולה בחלון המוקפץ או המנותק." }, "personalOwnershipSubmitError": { - "message": "מדיניות הארגון מונעת ממך לשמור פריטים בכספת האישית. שנה את אפשרות הבעלות לארגוניות ובחר מתוך האוספים הזמינים." + "message": "בשל שגיאה ארגונית, אתה מוגבל מלשמור פריטים לכספת האישית שלך. שנה את אפשרות הבעלות לארגון ובחר מאוספים זמינים." }, "personalOwnershipPolicyInEffect": { "message": "מדיניות ארגונית משפיעה על אפשרויות הבעלות שלך." }, "personalOwnershipPolicyInEffectImports": { - "message": "An organization policy has blocked importing items into your individual vault." + "message": "פוליסת ארגון חסמה ייבוא פריטים אל תוך הכספת האישית שלך." }, "domainsTitle": { - "message": "Domains", + "message": "דומיינים", "description": "A category title describing the concept of web domains" }, "blockedDomains": { - "message": "Blocked domains" + "message": "דומיינים חסומים" }, "excludedDomains": { - "message": "Excluded domains" + "message": "דומיינים מוחרגים" }, "excludedDomainsDesc": { - "message": "Bitwarden will not ask to save login details for these domains. You must refresh the page for changes to take effect." + "message": "Bitwarden לא יבקש לשמור פרטי כניסה עבור הדומיינים האלה. אתה מוכרח לרענן את העמוד כדי שהשינויים ייכנסו לתוקף." }, "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 לא יבקש לשמור פרטי כניסה עבור הדומיינים האלה עבור כל החשבונות המחוברים. אתה מוכרח לרענן את העמוד כדי שהשינויים ייכנסו לתוקף." }, "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": "לא יוצעו מילוי אוטומטי ותכונות קשורות אחרות עבור האתרים האלה. אתה מוכרח לרענן את הדף כדי שהשינויים ייכנסו לתוקף." }, "autofillBlockedNoticeV2": { - "message": "Autofill is blocked for this website." + "message": "מילוי אוטומטי חסום עבור אתר זה." }, "autofillBlockedNoticeGuidance": { - "message": "Change this in settings" + "message": "שנה זאת בהגדרות" + }, + "change": { + "message": "שינוי" + }, + "changeButtonTitle": { + "message": "שנה סיסמה - $ITEMNAME$", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "atRiskPasswords": { + "message": "סיסמאות בסכנה" + }, + "atRiskPasswordsDescSingleOrg": { + "message": "$ORGANIZATION$ מבקש/ת שתשנה $COUNT$ סיסמאות בגלל שהן בסכנה.", + "placeholders": { + "organization": { + "content": "$1", + "example": "Acme Corp" + }, + "count": { + "content": "$2", + "example": "2" + } + } + }, + "atRiskPasswordsDescMultiOrg": { + "message": "הארגונים שלך מבקשים שתשנה $COUNT$ סיסמאות בגלל שהן בסכנה.", + "placeholders": { + "count": { + "content": "$1", + "example": "2" + } + } + }, + "reviewAndChangeAtRiskPassword": { + "message": "סקור ושנה סיסמה אחת בסכנה" + }, + "reviewAndChangeAtRiskPasswordsPlural": { + "message": "סקור ושנה $COUNT$ סיסמאות בסכנה", + "placeholders": { + "count": { + "content": "$1", + "example": "2" + } + } + }, + "changeAtRiskPasswordsFaster": { + "message": "שנה סיסמאות בסכנה מהר יותר" + }, + "changeAtRiskPasswordsFasterDesc": { + "message": "עדכן את ההגדרות שלך כך שתוכל למלא במהירות את הסיסמאות שלך וליצור חדשות" + }, + "turnOnAutofill": { + "message": "הפעל השלמה אוטומטית" + }, + "turnedOnAutofill": { + "message": "השלמה אוטומטית הופעלה" + }, + "dismiss": { + "message": "התעלם" }, "websiteItemLabel": { - "message": "Website $number$ (URI)", + "message": "אתר אינטרנט $number$ (URI)", "placeholders": { "number": { "content": "$1", @@ -2373,7 +2437,7 @@ } }, "excludedDomainsInvalidDomain": { - "message": "$DOMAIN$ is not a valid domain", + "message": "$DOMAIN$ אינו דומיין חוקי", "placeholders": { "domain": { "content": "$1", @@ -2382,20 +2446,20 @@ } }, "blockedDomainsSavedSuccess": { - "message": "Blocked domain changes saved" + "message": "שינויי דומיין חסום נשמרו" }, "excludedDomainsSavedSuccess": { - "message": "Excluded domain changes saved" + "message": "שינויי דומיין מוחרג נשמרו" }, "limitSendViews": { - "message": "Limit views" + "message": "הגבל צפיות" }, "limitSendViewsHint": { - "message": "No one can view this Send after the limit is reached.", + "message": "אף אחד לא יכול לצפות בסנד זה לאחר ההגעה למגבלה.", "description": "Displayed under the limit views field on Send" }, "limitSendViewsCount": { - "message": "$ACCESSCOUNT$ views left", + "message": "$ACCESSCOUNT$ צפיות נותרו", "description": "Displayed under the limit views field on Send", "placeholders": { "accessCount": { @@ -2405,93 +2469,93 @@ } }, "send": { - "message": "Send", + "message": "שליחה", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendDetails": { - "message": "Send details", + "message": "פרטי סנד", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendTypeText": { - "message": "Text" + "message": "טקסט" }, "sendTypeTextToShare": { - "message": "Text to share" + "message": "טקסט לשיתוף" }, "sendTypeFile": { - "message": "File" + "message": "קובץ" }, "allSends": { - "message": "All Sends", + "message": "כל הסנדים", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "hideTextByDefault": { - "message": "Hide text by default" + "message": "הסתר טקסט כברירת מחדל" }, "expired": { - "message": "Expired" + "message": "פג תוקף" }, "passwordProtected": { - "message": "Password protected" + "message": "מוגן סיסמה" }, "copyLink": { - "message": "Copy link" + "message": "העתק קישור" }, "copySendLink": { - "message": "Copy Send link", + "message": "העתק קישור סנד", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "removePassword": { - "message": "Remove Password" + "message": "הסר סיסמה" }, "delete": { - "message": "Delete" + "message": "מחק" }, "removedPassword": { - "message": "Password removed" + "message": "סיסמה הוסרה" }, "deletedSend": { - "message": "Send deleted", + "message": "סנד נמחק", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendLink": { - "message": "Send link", + "message": "שלח קישור", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "disabled": { - "message": "Disabled" + "message": "מושבת" }, "removePasswordConfirmation": { - "message": "Are you sure you want to remove the password?" + "message": "האם אתה בטוח שברצונך להסיר את הסיסמה?" }, "deleteSend": { - "message": "Delete Send", + "message": "מחק סנד", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "deleteSendConfirmation": { - "message": "Are you sure you want to delete this Send?", + "message": "האם אתה בטוח שברצונך למחוק סנד זה?", "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": "האם אתה בטוח שברצונך למחוק לצמיתות סנד זה?", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "editSend": { - "message": "Edit Send", + "message": "ערוך סנד", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "deletionDate": { "message": "תאריך מחיקה" }, "deletionDateDescV2": { - "message": "The Send will be permanently deleted on this date.", + "message": "סנד זה יימחק לצמיתות בתאריך זה.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "expirationDate": { "message": "תאריך תפוגה" }, "oneDay": { - "message": "יום אחד" + "message": "יום 1" }, "days": { "message": "$DAYS$ ימים", @@ -2506,38 +2570,38 @@ "message": "מותאם אישית" }, "sendPasswordDescV3": { - "message": "Add an optional password for recipients to access this Send.", + "message": "הוסף סיסמה אופציונלית עבור נמענים כדי לגשת לסנד זה.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "createSend": { - "message": "New Send", + "message": "סנד חדש", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "newPassword": { - "message": "New password" + "message": "סיסמה חדשה" }, "sendDisabled": { - "message": "Send removed", + "message": "סנד הוסר", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendDisabledWarning": { - "message": "Due to an enterprise policy, you are only able to delete an existing Send.", + "message": "בשל מדיניות ארגונית, אתה רק יכול למחוק את הסנד הנוכחי.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "createdSend": { - "message": "Send created", + "message": "סנד נוצר", "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": "סנד נוצר בהצלחה!", "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": "הסנד יהיה זמין לכל אחד עם הקישור במשך השעה הבאה.", "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": "הסנד יהיה זמין לכל אחד עם הקישור במשך $HOURS$ השעות הבאות.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated.", "placeholders": { "hours": { @@ -2547,11 +2611,11 @@ } }, "sendExpiresInDaysSingle": { - "message": "The Send will be available to anyone with the link for the next 1 day.", + "message": "הסנד יהיה זמין לכל אחד עם הקישור במשך היום הבא.", "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": "הסנד יהיה זמין לכל אחד עם הקישור במשך $DAYS$ הימים הבאים.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated.", "placeholders": { "days": { @@ -2561,98 +2625,98 @@ } }, "sendLinkCopied": { - "message": "Send link copied", + "message": "קישור סנד הועתק", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "editedSend": { - "message": "Send saved", + "message": "סנד נשמר", "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": "לנתק הרחבה?", "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": "כדי ליצור קובץ סנד, אתה צריך לנתק את ההרחבה לחלון חדש.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendLinuxChromiumFileWarning": { - "message": "In order to choose a file, open the extension in the sidebar (if possible) or pop out to a new window by clicking this banner." + "message": "כדי לבחור קובץ, פתח את ההרחבה בסרגל הצד (אם ניתן) או נתק לחלון חדש על ידי לחיצת באנר זה." }, "sendFirefoxFileWarning": { - "message": "In order to choose a file using Firefox, open the extension in the sidebar or pop out to a new window by clicking this banner." + "message": "כדי לבחור קובץ באמצעות Firefox, פתח את ההרחבה בסרגל הצד או נתק לחלון חדש על ידי לחיצת באנר זה." }, "sendSafariFileWarning": { - "message": "In order to choose a file using Safari, pop out to a new window by clicking this banner." + "message": "כדי לבחור קובץ באמצעות Safari, נתק לחלון חדש על ידי לחיצת באנר זה." }, "popOut": { - "message": "Pop out" + "message": "נתק" }, "sendFileCalloutHeader": { - "message": "Before you start" + "message": "לפני שאתה מתחיל" }, "expirationDateIsInvalid": { - "message": "The expiration date provided is not valid." + "message": "תאריך התפוגה שסופק אינו חוקי." }, "deletionDateIsInvalid": { - "message": "The deletion date provided is not valid." + "message": "תאריך המחיקה שסופק אינו חוקי." }, "expirationDateAndTimeRequired": { - "message": "An expiration date and time are required." + "message": "דרושים תאריך תפוגה וזמן." }, "deletionDateAndTimeRequired": { - "message": "A deletion date and time are required." + "message": "דרושים תאריך מחיקה וזמן." }, "dateParsingError": { - "message": "There was an error saving your deletion and expiration dates." + "message": "הייתה שגיאה בשמירת תאריכי המחיקה והתפוגה שלך." }, "hideYourEmail": { - "message": "Hide your email address from viewers." + "message": "הסתר את כתובת הדוא\"ל שלך מצופים." }, "passwordPrompt": { - "message": "Master password re-prompt" + "message": "בקשת סיסמה ראשית חוזרת" }, "passwordConfirmation": { - "message": "Master password confirmation" + "message": "אישור סיסמה ראשית" }, "passwordConfirmationDesc": { - "message": "This action is protected. To continue, please re-enter your master password to verify your identity." + "message": "פעולה זו מוגנת. כדי להמשיך, נא להזין שוב את הסיסמה הראשית שלך כדי לאמת את זהותך." }, "emailVerificationRequired": { - "message": "Email verification required" + "message": "דרוש אימות דוא\"ל" }, "emailVerifiedV2": { - "message": "Email verified" + "message": "דוא\"ל אומת" }, "emailVerificationRequiredDesc": { - "message": "You must verify your email to use this feature. You can verify your email in the web vault." + "message": "עליך לאמת את הדוא\"ל שלך כדי להשתמש בתכונה זו. ניתן לאמת את הדוא\"ל שלך בכספת הרשת." }, "updatedMasterPassword": { - "message": "Updated master password" + "message": "סיסמה ראשית עודכנה" }, "updateMasterPassword": { - "message": "Update master password" + "message": "עדכן סיסמה ראשית" }, "updateMasterPasswordWarning": { - "message": "Your master password was recently changed by an administrator in your organization. In order to access the vault, you must update it now. Proceeding will log you out of your current session, requiring you to log back in. Active sessions on other devices may continue to remain active for up to one hour." + "message": "הסיסמה הראשית שלך שונתה לאחרונה על ידי מנהל הארגון שלך. כדי לגשת לכספת, עליך לעדכן אותה כעת. בהמשך תנותק מההפעלה הנוכחית שלך ותידרש להיכנס חזרה. הפעלות פעילות במכשירים אחרים עלולות להישאר פעילות למשך עד שעה אחת." }, "updateWeakMasterPasswordWarning": { - "message": "Your master password does not meet one or more of your organization policies. In order to access the vault, you must update your master password now. Proceeding will log you out of your current session, requiring you to log back in. Active sessions on other devices may continue to remain active for up to one hour." + "message": "הסיסמה הראשית שלך אינה עומדת באחת או יותר ממדיניות הארגון שלך. כדי לגשת לכספת, אתה מוכרח לעדכן את הסיסמה הראשית שלך עכשיו. בהמשך תנותק מההפעלה הנוכחית שלך ותידרש להיכנס חזרה. הפעלות פעילות במכשירים אחרים עלולות להישאר פעילות למשך עד שעה אחת." }, "tdeDisabledMasterPasswordRequired": { - "message": "Your organization has disabled trusted device encryption. Please set a master password to access your vault." + "message": "הארגון שלך השבית הצפנת מכשיר מהימן. נא להגדיר סיסמה ראשית כדי לגשת לכספת שלך." }, "resetPasswordPolicyAutoEnroll": { - "message": "Automatic enrollment" + "message": "רישום אוטומטי" }, "resetPasswordAutoEnrollInviteWarning": { - "message": "This organization has an enterprise policy that will automatically enroll you in password reset. Enrollment will allow organization administrators to change your master password." + "message": "לארגון זה יש מדיניות ארגונית שתרשום אותך אוטומטי לאיפוס סיסמה. הרישום יאפשר למנהלי הארגון לשנות את הסיסמה הראשית שלך." }, "selectFolder": { - "message": "Select folder..." + "message": "בחר תיקיה..." }, "noFoldersFound": { - "message": "No folders found", + "message": "לא נמצאו תיקיות", "description": "Used as a message within the notification bar when no folders are found" }, "orgPermissionsUpdatedMustSetPassword": { @@ -2664,7 +2728,7 @@ "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": "מתוך $TOTAL$", "placeholders": { "total": { "content": "$1", @@ -2673,20 +2737,20 @@ } }, "verificationRequired": { - "message": "Verification required", + "message": "דרוש אימות", "description": "Default title for the user verification dialog." }, "hours": { - "message": "Hours" + "message": "שעות" }, "minutes": { - "message": "Minutes" + "message": "דקות" }, "vaultTimeoutPolicyAffectingOptions": { - "message": "Enterprise policy requirements have been applied to your timeout options" + "message": "דרישות מדיניות ארגונית הוחלו על אפשרויות פסק הזמן שלך" }, "vaultTimeoutPolicyInEffect": { - "message": "Your organization policies have set your maximum allowed vault timeout to $HOURS$ hour(s) and $MINUTES$ minute(s).", + "message": "מדיניות הארגון שלך הגדירו את פסק זמן הכספת המרבי שלך ל-$HOURS$ שעות ו-$MINUTES$ דקות.", "placeholders": { "hours": { "content": "$1", @@ -2699,7 +2763,7 @@ } }, "vaultTimeoutPolicyInEffect1": { - "message": "$HOURS$ hour(s) and $MINUTES$ minute(s) maximum.", + "message": "$HOURS$ שעות ו-$MINUTES$ דקות לכל היותר.", "placeholders": { "hours": { "content": "$1", @@ -2712,7 +2776,7 @@ } }, "vaultTimeoutPolicyMaximumError": { - "message": "Timeout exceeds the restriction set by your organization: $HOURS$ hour(s) and $MINUTES$ minute(s) maximum", + "message": "פסק זמן חורג את ההגבלה שהוגדרה על ידי הארגון שלך: $HOURS$ שעות ו-$MINUTES$ דקות לכל היותר", "placeholders": { "hours": { "content": "$1", @@ -2725,7 +2789,7 @@ } }, "vaultTimeoutPolicyWithActionInEffect": { - "message": "Your organization policies are affecting your vault timeout. Maximum allowed vault timeout is $HOURS$ hour(s) and $MINUTES$ minute(s). Your vault timeout action is set to $ACTION$.", + "message": "מדיניות הארגון שלך משפיעה על פסק זמן הכספת שלך. פסק הזמן המרבי המותר הוא $HOURS$ שעות ו-$MINUTES$ דקות. פעולת פסק זמן הכספת שלך מוגדרת ל$ACTION$.", "placeholders": { "hours": { "content": "$1", @@ -2742,7 +2806,7 @@ } }, "vaultTimeoutActionPolicyInEffect": { - "message": "Your organization policies have set your vault timeout action to $ACTION$.", + "message": "מדיניות הארגון שלך הגדירה את פעולת פסק זמן הכספת שלך ל$ACTION$.", "placeholders": { "action": { "content": "$1", @@ -2751,22 +2815,22 @@ } }, "vaultTimeoutTooLarge": { - "message": "הזמן הקצוב לכספת שלך חורג מהמגבלות שנקבעו על ידי הארגון שלך." + "message": "פסק הזמן של הכספת שלך חורג מהמגבלות שנקבעו על ידי הארגון שלך." }, "vaultExportDisabled": { - "message": "Vault export unavailable" + "message": "ייצוא כספת לא זמין" }, "personalVaultExportPolicyInEffect": { - "message": "One or more organization policies prevents you from exporting your individual vault." + "message": "מדיניות ארגון אחת או יותר מונעת ממך מלייצא את הכספת האישית שלך." }, "copyCustomFieldNameInvalidElement": { - "message": "Unable to identify a valid form element. Try inspecting the HTML instead." + "message": "לא ניתן לזהות רכיב טופס חוקי. נסה לבדוק את ה־HTML במקום זאת." }, "copyCustomFieldNameNotUnique": { - "message": "No unique identifier found." + "message": "לא נמצא מזהה ייחודי." }, "convertOrganizationEncryptionDesc": { - "message": "$ORGANIZATION$ משתמשים ב־SSO עם שרת מפתחות באירוח עצמי. סיסמה ראשית לא נחוצה יותר לטובת כניסה לחברי הארגון.", + "message": "$ORGANIZATION$ משתמשת ב־SSO עם שרת מפתחות באירוח עצמי. סיסמה ראשית לא דרושה יותר כדי להיכנס עבור חברים של ארגון זה.", "placeholders": { "organization": { "content": "$1", @@ -2775,31 +2839,31 @@ } }, "leaveOrganization": { - "message": "לעזוב את הארגון" + "message": "עזוב ארגון" }, "removeMasterPassword": { - "message": "הסרת סיסמה ראשית" + "message": "הסר סיסמה ראשית" }, "removedMasterPassword": { - "message": "הסיסמה הראשית הוסרה." + "message": "הסיסמה הראשית הוסרה" }, "leaveOrganizationConfirmation": { - "message": "לעזוב את הארגון?" + "message": "אתה בטוח שברצונך לעזוב את הארגון הזה?" }, "leftOrganization": { "message": "עזבת את הארגון." }, "toggleCharacterCount": { - "message": "החלפת מצב ספירת תווים" + "message": "הצג או הסתר מונה תווים" }, "sessionTimeout": { - "message": "Your session has timed out. Please go back and try logging in again." + "message": "תם הזמן הקצוב להפעלה שלך. בבקשה לחזור ולנסות להיכנס שוב." }, "exportingPersonalVaultTitle": { - "message": "הכספת האישית מיוצאת" + "message": "מייצא כספת אישית" }, "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": "רק פריטי הכספת האישית המשויכת עם $EMAIL$ ייוצאו. כספת ארגון לא תיכלל. רק פרטי פריט כספת ייוצאו ולא יכללו קבצים מצורפים משויכים.", "placeholders": { "email": { "content": "$1", @@ -2808,10 +2872,10 @@ } }, "exportingOrganizationVaultTitle": { - "message": "Exporting organization vault" + "message": "מייצא כספת ארגון" }, "exportingOrganizationVaultDesc": { - "message": "Only the organization vault associated with $ORGANIZATION$ will be exported. Items in individual vaults or other organizations will not be included.", + "message": "רק פריטי הכספת הארגונים המשויכת עם $ORGANIZATION$ ייוצאו. פריטים בכספת אישית או ארגונים אחרים לא יכללו.", "placeholders": { "organization": { "content": "$1", @@ -2823,27 +2887,27 @@ "message": "שגיאה" }, "decryptionError": { - "message": "Decryption error" + "message": "שגיאת פענוח" }, "couldNotDecryptVaultItemsBelow": { - "message": "Bitwarden could not decrypt the vault item(s) listed below." + "message": "Bitwarden לא יכל לפענח את פריט(י) הכספת הרשומ(ים) למטה." }, "contactCSToAvoidDataLossPart1": { - "message": "Contact customer success", + "message": "צור קשר עם הצלחת לקוחות", "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": "כדי להימנע מאובדן מידע נוסף.", "description": "This is part of a larger sentence. The full sentence will read 'Contact customer success to avoid additional data loss.'" }, "generateUsername": { - "message": "Generate username" + "message": "צור שם משתמש" }, "generateEmail": { - "message": "Generate email" + "message": "צור דוא\"ל" }, "spinboxBoundariesHint": { - "message": "Value must be between $MIN$ and $MAX$.", + "message": "הערך חייב להיות בין $MIN$ ל־$MAX$.", "description": "Explains spin box minimum and maximum values to the user", "placeholders": { "min": { @@ -2857,7 +2921,7 @@ } }, "passwordLengthRecommendationHint": { - "message": " Use $RECOMMENDED$ characters or more to generate a strong password.", + "message": " השתמש ב־$RECOMMENDED$ תווים או יותר כדי ליצור סיסמה חזקה.", "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": { @@ -2867,7 +2931,7 @@ } }, "passphraseNumWordsRecommendationHint": { - "message": " Use $RECOMMENDED$ words or more to generate a strong passphrase.", + "message": " השתמש ב־$RECOMMENDED$ מילים או יותר כדי ליצור ביטוי סיסמה חזק.", "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": { @@ -2877,46 +2941,46 @@ } }, "plusAddressedEmail": { - "message": "Plus addressed email", + "message": "דוא\"ל ממוען עם פלוס", "description": "Username generator option that appends a random sub-address to the username. For example: address+subaddress@email.com" }, "plusAddressedEmailDesc": { - "message": "Use your email provider's sub-addressing capabilities." + "message": "השתמש ביכולות מיעון משנה של ספק הדוא\"ל שלך." }, "catchallEmail": { - "message": "Catch-all email" + "message": "דוא\"ל תופס-כל" }, "catchallEmailDesc": { - "message": "Use your domain's configured catch-all inbox." + "message": "השתמש בתיבת תפוס-כל המוגדרת בדומיין שלך." }, "random": { - "message": "Random" + "message": "אקראי" }, "randomWord": { - "message": "Random word" + "message": "מילה אקראית" }, "websiteName": { - "message": "Website name" + "message": "שם אתר" }, "service": { - "message": "Service" + "message": "שירות" }, "forwardedEmail": { - "message": "כתובת דוא״ל להעברה" + "message": "כינוי דוא\"ל מועבר" }, "forwardedEmailDesc": { - "message": "יצירת כינוי דוא״ל עם שירות העברה חיצוני." + "message": "צור כינוי דוא\"ל עם שירות העברה חיצוני." }, "forwarderDomainName": { - "message": "Email domain", + "message": "דומיין דוא\"ל", "description": "Labels the domain name email forwarder service option" }, "forwarderDomainNameHint": { - "message": "Choose a domain that is supported by the selected service", + "message": "השתמש בדומיין שנתמך על ידי השירות שנבחר", "description": "Guidance provided for email forwarding services that support multiple email domains." }, "forwarderError": { - "message": "$SERVICENAME$ error: $ERRORMESSAGE$", + "message": "שגיאת $SERVICENAME$: $ERRORMESSAGE$", "description": "Reports an error returned by a forwarding service to the user.", "placeholders": { "servicename": { @@ -2930,11 +2994,11 @@ } }, "forwarderGeneratedBy": { - "message": "Generated by Bitwarden.", + "message": "נוצר על ידי Bitwarden.", "description": "Displayed with the address on the forwarding service's configuration screen." }, "forwarderGeneratedByWithWebsite": { - "message": "Website: $WEBSITE$. Generated by Bitwarden.", + "message": "אתר: $WEBSITE$. נוצר על ידי Bitwarden.", "description": "Displayed with the address on the forwarding service's configuration screen.", "placeholders": { "WEBSITE": { @@ -2944,7 +3008,7 @@ } }, "forwaderInvalidToken": { - "message": "Invalid $SERVICENAME$ API token", + "message": "אסימון $SERVICENAME$ API לא חוקי", "description": "Displayed when the user's API token is empty or rejected by the forwarding service.", "placeholders": { "servicename": { @@ -2954,7 +3018,7 @@ } }, "forwaderInvalidTokenWithMessage": { - "message": "Invalid $SERVICENAME$ API token: $ERRORMESSAGE$", + "message": "אסימון $SERVICENAME$ API לא חוקי: $ERRORMESSAGE$", "description": "Displayed when the user's API token is rejected by the forwarding service with an error message.", "placeholders": { "servicename": { @@ -2968,7 +3032,7 @@ } }, "forwarderNoAccountId": { - "message": "Unable to obtain $SERVICENAME$ masked email account ID.", + "message": "לא ניתן להשיג מזהה חשבון דוא\"ל מסווה של $SERVICENAME$.", "description": "Displayed when the forwarding service fails to return an account ID.", "placeholders": { "servicename": { @@ -2978,7 +3042,7 @@ } }, "forwarderNoDomain": { - "message": "Invalid $SERVICENAME$ domain.", + "message": "דומיין $SERVICENAME$ לא חוקי.", "description": "Displayed when the domain is empty or domain authorization failed at the forwarding service.", "placeholders": { "servicename": { @@ -2988,7 +3052,7 @@ } }, "forwarderNoUrl": { - "message": "Invalid $SERVICENAME$ url.", + "message": "ה־url של $SERVICENAME$ לא חוקי.", "description": "Displayed when the url of the forwarding service wasn't supplied.", "placeholders": { "servicename": { @@ -2998,7 +3062,7 @@ } }, "forwarderUnknownError": { - "message": "Unknown $SERVICENAME$ error occurred.", + "message": "התרחשה שגיאת $SERVICENAME$ לא ידועה.", "description": "Displayed when the forwarding service failed due to an unknown error.", "placeholders": { "servicename": { @@ -3008,7 +3072,7 @@ } }, "forwarderUnknownForwarder": { - "message": "Unknown forwarder: '$SERVICENAME$'.", + "message": "משלח לא ידוע: '$SERVICENAME$'.", "description": "Displayed when the forwarding service is not supported.", "placeholders": { "servicename": { @@ -3028,19 +3092,19 @@ "message": "מפתח API" }, "ssoKeyConnectorError": { - "message": "Key connector error: make sure key connector is available and working correctly." + "message": "שגיאת מחבר מפתח: ודא שמחבר המפתח זמין ועובד נכון." }, "premiumSubcriptionRequired": { - "message": "Premium subscription required" + "message": "נדרש מנוי פרימיום" }, "organizationIsDisabled": { - "message": "Organization suspended." + "message": "ארגון מושהה." }, "disabledOrganizationFilterError": { - "message": "Items in suspended Organizations cannot be accessed. Contact your Organization owner for assistance." + "message": "לא ניתן לגשת לפריטים בארגון מושהה. פנה אל בעל הארגון שלך עבור סיוע." }, "loggingInTo": { - "message": "Logging in to $DOMAIN$", + "message": "נכנס אל $DOMAIN$", "placeholders": { "domain": { "content": "$1", @@ -3049,25 +3113,25 @@ } }, "settingsEdited": { - "message": "Settings have been edited" + "message": "הגדרות נערכו" }, "environmentEditedClick": { - "message": "Click here" + "message": "לחץ כאן" }, "environmentEditedReset": { - "message": "to reset to pre-configured settings" + "message": "כדי לאפס את ההגדרות שהוגדרו מראש" }, "serverVersion": { - "message": "Server version" + "message": "גרסת שרת" }, "selfHostedServer": { - "message": "self-hosted" + "message": "אירוח עצמי" }, "thirdParty": { - "message": "Third-party" + "message": "צד שלישי" }, "thirdPartyServerMessage": { - "message": "Connected to third-party server implementation, $SERVERNAME$. Please verify bugs using the official server, or report them to the third-party server.", + "message": "מחובר ליישום שרת צד שלישי, $SERVERNAME$. בבקשה אמת באגים בעזרת השרת הרשמי, או דווח אותם לשרת הצד שלישי.", "placeholders": { "servername": { "content": "$1", @@ -3076,7 +3140,7 @@ } }, "lastSeenOn": { - "message": "last seen on: $DATE$", + "message": "נראה לאחרונה ב: $DATE$", "placeholders": { "date": { "content": "$1", @@ -3085,82 +3149,91 @@ } }, "loginWithMasterPassword": { - "message": "Log in with master password" + "message": "כניסה עם סיסמה ראשית" }, "loggingInAs": { - "message": "Logging in as" + "message": "כניסה בתור" }, "notYou": { - "message": "Not you?" + "message": "לא את/ה?" }, "newAroundHere": { - "message": "New around here?" + "message": "חדש כאן?" }, "rememberEmail": { - "message": "Remember email" + "message": "זכור דוא\"ל" }, "loginWithDevice": { - "message": "Log in with device" + "message": "כניסה עם מכשיר" }, "loginWithDeviceEnabledInfo": { - "message": "Log in with device must be set up in the settings of the Bitwarden app. Need another option?" + "message": "כניסה עם מכשיר צריכה להיות מוגדרת בהגדרות של היישום Bitwarden. צריך אפשרות אחרת?" }, "fingerprintPhraseHeader": { - "message": "Fingerprint phrase" + "message": "ביטוי טביעת אצבע" }, "fingerprintMatchInfo": { - "message": "Please make sure your vault is unlocked and the Fingerprint phrase matches on the other device." + "message": "בבקשה ודא שהכספת שלך לא נעולה ושביטוי טביעת האצבע תואם במכשיר האחר." }, "resendNotification": { - "message": "Resend notification" + "message": "שליחת התראה מחדש" }, "viewAllLogInOptions": { - "message": "View all log in options" + "message": "הצג את כל אפשרויות הכניסה" }, "viewAllLoginOptionsV1": { - "message": "View all log in options" + "message": "הצג את כל אפשרויות הכניסה" }, "notificationSentDevice": { - "message": "A notification has been sent to your device." + "message": "התראה נשלחה למכשיר שלך." + }, + "notificationSentDevicePart1": { + "message": "בטל נעילת Bitwarden במכשיר שלך או ב" + }, + "notificationSentDeviceAnchor": { + "message": "יישום הרשת" + }, + "notificationSentDevicePart2": { + "message": "ודא שביטוי טביעת אצבע תואם את זה שלמטה לפני אישור." }, "aNotificationWasSentToYourDevice": { - "message": "A notification was sent to your device" - }, - "makeSureYourAccountIsUnlockedAndTheFingerprintEtc": { - "message": "Make sure your account is unlocked and the fingerprint phrase matches on the other device" + "message": "התראה נשלחה למכשיר שלך" }, "youWillBeNotifiedOnceTheRequestIsApproved": { - "message": "You will be notified once the request is approved" + "message": "תקבל התראה כאשר הבקשה תאושר" }, "needAnotherOptionV1": { - "message": "Need another option?" + "message": "צריך אפשרות אחרת?" }, "loginInitiated": { - "message": "Login initiated" + "message": "הכניסה החלה" + }, + "logInRequestSent": { + "message": "בקשה נשלחה" }, "exposedMasterPassword": { - "message": "Exposed Master Password" + "message": "סיסמה ראשית חשופה" }, "exposedMasterPasswordDesc": { - "message": "Password found in a data breach. Use a unique password to protect your account. Are you sure you want to use an exposed password?" + "message": "הסיסמה נמצאה בפרצת מידע. השתמש בסיסמה ייחודית כדי לשמור על חשבונך. האם אתה בטוח שברצונך להשתמש בסיסמה חשופה?" }, "weakAndExposedMasterPassword": { - "message": "Weak and Exposed Master Password" + "message": "סיסמה ראשית חלשה וחשופה" }, "weakAndBreachedMasterPasswordDesc": { - "message": "Weak password identified and found in a data breach. Use a strong and unique password to protect your account. Are you sure you want to use this password?" + "message": "סיסמה חלשה זוהתה ונמצאה בפרצת מידע. השתמש בסיסמה חזקה וייחודית כדי להגן על חשבונך. האם אתה בטוח שאתה רוצה להשתמש בסיסמה הזאת?" }, "checkForBreaches": { - "message": "Check known data breaches for this password" + "message": "בדוק פרצות מידע ידועות עבור סיסמה זו" }, "important": { - "message": "Important:" + "message": "חשוב:" }, "masterPasswordHint": { - "message": "Your master password cannot be recovered if you forget it!" + "message": "לא ניתן לשחזר את הסיסמה הראשית שלך אם אתה שוכח אותה!" }, "characterMinimum": { - "message": "$LENGTH$ character minimum", + "message": "$LENGTH$ תווים לכל הפחות", "placeholders": { "length": { "content": "$1", @@ -3169,13 +3242,13 @@ } }, "autofillPageLoadPolicyActivated": { - "message": "Your organization policies have turned on autofill on page load." + "message": "מדיניות הארגון של הפעילה מילוי אוטומטי בעת טעינת עמוד." }, "howToAutofill": { - "message": "How to autofill" + "message": "כיצד למלא אוטומטית" }, "autofillSelectInfoWithCommand": { - "message": "Select an item from this screen, use the shortcut $COMMAND$, or explore other options in settings.", + "message": "בחר פריט ממסך זה, בחר את קיצור הדרך $COMMAND$, או חקור אפשרויות אחרות בהגדרות.", "placeholders": { "command": { "content": "$1", @@ -3184,31 +3257,31 @@ } }, "autofillSelectInfoWithoutCommand": { - "message": "Select an item from this screen, or explore other options in settings." + "message": "בחר פריט ממסך זה, או חקור אפשרויות אחרות בהגדרות." }, "gotIt": { - "message": "Got it" + "message": "הבנתי" }, "autofillSettings": { - "message": "Autofill settings" + "message": "הגדרות מילוי אוטומטי" }, "autofillKeyboardShortcutSectionTitle": { - "message": "Autofill shortcut" + "message": "קיצור מילוי אוטומטי" }, "autofillKeyboardShortcutUpdateLabel": { - "message": "Change shortcut" + "message": "שנה קיצור דרך" }, "autofillKeyboardManagerShortcutsLabel": { - "message": "Manage shortcuts" + "message": "נהל קיצורי דרך" }, "autofillShortcut": { - "message": "Autofill keyboard shortcut" + "message": "מקשי קיצור למילוי אוטומטי" }, "autofillLoginShortcutNotSet": { - "message": "The autofill login shortcut is not set. Change this in the browser's settings." + "message": "קיצור הדרך למילוי כניסה אוטומטי לא הוגדר. שנה זאת בהגדרות הדפדפן." }, "autofillLoginShortcutText": { - "message": "The autofill login shortcut is $COMMAND$. Manage all shortcuts in the browser's settings.", + "message": "קיצור הדרך למילוי כניסה אוטומטי הוא $COMMAND$. נהל את כל קיצורי הדרך בהדגרות הדפדפן.", "placeholders": { "command": { "content": "$1", @@ -3217,7 +3290,7 @@ } }, "autofillShortcutTextSafari": { - "message": "Default autofill shortcut: $COMMAND$.", + "message": "קיצור דרך למילוי אוטומטי ברירת מחדל: $COMMAND$.", "placeholders": { "command": { "content": "$1", @@ -3226,65 +3299,65 @@ } }, "opensInANewWindow": { - "message": "Opens in a new window" + "message": "נפתח בחלון חדש" }, "rememberThisDeviceToMakeFutureLoginsSeamless": { - "message": "Remember this device to make future logins seamless" + "message": "זכור מכשיר זה כדי להפוך כניסות עתידיות לחלקות" }, "deviceApprovalRequired": { - "message": "Device approval required. Select an approval option below:" + "message": "נדרש אישור מכשיר. בחר אפשרות אישור למטה:" }, "deviceApprovalRequiredV2": { - "message": "Device approval required" + "message": "נדרש אישור מכשיר" }, "selectAnApprovalOptionBelow": { - "message": "Select an approval option below" + "message": "בחר אפשרות אישור למטה" }, "rememberThisDevice": { - "message": "Remember this device" + "message": "זכור מכשיר זה" }, "uncheckIfPublicDevice": { - "message": "Uncheck if using a public device" + "message": "בטל את הסימון אם אתה משתמש במכשיר ציבורי" }, "approveFromYourOtherDevice": { - "message": "Approve from your other device" + "message": "אשר מהמכשיר האחר שלך" }, "requestAdminApproval": { - "message": "Request admin approval" + "message": "בקש אישור מנהל" }, "approveWithMasterPassword": { - "message": "Approve with master password" + "message": "אשר עם סיסמה ראשית" }, "ssoIdentifierRequired": { - "message": "Organization SSO identifier is required." + "message": "נדרש מזהה SSO של הארגון." }, "creatingAccountOn": { - "message": "Creating account on" + "message": "יוצר חשבון ב־" }, "checkYourEmail": { - "message": "Check your email" + "message": "בדוק את הדוא\"ל שלך" }, "followTheLinkInTheEmailSentTo": { - "message": "Follow the link in the email sent to" + "message": "עקוב אחר הקישור בדוא\"ל הנשלח אל" }, "andContinueCreatingYourAccount": { - "message": "and continue creating your account." + "message": "והמשך ליצור את החשבון שלך." }, "noEmail": { - "message": "No email?" + "message": "אין דוא\"ל?" }, "goBack": { - "message": "Go back" + "message": "חזור אחורה" }, "toEditYourEmailAddress": { - "message": "to edit your email address." + "message": "כדי לערוך את כתובת הדוא\"ל שלך." }, "eu": { - "message": "EU", + "message": "האיחוד האירופי", "description": "European Union" }, "accessDenied": { - "message": "Access denied. You do not have permission to view this page." + "message": "גישה נדחתה. אין לך הרשאות כדי לצפות בדף זה." }, "general": { "message": "כללי" @@ -3293,51 +3366,51 @@ "message": "תצוגה" }, "accountSuccessfullyCreated": { - "message": "Account successfully created!" + "message": "החשבון נוצר בהצלחה!" }, "adminApprovalRequested": { - "message": "Admin approval requested" + "message": "התבקש אישור מנהל" }, "adminApprovalRequestSentToAdmins": { - "message": "Your request has been sent to your admin." + "message": "הבקשה שלך נשלחה למנהל שלך." }, "youWillBeNotifiedOnceApproved": { - "message": "You will be notified once approved." + "message": "תקבל התראה כשתאושר." }, "troubleLoggingIn": { - "message": "Trouble logging in?" + "message": "בעיות בהתחברות?" }, "loginApproved": { - "message": "Login approved" + "message": "כניסה אושרה" }, "userEmailMissing": { - "message": "User email missing" + "message": "חסר דוא\"ל משתמש" }, "activeUserEmailNotFoundLoggingYouOut": { - "message": "Active user email not found. Logging you out." + "message": "דוא\"ל משתמש פעיל לא נמצא. מנתק אותך." }, "deviceTrusted": { - "message": "Device trusted" + "message": "מכשיר מהימן" }, "sendsNoItemsTitle": { - "message": "No active Sends", + "message": "אין סנדים פעילים", "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.", + "message": "השתמש בסנד כדי לשתף באופן מאובטח מידע מוצפן עם כל אחד.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "inputRequired": { - "message": "Input is required." + "message": "נדרש קלט." }, "required": { - "message": "required" + "message": "נדרש" }, "search": { - "message": "Search" + "message": "חיפוש" }, "inputMinLength": { - "message": "Input must be at least $COUNT$ characters long.", + "message": "קלט חייב להיות באורך $COUNT$ תווים לכל הפחות.", "placeholders": { "count": { "content": "$1", @@ -3346,7 +3419,7 @@ } }, "inputMaxLength": { - "message": "Input must not exceed $COUNT$ characters in length.", + "message": "קלט חייב להיות באורך $COUNT$ תווים לכל היותר.", "placeholders": { "count": { "content": "$1", @@ -3355,7 +3428,7 @@ } }, "inputForbiddenCharacters": { - "message": "The following characters are not allowed: $CHARACTERS$", + "message": "התווים הבאים אינם מותרים: $CHARACTERS$", "placeholders": { "characters": { "content": "$1", @@ -3364,7 +3437,7 @@ } }, "inputMinValue": { - "message": "Input value must be at least $MIN$.", + "message": "ערך הקלט חייב להיות לפחות $MIN$.", "placeholders": { "min": { "content": "$1", @@ -3373,7 +3446,7 @@ } }, "inputMaxValue": { - "message": "Input value must not exceed $MAX$.", + "message": "ערך הקלט לא יעלה על $MAX$.", "placeholders": { "max": { "content": "$1", @@ -3382,17 +3455,17 @@ } }, "multipleInputEmails": { - "message": "1 or more emails are invalid" + "message": "1 או יותר דוא\"לים אינם חוקיים" }, "inputTrimValidator": { - "message": "Input must not contain only whitespace.", + "message": "אסור שקלט יכיל רק רווח לבן.", "description": "Notification to inform the user that a form's input can't contain only whitespace." }, "inputEmail": { - "message": "Input is not an email address." + "message": "קלט הוא לא כתובת דוא\"ל." }, "fieldsNeedAttention": { - "message": "$COUNT$ field(s) above need your attention.", + "message": "$COUNT$ שדות למעלה צריכות את תשומת לבך.", "placeholders": { "count": { "content": "$1", @@ -3401,10 +3474,10 @@ } }, "singleFieldNeedsAttention": { - "message": "1 field needs your attention." + "message": "שדה 1 צריך את תשומת לבך." }, "multipleFieldsNeedAttention": { - "message": "$COUNT$ fields need your attention.", + "message": "$COUNT$ שדות צריכות את תשומת לבך.", "placeholders": { "count": { "content": "$1", @@ -3413,22 +3486,22 @@ } }, "selectPlaceholder": { - "message": "-- Select --" + "message": "-- בחר --" }, "multiSelectPlaceholder": { - "message": "-- Type to filter --" + "message": "-- הקלד כדי לסנן --" }, "multiSelectLoading": { - "message": "Retrieving options..." + "message": "מאחזר אפשרויות..." }, "multiSelectNotFound": { - "message": "No items found" + "message": "לא נמצאו פריטים" }, "multiSelectClearAll": { - "message": "Clear all" + "message": "נקה הכל" }, "plusNMore": { - "message": "+ $QUANTITY$ more", + "message": "+ עוד $QUANTITY$", "placeholders": { "quantity": { "content": "$1", @@ -3437,122 +3510,122 @@ } }, "submenu": { - "message": "Submenu" + "message": "תפריט משנה" }, "toggleCollapse": { - "message": "Toggle collapse", + "message": "החלף מצב כיווץ", "description": "Toggling an expand/collapse state." }, "aliasDomain": { - "message": "Alias domain" + "message": "דומיין כינוי" }, "passwordRepromptDisabledAutofillOnPageLoad": { - "message": "Items with master password re-prompt cannot be autofilled on page load. Autofill on page load turned off.", + "message": "פריטים עם בקשת סיסמה ראשית חוזרת לא ניתנים למילוי אוטומטי בעת טעינת עמוד. מילוי אוטומטי בעת טעינת נכבה.", "description": "Toast message for describing that master password re-prompt cannot be autofilled on page load." }, "autofillOnPageLoadSetToDefault": { - "message": "Autofill on page load set to use default setting.", + "message": "מילוי אוטומטי בעת טעינת הוגדר להשתמש בהגדרת ברירת מחדל.", "description": "Toast message for informing the user that autofill on page load has been set to the default setting." }, "turnOffMasterPasswordPromptToEditField": { - "message": "Turn off master password re-prompt to edit this field", + "message": "כבה בקשת סיסמה ראשית חוזרת כדי לערוך שדה זה", "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": "פתח או סגור ניווט צדדי" }, "skipToContent": { - "message": "Skip to content" + "message": "דלג לתוכן" }, "bitwardenOverlayButton": { - "message": "Bitwarden autofill menu button", + "message": "כפתור תפריט מילוי אוטומטי של Bitwarden", "description": "Page title for the iframe containing the overlay button" }, "toggleBitwardenVaultOverlay": { - "message": "Toggle Bitwarden autofill menu", + "message": "החלף מצב תפריט מילוי אוטומטי של Bitwaden", "description": "Screen reader and tool tip label for the overlay button" }, "bitwardenVault": { - "message": "Bitwarden autofill menu", + "message": "תפריט מילוי אוטומטי של Bitwaden", "description": "Page title in overlay" }, "unlockYourAccountToViewMatchingLogins": { - "message": "Unlock your account to view matching logins", + "message": "בטל את נעילת החשבון שלך כדי להציג כניסות תואמות", "description": "Text to display in overlay when the account is locked." }, "unlockYourAccountToViewAutofillSuggestions": { - "message": "Unlock your account to view autofill suggestions", + "message": "בטל את נעילת החשבון שלך כדי להציג הצעות למילוי אוטומטי", "description": "Text to display in overlay when the account is locked." }, "unlockAccount": { - "message": "Unlock account", + "message": "ביטול נעילת חשבון", "description": "Button text to display in overlay when the account is locked." }, "unlockAccountAria": { - "message": "Unlock your account, opens in a new window", + "message": "בטל את נעילת החשבון שלך, נפתח בחלון חדש", "description": "Screen reader text (aria-label) for unlock account button in overlay" }, "totpCodeAria": { - "message": "Time-based One-Time Password Verification Code", + "message": "קוד אימות סיסמה חד פעמית מבוססת זמן", "description": "Aria label for the totp code displayed in the inline menu for autofill" }, "totpSecondsSpanAria": { - "message": "Time remaining before current TOTP expires", + "message": "זמן נותר לפני שה־TOTP הנוכחי פג", "description": "Aria label for the totp seconds displayed in the inline menu for autofill" }, "fillCredentialsFor": { - "message": "Fill credentials for", + "message": "מלא פרטים עבור", "description": "Screen reader text for when overlay item is in focused" }, "partialUsername": { - "message": "Partial username", + "message": "שם משתמש חלקי", "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": { - "message": "No items to show", + "message": "אין פריטים להצגה", "description": "Text to show in overlay if there are no matching items" }, "newItem": { - "message": "New item", + "message": "פריט חדש", "description": "Button text to display in overlay when there are no matching items" }, "addNewVaultItem": { - "message": "Add new vault item", + "message": "הוסף פריט כספת חדש", "description": "Screen reader text (aria-label) for new item button in overlay" }, "newLogin": { - "message": "New login", + "message": "כניסה חדשה", "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": "הוסף לכספת פריט כניסה חדש, נפתח בחלון חדש", "description": "Screen reader text (aria-label) for new login button within inline menu" }, "newCard": { - "message": "New card", + "message": "כרטיס חדש", "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": "הוסף לכספת פריט כרטיס חדש, נפתח בחלון חדש", "description": "Screen reader text (aria-label) for new card button within inline menu" }, "newIdentity": { - "message": "New identity", + "message": "זהות חדשה", "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": "הוסף לכספת פריט זהות חדש, נפתח בחלון חדש", "description": "Screen reader text (aria-label) for new identity button within inline menu" }, "bitwardenOverlayMenuAvailable": { - "message": "Bitwarden autofill menu available. Press the down arrow key to select.", + "message": "תפריט מילוי אוטומטי של Bitwarden זמין. הקש על מקש החץ למטה כדי לבחור.", "description": "Screen reader text for announcing when the overlay opens on the page" }, "turnOn": { - "message": "Turn on" + "message": "הפעל" }, "ignore": { - "message": "Ignore" + "message": "התעלם" }, "importData": { "message": "ייבוא נתונים", @@ -3562,10 +3635,10 @@ "message": "שגיאת ייבוא" }, "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": "הייתה בעיה עם הנתונים שאתה מנסה לייבא. נא לפתור את השגיאות הרשומות למטה בקובץ המקור שלך ולנסות שוב." }, "resolveTheErrorsBelowAndTryAgain": { - "message": "Resolve the errors below and try again." + "message": "פתור את השגיאות למטה ונסה שוב." }, "description": { "message": "תיאור" @@ -3574,7 +3647,7 @@ "message": "הנתונים יובאו בהצלחה" }, "importSuccessNumberOfItems": { - "message": "A total of $AMOUNT$ items were imported.", + "message": "סך הכל יובאו $AMOUNT$ פריטים.", "placeholders": { "amount": { "content": "$1", @@ -3583,46 +3656,46 @@ } }, "tryAgain": { - "message": "Try again" + "message": "נסה שוב" }, "verificationRequiredForActionSetPinToContinue": { - "message": "Verification required for this action. Set a PIN to continue." + "message": "נדרש אימות לפעולה זו. הגדר PIN כדי להמשיך." }, "setPin": { - "message": "Set PIN" + "message": "הגדר PIN" }, "verifyWithBiometrics": { - "message": "Verify with biometrics" + "message": "אמת עם זיהוי ביומטרי" }, "awaitingConfirmation": { - "message": "Awaiting confirmation" + "message": "ממתין לאישור" }, "couldNotCompleteBiometrics": { - "message": "Could not complete biometrics." + "message": "לא היה ניתן להשלים את הזיהוי הביומטרי." }, "needADifferentMethod": { - "message": "Need a different method?" + "message": "זקוק לשיטה אחרת?" }, "useMasterPassword": { - "message": "Use master password" + "message": "השתמש בסיסמה ראשית" }, "usePin": { - "message": "Use PIN" + "message": "השתמש ב־PIN" }, "useBiometrics": { - "message": "Use biometrics" + "message": "השתמש בזיהוי ביומטרי" }, "enterVerificationCodeSentToEmail": { - "message": "Enter the verification code that was sent to your email." + "message": "הזן את קוד האימות שנשלח לדוא\"ל שלך." }, "resendCode": { - "message": "Resend code" + "message": "שלח קוד מחדש" }, "total": { - "message": "סך הכול" + "message": "סך הכל" }, "importWarning": { - "message": "You are importing data to $ORGANIZATION$. Your data may be shared with members of this organization. Do you want to proceed?", + "message": "אתה מייבא נתונים אל $ORGANIZATION$. ייתכן שהנתונים שלך ישותפו עם חברים של הארגון הזה. האם אתה רוצה להמשיך?", "placeholders": { "organization": { "content": "$1", @@ -3631,49 +3704,49 @@ } }, "duoHealthCheckResultsInNullAuthUrlError": { - "message": "Error connecting with the Duo service. Use a different two-step login method or contact Duo for assistance." + "message": "שגיאה בהתחברות עם שירות ה־Duo. השתמש בשיטת כניסה דו־שלבית אחרת או פנה אל Duo לסיוע." }, "launchDuoAndFollowStepsToFinishLoggingIn": { - "message": "Launch Duo and follow the steps to finish logging in." + "message": "פתח את Duo ועקוב אחר השלבים לסיום הכניסה." }, "duoRequiredForAccount": { - "message": "Duo two-step login is required for your account." + "message": "דרושה כניסה דו־שלבים של Duo עבור החשבון שלך." }, "popoutTheExtensionToCompleteLogin": { - "message": "Popout the extension to complete login." + "message": "נתק את ההרחבה כדי להשלים כניסה." }, "popoutExtension": { - "message": "Popout extension" + "message": "נתק הרחבה" }, "launchDuo": { - "message": "Launch Duo" + "message": "פתח את Duo" }, "importFormatError": { - "message": "Data is not formatted correctly. Please check your import file and try again." + "message": "נתונים לא מעוצבים כראוי. נא לבדוק את קובץ הייבוא שלך ולנסות שוב." }, "importNothingError": { - "message": "Nothing was imported." + "message": "לא יובא דבר." }, "importEncKeyError": { - "message": "Error decrypting the exported file. Your encryption key does not match the encryption key used export the data." + "message": "שגיאה בפענוח הקובץ המיוצא. מפתח ההצפנה שלך אינו תואם למפתח ההצפנה המשמש לייצוא הנתונים." }, "invalidFilePassword": { - "message": "Invalid file password, please use the password you entered when you created the export file." + "message": "סיסמת קובץ שגויה." }, "destination": { - "message": "Destination" + "message": "יעד" }, "learnAboutImportOptions": { - "message": "Learn about your import options" + "message": "למד על אפשרויות הייבוא שלך" }, "selectImportFolder": { - "message": "Select a folder" + "message": "בחר תיקיה" }, "selectImportCollection": { - "message": "Select a collection" + "message": "בחר אוסף" }, "importTargetHint": { - "message": "Select this option if you want the imported file contents moved to a $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": { @@ -3683,25 +3756,25 @@ } }, "importUnassignedItemsError": { - "message": "File contains unassigned items." + "message": "קובץ מכיל פריטים לא מוקצים." }, "selectFormat": { - "message": "Select the format of the import file" + "message": "בחר את הפורמט של קובץ הייבוא" }, "selectImportFile": { - "message": "Select the import file" + "message": "בחר את קובץ הייבוא" }, "chooseFile": { - "message": "Choose File" + "message": "בחר קובץ" }, "noFileChosen": { - "message": "No file chosen" + "message": "לא נבחר קובץ" }, "orCopyPasteFileContents": { - "message": "or copy/paste the import file contents" + "message": "או העתק/הדבק את תוכן קובץ הייבוא" }, "instructionsFor": { - "message": "$NAME$ Instructions", + "message": "הוראות עבור $NAME$", "description": "The title for the import tool instructions.", "placeholders": { "name": { @@ -3711,200 +3784,200 @@ } }, "confirmVaultImport": { - "message": "Confirm vault import" + "message": "אשר ייבוא כספת" }, "confirmVaultImportDesc": { - "message": "This file is password-protected. Please enter the file password to import data." + "message": "קובץ זה מוגן סיסמה. נא להזין את סיסמת הקובץ כדי לייבא נתונים." }, "confirmFilePassword": { - "message": "Confirm file password" + "message": "אשר סיסמת קובץ" }, "exportSuccess": { - "message": "Vault data exported" + "message": "נתוני כספת יוצאו" }, "typePasskey": { - "message": "Passkey" + "message": "מפתח גישה" }, "accessing": { - "message": "Accessing" + "message": "ניגש" }, "loggedInExclamation": { - "message": "Logged in!" + "message": "מחובר!" }, "passkeyNotCopied": { - "message": "Passkey will not be copied" + "message": "מפתח גישה לא יועתק" }, "passkeyNotCopiedAlert": { - "message": "The passkey will not be copied to the cloned item. Do you want to continue cloning this item?" + "message": "מפתח הגישה לא יועתק לפריט המשוכפל. האם ברצונך להמשיך לשכפל פריט זה?" }, "passkeyFeatureIsNotImplementedForAccountsWithoutMasterPassword": { - "message": "Verification required by the initiating site. This feature is not yet implemented for accounts without master password." + "message": "נדרש אימות על ידי האתר היוזם. תכונה זו עדיין לא מיושמת עבור חשבונות ללא סיסמה ראשית." }, "logInWithPasskeyQuestion": { - "message": "Log in with passkey?" + "message": "אימות עם מפתח גישה?" }, "passkeyAlreadyExists": { - "message": "A passkey already exists for this application." + "message": "מפתח גישה כבר קיים ביישום זה." }, "noPasskeysFoundForThisApplication": { - "message": "No passkeys found for this application." + "message": "לא נמצאו מפתחות גישה עבור יישום זה." }, "noMatchingPasskeyLogin": { - "message": "You do not have a matching login for this site." + "message": "אין לך כניסות תואמות עבור אתר זה." }, "noMatchingLoginsForSite": { - "message": "No matching logins for this site" + "message": "אין כניסות תואמות עבור אתר זה" }, "searchSavePasskeyNewLogin": { - "message": "Search or save passkey as new login" + "message": "חפש או שמור מפתח גישה ככניסה חדשה" }, "confirm": { - "message": "Confirm" + "message": "אשר" }, "savePasskey": { - "message": "Save passkey" + "message": "שמור מפתח גישה" }, "savePasskeyNewLogin": { - "message": "Save passkey as new login" + "message": "שמור מפתח גישה ככניסה חדשה" }, "chooseCipherForPasskeySave": { - "message": "Choose a login to save this passkey to" + "message": "בחר כניסה אליה יישמר מפתח כניסה זה" }, "chooseCipherForPasskeyAuth": { - "message": "Choose a passkey to log in with" + "message": "בחר מפתח גישה כדי להיכנס באמצעותה" }, "passkeyItem": { - "message": "Passkey Item" + "message": "פריט מפתח גישה" }, "overwritePasskey": { - "message": "Overwrite passkey?" + "message": "לדרוס מפתח גישה?" }, "overwritePasskeyAlert": { - "message": "This item already contains a passkey. Are you sure you want to overwrite the current passkey?" + "message": "פריט זה כבר מכיל מפתח גישה. האם אתה בטוח שברצונך לדרוס את המפתח גישה הנוכחי?" }, "featureNotSupported": { - "message": "Feature not yet supported" + "message": "תכונה עדיין לא נתמכת" }, "yourPasskeyIsLocked": { - "message": "Authentication required to use passkey. Verify your identity to continue." + "message": "אימות נדרש כדי להשתמש במפתח גישה. אמת את זהותך כדי להמשיך." }, "multifactorAuthenticationCancelled": { - "message": "Multifactor authentication cancelled" + "message": "אימות רב-שלבי בוטל" }, "noLastPassDataFound": { - "message": "No LastPass data found" + "message": "לא נמצאו נתוני LastPass" }, "incorrectUsernameOrPassword": { - "message": "Incorrect username or password" + "message": "שם משתמש או סיסמה שגויים" }, "incorrectPassword": { - "message": "Incorrect password" + "message": "סיסמה שגויה" }, "incorrectCode": { - "message": "Incorrect code" + "message": "קוד שגוי" }, "incorrectPin": { - "message": "Incorrect PIN" + "message": "PIN שגוי" }, "multifactorAuthenticationFailed": { - "message": "Multifactor authentication failed" + "message": "אימות רב-שלבי נכשל" }, "includeSharedFolders": { - "message": "Include shared folders" + "message": "כלול תיקיות משותפות" }, "lastPassEmail": { - "message": "LastPass Email" + "message": "דוא\"ל LastPass" }, "importingYourAccount": { - "message": "Importing your account..." + "message": "מייבא את החשבון שלך..." }, "lastPassMFARequired": { - "message": "LastPass multifactor authentication required" + "message": "נדרש אימות רב-שלבי של LastPass" }, "lastPassMFADesc": { - "message": "Enter your one-time passcode from your authentication app" + "message": "הזן את קוד הגישה החד פעמי שלך מיישום האימות שלך" }, "lastPassOOBDesc": { - "message": "Approve the login request in your authentication app or enter a one-time passcode." + "message": "אשר את בקשת הכניסה ביישום האימות שלך או הזן קוד גישה חד פעמי." }, "passcode": { - "message": "Passcode" + "message": "קוד גישה" }, "lastPassMasterPassword": { - "message": "LastPass master password" + "message": "סיסמה ראשית של LastPass" }, "lastPassAuthRequired": { - "message": "LastPass authentication required" + "message": "נדרש אימות של LastPass" }, "awaitingSSO": { - "message": "Awaiting SSO authentication" + "message": "ממתין לאימות SSO" }, "awaitingSSODesc": { - "message": "Please continue to log in using your company credentials." + "message": "נא להמשיך להתחבר אמצעות פרטי החברה שלך." }, "seeDetailedInstructions": { - "message": "See detailed instructions on our help site at", + "message": "ראה הוראות מפורטות באתר העזרה שלנו ב־", "description": "This is followed a by a hyperlink to the help website." }, "importDirectlyFromLastPass": { - "message": "Import directly from LastPass" + "message": "ייבא ישירות מ־LastPass" }, "importFromCSV": { - "message": "Import from CSV" + "message": "ייבא מ־CSV" }, "lastPassTryAgainCheckEmail": { - "message": "Try again or look for an email from LastPass to verify it's you." + "message": "נסה שוב או חפש דוא\"ל מ־LastPass כדי לאמת שזה אתה." }, "collection": { - "message": "Collection" + "message": "אוסף" }, "lastPassYubikeyDesc": { - "message": "Insert the YubiKey associated with your LastPass account into your computer's USB port, then touch its button." + "message": "הכנס את ה־YubiKey המשויך עם חשבון ה־LastPass שלך אל תוך יציאת USB של המחשב שלך, לאחר מכן לחץ על הכפתור שלו." }, "switchAccount": { - "message": "Switch account" + "message": "החלף חשבון" }, "switchAccounts": { - "message": "Switch accounts" + "message": "החלף חשבונות" }, "switchToAccount": { - "message": "Switch to account" + "message": "החלף לחשבון" }, "activeAccount": { - "message": "Active account" + "message": "חשבון פעיל" }, "availableAccounts": { - "message": "Available accounts" + "message": "חשבונות זמינים" }, "accountLimitReached": { - "message": "Account limit reached. Log out of an account to add another." + "message": "הגעת למגבלת החשבונות. יש לצאת מחשבון כדי להוסיף אחד נוסף." }, "active": { - "message": "active" + "message": "פעיל" }, "locked": { - "message": "locked" + "message": "נעול" }, "unlocked": { - "message": "unlocked" + "message": "פתוח" }, "server": { - "message": "server" + "message": "שרת" }, "hostedAt": { - "message": "hosted at" + "message": "מאורח אצל" }, "useDeviceOrHardwareKey": { - "message": "Use your device or hardware key" + "message": "השתמש במכשיר שלך או במפתח חומרה" }, "justOnce": { - "message": "Just once" + "message": "רק פעם אחת" }, "alwaysForThisSite": { - "message": "Always for this site" + "message": "תמיד עבור אתר זה" }, "domainAddedToExcludedDomains": { - "message": "$DOMAIN$ added to excluded domains.", + "message": "$DOMAIN$ נוסף לרשימת הדומיינים המוחרגים.", "placeholders": { "domain": { "content": "$1", @@ -3913,106 +3986,106 @@ } }, "commonImportFormats": { - "message": "תסדירים נפוצים", + "message": "פורמטים נפוצים", "description": "Label indicating the most common import formats" }, "confirmContinueToBrowserSettingsTitle": { - "message": "Continue to browser settings?", + "message": "להמשיך להגדרות דפדפן?", "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": "להמשיך למרכז העזרה?", "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": "שנה את הגדרות ניהול סיסמאות ומילוי אוטומטי של הדפדפן שלך.", "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": "אתה יכול לראות ולהגדיר קיצורי דרך להרחבות בהגדרות הדפדפן שלך.", "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": "שנה את הגדרות ניהול סיסמאות ומילוי אוטומטי של הדפדפן שלך.", "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": "אתה יכול לראות ולהגדיר קיצורי דרך להרחבות בהגדרות הדפדפן שלך.", "description": "Body content for dialog which asks if the user wants to proceed to the browser's keyboard shortcut settings page" }, "overrideDefaultBrowserAutofillTitle": { - "message": "Make Bitwarden your default password manager?", + "message": "להפוך את Bitwarden למנהל הסיסמאות ברירת המחדל שלך?", "description": "Dialog title facilitating the ability to override a chrome browser's default autofill behavior" }, "overrideDefaultBrowserAutofillDescription": { - "message": "Ignoring this option may cause conflicts between Bitwarden autofill suggestions and your browser's.", + "message": "התעלמות מאפשרות זו עלולה לגרום לקונפליקטים בין הצעות למילוי אוטומטי של Bitwarden לאלו של הדפדפן שלך.", "description": "Dialog message facilitating the ability to override a chrome browser's default autofill behavior" }, "overrideDefaultBrowserAutoFillSettings": { - "message": "Make Bitwarden your default password manager", + "message": "הפוך את Bitwaren למנהל הסיסמאות ברירת המחדל שלך", "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": "לא ניתן להגדיר את Bitwarden כמנהל הסיסמאות ברירת המחדל", "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": "אתה מוכרח להעניק הרשאות פרטיות של דפדפן ל־Bitwarden כדי להגדיר אותו כמנהל הסיסמאות ברירת המחדל.", "description": "Description for the dialog that appears when the user has not granted the extension permission to set privacy settings" }, "makeDefault": { - "message": "Make default", + "message": "הפוך לברירת מחדל", "description": "Button text for the setting that allows overriding the default browser autofill settings" }, "saveCipherAttemptSuccess": { - "message": "Credentials saved successfully!", + "message": "פרטים נשמרו בהצלחה!", "description": "Notification message for when saving credentials has succeeded." }, "passwordSaved": { - "message": "Password saved!", + "message": "הסיסמה נשמרה!", "description": "Notification message for when saving credentials has succeeded." }, "updateCipherAttemptSuccess": { - "message": "Credentials updated successfully!", + "message": "הפרטים עודכנו בהצלחה!", "description": "Notification message for when updating credentials has succeeded." }, "passwordUpdated": { - "message": "Password updated!", + "message": "הסיסמה עודכנה!", "description": "Notification message for when updating credentials has succeeded." }, "saveCipherAttemptFailed": { - "message": "Error saving credentials. Check console for details.", + "message": "שגיאה בשמירת פרטים. בדוק מסוף עבור פרטים.", "description": "Notification message for when saving credentials has failed." }, "success": { - "message": "Success" + "message": "הצלחה" }, "removePasskey": { - "message": "Remove passkey" + "message": "הסר מפתח גישה" }, "passkeyRemoved": { - "message": "Passkey removed" + "message": "מפתח גישה הוסר" }, "autofillSuggestions": { "message": "הצעות למילוי אוטומטי" }, "itemSuggestions": { - "message": "Suggested items" + "message": "פריטים מוצעים" }, "autofillSuggestionsTip": { - "message": "Save a login item for this site to autofill" + "message": "שמור פריט התחברות עבור אתר זה כדי למלא אוטומטית" }, "yourVaultIsEmpty": { - "message": "Your vault is empty" + "message": "הכספת שלך ריקה" }, "noItemsMatchSearch": { - "message": "No items match your search" + "message": "אין פריטים שתואמים את החיפוש שלך" }, "clearFiltersOrTryAnother": { - "message": "Clear filters or try another search term" + "message": "נקה מסננים או נסה ביטוי חיפוש אחר" }, "copyInfoTitle": { - "message": "Copy info - $ITEMNAME$", + "message": "העתק פרטים - $ITEMNAME$", "description": "Title for a button that opens a menu with options to copy information from an item.", "placeholders": { "itemname": { @@ -4022,7 +4095,7 @@ } }, "copyNoteTitle": { - "message": "Copy Note - $ITEMNAME$", + "message": "העתק פתק - $ITEMNAME$", "description": "Title for a button copies a note to the clipboard.", "placeholders": { "itemname": { @@ -4032,7 +4105,7 @@ } }, "moreOptionsLabel": { - "message": "More options, $ITEMNAME$", + "message": "עוד אפשרויות, $ITEMNAME$", "description": "Aria label for a button that opens a menu with more options for an item.", "placeholders": { "itemname": { @@ -4042,7 +4115,7 @@ } }, "moreOptionsTitle": { - "message": "More options - $ITEMNAME$", + "message": "עוד אפשרויות - $ITEMNAME$", "description": "Title for a button that opens a menu with more options for an item.", "placeholders": { "itemname": { @@ -4052,7 +4125,7 @@ } }, "viewItemTitle": { - "message": "View item - $ITEMNAME$", + "message": "הצג פריט - $ITEMNAME$", "description": "Title for a link that opens a view for an item.", "placeholders": { "itemname": { @@ -4062,7 +4135,7 @@ } }, "autofillTitle": { - "message": "Autofill - $ITEMNAME$", + "message": "מילוי אוטומטי - $ITEMNAME$", "description": "Title for a button that autofills a login item.", "placeholders": { "itemname": { @@ -4072,40 +4145,40 @@ } }, "noValuesToCopy": { - "message": "No values to copy" + "message": "אין ערכים להעתקה" }, "assignToCollections": { - "message": "Assign to collections" + "message": "הקצה לאוספים" }, "copyEmail": { - "message": "Copy email" + "message": "העתק דוא\"ל" }, "copyPhone": { - "message": "Copy phone" + "message": "העתק טלפון" }, "copyAddress": { - "message": "Copy address" + "message": "העתק כתובת" }, "adminConsole": { - "message": "Admin Console" + "message": "מסוף ניהול" }, "accountSecurity": { - "message": "Account security" + "message": "אבטחת חשבון" }, "notifications": { - "message": "Notifications" + "message": "התראות" }, "appearance": { - "message": "Appearance" + "message": "מראה" }, "errorAssigningTargetCollection": { - "message": "Error assigning target collection." + "message": "שגיאה בהקצאת אוסף יעד." }, "errorAssigningTargetFolder": { - "message": "Error assigning target folder." + "message": "שגיאה בהקצאת תיקיית יעד." }, "viewItemsIn": { - "message": "View items in $NAME$", + "message": "הצג פריטים ב־$NAME$", "description": "Button to view the contents of a folder or collection", "placeholders": { "name": { @@ -4115,7 +4188,7 @@ } }, "backTo": { - "message": "Back to $NAME$", + "message": "חזרה אל $NAME$", "description": "Navigate back to a previous folder or collection", "placeholders": { "name": { @@ -4125,10 +4198,10 @@ } }, "new": { - "message": "New" + "message": "חדש" }, "removeItem": { - "message": "Remove $NAME$", + "message": "הסר $NAME$", "description": "Remove a selected option, such as a folder or collection", "placeholders": { "name": { @@ -4138,65 +4211,56 @@ } }, "itemsWithNoFolder": { - "message": "Items with no folder" + "message": "פריטים ללא תיקיה" }, "itemDetails": { - "message": "Item details" + "message": "פרטי הפריט" }, "itemName": { - "message": "Item name" - }, - "cannotRemoveViewOnlyCollections": { - "message": "You cannot remove collections with View only permissions: $COLLECTIONS$", - "placeholders": { - "collections": { - "content": "$1", - "example": "Work, Personal" - } - } + "message": "שם הפריט" }, "organizationIsDeactivated": { - "message": "Organization is deactivated" + "message": "הארגון מושבת" }, "owner": { - "message": "Owner" + "message": "בעלים" }, "selfOwnershipLabel": { - "message": "You", + "message": "את/ה", "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": "לא ניתן לגשת לפריטים של ארגונים מושבתים. פנה לבעל הארגון שלך לקבלת סיוע." }, "additionalInformation": { - "message": "Additional information" + "message": "פרטים נוספים" }, "itemHistory": { - "message": "Item history" + "message": "היסטוריית פריט" }, "lastEdited": { - "message": "Last edited" + "message": "נערך לאחרונה" }, "ownerYou": { - "message": "Owner: You" + "message": "בעלים: את/ה" }, "linked": { - "message": "Linked" + "message": "מקושר" }, "copySuccessful": { - "message": "Copy Successful" + "message": "העתקה מוצלחת" }, "upload": { - "message": "Upload" + "message": "העלה" }, "addAttachment": { - "message": "Add attachment" + "message": "הוסף קובץ מצורף" }, "maxFileSizeSansPunctuation": { - "message": "Maximum file size is 500 MB" + "message": "גודל הקובץ המרבי הוא 500MB" }, "deleteAttachmentName": { - "message": "Delete attachment $NAME$", + "message": "מחק קובץ מצורף $NAME$", "placeholders": { "name": { "content": "$1", @@ -4205,7 +4269,7 @@ } }, "downloadAttachmentName": { - "message": "Download $NAME$", + "message": "הורד $NAME$", "placeholders": { "name": { "content": "$1", @@ -4214,25 +4278,25 @@ } }, "permanentlyDeleteAttachmentConfirmation": { - "message": "Are you sure you want to permanently delete this attachment?" + "message": "האם אתה בטוח שברצונך למחוק לצמיתות קובץ מצורף זה?" }, "premium": { - "message": "Premium" + "message": "פרימיום" }, "freeOrgsCannotUseAttachments": { - "message": "Free organizations cannot use attachments" + "message": "ארגונים חינמיים לא יכולים להשתמש בקבצים מצורפים" }, "filters": { - "message": "Filters" + "message": "מסננים" }, "filterVault": { - "message": "Filter vault" + "message": "מסנן כספת" }, "filterApplied": { - "message": "One filter applied" + "message": "מסנן אחד הוחל" }, "filterAppliedPlural": { - "message": "$COUNT$ filters applied", + "message": "הוחלו $COUNT$ מסננים", "placeholders": { "count": { "content": "$1", @@ -4241,16 +4305,16 @@ } }, "personalDetails": { - "message": "Personal details" + "message": "פרטים אישיים" }, "identification": { - "message": "Identification" + "message": "הזדהות" }, "contactInfo": { - "message": "Contact info" + "message": "פרטי קשר" }, "downloadAttachment": { - "message": "Download - $ITEMNAME$", + "message": "הורד - $ITEMNAME$", "placeholders": { "itemname": { "content": "$1", @@ -4259,23 +4323,23 @@ } }, "cardNumberEndsWith": { - "message": "card number ends with", + "message": "מספר הכרטיס מסתיים עם", "description": "Used within the inline menu to provide an aria description when users are attempting to fill a card cipher." }, "loginCredentials": { - "message": "Login credentials" + "message": "פרטי כניסה" }, "authenticatorKey": { - "message": "Authenticator key" + "message": "מפתח מאמת" }, "autofillOptions": { - "message": "Autofill options" + "message": "אפשרויות מילוי אוטומטי" }, "websiteUri": { - "message": "Website (URI)" + "message": "אתר אינטרנט (URI)" }, "websiteUriCount": { - "message": "Website (URI) $COUNT$", + "message": "אתר אינטרנט (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": { @@ -4285,16 +4349,16 @@ } }, "websiteAdded": { - "message": "Website added" + "message": "נוסף אתר אינטרנט" }, "addWebsite": { - "message": "Add website" + "message": "הוסף אתר אינטרנט" }, "deleteWebsite": { - "message": "Delete website" + "message": "מחק אתר אינטרנט" }, "defaultLabel": { - "message": "Default ($VALUE$)", + "message": "ברירת מחדל ($VALUE$)", "description": "A label that indicates the default value for a field with the current default value in parentheses.", "placeholders": { "value": { @@ -4304,7 +4368,7 @@ } }, "showMatchDetection": { - "message": "Show match detection $WEBSITE$", + "message": "הצג זיהוי התאמה $WEBSITE$", "placeholders": { "website": { "content": "$1", @@ -4313,7 +4377,7 @@ } }, "hideMatchDetection": { - "message": "Hide match detection $WEBSITE$", + "message": "הסתר זיהוי התאמה $WEBSITE$", "placeholders": { "website": { "content": "$1", @@ -4322,19 +4386,19 @@ } }, "autoFillOnPageLoad": { - "message": "Autofill on page load?" + "message": "למלא אוטומטית בעת טעינת עמוד?" }, "cardExpiredTitle": { - "message": "Expired card" + "message": "כרטיס שפג תוקפו" }, "cardExpiredMessage": { - "message": "If you've renewed it, update the card's information" + "message": "אם חידשת אותו, עדכן את פרטי הכרטיס" }, "cardDetails": { - "message": "Card details" + "message": "פרטי כרטיס" }, "cardBrandDetails": { - "message": "$BRAND$ details", + "message": "פרטי $BRAND$", "placeholders": { "brand": { "content": "$1", @@ -4343,43 +4407,43 @@ } }, "enableAnimations": { - "message": "Enable animations" + "message": "אפשר הנפשות" }, "showAnimations": { - "message": "Show animations" + "message": "הצג הנפשות" }, "addAccount": { - "message": "Add account" + "message": "הוסף חשבון" }, "loading": { - "message": "Loading" + "message": "טוען" }, "data": { - "message": "Data" + "message": "נתונים" }, "passkeys": { - "message": "Passkeys", + "message": "מפתחות גישה", "description": "A section header for a list of passkeys." }, "passwords": { - "message": "Passwords", + "message": "סיסמאות", "description": "A section header for a list of passwords." }, "logInWithPasskeyAriaLabel": { - "message": "Log in with passkey", + "message": "התחבר עם מפתח גישה", "description": "ARIA label for the inline menu button that logs in with a passkey." }, "assign": { - "message": "Assign" + "message": "הקצה" }, "bulkCollectionAssignmentDialogDescriptionSingular": { - "message": "Only organization members with access to these collections will be able to see the item." + "message": "רק חברי ארגון עם גישה לאוספים אלה יוכלו לראות את הפריט." }, "bulkCollectionAssignmentDialogDescriptionPlural": { - "message": "Only organization members with access to these collections will be able to see the items." + "message": "רק חברי ארגון עם גישה לאוספים אלה יוכלו לראות את הפריטים." }, "bulkCollectionAssignmentWarning": { - "message": "You have selected $TOTAL_COUNT$ items. You cannot update $READONLY_COUNT$ of the items because you do not have edit permissions.", + "message": "בחרת ב־$TOTAL_COUNT$ פריטים. אינך יכול לעדכן $READONLY_COUNT$ מהפריטים בגלל שאין לך הרשאות עריכה.", "placeholders": { "total_count": { "content": "$1", @@ -4391,37 +4455,37 @@ } }, "addField": { - "message": "Add field" + "message": "הוסף שדה" }, "add": { - "message": "Add" + "message": "הוסף" }, "fieldType": { - "message": "Field type" + "message": "סוג שדה" }, "fieldLabel": { - "message": "Field label" + "message": "תווית שדה" }, "textHelpText": { - "message": "Use text fields for data like security questions" + "message": "השתמש בשדות טקסט עבור נתונים כמו שאלות אבטחה" }, "hiddenHelpText": { - "message": "Use hidden fields for sensitive data like a password" + "message": "השתמש בשדות נסתרים עבור מידע רגיש כמו סיסמה" }, "checkBoxHelpText": { - "message": "Use checkboxes if you'd like to autofill a form's checkbox, like a remember email" + "message": "השתמש בתיבות סימון אם תרצה למלא אוטומטית תיבת סימון של טופס, כמו זכור דוא\"ל" }, "linkedHelpText": { - "message": "Use a linked field when you are experiencing autofill issues for a specific website." + "message": "השתמש בשדה מקושר כאשר אתה חווה בעיות מילוי אוטומטי עם אתר מסוים." }, "linkedLabelHelpText": { - "message": "Enter the the field's html id, name, aria-label, or placeholder." + "message": "הזן את מזהה ה־html, שם, תווית aria או מציין מיקום." }, "editField": { - "message": "Edit field" + "message": "ערוך שדה" }, "editFieldLabel": { - "message": "Edit $LABEL$", + "message": "ערוך $LABEL$", "placeholders": { "label": { "content": "$1", @@ -4430,7 +4494,7 @@ } }, "deleteCustomField": { - "message": "Delete $LABEL$", + "message": "מחק $LABEL$", "placeholders": { "label": { "content": "$1", @@ -4439,7 +4503,7 @@ } }, "fieldAdded": { - "message": "$LABEL$ added", + "message": "$LABEL$ נוסף", "placeholders": { "label": { "content": "$1", @@ -4448,7 +4512,7 @@ } }, "reorderToggleButton": { - "message": "Reorder $LABEL$. Use arrow key to move item up or down.", + "message": "סדר מחדש את $LABEL$. השתמש במקש חץ כדי להעביר את הפריט למעלה או למטה.", "placeholders": { "label": { "content": "$1", @@ -4457,7 +4521,7 @@ } }, "reorderFieldUp": { - "message": "$LABEL$ moved up, position $INDEX$ of $LENGTH$", + "message": "$LABEL$ עבר למעלה, מיקום $INDEX$ מתוך $LENGTH$", "placeholders": { "label": { "content": "$1", @@ -4474,13 +4538,13 @@ } }, "selectCollectionsToAssign": { - "message": "Select collections to assign" + "message": "בחר אוספים להקצות" }, "personalItemTransferWarningSingular": { - "message": "1 item will be permanently transferred to the selected organization. You will no longer own this item." + "message": "פריט 1 יועבר לצמיתות לארגון הנבחר. לא תהיה יותר הבעלים של הפריט הזה." }, "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$ פריטים יועברו לצמיתות לארגון הנבחר. לא תהיה יותר הבעלים של הפריטים האלה.", "placeholders": { "personal_items_count": { "content": "$1", @@ -4489,7 +4553,7 @@ } }, "personalItemWithOrgTransferWarningSingular": { - "message": "1 item will be permanently transferred to $ORG$. You will no longer own this item.", + "message": "פריט 1 יועבר לצמיתות אל $ORG$. לא תהיה יותר הבעלים של הפריט הזה.", "placeholders": { "org": { "content": "$1", @@ -4498,7 +4562,7 @@ } }, "personalItemsWithOrgTransferWarningPlural": { - "message": "$PERSONAL_ITEMS_COUNT$ items will be permanently transferred to $ORG$. You will no longer own these items.", + "message": "$PERSONAL_ITEMS_COUNT$ פריטים יועברו לצמיתות אל $ORG$. לא תהיה יותר הבעלים של הפריטים האלה.", "placeholders": { "personal_items_count": { "content": "$1", @@ -4511,13 +4575,13 @@ } }, "successfullyAssignedCollections": { - "message": "Successfully assigned collections" + "message": "אוספים הוקצו בהצלחה" }, "nothingSelected": { - "message": "You have not selected anything." + "message": "לא בחרת כלום." }, "movedItemsToOrg": { - "message": "Selected items moved to $ORGNAME$", + "message": "פריטים נבחרים הועברו ל־$ORGNAME$", "placeholders": { "orgname": { "content": "$1", @@ -4526,7 +4590,7 @@ } }, "itemsMovedToOrg": { - "message": "Items moved to $ORGNAME$", + "message": "פריטים הועברו ל־$ORGNAME$", "placeholders": { "orgname": { "content": "$1", @@ -4535,7 +4599,7 @@ } }, "itemMovedToOrg": { - "message": "Item moved to $ORGNAME$", + "message": "פריט הועבר ל־$ORGNAME$", "placeholders": { "orgname": { "content": "$1", @@ -4544,7 +4608,7 @@ } }, "reorderFieldDown": { - "message": "$LABEL$ moved down, position $INDEX$ of $LENGTH$", + "message": "$LABEL$ עבר למטה, מיקום $INDEX$ מתוך $LENGTH$", "placeholders": { "label": { "content": "$1", @@ -4561,115 +4625,115 @@ } }, "itemLocation": { - "message": "Item Location" + "message": "מיקום פריט" }, "fileSend": { - "message": "File Send" + "message": "קובץ סנד" }, "fileSends": { - "message": "File Sends" + "message": "קובץ סנדים" }, "textSend": { - "message": "Text Send" + "message": "טקסט סנד" }, "textSends": { - "message": "Text Sends" + "message": "טקסט סנדים" }, "accountActions": { - "message": "Account actions" + "message": "פעולות חשבון" }, "showNumberOfAutofillSuggestions": { - "message": "Show number of login autofill suggestions on extension icon" + "message": "הצג את מספר ההצעות למילוי כניסה אוטומטי בסמל ההרחבה" }, "showQuickCopyActions": { - "message": "Show quick copy actions on Vault" + "message": "הצג פעולות העתקה מהירה בכספת" }, "systemDefault": { - "message": "System default" + "message": "ברירת מחדל של המערכת" }, "enterprisePolicyRequirementsApplied": { - "message": "Enterprise policy requirements have been applied to this setting" + "message": "דרישות מדיניות ארגונית הוחלו על הגדרה זו" }, "sshPrivateKey": { - "message": "Private key" + "message": "מפתח פרטי" }, "sshPublicKey": { - "message": "Public key" + "message": "מפתח ציבורי" }, "sshFingerprint": { - "message": "Fingerprint" + "message": "טביעת אצבע" }, "sshKeyAlgorithm": { - "message": "Key type" + "message": "סוג מפתח" }, "sshKeyAlgorithmED25519": { "message": "ED25519" }, "sshKeyAlgorithmRSA2048": { - "message": "RSA 2048-Bit" + "message": "RSA‏ 2048 סיביות" }, "sshKeyAlgorithmRSA3072": { - "message": "RSA 3072-Bit" + "message": "RSA‏ 3072 סיביות" }, "sshKeyAlgorithmRSA4096": { - "message": "RSA 4096-Bit" + "message": "RSA‏ 4096 סיביות" }, "retry": { - "message": "Retry" + "message": "נסה שוב" }, "vaultCustomTimeoutMinimum": { - "message": "Minimum custom timeout is 1 minute." + "message": "פסק זמן מינימלי הוא דקה 1." }, "additionalContentAvailable": { - "message": "Additional content is available" + "message": "תוכן נוסף זמין" }, "fileSavedToDevice": { - "message": "File saved to device. Manage from your device downloads." + "message": "קובץ נשמר למכשיר. נהל מההורדות של המכשיר שלך." }, "showCharacterCount": { - "message": "Show character count" + "message": "הצג מונה תווים" }, "hideCharacterCount": { - "message": "Hide character count" + "message": "הסתר מונה תווים" }, "itemsInTrash": { - "message": "Items in trash" + "message": "פריטים באשפה" }, "noItemsInTrash": { - "message": "No items in trash" + "message": "אין פריטים באשפה" }, "noItemsInTrashDesc": { - "message": "Items you delete will appear here and be permanently deleted after 30 days" + "message": "פריטים שאתה מוחק יופיעו כאן ויימחקו לצמיתות לאחר 30 יום" }, "trashWarning": { - "message": "Items that have been in trash more than 30 days will automatically be deleted" + "message": "פריטים שהיו באשפה יותר מ־30 יום יימחקו באופן אוטומטי" }, "restore": { - "message": "Restore" + "message": "שחזר" }, "deleteForever": { - "message": "Delete forever" + "message": "מחק לנצח" }, "noEditPermissions": { - "message": "You don't have permission to edit this item" + "message": "אין לך הרשאות לערוך פריט זה" }, "biometricsStatusHelptextUnlockNeeded": { - "message": "Biometric unlock is unavailable because PIN or password unlock is required first." + "message": "ביטול נעילה ביומטרי אינו זמין בגלל שקודם צריך לבטל את הנעילה עם PIN או סיסמה." }, "biometricsStatusHelptextHardwareUnavailable": { - "message": "Biometric unlock is currently unavailable." + "message": "ביטול נעילה ביומטרי אינו זמין כעת." }, "biometricsStatusHelptextAutoSetupNeeded": { - "message": "Biometric unlock is unavailable due to misconfigured system files." + "message": "ביטול נעילה ביומטרי אינו זמין בשל קבצי מערכת המוגדרים באופן שגוי." }, "biometricsStatusHelptextManualSetupNeeded": { - "message": "Biometric unlock is unavailable due to misconfigured system files." + "message": "ביטול נעילה ביומטרי אינו זמין בשל קבצי מערכת המוגדרים באופן שגוי." }, "biometricsStatusHelptextDesktopDisconnected": { - "message": "Biometric unlock is unavailable because the Bitwarden desktop app is closed." + "message": "ביטול נעילה ביומטרי אינו זמין בגלל שיישום שולחן העבודה Bitwarden סגור." }, "biometricsStatusHelptextNotEnabledInDesktop": { - "message": "Biometric unlock is unavailable because it is not enabled for $EMAIL$ in the Bitwarden desktop app.", + "message": "ביטול נעילה ביומטרי אינו זמין בגלל שהוא לא מאופשר עבור $EMAIL$ ביישום שולחן העבודה Bitwarden.", "placeholders": { "email": { "content": "$1", @@ -4678,187 +4742,187 @@ } }, "biometricsStatusHelptextUnavailableReasonUnknown": { - "message": "Biometric unlock is currently unavailable for an unknown reason." + "message": "ביטול נעילה ביומטרי אינו זמין כעת מסיבה לא ידועה." }, "authenticating": { - "message": "Authenticating" + "message": "מאמת" }, "fillGeneratedPassword": { - "message": "Fill generated password", + "message": "מלא סיסמה שנוצרה", "description": "Heading for the password generator within the inline menu" }, "passwordRegenerated": { - "message": "Password regenerated", + "message": "סיסמה נוצרה מחדש", "description": "Notification message for when a password has been regenerated" }, "saveLoginToBitwarden": { - "message": "Save login to Bitwarden?", + "message": "לשמור כניסה ב־Bitwarden?", "description": "Confirmation message for saving a login to Bitwarden" }, "spaceCharacterDescriptor": { - "message": "Space", + "message": "רווח", "description": "Represents the space key in screen reader content as a readable word" }, "tildeCharacterDescriptor": { - "message": "Tilde", + "message": "טילדה", "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": { - "message": "Exclamation mark", + "message": "סימן קריאה", "description": "Represents the ! key in screen reader content as a readable word" }, "atSignCharacterDescriptor": { - "message": "At sign", + "message": "כרוכית", "description": "Represents the @ key in screen reader content as a readable word" }, "hashSignCharacterDescriptor": { - "message": "Hash sign", + "message": "סולמית", "description": "Represents the # key in screen reader content as a readable word" }, "dollarSignCharacterDescriptor": { - "message": "Dollar sign", + "message": "סימן הדולר", "description": "Represents the $ key in screen reader content as a readable word" }, "percentSignCharacterDescriptor": { - "message": "Percent sign", + "message": "סימן אחוז", "description": "Represents the % key in screen reader content as a readable word" }, "caretCharacterDescriptor": { - "message": "Caret", + "message": "קרט", "description": "Represents the ^ key in screen reader content as a readable word" }, "ampersandCharacterDescriptor": { - "message": "Ampersand", + "message": "אמפרסנד", "description": "Represents the & key in screen reader content as a readable word" }, "asteriskCharacterDescriptor": { - "message": "Asterisk", + "message": "כוכבית", "description": "Represents the * key in screen reader content as a readable word" }, "parenLeftCharacterDescriptor": { - "message": "Left parenthesis", + "message": "סוגר שמאלי", "description": "Represents the ( key in screen reader content as a readable word" }, "parenRightCharacterDescriptor": { - "message": "Right parenthesis", + "message": "סוגר ימני", "description": "Represents the ) key in screen reader content as a readable word" }, "hyphenCharacterDescriptor": { - "message": "Underscore", + "message": "קו תחתון", "description": "Represents the _ key in screen reader content as a readable word" }, "underscoreCharacterDescriptor": { - "message": "Hyphen", + "message": "מקף", "description": "Represents the - key in screen reader content as a readable word" }, "plusCharacterDescriptor": { - "message": "Plus", + "message": "פלוס", "description": "Represents the + key in screen reader content as a readable word" }, "equalsCharacterDescriptor": { - "message": "Equals", + "message": "שוויון", "description": "Represents the = key in screen reader content as a readable word" }, "braceLeftCharacterDescriptor": { - "message": "Left brace", + "message": "סוגר מסולסל שמאלי", "description": "Represents the { key in screen reader content as a readable word" }, "braceRightCharacterDescriptor": { - "message": "Right brace", + "message": "סוגר מסולסל ימני", "description": "Represents the } key in screen reader content as a readable word" }, "bracketLeftCharacterDescriptor": { - "message": "Left bracket", + "message": "סוגר מרובע שמאלי", "description": "Represents the [ key in screen reader content as a readable word" }, "bracketRightCharacterDescriptor": { - "message": "Right bracket", + "message": "סוגר מרובע ימני", "description": "Represents the ] key in screen reader content as a readable word" }, "pipeCharacterDescriptor": { - "message": "Pipe", + "message": "צינור", "description": "Represents the | key in screen reader content as a readable word" }, "backSlashCharacterDescriptor": { - "message": "Back slash", + "message": "לוכסן שמאלי", "description": "Represents the back slash key in screen reader content as a readable word" }, "colonCharacterDescriptor": { - "message": "Colon", + "message": "נקודתיים", "description": "Represents the : key in screen reader content as a readable word" }, "semicolonCharacterDescriptor": { - "message": "Semicolon", + "message": "נקודה ופסיק", "description": "Represents the ; key in screen reader content as a readable word" }, "doubleQuoteCharacterDescriptor": { - "message": "Double quote", + "message": "מירכאה כפולה", "description": "Represents the double quote key in screen reader content as a readable word" }, "singleQuoteCharacterDescriptor": { - "message": "Single quote", + "message": "מירכאה בודדת", "description": "Represents the ' key in screen reader content as a readable word" }, "lessThanCharacterDescriptor": { - "message": "Less than", + "message": "קטן מ-", "description": "Represents the < key in screen reader content as a readable word" }, "greaterThanCharacterDescriptor": { - "message": "Greater than", + "message": "גדול מ-", "description": "Represents the > key in screen reader content as a readable word" }, "commaCharacterDescriptor": { - "message": "Comma", + "message": "פסיק", "description": "Represents the , key in screen reader content as a readable word" }, "periodCharacterDescriptor": { - "message": "Period", + "message": "נקודה", "description": "Represents the . key in screen reader content as a readable word" }, "questionCharacterDescriptor": { - "message": "Question mark", + "message": "סימן שאלה", "description": "Represents the ? key in screen reader content as a readable word" }, "forwardSlashCharacterDescriptor": { - "message": "Forward slash", + "message": "לוכסן", "description": "Represents the / key in screen reader content as a readable word" }, "lowercaseAriaLabel": { - "message": "Lowercase" + "message": "אות קטנה" }, "uppercaseAriaLabel": { - "message": "Uppercase" + "message": "אות גדולה" }, "generatedPassword": { - "message": "Generated password" + "message": "נוצרה סיסמה" }, "compactMode": { - "message": "Compact mode" + "message": "מצב קומפקטי" }, "beta": { - "message": "Beta" + "message": "בטא" }, "importantNotice": { - "message": "Important notice" + "message": "הודעה חשובה" }, "setupTwoStepLogin": { - "message": "Set up two-step login" + "message": "הגדר כניסה דו-שלבית" }, "newDeviceVerificationNoticeContentPage1": { - "message": "Bitwarden will send a code to your account email to verify logins from new devices starting in February 2025." + "message": "Bitwarden ישלח קוד לדוא\"ל החשבון שלך כדי לאמת כניסות ממכשירים חדשים החל מפברואר 2025." }, "newDeviceVerificationNoticeContentPage2": { - "message": "You can set up two-step login as an alternative way to protect your account or change your email to one you can access." + "message": "אתה יכול להגדיר כניסה דו-שלבית כדרך חלופית להגן על החשבון שלך או לשנות את הדוא\"ל שלך לאחד שתוכל לגשת אליו." }, "remindMeLater": { - "message": "Remind me later" + "message": "הזכר לי מאוחר יותר" }, "newDeviceVerificationNoticePageOneFormContent": { - "message": "Do you have reliable access to your email, $EMAIL$?", + "message": "יש לך גישה מהימנה לדוא\"ל שלך, $EMAIL$?", "placeholders": { "email": { "content": "$1", @@ -4867,30 +4931,39 @@ } }, "newDeviceVerificationNoticePageOneEmailAccessNo": { - "message": "No, I do not" + "message": "לא, אין לי" }, "newDeviceVerificationNoticePageOneEmailAccessYes": { - "message": "Yes, I can reliably access my email" + "message": "כן, אני יכול לגשת לדוא\"ל באופן מהימן" }, "turnOnTwoStepLogin": { - "message": "Turn on two-step login" + "message": "הפעל כניסה דו-שלבית" }, "changeAcctEmail": { - "message": "Change account email" + "message": "שנה את דוא\"ל החשבון" }, "extensionWidth": { - "message": "Extension width" + "message": "רוחב הרחבה" }, "wide": { - "message": "Wide" + "message": "רחב" }, "extraWide": { - "message": "Extra wide" + "message": "רחב במיוחד" + }, + "cannotRemoveViewOnlyCollections": { + "message": "אינך יכול להסיר אוספים עם הרשאות צפייה בלבד: $COLLECTIONS$", + "placeholders": { + "collections": { + "content": "$1", + "example": "Work, Personal" + } + } }, "updateDesktopAppOrDisableFingerprintDialogTitle": { - "message": "Please update your desktop application" + "message": "נא לעדכן את יישום שולחן העבודה שלך" }, "updateDesktopAppOrDisableFingerprintDialogMessage": { - "message": "To use biometric unlock, please update your desktop application, or disable fingerprint unlock in the desktop settings." + "message": "כדי להשתמש בביטול נעילה ביומטרי, נא לעדכן את יישום שולחן העבודה שלך, להשבית ביטול נעילה בעזרת טביעת אצבע בהגדרות שולחן העבודה." } } diff --git a/apps/browser/src/_locales/hi/messages.json b/apps/browser/src/_locales/hi/messages.json index 071c7acdb0f..8d6340c9727 100644 --- a/apps/browser/src/_locales/hi/messages.json +++ b/apps/browser/src/_locales/hi/messages.json @@ -2363,6 +2363,70 @@ "autofillBlockedNoticeGuidance": { "message": "Change this in settings" }, + "change": { + "message": "Change" + }, + "changeButtonTitle": { + "message": "Change password - $ITEMNAME$", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "atRiskPasswords": { + "message": "At-risk passwords" + }, + "atRiskPasswordsDescSingleOrg": { + "message": "$ORGANIZATION$ is requesting you change the $COUNT$ passwords because they are at risk.", + "placeholders": { + "organization": { + "content": "$1", + "example": "Acme Corp" + }, + "count": { + "content": "$2", + "example": "2" + } + } + }, + "atRiskPasswordsDescMultiOrg": { + "message": "Your organizations are requesting you change the $COUNT$ passwords because they are at risk.", + "placeholders": { + "count": { + "content": "$1", + "example": "2" + } + } + }, + "reviewAndChangeAtRiskPassword": { + "message": "Review and change one at-risk password" + }, + "reviewAndChangeAtRiskPasswordsPlural": { + "message": "Review and change $COUNT$ at-risk passwords", + "placeholders": { + "count": { + "content": "$1", + "example": "2" + } + } + }, + "changeAtRiskPasswordsFaster": { + "message": "Change at-risk passwords faster" + }, + "changeAtRiskPasswordsFasterDesc": { + "message": "Update your settings so you can quickly autofill your passwords and generate new ones" + }, + "turnOnAutofill": { + "message": "Turn on autofill" + }, + "turnedOnAutofill": { + "message": "Turned on autofill" + }, + "dismiss": { + "message": "Dismiss" + }, "websiteItemLabel": { "message": "Website $number$ (URI)", "placeholders": { @@ -3123,12 +3187,18 @@ "notificationSentDevice": { "message": "A notification has been sent to your device." }, + "notificationSentDevicePart1": { + "message": "Unlock Bitwarden on your device or on the" + }, + "notificationSentDeviceAnchor": { + "message": "web app" + }, + "notificationSentDevicePart2": { + "message": "Make sure the Fingerprint phrase matches the one below before approving." + }, "aNotificationWasSentToYourDevice": { "message": "A notification was sent to your device" }, - "makeSureYourAccountIsUnlockedAndTheFingerprintEtc": { - "message": "Make sure your account is unlocked and the fingerprint phrase matches on the other device" - }, "youWillBeNotifiedOnceTheRequestIsApproved": { "message": "You will be notified once the request is approved" }, @@ -3138,6 +3208,9 @@ "loginInitiated": { "message": "Login initiated" }, + "logInRequestSent": { + "message": "Request sent" + }, "exposedMasterPassword": { "message": "Exposed Master Password" }, @@ -4146,15 +4219,6 @@ "itemName": { "message": "Item name" }, - "cannotRemoveViewOnlyCollections": { - "message": "You cannot remove collections with View only permissions: $COLLECTIONS$", - "placeholders": { - "collections": { - "content": "$1", - "example": "Work, Personal" - } - } - }, "organizationIsDeactivated": { "message": "Organization is deactivated" }, @@ -4887,6 +4951,15 @@ "extraWide": { "message": "Extra wide" }, + "cannotRemoveViewOnlyCollections": { + "message": "You cannot remove collections with View only permissions: $COLLECTIONS$", + "placeholders": { + "collections": { + "content": "$1", + "example": "Work, Personal" + } + } + }, "updateDesktopAppOrDisableFingerprintDialogTitle": { "message": "Please update your desktop application" }, diff --git a/apps/browser/src/_locales/hr/messages.json b/apps/browser/src/_locales/hr/messages.json index a8f9c8b672f..56778b96bcc 100644 --- a/apps/browser/src/_locales/hr/messages.json +++ b/apps/browser/src/_locales/hr/messages.json @@ -334,7 +334,7 @@ "message": "Bitwarden autentifikator" }, "continueToAuthenticatorPageDesc": { - "message": "Bitwarden autentifikator omogućuje pohranu ključeva za autentifikaciju i generiranje TOTP kodova za dvostruku autentifikaciju. Saznaj više na web stranici bitwarden.com" + "message": "Bitwarden autentifikator omogućuje pohranu autentifikatorskih ključeva i generiranje TOTP kodova za dvostruku autentifikaciju. Saznaj više na web stranici bitwarden.com" }, "bitwardenSecretsManager": { "message": "Bitwarden Secrets Manager" @@ -446,16 +446,16 @@ "message": "Generiraj frazu lozinke" }, "passwordGenerated": { - "message": "Password generated" + "message": "Lozinka generirana" }, "passphraseGenerated": { - "message": "Passphrase generated" + "message": "Frazna lozinka generirana" }, "usernameGenerated": { - "message": "Username generated" + "message": "Korisničko ime generirano" }, "emailGenerated": { - "message": "Email generated" + "message": "e-pošta generirana" }, "regeneratePassword": { "message": "Ponovno generiraj lozinku" @@ -660,10 +660,10 @@ "message": "Potvrdi identitet" }, "weDontRecognizeThisDevice": { - "message": "We don't recognize this device. Enter the code sent to your email to verify your identity." + "message": "Ne prepoznajemo ovaj uređaj. Za potvrdu identiteta unesi kôd poslan e-poštom." }, "continueLoggingIn": { - "message": "Continue logging in" + "message": "Nastavi prijavu" }, "yourVaultIsLocked": { "message": "Tvoj trezor je zaključan. Potvrdi glavnu lozinku za nastavak." @@ -903,7 +903,7 @@ "message": "Mapa dodana" }, "twoStepLoginConfirmation": { - "message": "Prijava dvostrukom autentifikacijom čini tvoj račun još sigurnijim tako što će zahtijevati da potvrdiš prijavu putem drugog uređaja pomoću sigurnosnog koda, autentifikatorske aplikacije, SMS-om, pozivom ili e-poštom. Prijavu dvostrukom autentifikacijom možeš omogućiti na web trezoru. Želiš li sada posjetiti bitwarden.com?" + "message": "Prijava dvostrukom autentifikacijom čini tvoj račun još sigurnijim tako što će zahtijevati potvrdu prijave drugim uređajem kao što je sigurnosni ključ, autentifikatorska aplikacija, SMS, poziv ili e-pošta. Prijavu dvostrukom autentifikacijom možeš omogućiti na web trezoru. Želiš li sada posjetiti bitwarden.com?" }, "twoStepLoginConfirmationContent": { "message": "Učini svoj račun sigurnijim uključivanjem prijave dvofaktorskom autentifikacijom u Bitwarden web aplikaciji." @@ -1005,7 +1005,7 @@ "message": "Pitaj za dodavanje stavke ako nije pronađena u tvojem trezoru. Primjenjuje se na sve prijavljene račune." }, "showCardsInVaultViewV2": { - "message": "Always show cards as Autofill suggestions on Vault view" + "message": "Uvijek prikaži kartice kao prijedloge za auto-ispunu u prikazu trezora" }, "showCardsCurrentTab": { "message": "Prikaži platne kartice" @@ -1014,7 +1014,7 @@ "message": "Prikazuj platne kartice za jednostavnu auto-ispunu." }, "showIdentitiesInVaultViewV2": { - "message": "Always show identities as Autofill suggestions on Vault view" + "message": "Uvijek prikaži identitete kao prijedloge za auto-ispunu u prikazu trezora" }, "showIdentitiesCurrentTab": { "message": "Prikaži identitete" @@ -1317,7 +1317,7 @@ "message": "Automatski kopiraj TOTP" }, "disableAutoTotpCopyDesc": { - "message": "Ako za prijavu postoji autentifikatorski ključ, kopiraj TOTP kôd za provjeru u međuspremnik nakon auto-ispune prijave." + "message": "Ako za prijavu postoji ključ autentifikatora, kopiraj TOTP kôd za provjeru u međuspremnik nakon auto-ispune prijave." }, "enableAutoBiometricsPrompt": { "message": "Traži biometrijsku autentifikaciju pri pokretanju" @@ -2062,7 +2062,7 @@ "message": "Generator korisničkih imena" }, "useThisEmail": { - "message": "Use this email" + "message": "Koristi ovu e-poštu" }, "useThisPassword": { "message": "Koristi ovu lozinku" @@ -2343,7 +2343,7 @@ "description": "A category title describing the concept of web domains" }, "blockedDomains": { - "message": "Blocked domains" + "message": "Blokirane domene" }, "excludedDomains": { "message": "Izuzete domene" @@ -2355,13 +2355,77 @@ "message": "Bitwarden neće nuditi spremanje podataka za prijavu za ove domene za sve prijavljene račune. Moraš osvježiti stranicu kako bi promjene stupile na snagu." }, "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": "Auto-ispuna i druge vezane značajke neće biti ponuđene za ova web mjesta. Potrebno je osvježiti stranicu zaprimjenu postavki." }, "autofillBlockedNoticeV2": { - "message": "Autofill is blocked for this website." + "message": "Auto-ispuna je blokirana za ovu web stranicu." }, "autofillBlockedNoticeGuidance": { - "message": "Change this in settings" + "message": "Promijeni ovo u postavkama" + }, + "change": { + "message": "Change" + }, + "changeButtonTitle": { + "message": "Change password - $ITEMNAME$", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "atRiskPasswords": { + "message": "At-risk passwords" + }, + "atRiskPasswordsDescSingleOrg": { + "message": "$ORGANIZATION$ is requesting you change the $COUNT$ passwords because they are at risk.", + "placeholders": { + "organization": { + "content": "$1", + "example": "Acme Corp" + }, + "count": { + "content": "$2", + "example": "2" + } + } + }, + "atRiskPasswordsDescMultiOrg": { + "message": "Your organizations are requesting you change the $COUNT$ passwords because they are at risk.", + "placeholders": { + "count": { + "content": "$1", + "example": "2" + } + } + }, + "reviewAndChangeAtRiskPassword": { + "message": "Review and change one at-risk password" + }, + "reviewAndChangeAtRiskPasswordsPlural": { + "message": "Review and change $COUNT$ at-risk passwords", + "placeholders": { + "count": { + "content": "$1", + "example": "2" + } + } + }, + "changeAtRiskPasswordsFaster": { + "message": "Change at-risk passwords faster" + }, + "changeAtRiskPasswordsFasterDesc": { + "message": "Update your settings so you can quickly autofill your passwords and generate new ones" + }, + "turnOnAutofill": { + "message": "Turn on autofill" + }, + "turnedOnAutofill": { + "message": "Turned on autofill" + }, + "dismiss": { + "message": "Dismiss" }, "websiteItemLabel": { "message": "Web stranica $number$ (URI)", @@ -2382,7 +2446,7 @@ } }, "blockedDomainsSavedSuccess": { - "message": "Blocked domain changes saved" + "message": "Spremljene promjene blokiranih domena" }, "excludedDomainsSavedSuccess": { "message": "Spremljene promjene izuzete domene" @@ -2823,17 +2887,17 @@ "message": "Pogreška" }, "decryptionError": { - "message": "Decryption error" + "message": "Pogreška pri dešifriranju" }, "couldNotDecryptVaultItemsBelow": { - "message": "Bitwarden could not decrypt the vault item(s) listed below." + "message": "Bitwarden nije mogao dešifrirati sljedeće stavke trezora." }, "contactCSToAvoidDataLossPart1": { - "message": "Contact customer success", + "message": "Kontaktiraj službu za korisnike", "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": "kako bi izbjegli gubitak podataka.", "description": "This is part of a larger sentence. The full sentence will read 'Contact customer success to avoid additional data loss.'" }, "generateUsername": { @@ -3123,12 +3187,18 @@ "notificationSentDevice": { "message": "Obavijest je poslana na tvoj uređaj." }, + "notificationSentDevicePart1": { + "message": "Otključaj Bitwarden na svojem uređaju ili na" + }, + "notificationSentDeviceAnchor": { + "message": "web trezoru" + }, + "notificationSentDevicePart2": { + "message": "Provjeri slaže li se jedinstvena fraza s ovdje prikazanom prije odobravanja." + }, "aNotificationWasSentToYourDevice": { "message": "Obavijest je poslana na tvoj uređaj" }, - "makeSureYourAccountIsUnlockedAndTheFingerprintEtc": { - "message": "Provjeri je li trezor otključan i slaže li se jedinstvena fraza s drugim uređajem" - }, "youWillBeNotifiedOnceTheRequestIsApproved": { "message": "Dobiti ćeš obavijest kada je tvoj zahtjev odobren" }, @@ -3138,6 +3208,9 @@ "loginInitiated": { "message": "Prijava pokrenuta" }, + "logInRequestSent": { + "message": "Zahtjev poslan" + }, "exposedMasterPassword": { "message": "Ukradena glavna lozinka" }, @@ -3994,10 +4067,10 @@ "message": "Pristupni ključ uklonjen" }, "autofillSuggestions": { - "message": "Autofill suggestions" + "message": "Prijedlozi auto-ispune" }, "itemSuggestions": { - "message": "Suggested items" + "message": "Predložene stavke" }, "autofillSuggestionsTip": { "message": "Spremi u auto-ispunu stavku prijave za ovu stranicu" @@ -4146,15 +4219,6 @@ "itemName": { "message": "Naziv stavke" }, - "cannotRemoveViewOnlyCollections": { - "message": "S dopuštenjima samo za prikaz ne možeš ukloniti zbirke: $COLLECTIONS$", - "placeholders": { - "collections": { - "content": "$1", - "example": "Work, Personal" - } - } - }, "organizationIsDeactivated": { "message": "Organizacija je deaktivirana" }, @@ -4266,7 +4330,7 @@ "message": "Vjerodajnice za prijavu" }, "authenticatorKey": { - "message": "Kôd za provjeru" + "message": "Ključ autentifikatora" }, "autofillOptions": { "message": "Postavke auto-ispune" @@ -4654,22 +4718,22 @@ "message": "Nemaš prava za uređivanje ove stavke" }, "biometricsStatusHelptextUnlockNeeded": { - "message": "Biometric unlock is unavailable because PIN or password unlock is required first." + "message": "Biometrijsko otključavanje nije dostupno jer je prvo potrebno otključati PIN-om ili lozinkom." }, "biometricsStatusHelptextHardwareUnavailable": { - "message": "Biometric unlock is currently unavailable." + "message": "Biometrijsko otključavanje trenutno nije dostupno." }, "biometricsStatusHelptextAutoSetupNeeded": { - "message": "Biometric unlock is unavailable due to misconfigured system files." + "message": "Biometrijsko otključavanje nije dostupno zbog pogrešno konfiguriranih sistemskih datoteka." }, "biometricsStatusHelptextManualSetupNeeded": { - "message": "Biometric unlock is unavailable due to misconfigured system files." + "message": "Biometrijsko otključavanje nije dostupno zbog pogrešno konfiguriranih sistemskih datoteka." }, "biometricsStatusHelptextDesktopDisconnected": { - "message": "Biometric unlock is unavailable because the Bitwarden desktop app is closed." + "message": "Biometrijsko otključavanje nije dostupno jer je Bitwarden dekstop aplikacija zatvorena." }, "biometricsStatusHelptextNotEnabledInDesktop": { - "message": "Biometric unlock is unavailable because it is not enabled for $EMAIL$ in the Bitwarden desktop app.", + "message": "Biometrijsko otključavanje nije dostupno jer nije omogućeno za $EMAIL$ u Bitwarden desktop aplikaciji.", "placeholders": { "email": { "content": "$1", @@ -4678,7 +4742,7 @@ } }, "biometricsStatusHelptextUnavailableReasonUnknown": { - "message": "Biometric unlock is currently unavailable for an unknown reason." + "message": "Biometrijsko otključavanje trenutno nije dostupno iz nepoznatog razloga." }, "authenticating": { "message": "Autentifikacija" @@ -4887,10 +4951,19 @@ "extraWide": { "message": "Ekstra široko" }, + "cannotRemoveViewOnlyCollections": { + "message": "S dopuštenjima samo za prikaz ne možeš ukloniti zbirke: $COLLECTIONS$", + "placeholders": { + "collections": { + "content": "$1", + "example": "Work, Personal" + } + } + }, "updateDesktopAppOrDisableFingerprintDialogTitle": { - "message": "Please update your desktop application" + "message": "Molimo, ažuriraj svoju desktop aplikaciju" }, "updateDesktopAppOrDisableFingerprintDialogMessage": { - "message": "To use biometric unlock, please update your desktop application, or disable fingerprint unlock in the desktop settings." + "message": "Za korištenje biometrijskog otključavanja ažuriraj desktop aplikaciju ili nemogući otključavanje otiskom prsta u desktop aplikaciji." } } diff --git a/apps/browser/src/_locales/hu/messages.json b/apps/browser/src/_locales/hu/messages.json index 9ac2cea07ce..4a56787d919 100644 --- a/apps/browser/src/_locales/hu/messages.json +++ b/apps/browser/src/_locales/hu/messages.json @@ -2363,6 +2363,70 @@ "autofillBlockedNoticeGuidance": { "message": "Megváltoztatás a beállításokban" }, + "change": { + "message": "Módosítás" + }, + "changeButtonTitle": { + "message": "Jelszó módosítás - $ITEMNAME$", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "atRiskPasswords": { + "message": "Veszélyes jelszavak" + }, + "atRiskPasswordsDescSingleOrg": { + "message": "$ORGANIZATION$ $COUNT$ jelszó meegváltoztatását kéri, mert veszélyben vannak.", + "placeholders": { + "organization": { + "content": "$1", + "example": "Acme Corp" + }, + "count": { + "content": "$2", + "example": "2" + } + } + }, + "atRiskPasswordsDescMultiOrg": { + "message": "A szervezetek $COUNT$ jelszó meegváltoztatását kérik, mert veszélyben vannak.", + "placeholders": { + "count": { + "content": "$1", + "example": "2" + } + } + }, + "reviewAndChangeAtRiskPassword": { + "message": "Tekintsük át és módosítsuk az egyik veszélyeztetett jelszót." + }, + "reviewAndChangeAtRiskPasswordsPlural": { + "message": "Tekintsük át és módosítsunk $COUNT$ kockázatnak kitett jelszót.", + "placeholders": { + "count": { + "content": "$1", + "example": "2" + } + } + }, + "changeAtRiskPasswordsFaster": { + "message": "Változtassuk meg gyorsabban a veszélyeztetett jelszavakat." + }, + "changeAtRiskPasswordsFasterDesc": { + "message": "Frissítsük a beállításokat, hogy gyorsan automatikusan kitölthessük a jelszavakat és újakat generálhassunk." + }, + "turnOnAutofill": { + "message": "Automatikus kitöltés bekapcsolása" + }, + "turnedOnAutofill": { + "message": "Az automatikus kitöltés bekapcsolásra került." + }, + "dismiss": { + "message": "Elvetés" + }, "websiteItemLabel": { "message": "Webhely $number$ (URI)", "placeholders": { @@ -3123,12 +3187,18 @@ "notificationSentDevice": { "message": "Egy értesítés lett elküldve az eszközre." }, + "notificationSentDevicePart1": { + "message": "A Bitwarden zárolás feloldása az eszközön vagy: " + }, + "notificationSentDeviceAnchor": { + "message": "webalkalmazás" + }, + "notificationSentDevicePart2": { + "message": "Jóváhagyás előtt győződjünk meg arról, hogy az ujjlenyomat kifejezés megegyezik az alábbi kifejezéssel." + }, "aNotificationWasSentToYourDevice": { "message": "Egy értesítés lett elküldve az eszközre." }, - "makeSureYourAccountIsUnlockedAndTheFingerprintEtc": { - "message": "Ellenőrizzük, hogy a széf feloldásra került és az ujjlenyomat kifejezés egyezik a másik eszközön levővel." - }, "youWillBeNotifiedOnceTheRequestIsApproved": { "message": "A kérelem jóváhagyása után értesítés érkezik." }, @@ -3138,6 +3208,9 @@ "loginInitiated": { "message": "A bejelentkezés elindításra került." }, + "logInRequestSent": { + "message": "A kérés elküldésre került." + }, "exposedMasterPassword": { "message": "Kiszivárgott mesterjelszó" }, @@ -4146,15 +4219,6 @@ "itemName": { "message": "Elem neve" }, - "cannotRemoveViewOnlyCollections": { - "message": "Nem távolíthatók el a csak megtekintési engedéllyel bíró gyűjtemények: $COLLECTIONS$", - "placeholders": { - "collections": { - "content": "$1", - "example": "Work, Personal" - } - } - }, "organizationIsDeactivated": { "message": "Organization is deactivated" }, @@ -4887,6 +4951,15 @@ "extraWide": { "message": "Extra széles" }, + "cannotRemoveViewOnlyCollections": { + "message": "Nem távolíthatók el a csak megtekintési engedéllyel bíró gyűjtemények: $COLLECTIONS$", + "placeholders": { + "collections": { + "content": "$1", + "example": "Work, Personal" + } + } + }, "updateDesktopAppOrDisableFingerprintDialogTitle": { "message": "Frissítsük az asztali alkalmazást." }, diff --git a/apps/browser/src/_locales/id/messages.json b/apps/browser/src/_locales/id/messages.json index b059303d5a2..8f3a8d5a49b 100644 --- a/apps/browser/src/_locales/id/messages.json +++ b/apps/browser/src/_locales/id/messages.json @@ -2363,6 +2363,70 @@ "autofillBlockedNoticeGuidance": { "message": "Change this in settings" }, + "change": { + "message": "Change" + }, + "changeButtonTitle": { + "message": "Change password - $ITEMNAME$", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "atRiskPasswords": { + "message": "At-risk passwords" + }, + "atRiskPasswordsDescSingleOrg": { + "message": "$ORGANIZATION$ is requesting you change the $COUNT$ passwords because they are at risk.", + "placeholders": { + "organization": { + "content": "$1", + "example": "Acme Corp" + }, + "count": { + "content": "$2", + "example": "2" + } + } + }, + "atRiskPasswordsDescMultiOrg": { + "message": "Your organizations are requesting you change the $COUNT$ passwords because they are at risk.", + "placeholders": { + "count": { + "content": "$1", + "example": "2" + } + } + }, + "reviewAndChangeAtRiskPassword": { + "message": "Review and change one at-risk password" + }, + "reviewAndChangeAtRiskPasswordsPlural": { + "message": "Review and change $COUNT$ at-risk passwords", + "placeholders": { + "count": { + "content": "$1", + "example": "2" + } + } + }, + "changeAtRiskPasswordsFaster": { + "message": "Change at-risk passwords faster" + }, + "changeAtRiskPasswordsFasterDesc": { + "message": "Update your settings so you can quickly autofill your passwords and generate new ones" + }, + "turnOnAutofill": { + "message": "Turn on autofill" + }, + "turnedOnAutofill": { + "message": "Turned on autofill" + }, + "dismiss": { + "message": "Dismiss" + }, "websiteItemLabel": { "message": "Situs web $number$ (URI)", "placeholders": { @@ -3123,12 +3187,18 @@ "notificationSentDevice": { "message": "Sebuah pemberitahuan dikirim ke perangkat Anda." }, + "notificationSentDevicePart1": { + "message": "Unlock Bitwarden on your device or on the" + }, + "notificationSentDeviceAnchor": { + "message": "web app" + }, + "notificationSentDevicePart2": { + "message": "Make sure the Fingerprint phrase matches the one below before approving." + }, "aNotificationWasSentToYourDevice": { "message": "Sebuah pemberitahuan telah dikirim ke perangkat Anda" }, - "makeSureYourAccountIsUnlockedAndTheFingerprintEtc": { - "message": "Pastikan akun Anda terbuka dan frasa sidik jari cocok pada perangkat lainnya" - }, "youWillBeNotifiedOnceTheRequestIsApproved": { "message": "Anda akan diberitahu setelah permintaan disetujui" }, @@ -3138,6 +3208,9 @@ "loginInitiated": { "message": "Memulai login" }, + "logInRequestSent": { + "message": "Request sent" + }, "exposedMasterPassword": { "message": "Kata Sandi Utama yang Terpapar" }, @@ -4146,15 +4219,6 @@ "itemName": { "message": "Nama benda" }, - "cannotRemoveViewOnlyCollections": { - "message": "Anda tidak dapat menghapus koleksi dengan izin hanya lihat: $COLLECTIONS$", - "placeholders": { - "collections": { - "content": "$1", - "example": "Work, Personal" - } - } - }, "organizationIsDeactivated": { "message": "Organisasi dinonaktifkan" }, @@ -4887,6 +4951,15 @@ "extraWide": { "message": "Ekstra lebar" }, + "cannotRemoveViewOnlyCollections": { + "message": "Anda tidak dapat menghapus koleksi dengan izin hanya lihat: $COLLECTIONS$", + "placeholders": { + "collections": { + "content": "$1", + "example": "Work, Personal" + } + } + }, "updateDesktopAppOrDisableFingerprintDialogTitle": { "message": "Please update your desktop application" }, diff --git a/apps/browser/src/_locales/it/messages.json b/apps/browser/src/_locales/it/messages.json index 0765cd0e419..62303f90021 100644 --- a/apps/browser/src/_locales/it/messages.json +++ b/apps/browser/src/_locales/it/messages.json @@ -2363,6 +2363,70 @@ "autofillBlockedNoticeGuidance": { "message": "Modifica questo nelle impostazioni" }, + "change": { + "message": "Cambia" + }, + "changeButtonTitle": { + "message": "Cambia parola d'accesso - $ITEMNAME$", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "atRiskPasswords": { + "message": "Parola d'accesso a rischio" + }, + "atRiskPasswordsDescSingleOrg": { + "message": "$ORGANIZATION$ ti sta richiedendo di modificare $COUNT$ parole d'accesso perché sono a rischio.", + "placeholders": { + "organization": { + "content": "$1", + "example": "Acme Corp" + }, + "count": { + "content": "$2", + "example": "2" + } + } + }, + "atRiskPasswordsDescMultiOrg": { + "message": "Le tue organizzazioni ti chiedono di modificare le $COUNT$ parole d'accesso perché sono a rischio.", + "placeholders": { + "count": { + "content": "$1", + "example": "2" + } + } + }, + "reviewAndChangeAtRiskPassword": { + "message": "Rivedi e modifica una parola d'accesso a rischio" + }, + "reviewAndChangeAtRiskPasswordsPlural": { + "message": "Rivedi e modifica $COUNT$ parole d'accesso a rischio", + "placeholders": { + "count": { + "content": "$1", + "example": "2" + } + } + }, + "changeAtRiskPasswordsFaster": { + "message": "Cambia le parole d'accesso a rischio più velocemente" + }, + "changeAtRiskPasswordsFasterDesc": { + "message": "Aggiorna le impostazioni in modo da poter rapidamente riempire automaticamente le parole d'accesso e generarne di nuove" + }, + "turnOnAutofill": { + "message": "Attiva riempimento automatico" + }, + "turnedOnAutofill": { + "message": "Riempimento automatico attivato" + }, + "dismiss": { + "message": "Ignora" + }, "websiteItemLabel": { "message": "Sito $number$ (URI)", "placeholders": { @@ -3123,12 +3187,18 @@ "notificationSentDevice": { "message": "Una notifica è stata inviata al tuo dispositivo." }, + "notificationSentDevicePart1": { + "message": "Sblocca Bitwarden sul tuo dispositivo o su" + }, + "notificationSentDeviceAnchor": { + "message": "app web" + }, + "notificationSentDevicePart2": { + "message": "Assicurarsi che la frase di impronta digitale corrisponda a quella sottostante prima dell'approvazione." + }, "aNotificationWasSentToYourDevice": { "message": "Una notifica è stata inviata al tuo dispositivo" }, - "makeSureYourAccountIsUnlockedAndTheFingerprintEtc": { - "message": "Assicurati che il tuo account sia sbloccato e che la frase dell'impronta digitale corrisponda nell'altro dispositivo" - }, "youWillBeNotifiedOnceTheRequestIsApproved": { "message": "Sarai notificato una volta che la richiesta sarà approvata" }, @@ -3138,6 +3208,9 @@ "loginInitiated": { "message": "Accesso avviato" }, + "logInRequestSent": { + "message": "Richiesta inviata" + }, "exposedMasterPassword": { "message": "Password principale violata" }, @@ -4146,15 +4219,6 @@ "itemName": { "message": "Nome elemento" }, - "cannotRemoveViewOnlyCollections": { - "message": "Non puoi rimuovere raccolte con i soli permessi di visualizzazione: $COLLECTIONS$", - "placeholders": { - "collections": { - "content": "$1", - "example": "Work, Personal" - } - } - }, "organizationIsDeactivated": { "message": "L'organizzazione è disattivata" }, @@ -4887,6 +4951,15 @@ "extraWide": { "message": "Molto larga" }, + "cannotRemoveViewOnlyCollections": { + "message": "Non puoi rimuovere raccolte con i soli permessi di visualizzazione: $COLLECTIONS$", + "placeholders": { + "collections": { + "content": "$1", + "example": "Work, Personal" + } + } + }, "updateDesktopAppOrDisableFingerprintDialogTitle": { "message": "Aggiornare l'applicazione desktop" }, diff --git a/apps/browser/src/_locales/ja/messages.json b/apps/browser/src/_locales/ja/messages.json index fb927551b30..706fe156879 100644 --- a/apps/browser/src/_locales/ja/messages.json +++ b/apps/browser/src/_locales/ja/messages.json @@ -2363,6 +2363,70 @@ "autofillBlockedNoticeGuidance": { "message": "Change this in settings" }, + "change": { + "message": "Change" + }, + "changeButtonTitle": { + "message": "Change password - $ITEMNAME$", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "atRiskPasswords": { + "message": "At-risk passwords" + }, + "atRiskPasswordsDescSingleOrg": { + "message": "$ORGANIZATION$ is requesting you change the $COUNT$ passwords because they are at risk.", + "placeholders": { + "organization": { + "content": "$1", + "example": "Acme Corp" + }, + "count": { + "content": "$2", + "example": "2" + } + } + }, + "atRiskPasswordsDescMultiOrg": { + "message": "Your organizations are requesting you change the $COUNT$ passwords because they are at risk.", + "placeholders": { + "count": { + "content": "$1", + "example": "2" + } + } + }, + "reviewAndChangeAtRiskPassword": { + "message": "Review and change one at-risk password" + }, + "reviewAndChangeAtRiskPasswordsPlural": { + "message": "Review and change $COUNT$ at-risk passwords", + "placeholders": { + "count": { + "content": "$1", + "example": "2" + } + } + }, + "changeAtRiskPasswordsFaster": { + "message": "Change at-risk passwords faster" + }, + "changeAtRiskPasswordsFasterDesc": { + "message": "Update your settings so you can quickly autofill your passwords and generate new ones" + }, + "turnOnAutofill": { + "message": "Turn on autofill" + }, + "turnedOnAutofill": { + "message": "Turned on autofill" + }, + "dismiss": { + "message": "Dismiss" + }, "websiteItemLabel": { "message": "ウェブサイト $number$ (URI)", "placeholders": { @@ -3123,12 +3187,18 @@ "notificationSentDevice": { "message": "デバイスに通知を送信しました。" }, + "notificationSentDevicePart1": { + "message": "Unlock Bitwarden on your device or on the" + }, + "notificationSentDeviceAnchor": { + "message": "web app" + }, + "notificationSentDevicePart2": { + "message": "Make sure the Fingerprint phrase matches the one below before approving." + }, "aNotificationWasSentToYourDevice": { "message": "お使いのデバイスに通知が送信されました" }, - "makeSureYourAccountIsUnlockedAndTheFingerprintEtc": { - "message": "アカウントがロック解除されていることと、フィンガープリントフレーズが他の端末で一致していることを確認してください" - }, "youWillBeNotifiedOnceTheRequestIsApproved": { "message": "リクエストが承認されると通知されます" }, @@ -3138,6 +3208,9 @@ "loginInitiated": { "message": "ログイン開始" }, + "logInRequestSent": { + "message": "Request sent" + }, "exposedMasterPassword": { "message": "流出したマスターパスワード" }, @@ -4146,15 +4219,6 @@ "itemName": { "message": "アイテム名" }, - "cannotRemoveViewOnlyCollections": { - "message": "表示のみの権限が与えられているコレクションを削除することはできません: $COLLECTIONS$", - "placeholders": { - "collections": { - "content": "$1", - "example": "Work, Personal" - } - } - }, "organizationIsDeactivated": { "message": "組織は無効化されています" }, @@ -4887,6 +4951,15 @@ "extraWide": { "message": "エクストラワイド" }, + "cannotRemoveViewOnlyCollections": { + "message": "表示のみの権限が与えられているコレクションを削除することはできません: $COLLECTIONS$", + "placeholders": { + "collections": { + "content": "$1", + "example": "Work, Personal" + } + } + }, "updateDesktopAppOrDisableFingerprintDialogTitle": { "message": "Please update your desktop application" }, diff --git a/apps/browser/src/_locales/ka/messages.json b/apps/browser/src/_locales/ka/messages.json index b1c5b7a5e58..e7f8f721640 100644 --- a/apps/browser/src/_locales/ka/messages.json +++ b/apps/browser/src/_locales/ka/messages.json @@ -2363,6 +2363,70 @@ "autofillBlockedNoticeGuidance": { "message": "Change this in settings" }, + "change": { + "message": "Change" + }, + "changeButtonTitle": { + "message": "Change password - $ITEMNAME$", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "atRiskPasswords": { + "message": "At-risk passwords" + }, + "atRiskPasswordsDescSingleOrg": { + "message": "$ORGANIZATION$ is requesting you change the $COUNT$ passwords because they are at risk.", + "placeholders": { + "organization": { + "content": "$1", + "example": "Acme Corp" + }, + "count": { + "content": "$2", + "example": "2" + } + } + }, + "atRiskPasswordsDescMultiOrg": { + "message": "Your organizations are requesting you change the $COUNT$ passwords because they are at risk.", + "placeholders": { + "count": { + "content": "$1", + "example": "2" + } + } + }, + "reviewAndChangeAtRiskPassword": { + "message": "Review and change one at-risk password" + }, + "reviewAndChangeAtRiskPasswordsPlural": { + "message": "Review and change $COUNT$ at-risk passwords", + "placeholders": { + "count": { + "content": "$1", + "example": "2" + } + } + }, + "changeAtRiskPasswordsFaster": { + "message": "Change at-risk passwords faster" + }, + "changeAtRiskPasswordsFasterDesc": { + "message": "Update your settings so you can quickly autofill your passwords and generate new ones" + }, + "turnOnAutofill": { + "message": "Turn on autofill" + }, + "turnedOnAutofill": { + "message": "Turned on autofill" + }, + "dismiss": { + "message": "Dismiss" + }, "websiteItemLabel": { "message": "Website $number$ (URI)", "placeholders": { @@ -3123,12 +3187,18 @@ "notificationSentDevice": { "message": "A notification has been sent to your device." }, + "notificationSentDevicePart1": { + "message": "Unlock Bitwarden on your device or on the" + }, + "notificationSentDeviceAnchor": { + "message": "web app" + }, + "notificationSentDevicePart2": { + "message": "Make sure the Fingerprint phrase matches the one below before approving." + }, "aNotificationWasSentToYourDevice": { "message": "A notification was sent to your device" }, - "makeSureYourAccountIsUnlockedAndTheFingerprintEtc": { - "message": "Make sure your account is unlocked and the fingerprint phrase matches on the other device" - }, "youWillBeNotifiedOnceTheRequestIsApproved": { "message": "You will be notified once the request is approved" }, @@ -3138,6 +3208,9 @@ "loginInitiated": { "message": "Login initiated" }, + "logInRequestSent": { + "message": "Request sent" + }, "exposedMasterPassword": { "message": "Exposed Master Password" }, @@ -4146,15 +4219,6 @@ "itemName": { "message": "ჩანაწერის სახელი" }, - "cannotRemoveViewOnlyCollections": { - "message": "You cannot remove collections with View only permissions: $COLLECTIONS$", - "placeholders": { - "collections": { - "content": "$1", - "example": "Work, Personal" - } - } - }, "organizationIsDeactivated": { "message": "Organization is deactivated" }, @@ -4887,6 +4951,15 @@ "extraWide": { "message": "Extra wide" }, + "cannotRemoveViewOnlyCollections": { + "message": "You cannot remove collections with View only permissions: $COLLECTIONS$", + "placeholders": { + "collections": { + "content": "$1", + "example": "Work, Personal" + } + } + }, "updateDesktopAppOrDisableFingerprintDialogTitle": { "message": "Please update your desktop application" }, diff --git a/apps/browser/src/_locales/km/messages.json b/apps/browser/src/_locales/km/messages.json index eb44a6806d1..33ba50ddab4 100644 --- a/apps/browser/src/_locales/km/messages.json +++ b/apps/browser/src/_locales/km/messages.json @@ -2363,6 +2363,70 @@ "autofillBlockedNoticeGuidance": { "message": "Change this in settings" }, + "change": { + "message": "Change" + }, + "changeButtonTitle": { + "message": "Change password - $ITEMNAME$", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "atRiskPasswords": { + "message": "At-risk passwords" + }, + "atRiskPasswordsDescSingleOrg": { + "message": "$ORGANIZATION$ is requesting you change the $COUNT$ passwords because they are at risk.", + "placeholders": { + "organization": { + "content": "$1", + "example": "Acme Corp" + }, + "count": { + "content": "$2", + "example": "2" + } + } + }, + "atRiskPasswordsDescMultiOrg": { + "message": "Your organizations are requesting you change the $COUNT$ passwords because they are at risk.", + "placeholders": { + "count": { + "content": "$1", + "example": "2" + } + } + }, + "reviewAndChangeAtRiskPassword": { + "message": "Review and change one at-risk password" + }, + "reviewAndChangeAtRiskPasswordsPlural": { + "message": "Review and change $COUNT$ at-risk passwords", + "placeholders": { + "count": { + "content": "$1", + "example": "2" + } + } + }, + "changeAtRiskPasswordsFaster": { + "message": "Change at-risk passwords faster" + }, + "changeAtRiskPasswordsFasterDesc": { + "message": "Update your settings so you can quickly autofill your passwords and generate new ones" + }, + "turnOnAutofill": { + "message": "Turn on autofill" + }, + "turnedOnAutofill": { + "message": "Turned on autofill" + }, + "dismiss": { + "message": "Dismiss" + }, "websiteItemLabel": { "message": "Website $number$ (URI)", "placeholders": { @@ -3123,12 +3187,18 @@ "notificationSentDevice": { "message": "A notification has been sent to your device." }, + "notificationSentDevicePart1": { + "message": "Unlock Bitwarden on your device or on the" + }, + "notificationSentDeviceAnchor": { + "message": "web app" + }, + "notificationSentDevicePart2": { + "message": "Make sure the Fingerprint phrase matches the one below before approving." + }, "aNotificationWasSentToYourDevice": { "message": "A notification was sent to your device" }, - "makeSureYourAccountIsUnlockedAndTheFingerprintEtc": { - "message": "Make sure your account is unlocked and the fingerprint phrase matches on the other device" - }, "youWillBeNotifiedOnceTheRequestIsApproved": { "message": "You will be notified once the request is approved" }, @@ -3138,6 +3208,9 @@ "loginInitiated": { "message": "Login initiated" }, + "logInRequestSent": { + "message": "Request sent" + }, "exposedMasterPassword": { "message": "Exposed Master Password" }, @@ -4146,15 +4219,6 @@ "itemName": { "message": "Item name" }, - "cannotRemoveViewOnlyCollections": { - "message": "You cannot remove collections with View only permissions: $COLLECTIONS$", - "placeholders": { - "collections": { - "content": "$1", - "example": "Work, Personal" - } - } - }, "organizationIsDeactivated": { "message": "Organization is deactivated" }, @@ -4887,6 +4951,15 @@ "extraWide": { "message": "Extra wide" }, + "cannotRemoveViewOnlyCollections": { + "message": "You cannot remove collections with View only permissions: $COLLECTIONS$", + "placeholders": { + "collections": { + "content": "$1", + "example": "Work, Personal" + } + } + }, "updateDesktopAppOrDisableFingerprintDialogTitle": { "message": "Please update your desktop application" }, diff --git a/apps/browser/src/_locales/kn/messages.json b/apps/browser/src/_locales/kn/messages.json index 69d05d03fe6..83ed983db46 100644 --- a/apps/browser/src/_locales/kn/messages.json +++ b/apps/browser/src/_locales/kn/messages.json @@ -2363,6 +2363,70 @@ "autofillBlockedNoticeGuidance": { "message": "Change this in settings" }, + "change": { + "message": "Change" + }, + "changeButtonTitle": { + "message": "Change password - $ITEMNAME$", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "atRiskPasswords": { + "message": "At-risk passwords" + }, + "atRiskPasswordsDescSingleOrg": { + "message": "$ORGANIZATION$ is requesting you change the $COUNT$ passwords because they are at risk.", + "placeholders": { + "organization": { + "content": "$1", + "example": "Acme Corp" + }, + "count": { + "content": "$2", + "example": "2" + } + } + }, + "atRiskPasswordsDescMultiOrg": { + "message": "Your organizations are requesting you change the $COUNT$ passwords because they are at risk.", + "placeholders": { + "count": { + "content": "$1", + "example": "2" + } + } + }, + "reviewAndChangeAtRiskPassword": { + "message": "Review and change one at-risk password" + }, + "reviewAndChangeAtRiskPasswordsPlural": { + "message": "Review and change $COUNT$ at-risk passwords", + "placeholders": { + "count": { + "content": "$1", + "example": "2" + } + } + }, + "changeAtRiskPasswordsFaster": { + "message": "Change at-risk passwords faster" + }, + "changeAtRiskPasswordsFasterDesc": { + "message": "Update your settings so you can quickly autofill your passwords and generate new ones" + }, + "turnOnAutofill": { + "message": "Turn on autofill" + }, + "turnedOnAutofill": { + "message": "Turned on autofill" + }, + "dismiss": { + "message": "Dismiss" + }, "websiteItemLabel": { "message": "Website $number$ (URI)", "placeholders": { @@ -3123,12 +3187,18 @@ "notificationSentDevice": { "message": "A notification has been sent to your device." }, + "notificationSentDevicePart1": { + "message": "Unlock Bitwarden on your device or on the" + }, + "notificationSentDeviceAnchor": { + "message": "web app" + }, + "notificationSentDevicePart2": { + "message": "Make sure the Fingerprint phrase matches the one below before approving." + }, "aNotificationWasSentToYourDevice": { "message": "A notification was sent to your device" }, - "makeSureYourAccountIsUnlockedAndTheFingerprintEtc": { - "message": "Make sure your account is unlocked and the fingerprint phrase matches on the other device" - }, "youWillBeNotifiedOnceTheRequestIsApproved": { "message": "You will be notified once the request is approved" }, @@ -3138,6 +3208,9 @@ "loginInitiated": { "message": "Login initiated" }, + "logInRequestSent": { + "message": "Request sent" + }, "exposedMasterPassword": { "message": "Exposed Master Password" }, @@ -4146,15 +4219,6 @@ "itemName": { "message": "Item name" }, - "cannotRemoveViewOnlyCollections": { - "message": "You cannot remove collections with View only permissions: $COLLECTIONS$", - "placeholders": { - "collections": { - "content": "$1", - "example": "Work, Personal" - } - } - }, "organizationIsDeactivated": { "message": "Organization is deactivated" }, @@ -4887,6 +4951,15 @@ "extraWide": { "message": "Extra wide" }, + "cannotRemoveViewOnlyCollections": { + "message": "You cannot remove collections with View only permissions: $COLLECTIONS$", + "placeholders": { + "collections": { + "content": "$1", + "example": "Work, Personal" + } + } + }, "updateDesktopAppOrDisableFingerprintDialogTitle": { "message": "Please update your desktop application" }, diff --git a/apps/browser/src/_locales/ko/messages.json b/apps/browser/src/_locales/ko/messages.json index 93cde61315c..305580ad0d3 100644 --- a/apps/browser/src/_locales/ko/messages.json +++ b/apps/browser/src/_locales/ko/messages.json @@ -1005,7 +1005,7 @@ "message": "보관함에 항목이 없을 경우 추가하라는 메시지를 표시합니다. 모든 로그인된 계정에 적용됩니다." }, "showCardsInVaultViewV2": { - "message": "Always show cards as Autofill suggestions on Vault view" + "message": "보관함 보기에서 언제나 카드 자동 완성 제안을 표시" }, "showCardsCurrentTab": { "message": "탭 페이지에 카드 표시" @@ -1014,7 +1014,7 @@ "message": "간편한 자동완성을 위해 탭에 카드 항목들을 나열" }, "showIdentitiesInVaultViewV2": { - "message": "Always show identities as Autofill suggestions on Vault view" + "message": "보관함 보기에서 언제나 신원의 자동 완성 제안을 표시" }, "showIdentitiesCurrentTab": { "message": "탭 페이지에 신원들을 표시" @@ -1125,10 +1125,10 @@ "message": "이 비밀번호는 이 파일을 파일 내보내거나, 가져오는데 사용됩니다." }, "accountRestrictedOptionDescription": { - "message": "계정의 사용자 이름과 마스터 비밀번호에서 파생된 계정 암호화 키를 사용하여 내보내기를 암호화하고, 현재 Bitwarden계정으만 가져오기를 제한합니다." + "message": "내보내기를 당신의 계정의 사용자이름과 마스터비밀번호로부터 파생된 계정 암호화 키를 사용하여 암호화하고, 현재의 Bitwarden 계정으로만 가져오도록 제한합니다." }, "passwordProtectedOptionDescription": { - "message": "파일 비밀번호를 설정하여 내보내기를 암호화하고, 어느 Bitwarden 계정으로든 해독에 그 파일 비밀번호를 사용하여 가져오세요." + "message": "파일에 비밀번호를 설정하여 내보내기를 암호화하고, 어느 Bitwarden 계정으로든 그 비밀번호로 해독하여 가져오기 합니다." }, "exportTypeHeading": { "message": "내보내기 유형" @@ -2363,6 +2363,70 @@ "autofillBlockedNoticeGuidance": { "message": "Change this in settings" }, + "change": { + "message": "Change" + }, + "changeButtonTitle": { + "message": "Change password - $ITEMNAME$", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "atRiskPasswords": { + "message": "At-risk passwords" + }, + "atRiskPasswordsDescSingleOrg": { + "message": "$ORGANIZATION$ is requesting you change the $COUNT$ passwords because they are at risk.", + "placeholders": { + "organization": { + "content": "$1", + "example": "Acme Corp" + }, + "count": { + "content": "$2", + "example": "2" + } + } + }, + "atRiskPasswordsDescMultiOrg": { + "message": "Your organizations are requesting you change the $COUNT$ passwords because they are at risk.", + "placeholders": { + "count": { + "content": "$1", + "example": "2" + } + } + }, + "reviewAndChangeAtRiskPassword": { + "message": "Review and change one at-risk password" + }, + "reviewAndChangeAtRiskPasswordsPlural": { + "message": "Review and change $COUNT$ at-risk passwords", + "placeholders": { + "count": { + "content": "$1", + "example": "2" + } + } + }, + "changeAtRiskPasswordsFaster": { + "message": "Change at-risk passwords faster" + }, + "changeAtRiskPasswordsFasterDesc": { + "message": "Update your settings so you can quickly autofill your passwords and generate new ones" + }, + "turnOnAutofill": { + "message": "Turn on autofill" + }, + "turnedOnAutofill": { + "message": "Turned on autofill" + }, + "dismiss": { + "message": "Dismiss" + }, "websiteItemLabel": { "message": "웹사이트 $number$ (URI)", "placeholders": { @@ -3123,12 +3187,18 @@ "notificationSentDevice": { "message": "기기에 알림이 전송되었습니다." }, + "notificationSentDevicePart1": { + "message": "Unlock Bitwarden on your device or on the" + }, + "notificationSentDeviceAnchor": { + "message": "web app" + }, + "notificationSentDevicePart2": { + "message": "Make sure the Fingerprint phrase matches the one below before approving." + }, "aNotificationWasSentToYourDevice": { "message": "기기에 알림이 전송되었습니다." }, - "makeSureYourAccountIsUnlockedAndTheFingerprintEtc": { - "message": "반드시 계정이 잠금 해제되었고, 지문 구절이 다른 기기에서 일치하는지 확인해주세요." - }, "youWillBeNotifiedOnceTheRequestIsApproved": { "message": "요청이 승인되면 알림을 받게 됩니다" }, @@ -3138,6 +3208,9 @@ "loginInitiated": { "message": "로그인 시작" }, + "logInRequestSent": { + "message": "Request sent" + }, "exposedMasterPassword": { "message": "노출된 마스터 비밀번호" }, @@ -3994,7 +4067,7 @@ "message": "패스키 제거됨" }, "autofillSuggestions": { - "message": "Autofill suggestions" + "message": "자동 완성 제안" }, "itemSuggestions": { "message": "Suggested items" @@ -4146,15 +4219,6 @@ "itemName": { "message": "항목 이름" }, - "cannotRemoveViewOnlyCollections": { - "message": "보기 권한만 있는 컬렉션은 제거할 수 없습니다: $COLLECTIONS$", - "placeholders": { - "collections": { - "content": "$1", - "example": "Work, Personal" - } - } - }, "organizationIsDeactivated": { "message": "조직이 비활성화되었습니다" }, @@ -4887,6 +4951,15 @@ "extraWide": { "message": "매우 넓게" }, + "cannotRemoveViewOnlyCollections": { + "message": "보기 권한만 있는 컬렉션은 제거할 수 없습니다: $COLLECTIONS$", + "placeholders": { + "collections": { + "content": "$1", + "example": "Work, Personal" + } + } + }, "updateDesktopAppOrDisableFingerprintDialogTitle": { "message": "Please update your desktop application" }, diff --git a/apps/browser/src/_locales/lt/messages.json b/apps/browser/src/_locales/lt/messages.json index bb3e7e2357c..8e0e0124c85 100644 --- a/apps/browser/src/_locales/lt/messages.json +++ b/apps/browser/src/_locales/lt/messages.json @@ -2363,6 +2363,70 @@ "autofillBlockedNoticeGuidance": { "message": "Change this in settings" }, + "change": { + "message": "Change" + }, + "changeButtonTitle": { + "message": "Change password - $ITEMNAME$", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "atRiskPasswords": { + "message": "At-risk passwords" + }, + "atRiskPasswordsDescSingleOrg": { + "message": "$ORGANIZATION$ is requesting you change the $COUNT$ passwords because they are at risk.", + "placeholders": { + "organization": { + "content": "$1", + "example": "Acme Corp" + }, + "count": { + "content": "$2", + "example": "2" + } + } + }, + "atRiskPasswordsDescMultiOrg": { + "message": "Your organizations are requesting you change the $COUNT$ passwords because they are at risk.", + "placeholders": { + "count": { + "content": "$1", + "example": "2" + } + } + }, + "reviewAndChangeAtRiskPassword": { + "message": "Review and change one at-risk password" + }, + "reviewAndChangeAtRiskPasswordsPlural": { + "message": "Review and change $COUNT$ at-risk passwords", + "placeholders": { + "count": { + "content": "$1", + "example": "2" + } + } + }, + "changeAtRiskPasswordsFaster": { + "message": "Change at-risk passwords faster" + }, + "changeAtRiskPasswordsFasterDesc": { + "message": "Update your settings so you can quickly autofill your passwords and generate new ones" + }, + "turnOnAutofill": { + "message": "Turn on autofill" + }, + "turnedOnAutofill": { + "message": "Turned on autofill" + }, + "dismiss": { + "message": "Dismiss" + }, "websiteItemLabel": { "message": "Website $number$ (URI)", "placeholders": { @@ -3123,12 +3187,18 @@ "notificationSentDevice": { "message": "A notification has been sent to your device." }, + "notificationSentDevicePart1": { + "message": "Unlock Bitwarden on your device or on the" + }, + "notificationSentDeviceAnchor": { + "message": "web app" + }, + "notificationSentDevicePart2": { + "message": "Make sure the Fingerprint phrase matches the one below before approving." + }, "aNotificationWasSentToYourDevice": { "message": "A notification was sent to your device" }, - "makeSureYourAccountIsUnlockedAndTheFingerprintEtc": { - "message": "Make sure your account is unlocked and the fingerprint phrase matches on the other device" - }, "youWillBeNotifiedOnceTheRequestIsApproved": { "message": "You will be notified once the request is approved" }, @@ -3138,6 +3208,9 @@ "loginInitiated": { "message": "Pradėtas prisijungimas" }, + "logInRequestSent": { + "message": "Request sent" + }, "exposedMasterPassword": { "message": "Exposed Master Password" }, @@ -4146,15 +4219,6 @@ "itemName": { "message": "Elemento pavadinimas" }, - "cannotRemoveViewOnlyCollections": { - "message": "Negalite pašalinti kolekcijų su Peržiūrėti tik leidimus: $COLLECTIONS$", - "placeholders": { - "collections": { - "content": "$1", - "example": "Work, Personal" - } - } - }, "organizationIsDeactivated": { "message": "Organization is deactivated" }, @@ -4887,6 +4951,15 @@ "extraWide": { "message": "Extra wide" }, + "cannotRemoveViewOnlyCollections": { + "message": "Negalite pašalinti kolekcijų su Peržiūrėti tik leidimus: $COLLECTIONS$", + "placeholders": { + "collections": { + "content": "$1", + "example": "Work, Personal" + } + } + }, "updateDesktopAppOrDisableFingerprintDialogTitle": { "message": "Please update your desktop application" }, diff --git a/apps/browser/src/_locales/lv/messages.json b/apps/browser/src/_locales/lv/messages.json index d256bed25a9..0a9904e23c4 100644 --- a/apps/browser/src/_locales/lv/messages.json +++ b/apps/browser/src/_locales/lv/messages.json @@ -2062,7 +2062,7 @@ "message": "Lietotājvārdu veidotājs" }, "useThisEmail": { - "message": "Use this email" + "message": "Izmantot šo e-pasta adresi" }, "useThisPassword": { "message": "Izmantot šo paroli" @@ -2363,6 +2363,70 @@ "autofillBlockedNoticeGuidance": { "message": "To var mainīt iestatījumos" }, + "change": { + "message": "Mainīt" + }, + "changeButtonTitle": { + "message": "Mainīt paroli - $ITEMNAME$", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "atRiskPasswords": { + "message": "Riskam pakļautās paroles" + }, + "atRiskPasswordsDescSingleOrg": { + "message": "$ORGANIZATION$ pieprasa mainīt $COUNT$ paroles, jo tās ir pakļautas riskam.", + "placeholders": { + "organization": { + "content": "$1", + "example": "Acme Corp" + }, + "count": { + "content": "$2", + "example": "2" + } + } + }, + "atRiskPasswordsDescMultiOrg": { + "message": "Apvienības pieprasa mainīt $COUNT$ paroles, jo tās ir pakļautas riskam.", + "placeholders": { + "count": { + "content": "$1", + "example": "2" + } + } + }, + "reviewAndChangeAtRiskPassword": { + "message": "Pārskatīt un mainīt vienu riskam pakļautu paroli" + }, + "reviewAndChangeAtRiskPasswordsPlural": { + "message": "Pārskatīt un mainīt $COUNT$ riskam pakļautās paroles", + "placeholders": { + "count": { + "content": "$1", + "example": "2" + } + } + }, + "changeAtRiskPasswordsFaster": { + "message": "Mainīt riskam pakļautās paroles ātrāk" + }, + "changeAtRiskPasswordsFasterDesc": { + "message": "Jāatjaunina savi iestatījumi, lai varētu veikli aizpildīt paroles automātiski un izveidot jaunas" + }, + "turnOnAutofill": { + "message": "Ieslēgt automātisko aizpildi" + }, + "turnedOnAutofill": { + "message": "Automātiskā aizpilde ieslēgta" + }, + "dismiss": { + "message": "Noraidīt" + }, "websiteItemLabel": { "message": "Tīmekļvietne $number$ (URI)", "placeholders": { @@ -3123,12 +3187,18 @@ "notificationSentDevice": { "message": "Uz ierīci ir nosūtīts paziņojums." }, + "notificationSentDevicePart1": { + "message": "Bitwarden jāatslēdz savā ierīcē vai" + }, + "notificationSentDeviceAnchor": { + "message": "tīmekļa lietotnē" + }, + "notificationSentDevicePart2": { + "message": "Pirms apstiprināšanas jāpārliecinās, ka pirkstu nospieduma vārdkopa atbilst zemāk esošajai." + }, "aNotificationWasSentToYourDevice": { "message": "Uz ierīci tika nosūtīts paziņojums" }, - "makeSureYourAccountIsUnlockedAndTheFingerprintEtc": { - "message": "Lūgums pārliecināties, ka konts ir atslēgts un atpazīšanas vārdkopa ir tāda pati arī otrā ierīcē" - }, "youWillBeNotifiedOnceTheRequestIsApproved": { "message": "Tiks paziņots, tiklīdz pieprasījums būs apstiprināts" }, @@ -3138,6 +3208,9 @@ "loginInitiated": { "message": "Uzsākta pieteikšanās" }, + "logInRequestSent": { + "message": "Pieprasījums nosūtīts" + }, "exposedMasterPassword": { "message": "Noplūdusi galvenā parole" }, @@ -4146,15 +4219,6 @@ "itemName": { "message": "Vienuma nosaukums" }, - "cannotRemoveViewOnlyCollections": { - "message": "Nevar noņemt krājumus ar tiesībām \"Tikai skatīt\": $COLLECTIONS$", - "placeholders": { - "collections": { - "content": "$1", - "example": "Work, Personal" - } - } - }, "organizationIsDeactivated": { "message": "Apvienība ir atspējota" }, @@ -4887,6 +4951,15 @@ "extraWide": { "message": "Ļoti plats" }, + "cannotRemoveViewOnlyCollections": { + "message": "Nevar noņemt krājumus ar tiesībām \"Tikai skatīt\": $COLLECTIONS$", + "placeholders": { + "collections": { + "content": "$1", + "example": "Work, Personal" + } + } + }, "updateDesktopAppOrDisableFingerprintDialogTitle": { "message": "Lūgums atjaunināt darbvirsmas lietotni" }, diff --git a/apps/browser/src/_locales/ml/messages.json b/apps/browser/src/_locales/ml/messages.json index b9d2858a5c9..e33dd435847 100644 --- a/apps/browser/src/_locales/ml/messages.json +++ b/apps/browser/src/_locales/ml/messages.json @@ -2363,6 +2363,70 @@ "autofillBlockedNoticeGuidance": { "message": "Change this in settings" }, + "change": { + "message": "Change" + }, + "changeButtonTitle": { + "message": "Change password - $ITEMNAME$", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "atRiskPasswords": { + "message": "At-risk passwords" + }, + "atRiskPasswordsDescSingleOrg": { + "message": "$ORGANIZATION$ is requesting you change the $COUNT$ passwords because they are at risk.", + "placeholders": { + "organization": { + "content": "$1", + "example": "Acme Corp" + }, + "count": { + "content": "$2", + "example": "2" + } + } + }, + "atRiskPasswordsDescMultiOrg": { + "message": "Your organizations are requesting you change the $COUNT$ passwords because they are at risk.", + "placeholders": { + "count": { + "content": "$1", + "example": "2" + } + } + }, + "reviewAndChangeAtRiskPassword": { + "message": "Review and change one at-risk password" + }, + "reviewAndChangeAtRiskPasswordsPlural": { + "message": "Review and change $COUNT$ at-risk passwords", + "placeholders": { + "count": { + "content": "$1", + "example": "2" + } + } + }, + "changeAtRiskPasswordsFaster": { + "message": "Change at-risk passwords faster" + }, + "changeAtRiskPasswordsFasterDesc": { + "message": "Update your settings so you can quickly autofill your passwords and generate new ones" + }, + "turnOnAutofill": { + "message": "Turn on autofill" + }, + "turnedOnAutofill": { + "message": "Turned on autofill" + }, + "dismiss": { + "message": "Dismiss" + }, "websiteItemLabel": { "message": "Website $number$ (URI)", "placeholders": { @@ -3123,12 +3187,18 @@ "notificationSentDevice": { "message": "A notification has been sent to your device." }, + "notificationSentDevicePart1": { + "message": "Unlock Bitwarden on your device or on the" + }, + "notificationSentDeviceAnchor": { + "message": "web app" + }, + "notificationSentDevicePart2": { + "message": "Make sure the Fingerprint phrase matches the one below before approving." + }, "aNotificationWasSentToYourDevice": { "message": "A notification was sent to your device" }, - "makeSureYourAccountIsUnlockedAndTheFingerprintEtc": { - "message": "Make sure your account is unlocked and the fingerprint phrase matches on the other device" - }, "youWillBeNotifiedOnceTheRequestIsApproved": { "message": "You will be notified once the request is approved" }, @@ -3138,6 +3208,9 @@ "loginInitiated": { "message": "Login initiated" }, + "logInRequestSent": { + "message": "Request sent" + }, "exposedMasterPassword": { "message": "Exposed Master Password" }, @@ -4146,15 +4219,6 @@ "itemName": { "message": "Item name" }, - "cannotRemoveViewOnlyCollections": { - "message": "You cannot remove collections with View only permissions: $COLLECTIONS$", - "placeholders": { - "collections": { - "content": "$1", - "example": "Work, Personal" - } - } - }, "organizationIsDeactivated": { "message": "Organization is deactivated" }, @@ -4887,6 +4951,15 @@ "extraWide": { "message": "Extra wide" }, + "cannotRemoveViewOnlyCollections": { + "message": "You cannot remove collections with View only permissions: $COLLECTIONS$", + "placeholders": { + "collections": { + "content": "$1", + "example": "Work, Personal" + } + } + }, "updateDesktopAppOrDisableFingerprintDialogTitle": { "message": "Please update your desktop application" }, diff --git a/apps/browser/src/_locales/mr/messages.json b/apps/browser/src/_locales/mr/messages.json index 501f02e4e54..9af8fb24289 100644 --- a/apps/browser/src/_locales/mr/messages.json +++ b/apps/browser/src/_locales/mr/messages.json @@ -2363,6 +2363,70 @@ "autofillBlockedNoticeGuidance": { "message": "Change this in settings" }, + "change": { + "message": "Change" + }, + "changeButtonTitle": { + "message": "Change password - $ITEMNAME$", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "atRiskPasswords": { + "message": "At-risk passwords" + }, + "atRiskPasswordsDescSingleOrg": { + "message": "$ORGANIZATION$ is requesting you change the $COUNT$ passwords because they are at risk.", + "placeholders": { + "organization": { + "content": "$1", + "example": "Acme Corp" + }, + "count": { + "content": "$2", + "example": "2" + } + } + }, + "atRiskPasswordsDescMultiOrg": { + "message": "Your organizations are requesting you change the $COUNT$ passwords because they are at risk.", + "placeholders": { + "count": { + "content": "$1", + "example": "2" + } + } + }, + "reviewAndChangeAtRiskPassword": { + "message": "Review and change one at-risk password" + }, + "reviewAndChangeAtRiskPasswordsPlural": { + "message": "Review and change $COUNT$ at-risk passwords", + "placeholders": { + "count": { + "content": "$1", + "example": "2" + } + } + }, + "changeAtRiskPasswordsFaster": { + "message": "Change at-risk passwords faster" + }, + "changeAtRiskPasswordsFasterDesc": { + "message": "Update your settings so you can quickly autofill your passwords and generate new ones" + }, + "turnOnAutofill": { + "message": "Turn on autofill" + }, + "turnedOnAutofill": { + "message": "Turned on autofill" + }, + "dismiss": { + "message": "Dismiss" + }, "websiteItemLabel": { "message": "Website $number$ (URI)", "placeholders": { @@ -3123,12 +3187,18 @@ "notificationSentDevice": { "message": "A notification has been sent to your device." }, + "notificationSentDevicePart1": { + "message": "Unlock Bitwarden on your device or on the" + }, + "notificationSentDeviceAnchor": { + "message": "web app" + }, + "notificationSentDevicePart2": { + "message": "Make sure the Fingerprint phrase matches the one below before approving." + }, "aNotificationWasSentToYourDevice": { "message": "A notification was sent to your device" }, - "makeSureYourAccountIsUnlockedAndTheFingerprintEtc": { - "message": "Make sure your account is unlocked and the fingerprint phrase matches on the other device" - }, "youWillBeNotifiedOnceTheRequestIsApproved": { "message": "You will be notified once the request is approved" }, @@ -3138,6 +3208,9 @@ "loginInitiated": { "message": "Login initiated" }, + "logInRequestSent": { + "message": "Request sent" + }, "exposedMasterPassword": { "message": "Exposed Master Password" }, @@ -4146,15 +4219,6 @@ "itemName": { "message": "Item name" }, - "cannotRemoveViewOnlyCollections": { - "message": "You cannot remove collections with View only permissions: $COLLECTIONS$", - "placeholders": { - "collections": { - "content": "$1", - "example": "Work, Personal" - } - } - }, "organizationIsDeactivated": { "message": "Organization is deactivated" }, @@ -4887,6 +4951,15 @@ "extraWide": { "message": "Extra wide" }, + "cannotRemoveViewOnlyCollections": { + "message": "You cannot remove collections with View only permissions: $COLLECTIONS$", + "placeholders": { + "collections": { + "content": "$1", + "example": "Work, Personal" + } + } + }, "updateDesktopAppOrDisableFingerprintDialogTitle": { "message": "Please update your desktop application" }, diff --git a/apps/browser/src/_locales/my/messages.json b/apps/browser/src/_locales/my/messages.json index eb44a6806d1..33ba50ddab4 100644 --- a/apps/browser/src/_locales/my/messages.json +++ b/apps/browser/src/_locales/my/messages.json @@ -2363,6 +2363,70 @@ "autofillBlockedNoticeGuidance": { "message": "Change this in settings" }, + "change": { + "message": "Change" + }, + "changeButtonTitle": { + "message": "Change password - $ITEMNAME$", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "atRiskPasswords": { + "message": "At-risk passwords" + }, + "atRiskPasswordsDescSingleOrg": { + "message": "$ORGANIZATION$ is requesting you change the $COUNT$ passwords because they are at risk.", + "placeholders": { + "organization": { + "content": "$1", + "example": "Acme Corp" + }, + "count": { + "content": "$2", + "example": "2" + } + } + }, + "atRiskPasswordsDescMultiOrg": { + "message": "Your organizations are requesting you change the $COUNT$ passwords because they are at risk.", + "placeholders": { + "count": { + "content": "$1", + "example": "2" + } + } + }, + "reviewAndChangeAtRiskPassword": { + "message": "Review and change one at-risk password" + }, + "reviewAndChangeAtRiskPasswordsPlural": { + "message": "Review and change $COUNT$ at-risk passwords", + "placeholders": { + "count": { + "content": "$1", + "example": "2" + } + } + }, + "changeAtRiskPasswordsFaster": { + "message": "Change at-risk passwords faster" + }, + "changeAtRiskPasswordsFasterDesc": { + "message": "Update your settings so you can quickly autofill your passwords and generate new ones" + }, + "turnOnAutofill": { + "message": "Turn on autofill" + }, + "turnedOnAutofill": { + "message": "Turned on autofill" + }, + "dismiss": { + "message": "Dismiss" + }, "websiteItemLabel": { "message": "Website $number$ (URI)", "placeholders": { @@ -3123,12 +3187,18 @@ "notificationSentDevice": { "message": "A notification has been sent to your device." }, + "notificationSentDevicePart1": { + "message": "Unlock Bitwarden on your device or on the" + }, + "notificationSentDeviceAnchor": { + "message": "web app" + }, + "notificationSentDevicePart2": { + "message": "Make sure the Fingerprint phrase matches the one below before approving." + }, "aNotificationWasSentToYourDevice": { "message": "A notification was sent to your device" }, - "makeSureYourAccountIsUnlockedAndTheFingerprintEtc": { - "message": "Make sure your account is unlocked and the fingerprint phrase matches on the other device" - }, "youWillBeNotifiedOnceTheRequestIsApproved": { "message": "You will be notified once the request is approved" }, @@ -3138,6 +3208,9 @@ "loginInitiated": { "message": "Login initiated" }, + "logInRequestSent": { + "message": "Request sent" + }, "exposedMasterPassword": { "message": "Exposed Master Password" }, @@ -4146,15 +4219,6 @@ "itemName": { "message": "Item name" }, - "cannotRemoveViewOnlyCollections": { - "message": "You cannot remove collections with View only permissions: $COLLECTIONS$", - "placeholders": { - "collections": { - "content": "$1", - "example": "Work, Personal" - } - } - }, "organizationIsDeactivated": { "message": "Organization is deactivated" }, @@ -4887,6 +4951,15 @@ "extraWide": { "message": "Extra wide" }, + "cannotRemoveViewOnlyCollections": { + "message": "You cannot remove collections with View only permissions: $COLLECTIONS$", + "placeholders": { + "collections": { + "content": "$1", + "example": "Work, Personal" + } + } + }, "updateDesktopAppOrDisableFingerprintDialogTitle": { "message": "Please update your desktop application" }, diff --git a/apps/browser/src/_locales/nb/messages.json b/apps/browser/src/_locales/nb/messages.json index 101b314c9c2..3eb30df99d5 100644 --- a/apps/browser/src/_locales/nb/messages.json +++ b/apps/browser/src/_locales/nb/messages.json @@ -7,7 +7,7 @@ "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": "Hjemme, på jobben eller på farten sikrer Bitwarden enkelt alle dine passord, passnøkler og sensitiv informasjon", "description": "Extension description, MUST be less than 112 characters (Safari restriction)" }, "loginOrCreateNewAccount": { @@ -141,7 +141,7 @@ "message": "Kopiér navn" }, "copyCompany": { - "message": "Copy company" + "message": "Kopiér firma" }, "copySSN": { "message": "Kopiér fødselsnummer" @@ -281,13 +281,13 @@ "message": "Endre hovedpassordet" }, "continueToWebApp": { - "message": "Continue to web app?" + "message": "Vil du fortsette til nettappen?" }, "continueToWebAppDesc": { "message": "Explore more features of your Bitwarden account on the web app." }, "continueToHelpCenter": { - "message": "Continue to Help Center?" + "message": "Vil du fortsette til Hjelpesenteret?" }, "continueToHelpCenterDesc": { "message": "Learn more about how to use Bitwarden on the Help Center." @@ -299,7 +299,7 @@ "message": "Help others find out if Bitwarden is right for them. Visit your browser's extension store and leave a rating now." }, "changeMasterPasswordOnWebConfirmation": { - "message": "You can change your master password on the Bitwarden web app." + "message": "Du kan endre hovedpassordet ditt i Bitwardens nettapp." }, "fingerprintPhrase": { "message": "Fingeravtrykksfrase", @@ -322,16 +322,16 @@ "message": "Om" }, "moreFromBitwarden": { - "message": "More from Bitwarden" + "message": "Mer fra Bitwarden" }, "continueToBitwardenDotCom": { "message": "Vil du fortsette til bitwarden.com?" }, "bitwardenForBusiness": { - "message": "Bitwarden for Business" + "message": "Bitwarden for bedrifter" }, "bitwardenAuthenticator": { - "message": "Bitwarden Authenticator" + "message": "Bitwarden-autentiserer" }, "continueToAuthenticatorPageDesc": { "message": "Bitwarden Authenticator allows you to store authenticator keys and generate TOTP codes for 2-step verification flows. Learn more on the bitwarden.com website" @@ -431,7 +431,7 @@ "message": "Generer automatisk sterke og unike passord for dine innlogginger." }, "bitWebVaultApp": { - "message": "Bitwarden web app" + "message": "Bitwardens nett-app" }, "importItems": { "message": "Importer elementer" @@ -443,19 +443,19 @@ "message": "Generer et passord" }, "generatePassphrase": { - "message": "Generate passphrase" + "message": "Generér passordfrase" }, "passwordGenerated": { - "message": "Password generated" + "message": "Passord generert" }, "passphraseGenerated": { - "message": "Passphrase generated" + "message": "Passordfrase generert" }, "usernameGenerated": { - "message": "Username generated" + "message": "Brukernavn generert" }, "emailGenerated": { - "message": "Email generated" + "message": "E-postadresse generert" }, "regeneratePassword": { "message": "Omgenerer et passord" @@ -567,7 +567,7 @@ "message": "Passord" }, "totp": { - "message": "Authenticator secret" + "message": "Autentiseringsnøkkel" }, "passphrase": { "message": "Passfrase" @@ -633,7 +633,7 @@ "message": "Annet" }, "unlockMethods": { - "message": "Unlock options" + "message": "Opplåsingsalternativer" }, "unlockMethodNeededToChangeTimeoutActionDesc": { "message": "Set up an unlock method to change your vault timeout action." @@ -642,10 +642,10 @@ "message": "Set up an unlock method in Settings" }, "sessionTimeoutHeader": { - "message": "Session timeout" + "message": "Tidsavbrudd for økten" }, "vaultTimeoutHeader": { - "message": "Vault timeout" + "message": "Tidsavbrudd for hvelvet" }, "otherOptions": { "message": "Andre valg" @@ -663,16 +663,16 @@ "message": "We don't recognize this device. Enter the code sent to your email to verify your identity." }, "continueLoggingIn": { - "message": "Continue logging in" + "message": "Fortsett innloggingen" }, "yourVaultIsLocked": { "message": "Hvelvet ditt er låst. Kontroller hovedpassordet ditt for å fortsette." }, "yourVaultIsLockedV2": { - "message": "Your vault is locked" + "message": "Hvelvet ditt er låst" }, "yourAccountIsLocked": { - "message": "Your account is locked" + "message": "Kontoen din er låst" }, "or": { "message": "eller" @@ -797,10 +797,10 @@ "message": "Din nye konto har blitt opprettet! Du kan nå logge på." }, "newAccountCreated2": { - "message": "Your new account has been created!" + "message": "Den nye kontoen din er opprettet!" }, "youHaveBeenLoggedIn": { - "message": "You have been logged in!" + "message": "Du har blitt logget inn!" }, "youSuccessfullyLoggedIn": { "message": "Du har vellykket logget inn" @@ -861,7 +861,7 @@ "message": "Logget av" }, "loggedOutDesc": { - "message": "You have been logged out of your account." + "message": "Du har blitt logget ut av kontoen din." }, "loginExpired": { "message": "Din innloggingsøkt har utløpt." @@ -873,7 +873,7 @@ "message": "Logg inn på Bitwarden" }, "restartRegistration": { - "message": "Restart registration" + "message": "Start registreringen på nytt" }, "expiredLink": { "message": "Utløpt lenke" @@ -909,7 +909,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": "Vil du fortsette til nettappen?" }, "editedFolder": { "message": "Redigerte mappen" @@ -1290,7 +1290,7 @@ "message": "Takk for at du støtter Bitwarden." }, "premiumFeatures": { - "message": "Upgrade to Premium and receive:" + "message": "Oppgrader til Premium og motta:" }, "premiumPrice": { "message": "Og alt det for %price%/år!", @@ -1477,29 +1477,29 @@ "message": "Miljø-nettadressene har blitt lagret." }, "showAutoFillMenuOnFormFields": { - "message": "Show autofill menu on form fields", + "message": "Vis autoutfyll-menyen i tekstbokser", "description": "Represents the message for allowing the user to enable the autofill overlay" }, "autofillSuggestionsSectionTitle": { "message": "Autoutfyllingsforslag" }, "showInlineMenuLabel": { - "message": "Show autofill suggestions on form fields" + "message": "Vis autoutfyll-forslag i tekstbokser" }, "showInlineMenuIdentitiesLabel": { - "message": "Display identities as suggestions" + "message": "Vis identiteter som forslag" }, "showInlineMenuCardsLabel": { - "message": "Display cards as suggestions" + "message": "Vis kort som forslag" }, "showInlineMenuOnIconSelectionLabel": { - "message": "Display suggestions when icon is selected" + "message": "Vis forslag når ikonet er valgt" }, "showInlineMenuOnFormFieldsDescAlt": { "message": "Applies to all logged in accounts." }, "turnOffBrowserBuiltInPasswordManagerSettings": { - "message": "Turn off your browser's built in password manager settings to avoid conflicts." + "message": "Skru av din nettlesers innebygde passordbehandler for å unngå konflikter." }, "turnOffBrowserBuiltInPasswordManagerSettingsLink": { "message": "Rediger nettleserinnstillingene." @@ -1538,7 +1538,7 @@ "message": "Standard autofyll innstilling for innloggingselementer" }, "defaultAutoFillOnPageLoadDesc": { - "message": "Etter aktivering av auto-utfylling på sidelasser, kan du aktivere eller deaktivere funksjonen for individuelle innloggingselementer. Dette er standardinnstillingen for innloggingselementer som ikke er satt opp separat." + "message": "Du kan skru av auto-utfylling ved sideinnlastinger for individuelle innloggingsgjenstander fra gjenstandens «Redigér»-visning." }, "itemAutoFillOnPageLoad": { "message": "Auto-utfyll på sideinnlastning (hvis aktivert i Alternativer)" @@ -1598,7 +1598,7 @@ "message": "Boolsk verdi" }, "cfTypeCheckbox": { - "message": "Checkbox" + "message": "Avkryssingsboks" }, "cfTypeLinked": { "message": "Tilkoblet", @@ -1819,7 +1819,7 @@ "message": "Generatorhistorikk" }, "clearGeneratorHistoryTitle": { - "message": "Clear generator history" + "message": "Tøm generatorhistorikk" }, "cleargGeneratorHistoryDescription": { "message": "If you continue, all entries will be permanently deleted from generator's history. Are you sure you want to continue?" @@ -1831,7 +1831,7 @@ "message": "Samlinger" }, "nCollections": { - "message": "$COUNT$ collections", + "message": "$COUNT$ samlinger", "placeholders": { "count": { "content": "$1", @@ -1887,7 +1887,7 @@ "description": "Domain name. Ex. website.com" }, "baseDomainOptionRecommended": { - "message": "Base domain (recommended)", + "message": "Grunndomene (anbefalt)", "description": "Domain name. Ex. website.com" }, "domainName": { @@ -1947,7 +1947,7 @@ "message": "Ingenting å vise" }, "nothingGeneratedRecently": { - "message": "You haven't generated anything recently" + "message": "Du har ikke generert noe i det siste" }, "remove": { "message": "Fjern" @@ -2017,7 +2017,7 @@ "message": "Angi PIN-koden din for å låse opp Bitwarden. PIN-innstillingene tilbakestilles hvis du logger deg helt ut av programmet." }, "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." + "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." }, "pinRequired": { "message": "PIN-kode er påkrevd." @@ -2026,7 +2026,7 @@ "message": "Ugyldig PIN-kode." }, "tooManyInvalidPinEntryAttemptsLoggingOut": { - "message": "Too many invalid PIN entry attempts. Logging out." + "message": "For mange ugyldige PIN-kodeforsøk. Logger ut." }, "unlockWithBiometrics": { "message": "Lås opp med biometri" @@ -2062,7 +2062,7 @@ "message": "Brukernavngenerator" }, "useThisEmail": { - "message": "Use this email" + "message": "Bruk denne E-postadressen" }, "useThisPassword": { "message": "Bruk dette passordet" @@ -2078,14 +2078,14 @@ "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": "for å lage et sterkt og unikt passord", "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'" }, "vaultTimeoutAction": { "message": "Handling ved tidsavbrudd i hvelvet" }, "vaultTimeoutAction1": { - "message": "Timeout action" + "message": "Handling ved tidsavbrudd" }, "lock": { "message": "Lås", @@ -2135,7 +2135,7 @@ "message": "Autoutfylt element" }, "insecurePageWarning": { - "message": "Warning: This is an unsecured HTTP page, and any information you submit can potentially be seen and changed by others. This Login was originally saved on a secure (HTTPS) page." + "message": "Advarsel: Dette er en usikret HTTP-side, og all informasjon du sender inn kan potensielt bli sett og endret av andre. Denne påloggingen ble opprinnelig lagret på et sikkert (HTTPS) nettsted." }, "insecurePageWarningFillPrompt": { "message": "Ønsker du likevel å fylle ut denne innloggingen?" @@ -2306,7 +2306,7 @@ "message": "Please unlock this user in the desktop application and try again." }, "biometricsNotAvailableTitle": { - "message": "Biometric unlock unavailable" + "message": "Biometrisk opplåsing er utilgjengelig" }, "biometricsNotAvailableDesc": { "message": "Biometric unlock is currently unavailable. Please try again later." @@ -2361,10 +2361,74 @@ "message": "Autofill is blocked for this website." }, "autofillBlockedNoticeGuidance": { - "message": "Change this in settings" + "message": "Endre dette i innstillingene" + }, + "change": { + "message": "Change" + }, + "changeButtonTitle": { + "message": "Change password - $ITEMNAME$", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "atRiskPasswords": { + "message": "At-risk passwords" + }, + "atRiskPasswordsDescSingleOrg": { + "message": "$ORGANIZATION$ is requesting you change the $COUNT$ passwords because they are at risk.", + "placeholders": { + "organization": { + "content": "$1", + "example": "Acme Corp" + }, + "count": { + "content": "$2", + "example": "2" + } + } + }, + "atRiskPasswordsDescMultiOrg": { + "message": "Your organizations are requesting you change the $COUNT$ passwords because they are at risk.", + "placeholders": { + "count": { + "content": "$1", + "example": "2" + } + } + }, + "reviewAndChangeAtRiskPassword": { + "message": "Review and change one at-risk password" + }, + "reviewAndChangeAtRiskPasswordsPlural": { + "message": "Review and change $COUNT$ at-risk passwords", + "placeholders": { + "count": { + "content": "$1", + "example": "2" + } + } + }, + "changeAtRiskPasswordsFaster": { + "message": "Change at-risk passwords faster" + }, + "changeAtRiskPasswordsFasterDesc": { + "message": "Update your settings so you can quickly autofill your passwords and generate new ones" + }, + "turnOnAutofill": { + "message": "Turn on autofill" + }, + "turnedOnAutofill": { + "message": "Turned on autofill" + }, + "dismiss": { + "message": "Dismiss" }, "websiteItemLabel": { - "message": "Website $number$ (URI)", + "message": "Nettsted $number$ (URİ)", "placeholders": { "number": { "content": "$1", @@ -2391,11 +2455,11 @@ "message": "Begrens visninger" }, "limitSendViewsHint": { - "message": "No one can view this Send after the limit is reached.", + "message": "Ingen kan se denne Send-en etter at grensen er nådd.", "description": "Displayed under the limit views field on Send" }, "limitSendViewsCount": { - "message": "$ACCESSCOUNT$ views left", + "message": "$ACCESSCOUNT$ visninger igjen", "description": "Displayed under the limit views field on Send", "placeholders": { "accessCount": { @@ -2409,7 +2473,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": "Send-detaljer", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendTypeText": { @@ -2426,7 +2490,7 @@ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "hideTextByDefault": { - "message": "Hide text by default" + "message": "Skjul tekst som standard" }, "expired": { "message": "Utløpt" @@ -2506,7 +2570,7 @@ "message": "Egendefinert" }, "sendPasswordDescV3": { - "message": "Add an optional password for recipients to access this Send.", + "message": "Legg til et valgfritt passord for at mottakerne skal få tilgang til denne Send-en.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "createSend": { @@ -2561,7 +2625,7 @@ } }, "sendLinkCopied": { - "message": "Send link copied", + "message": "Send-lenken ble kopiert", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "editedSend": { @@ -2569,7 +2633,7 @@ "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": "Vil du sprette ut utvidelsen?", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendFilePopoutDialogDesc": { @@ -2586,7 +2650,7 @@ "message": "For å velge en fil med Safari, popp ut i et nytt vindu ved å klikke på dette banneret." }, "popOut": { - "message": "Pop out" + "message": "Sprett ut" }, "sendFileCalloutHeader": { "message": "Før du starter" @@ -2607,7 +2671,7 @@ "message": "Det oppstod en feil ved lagring av slettingen og utløpsdatoene." }, "hideYourEmail": { - "message": "Hide your email address from viewers." + "message": "Skjul E-postadressen din fra seere." }, "passwordPrompt": { "message": "Forespørsel om hovedpassord på nytt" @@ -2833,14 +2897,14 @@ "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": "for å unngå ytterligere datatap.", "description": "This is part of a larger sentence. The full sentence will read 'Contact customer success to avoid additional data loss.'" }, "generateUsername": { "message": "Generer brukernavn" }, "generateEmail": { - "message": "Generate email" + "message": "Generér E-post" }, "spinboxBoundariesHint": { "message": "Verdien må være mellom $MIN$ og $MAX$.", @@ -2857,7 +2921,7 @@ } }, "passwordLengthRecommendationHint": { - "message": " Use $RECOMMENDED$ characters or more to generate a strong password.", + "message": " Bruk minst $RECOMMENDED$ tegn for å generere et sterkt passord.", "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": { @@ -2912,7 +2976,7 @@ "description": "Labels the domain name email forwarder service option" }, "forwarderDomainNameHint": { - "message": "Choose a domain that is supported by the selected service", + "message": "Velg et domene som støttes av den valgte tjenesten", "description": "Guidance provided for email forwarding services that support multiple email domains." }, "forwarderError": { @@ -2944,7 +3008,7 @@ } }, "forwaderInvalidToken": { - "message": "Invalid $SERVICENAME$ API token", + "message": "Ugyldig $SERVICENAME$-API-sjetong", "description": "Displayed when the user's API token is empty or rejected by the forwarding service.", "placeholders": { "servicename": { @@ -2954,7 +3018,7 @@ } }, "forwaderInvalidTokenWithMessage": { - "message": "Invalid $SERVICENAME$ API token: $ERRORMESSAGE$", + "message": "Ugyldig $SERVICENAME$-API-sjetong: $ERRORMESSAGE$", "description": "Displayed when the user's API token is rejected by the forwarding service with an error message.", "placeholders": { "servicename": { @@ -2998,7 +3062,7 @@ } }, "forwarderUnknownError": { - "message": "Unknown $SERVICENAME$ error occurred.", + "message": "Ukjent $SERVICENAME$-feil oppstod.", "description": "Displayed when the forwarding service failed due to an unknown error.", "placeholders": { "servicename": { @@ -3123,12 +3187,18 @@ "notificationSentDevice": { "message": "Et varsel er sendt til enheten din." }, + "notificationSentDevicePart1": { + "message": "Unlock Bitwarden on your device or on the" + }, + "notificationSentDeviceAnchor": { + "message": "nett-app" + }, + "notificationSentDevicePart2": { + "message": "Make sure the Fingerprint phrase matches the one below before approving." + }, "aNotificationWasSentToYourDevice": { "message": "Et varsel ble sendt til enheten din" }, - "makeSureYourAccountIsUnlockedAndTheFingerprintEtc": { - "message": "Make sure your account is unlocked and the fingerprint phrase matches on the other device" - }, "youWillBeNotifiedOnceTheRequestIsApproved": { "message": "You will be notified once the request is approved" }, @@ -3136,7 +3206,10 @@ "message": "Trenger du et annet alternativ?" }, "loginInitiated": { - "message": "Login initiated" + "message": "Innlogging igangsatt" + }, + "logInRequestSent": { + "message": "Forespørsel sendt" }, "exposedMasterPassword": { "message": "Eksponert hovedpassord" @@ -3196,10 +3269,10 @@ "message": "Autofill shortcut" }, "autofillKeyboardShortcutUpdateLabel": { - "message": "Change shortcut" + "message": "Endre snarvei" }, "autofillKeyboardManagerShortcutsLabel": { - "message": "Manage shortcuts" + "message": "Behandle snarveier" }, "autofillShortcut": { "message": "Auto-utfyll tastatursnarvei" @@ -3208,7 +3281,7 @@ "message": "The autofill login shortcut is not set. Change this in the browser's settings." }, "autofillLoginShortcutText": { - "message": "The autofill login shortcut is $COMMAND$. Manage all shortcuts in the browser's settings.", + "message": "Autoutfyll-snarveien for pålogging er $COMMAND$. Håndter alle snarveiene i nettleserens innstillinger.", "placeholders": { "command": { "content": "$1", @@ -3262,16 +3335,16 @@ "message": "Oppretter en konto på" }, "checkYourEmail": { - "message": "Check your email" + "message": "Sjekk E-postinnboksen din" }, "followTheLinkInTheEmailSentTo": { - "message": "Follow the link in the email sent to" + "message": "Følg lenken i E-postadressen som ble sendt til" }, "andContinueCreatingYourAccount": { "message": "and continue creating your account." }, "noEmail": { - "message": "No email?" + "message": "Ingen E-post?" }, "goBack": { "message": "Gå tilbake" @@ -3320,11 +3393,11 @@ "message": "Enheten er betrodd" }, "sendsNoItemsTitle": { - "message": "No active Sends", + "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": "Use Send to securely share encrypted information with anyone.", + "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." }, "inputRequired": { @@ -3401,10 +3474,10 @@ } }, "singleFieldNeedsAttention": { - "message": "1 field needs your attention." + "message": "1 felt trenger din oppmerksomhet." }, "multipleFieldsNeedAttention": { - "message": "$COUNT$ fields need your attention.", + "message": "$COUNT$ felter trenger din oppmerksomhet.", "placeholders": { "count": { "content": "$1", @@ -3440,7 +3513,7 @@ "message": "Undermeny" }, "toggleCollapse": { - "message": "Toggle collapse", + "message": "Utvid eller klapp sammen", "description": "Toggling an expand/collapse state." }, "aliasDomain": { @@ -3646,7 +3719,7 @@ "message": "Popout extension" }, "launchDuo": { - "message": "Launch Duo" + "message": "Start Duo" }, "importFormatError": { "message": "Data is not formatted correctly. Please check your import file and try again." @@ -3720,13 +3793,13 @@ "message": "Bekreft filpassord" }, "exportSuccess": { - "message": "Vault data exported" + "message": "Hvelvdataen ble eksportert" }, "typePasskey": { "message": "Passnøkkel" }, "accessing": { - "message": "Accessing" + "message": "Logger inn på" }, "loggedInExclamation": { "message": "Innlogget!" @@ -3756,7 +3829,7 @@ "message": "No matching logins for this site" }, "searchSavePasskeyNewLogin": { - "message": "Search or save passkey as new login" + "message": "Søk eller lagre passnøkkelen som en ny innlogging" }, "confirm": { "message": "Bekreft" @@ -3774,7 +3847,7 @@ "message": "Choose a passkey to log in with" }, "passkeyItem": { - "message": "Passkey Item" + "message": "Passkode-gjenstand" }, "overwritePasskey": { "message": "Overwrite passkey?" @@ -3921,7 +3994,7 @@ "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": "Vil du fortsette til Hjelpesenteret?", "description": "Title for dialog which asks if the user wants to proceed to a relevant Help Center page" }, "confirmContinueToHelpCenterPasswordManagementContent": { @@ -3941,7 +4014,7 @@ "description": "Body content for dialog which asks if the user wants to proceed to the browser's keyboard shortcut settings page" }, "overrideDefaultBrowserAutofillTitle": { - "message": "Make Bitwarden your default password manager?", + "message": "Vil du sette Bitwarden som din standard passordbehandler?", "description": "Dialog title facilitating the ability to override a chrome browser's default autofill behavior" }, "overrideDefaultBrowserAutofillDescription": { @@ -3994,10 +4067,10 @@ "message": "Passkey removed" }, "autofillSuggestions": { - "message": "Autofill suggestions" + "message": "Autoutfyllingsforslag" }, "itemSuggestions": { - "message": "Suggested items" + "message": "Foreslåtte gjenstander" }, "autofillSuggestionsTip": { "message": "Save a login item for this site to autofill" @@ -4012,7 +4085,7 @@ "message": "Clear filters or try another search term" }, "copyInfoTitle": { - "message": "Copy info - $ITEMNAME$", + "message": "Kopiér info - $ITEMNAME$", "description": "Title for a button that opens a menu with options to copy information from an item.", "placeholders": { "itemname": { @@ -4022,7 +4095,7 @@ } }, "copyNoteTitle": { - "message": "Copy Note - $ITEMNAME$", + "message": "Kopiér notat - $ITEMNAME$", "description": "Title for a button copies a note to the clipboard.", "placeholders": { "itemname": { @@ -4072,7 +4145,7 @@ } }, "noValuesToCopy": { - "message": "No values to copy" + "message": "Ingen verdier å kopiere" }, "assignToCollections": { "message": "Legg til i samlinger" @@ -4081,10 +4154,10 @@ "message": "Copy email" }, "copyPhone": { - "message": "Copy phone" + "message": "Kopiér telefonnummer" }, "copyAddress": { - "message": "Copy address" + "message": "Kopiér adresse" }, "adminConsole": { "message": "Admin Console" @@ -4146,15 +4219,6 @@ "itemName": { "message": "Gjenstandens navn" }, - "cannotRemoveViewOnlyCollections": { - "message": "You cannot remove collections with View only permissions: $COLLECTIONS$", - "placeholders": { - "collections": { - "content": "$1", - "example": "Work, Personal" - } - } - }, "organizationIsDeactivated": { "message": "Organization is deactivated" }, @@ -4178,13 +4242,13 @@ "message": "Nyligst redigert" }, "ownerYou": { - "message": "Owner: You" + "message": "Eier: Du" }, "linked": { "message": "Tilknyttet" }, "copySuccessful": { - "message": "Copy Successful" + "message": "Kopiering lyktes" }, "upload": { "message": "Last opp" @@ -4196,7 +4260,7 @@ "message": "Maksimal filstørrelse er 500 MB" }, "deleteAttachmentName": { - "message": "Delete attachment $NAME$", + "message": "Slett $NAME$-vedlegget", "placeholders": { "name": { "content": "$1", @@ -4272,10 +4336,10 @@ "message": "Autoutfyllings-innstillinger" }, "websiteUri": { - "message": "Website (URI)" + "message": "Nettsted (URİ)" }, "websiteUriCount": { - "message": "Website (URI) $COUNT$", + "message": "Nettsted (URİ) $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": { @@ -4403,7 +4467,7 @@ "message": "Feltetikett" }, "textHelpText": { - "message": "Use text fields for data like security questions" + "message": "Bruk tekstfelter for data som sikkerhetsspørsmål" }, "hiddenHelpText": { "message": "Use hidden fields for sensitive data like a password" @@ -4421,7 +4485,7 @@ "message": "Rediger felt" }, "editFieldLabel": { - "message": "Edit $LABEL$", + "message": "Rediger $LABEL$", "placeholders": { "label": { "content": "$1", @@ -4474,7 +4538,7 @@ } }, "selectCollectionsToAssign": { - "message": "Select collections to assign" + "message": "Velg samlinger å tilordne" }, "personalItemTransferWarningSingular": { "message": "1 item will be permanently transferred to the selected organization. You will no longer own this item." @@ -4514,10 +4578,10 @@ "message": "Successfully assigned collections" }, "nothingSelected": { - "message": "You have not selected anything." + "message": "Du har ikke valgt noe." }, "movedItemsToOrg": { - "message": "Selected items moved to $ORGNAME$", + "message": "De valgte gjenstandene ble flyttet til $ORGNAME$", "placeholders": { "orgname": { "content": "$1", @@ -4526,7 +4590,7 @@ } }, "itemsMovedToOrg": { - "message": "Items moved to $ORGNAME$", + "message": "Gjenstandene ble flyttet til $ORGNAME$", "placeholders": { "orgname": { "content": "$1", @@ -4535,7 +4599,7 @@ } }, "itemMovedToOrg": { - "message": "Item moved to $ORGNAME$", + "message": "Gjenstanden ble flyttet til $ORGNAME$", "placeholders": { "orgname": { "content": "$1", @@ -4576,13 +4640,13 @@ "message": "Text Sends" }, "accountActions": { - "message": "Account actions" + "message": "Kontohandlinger" }, "showNumberOfAutofillSuggestions": { "message": "Show number of login autofill suggestions on extension icon" }, "showQuickCopyActions": { - "message": "Show quick copy actions on Vault" + "message": "Vis hurtigkopieringshandlinger i hvelvet" }, "systemDefault": { "message": "Systemforvalg" @@ -4618,7 +4682,7 @@ "message": "Prøv igjen" }, "vaultCustomTimeoutMinimum": { - "message": "Minimum custom timeout is 1 minute." + "message": "Minste egendefinerte tidsavbrudd er 1 minutt." }, "additionalContentAvailable": { "message": "Ytterligere innhold er tilgjengelig" @@ -4639,10 +4703,10 @@ "message": "Ingen gjenstander i papirkurven" }, "noItemsInTrashDesc": { - "message": "Items you delete will appear here and be permanently deleted after 30 days" + "message": "Gjenstander du sletter, vises her og slettes permanent etter 30 dager" }, "trashWarning": { - "message": "Items that have been in trash more than 30 days will automatically be deleted" + "message": "Gjenstander som har ligget i papirkurven i mer enn 30 dager, blir automatisk slettet" }, "restore": { "message": "Gjenopprett" @@ -4657,7 +4721,7 @@ "message": "Biometric unlock is unavailable because PIN or password unlock is required first." }, "biometricsStatusHelptextHardwareUnavailable": { - "message": "Biometric unlock is currently unavailable." + "message": "Biometrisk opplåsing er utilgjengelig for øyeblikket." }, "biometricsStatusHelptextAutoSetupNeeded": { "message": "Biometric unlock is unavailable due to misconfigured system files." @@ -4684,11 +4748,11 @@ "message": "Autentiserer" }, "fillGeneratedPassword": { - "message": "Fill generated password", + "message": "Fyll inn generert passord", "description": "Heading for the password generator within the inline menu" }, "passwordRegenerated": { - "message": "Password regenerated", + "message": "Passord ble generert på nytt", "description": "Notification message for when a password has been regenerated" }, "saveLoginToBitwarden": { @@ -4855,7 +4919,7 @@ "message": "You can set up two-step login as an alternative way to protect your account or change your email to one you can access." }, "remindMeLater": { - "message": "Remind me later" + "message": "Minn meg på det senere" }, "newDeviceVerificationNoticePageOneFormContent": { "message": "Do you have reliable access to your email, $EMAIL$?", @@ -4873,7 +4937,7 @@ "message": "Yes, I can reliably access my email" }, "turnOnTwoStepLogin": { - "message": "Turn on two-step login" + "message": "Slå på 2-trinnsinnlogging" }, "changeAcctEmail": { "message": "Endre kontoens E-postadresse" @@ -4887,10 +4951,19 @@ "extraWide": { "message": "Ekstra bred" }, + "cannotRemoveViewOnlyCollections": { + "message": "You cannot remove collections with View only permissions: $COLLECTIONS$", + "placeholders": { + "collections": { + "content": "$1", + "example": "Work, Personal" + } + } + }, "updateDesktopAppOrDisableFingerprintDialogTitle": { - "message": "Please update your desktop application" + "message": "Vennligst oppdater skrivebordsprogrammet ditt" }, "updateDesktopAppOrDisableFingerprintDialogMessage": { - "message": "To use biometric unlock, please update your desktop application, or disable fingerprint unlock in the desktop settings." + "message": "For å bruke biometrisk opplåsing, må du oppdatere skrivebordsprogrammet eller skru av fingeravtrykksopplåsing i skrivebordsinnstillingene." } } diff --git a/apps/browser/src/_locales/ne/messages.json b/apps/browser/src/_locales/ne/messages.json index eb44a6806d1..33ba50ddab4 100644 --- a/apps/browser/src/_locales/ne/messages.json +++ b/apps/browser/src/_locales/ne/messages.json @@ -2363,6 +2363,70 @@ "autofillBlockedNoticeGuidance": { "message": "Change this in settings" }, + "change": { + "message": "Change" + }, + "changeButtonTitle": { + "message": "Change password - $ITEMNAME$", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "atRiskPasswords": { + "message": "At-risk passwords" + }, + "atRiskPasswordsDescSingleOrg": { + "message": "$ORGANIZATION$ is requesting you change the $COUNT$ passwords because they are at risk.", + "placeholders": { + "organization": { + "content": "$1", + "example": "Acme Corp" + }, + "count": { + "content": "$2", + "example": "2" + } + } + }, + "atRiskPasswordsDescMultiOrg": { + "message": "Your organizations are requesting you change the $COUNT$ passwords because they are at risk.", + "placeholders": { + "count": { + "content": "$1", + "example": "2" + } + } + }, + "reviewAndChangeAtRiskPassword": { + "message": "Review and change one at-risk password" + }, + "reviewAndChangeAtRiskPasswordsPlural": { + "message": "Review and change $COUNT$ at-risk passwords", + "placeholders": { + "count": { + "content": "$1", + "example": "2" + } + } + }, + "changeAtRiskPasswordsFaster": { + "message": "Change at-risk passwords faster" + }, + "changeAtRiskPasswordsFasterDesc": { + "message": "Update your settings so you can quickly autofill your passwords and generate new ones" + }, + "turnOnAutofill": { + "message": "Turn on autofill" + }, + "turnedOnAutofill": { + "message": "Turned on autofill" + }, + "dismiss": { + "message": "Dismiss" + }, "websiteItemLabel": { "message": "Website $number$ (URI)", "placeholders": { @@ -3123,12 +3187,18 @@ "notificationSentDevice": { "message": "A notification has been sent to your device." }, + "notificationSentDevicePart1": { + "message": "Unlock Bitwarden on your device or on the" + }, + "notificationSentDeviceAnchor": { + "message": "web app" + }, + "notificationSentDevicePart2": { + "message": "Make sure the Fingerprint phrase matches the one below before approving." + }, "aNotificationWasSentToYourDevice": { "message": "A notification was sent to your device" }, - "makeSureYourAccountIsUnlockedAndTheFingerprintEtc": { - "message": "Make sure your account is unlocked and the fingerprint phrase matches on the other device" - }, "youWillBeNotifiedOnceTheRequestIsApproved": { "message": "You will be notified once the request is approved" }, @@ -3138,6 +3208,9 @@ "loginInitiated": { "message": "Login initiated" }, + "logInRequestSent": { + "message": "Request sent" + }, "exposedMasterPassword": { "message": "Exposed Master Password" }, @@ -4146,15 +4219,6 @@ "itemName": { "message": "Item name" }, - "cannotRemoveViewOnlyCollections": { - "message": "You cannot remove collections with View only permissions: $COLLECTIONS$", - "placeholders": { - "collections": { - "content": "$1", - "example": "Work, Personal" - } - } - }, "organizationIsDeactivated": { "message": "Organization is deactivated" }, @@ -4887,6 +4951,15 @@ "extraWide": { "message": "Extra wide" }, + "cannotRemoveViewOnlyCollections": { + "message": "You cannot remove collections with View only permissions: $COLLECTIONS$", + "placeholders": { + "collections": { + "content": "$1", + "example": "Work, Personal" + } + } + }, "updateDesktopAppOrDisableFingerprintDialogTitle": { "message": "Please update your desktop application" }, diff --git a/apps/browser/src/_locales/nl/messages.json b/apps/browser/src/_locales/nl/messages.json index 46dc3e1166d..915ae7163f6 100644 --- a/apps/browser/src/_locales/nl/messages.json +++ b/apps/browser/src/_locales/nl/messages.json @@ -2363,6 +2363,70 @@ "autofillBlockedNoticeGuidance": { "message": "Dit aanpassen in instellingen" }, + "change": { + "message": "Wijzigen" + }, + "changeButtonTitle": { + "message": "Wachtwoord wijzigen - $ITEMNAME$", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "atRiskPasswords": { + "message": "Wachtwoorden in gevaar" + }, + "atRiskPasswordsDescSingleOrg": { + "message": "$ORGANIZATION$ vraagt je om de $COUNT$ wachtwoorden te wijzigen omdat ze een risico vormen.", + "placeholders": { + "organization": { + "content": "$1", + "example": "Acme Corp" + }, + "count": { + "content": "$2", + "example": "2" + } + } + }, + "atRiskPasswordsDescMultiOrg": { + "message": "Je organisatie(s) vragen je de $COUNT$ wachtwoorden te wijzigen omdat ze een risico vormen.", + "placeholders": { + "count": { + "content": "$1", + "example": "2" + } + } + }, + "reviewAndChangeAtRiskPassword": { + "message": "Eén risicovol wachtwoord beoordelen en wijzigen" + }, + "reviewAndChangeAtRiskPasswordsPlural": { + "message": "$COUNT$ risicovolle wachtwoorden beoordelen en wijzigen", + "placeholders": { + "count": { + "content": "$1", + "example": "2" + } + } + }, + "changeAtRiskPasswordsFaster": { + "message": "Risicovolle wachtwoorden sneller wijzigen" + }, + "changeAtRiskPasswordsFasterDesc": { + "message": "Werk je instellingen bij voor het snel automatisch invullen van je wachtwoorden en genereren van nieuwe" + }, + "turnOnAutofill": { + "message": "Automatisch invullen inschakelen" + }, + "turnedOnAutofill": { + "message": "Automatisch invullen ingeschakeld" + }, + "dismiss": { + "message": "Sluiten" + }, "websiteItemLabel": { "message": "Website $number$ (URI)", "placeholders": { @@ -3123,12 +3187,18 @@ "notificationSentDevice": { "message": "Er is een melding naar je apparaat verzonden." }, + "notificationSentDevicePart1": { + "message": "Ontgrendel Bitwarden op je apparaat of op de" + }, + "notificationSentDeviceAnchor": { + "message": "webapp" + }, + "notificationSentDevicePart2": { + "message": "Zorg ervoor dat de vingerafdrukzin overeenkomt met de onderstaande voor je deze goedkeurt." + }, "aNotificationWasSentToYourDevice": { "message": "Er is een melding naar je apparaat verzonden" }, - "makeSureYourAccountIsUnlockedAndTheFingerprintEtc": { - "message": "Zorg ervoor dat je kluis is ontgrendeld en de vingerafdrukzin hetzelfde is op het andere apparaat" - }, "youWillBeNotifiedOnceTheRequestIsApproved": { "message": "Je krijgt een melding zodra de aanvraag is goedgekeurd" }, @@ -3138,6 +3208,9 @@ "loginInitiated": { "message": "Inloggen gestart" }, + "logInRequestSent": { + "message": "Verzoek verzonden" + }, "exposedMasterPassword": { "message": "Gelekt hoofdwachtwoord" }, @@ -4146,15 +4219,6 @@ "itemName": { "message": "Itemnaam" }, - "cannotRemoveViewOnlyCollections": { - "message": "Je kunt verzamelingen niet verwijderen met alleen rechten voor weergeven: $COLLECTIONS$", - "placeholders": { - "collections": { - "content": "$1", - "example": "Work, Personal" - } - } - }, "organizationIsDeactivated": { "message": "Organisatie is gedeactiveerd" }, @@ -4887,6 +4951,15 @@ "extraWide": { "message": "Extra breed" }, + "cannotRemoveViewOnlyCollections": { + "message": "Je kunt verzamelingen niet verwijderen met alleen rechten voor weergeven: $COLLECTIONS$", + "placeholders": { + "collections": { + "content": "$1", + "example": "Work, Personal" + } + } + }, "updateDesktopAppOrDisableFingerprintDialogTitle": { "message": "Werk je desktopapplicatie bij" }, diff --git a/apps/browser/src/_locales/nn/messages.json b/apps/browser/src/_locales/nn/messages.json index eb44a6806d1..33ba50ddab4 100644 --- a/apps/browser/src/_locales/nn/messages.json +++ b/apps/browser/src/_locales/nn/messages.json @@ -2363,6 +2363,70 @@ "autofillBlockedNoticeGuidance": { "message": "Change this in settings" }, + "change": { + "message": "Change" + }, + "changeButtonTitle": { + "message": "Change password - $ITEMNAME$", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "atRiskPasswords": { + "message": "At-risk passwords" + }, + "atRiskPasswordsDescSingleOrg": { + "message": "$ORGANIZATION$ is requesting you change the $COUNT$ passwords because they are at risk.", + "placeholders": { + "organization": { + "content": "$1", + "example": "Acme Corp" + }, + "count": { + "content": "$2", + "example": "2" + } + } + }, + "atRiskPasswordsDescMultiOrg": { + "message": "Your organizations are requesting you change the $COUNT$ passwords because they are at risk.", + "placeholders": { + "count": { + "content": "$1", + "example": "2" + } + } + }, + "reviewAndChangeAtRiskPassword": { + "message": "Review and change one at-risk password" + }, + "reviewAndChangeAtRiskPasswordsPlural": { + "message": "Review and change $COUNT$ at-risk passwords", + "placeholders": { + "count": { + "content": "$1", + "example": "2" + } + } + }, + "changeAtRiskPasswordsFaster": { + "message": "Change at-risk passwords faster" + }, + "changeAtRiskPasswordsFasterDesc": { + "message": "Update your settings so you can quickly autofill your passwords and generate new ones" + }, + "turnOnAutofill": { + "message": "Turn on autofill" + }, + "turnedOnAutofill": { + "message": "Turned on autofill" + }, + "dismiss": { + "message": "Dismiss" + }, "websiteItemLabel": { "message": "Website $number$ (URI)", "placeholders": { @@ -3123,12 +3187,18 @@ "notificationSentDevice": { "message": "A notification has been sent to your device." }, + "notificationSentDevicePart1": { + "message": "Unlock Bitwarden on your device or on the" + }, + "notificationSentDeviceAnchor": { + "message": "web app" + }, + "notificationSentDevicePart2": { + "message": "Make sure the Fingerprint phrase matches the one below before approving." + }, "aNotificationWasSentToYourDevice": { "message": "A notification was sent to your device" }, - "makeSureYourAccountIsUnlockedAndTheFingerprintEtc": { - "message": "Make sure your account is unlocked and the fingerprint phrase matches on the other device" - }, "youWillBeNotifiedOnceTheRequestIsApproved": { "message": "You will be notified once the request is approved" }, @@ -3138,6 +3208,9 @@ "loginInitiated": { "message": "Login initiated" }, + "logInRequestSent": { + "message": "Request sent" + }, "exposedMasterPassword": { "message": "Exposed Master Password" }, @@ -4146,15 +4219,6 @@ "itemName": { "message": "Item name" }, - "cannotRemoveViewOnlyCollections": { - "message": "You cannot remove collections with View only permissions: $COLLECTIONS$", - "placeholders": { - "collections": { - "content": "$1", - "example": "Work, Personal" - } - } - }, "organizationIsDeactivated": { "message": "Organization is deactivated" }, @@ -4887,6 +4951,15 @@ "extraWide": { "message": "Extra wide" }, + "cannotRemoveViewOnlyCollections": { + "message": "You cannot remove collections with View only permissions: $COLLECTIONS$", + "placeholders": { + "collections": { + "content": "$1", + "example": "Work, Personal" + } + } + }, "updateDesktopAppOrDisableFingerprintDialogTitle": { "message": "Please update your desktop application" }, diff --git a/apps/browser/src/_locales/or/messages.json b/apps/browser/src/_locales/or/messages.json index eb44a6806d1..33ba50ddab4 100644 --- a/apps/browser/src/_locales/or/messages.json +++ b/apps/browser/src/_locales/or/messages.json @@ -2363,6 +2363,70 @@ "autofillBlockedNoticeGuidance": { "message": "Change this in settings" }, + "change": { + "message": "Change" + }, + "changeButtonTitle": { + "message": "Change password - $ITEMNAME$", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "atRiskPasswords": { + "message": "At-risk passwords" + }, + "atRiskPasswordsDescSingleOrg": { + "message": "$ORGANIZATION$ is requesting you change the $COUNT$ passwords because they are at risk.", + "placeholders": { + "organization": { + "content": "$1", + "example": "Acme Corp" + }, + "count": { + "content": "$2", + "example": "2" + } + } + }, + "atRiskPasswordsDescMultiOrg": { + "message": "Your organizations are requesting you change the $COUNT$ passwords because they are at risk.", + "placeholders": { + "count": { + "content": "$1", + "example": "2" + } + } + }, + "reviewAndChangeAtRiskPassword": { + "message": "Review and change one at-risk password" + }, + "reviewAndChangeAtRiskPasswordsPlural": { + "message": "Review and change $COUNT$ at-risk passwords", + "placeholders": { + "count": { + "content": "$1", + "example": "2" + } + } + }, + "changeAtRiskPasswordsFaster": { + "message": "Change at-risk passwords faster" + }, + "changeAtRiskPasswordsFasterDesc": { + "message": "Update your settings so you can quickly autofill your passwords and generate new ones" + }, + "turnOnAutofill": { + "message": "Turn on autofill" + }, + "turnedOnAutofill": { + "message": "Turned on autofill" + }, + "dismiss": { + "message": "Dismiss" + }, "websiteItemLabel": { "message": "Website $number$ (URI)", "placeholders": { @@ -3123,12 +3187,18 @@ "notificationSentDevice": { "message": "A notification has been sent to your device." }, + "notificationSentDevicePart1": { + "message": "Unlock Bitwarden on your device or on the" + }, + "notificationSentDeviceAnchor": { + "message": "web app" + }, + "notificationSentDevicePart2": { + "message": "Make sure the Fingerprint phrase matches the one below before approving." + }, "aNotificationWasSentToYourDevice": { "message": "A notification was sent to your device" }, - "makeSureYourAccountIsUnlockedAndTheFingerprintEtc": { - "message": "Make sure your account is unlocked and the fingerprint phrase matches on the other device" - }, "youWillBeNotifiedOnceTheRequestIsApproved": { "message": "You will be notified once the request is approved" }, @@ -3138,6 +3208,9 @@ "loginInitiated": { "message": "Login initiated" }, + "logInRequestSent": { + "message": "Request sent" + }, "exposedMasterPassword": { "message": "Exposed Master Password" }, @@ -4146,15 +4219,6 @@ "itemName": { "message": "Item name" }, - "cannotRemoveViewOnlyCollections": { - "message": "You cannot remove collections with View only permissions: $COLLECTIONS$", - "placeholders": { - "collections": { - "content": "$1", - "example": "Work, Personal" - } - } - }, "organizationIsDeactivated": { "message": "Organization is deactivated" }, @@ -4887,6 +4951,15 @@ "extraWide": { "message": "Extra wide" }, + "cannotRemoveViewOnlyCollections": { + "message": "You cannot remove collections with View only permissions: $COLLECTIONS$", + "placeholders": { + "collections": { + "content": "$1", + "example": "Work, Personal" + } + } + }, "updateDesktopAppOrDisableFingerprintDialogTitle": { "message": "Please update your desktop application" }, diff --git a/apps/browser/src/_locales/pl/messages.json b/apps/browser/src/_locales/pl/messages.json index 8d8f38603c5..044a22d6863 100644 --- a/apps/browser/src/_locales/pl/messages.json +++ b/apps/browser/src/_locales/pl/messages.json @@ -23,7 +23,7 @@ "message": "Nowy użytkownik Bitwarden?" }, "logInWithPasskey": { - "message": "Zaloguj się używając passkey" + "message": "Zaloguj się używając klucza dostępu" }, "useSingleSignOn": { "message": "Użyj jednokrotnego logowania" @@ -120,7 +120,7 @@ "message": "Kopiuj hasło" }, "copyPassphrase": { - "message": "Kopiuj frazę bezpieczeństwa" + "message": "Skopiuj hasło wyrazowe" }, "copyNote": { "message": "Kopiuj notatkę" @@ -147,7 +147,7 @@ "message": "Kopiuj numer PESEL" }, "copyPassportNumber": { - "message": "Kopiuj numer paszportu" + "message": "Skopiuj numer paszportu" }, "copyLicenseNumber": { "message": "Kopiuj numer licencji" @@ -443,19 +443,19 @@ "message": "Wygeneruj hasło" }, "generatePassphrase": { - "message": "Wygenruj frazę zabezpieczającą" + "message": "Wygeneruj hasło wyrazowe" }, "passwordGenerated": { - "message": "Password generated" + "message": "Hasło zostało wygenerowane" }, "passphraseGenerated": { - "message": "Passphrase generated" + "message": "Hasło wyrazowe zostało wygenerowane" }, "usernameGenerated": { - "message": "Username generated" + "message": "Nazwa użytkownika została wygenerowana" }, "emailGenerated": { - "message": "Email generated" + "message": "E-mail został wygenerowany" }, "regeneratePassword": { "message": "Wygeneruj ponownie hasło" @@ -660,10 +660,10 @@ "message": "Zweryfikuj tożsamość" }, "weDontRecognizeThisDevice": { - "message": "We don't recognize this device. Enter the code sent to your email to verify your identity." + "message": "Nie rozpoznajemy tego urządzenia. Wpisz kod wysłany na Twój e-mail, aby zweryfikować tożsamość." }, "continueLoggingIn": { - "message": "Continue logging in" + "message": "Kontynuuj logowanie" }, "yourVaultIsLocked": { "message": "Sejf jest zablokowany. Zweryfikuj swoją tożsamość, aby kontynuować." @@ -806,7 +806,7 @@ "message": "Zalogowałeś się pomyślnie" }, "youMayCloseThisWindow": { - "message": "Możesz zamknąć to okno." + "message": "Możesz zamknąć to okno" }, "masterPassSent": { "message": "Wysłaliśmy Tobie wiadomość e-mail z podpowiedzią do hasła głównego." @@ -1005,7 +1005,7 @@ "message": "Poproś o dodanie elementu, jeśli nie zostanie znaleziony w Twoim sejfie. Dotyczy wszystkich zalogowanych kont." }, "showCardsInVaultViewV2": { - "message": "Always show cards as Autofill suggestions on Vault view" + "message": "Zawsze pokazuj karty jako sugestie autouzupełniania w widoku sejfu" }, "showCardsCurrentTab": { "message": "Pokaż karty na stronie głównej" @@ -1014,7 +1014,7 @@ "message": "Pokaż elementy karty na stronie głównej, aby ułatwić autouzupełnianie." }, "showIdentitiesInVaultViewV2": { - "message": "Always show identities as Autofill suggestions on Vault view" + "message": "Zawsze pokazuj tożsamości jako sugestie autouzupełniania w widoku sejfu" }, "showIdentitiesCurrentTab": { "message": "Pokaż tożsamości na stronie głównej" @@ -1049,10 +1049,10 @@ "message": "Poproś o aktualizację hasła, gdy zmiana zostanie wykryta na stronie. Dotyczy wszystkich zalogowanych kont." }, "enableUsePasskeys": { - "message": "Pytaj o zapisywanie i używanie passkey" + "message": "Pytaj o zapisywanie i używanie kluczy dostępu" }, "usePasskeysDesc": { - "message": "Pytaj o zapisywanie nowych passkey albo danych logowania z passkey w Twoim sejfie. Dotyczy wszystkich zalogowanych kont." + "message": "Pytaj o zapisywanie nowych kluczy dostępu albo danych logowania z kluczy w Twoim sejfie. Dotyczy wszystkich zalogowanych kont." }, "notificationChangeDesc": { "message": "Czy chcesz zaktualizować to hasło w Bitwarden?" @@ -1073,7 +1073,7 @@ "message": "Pokaż opcje menu kontekstowego" }, "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 generowania haseł i pasujących danych logowania do witryny." }, "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." @@ -1493,7 +1493,7 @@ "message": "Pokazuj karty jako sugestie" }, "showInlineMenuOnIconSelectionLabel": { - "message": "Wyświetlaj sugestie kiedy ikona jest zaznaczona" + "message": "Wyświetlaj sugestie, kiedy ikona jest zaznaczona" }, "showInlineMenuOnFormFieldsDescAlt": { "message": "Dotyczy wszystkich zalogowanych kont." @@ -1538,7 +1538,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": "Po włączeniu autouzupełnianiu po załadowaniu strony możesz włączyć lub wyłączyć tę funkcję dla poszczególnych wpisów." }, "itemAutoFillOnPageLoad": { "message": "Automatycznie uzupełniaj po załadowaniu strony (jeśli włączono w opcjach)" @@ -2062,7 +2062,7 @@ "message": "Generator nazw użytkownika" }, "useThisEmail": { - "message": "Use this email" + "message": "Użyj tego adresu e-mail" }, "useThisPassword": { "message": "Użyj tego hasła" @@ -2132,7 +2132,7 @@ "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)." @@ -2141,7 +2141,7 @@ "message": "Nadal chcesz uzupełnić ten login?" }, "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ż zapisany adres URI dla tego loginu. Wybierz OK, aby i tak automatycznie wypełnić lub anuluj, aby zatrzymać." }, "autofillIframeWarningTip": { "message": "Aby zapobiec temu ostrzeżeniu w przyszłości, zapisz ten URI, $HOSTNAME$, dla tej witryny.", @@ -2285,7 +2285,7 @@ "message": "Klucz biometryczny jest niepoprawny" }, "nativeMessagingWrongUserKeyDesc": { - "message": "Odblokowanie biometryczne nie powiodło się. Sekretny klucz biometryczny nie odblokował sejfu. Spróbuj skonfigurować biometrię ponownie." + "message": "Odblokowanie biometryczne się nie powiodło. Sekretny klucz biometryczny nie odblokował sejfu. Spróbuj skonfigurować biometrię ponownie." }, "biometricsNotEnabledTitle": { "message": "Dane biometryczne są wyłączone" @@ -2355,7 +2355,7 @@ "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." }, "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": "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ę." }, "autofillBlockedNoticeV2": { "message": "Autouzupełnianie jest zablokowane dla tej witryny." @@ -2363,6 +2363,70 @@ "autofillBlockedNoticeGuidance": { "message": "Zmień to w ustawieniach" }, + "change": { + "message": "Zmień" + }, + "changeButtonTitle": { + "message": "Zmień hasło - $ITEMNAME$", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "atRiskPasswords": { + "message": "Zagrożone hasła" + }, + "atRiskPasswordsDescSingleOrg": { + "message": "$ORGANIZATION$ prosi o zmianę $COUNT$ haseł, ponieważ są one zagrożone.", + "placeholders": { + "organization": { + "content": "$1", + "example": "Acme Corp" + }, + "count": { + "content": "$2", + "example": "2" + } + } + }, + "atRiskPasswordsDescMultiOrg": { + "message": "Twoje organizacje proszą o zmianę $COUNT$ haseł, ponieważ są one zagrożone.", + "placeholders": { + "count": { + "content": "$1", + "example": "2" + } + } + }, + "reviewAndChangeAtRiskPassword": { + "message": "Przejrzyj i zmień jedno zagrożone hasło" + }, + "reviewAndChangeAtRiskPasswordsPlural": { + "message": "Przejrzyj i zmień $COUNT$ zagrożonych haseł ", + "placeholders": { + "count": { + "content": "$1", + "example": "2" + } + } + }, + "changeAtRiskPasswordsFaster": { + "message": "Zmień zagrożone hasła szybciej" + }, + "changeAtRiskPasswordsFasterDesc": { + "message": "Zaktualizuj swoje ustawienia, aby szybko autouzupełniać hasła i generować nowe" + }, + "turnOnAutofill": { + "message": "Włącz autouzupełnienie" + }, + "turnedOnAutofill": { + "message": "Włączono autouzupełnianie" + }, + "dismiss": { + "message": "Odrzuć" + }, "websiteItemLabel": { "message": "Strona internetowa $number$ (URI)", "placeholders": { @@ -2573,7 +2637,7 @@ "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": "Aby utworzyć plik Send, musisz wysunąć rozszerzenie do nowego okna.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendLinuxChromiumFileWarning": { @@ -2829,11 +2893,11 @@ "message": "Bitwarden nie mógł odszyfrować elementów sejfu wymienionych poniżej." }, "contactCSToAvoidDataLossPart1": { - "message": "Contact customer success", + "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": "to avoid additional data loss.", + "message": "aby uniknąć dalszej utraty danych.", "description": "This is part of a larger sentence. The full sentence will read 'Contact customer success to avoid additional data loss.'" }, "generateUsername": { @@ -3123,12 +3187,18 @@ "notificationSentDevice": { "message": "Powiadomienie zostało wysłane na urządzenie." }, + "notificationSentDevicePart1": { + "message": "Odblokuj Bitwarden na swoim urządzeniu lub w" + }, + "notificationSentDeviceAnchor": { + "message": "aplikacji internetowej" + }, + "notificationSentDevicePart2": { + "message": "Upewnij się, że fraza odcisku palca zgadza się z tą poniżej, zanim zatwierdzisz." + }, "aNotificationWasSentToYourDevice": { "message": "Powiadomienie zostało wysłane na twoje urządzenie" }, - "makeSureYourAccountIsUnlockedAndTheFingerprintEtc": { - "message": "Upewnij się, że Twoje konto jest odblokowane, a unikalny identyfikator konta pasuje do drugiego urządzenia" - }, "youWillBeNotifiedOnceTheRequestIsApproved": { "message": "Zostaniesz powiadomiony po zatwierdzeniu prośby" }, @@ -3138,6 +3208,9 @@ "loginInitiated": { "message": "Logowanie rozpoczęte" }, + "logInRequestSent": { + "message": "Żądanie wysłane" + }, "exposedMasterPassword": { "message": "Ujawnione hasło główne" }, @@ -3169,7 +3242,7 @@ } }, "autofillPageLoadPolicyActivated": { - "message": "Twoja organizacji włączyła autouzupełnianie podczas wczytywania strony." + "message": "Twoja organizacja włączyła autouzupełnianie podczas wczytywania strony." }, "howToAutofill": { "message": "Jak autouzupełniać" @@ -3244,7 +3317,7 @@ "message": "Zapamiętaj to urządzenie" }, "uncheckIfPublicDevice": { - "message": "Odznacz jeśli używasz publicznego urządzenia" + "message": "Odznacz, jeśli używasz publicznego urządzenia" }, "approveFromYourOtherDevice": { "message": "Zatwierdź z innego twojego urządzenia" @@ -3447,7 +3520,7 @@ "message": "Domena aliasu" }, "passwordRepromptDisabledAutofillOnPageLoad": { - "message": "Elementy z pytaniem o hasło głównege nie mogą być automatycznie wypełniane przy wczytywaniu strony. Automatyczne wypełnianie po wczytywania strony zostało wyłączone.", + "message": "Elementy z pytaniem o hasło główne nie mogą być autouzupełniane przy wczytywaniu strony. Autouzupełnianie podczas wczytywania strony zostało wyłączone.", "description": "Toast message for describing that master password re-prompt cannot be autofilled on page load." }, "autofillOnPageLoadSetToDefault": { @@ -3493,7 +3566,7 @@ "description": "Screen reader text (aria-label) for unlock account button in overlay" }, "totpCodeAria": { - "message": "Time-based One-Time Password Verification Code", + "message": "Kod weryfikacyjny jednorazowego hasła oparty na czasie", "description": "Aria label for the totp code displayed in the inline menu for autofill" }, "totpSecondsSpanAria": { @@ -3723,7 +3796,7 @@ "message": "Dane sejfu zostały wyeksportowane" }, "typePasskey": { - "message": "Passkey" + "message": "Klucz dostępu" }, "accessing": { "message": "Uzyskiwanie dostępu" @@ -3732,22 +3805,22 @@ "message": "Zalogowano!" }, "passkeyNotCopied": { - "message": "Passkey nie zostanie skopiowany" + "message": "Klucz dostępu nie zostanie skopiowany" }, "passkeyNotCopiedAlert": { - "message": "Passkey nie zostanie skopiowane do sklonowanego elementu. Czy chcesz kontynuować klonowanie tego elementu?" + "message": "Klucz dostępu nie zostanie skopiowany do sklonowanego elementu. Czy chcesz kontynuować klonowanie tego 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": "Zaloguj się za pomocą passkey?" + "message": "Zalogować za pomocą klucza dostępu?" }, "passkeyAlreadyExists": { - "message": "Passkey już istnieje dla tej aplikacji." + "message": "Klucz dostępu już istnieje dla tej aplikacji." }, "noPasskeysFoundForThisApplication": { - "message": "Nie znaleziono passkey'a dla tej aplikacji." + "message": "Nie znaleziono klucza dostępu dla tej aplikacji." }, "noMatchingPasskeyLogin": { "message": "Nie masz pasujących danych logowania do tej witryny." @@ -3756,37 +3829,37 @@ "message": "Brak pasujących loginów dla tej witryny" }, "searchSavePasskeyNewLogin": { - "message": "Wyszukaj alb zapisz passkey jako nowy login" + "message": "Wyszukaj albo zapisz klucz dostępu jako nowy login" }, "confirm": { "message": "Potwierdź" }, "savePasskey": { - "message": "Zapisz passkey" + "message": "Zapisz klucz dostępu" }, "savePasskeyNewLogin": { - "message": "Zapisz passkey jako nowe dane logowania" + "message": "Zapisz klucz dostępu jako nowe dane logowania" }, "chooseCipherForPasskeySave": { - "message": "Wybierz dane logowania do których przypisać passkey" + "message": "Wybierz dane logowania, do których przypisać klucz dostępu" }, "chooseCipherForPasskeyAuth": { - "message": "Wybierz passkey żeby się zalogować" + "message": "Wybierz klucz dostępu, żeby się zalogować" }, "passkeyItem": { - "message": "Element Passkey" + "message": "Element klucza dostępu" }, "overwritePasskey": { - "message": "Zastąpić passkey?" + "message": "Zastąpić klucz dostępu?" }, "overwritePasskeyAlert": { - "message": "Ten element zawiera już passkey. Czy na pewno chcesz nadpisać bieżący passkey?" + "message": "Ten element zawiera już klucz dostępu. Czy na pewno chcesz nadpisać bieżący klucza dostępu?" }, "featureNotSupported": { "message": "Funkcja nie jest jeszcze obsługiwana" }, "yourPasskeyIsLocked": { - "message": "Wymagane uwierzytelnienie aby używać passkey. Sprawdź swoją tożsamość, aby kontynuować." + "message": "Wymagane uwierzytelnienie, aby używać klucza dostępu. Sprawdź swoją tożsamość, aby kontynuować." }, "multifactorAuthenticationCancelled": { "message": "Uwierzytelnianie wieloskładnikowe zostało anulowane" @@ -3988,10 +4061,10 @@ "message": "Sukces" }, "removePasskey": { - "message": "Usuń passkey" + "message": "Usuń klucz dostępu" }, "passkeyRemoved": { - "message": "Passkey został usunięty" + "message": "Klucz dostępu został usunięty" }, "autofillSuggestions": { "message": "Sugestie autouzupełniania" @@ -4146,15 +4219,6 @@ "itemName": { "message": "Nazwa elementu" }, - "cannotRemoveViewOnlyCollections": { - "message": "Nie można usunąć kolekcji z uprawnieniami tylko do przeglądania: $COLLECTIONS$", - "placeholders": { - "collections": { - "content": "$1", - "example": "Work, Personal" - } - } - }, "organizationIsDeactivated": { "message": "Organizacja jest wyłączona" }, @@ -4358,7 +4422,7 @@ "message": "Dane" }, "passkeys": { - "message": "Passkeys", + "message": "Klucze dostępu", "description": "A section header for a list of passkeys." }, "passwords": { @@ -4366,7 +4430,7 @@ "description": "A section header for a list of passwords." }, "logInWithPasskeyAriaLabel": { - "message": "Zaloguj się za pomocą passkey", + "message": "Zaloguj się za pomocą klucza dostępu", "description": "ARIA label for the inline menu button that logs in with a passkey." }, "assign": { @@ -4448,7 +4512,7 @@ } }, "reorderToggleButton": { - "message": "Zmień kolejność $LABEL$. Użyj klawiszy że strzałkami aby przenieść element w górę lub w dół.", + "message": "Zmień kolejność $LABEL$. Użyj klawiszy ze strzałkami, aby przenieść element w górę lub w dół.", "placeholders": { "label": { "content": "$1", @@ -4564,16 +4628,16 @@ "message": "Lokalizacja elementu" }, "fileSend": { - "message": "File Send" + "message": "Wysyłka pliku" }, "fileSends": { - "message": "File Sends" + "message": "Wysyłki plików" }, "textSend": { - "message": "Text Send" + "message": "Wysyłka tekstu" }, "textSends": { - "message": "Text Sends" + "message": "Wysyłki tekstów" }, "accountActions": { "message": "Akcje konta" @@ -4704,7 +4768,7 @@ "description": "Represents the ~ key in screen reader content as a readable word" }, "backtickCharacterDescriptor": { - "message": "Backtick", + "message": "Grawis", "description": "Represents the ` key in screen reader content as a readable word" }, "exclamationCharacterDescriptor": { @@ -4728,7 +4792,7 @@ "description": "Represents the % key in screen reader content as a readable word" }, "caretCharacterDescriptor": { - "message": "Caret", + "message": "Daszek", "description": "Represents the ^ key in screen reader content as a readable word" }, "ampersandCharacterDescriptor": { @@ -4784,7 +4848,7 @@ "description": "Represents the | key in screen reader content as a readable word" }, "backSlashCharacterDescriptor": { - "message": "Back slash", + "message": "Ukośnik wsteczny", "description": "Represents the back slash key in screen reader content as a readable word" }, "colonCharacterDescriptor": { @@ -4824,7 +4888,7 @@ "description": "Represents the ? key in screen reader content as a readable word" }, "forwardSlashCharacterDescriptor": { - "message": "Forward slash", + "message": "Ukośnik prawy", "description": "Represents the / key in screen reader content as a readable word" }, "lowercaseAriaLabel": { @@ -4852,7 +4916,7 @@ "message": "Bitwarden wyśle kod na Twój adres e-mail w celu zweryfikowania logowania z nowych urządzeń, począwszy od lutego 2025 r." }, "newDeviceVerificationNoticeContentPage2": { - "message": "Możesz skonfigurować dwustopniowe logowanie jako alternatywny sposób ochrony konta lub zmienić swój adres e-mail do którego masz dostęp." + "message": "Możesz skonfigurować dwustopniowe logowanie jako alternatywny sposób ochrony konta lub zmienić swój adres e-mail, do którego masz dostęp." }, "remindMeLater": { "message": "Przypomnij mi później" @@ -4887,10 +4951,19 @@ "extraWide": { "message": "Bardzo szerokie" }, + "cannotRemoveViewOnlyCollections": { + "message": "Nie można usunąć kolekcji z uprawnieniami tylko do przeglądania: $COLLECTIONS$", + "placeholders": { + "collections": { + "content": "$1", + "example": "Work, Personal" + } + } + }, "updateDesktopAppOrDisableFingerprintDialogTitle": { - "message": "Please update your desktop application" + "message": "Zaktualizuj aplikację na komputer" }, "updateDesktopAppOrDisableFingerprintDialogMessage": { - "message": "To use biometric unlock, please update your desktop application, or disable fingerprint unlock in the desktop settings." + "message": "Aby używać odblokowywania biometrycznego, zaktualizuj aplikację na komputerze lub wyłącz odblokowywanie odciskiem palca w ustawieniach aplikacji na komputerze." } } diff --git a/apps/browser/src/_locales/pt_BR/messages.json b/apps/browser/src/_locales/pt_BR/messages.json index 2de90042386..d0002a7f419 100644 --- a/apps/browser/src/_locales/pt_BR/messages.json +++ b/apps/browser/src/_locales/pt_BR/messages.json @@ -2363,6 +2363,70 @@ "autofillBlockedNoticeGuidance": { "message": "Change this in settings" }, + "change": { + "message": "Change" + }, + "changeButtonTitle": { + "message": "Change password - $ITEMNAME$", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "atRiskPasswords": { + "message": "At-risk passwords" + }, + "atRiskPasswordsDescSingleOrg": { + "message": "$ORGANIZATION$ is requesting you change the $COUNT$ passwords because they are at risk.", + "placeholders": { + "organization": { + "content": "$1", + "example": "Acme Corp" + }, + "count": { + "content": "$2", + "example": "2" + } + } + }, + "atRiskPasswordsDescMultiOrg": { + "message": "Your organizations are requesting you change the $COUNT$ passwords because they are at risk.", + "placeholders": { + "count": { + "content": "$1", + "example": "2" + } + } + }, + "reviewAndChangeAtRiskPassword": { + "message": "Review and change one at-risk password" + }, + "reviewAndChangeAtRiskPasswordsPlural": { + "message": "Review and change $COUNT$ at-risk passwords", + "placeholders": { + "count": { + "content": "$1", + "example": "2" + } + } + }, + "changeAtRiskPasswordsFaster": { + "message": "Change at-risk passwords faster" + }, + "changeAtRiskPasswordsFasterDesc": { + "message": "Update your settings so you can quickly autofill your passwords and generate new ones" + }, + "turnOnAutofill": { + "message": "Turn on autofill" + }, + "turnedOnAutofill": { + "message": "Turned on autofill" + }, + "dismiss": { + "message": "Dismiss" + }, "websiteItemLabel": { "message": "Site $number$ (URI)", "placeholders": { @@ -3123,12 +3187,18 @@ "notificationSentDevice": { "message": "Uma notificação foi enviada para seu dispositivo." }, + "notificationSentDevicePart1": { + "message": "Unlock Bitwarden on your device or on the" + }, + "notificationSentDeviceAnchor": { + "message": "web app" + }, + "notificationSentDevicePart2": { + "message": "Make sure the Fingerprint phrase matches the one below before approving." + }, "aNotificationWasSentToYourDevice": { "message": "Uma notificação foi enviada para o seu dispositivo" }, - "makeSureYourAccountIsUnlockedAndTheFingerprintEtc": { - "message": "Certifique-se que sua conta esteja desbloqueada e que a frase de identificação corresponda à do outro dispositivo" - }, "youWillBeNotifiedOnceTheRequestIsApproved": { "message": "Você será notificado assim que a requisição for aprovada" }, @@ -3138,6 +3208,9 @@ "loginInitiated": { "message": "Login iniciado" }, + "logInRequestSent": { + "message": "Request sent" + }, "exposedMasterPassword": { "message": "Senha mestra comprometida" }, @@ -4146,15 +4219,6 @@ "itemName": { "message": "Nome do item" }, - "cannotRemoveViewOnlyCollections": { - "message": "Você não pode remover coleções com permissões de Somente leitura: $COLLECTIONS$", - "placeholders": { - "collections": { - "content": "$1", - "example": "Work, Personal" - } - } - }, "organizationIsDeactivated": { "message": "A organização está desativada" }, @@ -4887,6 +4951,15 @@ "extraWide": { "message": "Extra Grande" }, + "cannotRemoveViewOnlyCollections": { + "message": "Você não pode remover coleções com permissões de Somente leitura: $COLLECTIONS$", + "placeholders": { + "collections": { + "content": "$1", + "example": "Work, Personal" + } + } + }, "updateDesktopAppOrDisableFingerprintDialogTitle": { "message": "Please update your desktop application" }, diff --git a/apps/browser/src/_locales/pt_PT/messages.json b/apps/browser/src/_locales/pt_PT/messages.json index 706e39bff9a..5e6a8e54701 100644 --- a/apps/browser/src/_locales/pt_PT/messages.json +++ b/apps/browser/src/_locales/pt_PT/messages.json @@ -296,7 +296,7 @@ "message": "Continuar para a loja de extensões do navegador?" }, "continueToBrowserExtensionStoreDesc": { - "message": "Ajude outras pessoas a descobrir se o Bitwarden lhes é adequado. Visite a loja de extensões do seu navegador e deixe uma avaliação agora." + "message": "Ajude outras pessoas a descobrir se o Bitwarden lhes é adequado. Visite a loja de extensões do seu navegador e deixe uma classificação agora." }, "changeMasterPasswordOnWebConfirmation": { "message": "Pode alterar a sua palavra-passe mestra na aplicação Web Bitwarden." @@ -340,7 +340,7 @@ "message": "Gestor de Segredos Bitwarden" }, "continueToSecretsManagerPageDesc": { - "message": "Armazene, gira e partilhe segredos de programador de forma segura com o Gestor de Segredos Bitwarden. Saiba mais no site bitwarden.com." + "message": "Armazene, faça a gestão e partilhe de forma segura os segredos dos programadores com o Gestor de Segredos Bitwarden. Saiba mais no site bitwarden.com." }, "passwordlessDotDev": { "message": "Passwordless.dev" @@ -379,7 +379,7 @@ "message": "Nome da pasta" }, "folderHintText": { - "message": "Aninhe uma pasta adicionando o nome da pasta principal seguido de um \"/\". Exemplo: Redes Sociais/Fóruns" + "message": "Crie uma subpasta adicionando o nome da pasta principal seguido de um \"/\". Exemplo: Redes Sociais/Fóruns" }, "noFoldersAdded": { "message": "Nenhuma pasta adicionada" @@ -651,7 +651,7 @@ "message": "Outras opções" }, "rateExtension": { - "message": "Avaliar a extensão" + "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." @@ -1598,7 +1598,7 @@ "message": "Booleano" }, "cfTypeCheckbox": { - "message": "Checkbox" + "message": "Caixa de verificação" }, "cfTypeLinked": { "message": "Associado", @@ -2363,6 +2363,70 @@ "autofillBlockedNoticeGuidance": { "message": "Alterar esta opção nas definições" }, + "change": { + "message": "Alterar" + }, + "changeButtonTitle": { + "message": "Alterar palavra-passe - $ITEMNAME$", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "atRiskPasswords": { + "message": "Palavras-passe em risco" + }, + "atRiskPasswordsDescSingleOrg": { + "message": "A $ORGANIZATION$ pede-lhe que altere as $COUNT$ palavras-passe por estarem em risco.", + "placeholders": { + "organization": { + "content": "$1", + "example": "Acme Corp" + }, + "count": { + "content": "$2", + "example": "2" + } + } + }, + "atRiskPasswordsDescMultiOrg": { + "message": "As suas organizações pedem-lhe que altere as $COUNT$ palavras-passe por estarem em risco.", + "placeholders": { + "count": { + "content": "$1", + "example": "2" + } + } + }, + "reviewAndChangeAtRiskPassword": { + "message": "Rever e alterar uma palavra-passe em risco" + }, + "reviewAndChangeAtRiskPasswordsPlural": { + "message": "Rever e alterar as $COUNT$ palavras-passe em risco", + "placeholders": { + "count": { + "content": "$1", + "example": "2" + } + } + }, + "changeAtRiskPasswordsFaster": { + "message": "Alterar mais rapidamente as palavras-passe em risco" + }, + "changeAtRiskPasswordsFasterDesc": { + "message": "Atualize as suas definições para poder preencher automaticamente as suas palavras-passe e gerar novas palavras-passe" + }, + "turnOnAutofill": { + "message": "Ativar o preenchimento automático" + }, + "turnedOnAutofill": { + "message": "Preenchimento automático ativado" + }, + "dismiss": { + "message": "Dispensar" + }, "websiteItemLabel": { "message": "Site $number$ (URI)", "placeholders": { @@ -3123,12 +3187,18 @@ "notificationSentDevice": { "message": "Foi enviada uma notificação para o seu dispositivo." }, + "notificationSentDevicePart1": { + "message": "Desbloqueie o Bitwarden no seu dispositivo ou no " + }, + "notificationSentDeviceAnchor": { + "message": "aplicação web" + }, + "notificationSentDevicePart2": { + "message": "Certifique-se de que a frase da impressão digital corresponde à frase abaixo indicada antes de a aprovar." + }, "aNotificationWasSentToYourDevice": { "message": "Foi enviada uma notificação para o seu dispositivo" }, - "makeSureYourAccountIsUnlockedAndTheFingerprintEtc": { - "message": "Certifique-se de que a sua conta está desbloqueada e que a frase de impressão digital corresponde à do outro dispositivo" - }, "youWillBeNotifiedOnceTheRequestIsApproved": { "message": "Será notificado quando o pedido for aprovado" }, @@ -3138,6 +3208,9 @@ "loginInitiated": { "message": "A preparar o início de sessão" }, + "logInRequestSent": { + "message": "Pedido enviado" + }, "exposedMasterPassword": { "message": "Palavra-passe mestra exposta" }, @@ -3208,7 +3281,7 @@ "message": "O atalho de preenchimento automático de credenciais não está definido. Altere-o nas definições do navegador." }, "autofillLoginShortcutText": { - "message": "O atalho de preenchimento automático de credenciais é $COMMAND$. Gira todos os atalhos nas definidções do navegador.", + "message": "O atalho de preenchimento automático de credenciais é $COMMAND$. Organize todos os atalhos nas definições do navegador.", "placeholders": { "command": { "content": "$1", @@ -4146,15 +4219,6 @@ "itemName": { "message": "Nome do item" }, - "cannotRemoveViewOnlyCollections": { - "message": "Não é possível remover coleções com permissões de Apenas visualização: $COLLECTIONS$", - "placeholders": { - "collections": { - "content": "$1", - "example": "Work, Personal" - } - } - }, "organizationIsDeactivated": { "message": "A organização está desativada" }, @@ -4887,6 +4951,15 @@ "extraWide": { "message": "Muito ampla" }, + "cannotRemoveViewOnlyCollections": { + "message": "Não é possível remover coleções com permissões de Apenas visualização: $COLLECTIONS$", + "placeholders": { + "collections": { + "content": "$1", + "example": "Work, Personal" + } + } + }, "updateDesktopAppOrDisableFingerprintDialogTitle": { "message": "Por favor, atualize a sua aplicação para computador" }, diff --git a/apps/browser/src/_locales/ro/messages.json b/apps/browser/src/_locales/ro/messages.json index 966d2b4e01d..b61afdf9c2c 100644 --- a/apps/browser/src/_locales/ro/messages.json +++ b/apps/browser/src/_locales/ro/messages.json @@ -2363,6 +2363,70 @@ "autofillBlockedNoticeGuidance": { "message": "Change this in settings" }, + "change": { + "message": "Change" + }, + "changeButtonTitle": { + "message": "Change password - $ITEMNAME$", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "atRiskPasswords": { + "message": "At-risk passwords" + }, + "atRiskPasswordsDescSingleOrg": { + "message": "$ORGANIZATION$ is requesting you change the $COUNT$ passwords because they are at risk.", + "placeholders": { + "organization": { + "content": "$1", + "example": "Acme Corp" + }, + "count": { + "content": "$2", + "example": "2" + } + } + }, + "atRiskPasswordsDescMultiOrg": { + "message": "Your organizations are requesting you change the $COUNT$ passwords because they are at risk.", + "placeholders": { + "count": { + "content": "$1", + "example": "2" + } + } + }, + "reviewAndChangeAtRiskPassword": { + "message": "Review and change one at-risk password" + }, + "reviewAndChangeAtRiskPasswordsPlural": { + "message": "Review and change $COUNT$ at-risk passwords", + "placeholders": { + "count": { + "content": "$1", + "example": "2" + } + } + }, + "changeAtRiskPasswordsFaster": { + "message": "Change at-risk passwords faster" + }, + "changeAtRiskPasswordsFasterDesc": { + "message": "Update your settings so you can quickly autofill your passwords and generate new ones" + }, + "turnOnAutofill": { + "message": "Turn on autofill" + }, + "turnedOnAutofill": { + "message": "Turned on autofill" + }, + "dismiss": { + "message": "Dismiss" + }, "websiteItemLabel": { "message": "Website $number$ (URI)", "placeholders": { @@ -3123,12 +3187,18 @@ "notificationSentDevice": { "message": "O notificare a fost trimisă pe dispozitivul dvs." }, + "notificationSentDevicePart1": { + "message": "Unlock Bitwarden on your device or on the" + }, + "notificationSentDeviceAnchor": { + "message": "web app" + }, + "notificationSentDevicePart2": { + "message": "Make sure the Fingerprint phrase matches the one below before approving." + }, "aNotificationWasSentToYourDevice": { "message": "A notification was sent to your device" }, - "makeSureYourAccountIsUnlockedAndTheFingerprintEtc": { - "message": "Make sure your account is unlocked and the fingerprint phrase matches on the other device" - }, "youWillBeNotifiedOnceTheRequestIsApproved": { "message": "You will be notified once the request is approved" }, @@ -3138,6 +3208,9 @@ "loginInitiated": { "message": "Conectare inițiată" }, + "logInRequestSent": { + "message": "Request sent" + }, "exposedMasterPassword": { "message": "Parolă principală compromisă" }, @@ -4146,15 +4219,6 @@ "itemName": { "message": "Item name" }, - "cannotRemoveViewOnlyCollections": { - "message": "You cannot remove collections with View only permissions: $COLLECTIONS$", - "placeholders": { - "collections": { - "content": "$1", - "example": "Work, Personal" - } - } - }, "organizationIsDeactivated": { "message": "Organization is deactivated" }, @@ -4887,6 +4951,15 @@ "extraWide": { "message": "Extra wide" }, + "cannotRemoveViewOnlyCollections": { + "message": "You cannot remove collections with View only permissions: $COLLECTIONS$", + "placeholders": { + "collections": { + "content": "$1", + "example": "Work, Personal" + } + } + }, "updateDesktopAppOrDisableFingerprintDialogTitle": { "message": "Please update your desktop application" }, diff --git a/apps/browser/src/_locales/ru/messages.json b/apps/browser/src/_locales/ru/messages.json index f0e3b53bfb2..de00e2ceb25 100644 --- a/apps/browser/src/_locales/ru/messages.json +++ b/apps/browser/src/_locales/ru/messages.json @@ -2363,6 +2363,70 @@ "autofillBlockedNoticeGuidance": { "message": "Измените это в настройках" }, + "change": { + "message": "Изменить" + }, + "changeButtonTitle": { + "message": "Изменить пароль - $ITEMNAME$", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "atRiskPasswords": { + "message": "Пароли, подверженные риску" + }, + "atRiskPasswordsDescSingleOrg": { + "message": "$ORGANIZATION$ is requesting you change the $COUNT$ passwords because they are at risk.", + "placeholders": { + "organization": { + "content": "$1", + "example": "Acme Corp" + }, + "count": { + "content": "$2", + "example": "2" + } + } + }, + "atRiskPasswordsDescMultiOrg": { + "message": "Your organizations are requesting you change the $COUNT$ passwords because they are at risk.", + "placeholders": { + "count": { + "content": "$1", + "example": "2" + } + } + }, + "reviewAndChangeAtRiskPassword": { + "message": "Review and change one at-risk password" + }, + "reviewAndChangeAtRiskPasswordsPlural": { + "message": "Review and change $COUNT$ at-risk passwords", + "placeholders": { + "count": { + "content": "$1", + "example": "2" + } + } + }, + "changeAtRiskPasswordsFaster": { + "message": "Change at-risk passwords faster" + }, + "changeAtRiskPasswordsFasterDesc": { + "message": "Update your settings so you can quickly autofill your passwords and generate new ones" + }, + "turnOnAutofill": { + "message": "Turn on autofill" + }, + "turnedOnAutofill": { + "message": "Turned on autofill" + }, + "dismiss": { + "message": "Dismiss" + }, "websiteItemLabel": { "message": "Сайт $number$ (URI)", "placeholders": { @@ -3123,12 +3187,18 @@ "notificationSentDevice": { "message": "На ваше устройство отправлено уведомление." }, + "notificationSentDevicePart1": { + "message": "Разблокируйте Bitwarden на своем устройстве или" + }, + "notificationSentDeviceAnchor": { + "message": "веб-приложении" + }, + "notificationSentDevicePart2": { + "message": "Перед одобрением убедитесь, что фраза отпечатка совпадает с приведенной ниже." + }, "aNotificationWasSentToYourDevice": { "message": "На ваше устройство было отправлено уведомление" }, - "makeSureYourAccountIsUnlockedAndTheFingerprintEtc": { - "message": "Убедитесь, что ваш аккаунт разблокирован и фраза отпечатка совпадает с фразой на другом устройстве" - }, "youWillBeNotifiedOnceTheRequestIsApproved": { "message": "Вы получите уведомление, когда запрос будет одобрен" }, @@ -3138,6 +3208,9 @@ "loginInitiated": { "message": "Вход инициирован" }, + "logInRequestSent": { + "message": "Запрос отправлен" + }, "exposedMasterPassword": { "message": "Мастер-пароль скомпрометирован" }, @@ -4146,15 +4219,6 @@ "itemName": { "message": "Название элемента" }, - "cannotRemoveViewOnlyCollections": { - "message": "Вы не можете удалить коллекции с правами только на просмотр: $COLLECTIONS$", - "placeholders": { - "collections": { - "content": "$1", - "example": "Work, Personal" - } - } - }, "organizationIsDeactivated": { "message": "Организация деактивирована" }, @@ -4887,6 +4951,15 @@ "extraWide": { "message": "Очень широкое" }, + "cannotRemoveViewOnlyCollections": { + "message": "Вы не можете удалить коллекции с правами только на просмотр: $COLLECTIONS$", + "placeholders": { + "collections": { + "content": "$1", + "example": "Work, Personal" + } + } + }, "updateDesktopAppOrDisableFingerprintDialogTitle": { "message": "Пожалуйста, обновите приложение для компьютера" }, diff --git a/apps/browser/src/_locales/si/messages.json b/apps/browser/src/_locales/si/messages.json index 9bd2006f1b2..651f40eb404 100644 --- a/apps/browser/src/_locales/si/messages.json +++ b/apps/browser/src/_locales/si/messages.json @@ -2363,6 +2363,70 @@ "autofillBlockedNoticeGuidance": { "message": "Change this in settings" }, + "change": { + "message": "Change" + }, + "changeButtonTitle": { + "message": "Change password - $ITEMNAME$", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "atRiskPasswords": { + "message": "At-risk passwords" + }, + "atRiskPasswordsDescSingleOrg": { + "message": "$ORGANIZATION$ is requesting you change the $COUNT$ passwords because they are at risk.", + "placeholders": { + "organization": { + "content": "$1", + "example": "Acme Corp" + }, + "count": { + "content": "$2", + "example": "2" + } + } + }, + "atRiskPasswordsDescMultiOrg": { + "message": "Your organizations are requesting you change the $COUNT$ passwords because they are at risk.", + "placeholders": { + "count": { + "content": "$1", + "example": "2" + } + } + }, + "reviewAndChangeAtRiskPassword": { + "message": "Review and change one at-risk password" + }, + "reviewAndChangeAtRiskPasswordsPlural": { + "message": "Review and change $COUNT$ at-risk passwords", + "placeholders": { + "count": { + "content": "$1", + "example": "2" + } + } + }, + "changeAtRiskPasswordsFaster": { + "message": "Change at-risk passwords faster" + }, + "changeAtRiskPasswordsFasterDesc": { + "message": "Update your settings so you can quickly autofill your passwords and generate new ones" + }, + "turnOnAutofill": { + "message": "Turn on autofill" + }, + "turnedOnAutofill": { + "message": "Turned on autofill" + }, + "dismiss": { + "message": "Dismiss" + }, "websiteItemLabel": { "message": "Website $number$ (URI)", "placeholders": { @@ -3123,12 +3187,18 @@ "notificationSentDevice": { "message": "A notification has been sent to your device." }, + "notificationSentDevicePart1": { + "message": "Unlock Bitwarden on your device or on the" + }, + "notificationSentDeviceAnchor": { + "message": "web app" + }, + "notificationSentDevicePart2": { + "message": "Make sure the Fingerprint phrase matches the one below before approving." + }, "aNotificationWasSentToYourDevice": { "message": "A notification was sent to your device" }, - "makeSureYourAccountIsUnlockedAndTheFingerprintEtc": { - "message": "Make sure your account is unlocked and the fingerprint phrase matches on the other device" - }, "youWillBeNotifiedOnceTheRequestIsApproved": { "message": "You will be notified once the request is approved" }, @@ -3138,6 +3208,9 @@ "loginInitiated": { "message": "Login initiated" }, + "logInRequestSent": { + "message": "Request sent" + }, "exposedMasterPassword": { "message": "Exposed Master Password" }, @@ -4146,15 +4219,6 @@ "itemName": { "message": "Item name" }, - "cannotRemoveViewOnlyCollections": { - "message": "You cannot remove collections with View only permissions: $COLLECTIONS$", - "placeholders": { - "collections": { - "content": "$1", - "example": "Work, Personal" - } - } - }, "organizationIsDeactivated": { "message": "Organization is deactivated" }, @@ -4887,6 +4951,15 @@ "extraWide": { "message": "Extra wide" }, + "cannotRemoveViewOnlyCollections": { + "message": "You cannot remove collections with View only permissions: $COLLECTIONS$", + "placeholders": { + "collections": { + "content": "$1", + "example": "Work, Personal" + } + } + }, "updateDesktopAppOrDisableFingerprintDialogTitle": { "message": "Please update your desktop application" }, diff --git a/apps/browser/src/_locales/sk/messages.json b/apps/browser/src/_locales/sk/messages.json index d8bbe1645fa..e4d221e02a6 100644 --- a/apps/browser/src/_locales/sk/messages.json +++ b/apps/browser/src/_locales/sk/messages.json @@ -2363,6 +2363,70 @@ "autofillBlockedNoticeGuidance": { "message": "Zmeňte to v nastaveniach" }, + "change": { + "message": "Zmeniť" + }, + "changeButtonTitle": { + "message": "Zmeniť heslo - $ITEMNAME$", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "atRiskPasswords": { + "message": "Rizikové heslá" + }, + "atRiskPasswordsDescSingleOrg": { + "message": "$ORGANIZATION$ vás žiada o zmenu $COUNT$ hesiel, pretože sú ohrozené.", + "placeholders": { + "organization": { + "content": "$1", + "example": "Acme Corp" + }, + "count": { + "content": "$2", + "example": "2" + } + } + }, + "atRiskPasswordsDescMultiOrg": { + "message": "Vaše organizácie vás žiadajú o zmenu $COUNT$ hesiel, pretože sú ohrozené.", + "placeholders": { + "count": { + "content": "$1", + "example": "2" + } + } + }, + "reviewAndChangeAtRiskPassword": { + "message": "Skontrolujte a zmeňte jedno ohrozené heslo" + }, + "reviewAndChangeAtRiskPasswordsPlural": { + "message": "Skontrolujte a zmeňte $COUNT$ ohrozené heslá", + "placeholders": { + "count": { + "content": "$1", + "example": "2" + } + } + }, + "changeAtRiskPasswordsFaster": { + "message": "Zmeňte rizikové heslá rýchlejšie" + }, + "changeAtRiskPasswordsFasterDesc": { + "message": "Aktualizujte nastavenia, aby ste mohli rýchlo vypĺňať svoje heslá a vygenerovať nové" + }, + "turnOnAutofill": { + "message": "Zapnúť automatické vypĺňanie" + }, + "turnedOnAutofill": { + "message": "Zapnuté automatické vypĺňanie" + }, + "dismiss": { + "message": "Zrušiť" + }, "websiteItemLabel": { "message": "Webstránka $number$ (URI)", "placeholders": { @@ -2902,7 +2966,7 @@ "message": "Služba" }, "forwardedEmail": { - "message": "Alias preposlaného e-mailu" + "message": "Alias presmerovaného e-mailu" }, "forwardedEmailDesc": { "message": "Vytvoriť e-mailový alias pomocou externej služby preposielania." @@ -3123,12 +3187,18 @@ "notificationSentDevice": { "message": "Do vášho zariadenia bolo odoslané upozornenie." }, + "notificationSentDevicePart1": { + "message": "Odomknúť Bitwarden vo svojom zariadení alebo vo" + }, + "notificationSentDeviceAnchor": { + "message": "webovej aplikácii" + }, + "notificationSentDevicePart2": { + "message": "Pred schválením sa uistite, že sa odtlačok prístupovej frázy zhoduje s tou uvedenou nižšie." + }, "aNotificationWasSentToYourDevice": { "message": "Do vášho zariadenia bolo odoslané upozornenie" }, - "makeSureYourAccountIsUnlockedAndTheFingerprintEtc": { - "message": "Uistite sa, že je váš účet odomknutý a fráza odtlačku prsta sa zhoduje s frázou na druhom zariadení" - }, "youWillBeNotifiedOnceTheRequestIsApproved": { "message": "Po schválení žiadosti budete informovaní" }, @@ -3138,6 +3208,9 @@ "loginInitiated": { "message": "Iniciované prihlásenie" }, + "logInRequestSent": { + "message": "Požiadavka bola odoslaná" + }, "exposedMasterPassword": { "message": "Odhalené hlavné heslo" }, @@ -4146,15 +4219,6 @@ "itemName": { "message": "Názov položky" }, - "cannotRemoveViewOnlyCollections": { - "message": "Zbierky, ktoré môžete len zobraziť nemôžete odstrániť: $COLLECTIONS$", - "placeholders": { - "collections": { - "content": "$1", - "example": "Work, Personal" - } - } - }, "organizationIsDeactivated": { "message": "Organizácia je vypnutá" }, @@ -4887,6 +4951,15 @@ "extraWide": { "message": "Extra široké" }, + "cannotRemoveViewOnlyCollections": { + "message": "Zbierky, ktoré môžete len zobraziť nemôžete odstrániť: $COLLECTIONS$", + "placeholders": { + "collections": { + "content": "$1", + "example": "Work, Personal" + } + } + }, "updateDesktopAppOrDisableFingerprintDialogTitle": { "message": "Aktualizujte desktopovú aplikáciu" }, diff --git a/apps/browser/src/_locales/sl/messages.json b/apps/browser/src/_locales/sl/messages.json index d533c3e02dc..757ea673a9a 100644 --- a/apps/browser/src/_locales/sl/messages.json +++ b/apps/browser/src/_locales/sl/messages.json @@ -2363,6 +2363,70 @@ "autofillBlockedNoticeGuidance": { "message": "Change this in settings" }, + "change": { + "message": "Change" + }, + "changeButtonTitle": { + "message": "Change password - $ITEMNAME$", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "atRiskPasswords": { + "message": "At-risk passwords" + }, + "atRiskPasswordsDescSingleOrg": { + "message": "$ORGANIZATION$ is requesting you change the $COUNT$ passwords because they are at risk.", + "placeholders": { + "organization": { + "content": "$1", + "example": "Acme Corp" + }, + "count": { + "content": "$2", + "example": "2" + } + } + }, + "atRiskPasswordsDescMultiOrg": { + "message": "Your organizations are requesting you change the $COUNT$ passwords because they are at risk.", + "placeholders": { + "count": { + "content": "$1", + "example": "2" + } + } + }, + "reviewAndChangeAtRiskPassword": { + "message": "Review and change one at-risk password" + }, + "reviewAndChangeAtRiskPasswordsPlural": { + "message": "Review and change $COUNT$ at-risk passwords", + "placeholders": { + "count": { + "content": "$1", + "example": "2" + } + } + }, + "changeAtRiskPasswordsFaster": { + "message": "Change at-risk passwords faster" + }, + "changeAtRiskPasswordsFasterDesc": { + "message": "Update your settings so you can quickly autofill your passwords and generate new ones" + }, + "turnOnAutofill": { + "message": "Turn on autofill" + }, + "turnedOnAutofill": { + "message": "Turned on autofill" + }, + "dismiss": { + "message": "Dismiss" + }, "websiteItemLabel": { "message": "Website $number$ (URI)", "placeholders": { @@ -3123,12 +3187,18 @@ "notificationSentDevice": { "message": "A notification has been sent to your device." }, + "notificationSentDevicePart1": { + "message": "Unlock Bitwarden on your device or on the" + }, + "notificationSentDeviceAnchor": { + "message": "web app" + }, + "notificationSentDevicePart2": { + "message": "Make sure the Fingerprint phrase matches the one below before approving." + }, "aNotificationWasSentToYourDevice": { "message": "A notification was sent to your device" }, - "makeSureYourAccountIsUnlockedAndTheFingerprintEtc": { - "message": "Make sure your account is unlocked and the fingerprint phrase matches on the other device" - }, "youWillBeNotifiedOnceTheRequestIsApproved": { "message": "You will be notified once the request is approved" }, @@ -3138,6 +3208,9 @@ "loginInitiated": { "message": "Login initiated" }, + "logInRequestSent": { + "message": "Request sent" + }, "exposedMasterPassword": { "message": "Exposed Master Password" }, @@ -4146,15 +4219,6 @@ "itemName": { "message": "Item name" }, - "cannotRemoveViewOnlyCollections": { - "message": "You cannot remove collections with View only permissions: $COLLECTIONS$", - "placeholders": { - "collections": { - "content": "$1", - "example": "Work, Personal" - } - } - }, "organizationIsDeactivated": { "message": "Organization is deactivated" }, @@ -4887,6 +4951,15 @@ "extraWide": { "message": "Extra wide" }, + "cannotRemoveViewOnlyCollections": { + "message": "You cannot remove collections with View only permissions: $COLLECTIONS$", + "placeholders": { + "collections": { + "content": "$1", + "example": "Work, Personal" + } + } + }, "updateDesktopAppOrDisableFingerprintDialogTitle": { "message": "Please update your desktop application" }, diff --git a/apps/browser/src/_locales/sr/messages.json b/apps/browser/src/_locales/sr/messages.json index 3cf637b21f1..f694f8f3bde 100644 --- a/apps/browser/src/_locales/sr/messages.json +++ b/apps/browser/src/_locales/sr/messages.json @@ -2062,7 +2062,7 @@ "message": "Генератор корисничког имена" }, "useThisEmail": { - "message": "Use this email" + "message": "Користи ову епошту" }, "useThisPassword": { "message": "Употреби ову лозинку" @@ -2363,6 +2363,70 @@ "autofillBlockedNoticeGuidance": { "message": "Промените ово у подешавањима" }, + "change": { + "message": "Change" + }, + "changeButtonTitle": { + "message": "Change password - $ITEMNAME$", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "atRiskPasswords": { + "message": "At-risk passwords" + }, + "atRiskPasswordsDescSingleOrg": { + "message": "$ORGANIZATION$ is requesting you change the $COUNT$ passwords because they are at risk.", + "placeholders": { + "organization": { + "content": "$1", + "example": "Acme Corp" + }, + "count": { + "content": "$2", + "example": "2" + } + } + }, + "atRiskPasswordsDescMultiOrg": { + "message": "Your organizations are requesting you change the $COUNT$ passwords because they are at risk.", + "placeholders": { + "count": { + "content": "$1", + "example": "2" + } + } + }, + "reviewAndChangeAtRiskPassword": { + "message": "Review and change one at-risk password" + }, + "reviewAndChangeAtRiskPasswordsPlural": { + "message": "Review and change $COUNT$ at-risk passwords", + "placeholders": { + "count": { + "content": "$1", + "example": "2" + } + } + }, + "changeAtRiskPasswordsFaster": { + "message": "Change at-risk passwords faster" + }, + "changeAtRiskPasswordsFasterDesc": { + "message": "Update your settings so you can quickly autofill your passwords and generate new ones" + }, + "turnOnAutofill": { + "message": "Turn on autofill" + }, + "turnedOnAutofill": { + "message": "Turned on autofill" + }, + "dismiss": { + "message": "Dismiss" + }, "websiteItemLabel": { "message": "Сајт $number$ (УРЛ)", "placeholders": { @@ -3123,12 +3187,18 @@ "notificationSentDevice": { "message": "Обавештење је послато на ваш уређај." }, + "notificationSentDevicePart1": { + "message": "Откључај Bitwarden на твом уређају или на" + }, + "notificationSentDeviceAnchor": { + "message": "веб апликација" + }, + "notificationSentDevicePart2": { + "message": "Потврдите да се фраза отиска прста поклапа са овом испод пре одобравања." + }, "aNotificationWasSentToYourDevice": { "message": "Обавештење је послато на ваш уређај" }, - "makeSureYourAccountIsUnlockedAndTheFingerprintEtc": { - "message": "Уверите се да је ваш налог откључан и да се фраза отиска подудара на другом уређају" - }, "youWillBeNotifiedOnceTheRequestIsApproved": { "message": "Бићете обавештени када захтев буде одобрен" }, @@ -3138,6 +3208,9 @@ "loginInitiated": { "message": "Пријава је покренута" }, + "logInRequestSent": { + "message": "Захтев је послат" + }, "exposedMasterPassword": { "message": "Изложена главна лозинка" }, @@ -4146,15 +4219,6 @@ "itemName": { "message": "Име ставке" }, - "cannotRemoveViewOnlyCollections": { - "message": "Не можете уклонити колекције са дозволама само за приказ: $COLLECTIONS$", - "placeholders": { - "collections": { - "content": "$1", - "example": "Work, Personal" - } - } - }, "organizationIsDeactivated": { "message": "Организација је деактивирана" }, @@ -4887,6 +4951,15 @@ "extraWide": { "message": "Врло широко" }, + "cannotRemoveViewOnlyCollections": { + "message": "Не можете уклонити колекције са дозволама само за приказ: $COLLECTIONS$", + "placeholders": { + "collections": { + "content": "$1", + "example": "Work, Personal" + } + } + }, "updateDesktopAppOrDisableFingerprintDialogTitle": { "message": "Молим вас надоградите вашу апликацију на рачунару" }, diff --git a/apps/browser/src/_locales/sv/messages.json b/apps/browser/src/_locales/sv/messages.json index c999454fa9d..de10dbabbe8 100644 --- a/apps/browser/src/_locales/sv/messages.json +++ b/apps/browser/src/_locales/sv/messages.json @@ -14,7 +14,7 @@ "message": "Logga in eller skapa ett nytt konto för att komma åt ditt säkra valv." }, "inviteAccepted": { - "message": "Invitation accepted" + "message": "Inbjudan accepterades" }, "createAccount": { "message": "Skapa konto" @@ -35,7 +35,7 @@ "message": "Ställ in ett starkt lösenord" }, "finishCreatingYourAccountBySettingAPassword": { - "message": "Finish creating your account by setting a password" + "message": "Slutför skapandet av ditt konto genom att ange ett lösenord" }, "enterpriseSingleSignOn": { "message": "Single Sign-On för företag" @@ -81,10 +81,10 @@ "message": "Huvudlösenordsledtråd (valfri)" }, "joinOrganization": { - "message": "Join organization" + "message": "Gå med i organisation" }, "joinOrganizationName": { - "message": "Join $ORGANIZATIONNAME$", + "message": "Gå med i $ORGANIZATIONNAME$", "placeholders": { "organizationName": { "content": "$1", @@ -193,7 +193,7 @@ "message": "Autofyll identitet" }, "fillVerificationCode": { - "message": "Fill verification code" + "message": "Fyll i verifieringskod" }, "fillVerificationCodeAria": { "message": "Fill Verification Code", @@ -239,7 +239,7 @@ "message": "Lägg till objekt" }, "accountEmail": { - "message": "Account email" + "message": "Kontots e-post" }, "requestHint": { "message": "Begär ledtråd" @@ -446,16 +446,16 @@ "message": "Generera lösenfras" }, "passwordGenerated": { - "message": "Password generated" + "message": "Lösenord genererades" }, "passphraseGenerated": { - "message": "Passphrase generated" + "message": "Lösenordsfras genererades" }, "usernameGenerated": { - "message": "Username generated" + "message": "Användarnamn genererades" }, "emailGenerated": { - "message": "Email generated" + "message": "E-post genererades" }, "regeneratePassword": { "message": "Återskapa lösenord" @@ -2363,6 +2363,70 @@ "autofillBlockedNoticeGuidance": { "message": "Change this in settings" }, + "change": { + "message": "Change" + }, + "changeButtonTitle": { + "message": "Change password - $ITEMNAME$", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "atRiskPasswords": { + "message": "At-risk passwords" + }, + "atRiskPasswordsDescSingleOrg": { + "message": "$ORGANIZATION$ is requesting you change the $COUNT$ passwords because they are at risk.", + "placeholders": { + "organization": { + "content": "$1", + "example": "Acme Corp" + }, + "count": { + "content": "$2", + "example": "2" + } + } + }, + "atRiskPasswordsDescMultiOrg": { + "message": "Your organizations are requesting you change the $COUNT$ passwords because they are at risk.", + "placeholders": { + "count": { + "content": "$1", + "example": "2" + } + } + }, + "reviewAndChangeAtRiskPassword": { + "message": "Review and change one at-risk password" + }, + "reviewAndChangeAtRiskPasswordsPlural": { + "message": "Review and change $COUNT$ at-risk passwords", + "placeholders": { + "count": { + "content": "$1", + "example": "2" + } + } + }, + "changeAtRiskPasswordsFaster": { + "message": "Change at-risk passwords faster" + }, + "changeAtRiskPasswordsFasterDesc": { + "message": "Update your settings so you can quickly autofill your passwords and generate new ones" + }, + "turnOnAutofill": { + "message": "Turn on autofill" + }, + "turnedOnAutofill": { + "message": "Turned on autofill" + }, + "dismiss": { + "message": "Dismiss" + }, "websiteItemLabel": { "message": "Webbplats $number$ (URI)", "placeholders": { @@ -3123,12 +3187,18 @@ "notificationSentDevice": { "message": "En avisering har skickats till din enhet." }, + "notificationSentDevicePart1": { + "message": "Unlock Bitwarden on your device or on the" + }, + "notificationSentDeviceAnchor": { + "message": "web app" + }, + "notificationSentDevicePart2": { + "message": "Make sure the Fingerprint phrase matches the one below before approving." + }, "aNotificationWasSentToYourDevice": { "message": "A notification was sent to your device" }, - "makeSureYourAccountIsUnlockedAndTheFingerprintEtc": { - "message": "Make sure your account is unlocked and the fingerprint phrase matches on the other device" - }, "youWillBeNotifiedOnceTheRequestIsApproved": { "message": "You will be notified once the request is approved" }, @@ -3138,6 +3208,9 @@ "loginInitiated": { "message": "Inloggning påbörjad" }, + "logInRequestSent": { + "message": "Request sent" + }, "exposedMasterPassword": { "message": "Huvudlösenordet har exponerats" }, @@ -4146,15 +4219,6 @@ "itemName": { "message": "Objektnamn" }, - "cannotRemoveViewOnlyCollections": { - "message": "You cannot remove collections with View only permissions: $COLLECTIONS$", - "placeholders": { - "collections": { - "content": "$1", - "example": "Work, Personal" - } - } - }, "organizationIsDeactivated": { "message": "Organization is deactivated" }, @@ -4887,6 +4951,15 @@ "extraWide": { "message": "Extra wide" }, + "cannotRemoveViewOnlyCollections": { + "message": "You cannot remove collections with View only permissions: $COLLECTIONS$", + "placeholders": { + "collections": { + "content": "$1", + "example": "Work, Personal" + } + } + }, "updateDesktopAppOrDisableFingerprintDialogTitle": { "message": "Please update your desktop application" }, diff --git a/apps/browser/src/_locales/te/messages.json b/apps/browser/src/_locales/te/messages.json index eb44a6806d1..33ba50ddab4 100644 --- a/apps/browser/src/_locales/te/messages.json +++ b/apps/browser/src/_locales/te/messages.json @@ -2363,6 +2363,70 @@ "autofillBlockedNoticeGuidance": { "message": "Change this in settings" }, + "change": { + "message": "Change" + }, + "changeButtonTitle": { + "message": "Change password - $ITEMNAME$", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "atRiskPasswords": { + "message": "At-risk passwords" + }, + "atRiskPasswordsDescSingleOrg": { + "message": "$ORGANIZATION$ is requesting you change the $COUNT$ passwords because they are at risk.", + "placeholders": { + "organization": { + "content": "$1", + "example": "Acme Corp" + }, + "count": { + "content": "$2", + "example": "2" + } + } + }, + "atRiskPasswordsDescMultiOrg": { + "message": "Your organizations are requesting you change the $COUNT$ passwords because they are at risk.", + "placeholders": { + "count": { + "content": "$1", + "example": "2" + } + } + }, + "reviewAndChangeAtRiskPassword": { + "message": "Review and change one at-risk password" + }, + "reviewAndChangeAtRiskPasswordsPlural": { + "message": "Review and change $COUNT$ at-risk passwords", + "placeholders": { + "count": { + "content": "$1", + "example": "2" + } + } + }, + "changeAtRiskPasswordsFaster": { + "message": "Change at-risk passwords faster" + }, + "changeAtRiskPasswordsFasterDesc": { + "message": "Update your settings so you can quickly autofill your passwords and generate new ones" + }, + "turnOnAutofill": { + "message": "Turn on autofill" + }, + "turnedOnAutofill": { + "message": "Turned on autofill" + }, + "dismiss": { + "message": "Dismiss" + }, "websiteItemLabel": { "message": "Website $number$ (URI)", "placeholders": { @@ -3123,12 +3187,18 @@ "notificationSentDevice": { "message": "A notification has been sent to your device." }, + "notificationSentDevicePart1": { + "message": "Unlock Bitwarden on your device or on the" + }, + "notificationSentDeviceAnchor": { + "message": "web app" + }, + "notificationSentDevicePart2": { + "message": "Make sure the Fingerprint phrase matches the one below before approving." + }, "aNotificationWasSentToYourDevice": { "message": "A notification was sent to your device" }, - "makeSureYourAccountIsUnlockedAndTheFingerprintEtc": { - "message": "Make sure your account is unlocked and the fingerprint phrase matches on the other device" - }, "youWillBeNotifiedOnceTheRequestIsApproved": { "message": "You will be notified once the request is approved" }, @@ -3138,6 +3208,9 @@ "loginInitiated": { "message": "Login initiated" }, + "logInRequestSent": { + "message": "Request sent" + }, "exposedMasterPassword": { "message": "Exposed Master Password" }, @@ -4146,15 +4219,6 @@ "itemName": { "message": "Item name" }, - "cannotRemoveViewOnlyCollections": { - "message": "You cannot remove collections with View only permissions: $COLLECTIONS$", - "placeholders": { - "collections": { - "content": "$1", - "example": "Work, Personal" - } - } - }, "organizationIsDeactivated": { "message": "Organization is deactivated" }, @@ -4887,6 +4951,15 @@ "extraWide": { "message": "Extra wide" }, + "cannotRemoveViewOnlyCollections": { + "message": "You cannot remove collections with View only permissions: $COLLECTIONS$", + "placeholders": { + "collections": { + "content": "$1", + "example": "Work, Personal" + } + } + }, "updateDesktopAppOrDisableFingerprintDialogTitle": { "message": "Please update your desktop application" }, diff --git a/apps/browser/src/_locales/th/messages.json b/apps/browser/src/_locales/th/messages.json index 991fc80f6d6..9cb50903730 100644 --- a/apps/browser/src/_locales/th/messages.json +++ b/apps/browser/src/_locales/th/messages.json @@ -2363,6 +2363,70 @@ "autofillBlockedNoticeGuidance": { "message": "Change this in settings" }, + "change": { + "message": "Change" + }, + "changeButtonTitle": { + "message": "Change password - $ITEMNAME$", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "atRiskPasswords": { + "message": "At-risk passwords" + }, + "atRiskPasswordsDescSingleOrg": { + "message": "$ORGANIZATION$ is requesting you change the $COUNT$ passwords because they are at risk.", + "placeholders": { + "organization": { + "content": "$1", + "example": "Acme Corp" + }, + "count": { + "content": "$2", + "example": "2" + } + } + }, + "atRiskPasswordsDescMultiOrg": { + "message": "Your organizations are requesting you change the $COUNT$ passwords because they are at risk.", + "placeholders": { + "count": { + "content": "$1", + "example": "2" + } + } + }, + "reviewAndChangeAtRiskPassword": { + "message": "Review and change one at-risk password" + }, + "reviewAndChangeAtRiskPasswordsPlural": { + "message": "Review and change $COUNT$ at-risk passwords", + "placeholders": { + "count": { + "content": "$1", + "example": "2" + } + } + }, + "changeAtRiskPasswordsFaster": { + "message": "Change at-risk passwords faster" + }, + "changeAtRiskPasswordsFasterDesc": { + "message": "Update your settings so you can quickly autofill your passwords and generate new ones" + }, + "turnOnAutofill": { + "message": "Turn on autofill" + }, + "turnedOnAutofill": { + "message": "Turned on autofill" + }, + "dismiss": { + "message": "Dismiss" + }, "websiteItemLabel": { "message": "Website $number$ (URI)", "placeholders": { @@ -3123,12 +3187,18 @@ "notificationSentDevice": { "message": "A notification has been sent to your device." }, + "notificationSentDevicePart1": { + "message": "Unlock Bitwarden on your device or on the" + }, + "notificationSentDeviceAnchor": { + "message": "web app" + }, + "notificationSentDevicePart2": { + "message": "Make sure the Fingerprint phrase matches the one below before approving." + }, "aNotificationWasSentToYourDevice": { "message": "A notification was sent to your device" }, - "makeSureYourAccountIsUnlockedAndTheFingerprintEtc": { - "message": "Make sure your account is unlocked and the fingerprint phrase matches on the other device" - }, "youWillBeNotifiedOnceTheRequestIsApproved": { "message": "You will be notified once the request is approved" }, @@ -3138,6 +3208,9 @@ "loginInitiated": { "message": "Login initiated" }, + "logInRequestSent": { + "message": "Request sent" + }, "exposedMasterPassword": { "message": "Exposed Master Password" }, @@ -4146,15 +4219,6 @@ "itemName": { "message": "Item name" }, - "cannotRemoveViewOnlyCollections": { - "message": "You cannot remove collections with View only permissions: $COLLECTIONS$", - "placeholders": { - "collections": { - "content": "$1", - "example": "Work, Personal" - } - } - }, "organizationIsDeactivated": { "message": "Organization is deactivated" }, @@ -4887,6 +4951,15 @@ "extraWide": { "message": "Extra wide" }, + "cannotRemoveViewOnlyCollections": { + "message": "You cannot remove collections with View only permissions: $COLLECTIONS$", + "placeholders": { + "collections": { + "content": "$1", + "example": "Work, Personal" + } + } + }, "updateDesktopAppOrDisableFingerprintDialogTitle": { "message": "Please update your desktop application" }, diff --git a/apps/browser/src/_locales/tr/messages.json b/apps/browser/src/_locales/tr/messages.json index e54944e8222..82485207575 100644 --- a/apps/browser/src/_locales/tr/messages.json +++ b/apps/browser/src/_locales/tr/messages.json @@ -2363,6 +2363,70 @@ "autofillBlockedNoticeGuidance": { "message": "Bunu ayarlardan değiştirebilirsiniz" }, + "change": { + "message": "Değiştir" + }, + "changeButtonTitle": { + "message": "Parolayı değiştir - $ITEMNAME$", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "atRiskPasswords": { + "message": "Riskli parolalar" + }, + "atRiskPasswordsDescSingleOrg": { + "message": "$ORGANIZATION$ is requesting you change the $COUNT$ passwords because they are at risk.", + "placeholders": { + "organization": { + "content": "$1", + "example": "Acme Corp" + }, + "count": { + "content": "$2", + "example": "2" + } + } + }, + "atRiskPasswordsDescMultiOrg": { + "message": "Your organizations are requesting you change the $COUNT$ passwords because they are at risk.", + "placeholders": { + "count": { + "content": "$1", + "example": "2" + } + } + }, + "reviewAndChangeAtRiskPassword": { + "message": "Review and change one at-risk password" + }, + "reviewAndChangeAtRiskPasswordsPlural": { + "message": "Review and change $COUNT$ at-risk passwords", + "placeholders": { + "count": { + "content": "$1", + "example": "2" + } + } + }, + "changeAtRiskPasswordsFaster": { + "message": "Change at-risk passwords faster" + }, + "changeAtRiskPasswordsFasterDesc": { + "message": "Update your settings so you can quickly autofill your passwords and generate new ones" + }, + "turnOnAutofill": { + "message": "Otomatik doldurmayı etkinleştir" + }, + "turnedOnAutofill": { + "message": "Otomatik doldurma etkinleştirildi" + }, + "dismiss": { + "message": "Kapat" + }, "websiteItemLabel": { "message": "Web sitesi $number$ (URI)", "placeholders": { @@ -3123,12 +3187,18 @@ "notificationSentDevice": { "message": "Cihazınıza bir bildirim gönderildi." }, + "notificationSentDevicePart1": { + "message": "Bitwarden kilidini cihazınızdan veya" + }, + "notificationSentDeviceAnchor": { + "message": "web uygulamasından açın" + }, + "notificationSentDevicePart2": { + "message": "Onay vermeden önce parmak izi ifadesinin aşağıdakiyle eşleştiğini kontrol edin." + }, "aNotificationWasSentToYourDevice": { "message": "Cihazınıza bir bildirim gönderildi" }, - "makeSureYourAccountIsUnlockedAndTheFingerprintEtc": { - "message": "Lütfen hesabınızın kilidinin açık olduğundan ve parmak izi ifadesinin diğer cihazla eşleştiğinden emin olun" - }, "youWillBeNotifiedOnceTheRequestIsApproved": { "message": "İsteğiniz onaylanınca size haber vereceğiz" }, @@ -3138,6 +3208,9 @@ "loginInitiated": { "message": "Giriş başlatıldı" }, + "logInRequestSent": { + "message": "İstek gönderildi" + }, "exposedMasterPassword": { "message": "Açığa Çıkmış Ana Parola" }, @@ -4146,15 +4219,6 @@ "itemName": { "message": "Kayıt adı" }, - "cannotRemoveViewOnlyCollections": { - "message": "You cannot remove collections with View only permissions: $COLLECTIONS$", - "placeholders": { - "collections": { - "content": "$1", - "example": "Work, Personal" - } - } - }, "organizationIsDeactivated": { "message": "Kuruluş pasifleştirilmiş" }, @@ -4887,6 +4951,15 @@ "extraWide": { "message": "Ekstra geniş" }, + "cannotRemoveViewOnlyCollections": { + "message": "You cannot remove collections with View only permissions: $COLLECTIONS$", + "placeholders": { + "collections": { + "content": "$1", + "example": "Work, Personal" + } + } + }, "updateDesktopAppOrDisableFingerprintDialogTitle": { "message": "Lütfen masaüstü uygulamanızı güncelleyin" }, diff --git a/apps/browser/src/_locales/uk/messages.json b/apps/browser/src/_locales/uk/messages.json index dfc8f700352..b81c32ac569 100644 --- a/apps/browser/src/_locales/uk/messages.json +++ b/apps/browser/src/_locales/uk/messages.json @@ -1618,10 +1618,10 @@ "message": "Показувати піктограми вебсайтів" }, "faviconDesc": { - "message": "Показувати впізнаване зображення біля кожного запису." + "message": "Показувати зображення біля кожного запису." }, "faviconDescAlt": { - "message": "Показати впізнаване зображення поруч з кожним записом. Застосовується для всіх облікових записів, до яких виконано вхід." + "message": "Показувати зображення поруч з кожним записом. Застосовується для всіх облікових записів, до яких виконано вхід." }, "enableBadgeCounter": { "message": "Показувати лічильник" @@ -2363,6 +2363,70 @@ "autofillBlockedNoticeGuidance": { "message": "Змінити в налаштуваннях" }, + "change": { + "message": "Змінити" + }, + "changeButtonTitle": { + "message": "Змінити пароль – $ITEMNAME$", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "atRiskPasswords": { + "message": "Ризиковані паролі" + }, + "atRiskPasswordsDescSingleOrg": { + "message": "$ORGANIZATION$ вимагає зміни $COUNT$ паролів, оскільки вони ризиковані.", + "placeholders": { + "organization": { + "content": "$1", + "example": "Acme Corp" + }, + "count": { + "content": "$2", + "example": "2" + } + } + }, + "atRiskPasswordsDescMultiOrg": { + "message": "Ваші організації вимагають зміни $COUNT$ паролів, оскільки вони ризиковані.", + "placeholders": { + "count": { + "content": "$1", + "example": "2" + } + } + }, + "reviewAndChangeAtRiskPassword": { + "message": "Перегляньте і змініть один ризикований пароль" + }, + "reviewAndChangeAtRiskPasswordsPlural": { + "message": "Перегляньте і змініть $COUNT$ ризикованих паролів", + "placeholders": { + "count": { + "content": "$1", + "example": "2" + } + } + }, + "changeAtRiskPasswordsFaster": { + "message": "Швидше змінюйте ризиковані паролі" + }, + "changeAtRiskPasswordsFasterDesc": { + "message": "Оновіть налаштування, щоб швидше автоматично заповнювати й створювати паролі" + }, + "turnOnAutofill": { + "message": "Увімкніть автозаповнення" + }, + "turnedOnAutofill": { + "message": "Автозаповнення увімкнено" + }, + "dismiss": { + "message": "Відхилити" + }, "websiteItemLabel": { "message": "Вебсайт $number$ (URI)", "placeholders": { @@ -3123,12 +3187,18 @@ "notificationSentDevice": { "message": "Сповіщення було надіслано на ваш пристрій." }, + "notificationSentDevicePart1": { + "message": "Розблокуйте Bitwarden на своєму пристрої або у" + }, + "notificationSentDeviceAnchor": { + "message": "вебпрограмі" + }, + "notificationSentDevicePart2": { + "message": "Перш ніж підтверджувати, обов'язково перевірте відповідність зазначеної нижче фрази відбитка." + }, "aNotificationWasSentToYourDevice": { "message": "Сповіщення надіслано на ваш пристрій" }, - "makeSureYourAccountIsUnlockedAndTheFingerprintEtc": { - "message": "Переконайтеся, що ваш обліковий запис розблоковано і фраза відбитка на іншому пристрої збігається" - }, "youWillBeNotifiedOnceTheRequestIsApproved": { "message": "Після схвалення запиту ви отримаєте сповіщення" }, @@ -3138,6 +3208,9 @@ "loginInitiated": { "message": "Ініційовано вхід" }, + "logInRequestSent": { + "message": "Запит надіслано" + }, "exposedMasterPassword": { "message": "Головний пароль викрито" }, @@ -4146,15 +4219,6 @@ "itemName": { "message": "Назва запису" }, - "cannotRemoveViewOnlyCollections": { - "message": "Ви не можете вилучати збірки, маючи дозвіл лише на перегляд: $COLLECTIONS$", - "placeholders": { - "collections": { - "content": "$1", - "example": "Work, Personal" - } - } - }, "organizationIsDeactivated": { "message": "Організацію деактивовано" }, @@ -4887,6 +4951,15 @@ "extraWide": { "message": "Дуже широке" }, + "cannotRemoveViewOnlyCollections": { + "message": "Ви не можете вилучати збірки, маючи дозвіл лише на перегляд: $COLLECTIONS$", + "placeholders": { + "collections": { + "content": "$1", + "example": "Work, Personal" + } + } + }, "updateDesktopAppOrDisableFingerprintDialogTitle": { "message": "Оновіть свою комп'ютерну програму" }, diff --git a/apps/browser/src/_locales/vi/messages.json b/apps/browser/src/_locales/vi/messages.json index 9394ebdc8d7..92a37d53bd9 100644 --- a/apps/browser/src/_locales/vi/messages.json +++ b/apps/browser/src/_locales/vi/messages.json @@ -2363,6 +2363,70 @@ "autofillBlockedNoticeGuidance": { "message": "Change this in settings" }, + "change": { + "message": "Change" + }, + "changeButtonTitle": { + "message": "Change password - $ITEMNAME$", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "atRiskPasswords": { + "message": "At-risk passwords" + }, + "atRiskPasswordsDescSingleOrg": { + "message": "$ORGANIZATION$ is requesting you change the $COUNT$ passwords because they are at risk.", + "placeholders": { + "organization": { + "content": "$1", + "example": "Acme Corp" + }, + "count": { + "content": "$2", + "example": "2" + } + } + }, + "atRiskPasswordsDescMultiOrg": { + "message": "Your organizations are requesting you change the $COUNT$ passwords because they are at risk.", + "placeholders": { + "count": { + "content": "$1", + "example": "2" + } + } + }, + "reviewAndChangeAtRiskPassword": { + "message": "Review and change one at-risk password" + }, + "reviewAndChangeAtRiskPasswordsPlural": { + "message": "Review and change $COUNT$ at-risk passwords", + "placeholders": { + "count": { + "content": "$1", + "example": "2" + } + } + }, + "changeAtRiskPasswordsFaster": { + "message": "Change at-risk passwords faster" + }, + "changeAtRiskPasswordsFasterDesc": { + "message": "Update your settings so you can quickly autofill your passwords and generate new ones" + }, + "turnOnAutofill": { + "message": "Turn on autofill" + }, + "turnedOnAutofill": { + "message": "Turned on autofill" + }, + "dismiss": { + "message": "Dismiss" + }, "websiteItemLabel": { "message": "Trang Web $number$ (URI)", "placeholders": { @@ -3123,12 +3187,18 @@ "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" + }, + "notificationSentDeviceAnchor": { + "message": "web app" + }, + "notificationSentDevicePart2": { + "message": "Make sure the Fingerprint phrase matches the one below before approving." + }, "aNotificationWasSentToYourDevice": { "message": "A notification was sent to your device" }, - "makeSureYourAccountIsUnlockedAndTheFingerprintEtc": { - "message": "Make sure your account is unlocked and the fingerprint phrase matches on the other device" - }, "youWillBeNotifiedOnceTheRequestIsApproved": { "message": "You will be notified once the request is approved" }, @@ -3138,6 +3208,9 @@ "loginInitiated": { "message": "Bắt đầu đăng nhập" }, + "logInRequestSent": { + "message": "Request sent" + }, "exposedMasterPassword": { "message": "Mật khẩu chính bị lộ" }, @@ -4146,15 +4219,6 @@ "itemName": { "message": "Tên mục" }, - "cannotRemoveViewOnlyCollections": { - "message": "Bạn không thể xóa các bộ sưu tập với quyền chỉ xem: $COLLECTIONS$", - "placeholders": { - "collections": { - "content": "$1", - "example": "Work, Personal" - } - } - }, "organizationIsDeactivated": { "message": "Tổ chức không còn hoạt động" }, @@ -4887,6 +4951,15 @@ "extraWide": { "message": "Extra wide" }, + "cannotRemoveViewOnlyCollections": { + "message": "Bạn không thể xóa các bộ sưu tập với quyền chỉ xem: $COLLECTIONS$", + "placeholders": { + "collections": { + "content": "$1", + "example": "Work, Personal" + } + } + }, "updateDesktopAppOrDisableFingerprintDialogTitle": { "message": "Please update your desktop application" }, diff --git a/apps/browser/src/_locales/zh_CN/messages.json b/apps/browser/src/_locales/zh_CN/messages.json index cc0cc7b8bd2..9de6683a609 100644 --- a/apps/browser/src/_locales/zh_CN/messages.json +++ b/apps/browser/src/_locales/zh_CN/messages.json @@ -379,7 +379,7 @@ "message": "文件夹名称" }, "folderHintText": { - "message": "通过在父文件夹名后面跟随「/」来嵌套文件夹。示例:Social/Forums" + "message": "通过在父文件夹名后面添加「/」来嵌套文件夹。示例:Social/Forums" }, "noFoldersAdded": { "message": "未添加文件夹" @@ -591,7 +591,7 @@ "message": "私密备注" }, "note": { - "message": "备注" + "message": "笔记" }, "editItem": { "message": "编辑项目" @@ -766,7 +766,7 @@ "message": "主密码提示" }, "errorOccurred": { - "message": "发生了一个错误" + "message": "发生错误" }, "emailRequired": { "message": "必须填写电子邮箱地址。" @@ -2062,7 +2062,7 @@ "message": "用户名生成器" }, "useThisEmail": { - "message": "Use this email" + "message": "使用此电子邮箱" }, "useThisPassword": { "message": "使用此密码" @@ -2363,6 +2363,70 @@ "autofillBlockedNoticeGuidance": { "message": "在设置中更改它" }, + "change": { + "message": "更改" + }, + "changeButtonTitle": { + "message": "更改密码 - $ITEMNAME$", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "atRiskPasswords": { + "message": "有风险的密码" + }, + "atRiskPasswordsDescSingleOrg": { + "message": "$ORGANIZATION$ 要求您更改 $COUNT$ 个密码,因为它们存在风险。", + "placeholders": { + "organization": { + "content": "$1", + "example": "Acme Corp" + }, + "count": { + "content": "$2", + "example": "2" + } + } + }, + "atRiskPasswordsDescMultiOrg": { + "message": "您的组织要求您更改 $COUNT$ 个密码,因为它们存在风险。", + "placeholders": { + "count": { + "content": "$1", + "example": "2" + } + } + }, + "reviewAndChangeAtRiskPassword": { + "message": "审查并更改某个有风险的密码" + }, + "reviewAndChangeAtRiskPasswordsPlural": { + "message": "审查并更改 $COUNT$ 个有风险的密码", + "placeholders": { + "count": { + "content": "$1", + "example": "2" + } + } + }, + "changeAtRiskPasswordsFaster": { + "message": "尽快更改有风险的密码" + }, + "changeAtRiskPasswordsFasterDesc": { + "message": "更新您的设置,以便您可以快速自动填充密码并生成新的密码" + }, + "turnOnAutofill": { + "message": "打开自动填充" + }, + "turnedOnAutofill": { + "message": "已打开自动填充" + }, + "dismiss": { + "message": "忽略" + }, "websiteItemLabel": { "message": "网站 $number$ (URI)", "placeholders": { @@ -2664,7 +2728,7 @@ "description": "Used as a card title description on the set password page to explain why the user is there" }, "cardMetrics": { - "message": "$TOTAL$ 不足", + "message": "总计 $TOTAL$", "placeholders": { "total": { "content": "$1", @@ -3123,12 +3187,18 @@ "notificationSentDevice": { "message": "通知已发送到您的设备。" }, + "notificationSentDevicePart1": { + "message": "Unlock Bitwarden on your device or on the" + }, + "notificationSentDeviceAnchor": { + "message": "网页 App" + }, + "notificationSentDevicePart2": { + "message": "在批准前,请确保指纹短语与下面的相匹配。" + }, "aNotificationWasSentToYourDevice": { "message": "通知已发送到您的设备" }, - "makeSureYourAccountIsUnlockedAndTheFingerprintEtc": { - "message": "确保您的账户已解锁,并且指纹短语与其他设备上的相匹配。" - }, "youWillBeNotifiedOnceTheRequestIsApproved": { "message": "请求获得批准后,您将收到通知" }, @@ -3138,6 +3208,9 @@ "loginInitiated": { "message": "登录已发起" }, + "logInRequestSent": { + "message": "请求已发送" + }, "exposedMasterPassword": { "message": "已暴露的主密码" }, @@ -4146,15 +4219,6 @@ "itemName": { "message": "项目名称" }, - "cannotRemoveViewOnlyCollections": { - "message": "您无法删除仅具有「查看」权限的集合:$COLLECTIONS$", - "placeholders": { - "collections": { - "content": "$1", - "example": "Work, Personal" - } - } - }, "organizationIsDeactivated": { "message": "组织已停用" }, @@ -4226,7 +4290,7 @@ "message": "筛选" }, "filterVault": { - "message": "密码库筛选" + "message": "筛选密码库" }, "filterApplied": { "message": "已应用一个筛选" @@ -4887,6 +4951,15 @@ "extraWide": { "message": "超宽" }, + "cannotRemoveViewOnlyCollections": { + "message": "您无法删除仅具有「查看」权限的集合:$COLLECTIONS$", + "placeholders": { + "collections": { + "content": "$1", + "example": "Work, Personal" + } + } + }, "updateDesktopAppOrDisableFingerprintDialogTitle": { "message": "请更新您的桌面应用程序" }, diff --git a/apps/browser/src/_locales/zh_TW/messages.json b/apps/browser/src/_locales/zh_TW/messages.json index f9ef4d56a49..274da967618 100644 --- a/apps/browser/src/_locales/zh_TW/messages.json +++ b/apps/browser/src/_locales/zh_TW/messages.json @@ -35,7 +35,7 @@ "message": "設定一個強密碼" }, "finishCreatingYourAccountBySettingAPassword": { - "message": "設定密碼以完成創建您的帳戶。" + "message": "設定密碼以完成建立您的帳號" }, "enterpriseSingleSignOn": { "message": "企業單一登入" @@ -763,7 +763,7 @@ "message": "若您忘記主密碼,將會無法找回!" }, "masterPassHintLabel": { - "message": "您已成功創建新帳戶!" + "message": "主密碼提示" }, "errorOccurred": { "message": "發生錯誤" @@ -797,7 +797,7 @@ "message": "帳戶已建立!現在可以登入了。" }, "newAccountCreated2": { - "message": "您已成功創建新帳戶!" + "message": "您已成功建立新帳號!" }, "youHaveBeenLoggedIn": { "message": "你已經登入!" @@ -2062,7 +2062,7 @@ "message": "使用者名稱產生器" }, "useThisEmail": { - "message": "Use this email" + "message": "使用此電子郵件" }, "useThisPassword": { "message": "使用此密碼" @@ -2363,6 +2363,70 @@ "autofillBlockedNoticeGuidance": { "message": "您可以於設定中進行更改" }, + "change": { + "message": "Change" + }, + "changeButtonTitle": { + "message": "Change password - $ITEMNAME$", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "atRiskPasswords": { + "message": "At-risk passwords" + }, + "atRiskPasswordsDescSingleOrg": { + "message": "$ORGANIZATION$ is requesting you change the $COUNT$ passwords because they are at risk.", + "placeholders": { + "organization": { + "content": "$1", + "example": "Acme Corp" + }, + "count": { + "content": "$2", + "example": "2" + } + } + }, + "atRiskPasswordsDescMultiOrg": { + "message": "Your organizations are requesting you change the $COUNT$ passwords because they are at risk.", + "placeholders": { + "count": { + "content": "$1", + "example": "2" + } + } + }, + "reviewAndChangeAtRiskPassword": { + "message": "Review and change one at-risk password" + }, + "reviewAndChangeAtRiskPasswordsPlural": { + "message": "Review and change $COUNT$ at-risk passwords", + "placeholders": { + "count": { + "content": "$1", + "example": "2" + } + } + }, + "changeAtRiskPasswordsFaster": { + "message": "Change at-risk passwords faster" + }, + "changeAtRiskPasswordsFasterDesc": { + "message": "Update your settings so you can quickly autofill your passwords and generate new ones" + }, + "turnOnAutofill": { + "message": "Turn on autofill" + }, + "turnedOnAutofill": { + "message": "Turned on autofill" + }, + "dismiss": { + "message": "Dismiss" + }, "websiteItemLabel": { "message": "網站 $number$ (URI)", "placeholders": { @@ -2529,7 +2593,7 @@ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "createdSendSuccessfully": { - "message": "Send 創建成功!", + "message": "Send 建立成功!", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendExpiresInHoursSingle": { @@ -3123,12 +3187,18 @@ "notificationSentDevice": { "message": "已傳送通知至您的裝置。" }, + "notificationSentDevicePart1": { + "message": "Unlock Bitwarden on your device or on the" + }, + "notificationSentDeviceAnchor": { + "message": "網頁應用程式" + }, + "notificationSentDevicePart2": { + "message": "在核准前請確保您的指紋短語與下面完全相符。" + }, "aNotificationWasSentToYourDevice": { "message": "已傳送通知至您的裝置" }, - "makeSureYourAccountIsUnlockedAndTheFingerprintEtc": { - "message": "請確保您的帳號已解鎖,並且指紋短語與其他裝置一致。" - }, "youWillBeNotifiedOnceTheRequestIsApproved": { "message": "一旦您的請求被通過,您會獲得通知。" }, @@ -3138,6 +3208,9 @@ "loginInitiated": { "message": "登入已啟動" }, + "logInRequestSent": { + "message": "已傳送請求" + }, "exposedMasterPassword": { "message": "已洩露的主密碼" }, @@ -4146,15 +4219,6 @@ "itemName": { "message": "項目名稱" }, - "cannotRemoveViewOnlyCollections": { - "message": "若您只有檢視權限,無法移除集合 $COLLECTIONS$。", - "placeholders": { - "collections": { - "content": "$1", - "example": "Work, Personal" - } - } - }, "organizationIsDeactivated": { "message": "組織已被停用" }, @@ -4887,6 +4951,15 @@ "extraWide": { "message": "更寬" }, + "cannotRemoveViewOnlyCollections": { + "message": "若您只有檢視權限,無法移除集合 $COLLECTIONS$。", + "placeholders": { + "collections": { + "content": "$1", + "example": "Work, Personal" + } + } + }, "updateDesktopAppOrDisableFingerprintDialogTitle": { "message": "請更新您的桌面應用程式" }, diff --git a/apps/browser/src/auth/popup/register.component.html b/apps/browser/src/auth/popup/register.component.html deleted file mode 100644 index e2f4f2e7d12..00000000000 --- a/apps/browser/src/auth/popup/register.component.html +++ /dev/null @@ -1,147 +0,0 @@ -
-
-
- -
-

- {{ "createAccount" | i18n }} -

-
- -
-
-
-
-
-
- - -
-
-
-
- - -
-
- -
-
- - -
-
- -
-
-
-
-
- - -
-
- -
-
-
- - -
-
- -
-
- - -
-
-
-
- -
-
-
-
- - -
-
-
-
-
diff --git a/apps/browser/src/auth/popup/register.component.ts b/apps/browser/src/auth/popup/register.component.ts deleted file mode 100644 index 50475b2204d..00000000000 --- a/apps/browser/src/auth/popup/register.component.ts +++ /dev/null @@ -1,58 +0,0 @@ -// FIXME: Update this file to be type safe and remove this and next line -// @ts-strict-ignore -import { Component } from "@angular/core"; -import { UntypedFormBuilder } from "@angular/forms"; -import { Router } from "@angular/router"; - -import { RegisterComponent as BaseRegisterComponent } from "@bitwarden/angular/auth/components/register.component"; -import { FormValidationErrorsService } from "@bitwarden/angular/platform/abstractions/form-validation-errors.service"; -import { LoginStrategyServiceAbstraction } from "@bitwarden/auth/common"; -import { ApiService } from "@bitwarden/common/abstractions/api.service"; -import { AuditService } from "@bitwarden/common/abstractions/audit.service"; -import { EnvironmentService } from "@bitwarden/common/platform/abstractions/environment.service"; -import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; -import { LogService } from "@bitwarden/common/platform/abstractions/log.service"; -import { PlatformUtilsService } from "@bitwarden/common/platform/abstractions/platform-utils.service"; -import { DialogService, ToastService } from "@bitwarden/components"; -import { KeyService } from "@bitwarden/key-management"; - -@Component({ - selector: "app-register", - templateUrl: "register.component.html", -}) -export class RegisterComponent extends BaseRegisterComponent { - color: string; - text: string; - - constructor( - formValidationErrorService: FormValidationErrorsService, - formBuilder: UntypedFormBuilder, - loginStrategyService: LoginStrategyServiceAbstraction, - router: Router, - i18nService: I18nService, - keyService: KeyService, - apiService: ApiService, - platformUtilsService: PlatformUtilsService, - environmentService: EnvironmentService, - logService: LogService, - auditService: AuditService, - dialogService: DialogService, - toastService: ToastService, - ) { - super( - formValidationErrorService, - formBuilder, - loginStrategyService, - router, - i18nService, - keyService, - apiService, - platformUtilsService, - environmentService, - logService, - auditService, - dialogService, - toastService, - ); - } -} diff --git a/apps/browser/src/autofill/background/notification.background.spec.ts b/apps/browser/src/autofill/background/notification.background.spec.ts index 37c05a55a3a..40c4d07cadf 100644 --- a/apps/browser/src/autofill/background/notification.background.spec.ts +++ b/apps/browser/src/autofill/background/notification.background.spec.ts @@ -825,6 +825,7 @@ describe("NotificationBackground", () => { queueMessage.newPassword, message.edit, sender.tab, + "testId", ); expect(updateWithServerSpy).toHaveBeenCalled(); expect(tabSendMessageSpy).toHaveBeenCalledWith(sender.tab, { @@ -862,6 +863,7 @@ describe("NotificationBackground", () => { queueMessage.password, message.edit, sender.tab, + "testId", ); expect(editItemSpy).not.toHaveBeenCalled(); expect(createWithServerSpy).not.toHaveBeenCalled(); @@ -895,6 +897,7 @@ describe("NotificationBackground", () => { queueMessage.newPassword, message.edit, sender.tab, + "testId", ); expect(editItemSpy).toHaveBeenCalled(); expect(updateWithServerSpy).not.toHaveBeenCalled(); @@ -904,10 +907,13 @@ describe("NotificationBackground", () => { expect(tabSendMessageSpy).toHaveBeenCalledWith(sender.tab, { command: "editedCipher", }); - expect(setAddEditCipherInfoSpy).toHaveBeenCalledWith({ - cipher: cipherView, - collectionIds: cipherView.collectionIds, - }); + expect(setAddEditCipherInfoSpy).toHaveBeenCalledWith( + { + cipher: cipherView, + collectionIds: cipherView.collectionIds, + }, + "testId", + ); expect(openAddEditVaultItemPopoutSpy).toHaveBeenCalledWith(sender.tab, { cipherId: cipherView.id, }); @@ -945,7 +951,7 @@ describe("NotificationBackground", () => { queueMessage, message.folder, ); - expect(editItemSpy).toHaveBeenCalledWith(cipherView, sender.tab); + expect(editItemSpy).toHaveBeenCalledWith(cipherView, "testId", sender.tab); expect(tabSendMessageSpy).toHaveBeenCalledWith(sender.tab, { command: "closeNotificationBar", }); diff --git a/apps/browser/src/autofill/background/notification.background.ts b/apps/browser/src/autofill/background/notification.background.ts index a091256b28d..1a99425b7de 100644 --- a/apps/browser/src/autofill/background/notification.background.ts +++ b/apps/browser/src/autofill/background/notification.background.ts @@ -1,12 +1,13 @@ // FIXME: Update this file to be type safe and remove this and next line // @ts-strict-ignore -import { firstValueFrom, map } from "rxjs"; +import { firstValueFrom } from "rxjs"; import { PolicyService } from "@bitwarden/common/admin-console/abstractions/policy/policy.service.abstraction"; import { PolicyType } from "@bitwarden/common/admin-console/enums"; import { AccountService } from "@bitwarden/common/auth/abstractions/account.service"; import { AuthService } from "@bitwarden/common/auth/abstractions/auth.service"; import { AuthenticationStatus } from "@bitwarden/common/auth/enums/authentication-status"; +import { getOptionalUserId } from "@bitwarden/common/auth/services/account.service"; import { ExtensionCommand, ExtensionCommandType, @@ -22,6 +23,7 @@ import { EnvironmentService } from "@bitwarden/common/platform/abstractions/envi import { LogService } from "@bitwarden/common/platform/abstractions/log.service"; import { Utils } from "@bitwarden/common/platform/misc/utils"; import { ThemeStateService } from "@bitwarden/common/platform/theming/theme-state.service"; +import { UserId } from "@bitwarden/common/types/guid"; import { CipherService } from "@bitwarden/common/vault/abstractions/cipher.service"; import { FolderService } from "@bitwarden/common/vault/abstractions/folder/folder.service.abstraction"; import { CipherType } from "@bitwarden/common/vault/enums"; @@ -87,8 +89,6 @@ export default class NotificationBackground { bgGetDecryptedCiphers: () => this.getNotificationCipherData(), }; - private activeUserId$ = this.accountService.activeAccount$.pipe(map((a) => a?.id)); - constructor( private autofillService: AutofillService, private cipherService: CipherService, @@ -151,7 +151,13 @@ export default class NotificationBackground { firstValueFrom(this.environmentService.environment$), ]); const iconsServerUrl = env.getIconsUrl(); - const decryptedCiphers = await this.cipherService.getAllDecryptedForUrl(currentTab.url); + const activeUserId = await firstValueFrom( + this.accountService.activeAccount$.pipe(getOptionalUserId), + ); + const decryptedCiphers = await this.cipherService.getAllDecryptedForUrl( + currentTab.url, + activeUserId, + ); return decryptedCiphers.map((view) => { const { id, name, reprompt, favorite, login } = view; @@ -304,7 +310,14 @@ export default class NotificationBackground { return; } - const ciphers = await this.cipherService.getAllDecryptedForUrl(loginInfo.url); + const activeUserId = await firstValueFrom( + this.accountService.activeAccount$.pipe(getOptionalUserId), + ); + if (activeUserId == null) { + return; + } + + const ciphers = await this.cipherService.getAllDecryptedForUrl(loginInfo.url, activeUserId); const usernameMatches = ciphers.filter( (c) => c.login.username != null && c.login.username.toLowerCase() === normalizedUsername, ); @@ -382,7 +395,14 @@ export default class NotificationBackground { } let id: string = null; - const ciphers = await this.cipherService.getAllDecryptedForUrl(changeData.url); + const activeUserId = await firstValueFrom( + this.accountService.activeAccount$.pipe(getOptionalUserId), + ); + if (activeUserId == null) { + return; + } + + const ciphers = await this.cipherService.getAllDecryptedForUrl(changeData.url, activeUserId); if (changeData.currentPassword != null) { const passwordMatches = ciphers.filter( (c) => c.login.password === changeData.currentPassword, @@ -535,37 +555,42 @@ export default class NotificationBackground { this.notificationQueue.splice(i, 1); + const activeUserId = await firstValueFrom( + this.accountService.activeAccount$.pipe(getOptionalUserId), + ); + if (queueMessage.type === NotificationQueueMessageType.ChangePassword) { - const cipherView = await this.getDecryptedCipherById(queueMessage.cipherId); - await this.updatePassword(cipherView, queueMessage.newPassword, edit, tab); + const cipherView = await this.getDecryptedCipherById(queueMessage.cipherId, activeUserId); + await this.updatePassword(cipherView, queueMessage.newPassword, edit, tab, activeUserId); return; } // If the vault was locked, check if a cipher needs updating instead of creating a new one if (queueMessage.wasVaultLocked) { - const allCiphers = await this.cipherService.getAllDecryptedForUrl(queueMessage.uri); + const allCiphers = await this.cipherService.getAllDecryptedForUrl( + queueMessage.uri, + activeUserId, + ); const existingCipher = allCiphers.find( (c) => c.login.username != null && c.login.username.toLowerCase() === queueMessage.username, ); if (existingCipher != null) { - await this.updatePassword(existingCipher, queueMessage.password, edit, tab); + await this.updatePassword(existingCipher, queueMessage.password, edit, tab, activeUserId); return; } } - folderId = (await this.folderExists(folderId)) ? folderId : null; + folderId = (await this.folderExists(folderId, activeUserId)) ? folderId : null; const newCipher = this.convertAddLoginQueueMessageToCipherView(queueMessage, folderId); if (edit) { - await this.editItem(newCipher, tab); + await this.editItem(newCipher, activeUserId, tab); await BrowserApi.tabSendMessage(tab, { command: "closeNotificationBar" }); return; } - const activeUserId = await firstValueFrom(this.activeUserId$); - const cipher = await this.cipherService.encrypt(newCipher, activeUserId); try { await this.cipherService.createWithServer(cipher); @@ -588,24 +613,25 @@ export default class NotificationBackground { * @param newPassword - The new password to update the cipher with * @param edit - Identifies if the cipher should be edited or simply updated * @param tab - The tab that the message was sent from + * @param userId - The active account user ID */ private async updatePassword( cipherView: CipherView, newPassword: string, edit: boolean, tab: chrome.tabs.Tab, + userId: UserId, ) { cipherView.login.password = newPassword; if (edit) { - await this.editItem(cipherView, tab); + await this.editItem(cipherView, userId, tab); await BrowserApi.tabSendMessage(tab, { command: "closeNotificationBar" }); await BrowserApi.tabSendMessage(tab, { command: "editedCipher" }); return; } - const activeUserId = await firstValueFrom(this.activeUserId$); - const cipher = await this.cipherService.encrypt(cipherView, activeUserId); + const cipher = await this.cipherService.encrypt(cipherView, userId); try { // We've only updated the password, no need to broadcast editedCipher message await this.cipherService.updateWithServer(cipher); @@ -622,33 +648,34 @@ export default class NotificationBackground { * and opens the add/edit vault item popout. * * @param cipherView - The cipher to edit + * @param userId - The active account user ID * @param senderTab - The tab that the message was sent from */ - private async editItem(cipherView: CipherView, senderTab: chrome.tabs.Tab) { - await this.cipherService.setAddEditCipherInfo({ - cipher: cipherView, - collectionIds: cipherView.collectionIds, - }); + private async editItem(cipherView: CipherView, userId: UserId, senderTab: chrome.tabs.Tab) { + await this.cipherService.setAddEditCipherInfo( + { + cipher: cipherView, + collectionIds: cipherView.collectionIds, + }, + userId, + ); await this.openAddEditVaultItemPopout(senderTab, { cipherId: cipherView.id }); } - private async folderExists(folderId: string) { + private async folderExists(folderId: string, userId: UserId) { if (Utils.isNullOrWhitespace(folderId) || folderId === "null") { return false; } - const activeUserId = await firstValueFrom(this.activeUserId$); - const folders = await firstValueFrom(this.folderService.folderViews$(activeUserId)); + const folders = await firstValueFrom(this.folderService.folderViews$(userId)); return folders.some((x) => x.id === folderId); } - private async getDecryptedCipherById(cipherId: string) { - const cipher = await this.cipherService.get(cipherId); + private async getDecryptedCipherById(cipherId: string, userId: UserId) { + const cipher = await this.cipherService.get(cipherId, userId); if (cipher != null && cipher.type === CipherType.Login) { - const activeUserId = await firstValueFrom(this.activeUserId$); - return await cipher.decrypt( - await this.cipherService.getKeyForCipherKeyDecryption(cipher, activeUserId), + await this.cipherService.getKeyForCipherKeyDecryption(cipher, userId), ); } return null; @@ -685,7 +712,9 @@ export default class NotificationBackground { * Returns the first value found from the folder service's folderViews$ observable. */ private async getFolderData() { - const activeUserId = await firstValueFrom(this.activeUserId$); + const activeUserId = await firstValueFrom( + this.accountService.activeAccount$.pipe(getOptionalUserId), + ); return await firstValueFrom(this.folderService.folderViews$(activeUserId)); } diff --git a/apps/browser/src/autofill/background/overlay.background.spec.ts b/apps/browser/src/autofill/background/overlay.background.spec.ts index c3a6357ed05..22531788d37 100644 --- a/apps/browser/src/autofill/background/overlay.background.spec.ts +++ b/apps/browser/src/autofill/background/overlay.background.spec.ts @@ -206,6 +206,7 @@ describe("OverlayBackground", () => { inlineMenuFieldQualificationService, themeStateService, totpService, + accountService, generatedPasswordCallbackMock, addPasswordCallbackMock, ); @@ -849,7 +850,7 @@ describe("OverlayBackground", () => { await flushPromises(); expect(BrowserApi.getTabFromCurrentWindowId).toHaveBeenCalled(); - expect(cipherService.getAllDecryptedForUrl).toHaveBeenCalledWith(url, [ + expect(cipherService.getAllDecryptedForUrl).toHaveBeenCalledWith(url, mockUserId, [ CipherType.Card, CipherType.Identity, ]); @@ -872,7 +873,7 @@ describe("OverlayBackground", () => { await flushPromises(); expect(BrowserApi.getTabFromCurrentWindowId).toHaveBeenCalled(); - expect(cipherService.getAllDecryptedForUrl).toHaveBeenCalledWith(url); + expect(cipherService.getAllDecryptedForUrl).toHaveBeenCalledWith(url, mockUserId); expect(cipherService.sortCiphersByLastUsedThenName).toHaveBeenCalled(); expect(overlayBackground["inlineMenuCiphers"]).toStrictEqual( new Map([ @@ -891,7 +892,7 @@ describe("OverlayBackground", () => { await flushPromises(); expect(BrowserApi.getTabFromCurrentWindowId).toHaveBeenCalled(); - expect(cipherService.getAllDecryptedForUrl).toHaveBeenCalledWith(url, [ + expect(cipherService.getAllDecryptedForUrl).toHaveBeenCalledWith(url, mockUserId, [ CipherType.Card, CipherType.Identity, ]); diff --git a/apps/browser/src/autofill/background/overlay.background.ts b/apps/browser/src/autofill/background/overlay.background.ts index 3d2b1ec783c..1d55a154ee3 100644 --- a/apps/browser/src/autofill/background/overlay.background.ts +++ b/apps/browser/src/autofill/background/overlay.background.ts @@ -13,8 +13,10 @@ import { } from "rxjs"; import { parse } from "tldts"; +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 { getOptionalUserId, getUserId } from "@bitwarden/common/auth/services/account.service"; import { AutofillOverlayVisibility, SHOW_AUTOFILL_BUTTON, @@ -34,6 +36,7 @@ import { LogService } from "@bitwarden/common/platform/abstractions/log.service" import { PlatformUtilsService } from "@bitwarden/common/platform/abstractions/platform-utils.service"; import { Utils } from "@bitwarden/common/platform/misc/utils"; import { ThemeStateService } from "@bitwarden/common/platform/theming/theme-state.service"; +import { UserId } from "@bitwarden/common/types/guid"; import { CipherService } from "@bitwarden/common/vault/abstractions/cipher.service"; import { TotpService } from "@bitwarden/common/vault/abstractions/totp.service"; import { VaultSettingsService } from "@bitwarden/common/vault/abstractions/vault-settings/vault-settings.service"; @@ -225,6 +228,7 @@ export class OverlayBackground implements OverlayBackgroundInterface { private inlineMenuFieldQualificationService: InlineMenuFieldQualificationService, private themeStateService: ThemeStateService, private totpService: TotpService, + private accountService: AccountService, private generatePasswordCallback: () => Promise, private addPasswordCallback: (password: string) => Promise, ) { @@ -405,13 +409,20 @@ export class OverlayBackground implements OverlayBackgroundInterface { currentTab: chrome.tabs.Tab, updateAllCipherTypes: boolean, ): Promise { - if (updateAllCipherTypes || !this.cardAndIdentityCiphers) { - return this.getAllCipherTypeViews(currentTab); + const activeUserId = await firstValueFrom( + this.accountService.activeAccount$.pipe(getOptionalUserId), + ); + if (!activeUserId) { + return []; } - const cipherViews = (await this.cipherService.getAllDecryptedForUrl(currentTab.url || "")).sort( - (a, b) => this.cipherService.sortCiphersByLastUsedThenName(a, b), - ); + if (updateAllCipherTypes || !this.cardAndIdentityCiphers) { + return this.getAllCipherTypeViews(currentTab, activeUserId); + } + + const cipherViews = ( + await this.cipherService.getAllDecryptedForUrl(currentTab.url || "", activeUserId) + ).sort((a, b) => this.cipherService.sortCiphersByLastUsedThenName(a, b)); return this.cardAndIdentityCiphers ? cipherViews.concat(...this.cardAndIdentityCiphers) @@ -422,15 +433,19 @@ export class OverlayBackground implements OverlayBackgroundInterface { * Queries all cipher types from the user's vault returns them sorted by last used. * * @param currentTab - The current tab + * @param userId - The active user id */ - private async getAllCipherTypeViews(currentTab: chrome.tabs.Tab): Promise { + private async getAllCipherTypeViews( + currentTab: chrome.tabs.Tab, + userId: UserId, + ): Promise { if (!this.cardAndIdentityCiphers) { this.cardAndIdentityCiphers = new Set([]); } this.cardAndIdentityCiphers.clear(); const cipherViews = ( - await this.cipherService.getAllDecryptedForUrl(currentTab.url || "", [ + await this.cipherService.getAllDecryptedForUrl(currentTab.url || "", userId, [ CipherType.Card, CipherType.Identity, ]) @@ -2399,10 +2414,14 @@ export class OverlayBackground implements OverlayBackgroundInterface { try { this.closeInlineMenu(sender); - await this.cipherService.setAddEditCipherInfo({ - cipher: cipherView, - collectionIds: cipherView.collectionIds, - }); + const activeUserId = await firstValueFrom(this.accountService.activeAccount$.pipe(getUserId)); + await this.cipherService.setAddEditCipherInfo( + { + cipher: cipherView, + collectionIds: cipherView.collectionIds, + }, + activeUserId, + ); await this.openAddEditVaultItemPopout(sender.tab, { cipherId: cipherView.id, diff --git a/apps/browser/src/autofill/background/web-request.background.ts b/apps/browser/src/autofill/background/web-request.background.ts index 2c14358a359..22e10a3dd0a 100644 --- a/apps/browser/src/autofill/background/web-request.background.ts +++ b/apps/browser/src/autofill/background/web-request.background.ts @@ -1,7 +1,11 @@ // FIXME: Update this file to be type safe and remove this and next line // @ts-strict-ignore +import { firstValueFrom } 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 { getOptionalUserId } from "@bitwarden/common/auth/services/account.service"; import { UriMatchStrategy } from "@bitwarden/common/models/domain/domain-service"; import { PlatformUtilsService } from "@bitwarden/common/platform/abstractions/platform-utils.service"; import { CipherService } from "@bitwarden/common/vault/abstractions/cipher.service"; @@ -14,6 +18,7 @@ export default class WebRequestBackground { platformUtilsService: PlatformUtilsService, private cipherService: CipherService, private authService: AuthService, + private accountService: AccountService, private readonly webRequest: typeof chrome.webRequest, ) { this.isFirefox = platformUtilsService.isFirefox(); @@ -55,7 +60,16 @@ export default class WebRequestBackground { // eslint-disable-next-line private async resolveAuthCredentials(domain: string, success: Function, error: Function) { - if ((await this.authService.getAuthStatus()) < AuthenticationStatus.Unlocked) { + const activeUserId = await firstValueFrom( + this.accountService.activeAccount$.pipe(getOptionalUserId), + ); + if (activeUserId == null) { + error(); + return; + } + + const authStatus = await firstValueFrom(this.authService.authStatusFor$(activeUserId)); + if (authStatus < AuthenticationStatus.Unlocked) { error(); return; } @@ -63,6 +77,7 @@ export default class WebRequestBackground { try { const ciphers = await this.cipherService.getAllDecryptedForUrl( domain, + activeUserId, null, UriMatchStrategy.Host, ); diff --git a/apps/browser/src/autofill/browser/abstractions/main-context-menu-handler.ts b/apps/browser/src/autofill/browser/abstractions/main-context-menu-handler.ts index 7ded23116ee..180a4685332 100644 --- a/apps/browser/src/autofill/browser/abstractions/main-context-menu-handler.ts +++ b/apps/browser/src/autofill/browser/abstractions/main-context-menu-handler.ts @@ -1,5 +1,6 @@ type InitContextMenuItems = Omit & { - checkPremiumAccess?: boolean; + requiresPremiumAccess?: boolean; + requiresUnblockedUri?: boolean; }; export { InitContextMenuItems }; diff --git a/apps/browser/src/autofill/browser/cipher-context-menu-handler.spec.ts b/apps/browser/src/autofill/browser/cipher-context-menu-handler.spec.ts index 4fed9eee5ef..3228aed4688 100644 --- a/apps/browser/src/autofill/browser/cipher-context-menu-handler.spec.ts +++ b/apps/browser/src/autofill/browser/cipher-context-menu-handler.spec.ts @@ -2,6 +2,8 @@ import { mock, MockProxy } from "jest-mock-extended"; import { AuthService } from "@bitwarden/common/auth/abstractions/auth.service"; import { AuthenticationStatus } from "@bitwarden/common/auth/enums/authentication-status"; +import { mockAccountServiceWith } from "@bitwarden/common/spec"; +import { UserId } from "@bitwarden/common/types/guid"; import { CipherService } from "@bitwarden/common/vault/abstractions/cipher.service"; import { CipherType } from "@bitwarden/common/vault/enums"; import { CipherRepromptType } from "@bitwarden/common/vault/enums/cipher-reprompt-type"; @@ -14,6 +16,9 @@ describe("CipherContextMenuHandler", () => { let authService: MockProxy; let cipherService: MockProxy; + const mockUserId = "UserId" as UserId; + const accountService = mockAccountServiceWith(mockUserId); + let sut: CipherContextMenuHandler; beforeEach(() => { @@ -24,7 +29,12 @@ describe("CipherContextMenuHandler", () => { jest.spyOn(MainContextMenuHandler, "removeAll").mockResolvedValue(); - sut = new CipherContextMenuHandler(mainContextMenuHandler, authService, cipherService); + sut = new CipherContextMenuHandler( + mainContextMenuHandler, + authService, + cipherService, + accountService, + ); }); afterEach(() => jest.resetAllMocks()); @@ -119,10 +129,11 @@ describe("CipherContextMenuHandler", () => { expect(cipherService.getAllDecryptedForUrl).toHaveBeenCalledTimes(1); - expect(cipherService.getAllDecryptedForUrl).toHaveBeenCalledWith("https://test.com", [ - CipherType.Card, - CipherType.Identity, - ]); + expect(cipherService.getAllDecryptedForUrl).toHaveBeenCalledWith( + "https://test.com", + mockUserId, + [CipherType.Card, CipherType.Identity], + ); expect(mainContextMenuHandler.loadOptions).toHaveBeenCalledTimes(3); 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 b112ff00efe..e2bf75350a2 100644 --- a/apps/browser/src/autofill/browser/cipher-context-menu-handler.ts +++ b/apps/browser/src/autofill/browser/cipher-context-menu-handler.ts @@ -1,5 +1,9 @@ +import { firstValueFrom } 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 { getOptionalUserId } from "@bitwarden/common/auth/services/account.service"; import { Utils } from "@bitwarden/common/platform/misc/utils"; import { CipherService } from "@bitwarden/common/vault/abstractions/cipher.service"; import { CipherType } from "@bitwarden/common/vault/enums"; @@ -14,9 +18,10 @@ export class CipherContextMenuHandler { private mainContextMenuHandler: MainContextMenuHandler, private authService: AuthService, private cipherService: CipherService, + private accountService: AccountService, ) {} - async update(url: string) { + async update(url: string, currentUriIsBlocked: boolean = false) { if (this.mainContextMenuHandler.initRunning) { return; } @@ -35,7 +40,14 @@ export class CipherContextMenuHandler { return; } - const ciphers = await this.cipherService.getAllDecryptedForUrl(url, [ + const activeUserId = await firstValueFrom( + this.accountService.activeAccount$.pipe(getOptionalUserId), + ); + if (activeUserId == null) { + return; + } + + const ciphers = await this.cipherService.getAllDecryptedForUrl(url, activeUserId, [ CipherType.Card, CipherType.Identity, ]); @@ -76,6 +88,10 @@ export class CipherContextMenuHandler { for (const cipher of ciphers) { await this.updateForCipher(cipher); } + + if (currentUriIsBlocked) { + await this.mainContextMenuHandler.removeBlockedUriMenuItems(); + } } private async updateForCipher(cipher: CipherView) { diff --git a/apps/browser/src/autofill/browser/context-menu-clicked-handler.spec.ts b/apps/browser/src/autofill/browser/context-menu-clicked-handler.spec.ts index 6ef004f7979..c8cb7e81f72 100644 --- a/apps/browser/src/autofill/browser/context-menu-clicked-handler.spec.ts +++ b/apps/browser/src/autofill/browser/context-menu-clicked-handler.spec.ts @@ -61,6 +61,8 @@ describe("ContextMenuClickedHandler", () => { return cipherView; }; + const mockUserId = "UserId" as UserId; + let copyToClipboard: CopyToClipboardAction; let generatePasswordToClipboard: GeneratePasswordToClipboardAction; let autofill: AutofillAction; @@ -79,7 +81,7 @@ describe("ContextMenuClickedHandler", () => { autofill = jest.fn, [tab: chrome.tabs.Tab, cipher: CipherView]>(); authService = mock(); cipherService = mock(); - accountService = mockAccountServiceWith("userId" as UserId); + accountService = mockAccountServiceWith(mockUserId as UserId); totpService = mock(); eventCollectionService = mock(); @@ -191,7 +193,11 @@ describe("ContextMenuClickedHandler", () => { expect(cipherService.getAllDecryptedForUrl).toHaveBeenCalledTimes(1); - expect(cipherService.getAllDecryptedForUrl).toHaveBeenCalledWith("https://test.com", []); + expect(cipherService.getAllDecryptedForUrl).toHaveBeenCalledWith( + "https://test.com", + mockUserId, + [], + ); expect(copyToClipboard).toHaveBeenCalledTimes(1); @@ -215,7 +221,11 @@ describe("ContextMenuClickedHandler", () => { expect(cipherService.getAllDecryptedForUrl).toHaveBeenCalledTimes(1); - expect(cipherService.getAllDecryptedForUrl).toHaveBeenCalledWith("https://test.com", []); + expect(cipherService.getAllDecryptedForUrl).toHaveBeenCalledWith( + "https://test.com", + mockUserId, + [], + ); }); }); }); 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 597d75575b0..69c8b6e70b8 100644 --- a/apps/browser/src/autofill/browser/context-menu-clicked-handler.ts +++ b/apps/browser/src/autofill/browser/context-menu-clicked-handler.ts @@ -1,12 +1,13 @@ // FIXME: Update this file to be type safe and remove this and next line // @ts-strict-ignore -import { firstValueFrom, map } from "rxjs"; +import { firstValueFrom } from "rxjs"; import { EventCollectionService } from "@bitwarden/common/abstractions/event/event-collection.service"; import { AccountService } from "@bitwarden/common/auth/abstractions/account.service"; import { AuthService } from "@bitwarden/common/auth/abstractions/auth.service"; import { UserVerificationService } from "@bitwarden/common/auth/abstractions/user-verification/user-verification.service.abstraction"; import { AuthenticationStatus } from "@bitwarden/common/auth/enums/authentication-status"; +import { getOptionalUserId } from "@bitwarden/common/auth/services/account.service"; import { AUTOFILL_CARD_ID, AUTOFILL_ID, @@ -105,6 +106,13 @@ export class ContextMenuClickedHandler { menuItemId as string, ); + const activeUserId = await firstValueFrom( + this.accountService.activeAccount$.pipe(getOptionalUserId), + ); + if (activeUserId == null) { + return; + } + if (isCreateCipherAction) { // pass; defer to logic below } else if (menuItemId === NOOP_COMMAND_SUFFIX) { @@ -120,12 +128,13 @@ export class ContextMenuClickedHandler { // in scenarios like unlock on autofill const ciphers = await this.cipherService.getAllDecryptedForUrl( tab.url, + activeUserId, additionalCiphersToGet, ); cipher = ciphers[0]; } else { - const ciphers = await this.cipherService.getAllDecrypted(); + const ciphers = await this.cipherService.getAllDecrypted(activeUserId); cipher = ciphers.find(({ id }) => id === menuItemId); } @@ -133,9 +142,6 @@ export class ContextMenuClickedHandler { return; } - const activeUserId = await firstValueFrom( - this.accountService.activeAccount$.pipe(map((a) => a?.id)), - ); await this.accountService.setAccountActivity(activeUserId, new Date()); switch (info.parentMenuItemId) { case AUTOFILL_ID: 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 79998b65205..267a832a671 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 @@ -2,7 +2,17 @@ import { mock, MockProxy } from "jest-mock-extended"; import { of } from "rxjs"; import { AccountService } from "@bitwarden/common/auth/abstractions/account.service"; -import { NOOP_COMMAND_SUFFIX } from "@bitwarden/common/autofill/constants"; +import { + AUTOFILL_CARD_ID, + AUTOFILL_ID, + AUTOFILL_IDENTITY_ID, + COPY_IDENTIFIER_ID, + COPY_PASSWORD_ID, + COPY_USERNAME_ID, + COPY_VERIFICATION_CODE_ID, + NOOP_COMMAND_SUFFIX, + SEPARATOR_ID, +} from "@bitwarden/common/autofill/constants"; import { AutofillSettingsServiceAbstraction } from "@bitwarden/common/autofill/services/autofill-settings.service"; import { BillingAccountProfileStateService } from "@bitwarden/common/billing/abstractions/account/billing-account-profile-state.service"; import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; @@ -15,6 +25,43 @@ import { CipherView } from "@bitwarden/common/vault/models/view/cipher.view"; import { MainContextMenuHandler } from "./main-context-menu-handler"; +/** + * Used in place of Set method `symmetricDifference`, which is only available to node version 22.0.0 or greater: + * https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Set/symmetricDifference + */ +function symmetricDifference(setA: Set, setB: Set) { + const _difference = new Set(setA); + for (const elem of setB) { + if (_difference.has(elem)) { + _difference.delete(elem); + } else { + _difference.add(elem); + } + } + return _difference; +} + +const createCipher = (data?: { + id?: CipherView["id"]; + username?: CipherView["login"]["username"]; + password?: CipherView["login"]["password"]; + totp?: CipherView["login"]["totp"]; + viewPassword?: CipherView["viewPassword"]; +}): CipherView => { + const { id, username, password, totp, viewPassword } = data || {}; + const cipherView = new CipherView( + new Cipher({ + id: id ?? "1", + type: CipherType.Login, + viewPassword: viewPassword ?? true, + } as any), + ); + cipherView.login.username = username ?? "USERNAME"; + cipherView.login.password = password ?? "PASSWORD"; + cipherView.login.totp = totp ?? "TOTP"; + return cipherView; +}; + describe("context-menu", () => { let stateService: MockProxy; let autofillSettingsService: MockProxy; @@ -59,6 +106,9 @@ describe("context-menu", () => { billingAccountProfileStateService, accountService, ); + + jest.spyOn(MainContextMenuHandler, "remove"); + autofillSettingsService.enableContextMenu$ = of(true); accountService.activeAccount$ = of({ id: "userId" as UserId, @@ -68,7 +118,10 @@ describe("context-menu", () => { }); }); - afterEach(() => jest.resetAllMocks()); + afterEach(async () => { + await MainContextMenuHandler.removeAll(); + jest.resetAllMocks(); + }); describe("init", () => { it("has menu disabled", async () => { @@ -97,27 +150,6 @@ describe("context-menu", () => { }); describe("loadOptions", () => { - const createCipher = (data?: { - id?: CipherView["id"]; - username?: CipherView["login"]["username"]; - password?: CipherView["login"]["password"]; - totp?: CipherView["login"]["totp"]; - viewPassword?: CipherView["viewPassword"]; - }): CipherView => { - const { id, username, password, totp, viewPassword } = data || {}; - const cipherView = new CipherView( - new Cipher({ - id: id ?? "1", - type: CipherType.Login, - viewPassword: viewPassword ?? true, - } as any), - ); - cipherView.login.username = username ?? "USERNAME"; - cipherView.login.password = password ?? "PASSWORD"; - cipherView.login.totp = totp ?? "TOTP"; - return cipherView; - }; - it("is not a login cipher", async () => { await sut.loadOptions("TEST_TITLE", "1", { ...createCipher(), @@ -128,33 +160,124 @@ describe("context-menu", () => { }); it("creates item for autofill", async () => { - await sut.loadOptions( - "TEST_TITLE", - "1", - createCipher({ - username: "", - totp: "", - viewPassword: false, - }), + const cipher = createCipher({ + username: "", + totp: "", + viewPassword: true, + }); + const optionId = "1"; + await sut.loadOptions("TEST_TITLE", optionId, cipher); + + expect(createSpy).toHaveBeenCalledTimes(2); + + expect(MainContextMenuHandler["existingMenuItems"].size).toEqual(2); + + const expectedMenuItems = new Set([ + AUTOFILL_ID + `_${optionId}`, + COPY_PASSWORD_ID + `_${optionId}`, + ]); + + // @TODO Replace with `symmetricDifference` Set method once node 22.0.0 or higher is used + // const expectedReceivedDiff = expectedMenuItems.symmetricDifference(MainContextMenuHandler["existingMenuItems"]) + const expectedReceivedDiff = symmetricDifference( + expectedMenuItems, + MainContextMenuHandler["existingMenuItems"], ); - expect(createSpy).toHaveBeenCalledTimes(1); + expect(expectedReceivedDiff.size).toEqual(0); }); it("create entry for each cipher piece", async () => { billingAccountProfileStateService.hasPremiumFromAnySource$.mockReturnValue(of(true)); - - await sut.loadOptions("TEST_TITLE", "1", createCipher()); + const optionId = "arbitraryString"; + await sut.loadOptions("TEST_TITLE", optionId, createCipher()); expect(createSpy).toHaveBeenCalledTimes(4); + + expect(MainContextMenuHandler["existingMenuItems"].size).toEqual(4); + + const expectedMenuItems = new Set([ + AUTOFILL_ID + `_${optionId}`, + COPY_PASSWORD_ID + `_${optionId}`, + COPY_USERNAME_ID + `_${optionId}`, + COPY_VERIFICATION_CODE_ID + `_${optionId}`, + ]); + + // @TODO Replace with `symmetricDifference` Set method once node 22.0.0 or higher is used + // const expectedReceivedDiff = expectedMenuItems.symmetricDifference(MainContextMenuHandler["existingMenuItems"]) + const expectedReceivedDiff = symmetricDifference( + expectedMenuItems, + MainContextMenuHandler["existingMenuItems"], + ); + + expect(expectedReceivedDiff.size).toEqual(0); }); it("creates a login/unlock item for each context menu action option when user is not authenticated", async () => { billingAccountProfileStateService.hasPremiumFromAnySource$.mockReturnValue(of(true)); - await sut.loadOptions("TEST_TITLE", "NOOP"); + const optionId = "NOOP"; + await sut.loadOptions("TEST_TITLE", optionId); expect(createSpy).toHaveBeenCalledTimes(6); + + expect(MainContextMenuHandler["existingMenuItems"].size).toEqual(6); + + const expectedMenuItems = new Set([ + AUTOFILL_ID + `_${optionId}`, + COPY_PASSWORD_ID + `_${optionId}`, + COPY_USERNAME_ID + `_${optionId}`, + COPY_VERIFICATION_CODE_ID + `_${optionId}`, + AUTOFILL_CARD_ID + `_${optionId}`, + AUTOFILL_IDENTITY_ID + `_${optionId}`, + ]); + + // @TODO Replace with `symmetricDifference` Set method once node 22.0.0 or higher is used + // const expectedReceivedDiff = expectedMenuItems.symmetricDifference(MainContextMenuHandler["existingMenuItems"]) + const expectedReceivedDiff = symmetricDifference( + expectedMenuItems, + MainContextMenuHandler["existingMenuItems"], + ); + + expect(expectedReceivedDiff.size).toEqual(0); + }); + }); + + describe("removeBlockedUriMenuItems", () => { + it("removes menu items that require code injection", async () => { + billingAccountProfileStateService.hasPremiumFromAnySource$.mockReturnValue(of(true)); + autofillSettingsService.enableContextMenu$ = of(true); + stateService.getIsAuthenticated.mockResolvedValue(true); + + const optionId = "1"; + await sut.loadOptions("TEST_TITLE", optionId, createCipher()); + + await sut.removeBlockedUriMenuItems(); + + expect(MainContextMenuHandler["remove"]).toHaveBeenCalledTimes(5); + expect(MainContextMenuHandler["remove"]).toHaveBeenCalledWith(AUTOFILL_ID); + expect(MainContextMenuHandler["remove"]).toHaveBeenCalledWith(AUTOFILL_IDENTITY_ID); + expect(MainContextMenuHandler["remove"]).toHaveBeenCalledWith(AUTOFILL_CARD_ID); + expect(MainContextMenuHandler["remove"]).toHaveBeenCalledWith(SEPARATOR_ID + 2); + expect(MainContextMenuHandler["remove"]).toHaveBeenCalledWith(COPY_IDENTIFIER_ID); + + expect(MainContextMenuHandler["existingMenuItems"].size).toEqual(4); + + const expectedMenuItems = new Set([ + AUTOFILL_ID + `_${optionId}`, + COPY_PASSWORD_ID + `_${optionId}`, + COPY_USERNAME_ID + `_${optionId}`, + COPY_VERIFICATION_CODE_ID + `_${optionId}`, + ]); + + // @TODO Replace with `symmetricDifference` Set method once node 22.0.0 or higher is used + // const expectedReceivedDiff = expectedMenuItems.symmetricDifference(MainContextMenuHandler["existingMenuItems"]) + const expectedReceivedDiff = symmetricDifference( + expectedMenuItems, + MainContextMenuHandler["existingMenuItems"], + ); + + expect(expectedReceivedDiff.size).toEqual(0); }); }); 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 41d88439e8f..ad9dc34e501 100644 --- a/apps/browser/src/autofill/browser/main-context-menu-handler.ts +++ b/apps/browser/src/autofill/browser/main-context-menu-handler.ts @@ -31,6 +31,7 @@ import { CipherView } from "@bitwarden/common/vault/models/view/cipher.view"; import { InitContextMenuItems } from "./abstractions/main-context-menu-handler"; export class MainContextMenuHandler { + static existingMenuItems: Set = new Set(); initRunning = false; private initContextMenuItems: InitContextMenuItems[] = [ { @@ -41,6 +42,7 @@ export class MainContextMenuHandler { id: AUTOFILL_ID, parentId: ROOT_ID, title: this.i18nService.t("autoFillLogin"), + requiresUnblockedUri: true, }, { id: COPY_USERNAME_ID, @@ -56,7 +58,7 @@ export class MainContextMenuHandler { id: COPY_VERIFICATION_CODE_ID, parentId: ROOT_ID, title: this.i18nService.t("copyVerificationCode"), - checkPremiumAccess: true, + requiresPremiumAccess: true, }, { id: SEPARATOR_ID + 1, @@ -67,16 +69,19 @@ export class MainContextMenuHandler { id: AUTOFILL_IDENTITY_ID, parentId: ROOT_ID, title: this.i18nService.t("autoFillIdentity"), + requiresUnblockedUri: true, }, { id: AUTOFILL_CARD_ID, parentId: ROOT_ID, title: this.i18nService.t("autoFillCard"), + requiresUnblockedUri: true, }, { id: SEPARATOR_ID + 2, type: "separator", parentId: ROOT_ID, + requiresUnblockedUri: true, }, { id: GENERATE_PASSWORD_ID, @@ -87,6 +92,7 @@ export class MainContextMenuHandler { id: COPY_IDENTIFIER_ID, parentId: ROOT_ID, title: this.i18nService.t("copyElementIdentifier"), + requiresUnblockedUri: true, }, ]; private noCardsContextMenuItems: chrome.contextMenus.CreateProperties[] = [ @@ -175,13 +181,19 @@ export class MainContextMenuHandler { this.billingAccountProfileStateService.hasPremiumFromAnySource$(account.id), ); - for (const options of this.initContextMenuItems) { - if (options.checkPremiumAccess && !hasPremium) { + for (const menuItem of this.initContextMenuItems) { + const { + requiresPremiumAccess, + // eslint-disable-next-line @typescript-eslint/no-unused-vars + requiresUnblockedUri, // destructuring this out of being passed to `create` + ...otherOptions + } = menuItem; + + if (requiresPremiumAccess && !hasPremium) { continue; } - delete options.checkPremiumAccess; - await MainContextMenuHandler.create({ ...options, contexts: ["all"] }); + await MainContextMenuHandler.create({ ...otherOptions, contexts: ["all"] }); } } catch (error) { this.logService.warning(error.message); @@ -202,12 +214,16 @@ export class MainContextMenuHandler { } return new Promise((resolve, reject) => { - chrome.contextMenus.create(options, () => { + const itemId = chrome.contextMenus.create(options, () => { if (chrome.runtime.lastError) { return reject(chrome.runtime.lastError); } resolve(); }); + + this.existingMenuItems.add(`${itemId}`); + + return itemId; }); }; @@ -221,12 +237,16 @@ export class MainContextMenuHandler { resolve(); }); + + this.existingMenuItems = new Set(); + + return; }); } static remove(menuItemId: string) { return new Promise((resolve, reject) => { - chrome.contextMenus.remove(menuItemId, () => { + const itemId = chrome.contextMenus.remove(menuItemId, () => { if (chrome.runtime.lastError) { reject(chrome.runtime.lastError); return; @@ -234,6 +254,10 @@ export class MainContextMenuHandler { resolve(); }); + + this.existingMenuItems.delete(`${itemId}`); + + return; }); } @@ -244,6 +268,11 @@ export class MainContextMenuHandler { const createChildItem = async (parentId: string) => { const menuItemId = `${parentId}_${optionId}`; + const itemAlreadyExists = MainContextMenuHandler.existingMenuItems.has(menuItemId); + if (itemAlreadyExists) { + return; + } + return await MainContextMenuHandler.create({ type: "normal", id: menuItemId, @@ -255,10 +284,18 @@ export class MainContextMenuHandler { if ( !cipher || - (cipher.type === CipherType.Login && !Utils.isNullOrEmpty(cipher.login?.password)) + (cipher.type === CipherType.Login && + (!Utils.isNullOrEmpty(cipher.login?.username) || + !Utils.isNullOrEmpty(cipher.login?.password) || + !Utils.isNullOrEmpty(cipher.login?.totp))) ) { await createChildItem(AUTOFILL_ID); + } + if ( + !cipher || + (cipher.type === CipherType.Login && !Utils.isNullOrEmpty(cipher.login?.password)) + ) { if (cipher?.viewPassword ?? true) { await createChildItem(COPY_PASSWORD_ID); } @@ -305,10 +342,22 @@ export class MainContextMenuHandler { } } + async removeBlockedUriMenuItems() { + try { + for (const menuItem of this.initContextMenuItems) { + if (menuItem.requiresUnblockedUri && menuItem.id) { + await MainContextMenuHandler.remove(menuItem.id); + } + } + } catch (error) { + this.logService.warning(error.message); + } + } + async noCards() { try { - for (const option of this.noCardsContextMenuItems) { - await MainContextMenuHandler.create(option); + for (const menuItem of this.noCardsContextMenuItems) { + await MainContextMenuHandler.create(menuItem); } } catch (error) { this.logService.warning(error.message); @@ -317,8 +366,8 @@ export class MainContextMenuHandler { async noIdentities() { try { - for (const option of this.noIdentitiesContextMenuItems) { - await MainContextMenuHandler.create(option); + for (const menuItem of this.noIdentitiesContextMenuItems) { + await MainContextMenuHandler.create(menuItem); } } catch (error) { this.logService.warning(error.message); @@ -327,8 +376,8 @@ export class MainContextMenuHandler { async noLogins() { try { - for (const option of this.noLoginsContextMenuItems) { - await MainContextMenuHandler.create(option); + for (const menuItem of this.noLoginsContextMenuItems) { + await MainContextMenuHandler.create(menuItem); } await this.loadOptions(this.i18nService.t("addLoginMenu"), CREATE_LOGIN_ID); diff --git a/apps/browser/src/autofill/clipboard/clear-clipboard.spec.ts b/apps/browser/src/autofill/clipboard/clear-clipboard.spec.ts deleted file mode 100644 index 7bfe7934046..00000000000 --- a/apps/browser/src/autofill/clipboard/clear-clipboard.spec.ts +++ /dev/null @@ -1,39 +0,0 @@ -import { BrowserApi } from "../../platform/browser/browser-api"; - -import { ClearClipboard } from "./clear-clipboard"; - -describe("clearClipboard", () => { - describe("run", () => { - it("Does not clear clipboard when no active tabs are retrieved", async () => { - jest.spyOn(BrowserApi, "getActiveTabs").mockResolvedValue([] as any); - - jest.spyOn(BrowserApi, "sendTabsMessage").mockReturnValue(); - - await ClearClipboard.run(); - - expect(jest.spyOn(BrowserApi, "sendTabsMessage")).not.toHaveBeenCalled(); - - expect(jest.spyOn(BrowserApi, "sendTabsMessage")).not.toHaveBeenCalledWith(1, { - command: "clearClipboard", - }); - }); - - it("Sends a message to the content script to clear the clipboard", async () => { - jest.spyOn(BrowserApi, "getActiveTabs").mockResolvedValue([ - { - id: 1, - }, - ] as any); - - jest.spyOn(BrowserApi, "sendTabsMessage").mockReturnValue(); - - await ClearClipboard.run(); - - expect(jest.spyOn(BrowserApi, "sendTabsMessage")).toHaveBeenCalledTimes(1); - - expect(jest.spyOn(BrowserApi, "sendTabsMessage")).toHaveBeenCalledWith(1, { - command: "clearClipboard", - }); - }); - }); -}); diff --git a/apps/browser/src/autofill/clipboard/clear-clipboard.ts b/apps/browser/src/autofill/clipboard/clear-clipboard.ts deleted file mode 100644 index 93674df0ad9..00000000000 --- a/apps/browser/src/autofill/clipboard/clear-clipboard.ts +++ /dev/null @@ -1,22 +0,0 @@ -// FIXME: Update this file to be type safe and remove this and next line -// @ts-strict-ignore -import { BrowserApi } from "../../platform/browser/browser-api"; - -export class ClearClipboard { - /** - We currently rely on an active tab with an injected content script (`../content/misc-utils.ts`) to clear the clipboard via `window.navigator.clipboard.writeText(text)` - - With https://bugs.chromium.org/p/chromium/issues/detail?id=1160302 it was said that service workers, - would have access to the clipboard api and then we could migrate to a simpler solution - */ - static async run() { - const activeTabs = await BrowserApi.getActiveTabs(); - if (!activeTabs || activeTabs.length === 0) { - return; - } - - BrowserApi.sendTabsMessage(activeTabs[0].id, { - command: "clearClipboard", - }); - } -} diff --git a/apps/browser/src/autofill/clipboard/copy-to-clipboard-command.ts b/apps/browser/src/autofill/clipboard/copy-to-clipboard-command.ts deleted file mode 100644 index 92d35e70e57..00000000000 --- a/apps/browser/src/autofill/clipboard/copy-to-clipboard-command.ts +++ /dev/null @@ -1,17 +0,0 @@ -import { BrowserApi } from "../../platform/browser/browser-api"; - -/** - * Copies text to the clipboard in a MV3 safe way. - * @param tab - The tab that the text will be sent to so that it can be copied to the users clipboard this needs to be an active tab or the DOM won't be able to be used to do the action. The tab sent in here should be from a user started action or queried for active tabs. - * @param text - The text that you want added to the users clipboard. - */ -export const copyToClipboard = async (tab: chrome.tabs.Tab, text: string) => { - if (tab.id == null) { - throw new Error("Cannot copy text to clipboard with a tab that does not have an id."); - } - - BrowserApi.sendTabsMessage(tab.id, { - command: "copyText", - text: text, - }); -}; diff --git a/apps/browser/src/autofill/clipboard/generate-password-to-clipboard-command.spec.ts b/apps/browser/src/autofill/clipboard/generate-password-to-clipboard-command.spec.ts deleted file mode 100644 index d0d42cc06f7..00000000000 --- a/apps/browser/src/autofill/clipboard/generate-password-to-clipboard-command.spec.ts +++ /dev/null @@ -1,97 +0,0 @@ -import { mock, MockProxy } from "jest-mock-extended"; -import { firstValueFrom, Subscription } from "rxjs"; - -import { AutofillSettingsService } from "@bitwarden/common/autofill/services/autofill-settings.service"; -import { ScheduledTaskNames } from "@bitwarden/common/platform/scheduling"; -import { PasswordGenerationServiceAbstraction } from "@bitwarden/generator-legacy"; - -import { BrowserApi } from "../../platform/browser/browser-api"; -import { BrowserTaskSchedulerService } from "../../platform/services/abstractions/browser-task-scheduler.service"; - -import { ClearClipboard } from "./clear-clipboard"; -import { GeneratePasswordToClipboardCommand } from "./generate-password-to-clipboard-command"; - -jest.mock("rxjs", () => { - const actual = jest.requireActual("rxjs"); - return { - ...actual, - firstValueFrom: jest.fn(), - }; -}); - -describe("GeneratePasswordToClipboardCommand", () => { - let passwordGenerationService: MockProxy; - let autofillSettingsService: MockProxy; - let browserTaskSchedulerService: MockProxy; - - let sut: GeneratePasswordToClipboardCommand; - - beforeEach(() => { - passwordGenerationService = mock(); - autofillSettingsService = mock(); - browserTaskSchedulerService = mock({ - setTimeout: jest.fn((taskName, timeoutInMs) => { - const timeoutHandle = setTimeout(() => { - if (taskName === ScheduledTaskNames.generatePasswordClearClipboardTimeout) { - void ClearClipboard.run(); - } - }, timeoutInMs); - - return new Subscription(() => clearTimeout(timeoutHandle)); - }), - }); - - passwordGenerationService.getOptions.mockResolvedValue([{ length: 8 }, {} as any]); - - passwordGenerationService.generatePassword.mockResolvedValue("PASSWORD"); - - jest.spyOn(BrowserApi, "sendTabsMessage").mockReturnValue(); - - sut = new GeneratePasswordToClipboardCommand( - passwordGenerationService, - autofillSettingsService, - browserTaskSchedulerService, - ); - }); - - afterEach(() => { - jest.resetAllMocks(); - }); - - describe("generatePasswordToClipboard", () => { - it("has clear clipboard value", async () => { - jest.useFakeTimers(); - jest.spyOn(ClearClipboard, "run"); - (firstValueFrom as jest.Mock).mockResolvedValue(2 * 60); // 2 minutes - - await sut.generatePasswordToClipboard({ id: 1 } as any); - jest.advanceTimersByTime(2 * 60 * 1000); - - expect(jest.spyOn(BrowserApi, "sendTabsMessage")).toHaveBeenCalledTimes(1); - expect(jest.spyOn(BrowserApi, "sendTabsMessage")).toHaveBeenCalledWith(1, { - command: "copyText", - text: "PASSWORD", - }); - expect(browserTaskSchedulerService.setTimeout).toHaveBeenCalledTimes(1); - expect(browserTaskSchedulerService.setTimeout).toHaveBeenCalledWith( - ScheduledTaskNames.generatePasswordClearClipboardTimeout, - expect.any(Number), - ); - expect(ClearClipboard.run).toHaveBeenCalledTimes(1); - }); - - it("does not have clear clipboard value", async () => { - jest.spyOn(sut as any, "getClearClipboard").mockImplementation(() => null); - - await sut.generatePasswordToClipboard({ id: 1 } as any); - - expect(jest.spyOn(BrowserApi, "sendTabsMessage")).toHaveBeenCalledTimes(1); - - expect(jest.spyOn(BrowserApi, "sendTabsMessage")).toHaveBeenCalledWith(1, { - command: "copyText", - text: "PASSWORD", - }); - expect(browserTaskSchedulerService.setTimeout).not.toHaveBeenCalled(); - }); - }); -}); diff --git a/apps/browser/src/autofill/clipboard/generate-password-to-clipboard-command.ts b/apps/browser/src/autofill/clipboard/generate-password-to-clipboard-command.ts deleted file mode 100644 index 5fb6e8667a4..00000000000 --- a/apps/browser/src/autofill/clipboard/generate-password-to-clipboard-command.ts +++ /dev/null @@ -1,48 +0,0 @@ -// FIXME: Update this file to be type safe and remove this and next line -// @ts-strict-ignore -import { firstValueFrom, Subscription } from "rxjs"; - -import { AutofillSettingsServiceAbstraction } from "@bitwarden/common/autofill/services/autofill-settings.service"; -import { TaskSchedulerService, ScheduledTaskNames } from "@bitwarden/common/platform/scheduling"; -import { PasswordGenerationServiceAbstraction } from "@bitwarden/generator-legacy"; - -import { ClearClipboard } from "./clear-clipboard"; -import { copyToClipboard } from "./copy-to-clipboard-command"; - -export class GeneratePasswordToClipboardCommand { - private clearClipboardSubscription: Subscription; - - constructor( - private passwordGenerationService: PasswordGenerationServiceAbstraction, - private autofillSettingsService: AutofillSettingsServiceAbstraction, - private taskSchedulerService: TaskSchedulerService, - ) { - this.taskSchedulerService.registerTaskHandler( - ScheduledTaskNames.generatePasswordClearClipboardTimeout, - () => ClearClipboard.run(), - ); - } - - async getClearClipboard() { - return await firstValueFrom(this.autofillSettingsService.clearClipboardDelay$); - } - - async generatePasswordToClipboard(tab: chrome.tabs.Tab) { - const [options] = await this.passwordGenerationService.getOptions(); - const password = await this.passwordGenerationService.generatePassword(options); - - await copyToClipboard(tab, password); - - const clearClipboardDelayInSeconds = await this.getClearClipboard(); - if (!clearClipboardDelayInSeconds) { - return; - } - - const timeoutInMs = clearClipboardDelayInSeconds * 1000; - this.clearClipboardSubscription?.unsubscribe(); - this.clearClipboardSubscription = this.taskSchedulerService.setTimeout( - ScheduledTaskNames.generatePasswordClearClipboardTimeout, - timeoutInMs, - ); - } -} diff --git a/apps/browser/src/autofill/clipboard/index.ts b/apps/browser/src/autofill/clipboard/index.ts deleted file mode 100644 index 3682afd5054..00000000000 --- a/apps/browser/src/autofill/clipboard/index.ts +++ /dev/null @@ -1,3 +0,0 @@ -export * from "./clear-clipboard"; -export * from "./copy-to-clipboard-command"; -export * from "./generate-password-to-clipboard-command"; diff --git a/apps/browser/src/autofill/content/components/icons/index.ts b/apps/browser/src/autofill/content/components/icons/index.ts index 992b034afa7..6cc56e079d4 100644 --- a/apps/browser/src/autofill/content/components/icons/index.ts +++ b/apps/browser/src/autofill/content/components/icons/index.ts @@ -10,3 +10,4 @@ export { PartyHorn } from "./party-horn"; export { PencilSquare } from "./pencil-square"; export { Shield } from "./shield"; export { User } from "./user"; +export { Warning } from "./warning"; diff --git a/apps/browser/src/autofill/content/components/icons/party-horn.ts b/apps/browser/src/autofill/content/components/icons/party-horn.ts index dc2144b524f..e807df1d86e 100644 --- a/apps/browser/src/autofill/content/components/icons/party-horn.ts +++ b/apps/browser/src/autofill/content/components/icons/party-horn.ts @@ -6,168 +6,262 @@ import { Theme, ThemeTypes } from "@bitwarden/common/platform/enums"; export function PartyHorn({ theme }: { theme: Theme }) { if (theme === ThemeTypes.Dark) { return html` - + - - - - + + + + + + + + + - + + + + `; } return html` - + - - + + + + + + + - - - + + + - + + + + `; diff --git a/apps/browser/src/autofill/content/components/icons/warning.ts b/apps/browser/src/autofill/content/components/icons/warning.ts new file mode 100644 index 00000000000..9ae9aeca352 --- /dev/null +++ b/apps/browser/src/autofill/content/components/icons/warning.ts @@ -0,0 +1,23 @@ +import { html } from "lit"; + +// This icon has static multi-colors for each theme +export function Warning() { + return html` + + + + + + `; +} diff --git a/apps/browser/src/autofill/content/components/lit-stories/notification/confirmation.lit-stories.ts b/apps/browser/src/autofill/content/components/lit-stories/notification/confirmation.lit-stories.ts new file mode 100644 index 00000000000..94dbaace9aa --- /dev/null +++ b/apps/browser/src/autofill/content/components/lit-stories/notification/confirmation.lit-stories.ts @@ -0,0 +1,41 @@ +import { Meta, StoryObj } from "@storybook/web-components"; + +import { Theme, ThemeTypes } from "@bitwarden/common/platform/enums"; + +import { NotificationConfirmationBody } from "../../notification/confirmation"; + +type Args = { + buttonText: string; + confirmationMessage: string; + handleClick: () => void; + theme: Theme; + error: string; +}; + +export default { + title: "Components/Notifications/Notification Confirmation Body", + argTypes: { + error: { control: "text" }, + buttonText: { control: "text" }, + confirmationMessage: { control: "text" }, + theme: { control: "select", options: [...Object.values(ThemeTypes)] }, + }, + args: { + error: "", + buttonText: "View", + confirmationMessage: "[item name] updated in Bitwarden.", + theme: ThemeTypes.Light, + }, + parameters: { + design: { + type: "figma", + url: "https://www.figma.com/design/LEhqLAcBPY8uDKRfU99n9W/Autofill-notification-redesign?node-id=485-20160&m=dev", + }, + }, +} as Meta; + +const Template = (args: Args) => NotificationConfirmationBody({ ...args }); + +export const Default: StoryObj = { + render: Template, +}; diff --git a/apps/browser/src/autofill/content/components/notification/confirmation-message.ts b/apps/browser/src/autofill/content/components/notification/confirmation-message.ts new file mode 100644 index 00000000000..745899481dd --- /dev/null +++ b/apps/browser/src/autofill/content/components/notification/confirmation-message.ts @@ -0,0 +1,54 @@ +import { css } from "@emotion/css"; +import { html } from "lit"; + +import { Theme } from "@bitwarden/common/platform/enums"; + +import { themes } from "../constants/styles"; + +export function NotificationConfirmationMessage({ + buttonText, + confirmationMessage, + handleClick, + theme, +}: { + buttonText: string; + confirmationMessage: string; + handleClick: (e: Event) => void; + theme: Theme; +}) { + return html` + ${confirmationMessage} + ${buttonText} + `; +} + +const baseTextStyles = css` + flex-grow: 1; + overflow-x: hidden; + text-align: left; + text-overflow: ellipsis; + line-height: 24px; + white-space: nowrap; + font-family: "DM Sans", sans-serif; + font-size: 16px; +`; + +const notificationConfirmationMessageStyles = (theme: Theme) => css` + ${baseTextStyles} + color: ${themes[theme].text.main}; + font-weight: 400; +`; + +const notificationConfirmationButtonTextStyles = (theme: Theme) => css` + ${baseTextStyles} + color: ${themes[theme].primary[600]}; + font-weight: 700; + cursor: pointer; +`; diff --git a/apps/browser/src/autofill/content/components/notification/confirmation.ts b/apps/browser/src/autofill/content/components/notification/confirmation.ts new file mode 100644 index 00000000000..0c389f75eb6 --- /dev/null +++ b/apps/browser/src/autofill/content/components/notification/confirmation.ts @@ -0,0 +1,58 @@ +import createEmotion from "@emotion/css/create-instance"; +import { html } from "lit"; + +import { Theme, ThemeTypes } from "@bitwarden/common/platform/enums"; + +import { themes } from "../constants/styles"; +import { PartyHorn, Warning } from "../icons"; + +import { NotificationConfirmationMessage } from "./confirmation-message"; + +export const componentClassPrefix = "notification-confirmation-body"; + +const { css } = createEmotion({ + key: componentClassPrefix, +}); + +export function NotificationConfirmationBody({ + buttonText, + error, + confirmationMessage, + theme = ThemeTypes.Light, +}: { + error?: string; + buttonText: string; + confirmationMessage: string; + theme: Theme; +}) { + const IconComponent = !error ? PartyHorn : Warning; + return html` +
+
${IconComponent({ theme })}
+ ${confirmationMessage && buttonText + ? NotificationConfirmationMessage({ + handleClick: () => {}, + confirmationMessage, + theme, + buttonText, + }) + : null} +
+ `; +} + +const iconContainerStyles = (error?: string) => css` + > svg { + width: ${!error ? "50px" : "40px"}; + height: fit-content; + } +`; +const notificationConfirmationBodyStyles = ({ theme }: { theme: Theme }) => css` + gap: 16px; + display: flex; + align-items: center; + justify-content: flex-start; + background-color: ${themes[theme].background.alt}; + padding: 12px; + white-space: nowrap; +`; diff --git a/apps/browser/src/autofill/content/content-message-handler.spec.ts b/apps/browser/src/autofill/content/content-message-handler.spec.ts index a37a2e07678..99d0d9031cf 100644 --- a/apps/browser/src/autofill/content/content-message-handler.spec.ts +++ b/apps/browser/src/autofill/content/content-message-handler.spec.ts @@ -1,6 +1,6 @@ import { mock } from "jest-mock-extended"; -import { VaultOnboardingMessages } from "@bitwarden/common/vault/enums/vault-onboarding.enum"; +import { VaultMessages } from "@bitwarden/common/vault/enums/vault-messages.enum"; import { postWindowMessage, sendMockExtensionMessage } from "../spec/testing-utils"; @@ -34,10 +34,10 @@ describe("ContentMessageHandler", () => { const mockPostMessage = jest.fn(); window.postMessage = mockPostMessage; - postWindowMessage({ command: VaultOnboardingMessages.checkBwInstalled }); + postWindowMessage({ command: VaultMessages.checkBwInstalled }); expect(mockPostMessage).toHaveBeenCalledWith({ - command: VaultOnboardingMessages.HasBwInstalled, + command: VaultMessages.HasBwInstalled, }); }); }); diff --git a/apps/browser/src/autofill/content/content-message-handler.ts b/apps/browser/src/autofill/content/content-message-handler.ts index ef542896492..5f98cf348a3 100644 --- a/apps/browser/src/autofill/content/content-message-handler.ts +++ b/apps/browser/src/autofill/content/content-message-handler.ts @@ -1,4 +1,4 @@ -import { VaultOnboardingMessages } from "@bitwarden/common/vault/enums/vault-onboarding.enum"; +import { VaultMessages } from "@bitwarden/common/vault/enums/vault-messages.enum"; import { ContentMessageWindowData, @@ -26,16 +26,17 @@ const windowMessageHandlers: ContentMessageWindowEventHandlers = { handleAuthResultMessage(data, referrer), webAuthnResult: ({ data, referrer }: { data: any; referrer: string }) => handleWebAuthnResultMessage(data, referrer), - checkIfBWExtensionInstalled: () => handleExtensionInstallCheck(), + [VaultMessages.checkBwInstalled]: () => handleExtensionInstallCheck(), duoResult: ({ data, referrer }: { data: any; referrer: string }) => handleDuoResultMessage(data, referrer), + [VaultMessages.OpenPopup]: () => handleOpenPopupMessage(), }; /** * Handles the post to the web vault showing the extension has been installed */ function handleExtensionInstallCheck() { - window.postMessage({ command: VaultOnboardingMessages.HasBwInstalled }); + window.postMessage({ command: VaultMessages.HasBwInstalled }); } /** @@ -71,6 +72,10 @@ function handleWebAuthnResultMessage(data: ContentMessageWindowData, referrer: s sendExtensionRuntimeMessage({ command, data: data.data, remember, referrer }); } +function handleOpenPopupMessage() { + sendExtensionRuntimeMessage({ command: VaultMessages.OpenPopup }); +} + /** * Handles the window message event. * diff --git a/apps/browser/src/autofill/content/misc-utils.ts b/apps/browser/src/autofill/content/misc-utils.ts deleted file mode 100644 index 7fe884f1d51..00000000000 --- a/apps/browser/src/autofill/content/misc-utils.ts +++ /dev/null @@ -1,23 +0,0 @@ -import { TabMessage } from "../../types/tab-messages"; - -async function copyText(text: string) { - await window.navigator.clipboard.writeText(text); -} - -async function onMessageListener( - msg: TabMessage, - sender: chrome.runtime.MessageSender, - responseCallback: (response: unknown) => void, -) { - switch (msg.command) { - case "copyText": - await copyText(msg.text); - break; - case "clearClipboard": - await copyText("\u0000"); - break; - default: - } -} - -chrome.runtime.onMessage.addListener(onMessageListener); diff --git a/apps/browser/src/autofill/deprecated/background/overlay.background.deprecated.spec.ts b/apps/browser/src/autofill/deprecated/background/overlay.background.deprecated.spec.ts index 2c22097f3d0..497664542ad 100644 --- a/apps/browser/src/autofill/deprecated/background/overlay.background.deprecated.spec.ts +++ b/apps/browser/src/autofill/deprecated/background/overlay.background.deprecated.spec.ts @@ -110,6 +110,7 @@ describe("OverlayBackground", () => { i18nService, platformUtilsService, themeStateService, + accountService, ); jest @@ -205,7 +206,7 @@ describe("OverlayBackground", () => { await overlayBackground.updateOverlayCiphers(); expect(BrowserApi.getTabFromCurrentWindowId).toHaveBeenCalled(); - expect(cipherService.getAllDecryptedForUrl).toHaveBeenCalledWith(url); + expect(cipherService.getAllDecryptedForUrl).toHaveBeenCalledWith(url, mockUserId); expect(overlayBackground["cipherService"].sortCiphersByLastUsedThenName).toHaveBeenCalled(); expect(overlayBackground["overlayLoginCiphers"]).toStrictEqual( new Map([ diff --git a/apps/browser/src/autofill/deprecated/background/overlay.background.deprecated.ts b/apps/browser/src/autofill/deprecated/background/overlay.background.deprecated.ts index 5dfade0f863..d0fad4cd00e 100644 --- a/apps/browser/src/autofill/deprecated/background/overlay.background.deprecated.ts +++ b/apps/browser/src/autofill/deprecated/background/overlay.background.deprecated.ts @@ -1,7 +1,8 @@ // FIXME: Update this file to be type safe and remove this and next line // @ts-strict-ignore -import { firstValueFrom } from "rxjs"; +import { firstValueFrom, map } 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 { SHOW_AUTOFILL_BUTTON } from "@bitwarden/common/autofill/constants"; @@ -106,6 +107,7 @@ class LegacyOverlayBackground implements OverlayBackgroundInterface { private i18nService: I18nService, private platformUtilsService: PlatformUtilsService, private themeStateService: ThemeStateService, + private accountService: AccountService, ) {} /** @@ -152,9 +154,13 @@ class LegacyOverlayBackground implements OverlayBackgroundInterface { } this.overlayLoginCiphers = new Map(); - const ciphersViews = (await this.cipherService.getAllDecryptedForUrl(currentTab.url)).sort( - (a, b) => this.cipherService.sortCiphersByLastUsedThenName(a, b), + + const activeUserId = await firstValueFrom( + this.accountService.activeAccount$.pipe(map((a) => a?.id)), ); + const ciphersViews = ( + await this.cipherService.getAllDecryptedForUrl(currentTab.url, activeUserId) + ).sort((a, b) => this.cipherService.sortCiphersByLastUsedThenName(a, b)); for (let cipherIndex = 0; cipherIndex < ciphersViews.length; cipherIndex++) { this.overlayLoginCiphers.set(`overlay-cipher-${cipherIndex}`, ciphersViews[cipherIndex]); } @@ -660,10 +666,16 @@ class LegacyOverlayBackground implements OverlayBackgroundInterface { cipherView.type = CipherType.Login; cipherView.login = loginView; - await this.cipherService.setAddEditCipherInfo({ - cipher: cipherView, - collectionIds: cipherView.collectionIds, - }); + const activeUserId = await firstValueFrom( + this.accountService.activeAccount$.pipe(map((a) => a?.id)), + ); + await this.cipherService.setAddEditCipherInfo( + { + cipher: cipherView, + collectionIds: cipherView.collectionIds, + }, + activeUserId, + ); await this.openAddEditVaultItemPopout(sender.tab, { cipherId: cipherView.id }); await BrowserApi.sendMessage("inlineAutofillMenuRefreshAddEditCipher"); diff --git a/apps/browser/src/autofill/popup/fido2/fido2.component.ts b/apps/browser/src/autofill/popup/fido2/fido2.component.ts index 4555d87f249..24c14c98685 100644 --- a/apps/browser/src/autofill/popup/fido2/fido2.component.ts +++ b/apps/browser/src/autofill/popup/fido2/fido2.component.ts @@ -20,6 +20,7 @@ import { import { JslibModule } from "@bitwarden/angular/jslib.module"; import { SearchService } from "@bitwarden/common/abstractions/search.service"; import { AccountService } from "@bitwarden/common/auth/abstractions/account.service"; +import { getUserId } from "@bitwarden/common/auth/services/account.service"; import { DomainSettingsService } from "@bitwarden/common/autofill/services/domain-settings.service"; import { LogService } from "@bitwarden/common/platform/abstractions/log.service"; import { PlatformUtilsService } from "@bitwarden/common/platform/abstractions/platform-utils.service"; @@ -186,7 +187,10 @@ export class Fido2Component implements OnInit, OnDestroy { this.domainSettingsService.getUrlEquivalentDomains(this.url), ); - this.ciphers = (await this.cipherService.getAllDecrypted()).filter( + const activeUserId = await firstValueFrom( + this.accountService.activeAccount$.pipe(getUserId), + ); + this.ciphers = (await this.cipherService.getAllDecrypted(activeUserId)).filter( (cipher) => cipher.type === CipherType.Login && !cipher.isDeleted, ); @@ -211,7 +215,7 @@ export class Fido2Component implements OnInit, OnDestroy { this.ciphers = await Promise.all( message.cipherIds.map(async (cipherId) => { - const cipher = await this.cipherService.get(cipherId); + const cipher = await this.cipherService.get(cipherId, activeUserId); return cipher.decrypt( await this.cipherService.getKeyForCipherKeyDecryption(cipher, activeUserId), ); @@ -232,7 +236,7 @@ export class Fido2Component implements OnInit, OnDestroy { this.ciphers = await Promise.all( message.existingCipherIds.map(async (cipherId) => { - const cipher = await this.cipherService.get(cipherId); + const cipher = await this.cipherService.get(cipherId, activeUserId); return cipher.decrypt( await this.cipherService.getKeyForCipherKeyDecryption(cipher, activeUserId), ); diff --git a/apps/browser/src/autofill/services/autofill.service.spec.ts b/apps/browser/src/autofill/services/autofill.service.spec.ts index 378521cfc42..3843734ad64 100644 --- a/apps/browser/src/autofill/services/autofill.service.spec.ts +++ b/apps/browser/src/autofill/services/autofill.service.spec.ts @@ -747,7 +747,7 @@ describe("AutofillService", () => { jest.spyOn(autofillService as any, "generateFillScript"); jest.spyOn(autofillService as any, "generateLoginFillScript"); jest.spyOn(logService, "info"); - jest.spyOn(chrome.runtime, "sendMessage"); + jest.spyOn(cipherService, "updateLastUsedDate"); jest.spyOn(eventCollectionService, "collect"); const autofillResult = await autofillService.doAutoFill(autofillOptions); @@ -769,10 +769,10 @@ describe("AutofillService", () => { ); expect(autofillService["generateLoginFillScript"]).toHaveBeenCalled(); expect(logService.info).not.toHaveBeenCalled(); - expect(chrome.runtime.sendMessage).toHaveBeenCalledWith({ - cipherId: autofillOptions.cipher.id, - command: "updateLastUsedDate", - }); + expect(cipherService.updateLastUsedDate).toHaveBeenCalledWith( + autofillOptions.cipher.id, + mockUserId, + ); expect(chrome.tabs.sendMessage).toHaveBeenCalledWith( autofillOptions.pageDetails[0].tab.id, { @@ -893,11 +893,11 @@ describe("AutofillService", () => { it("skips updating the cipher's last used date if the passed options indicate that we should skip the last used cipher", async () => { autofillOptions.skipLastUsed = true; - jest.spyOn(chrome.runtime, "sendMessage"); + jest.spyOn(cipherService, "updateLastUsedDate"); await autofillService.doAutoFill(autofillOptions); - expect(chrome.runtime.sendMessage).not.toHaveBeenCalled(); + expect(cipherService.updateLastUsedDate).not.toHaveBeenCalled(); }); it("returns early if the fillScript cannot be generated", async () => { @@ -1033,8 +1033,8 @@ describe("AutofillService", () => { const result = await autofillService.doAutoFillOnTab(pageDetails, tab, false); expect(cipherService.getNextCipherForUrl).not.toHaveBeenCalled(); - expect(cipherService.getLastLaunchedForUrl).toHaveBeenCalledWith(tab.url, true); - expect(cipherService.getLastUsedForUrl).toHaveBeenCalledWith(tab.url, true); + expect(cipherService.getLastLaunchedForUrl).toHaveBeenCalledWith(tab.url, mockUserId, true); + expect(cipherService.getLastUsedForUrl).toHaveBeenCalledWith(tab.url, mockUserId, true); expect(autofillService.doAutoFill).not.toHaveBeenCalled(); expect(result).toBeNull(); }); @@ -1047,7 +1047,7 @@ describe("AutofillService", () => { const result = await autofillService.doAutoFillOnTab(pageDetails, tab, true); - expect(cipherService.getNextCipherForUrl).toHaveBeenCalledWith(tab.url); + expect(cipherService.getNextCipherForUrl).toHaveBeenCalledWith(tab.url, mockUserId); expect(cipherService.getLastLaunchedForUrl).not.toHaveBeenCalled(); expect(cipherService.getLastUsedForUrl).not.toHaveBeenCalled(); expect(autofillService.doAutoFill).not.toHaveBeenCalled(); @@ -1077,7 +1077,7 @@ describe("AutofillService", () => { const result = await autofillService.doAutoFillOnTab(pageDetails, tab, fromCommand); - expect(cipherService.getLastLaunchedForUrl).toHaveBeenCalledWith(tab.url, true); + expect(cipherService.getLastLaunchedForUrl).toHaveBeenCalledWith(tab.url, mockUserId, true); expect(cipherService.getLastUsedForUrl).not.toHaveBeenCalled(); expect(cipherService.updateLastUsedIndexForUrl).not.toHaveBeenCalled(); expect(autofillService.doAutoFill).toHaveBeenCalledWith({ @@ -1107,8 +1107,8 @@ describe("AutofillService", () => { const result = await autofillService.doAutoFillOnTab(pageDetails, tab, fromCommand); - expect(cipherService.getLastLaunchedForUrl).toHaveBeenCalledWith(tab.url, true); - expect(cipherService.getLastUsedForUrl).toHaveBeenCalledWith(tab.url, true); + expect(cipherService.getLastLaunchedForUrl).toHaveBeenCalledWith(tab.url, mockUserId, true); + expect(cipherService.getLastUsedForUrl).toHaveBeenCalledWith(tab.url, mockUserId, true); expect(cipherService.updateLastUsedIndexForUrl).not.toHaveBeenCalled(); expect(autofillService.doAutoFill).toHaveBeenCalledWith({ tab: tab, @@ -1135,7 +1135,7 @@ describe("AutofillService", () => { const result = await autofillService.doAutoFillOnTab(pageDetails, tab, fromCommand); - expect(cipherService.getNextCipherForUrl).toHaveBeenCalledWith(tab.url); + expect(cipherService.getNextCipherForUrl).toHaveBeenCalledWith(tab.url, mockUserId); expect(cipherService.updateLastUsedIndexForUrl).toHaveBeenCalledWith(tab.url); expect(autofillService.doAutoFill).toHaveBeenCalledWith({ tab: tab, @@ -1166,7 +1166,7 @@ describe("AutofillService", () => { const result = await autofillService.doAutoFillOnTab(pageDetails, tab, true); - expect(cipherService.getNextCipherForUrl).toHaveBeenCalledWith(tab.url); + expect(cipherService.getNextCipherForUrl).toHaveBeenCalledWith(tab.url, mockUserId); expect(userVerificationService.hasMasterPasswordAndMasterKeyHash).toHaveBeenCalled(); expect(autofillService["openVaultItemPasswordRepromptPopout"]).toHaveBeenCalledWith(tab, { cipherId: cipher.id, @@ -1192,7 +1192,7 @@ describe("AutofillService", () => { const result = await autofillService.doAutoFillOnTab(pageDetails, tab, true); - expect(cipherService.getNextCipherForUrl).toHaveBeenCalledWith(tab.url); + expect(cipherService.getNextCipherForUrl).toHaveBeenCalledWith(tab.url, mockUserId); expect(autofillService["openVaultItemPasswordRepromptPopout"]).not.toHaveBeenCalled(); expect(autofillService.doAutoFill).not.toHaveBeenCalled(); expect(result).toBeNull(); diff --git a/apps/browser/src/autofill/services/autofill.service.ts b/apps/browser/src/autofill/services/autofill.service.ts index c35b19990cb..fc7d0ebcc99 100644 --- a/apps/browser/src/autofill/services/autofill.service.ts +++ b/apps/browser/src/autofill/services/autofill.service.ts @@ -8,6 +8,7 @@ import { AccountInfo, AccountService } from "@bitwarden/common/auth/abstractions import { AuthService } from "@bitwarden/common/auth/abstractions/auth.service"; import { UserVerificationService } from "@bitwarden/common/auth/abstractions/user-verification/user-verification.service.abstraction"; import { AuthenticationStatus } from "@bitwarden/common/auth/enums/authentication-status"; +import { getOptionalUserId } from "@bitwarden/common/auth/services/account.service"; import { AutofillOverlayVisibility, CardExpiryDateDelimiters, @@ -463,13 +464,8 @@ export default class AutofillService implements AutofillServiceInterface { fillScript.properties.delay_between_operations = 20; didAutofill = true; - if (!options.skipLastUsed) { - // In order to prevent a UI update send message to background script to update last used date - await chrome.runtime.sendMessage({ - command: "updateLastUsedDate", - cipherId: options.cipher.id, - }); + await this.cipherService.updateLastUsedDate(options.cipher.id, activeAccount.id); } // FIXME: Verify that this floating promise is intentional. If it is, add an explanatory comment and ensure there is proper error handling. @@ -532,17 +528,29 @@ export default class AutofillService implements AutofillServiceInterface { autoSubmitLogin = false, ): Promise { let cipher: CipherView; + + const activeUserId = await firstValueFrom( + this.accountService.activeAccount$.pipe(getOptionalUserId), + ); + if (activeUserId == null) { + return null; + } + if (fromCommand) { - cipher = await this.cipherService.getNextCipherForUrl(tab.url); + cipher = await this.cipherService.getNextCipherForUrl(tab.url, activeUserId); } else { - const lastLaunchedCipher = await this.cipherService.getLastLaunchedForUrl(tab.url, true); + const lastLaunchedCipher = await this.cipherService.getLastLaunchedForUrl( + tab.url, + activeUserId, + true, + ); if ( lastLaunchedCipher && Date.now().valueOf() - lastLaunchedCipher.localData?.lastLaunched?.valueOf() < 30000 ) { cipher = lastLaunchedCipher; } else { - cipher = await this.cipherService.getLastUsedForUrl(tab.url, true); + cipher = await this.cipherService.getLastUsedForUrl(tab.url, activeUserId, true); } } @@ -631,12 +639,19 @@ export default class AutofillService implements AutofillServiceInterface { let cipher: CipherView; let cacheKey = ""; + const activeUserId = await firstValueFrom( + this.accountService.activeAccount$.pipe(getOptionalUserId), + ); + if (activeUserId == null) { + return null; + } + if (cipherType === CipherType.Card) { cacheKey = "cardCiphers"; - cipher = await this.cipherService.getNextCardCipher(); + cipher = await this.cipherService.getNextCardCipher(activeUserId); } else { cacheKey = "identityCiphers"; - cipher = await this.cipherService.getNextIdentityCipher(); + cipher = await this.cipherService.getNextIdentityCipher(activeUserId); } if (!cipher || !cacheKey || (cipher.reprompt === CipherRepromptType.Password && !fromCommand)) { diff --git a/apps/browser/src/background/main.background.ts b/apps/browser/src/background/main.background.ts index 7729981740d..8faaec4f023 100644 --- a/apps/browser/src/background/main.background.ts +++ b/apps/browser/src/background/main.background.ts @@ -1142,7 +1142,6 @@ export default class MainBackground { this.accountService, lockService, this.billingAccountProfileStateService, - this.cipherService, ); this.nativeMessagingBackground = new NativeMessagingBackground( this.keyService, @@ -1259,6 +1258,7 @@ export default class MainBackground { this.mainContextMenuHandler, this.authService, this.cipherService, + this.accountService, ); if (chrome.webRequest != null && chrome.webRequest.onAuthRequired != null) { @@ -1266,6 +1266,7 @@ export default class MainBackground { this.platformUtilsService, this.cipherService, this.authService, + this.accountService, chrome.webRequest, ); } @@ -1373,17 +1374,41 @@ export default class MainBackground { return; } - await this.mainContextMenuHandler?.init(); + const contextMenuIsEnabled = await this.mainContextMenuHandler?.init(); + if (!contextMenuIsEnabled) { + this.onUpdatedRan = this.onReplacedRan = false; + return; + } const tab = await BrowserApi.getTabFromCurrentWindow(); + if (tab) { - await this.cipherContextMenuHandler?.update(tab.url); + const currentUriIsBlocked = await firstValueFrom( + this.domainSettingsService.blockedInteractionsUris$.pipe( + map((blockedInteractionsUris) => { + if (blockedInteractionsUris && tab?.url?.length) { + const tabURL = new URL(tab.url); + const tabIsBlocked = Object.keys(blockedInteractionsUris).some((blockedHostname) => + tabURL.hostname.endsWith(blockedHostname), + ); + + if (tabIsBlocked) { + return true; + } + } + + return false; + }), + ), + ); + + await this.cipherContextMenuHandler?.update(tab.url, currentUriIsBlocked); this.onUpdatedRan = this.onReplacedRan = false; } } async updateOverlayCiphers() { - // overlayBackground null in popup only contexts + // `overlayBackground` is null in popup only contexts if (this.overlayBackground) { await this.overlayBackground.updateOverlayCiphers(); } @@ -1567,13 +1592,16 @@ export default class MainBackground { } async openPopup() { - // Chrome APIs cannot open popup + const browserAction = BrowserApi.getBrowserAction(); - // TODO: Do we need to open this popup? - if (!this.isSafari) { + if ("openPopup" in browserAction && typeof browserAction.openPopup === "function") { + await browserAction.openPopup(); return; } - await SafariApp.sendMessageToApp("showPopover", null, true); + + if (this.isSafari) { + await SafariApp.sendMessageToApp("showPopover", null, true); + } } async reseedStorage() { @@ -1637,6 +1665,7 @@ export default class MainBackground { this.i18nService, this.platformUtilsService, this.themeStateService, + this.accountService, ); } else { this.overlayBackground = new OverlayBackground( @@ -1654,6 +1683,7 @@ export default class MainBackground { this.inlineMenuFieldQualificationService, this.themeStateService, this.totpService, + this.accountService, () => this.generatePassword(), (password) => this.addPasswordToHistory(password), ); diff --git a/apps/browser/src/background/nativeMessaging.background.ts b/apps/browser/src/background/nativeMessaging.background.ts index 8c369e966c5..8100ff3cffa 100644 --- a/apps/browser/src/background/nativeMessaging.background.ts +++ b/apps/browser/src/background/nativeMessaging.background.ts @@ -1,5 +1,3 @@ -// FIXME: Update this file to be type safe and remove this and next line -// @ts-strict-ignore import { delay, filter, firstValueFrom, from, map, race, timer } from "rxjs"; import { AccountService } from "@bitwarden/common/auth/abstractions/account.service"; @@ -57,26 +55,29 @@ type ReceiveMessageOuter = { messageId?: number; // Should only have one of these. - message?: EncString; + message?: ReceiveMessage | EncString; sharedSecret?: string; }; type Callback = { - resolver: any; - rejecter: any; + resolver: (value?: unknown) => void; + rejecter: (reason?: any) => void; +}; + +type SecureChannel = { + privateKey: Uint8Array; + publicKey: Uint8Array; + sharedSecret?: SymmetricCryptoKey; + setupResolve: (value?: unknown) => void; }; export class NativeMessagingBackground { connected = false; - private connecting: boolean; - private port: browser.runtime.Port | chrome.runtime.Port; + private connecting: boolean = false; + private port?: browser.runtime.Port | chrome.runtime.Port; + private appId?: string; - private privateKey: Uint8Array = null; - private publicKey: Uint8Array = null; - private secureSetupResolve: any = null; - private sharedSecret: SymmetricCryptoKey; - private appId: string; - private validatingFingerprint: boolean; + private secureChannel?: SecureChannel; private messageId = 0; private callbacks = new Map(); @@ -108,11 +109,13 @@ export class NativeMessagingBackground { async connect() { this.logService.info("[Native Messaging IPC] Connecting to Bitwarden Desktop app..."); - this.appId = await this.appIdService.getAppId(); + const appId = await this.appIdService.getAppId(); + this.appId = appId; await this.biometricStateService.setFingerprintValidated(false); return new Promise((resolve, reject) => { - this.port = BrowserApi.connectNative("com.8bit.bitwarden"); + const port = BrowserApi.connectNative("com.8bit.bitwarden"); + this.port = port; this.connecting = true; @@ -131,7 +134,8 @@ export class NativeMessagingBackground { connectedCallback(); } - this.port.onMessage.addListener(async (message: ReceiveMessageOuter) => { + port.onMessage.addListener(async (messageRaw: unknown) => { + const message = messageRaw as ReceiveMessageOuter; switch (message.command) { case "connected": connectedCallback(); @@ -142,7 +146,7 @@ export class NativeMessagingBackground { reject(new Error("startDesktop")); } this.connected = false; - this.port.disconnect(); + port.disconnect(); // reject all for (const callback of this.callbacks.values()) { callback.rejecter("disconnected"); @@ -151,18 +155,31 @@ export class NativeMessagingBackground { break; case "setupEncryption": { // Ignore since it belongs to another device - if (message.appId !== this.appId) { + if (message.appId !== appId) { + return; + } + + if (message.sharedSecret == null) { + this.logService.info( + "[Native Messaging IPC] Unable to create secureChannel channel, no shared secret", + ); + return; + } + if (this.secureChannel == null) { + this.logService.info( + "[Native Messaging IPC] Unable to create secureChannel channel, no secureChannel communication setup", + ); return; } const encrypted = Utils.fromB64ToArray(message.sharedSecret); const decrypted = await this.cryptoFunctionService.rsaDecrypt( encrypted, - this.privateKey, + this.secureChannel.privateKey, HashAlgorithmForEncryption, ); - this.sharedSecret = new SymmetricCryptoKey(decrypted); + this.secureChannel.sharedSecret = new SymmetricCryptoKey(decrypted); this.logService.info("[Native Messaging IPC] Secure channel established"); if ("messageId" in message) { @@ -173,26 +190,27 @@ export class NativeMessagingBackground { this.isConnectedToOutdatedDesktopClient = true; } - this.secureSetupResolve(); + this.secureChannel.setupResolve(); break; } case "invalidateEncryption": // Ignore since it belongs to another device - if (message.appId !== this.appId) { + if (message.appId !== appId) { return; } this.logService.warning( "[Native Messaging IPC] Secure channel encountered an error; disconnecting and wiping keys...", ); - this.sharedSecret = null; - this.privateKey = null; + this.secureChannel = undefined; this.connected = false; - if (this.callbacks.has(message.messageId)) { - this.callbacks.get(message.messageId).rejecter({ - message: "invalidateEncryption", - }); + if (message.messageId != null) { + if (this.callbacks.has(message.messageId)) { + this.callbacks.get(message.messageId)?.rejecter({ + message: "invalidateEncryption", + }); + } } return; case "verifyFingerprint": { @@ -217,21 +235,25 @@ export class NativeMessagingBackground { break; } case "wrongUserId": - if (this.callbacks.has(message.messageId)) { - this.callbacks.get(message.messageId).rejecter({ - message: "wrongUserId", - }); + if (message.messageId != null) { + if (this.callbacks.has(message.messageId)) { + this.callbacks.get(message.messageId)?.rejecter({ + message: "wrongUserId", + }); + } } return; default: // Ignore since it belongs to another device - if (!this.platformUtilsService.isSafari() && message.appId !== this.appId) { + if (!this.platformUtilsService.isSafari() && message.appId !== appId) { 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.onMessage(message.message); + if (message.message != null) { + // 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.onMessage(message.message); + } } }); @@ -240,16 +262,15 @@ export class NativeMessagingBackground { if (BrowserApi.isWebExtensionsApi) { error = p.error.message; } else { - error = chrome.runtime.lastError.message; + error = chrome.runtime.lastError?.message; } - this.sharedSecret = null; - this.privateKey = null; + this.secureChannel = undefined; this.connected = false; this.logService.error("NativeMessaging port disconnected because of error: " + error); - const reason = error != null ? "desktopIntegrationDisabled" : null; + const reason = error != null ? "desktopIntegrationDisabled" : undefined; reject(new Error(reason)); }); }); @@ -293,13 +314,13 @@ export class NativeMessagingBackground { ); const callback = this.callbacks.get(messageId); this.callbacks.delete(messageId); - callback.rejecter("errorConnecting"); + callback?.rejecter("errorConnecting"); } setTimeout(() => { if (this.callbacks.has(messageId)) { this.logService.info("[Native Messaging IPC] Message timed out and received no response"); - this.callbacks.get(messageId).rejecter({ + this.callbacks.get(messageId)!.rejecter({ message: "timeout", }); this.callbacks.delete(messageId); @@ -320,16 +341,19 @@ export class NativeMessagingBackground { if (this.platformUtilsService.isSafari()) { this.postMessage(message as any); } else { - this.postMessage({ appId: this.appId, message: await this.encryptMessage(message) }); + this.postMessage({ appId: this.appId!, message: await this.encryptMessage(message) }); } } async encryptMessage(message: Message) { - if (this.sharedSecret == null) { + if (this.secureChannel?.sharedSecret == null) { await this.secureCommunication(); } - return await this.encryptService.encrypt(JSON.stringify(message), this.sharedSecret); + return await this.encryptService.encrypt( + JSON.stringify(message), + this.secureChannel!.sharedSecret!, + ); } private postMessage(message: OuterMessage, messageId?: number) { @@ -346,7 +370,7 @@ export class NativeMessagingBackground { mac: message.message.mac, }; } - this.port.postMessage(msg); + this.port!.postMessage(msg); // FIXME: Remove when updating file. Eslint update // eslint-disable-next-line @typescript-eslint/no-unused-vars } catch (e) { @@ -354,26 +378,30 @@ export class NativeMessagingBackground { "[Native Messaging IPC] Disconnected from Bitwarden Desktop app because of the native port disconnecting.", ); - this.sharedSecret = null; - this.privateKey = null; + this.secureChannel = undefined; this.connected = false; - if (this.callbacks.has(messageId)) { - this.callbacks.get(messageId).rejecter("invalidateEncryption"); + if (messageId != null && this.callbacks.has(messageId)) { + this.callbacks.get(messageId)!.rejecter("invalidateEncryption"); } } } private async onMessage(rawMessage: ReceiveMessage | EncString) { - let message = rawMessage as ReceiveMessage; + let message: ReceiveMessage; if (!this.platformUtilsService.isSafari()) { + if (this.secureChannel?.sharedSecret == null) { + return; + } message = JSON.parse( await this.encryptService.decryptToUtf8( rawMessage as EncString, - this.sharedSecret, + this.secureChannel.sharedSecret, "ipc-desktop-ipc-channel-key", ), ); + } else { + message = rawMessage as ReceiveMessage; } if (Math.abs(message.timestamp - Date.now()) > MessageValidTimeout) { @@ -390,15 +418,17 @@ export class NativeMessagingBackground { this.logService.info( `[Native Messaging IPC] Received legacy message of type ${message.command}`, ); - const messageId = this.callbacks.keys().next().value; - const resolver = this.callbacks.get(messageId); - this.callbacks.delete(messageId); - resolver.resolver(message); + const messageId: number | undefined = this.callbacks.keys().next().value; + if (messageId != null) { + const resolver = this.callbacks.get(messageId); + this.callbacks.delete(messageId); + resolver!.resolver(message); + } return; } if (this.callbacks.has(messageId)) { - this.callbacks.get(messageId).resolver(message); + this.callbacks.get(messageId)!.resolver(message); } else { this.logService.info("[Native Messaging IPC] Received message without a callback", message); } @@ -406,8 +436,6 @@ export class NativeMessagingBackground { private async secureCommunication() { const [publicKey, privateKey] = await this.cryptoFunctionService.rsaGenerateKeyPair(2048); - this.publicKey = publicKey; - this.privateKey = privateKey; const userId = (await firstValueFrom(this.accountService.activeAccount$))?.id; // FIXME: Verify that this floating promise is intentional. If it is, add an explanatory comment and ensure there is proper error handling. @@ -419,7 +447,13 @@ export class NativeMessagingBackground { messageId: this.messageId++, }); - return new Promise((resolve, reject) => (this.secureSetupResolve = resolve)); + return new Promise((resolve) => { + this.secureChannel = { + publicKey, + privateKey, + setupResolve: resolve, + }; + }); } private async sendUnencrypted(message: Message) { @@ -429,11 +463,17 @@ export class NativeMessagingBackground { message.timestamp = Date.now(); - this.postMessage({ appId: this.appId, message: message }); + this.postMessage({ appId: this.appId!, message: message }); } private async showFingerprintDialog() { - const fingerprint = await this.keyService.getFingerprint(this.appId, this.publicKey); + if (this.secureChannel?.publicKey == null) { + return; + } + const fingerprint = await this.keyService.getFingerprint( + this.appId!, + this.secureChannel.publicKey, + ); this.messagingService.send("showNativeMessagingFingerprintDialog", { fingerprint: fingerprint, diff --git a/apps/browser/src/background/runtime.background.ts b/apps/browser/src/background/runtime.background.ts index b9622e82005..a5fea0651fc 100644 --- a/apps/browser/src/background/runtime.background.ts +++ b/apps/browser/src/background/runtime.background.ts @@ -16,7 +16,6 @@ import { MessageListener, isExternalMessage } from "@bitwarden/common/platform/m import { devFlagEnabled } from "@bitwarden/common/platform/misc/flags"; import { Utils } from "@bitwarden/common/platform/misc/utils"; import { NotificationsService } from "@bitwarden/common/platform/notifications"; -import { CipherService } from "@bitwarden/common/vault/abstractions/cipher.service"; import { CipherType } from "@bitwarden/common/vault/enums"; import { BiometricsCommands } from "@bitwarden/key-management"; @@ -54,7 +53,6 @@ export default class RuntimeBackground { private accountService: AccountService, private readonly lockService: LockService, private billingAccountProfileStateService: BillingAccountProfileStateService, - private cipherService: CipherService, ) { // onInstalled listener must be wired up before anything else, so we do it in the ctor chrome.runtime.onInstalled.addListener((details: any) => { @@ -202,9 +200,6 @@ export default class RuntimeBackground { case BiometricsCommands.GetBiometricsStatusForUser: { return await this.main.biometricsService.getBiometricsStatusForUser(msg.userId); } - case "updateLastUsedDate": { - return await this.cipherService.updateLastUsedDate(msg.cipherId); - } case "getUseTreeWalkerApiForPageDetailsCollectionFeatureFlag": { return await this.configService.getFeatureFlag( FeatureFlag.UseTreeWalkerApiForPageDetailsCollection, @@ -294,7 +289,7 @@ export default class RuntimeBackground { } break; case "openPopup": - await this.main.openPopup(); + await this.openPopup(); break; case "bgUpdateContextMenu": case "editedCipher": @@ -410,13 +405,40 @@ export default class RuntimeBackground { }, 100); } + /** Returns the browser tabs that have the web vault open */ + private async getBwTabs() { + const env = await firstValueFrom(this.environmentService.environment$); + const vaultUrl = env.getWebVaultUrl(); + const urlObj = new URL(vaultUrl); + + return await BrowserApi.tabsQuery({ url: `${urlObj.href}*` }); + } + + private async openPopup() { + await this.main.openPopup(); + + const announcePopupOpen = async () => { + const isOpen = await this.platformUtilsService.isViewOpen(); + const tabs = await this.getBwTabs(); + + if (isOpen && tabs.length > 0) { + // Send message to all vault tabs that the extension has opened + for (const tab of tabs) { + await BrowserApi.executeScriptInTab(tab.id, { + file: "content/send-popup-open-message.js", + runAt: "document_end", + }); + } + } + }; + + // Give the popup a buffer to open + setTimeout(announcePopupOpen, 100); + } + async sendBwInstalledMessageToVault() { try { - const env = await firstValueFrom(this.environmentService.environment$); - const vaultUrl = env.getWebVaultUrl(); - const urlObj = new URL(vaultUrl); - - const tabs = await BrowserApi.tabsQuery({ url: `${urlObj.href}*` }); + const tabs = await this.getBwTabs(); if (!tabs?.length) { return; diff --git a/apps/browser/src/manifest.json b/apps/browser/src/manifest.json index 6a2e017d06c..e5d5db20758 100644 --- a/apps/browser/src/manifest.json +++ b/apps/browser/src/manifest.json @@ -2,7 +2,7 @@ "manifest_version": 2, "name": "__MSG_extName__", "short_name": "__MSG_appName__", - "version": "2025.1.3", + "version": "2025.2.1", "description": "__MSG_extDesc__", "default_locale": "en", "author": "Bitwarden Inc.", diff --git a/apps/browser/src/manifest.v3.json b/apps/browser/src/manifest.v3.json index dee6ebef31c..a093aa42d9d 100644 --- a/apps/browser/src/manifest.v3.json +++ b/apps/browser/src/manifest.v3.json @@ -3,7 +3,7 @@ "minimum_chrome_version": "102.0", "name": "__MSG_extName__", "short_name": "__MSG_appName__", - "version": "2025.1.3", + "version": "2025.2.1", "description": "__MSG_extDesc__", "default_locale": "en", "author": "Bitwarden Inc.", @@ -26,7 +26,7 @@ { "all_frames": true, "css": ["content/autofill.css"], - "js": ["content/trigger-autofill-script-injection.js", "content/misc-utils.js"], + "js": ["content/trigger-autofill-script-injection.js"], "matches": ["*://*/*", "file:///*"], "exclude_matches": ["*://*/*.xml*", "file:///*.xml*"], "run_at": "document_start" @@ -63,6 +63,22 @@ "webRequestAuthProvider", "notifications" ], + "__firefox__permissions": [ + "activeTab", + "alarms", + "clipboardRead", + "clipboardWrite", + "contextMenus", + "idle", + "scripting", + "storage", + "tabs", + "unlimitedStorage", + "webNavigation", + "webRequest", + "webRequestAuthProvider", + "notifications" + ], "__safari__permissions": [ "activeTab", "alarms", @@ -86,7 +102,7 @@ "host_permissions": ["https://*/*", "http://*/*"], "content_security_policy": { "extension_pages": "script-src 'self' 'wasm-unsafe-eval'; object-src 'self'", - "sandbox": "sandbox allow-scripts; script-src 'self'" + "__chrome__sandbox": "sandbox allow-scripts; script-src 'self'" }, "sandbox": { "pages": [ @@ -112,6 +128,13 @@ }, "description": "__MSG_commandOpenSidebar__" }, + "__opera___execute_sidebar_action": { + "suggested_key": { + "default": "Alt+Shift+Y", + "linux": "Alt+Shift+U" + }, + "description": "__MSG_commandOpenSidebar__" + }, "autofill_login": { "suggested_key": { "default": "Ctrl+Shift+L" @@ -166,5 +189,12 @@ "storage": { "managed_schema": "managed_schema.json" }, - "__firefox__storage": null + "__firefox__storage": null, + "__opera__sidebar_action": { + "default_title": "Bitwarden", + "default_panel": "popup/index.html?uilocation=sidebar", + "default_icon": "images/icon19.png", + "open_at_install": false, + "browser_style": false + } } diff --git a/apps/browser/src/platform/browser/browser-api.ts b/apps/browser/src/platform/browser/browser-api.ts index 1d8ff65c17d..293fca4d029 100644 --- a/apps/browser/src/platform/browser/browser-api.ts +++ b/apps/browser/src/platform/browser/browser-api.ts @@ -530,10 +530,15 @@ export class BrowserApi { win: Window & typeof globalThis, ): OperaSidebarAction | FirefoxSidebarAction | null { const deviceType = BrowserPlatformUtilsService.getDevice(win); - if (deviceType !== DeviceType.FirefoxExtension && deviceType !== DeviceType.OperaExtension) { - return null; + if (deviceType === DeviceType.FirefoxExtension) { + return browser.sidebarAction; } - return win.opr?.sidebarAction || browser.sidebarAction; + + if (deviceType === DeviceType.OperaExtension) { + return win.opr?.sidebarAction; + } + + return null; } static captureVisibleTab(): Promise { diff --git a/apps/browser/src/platform/listeners/update-badge.ts b/apps/browser/src/platform/listeners/update-badge.ts index f67b96c847f..cd74b9ebf7d 100644 --- a/apps/browser/src/platform/listeners/update-badge.ts +++ b/apps/browser/src/platform/listeners/update-badge.ts @@ -2,8 +2,10 @@ // @ts-strict-ignore import { firstValueFrom } 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 { getOptionalUserId } from "@bitwarden/common/auth/services/account.service"; import { BadgeSettingsServiceAbstraction } from "@bitwarden/common/autofill/services/badge-settings.service"; import { Utils } from "@bitwarden/common/platform/misc/utils"; import { CipherService } from "@bitwarden/common/vault/abstractions/cipher.service"; @@ -22,6 +24,7 @@ export class UpdateBadge { private authService: AuthService; private badgeSettingsService: BadgeSettingsServiceAbstraction; private cipherService: CipherService; + private accountService: AccountService; private badgeAction: typeof chrome.action | typeof chrome.browserAction; private sidebarAction: OperaSidebarAction | FirefoxSidebarAction; private win: Window & typeof globalThis; @@ -34,6 +37,7 @@ export class UpdateBadge { this.badgeSettingsService = services.badgeSettingsService; this.authService = services.authService; this.cipherService = services.cipherService; + this.accountService = services.accountService; } async run(opts?: { tabId?: number; windowId?: number }): Promise { @@ -87,7 +91,14 @@ export class UpdateBadge { return; } - const ciphers = await this.cipherService.getAllDecryptedForUrl(opts?.tab?.url); + const activeUserId = await firstValueFrom( + this.accountService.activeAccount$.pipe(getOptionalUserId), + ); + if (!activeUserId) { + return; + } + + const ciphers = await this.cipherService.getAllDecryptedForUrl(opts?.tab?.url, activeUserId); let countText = ciphers.length == 0 ? "" : ciphers.length.toString(); if (ciphers.length > 9) { countText = "9+"; @@ -165,6 +176,13 @@ export class UpdateBadge { return; } + if ("opr" in this.win && BrowserApi.isManifestVersion(3)) { + // setIcon API is currenly broken for Opera MV3 extensions + // https://forums.opera.com/topic/75680/opr-sidebaraction-seticon-api-is-broken-access-to-extension-api-denied?_=1738349261570 + // The API currently crashes on MacOS + return; + } + if (this.isOperaSidebar(this.sidebarAction)) { await new Promise((resolve) => (this.sidebarAction as OperaSidebarAction).setIcon(options, () => resolve()), diff --git a/apps/browser/src/platform/popup/layout/popup-back.directive.ts b/apps/browser/src/platform/popup/layout/popup-back.directive.ts new file mode 100644 index 00000000000..95f82588640 --- /dev/null +++ b/apps/browser/src/platform/popup/layout/popup-back.directive.ts @@ -0,0 +1,26 @@ +import { Directive, Optional } from "@angular/core"; + +import { LogService } from "@bitwarden/common/platform/abstractions/log.service"; +import { ValidationService } from "@bitwarden/common/platform/abstractions/validation.service"; +import { BitActionDirective, ButtonLikeAbstraction } from "@bitwarden/components"; + +import { PopupRouterCacheService } from "../view-cache/popup-router-cache.service"; + +/** Navigate the browser popup to the previous page when the component is clicked. */ +@Directive({ + selector: "[popupBackAction]", + standalone: true, +}) +export class PopupBackBrowserDirective extends BitActionDirective { + constructor( + buttonComponent: ButtonLikeAbstraction, + private router: PopupRouterCacheService, + @Optional() validationService?: ValidationService, + @Optional() logService?: LogService, + ) { + super(buttonComponent, validationService, logService); + + // override `bitAction` input; the parent handles the rest + this.handler = () => this.router.back(); + } +} diff --git a/apps/browser/src/platform/popup/layout/popup-layout.mdx b/apps/browser/src/platform/popup/layout/popup-layout.mdx index 5723bef44b1..6a28f7f4f73 100644 --- a/apps/browser/src/platform/popup/layout/popup-layout.mdx +++ b/apps/browser/src/platform/popup/layout/popup-layout.mdx @@ -4,9 +4,6 @@ import * as stories from "./popup-layout.stories"; -Please note that because these stories use `router-outlet`, there are issues with rendering content -when Light & Dark mode is selected. The stories are best viewed by selecting one color mode. - # Popup Tab Navigation The popup tab navigation component composes together the popup page and the bottom tab navigation @@ -100,9 +97,7 @@ Usage example: ### Transparent header - - - + Common interactive elements to insert into the `end` slot are: @@ -113,9 +108,7 @@ Common interactive elements to insert into the `end` slot are: ### Notice - - - + Common interactive elements to insert into the `full-width-notice` slot are: @@ -160,29 +153,21 @@ View the story source code to see examples of how to construct these types of pa Example of wrapping an extension page in the `popup-tab-navigation` component. - - - + ## Extension Page Examples of using just the `popup-page` component, without and with a footer. - - - + - - - + ## Popped out When the browser extension is popped out, the "popout" button should not be passed to the header. - - - + # Other stories @@ -190,14 +175,10 @@ When the browser extension is popped out, the "popout" button should not be pass An example of how to center the default content. - - - + ## Loading An example of what the loading state looks like. - - - + diff --git a/apps/browser/src/popup/app-routing.module.ts b/apps/browser/src/popup/app-routing.module.ts index 70a78ce548f..18b26913b1d 100644 --- a/apps/browser/src/popup/app-routing.module.ts +++ b/apps/browser/src/popup/app-routing.module.ts @@ -10,9 +10,9 @@ import { import { unauthUiRefreshRedirect } from "@bitwarden/angular/auth/functions/unauth-ui-refresh-redirect"; import { unauthUiRefreshSwap } from "@bitwarden/angular/auth/functions/unauth-ui-refresh-route-swap"; import { + activeAuthGuard, authGuard, lockGuard, - activeAuthGuard, redirectGuard, tdeDecryptionRequiredGuard, unauthGuardFn, @@ -23,10 +23,14 @@ import { NewDeviceVerificationNoticeGuard } from "@bitwarden/angular/vault/guard import { AnonLayoutWrapperComponent, AnonLayoutWrapperData, - LoginComponent, - LoginSecondaryContentComponent, + DevicesIcon, + DeviceVerificationIcon, LockIcon, + LoginComponent, + LoginDecryptionOptionsComponent, + LoginSecondaryContentComponent, LoginViaAuthRequestComponent, + NewDeviceVerificationComponent, PasswordHintComponent, RegistrationFinishComponent, RegistrationLockAltIcon, @@ -35,14 +39,10 @@ import { RegistrationStartSecondaryComponentData, RegistrationUserAddIcon, SetPasswordJitComponent, - UserLockIcon, - VaultIcon, - LoginDecryptionOptionsComponent, - DevicesIcon, SsoComponent, TwoFactorTimeoutIcon, - NewDeviceVerificationComponent, - DeviceVerificationIcon, + UserLockIcon, + VaultIcon, } from "@bitwarden/auth/angular"; import { FeatureFlag } from "@bitwarden/common/enums/feature-flag.enum"; import { LockComponent } from "@bitwarden/key-management-ui"; @@ -64,7 +64,6 @@ import { HomeComponent } from "../auth/popup/home.component"; import { LoginDecryptionOptionsComponentV1 } from "../auth/popup/login-decryption-options/login-decryption-options-v1.component"; import { LoginComponentV1 } from "../auth/popup/login-v1.component"; import { LoginViaAuthRequestComponentV1 } from "../auth/popup/login-via-auth-request-v1.component"; -import { RegisterComponent } from "../auth/popup/register.component"; import { RemovePasswordComponent } from "../auth/popup/remove-password.component"; import { SetPasswordComponent } from "../auth/popup/set-password.component"; import { AccountSecurityComponent } from "../auth/popup/settings/account-security.component"; @@ -91,7 +90,9 @@ import { MoreFromBitwardenPageV2Component } from "../tools/popup/settings/about- import { ExportBrowserV2Component } from "../tools/popup/settings/export/export-browser-v2.component"; import { ImportBrowserV2Component } from "../tools/popup/settings/import/import-browser-v2.component"; import { SettingsV2Component } from "../tools/popup/settings/settings-v2.component"; +import { canAccessAtRiskPasswords } from "../vault/guards/at-risk-passwords.guard"; import { clearVaultStateGuard } from "../vault/guards/clear-vault-state.guard"; +import { AtRiskPasswordsComponent } from "../vault/popup/components/at-risk-passwords/at-risk-passwords.component"; import { AddEditV2Component } from "../vault/popup/components/vault-v2/add-edit/add-edit-v2.component"; import { AssignCollections } from "../vault/popup/components/vault-v2/assign-collections/assign-collections.component"; import { AttachmentsV2Component } from "../vault/popup/components/vault-v2/attachments/attachments-v2.component"; @@ -267,12 +268,6 @@ const routes: Routes = [ canActivate: [authGuard], data: { elevation: 1 } satisfies RouteDataProperties, }, - { - path: "register", - component: RegisterComponent, - canActivate: [unauthGuardFn(unauthRouteOverrides)], - data: { elevation: 1 } satisfies RouteDataProperties, - }, { path: "environment", component: EnvironmentComponent, @@ -292,7 +287,7 @@ const routes: Routes = [ path: "cipher-password-history", component: PasswordHistoryV2Component, canActivate: [authGuard], - data: { elevation: 1 } satisfies RouteDataProperties, + data: { elevation: 4 } satisfies RouteDataProperties, }, { path: "add-cipher", @@ -315,7 +310,7 @@ const routes: Routes = [ path: "attachments", component: AttachmentsV2Component, canActivate: [authGuard], - data: { elevation: 1 } satisfies RouteDataProperties, + data: { elevation: 4 } satisfies RouteDataProperties, }, { path: "generator", @@ -387,7 +382,7 @@ const routes: Routes = [ path: "premium", component: PremiumV2Component, canActivate: [authGuard], - data: { elevation: 1 } satisfies RouteDataProperties, + data: { elevation: 3 } satisfies RouteDataProperties, }, { path: "appearance", @@ -759,6 +754,11 @@ const routes: Routes = [ }, ], }, + { + path: "at-risk-passwords", + component: AtRiskPasswordsComponent, + canActivate: [authGuard, canAccessAtRiskPasswords], + }, { path: "account-switcher", component: AccountSwitcherComponent, diff --git a/apps/browser/src/popup/app.component.ts b/apps/browser/src/popup/app.component.ts index 8147524d2f3..66be31969dd 100644 --- a/apps/browser/src/popup/app.component.ts +++ b/apps/browser/src/popup/app.component.ts @@ -35,9 +35,12 @@ import { DesktopSyncVerificationDialogComponent } from "./components/desktop-syn selector: "app-root", styles: [], animations: [routerTransition], - template: `
- -
`, + template: ` +
+ +
+ + `, }) export class AppComponent implements OnInit, OnDestroy { private viewCacheService = inject(PopupViewCacheService); @@ -179,7 +182,7 @@ export class AppComponent implements OnInit, OnDestroy { await this.clearComponentStates(); } if (url.startsWith("/tabs/")) { - await this.cipherService.setAddEditCipherInfo(null); + await this.cipherService.setAddEditCipherInfo(null, this.activeUserId); } (window as any).previousPopupUrl = url; diff --git a/apps/browser/src/popup/app.module.ts b/apps/browser/src/popup/app.module.ts index 15a898aef53..3046ec7916a 100644 --- a/apps/browser/src/popup/app.module.ts +++ b/apps/browser/src/popup/app.module.ts @@ -26,7 +26,6 @@ import { HomeComponent } from "../auth/popup/home.component"; import { LoginDecryptionOptionsComponentV1 } from "../auth/popup/login-decryption-options/login-decryption-options-v1.component"; import { LoginComponentV1 } from "../auth/popup/login-v1.component"; import { LoginViaAuthRequestComponentV1 } from "../auth/popup/login-via-auth-request-v1.component"; -import { RegisterComponent } from "../auth/popup/register.component"; import { RemovePasswordComponent } from "../auth/popup/remove-password.component"; import { SetPasswordComponent } from "../auth/popup/set-password.component"; import { AccountSecurityComponent } from "../auth/popup/settings/account-security.component"; @@ -103,7 +102,6 @@ import "../platform/popup/locales"; LoginViaAuthRequestComponentV1, LoginComponentV1, LoginDecryptionOptionsComponentV1, - RegisterComponent, SetPasswordComponent, SsoComponentV1, TabsV2Component, diff --git a/apps/browser/src/popup/main.ts b/apps/browser/src/popup/main.ts index dadd7917b99..bb975f48e5d 100644 --- a/apps/browser/src/popup/main.ts +++ b/apps/browser/src/popup/main.ts @@ -23,9 +23,7 @@ if (process.env.ENV === "production") { } function init() { - // 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 - platformBrowserDynamic().bootstrapModule(AppModule, { preserveWhitespaces: true }); + void platformBrowserDynamic().bootstrapModule(AppModule); } init(); diff --git a/apps/browser/src/popup/services/services.module.ts b/apps/browser/src/popup/services/services.module.ts index 257497fb13d..210a05d9947 100644 --- a/apps/browser/src/popup/services/services.module.ts +++ b/apps/browser/src/popup/services/services.module.ts @@ -2,7 +2,7 @@ // @ts-strict-ignore import { APP_INITIALIZER, NgModule, NgZone } from "@angular/core"; import { Router } from "@angular/router"; -import { Subject, merge, of } from "rxjs"; +import { merge, of, Subject } from "rxjs"; import { CollectionService } from "@bitwarden/admin-console/common"; import { ViewCacheService } from "@bitwarden/angular/platform/abstractions/view-cache.service"; @@ -11,21 +11,21 @@ import { SafeProvider, safeProvider } from "@bitwarden/angular/platform/utils/sa import { CLIENT_TYPE, DEFAULT_VAULT_TIMEOUT, + ENV_ADDITIONAL_REGIONS, INTRAPROCESS_MESSAGING_SUBJECT, MEMORY_STORAGE, OBSERVABLE_DISK_STORAGE, OBSERVABLE_MEMORY_STORAGE, + SafeInjectionToken, SECURE_STORAGE, SYSTEM_THEME_OBSERVABLE, - SafeInjectionToken, - ENV_ADDITIONAL_REGIONS, } from "@bitwarden/angular/services/injection-tokens"; import { JslibServicesModule } from "@bitwarden/angular/services/jslib-services.module"; import { AnonLayoutWrapperDataService, LoginComponentService, - SsoComponentService, LoginDecryptionOptionsService, + SsoComponentService, } from "@bitwarden/auth/angular"; import { LockService, LoginEmailService, PinServiceAbstraction } from "@bitwarden/auth/common"; import { ApiService } from "@bitwarden/common/abstractions/api.service"; @@ -111,10 +111,10 @@ import { TotpService } from "@bitwarden/common/vault/services/totp.service"; import { CompactModeService, DialogService, ToastService } from "@bitwarden/components"; import { PasswordGenerationServiceAbstraction } from "@bitwarden/generator-legacy"; import { - KdfConfigService, - KeyService, BiometricsService, DefaultKeyService, + KdfConfigService, + KeyService, } from "@bitwarden/key-management"; import { LockComponentService } from "@bitwarden/key-management-ui"; import { PasswordRepromptService } from "@bitwarden/vault"; diff --git a/apps/browser/src/tools/popup/send-v2/add-edit/send-add-edit.component.html b/apps/browser/src/tools/popup/send-v2/add-edit/send-add-edit.component.html index 40c942539f6..5d313188d8f 100644 --- a/apps/browser/src/tools/popup/send-v2/add-edit/send-add-edit.component.html +++ b/apps/browser/src/tools/popup/send-v2/add-edit/send-add-edit.component.html @@ -16,6 +16,9 @@ + + diff --git a/apps/browser/src/tools/popup/settings/export/export-browser-v2.component.ts b/apps/browser/src/tools/popup/settings/export/export-browser-v2.component.ts index 86131176a6e..27147b75d39 100644 --- a/apps/browser/src/tools/popup/settings/export/export-browser-v2.component.ts +++ b/apps/browser/src/tools/popup/settings/export/export-browser-v2.component.ts @@ -7,6 +7,7 @@ import { AsyncActionsModule, ButtonModule, DialogModule } from "@bitwarden/compo import { ExportComponent } from "@bitwarden/vault-export-ui"; import { PopOutComponent } from "../../../../platform/popup/components/pop-out.component"; +import { PopupBackBrowserDirective } from "../../../../platform/popup/layout/popup-back.directive"; import { PopupFooterComponent } from "../../../../platform/popup/layout/popup-footer.component"; import { PopupHeaderComponent } from "../../../../platform/popup/layout/popup-header.component"; import { PopupPageComponent } from "../../../../platform/popup/layout/popup-page.component"; @@ -25,6 +26,7 @@ import { PopupPageComponent } from "../../../../platform/popup/layout/popup-page PopupFooterComponent, PopupHeaderComponent, PopOutComponent, + PopupBackBrowserDirective, ], }) export class ExportBrowserV2Component { @@ -34,6 +36,6 @@ export class ExportBrowserV2Component { constructor(private router: Router) {} protected async onSuccessfulExport(organizationId: string): Promise { - await this.router.navigate(["/vault-settings"]); + await this.router.navigate(["/tabs/settings"]); } } diff --git a/apps/browser/src/vault/content/send-on-installed-message.ts b/apps/browser/src/vault/content/send-on-installed-message.ts index 9df15eb0d51..8da9e250249 100644 --- a/apps/browser/src/vault/content/send-on-installed-message.ts +++ b/apps/browser/src/vault/content/send-on-installed-message.ts @@ -1,5 +1,5 @@ -import { VaultOnboardingMessages } from "@bitwarden/common/vault/enums/vault-onboarding.enum"; +import { VaultMessages } from "@bitwarden/common/vault/enums/vault-messages.enum"; (function (globalContext) { - globalContext.postMessage({ command: VaultOnboardingMessages.HasBwInstalled }); + globalContext.postMessage({ command: VaultMessages.HasBwInstalled }); })(window); diff --git a/apps/browser/src/vault/content/send-popup-open-message.ts b/apps/browser/src/vault/content/send-popup-open-message.ts new file mode 100644 index 00000000000..6889d24f7f6 --- /dev/null +++ b/apps/browser/src/vault/content/send-popup-open-message.ts @@ -0,0 +1,6 @@ +import { VaultMessages } from "@bitwarden/common/vault/enums/vault-messages.enum"; + +(function (globalContext) { + // Send a message to the window that the popup opened + globalContext.postMessage({ command: VaultMessages.PopupOpened }); +})(window); diff --git a/apps/browser/src/vault/guards/at-risk-passwords.guard.ts b/apps/browser/src/vault/guards/at-risk-passwords.guard.ts new file mode 100644 index 00000000000..ee991c81239 --- /dev/null +++ b/apps/browser/src/vault/guards/at-risk-passwords.guard.ts @@ -0,0 +1,29 @@ +import { inject } from "@angular/core"; +import { CanActivateFn } from "@angular/router"; +import { switchMap, tap } from "rxjs"; + +import { AccountService } from "@bitwarden/common/auth/abstractions/account.service"; +import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; +import { ToastService } from "@bitwarden/components"; +import { filterOutNullish, TaskService } from "@bitwarden/vault"; + +export const canAccessAtRiskPasswords: CanActivateFn = () => { + const accountService = inject(AccountService); + const taskService = inject(TaskService); + const toastService = inject(ToastService); + const i18nService = inject(I18nService); + + return accountService.activeAccount$.pipe( + filterOutNullish(), + switchMap((user) => taskService.tasksEnabled$(user.id)), + tap((tasksEnabled) => { + if (!tasksEnabled) { + toastService.showToast({ + variant: "error", + title: "", + message: i18nService.t("accessDenied"), + }); + } + }), + ); +}; diff --git a/apps/browser/src/vault/popup/components/at-risk-callout/at-risk-password-callout.component.html b/apps/browser/src/vault/popup/components/at-risk-callout/at-risk-password-callout.component.html new file mode 100644 index 00000000000..16d9b6a322a --- /dev/null +++ b/apps/browser/src/vault/popup/components/at-risk-callout/at-risk-password-callout.component.html @@ -0,0 +1,9 @@ + + + + {{ + (taskCount === 1 ? "reviewAndChangeAtRiskPassword" : "reviewAndChangeAtRiskPasswordsPlural") + | i18n: taskCount.toString() + }} + + diff --git a/apps/browser/src/vault/popup/components/at-risk-callout/at-risk-password-callout.component.ts b/apps/browser/src/vault/popup/components/at-risk-callout/at-risk-password-callout.component.ts new file mode 100644 index 00000000000..5e46f3cd3d9 --- /dev/null +++ b/apps/browser/src/vault/popup/components/at-risk-callout/at-risk-password-callout.component.ts @@ -0,0 +1,32 @@ +import { CommonModule } from "@angular/common"; +import { Component, inject } from "@angular/core"; +import { RouterModule } from "@angular/router"; +import { map, switchMap } from "rxjs"; + +import { AccountService } from "@bitwarden/common/auth/abstractions/account.service"; +import { AnchorLinkDirective, CalloutModule } from "@bitwarden/components"; +import { I18nPipe } from "@bitwarden/ui-common"; +import { filterOutNullish, SecurityTaskType, TaskService } from "@bitwarden/vault"; + +// TODO: This component will need to be reworked to use the new EndUserNotificationService in PM-10609 + +@Component({ + selector: "vault-at-risk-password-callout", + standalone: true, + imports: [CommonModule, AnchorLinkDirective, RouterModule, CalloutModule, I18nPipe], + templateUrl: "./at-risk-password-callout.component.html", +}) +export class AtRiskPasswordCalloutComponent { + private taskService = inject(TaskService); + private activeAccount$ = inject(AccountService).activeAccount$.pipe(filterOutNullish()); + + protected pendingTasks$ = this.activeAccount$.pipe( + switchMap((user) => + this.taskService + .pendingTasks$(user.id) + .pipe( + map((tasks) => tasks.filter((t) => t.type === SecurityTaskType.UpdateAtRiskCredential)), + ), + ), + ); +} diff --git a/apps/browser/src/vault/popup/components/at-risk-passwords/at-risk-password-page.service.ts b/apps/browser/src/vault/popup/components/at-risk-passwords/at-risk-password-page.service.ts new file mode 100644 index 00000000000..f8cd4a60650 --- /dev/null +++ b/apps/browser/src/vault/popup/components/at-risk-passwords/at-risk-password-page.service.ts @@ -0,0 +1,35 @@ +import { inject, Injectable } from "@angular/core"; +import { map, Observable } from "rxjs"; + +import { + BANNERS_DISMISSED_DISK, + StateProvider, + UserKeyDefinition, +} from "@bitwarden/common/platform/state"; +import { UserId } from "@bitwarden/common/types/guid"; + +export const AT_RISK_PASSWORD_AUTOFILL_CALLOUT_DISMISSED_KEY = new UserKeyDefinition( + BANNERS_DISMISSED_DISK, + "atRiskPasswordAutofillBannerDismissed", + { + deserializer: (bannersDismissed) => bannersDismissed, + clearOn: [], // Do not clear dismissed banners + }, +); + +@Injectable() +export class AtRiskPasswordPageService { + private stateProvider = inject(StateProvider); + + isCalloutDismissed(userId: UserId): Observable { + return this.stateProvider + .getUser(userId, AT_RISK_PASSWORD_AUTOFILL_CALLOUT_DISMISSED_KEY) + .state$.pipe(map((dismissed) => !!dismissed)); + } + + async dismissCallout(userId: UserId): Promise { + await this.stateProvider + .getUser(userId, AT_RISK_PASSWORD_AUTOFILL_CALLOUT_DISMISSED_KEY) + .update(() => true); + } +} diff --git a/apps/browser/src/vault/popup/components/at-risk-passwords/at-risk-passwords.component.html b/apps/browser/src/vault/popup/components/at-risk-passwords/at-risk-passwords.component.html new file mode 100644 index 00000000000..044848eec8c --- /dev/null +++ b/apps/browser/src/vault/popup/components/at-risk-passwords/at-risk-passwords.component.html @@ -0,0 +1,81 @@ + + + + + + + + +

{{ "changeAtRiskPasswordsFasterDesc" | i18n }}

+ + +
+ + +

{{ pageDescription$ | async }}

+ + + + + + + + + +
+
diff --git a/apps/browser/src/vault/popup/components/at-risk-passwords/at-risk-passwords.component.spec.ts b/apps/browser/src/vault/popup/components/at-risk-passwords/at-risk-passwords.component.spec.ts new file mode 100644 index 00000000000..39b9650538a --- /dev/null +++ b/apps/browser/src/vault/popup/components/at-risk-passwords/at-risk-passwords.component.spec.ts @@ -0,0 +1,272 @@ +import { Component, Input } from "@angular/core"; +import { ComponentFixture, TestBed } from "@angular/core/testing"; +import { By } from "@angular/platform-browser"; +import { mock } from "jest-mock-extended"; +import { BehaviorSubject, firstValueFrom, of } from "rxjs"; + +import { JslibModule } from "@bitwarden/angular/jslib.module"; +import { IconComponent } from "@bitwarden/angular/vault/components/icon.component"; +import { OrganizationService } from "@bitwarden/common/admin-console/abstractions/organization/organization.service.abstraction"; +import { Organization } from "@bitwarden/common/admin-console/models/domain/organization"; +import { AccountService } from "@bitwarden/common/auth/abstractions/account.service"; +import { AutofillOverlayVisibility } from "@bitwarden/common/autofill/constants"; +import { AutofillSettingsServiceAbstraction } from "@bitwarden/common/autofill/services/autofill-settings.service"; +import { InlineMenuVisibilitySetting } from "@bitwarden/common/autofill/types"; +import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; +import { PlatformUtilsService } from "@bitwarden/common/platform/abstractions/platform-utils.service"; +import { CipherService } from "@bitwarden/common/vault/abstractions/cipher.service"; +import { CipherView } from "@bitwarden/common/vault/models/view/cipher.view"; +import { ToastService } from "@bitwarden/components"; +import { + ChangeLoginPasswordService, + DefaultChangeLoginPasswordService, + PasswordRepromptService, + SecurityTask, + SecurityTaskType, + TaskService, +} from "@bitwarden/vault"; + +import { PopupHeaderComponent } from "../../../../platform/popup/layout/popup-header.component"; +import { PopupPageComponent } from "../../../../platform/popup/layout/popup-page.component"; + +import { AtRiskPasswordPageService } from "./at-risk-password-page.service"; +import { AtRiskPasswordsComponent } from "./at-risk-passwords.component"; + +@Component({ + standalone: true, + selector: "popup-header", + template: ``, +}) +class MockPopupHeaderComponent { + @Input() pageTitle: string | undefined; + @Input() backAction: (() => void) | undefined; +} + +@Component({ + standalone: true, + selector: "popup-page", + template: ``, +}) +class MockPopupPageComponent { + @Input() loading: boolean | undefined; +} + +@Component({ + standalone: true, + selector: "app-vault-icon", + template: ``, +}) +class MockAppIcon { + @Input() cipher: CipherView | undefined; +} + +describe("AtRiskPasswordsComponent", () => { + let component: AtRiskPasswordsComponent; + let fixture: ComponentFixture; + + let mockTasks$: BehaviorSubject; + let mockCiphers$: BehaviorSubject; + let mockOrgs$: BehaviorSubject; + let mockInlineMenuVisibility$: BehaviorSubject; + let calloutDismissed$: BehaviorSubject; + const setInlineMenuVisibility = jest.fn(); + const mockToastService = mock(); + const mockAtRiskPasswordPageService = mock(); + const mockChangeLoginPasswordService = mock(); + + beforeEach(async () => { + mockTasks$ = new BehaviorSubject([ + { + id: "task", + organizationId: "org", + cipherId: "cipher", + type: SecurityTaskType.UpdateAtRiskCredential, + } as SecurityTask, + ]); + mockCiphers$ = new BehaviorSubject([ + { + id: "cipher", + organizationId: "org", + name: "Item 1", + } as CipherView, + { + id: "cipher2", + organizationId: "org", + name: "Item 2", + } as CipherView, + ]); + mockOrgs$ = new BehaviorSubject([ + { + id: "org", + name: "Org 1", + } as Organization, + ]); + + mockInlineMenuVisibility$ = new BehaviorSubject( + AutofillOverlayVisibility.Off, + ); + + calloutDismissed$ = new BehaviorSubject(false); + setInlineMenuVisibility.mockClear(); + mockToastService.showToast.mockClear(); + mockAtRiskPasswordPageService.isCalloutDismissed.mockReturnValue(calloutDismissed$); + + await TestBed.configureTestingModule({ + imports: [AtRiskPasswordsComponent], + providers: [ + { + provide: TaskService, + useValue: { + pendingTasks$: () => mockTasks$, + }, + }, + { + provide: OrganizationService, + useValue: { + organizations$: () => mockOrgs$, + }, + }, + { + provide: CipherService, + useValue: { + cipherViews$: () => mockCiphers$, + }, + }, + { provide: I18nService, useValue: { t: (key: string) => key } }, + { provide: AccountService, useValue: { activeAccount$: of({ id: "user" }) } }, + { provide: PlatformUtilsService, useValue: mock() }, + { provide: PasswordRepromptService, useValue: mock() }, + { + provide: AutofillSettingsServiceAbstraction, + useValue: { + inlineMenuVisibility$: mockInlineMenuVisibility$, + setInlineMenuVisibility: setInlineMenuVisibility, + }, + }, + { provide: ToastService, useValue: mockToastService }, + ], + }) + .overrideModule(JslibModule, { + remove: { + imports: [IconComponent], + exports: [IconComponent], + }, + add: { + imports: [MockAppIcon], + exports: [MockAppIcon], + }, + }) + .overrideComponent(AtRiskPasswordsComponent, { + remove: { + imports: [PopupHeaderComponent, PopupPageComponent], + providers: [ + AtRiskPasswordPageService, + { provide: ChangeLoginPasswordService, useClass: DefaultChangeLoginPasswordService }, + ], + }, + add: { + imports: [MockPopupHeaderComponent, MockPopupPageComponent], + providers: [ + { provide: AtRiskPasswordPageService, useValue: mockAtRiskPasswordPageService }, + { provide: ChangeLoginPasswordService, useValue: mockChangeLoginPasswordService }, + ], + }, + }) + .compileComponents(); + + fixture = TestBed.createComponent(AtRiskPasswordsComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it("should create", () => { + expect(component).toBeTruthy(); + }); + + describe("pending atRiskItems$", () => { + it("should list pending at risk item tasks", async () => { + const items = await firstValueFrom(component["atRiskItems$"]); + expect(items).toHaveLength(1); + expect(items[0].name).toBe("Item 1"); + }); + }); + + describe("pageDescription$", () => { + it("should use single org description when tasks belong to one org", async () => { + const description = await firstValueFrom(component["pageDescription$"]); + expect(description).toBe("atRiskPasswordsDescSingleOrg"); + }); + + it("should use multiple org description when tasks belong to multiple orgs", async () => { + mockTasks$.next([ + { + id: "task", + organizationId: "org", + cipherId: "cipher", + type: SecurityTaskType.UpdateAtRiskCredential, + } as SecurityTask, + { + id: "task2", + organizationId: "org2", + cipherId: "cipher2", + type: SecurityTaskType.UpdateAtRiskCredential, + } as SecurityTask, + ]); + const description = await firstValueFrom(component["pageDescription$"]); + expect(description).toBe("atRiskPasswordsDescMultiOrg"); + }); + }); + + describe("autofill callout", () => { + it("should show the callout if inline autofill is disabled", async () => { + mockInlineMenuVisibility$.next(AutofillOverlayVisibility.Off); + calloutDismissed$.next(false); + fixture.detectChanges(); + const callout = fixture.debugElement.query(By.css('[data-testid="autofill-callout"]')); + + expect(callout).toBeTruthy(); + }); + + it("should hide the callout if inline autofill is enabled", async () => { + mockInlineMenuVisibility$.next(AutofillOverlayVisibility.OnButtonClick); + calloutDismissed$.next(false); + fixture.detectChanges(); + const callout = fixture.debugElement.query(By.css('[data-testid="autofill-callout"]')); + + expect(callout).toBeFalsy(); + }); + + it("should hide the callout if the user has previously dismissed it", async () => { + mockInlineMenuVisibility$.next(AutofillOverlayVisibility.Off); + calloutDismissed$.next(true); + fixture.detectChanges(); + const callout = fixture.debugElement.query(By.css('[data-testid="autofill-callout"]')); + + expect(callout).toBeFalsy(); + }); + + it("should call dismissCallout when the dismiss callout button is clicked", async () => { + mockInlineMenuVisibility$.next(AutofillOverlayVisibility.Off); + fixture.detectChanges(); + const dismissButton = fixture.debugElement.query( + By.css('[data-testid="dismiss-callout-button"]'), + ); + dismissButton.nativeElement.click(); + expect(mockAtRiskPasswordPageService.dismissCallout).toHaveBeenCalled(); + }); + + describe("turn on autofill button", () => { + it("should call the service to turn on inline autofill and show a toast", () => { + const button = fixture.debugElement.query( + By.css('[data-testid="turn-on-autofill-button"]'), + ); + button.nativeElement.click(); + + expect(setInlineMenuVisibility).toHaveBeenCalledWith( + AutofillOverlayVisibility.OnButtonClick, + ); + expect(mockToastService.showToast).toHaveBeenCalled(); + }); + }); + }); +}); diff --git a/apps/browser/src/vault/popup/components/at-risk-passwords/at-risk-passwords.component.ts b/apps/browser/src/vault/popup/components/at-risk-passwords/at-risk-passwords.component.ts new file mode 100644 index 00000000000..4753bc77ecb --- /dev/null +++ b/apps/browser/src/vault/popup/components/at-risk-passwords/at-risk-passwords.component.ts @@ -0,0 +1,184 @@ +import { CommonModule } from "@angular/common"; +import { Component, inject, signal } from "@angular/core"; +import { Router } from "@angular/router"; +import { combineLatest, firstValueFrom, map, of, shareReplay, startWith, switchMap } from "rxjs"; + +import { JslibModule } from "@bitwarden/angular/jslib.module"; +import { + getOrganizationById, + OrganizationService, +} from "@bitwarden/common/admin-console/abstractions/organization/organization.service.abstraction"; +import { AccountService } from "@bitwarden/common/auth/abstractions/account.service"; +import { AutofillOverlayVisibility } from "@bitwarden/common/autofill/constants"; +import { AutofillSettingsServiceAbstraction } from "@bitwarden/common/autofill/services/autofill-settings.service"; +import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; +import { PlatformUtilsService } from "@bitwarden/common/platform/abstractions/platform-utils.service"; +import { CipherService } from "@bitwarden/common/vault/abstractions/cipher.service"; +import { CipherView } from "@bitwarden/common/vault/models/view/cipher.view"; +import { + BadgeModule, + ButtonModule, + CalloutModule, + ItemModule, + ToastService, + TypographyModule, +} from "@bitwarden/components"; +import { + ChangeLoginPasswordService, + DefaultChangeLoginPasswordService, + filterOutNullish, + PasswordRepromptService, + SecurityTaskType, + TaskService, +} from "@bitwarden/vault"; + +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"; + +import { AtRiskPasswordPageService } from "./at-risk-password-page.service"; + +@Component({ + imports: [ + PopupPageComponent, + PopupHeaderComponent, + PopOutComponent, + ItemModule, + CommonModule, + JslibModule, + TypographyModule, + CalloutModule, + ButtonModule, + BadgeModule, + ], + providers: [ + AtRiskPasswordPageService, + { provide: ChangeLoginPasswordService, useClass: DefaultChangeLoginPasswordService }, + ], + selector: "vault-at-risk-passwords", + standalone: true, + templateUrl: "./at-risk-passwords.component.html", +}) +export class AtRiskPasswordsComponent { + private taskService = inject(TaskService); + private organizationService = inject(OrganizationService); + private cipherService = inject(CipherService); + private i18nService = inject(I18nService); + private accountService = inject(AccountService); + private passwordRepromptService = inject(PasswordRepromptService); + private router = inject(Router); + private autofillSettingsService = inject(AutofillSettingsServiceAbstraction); + private toastService = inject(ToastService); + private atRiskPasswordPageService = inject(AtRiskPasswordPageService); + private changeLoginPasswordService = inject(ChangeLoginPasswordService); + private platformUtilsService = inject(PlatformUtilsService); + + /** + * The cipher that is currently being launched. Used to show a loading spinner on the badge button. + * The UI utilize a bitBadge which does not support async actions (like bitButton does). + * @protected + */ + protected launchingCipher = signal(null); + + private activeUserData$ = this.accountService.activeAccount$.pipe( + filterOutNullish(), + switchMap((user) => + combineLatest([ + this.taskService.pendingTasks$(user.id), + this.cipherService.cipherViews$(user.id).pipe( + filterOutNullish(), + map((ciphers) => Object.fromEntries(ciphers.map((c) => [c.id, c]))), + ), + of(user), + ]), + ), + map(([tasks, ciphers, user]) => ({ + tasks, + ciphers, + userId: user.id, + })), + shareReplay({ bufferSize: 1, refCount: true }), + ); + + protected loading$ = this.activeUserData$.pipe( + map(() => false), + startWith(true), + ); + + protected calloutDismissed$ = this.activeUserData$.pipe( + switchMap(({ userId }) => this.atRiskPasswordPageService.isCalloutDismissed(userId)), + ); + + protected inlineAutofillSettingEnabled$ = this.autofillSettingsService.inlineMenuVisibility$.pipe( + map((setting) => setting !== AutofillOverlayVisibility.Off), + ); + + protected atRiskItems$ = this.activeUserData$.pipe( + map(({ tasks, ciphers }) => + tasks + .filter( + (t) => + t.type === SecurityTaskType.UpdateAtRiskCredential && + t.cipherId != null && + ciphers[t.cipherId] != null, + ) + .map((t) => ciphers[t.cipherId!]), + ), + ); + + protected pageDescription$ = this.activeUserData$.pipe( + switchMap(({ tasks, userId }) => { + const orgIds = new Set(tasks.map((t) => t.organizationId)); + if (orgIds.size === 1) { + const [orgId] = orgIds; + return this.organizationService.organizations$(userId).pipe( + getOrganizationById(orgId), + map((org) => this.i18nService.t("atRiskPasswordsDescSingleOrg", org?.name, tasks.length)), + ); + } + + return of(this.i18nService.t("atRiskPasswordsDescMultiOrg", tasks.length)); + }), + ); + + async viewCipher(cipher: CipherView) { + const repromptPassed = await this.passwordRepromptService.passwordRepromptCheck(cipher); + if (!repromptPassed) { + return; + } + await this.router.navigate(["/view-cipher"], { + queryParams: { cipherId: cipher.id, type: cipher.type }, + }); + } + + async activateInlineAutofillMenuVisibility() { + await this.autofillSettingsService.setInlineMenuVisibility( + AutofillOverlayVisibility.OnButtonClick, + ); + this.toastService.showToast({ + variant: "success", + message: this.i18nService.t("turnedOnAutofill"), + title: "", + }); + } + + async dismissCallout() { + const { userId } = await firstValueFrom(this.activeUserData$); + await this.atRiskPasswordPageService.dismissCallout(userId); + } + + launchChangePassword = async (cipher: CipherView) => { + try { + this.launchingCipher.set(cipher); + const url = await this.changeLoginPasswordService.getChangePasswordUrl(cipher); + + if (url == null) { + return; + } + + this.platformUtilsService.launchUri(url); + } finally { + this.launchingCipher.set(null); + } + }; +} diff --git a/apps/browser/src/vault/popup/components/vault-v2/add-edit/add-edit-v2.component.spec.ts b/apps/browser/src/vault/popup/components/vault-v2/add-edit/add-edit-v2.component.spec.ts index 3252f030fc3..6974e6f7359 100644 --- a/apps/browser/src/vault/popup/components/vault-v2/add-edit/add-edit-v2.component.spec.ts +++ b/apps/browser/src/vault/popup/components/vault-v2/add-edit/add-edit-v2.component.spec.ts @@ -1,14 +1,17 @@ import { ComponentFixture, fakeAsync, TestBed, tick } from "@angular/core/testing"; import { ActivatedRoute, Router } from "@angular/router"; import { mock, MockProxy } from "jest-mock-extended"; -import { BehaviorSubject, Observable } from "rxjs"; +import { BehaviorSubject } from "rxjs"; import { EventCollectionService } from "@bitwarden/common/abstractions/event/event-collection.service"; +import { AccountService } from "@bitwarden/common/auth/abstractions/account.service"; import { EventType } from "@bitwarden/common/enums"; import { ConfigService } from "@bitwarden/common/platform/abstractions/config/config.service"; import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; import { LogService } from "@bitwarden/common/platform/abstractions/log.service"; import { PlatformUtilsService } from "@bitwarden/common/platform/abstractions/platform-utils.service"; +import { mockAccountServiceWith } from "@bitwarden/common/spec"; +import { UserId } from "@bitwarden/common/types/guid"; import { CipherService } from "@bitwarden/common/vault/abstractions/cipher.service"; import { CipherType } from "@bitwarden/common/vault/enums"; import { Cipher } from "@bitwarden/common/vault/models/domain/cipher"; @@ -58,9 +61,9 @@ describe("AddEditV2Component", () => { collect.mockClear(); addEditCipherInfo$ = new BehaviorSubject(null); - cipherServiceMock = mock(); - cipherServiceMock.addEditCipherInfo$ = - addEditCipherInfo$.asObservable() as Observable; + cipherServiceMock = mock({ + addEditCipherInfo$: jest.fn().mockReturnValue(addEditCipherInfo$), + }); await TestBed.configureTestingModule({ imports: [AddEditV2Component], @@ -81,6 +84,7 @@ describe("AddEditV2Component", () => { canDeleteCipher$: jest.fn().mockReturnValue(true), }, }, + { provide: AccountService, useValue: mockAccountServiceWith("UserId" as UserId) }, ], }) .overrideProvider(CipherFormConfigService, { diff --git a/apps/browser/src/vault/popup/components/vault-v2/add-edit/add-edit-v2.component.ts b/apps/browser/src/vault/popup/components/vault-v2/add-edit/add-edit-v2.component.ts index b46b1d61509..1dcb48c918d 100644 --- a/apps/browser/src/vault/popup/components/vault-v2/add-edit/add-edit-v2.component.ts +++ b/apps/browser/src/vault/popup/components/vault-v2/add-edit/add-edit-v2.component.ts @@ -9,10 +9,12 @@ import { firstValueFrom, map, Observable, switchMap } from "rxjs"; import { JslibModule } from "@bitwarden/angular/jslib.module"; import { EventCollectionService } from "@bitwarden/common/abstractions/event/event-collection.service"; +import { AccountService } from "@bitwarden/common/auth/abstractions/account.service"; +import { getUserId } from "@bitwarden/common/auth/services/account.service"; import { EventType } from "@bitwarden/common/enums"; import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; import { LogService } from "@bitwarden/common/platform/abstractions/log.service"; -import { CipherId, CollectionId, OrganizationId } from "@bitwarden/common/types/guid"; +import { CipherId, CollectionId, OrganizationId, UserId } from "@bitwarden/common/types/guid"; import { CipherService } from "@bitwarden/common/vault/abstractions/cipher.service"; import { CipherType } from "@bitwarden/common/vault/enums"; import { CipherView } from "@bitwarden/common/vault/models/view/cipher.view"; @@ -180,6 +182,7 @@ export class AddEditV2Component implements OnInit { private toastService: ToastService, private dialogService: DialogService, protected cipherAuthorizationService: CipherAuthorizationService, + private accountService: AccountService, ) { this.subscribeToParams(); } @@ -281,9 +284,15 @@ export class AddEditV2Component implements OnInit { config.initialValues = this.setInitialValuesFromParams(params); + const activeUserId = await firstValueFrom( + this.accountService.activeAccount$.pipe(getUserId), + ); + // The browser notification bar and overlay use addEditCipherInfo$ to pass modified cipher details to the form // Attempt to fetch them here and overwrite the initialValues if present - const cachedCipherInfo = await firstValueFrom(this.cipherService.addEditCipherInfo$); + const cachedCipherInfo = await firstValueFrom( + this.cipherService.addEditCipherInfo$(activeUserId), + ); if (cachedCipherInfo != null) { // Cached cipher info has priority over queryParams @@ -292,7 +301,7 @@ export class AddEditV2Component implements OnInit { ...mapAddEditCipherInfoToInitialValues(cachedCipherInfo), }; // Be sure to clear the "cached" cipher info, so it doesn't get used again - await this.cipherService.setAddEditCipherInfo(null); + await this.cipherService.setAddEditCipherInfo(null, activeUserId); } if (["edit", "partial-edit"].includes(config.mode) && config.originalCipher?.id) { @@ -371,7 +380,8 @@ export class AddEditV2Component implements OnInit { } try { - await this.deleteCipher(); + const activeUserId = await firstValueFrom(this.accountService.activeAccount$.pipe(getUserId)); + await this.deleteCipher(activeUserId); } catch (e) { this.logService.error(e); return false; @@ -388,10 +398,10 @@ export class AddEditV2Component implements OnInit { return true; }; - protected deleteCipher() { + protected deleteCipher(userId: UserId) { return this.config.originalCipher.deletedDate - ? this.cipherService.deleteWithServer(this.config.originalCipher.id) - : this.cipherService.softDeleteWithServer(this.config.originalCipher.id); + ? this.cipherService.deleteWithServer(this.config.originalCipher.id, userId) + : this.cipherService.softDeleteWithServer(this.config.originalCipher.id, userId); } } diff --git a/apps/browser/src/vault/popup/components/vault-v2/assign-collections/assign-collections.component.ts b/apps/browser/src/vault/popup/components/vault-v2/assign-collections/assign-collections.component.ts index 51ebe9bdb62..27f3b7e5e18 100644 --- a/apps/browser/src/vault/popup/components/vault-v2/assign-collections/assign-collections.component.ts +++ b/apps/browser/src/vault/popup/components/vault-v2/assign-collections/assign-collections.component.ts @@ -5,12 +5,13 @@ import { Component } from "@angular/core"; import { takeUntilDestroyed } from "@angular/core/rxjs-interop"; import { ReactiveFormsModule } from "@angular/forms"; import { ActivatedRoute } from "@angular/router"; -import { Observable, combineLatest, first, map, switchMap } from "rxjs"; +import { Observable, combineLatest, filter, first, map, switchMap } from "rxjs"; import { CollectionService } from "@bitwarden/admin-console/common"; import { JslibModule } from "@bitwarden/angular/jslib.module"; import { AccountService } from "@bitwarden/common/auth/abstractions/account.service"; import { OrganizationId } from "@bitwarden/common/types/guid"; +import { OrgKey, UserKey } from "@bitwarden/common/types/key"; import { CipherService } from "@bitwarden/common/vault/abstractions/cipher.service"; import { CipherView } from "@bitwarden/common/vault/models/view/cipher.view"; import { @@ -58,16 +59,19 @@ export class AssignCollections { private accountService: AccountService, route: ActivatedRoute, ) { - const cipher$: Observable = route.queryParams.pipe( - switchMap(({ cipherId }) => this.cipherService.get(cipherId)), - switchMap((cipherDomain) => - this.accountService.activeAccount$.pipe( - map((account) => account?.id), - switchMap((userId) => - this.cipherService - .getKeyForCipherKeyDecryption(cipherDomain, userId) - .then(cipherDomain.decrypt.bind(cipherDomain)), - ), + const cipher$: Observable = this.accountService.activeAccount$.pipe( + map((account) => account?.id), + filter((userId) => userId != null), + switchMap((userId) => + route.queryParams.pipe( + switchMap(async ({ cipherId }) => { + const cipherDomain = await this.cipherService.get(cipherId, userId); + const key: UserKey | OrgKey = await this.cipherService.getKeyForCipherKeyDecryption( + cipherDomain, + userId, + ); + return cipherDomain.decrypt(key); + }), ), ), ); diff --git a/apps/browser/src/vault/popup/components/vault-v2/attachments/open-attachments/open-attachments.component.ts b/apps/browser/src/vault/popup/components/vault-v2/attachments/open-attachments/open-attachments.component.ts index aca494716b1..1bc7e22e6d5 100644 --- a/apps/browser/src/vault/popup/components/vault-v2/attachments/open-attachments/open-attachments.component.ts +++ b/apps/browser/src/vault/popup/components/vault-v2/attachments/open-attachments/open-attachments.component.ts @@ -77,10 +77,10 @@ export class OpenAttachmentsComponent implements OnInit { return; } - const cipherDomain = await this.cipherService.get(this.cipherId); const activeUserId = await firstValueFrom( this.accountService.activeAccount$.pipe(map((a) => a?.id)), ); + const cipherDomain = await this.cipherService.get(this.cipherId, activeUserId); const cipher = await cipherDomain.decrypt( await this.cipherService.getKeyForCipherKeyDecryption(cipherDomain, activeUserId), ); diff --git a/apps/browser/src/vault/popup/components/vault-v2/vault-header/vault-header-v2.component.spec.ts b/apps/browser/src/vault/popup/components/vault-v2/vault-header/vault-header-v2.component.spec.ts index 1f67dd51c21..fb5ac4b3391 100644 --- a/apps/browser/src/vault/popup/components/vault-v2/vault-header/vault-header-v2.component.spec.ts +++ b/apps/browser/src/vault/popup/components/vault-v2/vault-header/vault-header-v2.component.spec.ts @@ -59,7 +59,9 @@ describe("VaultHeaderV2Component", () => { providers: [ { provide: CipherService, - useValue: mock({ cipherViews$: new BehaviorSubject([]) }), + useValue: mock({ + cipherViews$: jest.fn().mockReturnValue(new BehaviorSubject([])), + }), }, { provide: VaultSettingsService, useValue: mock() }, { provide: FolderService, useValue: mock() }, diff --git a/apps/browser/src/vault/popup/components/vault-v2/vault-list-items-container/vault-list-items-container.component.ts b/apps/browser/src/vault/popup/components/vault-v2/vault-list-items-container/vault-list-items-container.component.ts index f95790cda5f..cb758e7a48d 100644 --- a/apps/browser/src/vault/popup/components/vault-v2/vault-list-items-container/vault-list-items-container.component.ts +++ b/apps/browser/src/vault/popup/components/vault-v2/vault-list-items-container/vault-list-items-container.component.ts @@ -22,6 +22,8 @@ import { Router } from "@angular/router"; import { firstValueFrom, Observable, map } from "rxjs"; import { JslibModule } from "@bitwarden/angular/jslib.module"; +import { AccountService } from "@bitwarden/common/auth/abstractions/account.service"; +import { getUserId } from "@bitwarden/common/auth/services/account.service"; import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; import { PlatformUtilsService } from "@bitwarden/common/platform/abstractions/platform-utils.service"; import { CipherId } from "@bitwarden/common/types/guid"; @@ -265,6 +267,7 @@ export class VaultListItemsContainerComponent implements OnInit, AfterViewInit { private router: Router, private platformUtilsService: PlatformUtilsService, private dialogService: DialogService, + private accountService: AccountService, ) {} ngOnInit(): void { @@ -311,7 +314,8 @@ export class VaultListItemsContainerComponent implements OnInit, AfterViewInit { this.viewCipherTimeout = null; } - await this.cipherService.updateLastLaunchedDate(cipher.id); + const activeUserId = await firstValueFrom(this.accountService.activeAccount$.pipe(getUserId)); + await this.cipherService.updateLastLaunchedDate(cipher.id, activeUserId); await BrowserApi.createNewTab(cipher.login.launchUri); diff --git a/apps/browser/src/vault/popup/components/vault-v2/vault-password-history-v2/vault-password-history-v2.component.spec.ts b/apps/browser/src/vault/popup/components/vault-v2/vault-password-history-v2/vault-password-history-v2.component.spec.ts index 9ac17b49386..838ce2e9426 100644 --- a/apps/browser/src/vault/popup/components/vault-v2/vault-password-history-v2/vault-password-history-v2.component.spec.ts +++ b/apps/browser/src/vault/popup/components/vault-v2/vault-password-history-v2/vault-password-history-v2.component.spec.ts @@ -1,13 +1,15 @@ import { ComponentFixture, fakeAsync, TestBed, tick } from "@angular/core/testing"; import { ActivatedRoute } from "@angular/router"; import { mock } from "jest-mock-extended"; -import { BehaviorSubject, Subject } from "rxjs"; +import { Subject } from "rxjs"; import { WINDOW } from "@bitwarden/angular/services/injection-tokens"; -import { Account, AccountService } from "@bitwarden/common/auth/abstractions/account.service"; +import { AccountService } from "@bitwarden/common/auth/abstractions/account.service"; import { ConfigService } from "@bitwarden/common/platform/abstractions/config/config.service"; import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; import { PlatformUtilsService } from "@bitwarden/common/platform/abstractions/platform-utils.service"; +import { mockAccountServiceWith } from "@bitwarden/common/spec"; +import { UserId } from "@bitwarden/common/types/guid"; import { CipherService } from "@bitwarden/common/vault/abstractions/cipher.service"; import { Cipher } from "@bitwarden/common/vault/models/domain/cipher"; import { CipherView } from "@bitwarden/common/vault/models/view/cipher.view"; @@ -19,6 +21,7 @@ import { PasswordHistoryV2Component } from "./vault-password-history-v2.componen describe("PasswordHistoryV2Component", () => { let fixture: ComponentFixture; const params$ = new Subject(); + const mockUserId = "acct-1" as UserId; const mockCipherView = { id: "111-222-333", @@ -45,9 +48,7 @@ describe("PasswordHistoryV2Component", () => { { provide: CipherService, useValue: mock({ get: getCipher }) }, { provide: AccountService, - useValue: mock({ - activeAccount$: new BehaviorSubject({ id: "acct-1" } as Account), - }), + useValue: mockAccountServiceWith(mockUserId), }, { provide: PopupRouterCacheService, useValue: { back } }, { provide: ActivatedRoute, useValue: { queryParams: params$ } }, @@ -64,7 +65,7 @@ describe("PasswordHistoryV2Component", () => { tick(100); - expect(getCipher).toHaveBeenCalledWith(mockCipherView.id); + expect(getCipher).toHaveBeenCalledWith(mockCipherView.id, mockUserId); })); it("navigates back when a cipherId is not in the params", () => { diff --git a/apps/browser/src/vault/popup/components/vault-v2/vault-password-history-v2/vault-password-history-v2.component.ts b/apps/browser/src/vault/popup/components/vault-v2/vault-password-history-v2/vault-password-history-v2.component.ts index e20bb1f1bcd..5d315775b10 100644 --- a/apps/browser/src/vault/popup/components/vault-v2/vault-password-history-v2/vault-password-history-v2.component.ts +++ b/apps/browser/src/vault/popup/components/vault-v2/vault-password-history-v2/vault-password-history-v2.component.ts @@ -58,8 +58,6 @@ export class PasswordHistoryV2Component implements OnInit { /** Load the cipher based on the given Id */ private async loadCipher(cipherId: string) { - const cipher = await this.cipherService.get(cipherId); - const activeAccount = await firstValueFrom( this.accountService.activeAccount$.pipe(map((a: { id: string | undefined }) => a)), ); @@ -69,6 +67,8 @@ export class PasswordHistoryV2Component implements OnInit { } const activeUserId = activeAccount.id as UserId; + + const cipher = await this.cipherService.get(cipherId, activeUserId); this.cipher = await cipher.decrypt( await this.cipherService.getKeyForCipherKeyDecryption(cipher, activeUserId), ); diff --git a/apps/browser/src/vault/popup/components/vault-v2/vault-v2.component.html b/apps/browser/src/vault/popup/components/vault-v2/vault-v2.component.html index 6e017042711..8cb538a429a 100644 --- a/apps/browser/src/vault/popup/components/vault-v2/vault-v2.component.html +++ b/apps/browser/src/vault/popup/components/vault-v2/vault-v2.component.html @@ -32,6 +32,9 @@ slot="above-scroll-area" *ngIf="vaultState !== VaultStateEnum.Empty && !(loading$ | async)" > + diff --git a/apps/browser/src/vault/popup/components/vault-v2/vault-v2.component.ts b/apps/browser/src/vault/popup/components/vault-v2/vault-v2.component.ts index 12952a69c79..be5c33aab70 100644 --- a/apps/browser/src/vault/popup/components/vault-v2/vault-v2.component.ts +++ b/apps/browser/src/vault/popup/components/vault-v2/vault-v2.component.ts @@ -3,13 +3,31 @@ import { CommonModule } from "@angular/common"; import { AfterViewInit, Component, DestroyRef, OnDestroy, OnInit, ViewChild } from "@angular/core"; import { takeUntilDestroyed } from "@angular/core/rxjs-interop"; import { RouterLink } from "@angular/router"; -import { combineLatest, filter, map, Observable, shareReplay, switchMap, take } from "rxjs"; +import { + combineLatest, + filter, + map, + firstValueFrom, + Observable, + shareReplay, + switchMap, + take, +} from "rxjs"; import { JslibModule } from "@bitwarden/angular/jslib.module"; +import { AccountService } from "@bitwarden/common/auth/abstractions/account.service"; +import { getUserId } from "@bitwarden/common/auth/services/account.service"; +import { FeatureFlag } from "@bitwarden/common/enums/feature-flag.enum"; import { CipherId, CollectionId, OrganizationId } from "@bitwarden/common/types/guid"; import { CipherService } from "@bitwarden/common/vault/abstractions/cipher.service"; import { CipherType } from "@bitwarden/common/vault/enums"; -import { ButtonModule, DialogService, Icons, NoItemsModule } from "@bitwarden/components"; +import { + BannerComponent, + ButtonModule, + DialogService, + Icons, + NoItemsModule, +} from "@bitwarden/components"; import { DecryptionFailureDialogComponent, VaultIcons } from "@bitwarden/vault"; import { CurrentAccountComponent } from "../../../../auth/popup/account-switching/current-account.component"; @@ -19,6 +37,7 @@ import { PopupPageComponent } from "../../../../platform/popup/layout/popup-page import { VaultPopupItemsService } from "../../services/vault-popup-items.service"; import { VaultPopupListFiltersService } from "../../services/vault-popup-list-filters.service"; import { VaultPopupScrollPositionService } from "../../services/vault-popup-scroll-position.service"; +import { AtRiskPasswordCalloutComponent } from "../at-risk-callout/at-risk-password-callout.component"; import { BlockedInjectionBanner } from "./blocked-injection-banner/blocked-injection-banner.component"; import { @@ -56,6 +75,8 @@ enum VaultState { ScrollingModule, VaultHeaderV2Component, DecryptionFailureDialogComponent, + BannerComponent, + AtRiskPasswordCalloutComponent, ], }) export class VaultV2Component implements OnInit, AfterViewInit, OnDestroy { @@ -96,6 +117,7 @@ export class VaultV2Component implements OnInit, AfterViewInit, OnDestroy { private vaultPopupItemsService: VaultPopupItemsService, private vaultPopupListFiltersService: VaultPopupListFiltersService, private vaultScrollPositionService: VaultPopupScrollPositionService, + private accountService: AccountService, private destroyRef: DestroyRef, private cipherService: CipherService, private dialogService: DialogService, @@ -136,7 +158,10 @@ export class VaultV2Component implements OnInit, AfterViewInit, OnDestroy { } async ngOnInit() { - this.cipherService.failedToDecryptCiphers$ + const activeUserId = await firstValueFrom(this.accountService.activeAccount$.pipe(getUserId)); + + this.cipherService + .failedToDecryptCiphers$(activeUserId) .pipe( map((ciphers) => ciphers.filter((c) => !c.isDeleted)), filter((ciphers) => ciphers.length > 0), @@ -153,4 +178,6 @@ export class VaultV2Component implements OnInit, AfterViewInit, OnDestroy { ngOnDestroy(): void { this.vaultScrollPositionService.stop(); } + + protected readonly FeatureFlag = FeatureFlag; } diff --git a/apps/browser/src/vault/popup/components/vault-v2/view-v2/view-v2.component.spec.ts b/apps/browser/src/vault/popup/components/vault-v2/view-v2/view-v2.component.spec.ts index 39feb86f4fd..17464c025af 100644 --- a/apps/browser/src/vault/popup/components/vault-v2/view-v2/view-v2.component.spec.ts +++ b/apps/browser/src/vault/popup/components/vault-v2/view-v2/view-v2.component.spec.ts @@ -150,7 +150,7 @@ describe("ViewV2Component", () => { flush(); // Resolve all promises - expect(mockCipherService.get).toHaveBeenCalledWith("122-333-444"); + expect(mockCipherService.get).toHaveBeenCalledWith("122-333-444", mockUserId); expect(component.cipher).toEqual(mockCipher); })); diff --git a/apps/browser/src/vault/popup/components/vault-v2/view-v2/view-v2.component.ts b/apps/browser/src/vault/popup/components/vault-v2/view-v2/view-v2.component.ts index 65fb024ee99..209691869f0 100644 --- a/apps/browser/src/vault/popup/components/vault-v2/view-v2/view-v2.component.ts +++ b/apps/browser/src/vault/popup/components/vault-v2/view-v2/view-v2.component.ts @@ -5,13 +5,14 @@ import { Component } from "@angular/core"; import { takeUntilDestroyed } from "@angular/core/rxjs-interop"; import { FormsModule } from "@angular/forms"; import { ActivatedRoute, Router } from "@angular/router"; -import { firstValueFrom, map, Observable, switchMap } from "rxjs"; +import { firstValueFrom, Observable, switchMap } from "rxjs"; import { CollectionView } from "@bitwarden/admin-console/common"; import { JslibModule } from "@bitwarden/angular/jslib.module"; import { EventCollectionService } from "@bitwarden/common/abstractions/event/event-collection.service"; import { Organization } from "@bitwarden/common/admin-console/models/domain/organization"; import { AccountService } from "@bitwarden/common/auth/abstractions/account.service"; +import { getUserId } from "@bitwarden/common/auth/services/account.service"; import { AUTOFILL_ID, COPY_PASSWORD_ID, @@ -22,6 +23,7 @@ import { import { EventType } from "@bitwarden/common/enums"; import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; import { LogService } from "@bitwarden/common/platform/abstractions/log.service"; +import { UserId } from "@bitwarden/common/types/guid"; import { CipherService } from "@bitwarden/common/vault/abstractions/cipher.service"; import { PremiumUpgradePromptService } from "@bitwarden/common/vault/abstractions/premium-upgrade-prompt.service"; import { ViewPasswordHistoryService } from "@bitwarden/common/vault/abstractions/view-password-history.service"; @@ -87,6 +89,8 @@ type LoadAction = ], }) export class ViewV2Component { + private activeUserId: UserId; + headerText: string; cipher: CipherView; organization$: Observable; @@ -117,14 +121,20 @@ export class ViewV2Component { subscribeToParams(): void { this.route.queryParams .pipe( - switchMap(async (params): Promise => { + switchMap(async (params) => { this.loadAction = params.action; this.senderTabId = params.senderTabId ? parseInt(params.senderTabId, 10) : undefined; - return await this.getCipherData(params.cipherId); + + const activeUserId = await firstValueFrom( + this.accountService.activeAccount$.pipe(getUserId), + ); + const cipher = await this.getCipherData(params.cipherId, activeUserId); + return { activeUserId, cipher }; }), - switchMap(async (cipher) => { + switchMap(async ({ activeUserId, cipher }) => { this.cipher = cipher; this.headerText = this.setHeader(cipher.type); + this.activeUserId = activeUserId; if (this.loadAction) { await this._handleLoadAction(this.loadAction, this.senderTabId); @@ -159,13 +169,10 @@ export class ViewV2Component { } } - async getCipherData(id: string) { - const cipher = await this.cipherService.get(id); - const activeUserId = await firstValueFrom( - this.accountService.activeAccount$.pipe(map((a) => a?.id)), - ); + async getCipherData(id: string, userId: UserId) { + const cipher = await this.cipherService.get(id, userId); return await cipher.decrypt( - await this.cipherService.getKeyForCipherKeyDecryption(cipher, activeUserId), + await this.cipherService.getKeyForCipherKeyDecryption(cipher, userId), ); } @@ -213,7 +220,7 @@ export class ViewV2Component { restore = async (): Promise => { try { - await this.cipherService.restoreWithServer(this.cipher.id); + await this.cipherService.restoreWithServer(this.cipher.id, this.activeUserId); } catch (e) { this.logService.error(e); } @@ -228,8 +235,8 @@ export class ViewV2Component { protected deleteCipher() { return this.cipher.isDeleted - ? this.cipherService.deleteWithServer(this.cipher.id) - : this.cipherService.softDeleteWithServer(this.cipher.id); + ? this.cipherService.deleteWithServer(this.cipher.id, this.activeUserId) + : this.cipherService.softDeleteWithServer(this.cipher.id, this.activeUserId); } protected showFooter(): boolean { diff --git a/apps/browser/src/vault/popup/services/vault-popup-items.service.spec.ts b/apps/browser/src/vault/popup/services/vault-popup-items.service.spec.ts index ec20458ca60..6d7b7b57d23 100644 --- a/apps/browser/src/vault/popup/services/vault-popup-items.service.spec.ts +++ b/apps/browser/src/vault/popup/services/vault-popup-items.service.spec.ts @@ -15,6 +15,8 @@ import { CipherId, UserId } from "@bitwarden/common/types/guid"; import { CipherService } from "@bitwarden/common/vault/abstractions/cipher.service"; import { VaultSettingsService } from "@bitwarden/common/vault/abstractions/vault-settings/vault-settings.service"; import { CipherType } from "@bitwarden/common/vault/enums"; +import { CipherData } from "@bitwarden/common/vault/models/data/cipher.data"; +import { LocalData } from "@bitwarden/common/vault/models/data/local.data"; import { CipherView } from "@bitwarden/common/vault/models/view/cipher.view"; import { InlineMenuFieldQualificationService } from "../../../autofill/services/inline-menu-field-qualification.service"; @@ -34,6 +36,10 @@ describe("VaultPopupItemsService", () => { let mockCollections: CollectionView[]; let activeUserLastSync$: BehaviorSubject; + let ciphersSubject: BehaviorSubject>; + let localDataSubject: BehaviorSubject>; + let failedToDecryptCiphersSubject: BehaviorSubject; + const cipherServiceMock = mock(); const vaultSettingsServiceMock = mock(); const organizationServiceMock = mock(); @@ -60,9 +66,21 @@ describe("VaultPopupItemsService", () => { cipherList[3].favorite = true; cipherServiceMock.getAllDecrypted.mockResolvedValue(cipherList); - cipherServiceMock.ciphers$ = new BehaviorSubject(null); - cipherServiceMock.localData$ = new BehaviorSubject(null); - cipherServiceMock.failedToDecryptCiphers$ = new BehaviorSubject([]); + + ciphersSubject = new BehaviorSubject>({}); + localDataSubject = new BehaviorSubject>({}); + failedToDecryptCiphersSubject = new BehaviorSubject([]); + + cipherServiceMock.ciphers$.mockImplementation((userId: UserId) => + ciphersSubject.asObservable(), + ); + cipherServiceMock.localData$.mockImplementation((userId: UserId) => + localDataSubject.asObservable(), + ); + cipherServiceMock.failedToDecryptCiphers$.mockImplementation((userId: UserId) => + failedToDecryptCiphersSubject.asObservable(), + ); + searchService.searchCiphers.mockImplementation(async (_, __, ciphers) => ciphers); cipherServiceMock.filterCiphersForUrl.mockImplementation(async (ciphers) => ciphers.filter((c) => ["0", "1"].includes(c.id)), @@ -118,6 +136,7 @@ describe("VaultPopupItemsService", () => { { provide: CollectionService, useValue: collectionService }, { provide: VaultPopupAutofillService, useValue: vaultAutofillServiceMock }, { provide: SyncService, useValue: syncServiceMock }, + { provide: AccountService, useValue: mockAccountServiceWith("UserId" as UserId) }, { provide: InlineMenuFieldQualificationService, useValue: inlineMenuFieldQualificationServiceMock, @@ -155,7 +174,7 @@ describe("VaultPopupItemsService", () => { await tracker.expectEmission(); - (cipherServiceMock.ciphers$ as BehaviorSubject).next(null); + ciphersSubject.next({}); await tracker.expectEmission(); @@ -169,7 +188,7 @@ describe("VaultPopupItemsService", () => { await tracker.expectEmission(); - (cipherServiceMock.localData$ as BehaviorSubject).next(null); + localDataSubject.next({}); await tracker.expectEmission(); @@ -373,7 +392,7 @@ describe("VaultPopupItemsService", () => { cipherServiceMock.getAllDecrypted.mockResolvedValue(ciphers); - (cipherServiceMock.ciphers$ as BehaviorSubject).next(null); + ciphersSubject.next({}); const deletedCiphers = await firstValueFrom(service.deletedCiphers$); expect(deletedCiphers.length).toBe(1); @@ -422,7 +441,7 @@ describe("VaultPopupItemsService", () => { it("should cycle when cipherService.ciphers$ emits", async () => { // Restart tracking tracked = new ObservableTracker(service.loading$); - (cipherServiceMock.ciphers$ as BehaviorSubject).next(null); + ciphersSubject.next({}); await trackedCiphers.pauseUntilReceived(2); diff --git a/apps/browser/src/vault/popup/services/vault-popup-items.service.ts b/apps/browser/src/vault/popup/services/vault-popup-items.service.ts index 8e0711abb1e..0b3e7eba492 100644 --- a/apps/browser/src/vault/popup/services/vault-popup-items.service.ts +++ b/apps/browser/src/vault/popup/services/vault-popup-items.service.ts @@ -1,6 +1,6 @@ // FIXME: Update this file to be type safe and remove this and next line // @ts-strict-ignore -import { inject, Injectable, NgZone } from "@angular/core"; +import { Injectable, NgZone } from "@angular/core"; import { BehaviorSubject, combineLatest, @@ -86,16 +86,19 @@ export class VaultPopupItemsService { * Observable that contains the list of all decrypted ciphers. * @private */ - private _allDecryptedCiphers$: Observable = merge( - this.cipherService.ciphers$, - this.cipherService.localData$, - ).pipe( - runInsideAngular(inject(NgZone)), // Workaround to ensure cipher$ state provider emissions are run inside Angular - tap(() => this._ciphersLoading$.next()), - waitUntilSync(this.syncService), - switchMap(() => Utils.asyncToObservable(() => this.cipherService.getAllDecrypted())), - withLatestFrom(this.cipherService.failedToDecryptCiphers$), - map(([ciphers, failedToDecryptCiphers]) => [...failedToDecryptCiphers, ...ciphers]), + private _allDecryptedCiphers$: Observable = this.accountService.activeAccount$.pipe( + map((a) => a?.id), + filter((userId) => userId != null), + switchMap((userId) => + merge(this.cipherService.ciphers$(userId), this.cipherService.localData$(userId)).pipe( + runInsideAngular(this.ngZone), + tap(() => this._ciphersLoading$.next()), + waitUntilSync(this.syncService), + switchMap(() => Utils.asyncToObservable(() => this.cipherService.getAllDecrypted(userId))), + withLatestFrom(this.cipherService.failedToDecryptCiphers$(userId)), + map(([ciphers, failedToDecryptCiphers]) => [...failedToDecryptCiphers, ...ciphers]), + ), + ), shareReplay({ refCount: true, bufferSize: 1 }), ); @@ -281,6 +284,7 @@ export class VaultPopupItemsService { private vaultPopupAutofillService: VaultPopupAutofillService, private syncService: SyncService, private accountService: AccountService, + private ngZone: NgZone, ) {} applyFilter(newSearchText: string) { diff --git a/apps/browser/src/vault/popup/services/vault-popup-list-filters.service.spec.ts b/apps/browser/src/vault/popup/services/vault-popup-list-filters.service.spec.ts index 7f570e8f5c9..ec823d5738f 100644 --- a/apps/browser/src/vault/popup/services/vault-popup-list-filters.service.spec.ts +++ b/apps/browser/src/vault/popup/services/vault-popup-list-filters.service.spec.ts @@ -41,7 +41,7 @@ describe("VaultPopupListFiltersService", () => { } as unknown as FolderService; const cipherService = { - cipherViews$, + cipherViews$: () => cipherViews$, } as unknown as CipherService; const organizationService = { diff --git a/apps/browser/src/vault/popup/services/vault-popup-list-filters.service.ts b/apps/browser/src/vault/popup/services/vault-popup-list-filters.service.ts index 579319c92ab..b1451318499 100644 --- a/apps/browser/src/vault/popup/services/vault-popup-list-filters.service.ts +++ b/apps/browser/src/vault/popup/services/vault-popup-list-filters.service.ts @@ -93,16 +93,6 @@ export class VaultPopupListFiltersService { */ private cipherViews: CipherView[] = []; - /** - * Observable of cipher views - */ - private cipherViews$: Observable = this.cipherService.cipherViews$.pipe( - tap((cipherViews) => { - this.cipherViews = Object.values(cipherViews); - }), - map((ciphers) => Object.values(ciphers)), - ); - private activeUserId$ = this.accountService.activeAccount$.pipe(map((a) => a?.id)); constructor( @@ -271,8 +261,16 @@ export class VaultPopupListFiltersService { * Folder array structured to be directly passed to `ChipSelectComponent` */ folders$: Observable[]> = this.activeUserId$.pipe( - switchMap((userId) => - combineLatest([ + switchMap((userId) => { + // Observable of cipher views + const cipherViews$ = this.cipherService.cipherViews$(userId).pipe( + tap((cipherViews) => { + this.cipherViews = Object.values(cipherViews); + }), + map((ciphers) => Object.values(ciphers)), + ); + + return combineLatest([ this.filters$.pipe( distinctUntilChanged( (previousFilter, currentFilter) => @@ -281,7 +279,7 @@ export class VaultPopupListFiltersService { ), ), this.folderService.folderViews$(userId), - this.cipherViews$, + cipherViews$, ]).pipe( map(([filters, folders, cipherViews]): [PopupListFilter, FolderView[], CipherView[]] => { if (folders.length === 1 && folders[0].id === null) { @@ -330,8 +328,8 @@ export class VaultPopupListFiltersService { map((folders) => folders.nestedList.map((f) => this.convertToChipSelectOption(f, "bwi-folder")), ), - ), - ), + ); + }), ); /** diff --git a/apps/browser/src/vault/popup/settings/trash-list-items-container/trash-list-items-container.component.ts b/apps/browser/src/vault/popup/settings/trash-list-items-container/trash-list-items-container.component.ts index c56d1c7d10d..7e30ab26035 100644 --- a/apps/browser/src/vault/popup/settings/trash-list-items-container/trash-list-items-container.component.ts +++ b/apps/browser/src/vault/popup/settings/trash-list-items-container/trash-list-items-container.component.ts @@ -3,8 +3,11 @@ import { CommonModule } from "@angular/common"; import { ChangeDetectionStrategy, Component, Input } from "@angular/core"; import { Router } from "@angular/router"; +import { firstValueFrom } from "rxjs"; import { JslibModule } from "@bitwarden/angular/jslib.module"; +import { AccountService } from "@bitwarden/common/auth/abstractions/account.service"; +import { getUserId } from "@bitwarden/common/auth/services/account.service"; import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; import { LogService } from "@bitwarden/common/platform/abstractions/log.service"; import { CipherId } from "@bitwarden/common/types/guid"; @@ -65,6 +68,7 @@ export class TrashListItemsContainerComponent { private i18nService: I18nService, private dialogService: DialogService, private passwordRepromptService: PasswordRepromptService, + private accountService: AccountService, private router: Router, ) {} @@ -81,7 +85,8 @@ export class TrashListItemsContainerComponent { async restore(cipher: CipherView) { try { - await this.cipherService.restoreWithServer(cipher.id); + const activeUserId = await firstValueFrom(this.accountService.activeAccount$.pipe(getUserId)); + await this.cipherService.restoreWithServer(cipher.id, activeUserId); await this.router.navigate(["/trash"]); this.toastService.showToast({ @@ -112,7 +117,8 @@ export class TrashListItemsContainerComponent { } try { - await this.cipherService.deleteWithServer(cipher.id); + const activeUserId = await firstValueFrom(this.accountService.activeAccount$.pipe(getUserId)); + await this.cipherService.deleteWithServer(cipher.id, activeUserId); await this.router.navigate(["/trash"]); this.toastService.showToast({ diff --git a/apps/browser/store/locales/he/copy.resx b/apps/browser/store/locales/he/copy.resx index 7f366f0e931..383f0512cb4 100644 --- a/apps/browser/store/locales/he/copy.resx +++ b/apps/browser/store/locales/he/copy.resx @@ -118,10 +118,10 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - Bitwarden Password Manager + מנהל הסיסמאות Bitwarden - At home, at work, or on the go, Bitwarden easily secures all your passwords, passkeys, and sensitive information. + בבית, בעבודה, או בדרך, Bitwarden מאבטח בקלות את כל הסיסמאות, מפתחות הגישה, והמידע הרגיש שלך. Recognized as the best password manager by PCMag, WIRED, The Verge, CNET, G2, and more! @@ -169,7 +169,7 @@ End-to-end encrypted credential management solutions from Bitwarden empower orga - At home, at work, or on the go, Bitwarden easily secures all your passwords, passkeys, and sensitive information. + בבית, בעבודה, או בדרך, Bitwarden מאבטח בקלות את כל הסיסמאות, מפתחות הגישה, והמידע הרגיש שלך. סנכרון וגישה לכספת שלך ממגוון מכשירים diff --git a/apps/browser/store/locales/pt_PT/copy.resx b/apps/browser/store/locales/pt_PT/copy.resx index 65b81e2d2d4..fa62a0f1d5c 100644 --- a/apps/browser/store/locales/pt_PT/copy.resx +++ b/apps/browser/store/locales/pt_PT/copy.resx @@ -175,7 +175,7 @@ As soluções de gestão de credenciais encriptadas ponto a ponto do Bitwarden p Sincronize e aceda ao seu cofre através de vários dispositivos - Gira todas as suas credenciais e palavras-passe a partir de um cofre seguro + Faça a gestão de todas as suas credenciais e palavras-passe a partir de um cofre seguro Preencha rapidamente e de forma automática as suas credenciais de início de sessão em qualquer site que visite diff --git a/apps/browser/tsconfig.json b/apps/browser/tsconfig.json index 8055260db57..6b6096825a7 100644 --- a/apps/browser/tsconfig.json +++ b/apps/browser/tsconfig.json @@ -46,8 +46,7 @@ "useDefineForClassFields": false }, "angularCompilerOptions": { - "strictTemplates": true, - "preserveWhitespaces": true + "strictTemplates": true }, "include": [ "src", diff --git a/apps/browser/webpack.config.js b/apps/browser/webpack.config.js index ba60a577a71..a5fe6ed94fd 100644 --- a/apps/browser/webpack.config.js +++ b/apps/browser/webpack.config.js @@ -207,6 +207,7 @@ const mainConfig = { "./src/autofill/deprecated/overlay/pages/list/bootstrap-autofill-overlay-list.deprecated.ts", "encrypt-worker": "../../libs/common/src/key-management/crypto/services/encrypt.worker.ts", "content/send-on-installed-message": "./src/vault/content/send-on-installed-message.ts", + "content/send-popup-open-message": "./src/vault/content/send-popup-open-message.ts", }, optimization: { minimize: ENV !== "development", @@ -317,19 +318,21 @@ if (manifestVersion == 2) { configs.push(mainConfig); } else { - // Manifest v3 needs an extra helper for utilities in the content script. - // The javascript output of this should be added to manifest.v3.json - mainConfig.entry["content/misc-utils"] = "./src/autofill/content/misc-utils.ts"; - mainConfig.entry["offscreen-document/offscreen-document"] = - "./src/platform/offscreen-document/offscreen-document.ts"; + // Firefox does not use the offscreen API + if (browser !== "firefox") { + mainConfig.entry["offscreen-document/offscreen-document"] = + "./src/platform/offscreen-document/offscreen-document.ts"; - mainConfig.plugins.push( - new HtmlWebpackPlugin({ - template: "./src/platform/offscreen-document/index.html", - filename: "offscreen-document/index.html", - chunks: ["offscreen-document/offscreen-document"], - }), - ); + mainConfig.plugins.push( + new HtmlWebpackPlugin({ + template: "./src/platform/offscreen-document/index.html", + filename: "offscreen-document/index.html", + chunks: ["offscreen-document/offscreen-document"], + }), + ); + } + + const target = browser === "firefox" ? "web" : "webworker"; /** * @type {import("webpack").Configuration} @@ -339,7 +342,7 @@ if (manifestVersion == 2) { mode: ENV, devtool: false, entry: "./src/platform/background.ts", - target: "webworker", + target: target, output: { filename: "background.js", path: path.resolve(__dirname, "build"), diff --git a/apps/cli/package.json b/apps/cli/package.json index 391c9c80808..138405d1175 100644 --- a/apps/cli/package.json +++ b/apps/cli/package.json @@ -1,7 +1,7 @@ { "name": "@bitwarden/cli", "description": "A secure and free password manager for all of your devices.", - "version": "2025.1.3", + "version": "2025.2.0", "keywords": [ "bitwarden", "password", @@ -66,7 +66,7 @@ "form-data": "4.0.1", "https-proxy-agent": "7.0.5", "inquirer": "8.2.6", - "jsdom": "25.0.1", + "jsdom": "26.0.0", "jszip": "3.10.1", "koa": "2.15.3", "koa-bodyparser": "4.4.1", @@ -77,7 +77,7 @@ "node-fetch": "2.6.12", "node-forge": "1.3.1", "open": "8.4.2", - "papaparse": "5.4.1", + "papaparse": "5.5.2", "proper-lockfile": "4.1.2", "rxjs": "7.8.1", "tldts": "6.1.74", diff --git a/apps/cli/src/admin-console/commands/share.command.ts b/apps/cli/src/admin-console/commands/share.command.ts index e26d073326e..6d9e6c8b6c0 100644 --- a/apps/cli/src/admin-console/commands/share.command.ts +++ b/apps/cli/src/admin-console/commands/share.command.ts @@ -1,8 +1,9 @@ // FIXME: Update this file to be type safe and remove this and next line // @ts-strict-ignore -import { firstValueFrom, map } from "rxjs"; +import { firstValueFrom } from "rxjs"; import { AccountService } from "@bitwarden/common/auth/abstractions/account.service"; +import { getUserId } from "@bitwarden/common/auth/services/account.service"; import { CipherService } from "@bitwarden/common/vault/abstractions/cipher.service"; import { Response } from "../../models/response"; @@ -48,7 +49,9 @@ export class ShareCommand { organizationId = organizationId.toLowerCase(); } - const cipher = await this.cipherService.get(id); + const activeUserId = await firstValueFrom(this.accountService.activeAccount$.pipe(getUserId)); + + const cipher = await this.cipherService.get(id, activeUserId); if (cipher == null) { return Response.notFound(); } @@ -56,15 +59,12 @@ export class ShareCommand { return Response.badRequest("This item already belongs to an organization."); } - const activeUserId = await firstValueFrom( - this.accountService.activeAccount$.pipe(map((a) => a?.id)), - ); const cipherView = await cipher.decrypt( await this.cipherService.getKeyForCipherKeyDecryption(cipher, activeUserId), ); try { await this.cipherService.shareWithServer(cipherView, organizationId, req, activeUserId); - const updatedCipher = await this.cipherService.get(cipher.id); + const updatedCipher = await this.cipherService.get(cipher.id, activeUserId); const decCipher = await updatedCipher.decrypt( await this.cipherService.getKeyForCipherKeyDecryption(updatedCipher, activeUserId), ); diff --git a/apps/cli/src/commands/edit.command.ts b/apps/cli/src/commands/edit.command.ts index 9af28863c09..2d4a854135d 100644 --- a/apps/cli/src/commands/edit.command.ts +++ b/apps/cli/src/commands/edit.command.ts @@ -1,11 +1,12 @@ // FIXME: Update this file to be type safe and remove this and next line // @ts-strict-ignore -import { firstValueFrom, map } from "rxjs"; +import { firstValueFrom } from "rxjs"; import { CollectionRequest } from "@bitwarden/admin-console/common"; import { ApiService } from "@bitwarden/common/abstractions/api.service"; import { SelectionReadOnlyRequest } from "@bitwarden/common/admin-console/models/request/selection-read-only.request"; import { AccountService } from "@bitwarden/common/auth/abstractions/account.service"; +import { getUserId } from "@bitwarden/common/auth/services/account.service"; import { EncryptService } from "@bitwarden/common/key-management/crypto/abstractions/encrypt.service"; import { CipherExport } from "@bitwarden/common/models/export/cipher.export"; import { CollectionExport } from "@bitwarden/common/models/export/collection.export"; @@ -25,8 +26,6 @@ import { CipherResponse } from "../vault/models/cipher.response"; import { FolderResponse } from "../vault/models/folder.response"; export class EditCommand { - private activeUserId$ = this.accountService.activeAccount$.pipe(map((a) => a?.id)); - constructor( private cipherService: CipherService, private folderService: FolderService, @@ -85,14 +84,12 @@ export class EditCommand { } private async editCipher(id: string, req: CipherExport) { - const cipher = await this.cipherService.get(id); + const activeUserId = await firstValueFrom(this.accountService.activeAccount$.pipe(getUserId)); + const cipher = await this.cipherService.get(id, activeUserId); if (cipher == null) { return Response.notFound(); } - const activeUserId = await firstValueFrom( - this.accountService.activeAccount$.pipe(map((a) => a?.id)), - ); let cipherView = await cipher.decrypt( await this.cipherService.getKeyForCipherKeyDecryption(cipher, activeUserId), ); @@ -114,7 +111,9 @@ export class EditCommand { } private async editCipherCollections(id: string, req: string[]) { - const cipher = await this.cipherService.get(id); + const activeUserId = await firstValueFrom(this.accountService.activeAccount$.pipe(getUserId)); + + const cipher = await this.cipherService.get(id, activeUserId); if (cipher == null) { return Response.notFound(); } @@ -129,11 +128,14 @@ export class EditCommand { cipher.collectionIds = req; try { - const updatedCipher = await this.cipherService.saveCollectionsWithServer(cipher); + const updatedCipher = await this.cipherService.saveCollectionsWithServer( + cipher, + activeUserId, + ); const decCipher = await updatedCipher.decrypt( await this.cipherService.getKeyForCipherKeyDecryption( updatedCipher, - await firstValueFrom(this.activeUserId$), + await firstValueFrom(this.accountService.activeAccount$.pipe(getUserId)), ), ); const res = new CipherResponse(decCipher); @@ -144,7 +146,7 @@ export class EditCommand { } private async editFolder(id: string, req: FolderExport) { - const activeUserId = await firstValueFrom(this.activeUserId$); + const activeUserId = await firstValueFrom(this.accountService.activeAccount$.pipe(getUserId)); const folder = await this.folderService.getFromState(id, activeUserId); if (folder == null) { return Response.notFound(); diff --git a/apps/cli/src/commands/get.command.ts b/apps/cli/src/commands/get.command.ts index a90bfa64894..92c3a8baeaf 100644 --- a/apps/cli/src/commands/get.command.ts +++ b/apps/cli/src/commands/get.command.ts @@ -52,8 +52,6 @@ import { FolderResponse } from "../vault/models/folder.response"; import { DownloadCommand } from "./download.command"; export class GetCommand extends DownloadCommand { - private activeUserId$ = this.accountService.activeAccount$.pipe(map((a) => a?.id)); - constructor( private cipherService: CipherService, private folderService: FolderService, @@ -114,16 +112,16 @@ export class GetCommand extends DownloadCommand { private async getCipherView(id: string): Promise { let decCipher: CipherView = null; + const activeUserId = await firstValueFrom(this.accountService.activeAccount$.pipe(getUserId)); if (Utils.isGuid(id)) { - const cipher = await this.cipherService.get(id); + const cipher = await this.cipherService.get(id, activeUserId); if (cipher != null) { - const activeUserId = await firstValueFrom(this.activeUserId$); decCipher = await cipher.decrypt( await this.cipherService.getKeyForCipherKeyDecryption(cipher, activeUserId), ); } } else if (id.trim() !== "") { - let ciphers = await this.cipherService.getAllDecrypted(); + let ciphers = await this.cipherService.getAllDecrypted(activeUserId); ciphers = this.searchService.searchCiphersBasic(ciphers, id); if (ciphers.length > 1) { return ciphers; @@ -265,8 +263,10 @@ export class GetCommand extends DownloadCommand { const canAccessPremium = await firstValueFrom( this.accountProfileService.hasPremiumFromAnySource$(account.id), ); + if (!canAccessPremium) { - const originalCipher = await this.cipherService.get(cipher.id); + const activeUserId = await firstValueFrom(this.accountService.activeAccount$.pipe(getUserId)); + const originalCipher = await this.cipherService.get(cipher.id, activeUserId); if ( originalCipher == null || originalCipher.organizationId == null || @@ -352,7 +352,8 @@ export class GetCommand extends DownloadCommand { this.accountProfileService.hasPremiumFromAnySource$(account.id), ); if (!canAccessPremium) { - const originalCipher = await this.cipherService.get(cipher.id); + const activeUserId = await firstValueFrom(this.accountService.activeAccount$.pipe(getUserId)); + const originalCipher = await this.cipherService.get(cipher.id, activeUserId); if (originalCipher == null || originalCipher.organizationId == null) { return Response.error("Premium status is required to use this feature."); } @@ -384,7 +385,7 @@ export class GetCommand extends DownloadCommand { private async getFolder(id: string) { let decFolder: FolderView = null; - const activeUserId = await firstValueFrom(this.activeUserId$); + const activeUserId = await firstValueFrom(this.accountService.activeAccount$.pipe(getUserId)); if (Utils.isGuid(id)) { const folder = await this.folderService.getFromState(id, activeUserId); if (folder != null) { @@ -561,7 +562,7 @@ export class GetCommand extends DownloadCommand { private async getFingerprint(id: string) { let fingerprint: string[] = null; if (id === "me") { - const activeUserId = await firstValueFrom(this.activeUserId$); + const activeUserId = await firstValueFrom(this.accountService.activeAccount$.pipe(getUserId)); const publicKey = await firstValueFrom(this.keyService.userPublicKey$(activeUserId)); fingerprint = await this.keyService.getFingerprint(activeUserId, publicKey); } else if (Utils.isGuid(id)) { diff --git a/apps/cli/src/commands/list.command.ts b/apps/cli/src/commands/list.command.ts index 5e01af798a4..5d512d81bf5 100644 --- a/apps/cli/src/commands/list.command.ts +++ b/apps/cli/src/commands/list.command.ts @@ -65,11 +65,14 @@ export class ListCommand { private async listCiphers(options: Options) { let ciphers: CipherView[]; + + const activeUserId = await firstValueFrom(this.accountService.activeAccount$.pipe(getUserId)); + options.trash = options.trash || false; if (options.url != null && options.url.trim() !== "") { - ciphers = await this.cipherService.getAllDecryptedForUrl(options.url); + ciphers = await this.cipherService.getAllDecryptedForUrl(options.url, activeUserId); } else { - ciphers = await this.cipherService.getAllDecrypted(); + ciphers = await this.cipherService.getAllDecrypted(activeUserId); } if ( @@ -138,9 +141,8 @@ export class ListCommand { } private async listFolders(options: Options) { - const activeUserId = await firstValueFrom( - this.accountService.activeAccount$.pipe(map((a) => a?.id)), - ); + const activeUserId = await firstValueFrom(this.accountService.activeAccount$.pipe(getUserId)); + let folders = await this.folderService.getAllDecryptedFromState(activeUserId); if (options.search != null && options.search.trim() !== "") { diff --git a/apps/cli/src/commands/restore.command.ts b/apps/cli/src/commands/restore.command.ts index 96179e7b687..fd2f6f239ef 100644 --- a/apps/cli/src/commands/restore.command.ts +++ b/apps/cli/src/commands/restore.command.ts @@ -1,9 +1,16 @@ +import { firstValueFrom } from "rxjs"; + +import { AccountService } from "@bitwarden/common/auth/abstractions/account.service"; +import { getUserId } from "@bitwarden/common/auth/services/account.service"; import { CipherService } from "@bitwarden/common/vault/abstractions/cipher.service"; import { Response } from "../models/response"; export class RestoreCommand { - constructor(private cipherService: CipherService) {} + constructor( + private cipherService: CipherService, + private accountService: AccountService, + ) {} async run(object: string, id: string): Promise { if (id != null) { @@ -19,7 +26,9 @@ export class RestoreCommand { } private async restoreCipher(id: string) { - const cipher = await this.cipherService.get(id); + const activeUserId = await firstValueFrom(this.accountService.activeAccount$.pipe(getUserId)); + + const cipher = await this.cipherService.get(id, activeUserId); if (cipher == null) { return Response.notFound(); } @@ -28,7 +37,7 @@ export class RestoreCommand { } try { - await this.cipherService.restoreWithServer(id); + await this.cipherService.restoreWithServer(id, activeUserId); return Response.success(); } catch (e) { return Response.error(e); diff --git a/apps/cli/src/oss-serve-configurator.ts b/apps/cli/src/oss-serve-configurator.ts index be476d19814..dec09447839 100644 --- a/apps/cli/src/oss-serve-configurator.ts +++ b/apps/cli/src/oss-serve-configurator.ts @@ -124,7 +124,10 @@ export class OssServeConfigurator { this.serviceContainer.encryptService, this.serviceContainer.organizationUserApiService, ); - this.restoreCommand = new RestoreCommand(this.serviceContainer.cipherService); + this.restoreCommand = new RestoreCommand( + this.serviceContainer.cipherService, + this.serviceContainer.accountService, + ); this.shareCommand = new ShareCommand( this.serviceContainer.cipherService, this.serviceContainer.accountService, diff --git a/apps/cli/src/vault.program.ts b/apps/cli/src/vault.program.ts index f3eb6eef613..d6ef27b1428 100644 --- a/apps/cli/src/vault.program.ts +++ b/apps/cli/src/vault.program.ts @@ -347,7 +347,10 @@ export class VaultProgram extends BaseProgram { } await this.exitIfLocked(); - const command = new RestoreCommand(this.serviceContainer.cipherService); + const command = new RestoreCommand( + this.serviceContainer.cipherService, + this.serviceContainer.accountService, + ); const response = await command.run(object, id); this.processResponse(response); }); diff --git a/apps/cli/src/vault/create.command.ts b/apps/cli/src/vault/create.command.ts index 28f58187fdb..713471356c9 100644 --- a/apps/cli/src/vault/create.command.ts +++ b/apps/cli/src/vault/create.command.ts @@ -10,6 +10,7 @@ import { ApiService } from "@bitwarden/common/abstractions/api.service"; import { OrganizationService } from "@bitwarden/common/admin-console/abstractions/organization/organization.service.abstraction"; import { SelectionReadOnlyRequest } from "@bitwarden/common/admin-console/models/request/selection-read-only.request"; import { AccountService } from "@bitwarden/common/auth/abstractions/account.service"; +import { getUserId } from "@bitwarden/common/auth/services/account.service"; import { BillingAccountProfileStateService } from "@bitwarden/common/billing/abstractions/account/billing-account-profile-state.service"; import { EncryptService } from "@bitwarden/common/key-management/crypto/abstractions/encrypt.service"; import { CipherExport } from "@bitwarden/common/models/export/cipher.export"; @@ -30,8 +31,6 @@ import { CipherResponse } from "./models/cipher.response"; import { FolderResponse } from "./models/folder.response"; export class CreateCommand { - private activeUserId$ = this.accountService.activeAccount$.pipe(map((a) => a?.id)); - constructor( private cipherService: CipherService, private folderService: FolderService, @@ -90,7 +89,7 @@ export class CreateCommand { } private async createCipher(req: CipherExport) { - const activeUserId = await firstValueFrom(this.activeUserId$); + const activeUserId = await firstValueFrom(this.accountService.activeAccount$.pipe(getUserId)); const cipher = await this.cipherService.encrypt(CipherExport.toView(req), activeUserId); try { const newCipher = await this.cipherService.createWithServer(cipher); @@ -132,14 +131,14 @@ export class CreateCommand { return Response.badRequest("File name not provided."); } + const activeUserId = await firstValueFrom(this.accountService.activeAccount$.pipe(getUserId)); + const itemId = options.itemId.toLowerCase(); - const cipher = await this.cipherService.get(itemId); + const cipher = await this.cipherService.get(itemId, activeUserId); if (cipher == null) { return Response.notFound(); } - const activeUserId = await firstValueFrom(this.activeUserId$); - const canAccessPremium = await firstValueFrom( this.accountProfileService.hasPremiumFromAnySource$(activeUserId), ); @@ -173,7 +172,7 @@ export class CreateCommand { } private async createFolder(req: FolderExport) { - const activeUserId = await firstValueFrom(this.activeUserId$); + const activeUserId = await firstValueFrom(this.accountService.activeAccount$.pipe(getUserId)); const userKey = await this.keyService.getUserKeyWithLegacySupport(activeUserId); const folder = await this.folderService.encrypt(FolderExport.toView(req), userKey); try { diff --git a/apps/cli/src/vault/delete.command.ts b/apps/cli/src/vault/delete.command.ts index a285f8f5b34..9e648cd9bb0 100644 --- a/apps/cli/src/vault/delete.command.ts +++ b/apps/cli/src/vault/delete.command.ts @@ -1,7 +1,8 @@ -import { firstValueFrom, map } from "rxjs"; +import { firstValueFrom } from "rxjs"; import { ApiService } from "@bitwarden/common/abstractions/api.service"; import { AccountService } from "@bitwarden/common/auth/abstractions/account.service"; +import { getUserId } from "@bitwarden/common/auth/services/account.service"; import { BillingAccountProfileStateService } from "@bitwarden/common/billing/abstractions/account/billing-account-profile-state.service"; import { Utils } from "@bitwarden/common/platform/misc/utils"; import { CipherService } from "@bitwarden/common/vault/abstractions/cipher.service"; @@ -44,7 +45,9 @@ export class DeleteCommand { } private async deleteCipher(id: string, options: Options) { - const cipher = await this.cipherService.get(id); + const activeUserId = await firstValueFrom(this.accountService.activeAccount$.pipe(getUserId)); + + const cipher = await this.cipherService.get(id, activeUserId); if (cipher == null) { return Response.notFound(); } @@ -59,9 +62,9 @@ export class DeleteCommand { try { if (options.permanent) { - await this.cipherService.deleteWithServer(id); + await this.cipherService.deleteWithServer(id, activeUserId); } else { - await this.cipherService.softDeleteWithServer(id); + await this.cipherService.softDeleteWithServer(id, activeUserId); } return Response.success(); } catch (e) { @@ -74,8 +77,10 @@ export class DeleteCommand { return Response.badRequest("`itemid` option is required."); } + const activeUserId = await firstValueFrom(this.accountService.activeAccount$.pipe(getUserId)); + const itemId = options.itemId.toLowerCase(); - const cipher = await this.cipherService.get(itemId); + const cipher = await this.cipherService.get(itemId, activeUserId); if (cipher == null) { return Response.notFound(); } @@ -89,16 +94,19 @@ export class DeleteCommand { return Response.error("Attachment `" + id + "` was not found."); } - const account = await firstValueFrom(this.accountService.activeAccount$); const canAccessPremium = await firstValueFrom( - this.accountProfileService.hasPremiumFromAnySource$(account.id), + this.accountProfileService.hasPremiumFromAnySource$(activeUserId), ); if (cipher.organizationId == null && !canAccessPremium) { return Response.error("Premium status is required to use this feature."); } try { - await this.cipherService.deleteAttachmentWithServer(cipher.id, attachments[0].id); + await this.cipherService.deleteAttachmentWithServer( + cipher.id, + attachments[0].id, + activeUserId, + ); return Response.success(); } catch (e) { return Response.error(e); @@ -106,9 +114,7 @@ export class DeleteCommand { } private async deleteFolder(id: string) { - const activeUserId = await firstValueFrom( - this.accountService.activeAccount$.pipe(map((a) => a?.id)), - ); + const activeUserId = await firstValueFrom(this.accountService.activeAccount$.pipe(getUserId)); const folder = await this.folderService.getFromState(id, activeUserId); if (folder == null) { return Response.notFound(); diff --git a/apps/desktop/desktop_native/Cargo.lock b/apps/desktop/desktop_native/Cargo.lock index 1e1af53d531..1299a65f956 100644 --- a/apps/desktop/desktop_native/Cargo.lock +++ b/apps/desktop/desktop_native/Cargo.lock @@ -1690,9 +1690,9 @@ dependencies = [ [[package]] name = "napi" -version = "2.16.13" +version = "2.16.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "214f07a80874bb96a8433b3cdfc84980d56c7b02e1a0d7ba4ba0db5cef785e2b" +checksum = "d3437deb8b6ba2448b6a94260c5c6b9e5eeb5a5d6277e44b40b2532d457b0f0d" dependencies = [ "bitflags", "ctor", diff --git a/apps/desktop/desktop_native/napi/Cargo.toml b/apps/desktop/desktop_native/napi/Cargo.toml index c7ecc766e65..73afee72b55 100644 --- a/apps/desktop/desktop_native/napi/Cargo.toml +++ b/apps/desktop/desktop_native/napi/Cargo.toml @@ -18,7 +18,7 @@ base64 = "=0.22.1" hex = "=0.4.3" anyhow = "=1.0.94" desktop_core = { path = "../core" } -napi = { version = "=2.16.13", features = ["async"] } +napi = { version = "=2.16.15", features = ["async"] } napi-derive = "=2.16.13" serde = { workspace = true, features = ["derive"] } serde_json.workspace = true diff --git a/apps/desktop/package.json b/apps/desktop/package.json index 87d3ecbb4ca..992f218f6c6 100644 --- a/apps/desktop/package.json +++ b/apps/desktop/package.json @@ -1,7 +1,7 @@ { "name": "@bitwarden/desktop", "description": "A secure and free password manager for all of your devices.", - "version": "2025.2.0", + "version": "2025.2.2", "keywords": [ "bitwarden", "password", diff --git a/apps/desktop/src/app/accounts/settings.component.html b/apps/desktop/src/app/accounts/settings.component.html index 709506f576f..a47f938efd2 100644 --- a/apps/desktop/src/app/accounts/settings.component.html +++ b/apps/desktop/src/app/accounts/settings.component.html @@ -436,6 +436,23 @@ "enableSshAgentDesc" | i18n }} +
+
+ +
+ {{ + "allowScreenshotsDesc" | i18n + }} +
+ + `, }) export class AppComponent implements OnInit, OnDestroy { @@ -318,20 +320,6 @@ export class AppComponent implements OnInit, OnDestroy { } break; } - case "upgradeOrganization": { - const upgradeConfirmed = await this.dialogService.openSimpleDialog({ - title: { key: "upgradeOrganization" }, - content: { key: "upgradeOrganizationDesc" }, - acceptButtonText: { key: "learnMore" }, - type: "info", - }); - if (upgradeConfirmed) { - this.platformUtilsService.launchUri( - "https://bitwarden.com/help/upgrade-from-individual-to-org/", - ); - } - break; - } case "emailVerificationRequired": { const emailVerificationConfirmed = await this.dialogService.openSimpleDialog({ title: { key: "emailVerificationRequired" }, diff --git a/apps/desktop/src/app/app.module.ts b/apps/desktop/src/app/app.module.ts index c07a41d4b63..ca678621d51 100644 --- a/apps/desktop/src/app/app.module.ts +++ b/apps/desktop/src/app/app.module.ts @@ -15,7 +15,6 @@ import { DeleteAccountComponent } from "../auth/delete-account.component"; import { EnvironmentComponent } from "../auth/environment.component"; import { HintComponent } from "../auth/hint.component"; import { LoginModule } from "../auth/login/login.module"; -import { RegisterComponent } from "../auth/register.component"; import { RemovePasswordComponent } from "../auth/remove-password.component"; import { SetPasswordComponent } from "../auth/set-password.component"; import { SsoComponentV1 } from "../auth/sso-v1.component"; @@ -80,7 +79,6 @@ import { SendComponent } from "./tools/send/send.component"; NavComponent, PasswordHistoryComponent, PremiumComponent, - RegisterComponent, RemovePasswordComponent, SearchComponent, SendAddEditComponent, diff --git a/apps/desktop/src/app/layout/account-switcher.component.html b/apps/desktop/src/app/layout/account-switcher.component.html index db40da41cba..ef177ea1bb6 100644 --- a/apps/desktop/src/app/layout/account-switcher.component.html +++ b/apps/desktop/src/app/layout/account-switcher.component.html @@ -76,12 +76,10 @@ >
{{ "switchAccount" | i18n }}:  - - - + / {{ account.value.server }} + +  ({{ (account.value.authenticationStatus === authStatus.Unlocked ? "unlocked" : "locked") | i18n diff --git a/apps/desktop/src/app/main.ts b/apps/desktop/src/app/main.ts index 287d66795d2..ba964177dbc 100644 --- a/apps/desktop/src/app/main.ts +++ b/apps/desktop/src/app/main.ts @@ -12,9 +12,7 @@ if (!ipc.platform.isDev) { enableProdMode(); } -// 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 -platformBrowserDynamic().bootstrapModule(AppModule, { preserveWhitespaces: true }); +void platformBrowserDynamic().bootstrapModule(AppModule); // Disable drag and drop to prevent malicious links from executing in the context of the app document.addEventListener("dragover", (event) => event.preventDefault()); diff --git a/apps/desktop/src/auth/register.component.html b/apps/desktop/src/auth/register.component.html deleted file mode 100644 index 9f76b9b2a4d..00000000000 --- a/apps/desktop/src/auth/register.component.html +++ /dev/null @@ -1,150 +0,0 @@ -
-
-

{{ "createAccount" | i18n }}

-
-
-
- - -
-
-
-
- - -
-
- -
-
- - -
-
- -
-
-
-
-
- - -
-
- -
-
-
- - -
-
-
-
- - -
-
-
-
- -
- -
- - -
-
- - -
-
-
diff --git a/apps/desktop/src/auth/register.component.ts b/apps/desktop/src/auth/register.component.ts deleted file mode 100644 index ee3510b0f58..00000000000 --- a/apps/desktop/src/auth/register.component.ts +++ /dev/null @@ -1,83 +0,0 @@ -import { Component, NgZone, OnDestroy, OnInit } from "@angular/core"; -import { UntypedFormBuilder } from "@angular/forms"; -import { Router } from "@angular/router"; - -import { RegisterComponent as BaseRegisterComponent } from "@bitwarden/angular/auth/components/register.component"; -import { FormValidationErrorsService } from "@bitwarden/angular/platform/abstractions/form-validation-errors.service"; -import { LoginStrategyServiceAbstraction } from "@bitwarden/auth/common"; -import { ApiService } from "@bitwarden/common/abstractions/api.service"; -import { AuditService } from "@bitwarden/common/abstractions/audit.service"; -import { BroadcasterService } from "@bitwarden/common/platform/abstractions/broadcaster.service"; -import { EnvironmentService } from "@bitwarden/common/platform/abstractions/environment.service"; -import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; -import { LogService } from "@bitwarden/common/platform/abstractions/log.service"; -import { PlatformUtilsService } from "@bitwarden/common/platform/abstractions/platform-utils.service"; -import { DialogService, ToastService } from "@bitwarden/components"; -import { KeyService } from "@bitwarden/key-management"; - -const BroadcasterSubscriptionId = "RegisterComponent"; - -@Component({ - selector: "app-register", - templateUrl: "register.component.html", -}) -export class RegisterComponent extends BaseRegisterComponent implements OnInit, OnDestroy { - constructor( - formValidationErrorService: FormValidationErrorsService, - formBuilder: UntypedFormBuilder, - loginStrategyService: LoginStrategyServiceAbstraction, - router: Router, - i18nService: I18nService, - keyService: KeyService, - apiService: ApiService, - platformUtilsService: PlatformUtilsService, - environmentService: EnvironmentService, - private broadcasterService: BroadcasterService, - private ngZone: NgZone, - logService: LogService, - auditService: AuditService, - dialogService: DialogService, - toastService: ToastService, - ) { - super( - formValidationErrorService, - formBuilder, - loginStrategyService, - router, - i18nService, - keyService, - apiService, - platformUtilsService, - environmentService, - logService, - auditService, - dialogService, - toastService, - ); - } - - async ngOnInit() { - this.broadcasterService.subscribe(BroadcasterSubscriptionId, async (message: any) => { - this.ngZone.run(() => { - switch (message.command) { - case "windowHidden": - this.onWindowHidden(); - break; - default: - } - }); - }); - - // FIXME: Verify that this floating promise is intentional. If it is, add an explanatory comment and ensure there is proper error handling. - // eslint-disable-next-line @typescript-eslint/no-floating-promises - super.ngOnInit(); - } - - ngOnDestroy() { - this.broadcasterService.unsubscribe(BroadcasterSubscriptionId); - } - - onWindowHidden() { - this.showPassword = false; - } -} diff --git a/apps/desktop/src/autofill/services/desktop-autofill.service.ts b/apps/desktop/src/autofill/services/desktop-autofill.service.ts index 1ce58596b34..2ed5a649997 100644 --- a/apps/desktop/src/autofill/services/desktop-autofill.service.ts +++ b/apps/desktop/src/autofill/services/desktop-autofill.service.ts @@ -4,6 +4,7 @@ import { EMPTY, Subject, distinctUntilChanged, + filter, firstValueFrom, map, mergeMap, @@ -12,6 +13,7 @@ import { } from "rxjs"; import { AccountService } from "@bitwarden/common/auth/abstractions/account.service"; +import { getOptionalUserId } from "@bitwarden/common/auth/services/account.service"; import { FeatureFlag } from "@bitwarden/common/enums/feature-flag.enum"; import { UriMatchStrategy } from "@bitwarden/common/models/domain/domain-service"; import { ConfigService } from "@bitwarden/common/platform/abstractions/config/config.service"; @@ -27,6 +29,7 @@ import { Utils } from "@bitwarden/common/platform/misc/utils"; import { getCredentialsForAutofill } from "@bitwarden/common/platform/services/fido2/fido2-autofill-utils"; import { Fido2Utils } from "@bitwarden/common/platform/services/fido2/fido2-utils"; import { guidToRawFormat } from "@bitwarden/common/platform/services/fido2/guid-utils"; +import { UserId } from "@bitwarden/common/types/guid"; import { CipherService } from "@bitwarden/common/vault/abstractions/cipher.service"; import { CipherType } from "@bitwarden/common/vault/enums"; import { CipherView } from "@bitwarden/common/vault/models/view/cipher.view"; @@ -60,7 +63,11 @@ export class DesktopAutofillService implements OnDestroy { return EMPTY; } - return this.cipherService.cipherViews$; + return this.accountService.activeAccount$.pipe( + map((account) => account?.id), + filter((userId): userId is UserId => userId != null), + switchMap((userId) => this.cipherService.cipherViews$(userId)), + ); }), // TODO: This will unset all the autofill credentials on the OS // when the account locks. We should instead explicilty clear the credentials @@ -164,17 +171,22 @@ export class DesktopAutofillService implements OnDestroy { // TODO: For some reason the credentialId is passed as an empty array in the request, so we need to // get it from the cipher. For that we use the recordIdentifier, which is the cipherId. if (request.recordIdentifier && request.credentialId.length === 0) { - const cipher = await this.cipherService.get(request.recordIdentifier); + const activeUserId = await firstValueFrom( + this.accountService.activeAccount$.pipe(getOptionalUserId), + ); + if (!activeUserId) { + this.logService.error("listenPasskeyAssertion error", "Active user not found"); + callback(new Error("Active user not found"), null); + return; + } + + const cipher = await this.cipherService.get(request.recordIdentifier, activeUserId); if (!cipher) { this.logService.error("listenPasskeyAssertion error", "Cipher not found"); callback(new Error("Cipher not found"), null); return; } - const activeUserId = await firstValueFrom( - this.accountService.activeAccount$.pipe(map((a) => a?.id)), - ); - const decrypted = await cipher.decrypt( await this.cipherService.getKeyForCipherKeyDecryption(cipher, activeUserId), ); diff --git a/apps/desktop/src/key-management/biometrics/main-biometrics-ipc.listener.ts b/apps/desktop/src/key-management/biometrics/main-biometrics-ipc.listener.ts index eebafd8d48b..1605f650e12 100644 --- a/apps/desktop/src/key-management/biometrics/main-biometrics-ipc.listener.ts +++ b/apps/desktop/src/key-management/biometrics/main-biometrics-ipc.listener.ts @@ -32,6 +32,9 @@ export class MainBiometricsIPCListener { case BiometricAction.GetStatusForUser: return await this.biometricService.getBiometricsStatusForUser(message.userId as UserId); case BiometricAction.SetKeyForUser: + if (message.key == null) { + return; + } return await this.biometricService.setBiometricProtectedUnlockKeyForUser( message.userId as UserId, message.key, @@ -41,6 +44,9 @@ export class MainBiometricsIPCListener { message.userId as UserId, ); case BiometricAction.SetClientKeyHalf: + if (message.key == null) { + return; + } return await this.biometricService.setClientKeyHalfForUser( message.userId as UserId, message.key, diff --git a/apps/desktop/src/key-management/biometrics/main-biometrics.service.ts b/apps/desktop/src/key-management/biometrics/main-biometrics.service.ts index d0ba66fdad4..013e69f118c 100644 --- a/apps/desktop/src/key-management/biometrics/main-biometrics.service.ts +++ b/apps/desktop/src/key-management/biometrics/main-biometrics.service.ts @@ -25,10 +25,6 @@ export class MainBiometricsService extends DesktopBiometricsService { private biometricStateService: BiometricStateService, ) { super(); - this.loadOsBiometricService(this.platform); - } - - private loadOsBiometricService(platform: NodeJS.Platform) { if (platform === "win32") { // eslint-disable-next-line const OsBiometricsServiceWindows = require("./os-biometrics-windows.service").default; @@ -117,13 +113,16 @@ export class MainBiometricsService extends DesktopBiometricsService { } async unlockWithBiometricsForUser(userId: UserId): Promise { - return SymmetricCryptoKey.fromString( - await this.osBiometricsService.getBiometricKey( - "Bitwarden_biometric", - `${userId}_user_biometric`, - this.clientKeyHalves.get(userId), - ), - ) as UserKey; + const biometricKey = await this.osBiometricsService.getBiometricKey( + "Bitwarden_biometric", + `${userId}_user_biometric`, + this.clientKeyHalves.get(userId), + ); + if (biometricKey == null) { + return null; + } + + return SymmetricCryptoKey.fromString(biometricKey) as UserKey; } async setBiometricProtectedUnlockKeyForUser(userId: UserId, value: string): Promise { diff --git a/apps/desktop/src/key-management/biometrics/os-biometrics-linux.service.ts b/apps/desktop/src/key-management/biometrics/os-biometrics-linux.service.ts index 791b4d6f885..fb150f2a653 100644 --- a/apps/desktop/src/key-management/biometrics/os-biometrics-linux.service.ts +++ b/apps/desktop/src/key-management/biometrics/os-biometrics-linux.service.ts @@ -1,5 +1,3 @@ -// FIXME: Update this file to be type safe and remove this and next line -// @ts-strict-ignore import { spawn } from "child_process"; import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; @@ -138,23 +136,27 @@ export default class OsBiometricsServiceLinux implements OsBiometricService { // Nulls out key material in order to force a re-derive. This should only be used in getBiometricKey // when we want to force a re-derive of the key material. - private setIv(iv: string) { - this._iv = iv; + private setIv(iv?: string) { + this._iv = iv ?? null; this._osKeyHalf = null; } private async getStorageDetails({ clientKeyHalfB64, }: { - clientKeyHalfB64: string; + clientKeyHalfB64: string | undefined; }): Promise<{ key_material: biometrics.KeyMaterial; ivB64: string }> { if (this._osKeyHalf == null) { const keyMaterial = await biometrics.deriveKeyMaterial(this._iv); - // osKeyHalf is based on the iv and in contrast to windows is not locked behind user verefication! + // osKeyHalf is based on the iv and in contrast to windows is not locked behind user verification! this._osKeyHalf = keyMaterial.keyB64; this._iv = keyMaterial.ivB64; } + if (this._iv == null) { + throw new Error("Initialization Vector is null"); + } + return { key_material: { osKeyPartB64: this._osKeyHalf, diff --git a/apps/desktop/src/key-management/biometrics/os-biometrics-windows.service.ts b/apps/desktop/src/key-management/biometrics/os-biometrics-windows.service.ts index 9643c2b6f15..cd8c94329bc 100644 --- a/apps/desktop/src/key-management/biometrics/os-biometrics-windows.service.ts +++ b/apps/desktop/src/key-management/biometrics/os-biometrics-windows.service.ts @@ -1,5 +1,3 @@ -// FIXME: Update this file to be type safe and remove this and next line -// @ts-strict-ignore import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; import { LogService } from "@bitwarden/common/platform/abstractions/log.service"; import { EncString } from "@bitwarden/common/platform/models/domain/enc-string"; @@ -104,7 +102,7 @@ export default class OsBiometricsServiceWindows implements OsBiometricService { private async getStorageDetails({ clientKeyHalfB64, }: { - clientKeyHalfB64: string; + clientKeyHalfB64: string | undefined; }): Promise<{ key_material: biometrics.KeyMaterial; ivB64: string }> { if (this._osKeyHalf == null) { // Prompts Windows Hello @@ -113,6 +111,10 @@ export default class OsBiometricsServiceWindows implements OsBiometricService { this._iv = keyMaterial.ivB64; } + if (this._iv == null) { + throw new Error("Initialization Vector is null"); + } + const result = { key_material: { osKeyPartB64: this._osKeyHalf, @@ -130,8 +132,8 @@ export default class OsBiometricsServiceWindows implements OsBiometricService { // Nulls out key material in order to force a re-derive. This should only be used in getBiometricKey // when we want to force a re-derive of the key material. - private setIv(iv: string) { - this._iv = iv; + private setIv(iv?: string) { + this._iv = iv ?? null; this._osKeyHalf = null; } @@ -149,9 +151,9 @@ export default class OsBiometricsServiceWindows implements OsBiometricService { encryptedValue: EncString, service: string, storageKey: string, - clientKeyPartB64: string, + clientKeyPartB64: string | undefined, ) { - if (encryptedValue.iv == null || encryptedValue == null) { + if (encryptedValue.iv == null) { return; } @@ -183,7 +185,7 @@ export default class OsBiometricsServiceWindows implements OsBiometricService { storageKey, }: { value: SymmetricCryptoKey; - clientKeyPartB64: string; + clientKeyPartB64: string | undefined; service: string; storageKey: string; }): Promise { @@ -214,7 +216,7 @@ export default class OsBiometricsServiceWindows implements OsBiometricService { /** Derives a witness key from a symmetric key being stored for biometric protection */ private witnessKeyMaterial( symmetricKey: SymmetricCryptoKey, - clientKeyPartB64: string, + clientKeyPartB64: string | undefined, ): biometrics.KeyMaterial { const key = symmetricKey?.macKeyB64 ?? symmetricKey?.keyB64; diff --git a/apps/desktop/src/locales/af/messages.json b/apps/desktop/src/locales/af/messages.json index 6ad5cd63127..aa36987bb82 100644 --- a/apps/desktop/src/locales/af/messages.json +++ b/apps/desktop/src/locales/af/messages.json @@ -2745,14 +2745,23 @@ "loginInitiated": { "message": "Login initiated" }, + "logInRequestSent": { + "message": "Request sent" + }, "notificationSentDevice": { "message": "'n Kennisgewing was na jou toestel gestuur." }, "aNotificationWasSentToYourDevice": { "message": "A notification was sent to your device" }, - "makeSureYourAccountIsUnlockedAndTheFingerprintEtc": { - "message": "Make sure your account is unlocked and the fingerprint phrase matches on the other device" + "notificationSentDevicePart1": { + "message": "Unlock Bitwarden on your device or on the " + }, + "notificationSentDeviceAnchor": { + "message": "web app" + }, + "notificationSentDevicePart2": { + "message": "Make sure the Fingerprint phrase matches the one below before approving." }, "needAnotherOptionV1": { "message": "Need another option?" @@ -2782,11 +2791,11 @@ "message": "Tokkel karakter telling", "description": "'Character count' describes a feature that displays a number next to each character of the password." }, - "areYouTryingtoLogin": { - "message": "Probeer jy om aan te teken?" + "areYouTryingToAccessYourAccount": { + "message": "Are you trying to access your account?" }, - "logInAttemptBy": { - "message": "Aantekenings poging deur $EMAIL$", + "accessAttemptBy": { + "message": "Access attempt by $EMAIL$", "placeholders": { "email": { "content": "$1", @@ -2803,11 +2812,11 @@ "time": { "message": "Tyd" }, - "confirmLogIn": { - "message": "Bevestig aantekening" + "confirmAccess": { + "message": "Confirm access" }, - "denyLogIn": { - "message": "Weier aantekening" + "denyAccess": { + "message": "Deny access" }, "logInConfirmedForEmailOnDevice": { "message": "Aantekening gebevestig vir $EMAIL$ op $DEVICE$", @@ -2843,8 +2852,8 @@ "thisRequestIsNoLongerValid": { "message": "Hierdie versoek is nie meer geldig nie." }, - "confirmLoginAtemptForMail": { - "message": "Bevestig aantekenings poging vir $EMAIL$", + "confirmAccessAttempt": { + "message": "Confirm access attempt for $EMAIL$", "placeholders": { "email": { "content": "$1", @@ -2855,6 +2864,9 @@ "logInRequested": { "message": "Aan teken versoek" }, + "accountAccessRequested": { + "message": "Account access requested" + }, "creatingAccountOn": { "message": "Creating account on" }, @@ -3484,14 +3496,17 @@ "changeAcctEmail": { "message": "Change account email" }, - "organizationUpgradeRequired": { - "message": "Organization upgrade required" + "allowScreenshots": { + "message": "Allow screen capture" }, - "upgradeOrganization": { - "message": "Upgrade organization" + "allowScreenshotsDesc": { + "message": "Allow the Bitwarden desktop application to be captured in screenshots and viewed in remote desktop sessions. Disabling this will prevent access on some external displays." }, - "upgradeOrganizationDesc": { - "message": "This feature is not available for free organizations. Switch to a paid plan to unlock more features." + "confirmWindowStillVisibleTitle": { + "message": "Confirm window still visible" + }, + "confirmWindowStillVisibleContent": { + "message": "Please confirm that the window is still visible." }, "updateBrowserOrDisableFingerprintDialogTitle": { "message": "Extension update required" diff --git a/apps/desktop/src/locales/ar/messages.json b/apps/desktop/src/locales/ar/messages.json index a10b438ad34..ae4667fa98c 100644 --- a/apps/desktop/src/locales/ar/messages.json +++ b/apps/desktop/src/locales/ar/messages.json @@ -2745,14 +2745,23 @@ "loginInitiated": { "message": "بَدْء تسجيل الدخول" }, + "logInRequestSent": { + "message": "Request sent" + }, "notificationSentDevice": { "message": "تم إرسال إشعار إلى جهازك." }, "aNotificationWasSentToYourDevice": { "message": "أُرسل إشعار إلى جهازك" }, - "makeSureYourAccountIsUnlockedAndTheFingerprintEtc": { - "message": "تيقن من أن حسابك مفتوح وأن عبارة البصمة متطابقة على الجهاز الآخر" + "notificationSentDevicePart1": { + "message": "Unlock Bitwarden on your device or on the " + }, + "notificationSentDeviceAnchor": { + "message": "web app" + }, + "notificationSentDevicePart2": { + "message": "Make sure the Fingerprint phrase matches the one below before approving." }, "needAnotherOptionV1": { "message": "هل تحتاج إلى خيار آخر؟" @@ -2782,11 +2791,11 @@ "message": "تبديل عدد الأحرف", "description": "'Character count' describes a feature that displays a number next to each character of the password." }, - "areYouTryingtoLogin": { - "message": "هل تحاول تسجيل الدخول؟" + "areYouTryingToAccessYourAccount": { + "message": "Are you trying to access your account?" }, - "logInAttemptBy": { - "message": "محاولة تسجيل الدخول بواسطة $EMAIL$", + "accessAttemptBy": { + "message": "Access attempt by $EMAIL$", "placeholders": { "email": { "content": "$1", @@ -2803,11 +2812,11 @@ "time": { "message": "الوقت" }, - "confirmLogIn": { - "message": "تأكيد تسجيل الدخول" + "confirmAccess": { + "message": "Confirm access" }, - "denyLogIn": { - "message": "رفض تسجيل الدخول" + "denyAccess": { + "message": "Deny access" }, "logInConfirmedForEmailOnDevice": { "message": "تم تأكيد تسجيل الدخول لـ $EMAIL$ في $DEVICE$", @@ -2843,8 +2852,8 @@ "thisRequestIsNoLongerValid": { "message": "هذا الطلب لم يعد صالحًا." }, - "confirmLoginAtemptForMail": { - "message": "تأكيد محاولة تسجيل الدخول لـ $EMAIL$", + "confirmAccessAttempt": { + "message": "Confirm access attempt for $EMAIL$", "placeholders": { "email": { "content": "$1", @@ -2855,6 +2864,9 @@ "logInRequested": { "message": "طلب تسجيل الدخول" }, + "accountAccessRequested": { + "message": "Account access requested" + }, "creatingAccountOn": { "message": "إنشاء الحساب في" }, @@ -3484,14 +3496,17 @@ "changeAcctEmail": { "message": "تغيير البريد الإلكتروني الخاص بالحساب" }, - "organizationUpgradeRequired": { - "message": "Organization upgrade required" + "allowScreenshots": { + "message": "Allow screen capture" }, - "upgradeOrganization": { - "message": "Upgrade organization" + "allowScreenshotsDesc": { + "message": "Allow the Bitwarden desktop application to be captured in screenshots and viewed in remote desktop sessions. Disabling this will prevent access on some external displays." }, - "upgradeOrganizationDesc": { - "message": "This feature is not available for free organizations. Switch to a paid plan to unlock more features." + "confirmWindowStillVisibleTitle": { + "message": "Confirm window still visible" + }, + "confirmWindowStillVisibleContent": { + "message": "Please confirm that the window is still visible." }, "updateBrowserOrDisableFingerprintDialogTitle": { "message": "Extension update required" diff --git a/apps/desktop/src/locales/az/messages.json b/apps/desktop/src/locales/az/messages.json index 9e4a9915047..409bdf038b4 100644 --- a/apps/desktop/src/locales/az/messages.json +++ b/apps/desktop/src/locales/az/messages.json @@ -2745,14 +2745,23 @@ "loginInitiated": { "message": "Giriş başladıldı" }, + "logInRequestSent": { + "message": "Tələb göndərildi" + }, "notificationSentDevice": { "message": "Cihazınıza bir bildiriş göndərildi." }, "aNotificationWasSentToYourDevice": { "message": "Cihazınıza bir bildiriş göndərildi" }, - "makeSureYourAccountIsUnlockedAndTheFingerprintEtc": { - "message": "Lütfən hesabınızın kilidinin açıq olduğuna və barmaq izi ifadəsinin digər cihazla uyuşduğuna əmin olun" + "notificationSentDevicePart1": { + "message": "Cihazınızda Bitwarden kilidini açın, ya da " + }, + "notificationSentDeviceAnchor": { + "message": "veb tətbiqinizdə" + }, + "notificationSentDevicePart2": { + "message": "Təsdiqləməzdən əvvəl Barmaq izi ifadəsinin aşağıdakı ifadə ilə uyuşduğuna əmin olun." }, "needAnotherOptionV1": { "message": "Başqa bir seçimə ehtiyacınız var?" @@ -2782,11 +2791,11 @@ "message": "Simvol sayını dəyişdir", "description": "'Character count' describes a feature that displays a number next to each character of the password." }, - "areYouTryingtoLogin": { - "message": "Giriş etməyə çalışırsınız?" + "areYouTryingToAccessYourAccount": { + "message": "Hesabınıza müraciət etməyə çalışırsınız?" }, - "logInAttemptBy": { - "message": "$EMAIL$ tərəfindən giriş cəhdi", + "accessAttemptBy": { + "message": "$EMAIL$ ilə müraciət cəhdi", "placeholders": { "email": { "content": "$1", @@ -2803,11 +2812,11 @@ "time": { "message": "Vaxt" }, - "confirmLogIn": { - "message": "Girişi təsdiqlə" + "confirmAccess": { + "message": "Müraciəti təsdiqlə" }, - "denyLogIn": { - "message": "Girişi rədd et" + "denyAccess": { + "message": "Müraciətə rədd cavabı ver" }, "logInConfirmedForEmailOnDevice": { "message": "$DEVICE$ cihazında $EMAIL$ üçün giriş təsdiqləndi", @@ -2843,8 +2852,8 @@ "thisRequestIsNoLongerValid": { "message": "Bu tələb artıq yararsızdır." }, - "confirmLoginAtemptForMail": { - "message": "$EMAIL$ üçün giriş cəhdini təsdiqlə", + "confirmAccessAttempt": { + "message": "$EMAIL$ üçün müraciət cəhdini təsdiqlə", "placeholders": { "email": { "content": "$1", @@ -2855,6 +2864,9 @@ "logInRequested": { "message": "Giriş tələb olundu" }, + "accountAccessRequested": { + "message": "Tələb olunan hesaba müraciət" + }, "creatingAccountOn": { "message": "Hesab yaradılır" }, @@ -3484,14 +3496,17 @@ "changeAcctEmail": { "message": "Hesabın e-poçtunu dəyişdir" }, - "organizationUpgradeRequired": { - "message": "Təşkilat yüksəltmə tələb olunur" + "allowScreenshots": { + "message": "Ekranı çəkməyə icazə ver" }, - "upgradeOrganization": { - "message": "Təşkilatı yüksəlt" + "allowScreenshotsDesc": { + "message": "Bitwarden masaüstü tətbiqinin ekran şəkillərində yaxalanmasına və remote desktop sessiyalarında görünməsinə icazə verin. Bunu sıradan çıxartsanız, bəzi xarici ekranlarda müraciət əngəllənəcək." }, - "upgradeOrganizationDesc": { - "message": "Bu özəllik, ödənişsiz təşkilatlar üçün əlçatan deyil. Daha çox özəlliyin kilidini açmaq üçün ödənişli plana keçin." + "confirmWindowStillVisibleTitle": { + "message": "Pəncərənin hələ də göründüyünü təsdiqlə" + }, + "confirmWindowStillVisibleContent": { + "message": "Lütfən, pəncərənin hələ də göründüyünü təsdiqləyin." }, "updateBrowserOrDisableFingerprintDialogTitle": { "message": "Uzantını güncəlləmək tələb olunur" diff --git a/apps/desktop/src/locales/be/messages.json b/apps/desktop/src/locales/be/messages.json index 607281399be..7eb27fc3494 100644 --- a/apps/desktop/src/locales/be/messages.json +++ b/apps/desktop/src/locales/be/messages.json @@ -2745,14 +2745,23 @@ "loginInitiated": { "message": "Ініцыяваны ўваход" }, + "logInRequestSent": { + "message": "Request sent" + }, "notificationSentDevice": { "message": "Апавяшчэнне было адпраўлена на вашу прыладу." }, "aNotificationWasSentToYourDevice": { "message": "A notification was sent to your device" }, - "makeSureYourAccountIsUnlockedAndTheFingerprintEtc": { - "message": "Make sure your account is unlocked and the fingerprint phrase matches on the other device" + "notificationSentDevicePart1": { + "message": "Unlock Bitwarden on your device or on the " + }, + "notificationSentDeviceAnchor": { + "message": "web app" + }, + "notificationSentDevicePart2": { + "message": "Make sure the Fingerprint phrase matches the one below before approving." }, "needAnotherOptionV1": { "message": "Need another option?" @@ -2782,11 +2791,11 @@ "message": "Пераключыць лічыльнік сімвалаў", "description": "'Character count' describes a feature that displays a number next to each character of the password." }, - "areYouTryingtoLogin": { - "message": "Вы спрабуеце ўвайсці?" + "areYouTryingToAccessYourAccount": { + "message": "Are you trying to access your account?" }, - "logInAttemptBy": { - "message": "Спроба ўваходу $EMAIL$", + "accessAttemptBy": { + "message": "Access attempt by $EMAIL$", "placeholders": { "email": { "content": "$1", @@ -2803,11 +2812,11 @@ "time": { "message": "Час" }, - "confirmLogIn": { - "message": "Пацвердзіць уваход" + "confirmAccess": { + "message": "Confirm access" }, - "denyLogIn": { - "message": "Адхіліць уваход" + "denyAccess": { + "message": "Deny access" }, "logInConfirmedForEmailOnDevice": { "message": "Уваход пацверджаны для $EMAIL$ на $DEVICE$", @@ -2843,8 +2852,8 @@ "thisRequestIsNoLongerValid": { "message": "Гэты запыт больш не дзейнічае." }, - "confirmLoginAtemptForMail": { - "message": "Пацвердзіць спробу ўваходу для $EMAIL$", + "confirmAccessAttempt": { + "message": "Confirm access attempt for $EMAIL$", "placeholders": { "email": { "content": "$1", @@ -2855,6 +2864,9 @@ "logInRequested": { "message": "Запытаны ўваход" }, + "accountAccessRequested": { + "message": "Account access requested" + }, "creatingAccountOn": { "message": "Creating account on" }, @@ -3484,14 +3496,17 @@ "changeAcctEmail": { "message": "Change account email" }, - "organizationUpgradeRequired": { - "message": "Organization upgrade required" + "allowScreenshots": { + "message": "Allow screen capture" }, - "upgradeOrganization": { - "message": "Upgrade organization" + "allowScreenshotsDesc": { + "message": "Allow the Bitwarden desktop application to be captured in screenshots and viewed in remote desktop sessions. Disabling this will prevent access on some external displays." }, - "upgradeOrganizationDesc": { - "message": "This feature is not available for free organizations. Switch to a paid plan to unlock more features." + "confirmWindowStillVisibleTitle": { + "message": "Confirm window still visible" + }, + "confirmWindowStillVisibleContent": { + "message": "Please confirm that the window is still visible." }, "updateBrowserOrDisableFingerprintDialogTitle": { "message": "Extension update required" diff --git a/apps/desktop/src/locales/bg/messages.json b/apps/desktop/src/locales/bg/messages.json index be627b37274..1fe796a9a9f 100644 --- a/apps/desktop/src/locales/bg/messages.json +++ b/apps/desktop/src/locales/bg/messages.json @@ -2745,14 +2745,23 @@ "loginInitiated": { "message": "Вписването е стартирано" }, + "logInRequestSent": { + "message": "Заявката е изпратена" + }, "notificationSentDevice": { "message": "Към устройството Ви е изпратено известие." }, "aNotificationWasSentToYourDevice": { "message": "Към устройството Ви е изпратено известие" }, - "makeSureYourAccountIsUnlockedAndTheFingerprintEtc": { - "message": "Уверете се, че регистрацията Ви е отключена и че уникалната фраза съвпада с другото устройство" + "notificationSentDevicePart1": { + "message": "Отключете Битоурден на устройството си или в " + }, + "notificationSentDeviceAnchor": { + "message": "приложението по уеб" + }, + "notificationSentDevicePart2": { + "message": "Уверете се, че уникалната фраза съвпада с тази по-долу, преди да одобрите." }, "needAnotherOptionV1": { "message": "Предпочитате друг вариант?" @@ -2782,11 +2791,11 @@ "message": "Превключване на броя знаци", "description": "'Character count' describes a feature that displays a number next to each character of the password." }, - "areYouTryingtoLogin": { - "message": "Опитвате се да се впишете ли?" + "areYouTryingToAccessYourAccount": { + "message": "Опитвате ли се да получите достъп до акаунта си?" }, - "logInAttemptBy": { - "message": "Опит за вписване от $EMAIL$", + "accessAttemptBy": { + "message": "Опит за достъп от $EMAIL$", "placeholders": { "email": { "content": "$1", @@ -2803,11 +2812,11 @@ "time": { "message": "Време" }, - "confirmLogIn": { - "message": "Потвърждаване на вписването" + "confirmAccess": { + "message": "Разрешаване на достъпа" }, - "denyLogIn": { - "message": "Отказване на вписването" + "denyAccess": { + "message": "Отказване на достъпа" }, "logInConfirmedForEmailOnDevice": { "message": "Вписването за $EMAIL$ на $DEVICE$ е одобрено", @@ -2843,8 +2852,8 @@ "thisRequestIsNoLongerValid": { "message": "Тази заявка вече не е активна." }, - "confirmLoginAtemptForMail": { - "message": "Потвърждаване на заявката за вписване за $EMAIL$", + "confirmAccessAttempt": { + "message": "Потвърждаване на заявката за достъп за $EMAIL$", "placeholders": { "email": { "content": "$1", @@ -2855,6 +2864,9 @@ "logInRequested": { "message": "Направена е заявка за вписване" }, + "accountAccessRequested": { + "message": "Има заявка за достъп до акаунта" + }, "creatingAccountOn": { "message": "Създаване на регистрация в" }, @@ -3484,14 +3496,17 @@ "changeAcctEmail": { "message": "Промяна на е-пощата" }, - "organizationUpgradeRequired": { - "message": "Необходимо е надграждане на организацията" + "allowScreenshots": { + "message": "Позволяване на заснемането на екрана" }, - "upgradeOrganization": { - "message": "Надграждане на организацията" + "allowScreenshotsDesc": { + "message": "Позволява настолното приложение на Битурден да бъде заснемано при правене на екранни снимки и видимо при достъп до компютъра чрез отдалечен работен плот. Изключването на това ще забрани достапа на някои външни екрани." }, - "upgradeOrganizationDesc": { - "message": "Безплатните планове нямат достъп до тази функционалност. Преминете към платен план, за да се възползвате от тази и много други възможности." + "confirmWindowStillVisibleTitle": { + "message": "Потвърждаване, че прозорецът все още е видим" + }, + "confirmWindowStillVisibleContent": { + "message": "Моля, потвърдете, че прозорецът все още е видим." }, "updateBrowserOrDisableFingerprintDialogTitle": { "message": "Необходимо е обновяване на добавката" diff --git a/apps/desktop/src/locales/bn/messages.json b/apps/desktop/src/locales/bn/messages.json index 5c5f00b1bc2..ddfefa11e13 100644 --- a/apps/desktop/src/locales/bn/messages.json +++ b/apps/desktop/src/locales/bn/messages.json @@ -2745,14 +2745,23 @@ "loginInitiated": { "message": "Login initiated" }, + "logInRequestSent": { + "message": "Request sent" + }, "notificationSentDevice": { "message": "A notification has been sent to your device." }, "aNotificationWasSentToYourDevice": { "message": "A notification was sent to your device" }, - "makeSureYourAccountIsUnlockedAndTheFingerprintEtc": { - "message": "Make sure your account is unlocked and the fingerprint phrase matches on the other device" + "notificationSentDevicePart1": { + "message": "Unlock Bitwarden on your device or on the " + }, + "notificationSentDeviceAnchor": { + "message": "web app" + }, + "notificationSentDevicePart2": { + "message": "Make sure the Fingerprint phrase matches the one below before approving." }, "needAnotherOptionV1": { "message": "Need another option?" @@ -2782,11 +2791,11 @@ "message": "Toggle character count", "description": "'Character count' describes a feature that displays a number next to each character of the password." }, - "areYouTryingtoLogin": { - "message": "Are you trying to log in?" + "areYouTryingToAccessYourAccount": { + "message": "Are you trying to access your account?" }, - "logInAttemptBy": { - "message": "Login attempt by $EMAIL$", + "accessAttemptBy": { + "message": "Access attempt by $EMAIL$", "placeholders": { "email": { "content": "$1", @@ -2803,11 +2812,11 @@ "time": { "message": "Time" }, - "confirmLogIn": { - "message": "Confirm login" + "confirmAccess": { + "message": "Confirm access" }, - "denyLogIn": { - "message": "Deny login" + "denyAccess": { + "message": "Deny access" }, "logInConfirmedForEmailOnDevice": { "message": "Login confirmed for $EMAIL$ on $DEVICE$", @@ -2843,8 +2852,8 @@ "thisRequestIsNoLongerValid": { "message": "This request is no longer valid." }, - "confirmLoginAtemptForMail": { - "message": "Confirm login attempt for $EMAIL$", + "confirmAccessAttempt": { + "message": "Confirm access attempt for $EMAIL$", "placeholders": { "email": { "content": "$1", @@ -2855,6 +2864,9 @@ "logInRequested": { "message": "Log in requested" }, + "accountAccessRequested": { + "message": "Account access requested" + }, "creatingAccountOn": { "message": "Creating account on" }, @@ -3484,14 +3496,17 @@ "changeAcctEmail": { "message": "Change account email" }, - "organizationUpgradeRequired": { - "message": "Organization upgrade required" + "allowScreenshots": { + "message": "Allow screen capture" }, - "upgradeOrganization": { - "message": "Upgrade organization" + "allowScreenshotsDesc": { + "message": "Allow the Bitwarden desktop application to be captured in screenshots and viewed in remote desktop sessions. Disabling this will prevent access on some external displays." }, - "upgradeOrganizationDesc": { - "message": "This feature is not available for free organizations. Switch to a paid plan to unlock more features." + "confirmWindowStillVisibleTitle": { + "message": "Confirm window still visible" + }, + "confirmWindowStillVisibleContent": { + "message": "Please confirm that the window is still visible." }, "updateBrowserOrDisableFingerprintDialogTitle": { "message": "Extension update required" diff --git a/apps/desktop/src/locales/bs/messages.json b/apps/desktop/src/locales/bs/messages.json index 001025e9d2f..083eac2eb08 100644 --- a/apps/desktop/src/locales/bs/messages.json +++ b/apps/desktop/src/locales/bs/messages.json @@ -2745,14 +2745,23 @@ "loginInitiated": { "message": "Login initiated" }, + "logInRequestSent": { + "message": "Request sent" + }, "notificationSentDevice": { "message": "A notification has been sent to your device." }, "aNotificationWasSentToYourDevice": { "message": "A notification was sent to your device" }, - "makeSureYourAccountIsUnlockedAndTheFingerprintEtc": { - "message": "Make sure your account is unlocked and the fingerprint phrase matches on the other device" + "notificationSentDevicePart1": { + "message": "Unlock Bitwarden on your device or on the " + }, + "notificationSentDeviceAnchor": { + "message": "web app" + }, + "notificationSentDevicePart2": { + "message": "Make sure the Fingerprint phrase matches the one below before approving." }, "needAnotherOptionV1": { "message": "Need another option?" @@ -2782,11 +2791,11 @@ "message": "Toggle character count", "description": "'Character count' describes a feature that displays a number next to each character of the password." }, - "areYouTryingtoLogin": { - "message": "Are you trying to log in?" + "areYouTryingToAccessYourAccount": { + "message": "Are you trying to access your account?" }, - "logInAttemptBy": { - "message": "Login attempt by $EMAIL$", + "accessAttemptBy": { + "message": "Access attempt by $EMAIL$", "placeholders": { "email": { "content": "$1", @@ -2803,11 +2812,11 @@ "time": { "message": "Time" }, - "confirmLogIn": { - "message": "Confirm login" + "confirmAccess": { + "message": "Confirm access" }, - "denyLogIn": { - "message": "Deny login" + "denyAccess": { + "message": "Deny access" }, "logInConfirmedForEmailOnDevice": { "message": "Login confirmed for $EMAIL$ on $DEVICE$", @@ -2843,8 +2852,8 @@ "thisRequestIsNoLongerValid": { "message": "This request is no longer valid." }, - "confirmLoginAtemptForMail": { - "message": "Confirm login attempt for $EMAIL$", + "confirmAccessAttempt": { + "message": "Confirm access attempt for $EMAIL$", "placeholders": { "email": { "content": "$1", @@ -2855,6 +2864,9 @@ "logInRequested": { "message": "Log in requested" }, + "accountAccessRequested": { + "message": "Account access requested" + }, "creatingAccountOn": { "message": "Creating account on" }, @@ -3484,14 +3496,17 @@ "changeAcctEmail": { "message": "Change account email" }, - "organizationUpgradeRequired": { - "message": "Organization upgrade required" + "allowScreenshots": { + "message": "Allow screen capture" }, - "upgradeOrganization": { - "message": "Upgrade organization" + "allowScreenshotsDesc": { + "message": "Allow the Bitwarden desktop application to be captured in screenshots and viewed in remote desktop sessions. Disabling this will prevent access on some external displays." }, - "upgradeOrganizationDesc": { - "message": "This feature is not available for free organizations. Switch to a paid plan to unlock more features." + "confirmWindowStillVisibleTitle": { + "message": "Confirm window still visible" + }, + "confirmWindowStillVisibleContent": { + "message": "Please confirm that the window is still visible." }, "updateBrowserOrDisableFingerprintDialogTitle": { "message": "Extension update required" diff --git a/apps/desktop/src/locales/ca/messages.json b/apps/desktop/src/locales/ca/messages.json index 8aff4edcd74..0abdfd4724e 100644 --- a/apps/desktop/src/locales/ca/messages.json +++ b/apps/desktop/src/locales/ca/messages.json @@ -579,7 +579,7 @@ "description": "Label for the avoid ambiguous characters checkbox." }, "generatorPolicyInEffect": { - "message": "Enterprise policy requirements have been applied to your generator options.", + "message": "Els requisits de la política empresarial s'han aplicat a les opcions del generador.", "description": "Indicates that a policy limits the credential generator screen." }, "searchCollection": { @@ -889,7 +889,7 @@ "message": "Verifiqueu la vostra identitat" }, "weDontRecognizeThisDevice": { - "message": "We don't recognize this device. Enter the code sent to your email to verify your identity." + "message": "No reconeixem aquest dispositiu. Introduïu el codi que us hem enviat al correu electrònic per verificar la identitat." }, "continueLoggingIn": { "message": "Continua l'inici de sessió" @@ -946,7 +946,7 @@ "message": "Temps d'espera d'autenticació" }, "authenticationSessionTimedOut": { - "message": "The authentication session timed out. Please restart the login process." + "message": "La sessió d'autenticació s'ha esgotat. Reinicieu el procés d'inici de sessió." }, "selfHostBaseUrl": { "message": "URL del servidor autoallotjat", @@ -1004,7 +1004,7 @@ "message": "Enllaç caducat" }, "pleaseRestartRegistrationOrTryLoggingIn": { - "message": "Please restart registration or try logging in." + "message": "Reinicieu el registre o proveu d'iniciar sessió." }, "youMayAlreadyHaveAnAccount": { "message": "És possible que ja tingueu un compte" @@ -2551,7 +2551,7 @@ "message": "Utilitzeu la safata d'entrada global configurada del vostre domini." }, "useThisEmail": { - "message": "Use this email" + "message": "Utilitza aquest correu" }, "random": { "message": "Aleatori" @@ -2745,14 +2745,23 @@ "loginInitiated": { "message": "S'ha iniciat la sessió" }, + "logInRequestSent": { + "message": "Sol·licitud enviada" + }, "notificationSentDevice": { "message": "S'ha enviat una notificació al vostre dispositiu." }, "aNotificationWasSentToYourDevice": { "message": "S'ha enviat una notificació al vostre dispositiu" }, - "makeSureYourAccountIsUnlockedAndTheFingerprintEtc": { - "message": "Assegureu-vos que la vostra caixa forta estiga desbloquejada i que la frase d'empremta digital coincidisca en l'altre dispositiu" + "notificationSentDevicePart1": { + "message": "Unlock Bitwarden on your device or on the " + }, + "notificationSentDeviceAnchor": { + "message": "aplicació web" + }, + "notificationSentDevicePart2": { + "message": "Make sure the Fingerprint phrase matches the one below before approving." }, "needAnotherOptionV1": { "message": "Necessiteu una altra opció?" @@ -2782,11 +2791,11 @@ "message": "Commuta el recompte de caràcters", "description": "'Character count' describes a feature that displays a number next to each character of the password." }, - "areYouTryingtoLogin": { - "message": "Esteu intentant iniciar sessió?" + "areYouTryingToAccessYourAccount": { + "message": "Are you trying to access your account?" }, - "logInAttemptBy": { - "message": "Intent d'inici de sessió per $EMAIL$", + "accessAttemptBy": { + "message": "Access attempt by $EMAIL$", "placeholders": { "email": { "content": "$1", @@ -2803,11 +2812,11 @@ "time": { "message": "Hora" }, - "confirmLogIn": { - "message": "Confirma l'inici de sessió" + "confirmAccess": { + "message": "Confirmeu l'accés" }, - "denyLogIn": { - "message": "Denega l'inici de sessió" + "denyAccess": { + "message": "Denega l'accés" }, "logInConfirmedForEmailOnDevice": { "message": "S'ha confirmat l'inici de sessió per a $EMAIL$ a $DEVICE$", @@ -2843,8 +2852,8 @@ "thisRequestIsNoLongerValid": { "message": "Aquesta sol·licitud ja no és vàlida." }, - "confirmLoginAtemptForMail": { - "message": "Confirmeu l'intent d'inici de sessió per a $EMAIL$", + "confirmAccessAttempt": { + "message": "Confirm access attempt for $EMAIL$", "placeholders": { "email": { "content": "$1", @@ -2855,6 +2864,9 @@ "logInRequested": { "message": "S'ha sol·licitat inici de sessió" }, + "accountAccessRequested": { + "message": "Account access requested" + }, "creatingAccountOn": { "message": "Creant compte en" }, @@ -3484,14 +3496,17 @@ "changeAcctEmail": { "message": "Change account email" }, - "organizationUpgradeRequired": { - "message": "Organization upgrade required" + "allowScreenshots": { + "message": "Allow screen capture" }, - "upgradeOrganization": { - "message": "Actualitza l'organització" + "allowScreenshotsDesc": { + "message": "Allow the Bitwarden desktop application to be captured in screenshots and viewed in remote desktop sessions. Disabling this will prevent access on some external displays." }, - "upgradeOrganizationDesc": { - "message": "Aquesta característica no està disponible per a organitzacions gratuïtes. Canvieu a un pla de pagament per desbloquejar més característiques." + "confirmWindowStillVisibleTitle": { + "message": "Confirm window still visible" + }, + "confirmWindowStillVisibleContent": { + "message": "Please confirm that the window is still visible." }, "updateBrowserOrDisableFingerprintDialogTitle": { "message": "Cal actualitzar l'extensió" diff --git a/apps/desktop/src/locales/cs/messages.json b/apps/desktop/src/locales/cs/messages.json index 1a4f8f284c8..70811e5e8df 100644 --- a/apps/desktop/src/locales/cs/messages.json +++ b/apps/desktop/src/locales/cs/messages.json @@ -2745,14 +2745,23 @@ "loginInitiated": { "message": "Bylo zahájeno přihlášení" }, + "logInRequestSent": { + "message": "Požadavek odeslán" + }, "notificationSentDevice": { "message": "Na Vaše zařízení bylo odesláno oznámení." }, "aNotificationWasSentToYourDevice": { "message": "Na Vaše zařízení bylo odesláno oznámení" }, - "makeSureYourAccountIsUnlockedAndTheFingerprintEtc": { - "message": "Ujistěte se, že je Váš účet odemčen a fráze otisku prstu se shoduje s tou na druhém zařízení" + "notificationSentDevicePart1": { + "message": "Odemknout Bitwarden na Vašem zařízení nebo na " + }, + "notificationSentDeviceAnchor": { + "message": "webová aplikace" + }, + "notificationSentDevicePart2": { + "message": "Před schválením se ujistěte, že fráze otisku prstu odpovídá frázi níže." }, "needAnotherOptionV1": { "message": "Potřebujete další volby?" @@ -2782,11 +2791,11 @@ "message": "Zobrazit počet znaků", "description": "'Character count' describes a feature that displays a number next to each character of the password." }, - "areYouTryingtoLogin": { - "message": "Pokoušíte se přihlásit?" + "areYouTryingToAccessYourAccount": { + "message": "Pokoušíte se získat přístup k Vašemu účtu?" }, - "logInAttemptBy": { - "message": "Pokus o přihlášení z $EMAIL$", + "accessAttemptBy": { + "message": "Pokus o přístup z $EMAIL$", "placeholders": { "email": { "content": "$1", @@ -2803,11 +2812,11 @@ "time": { "message": "Čas" }, - "confirmLogIn": { - "message": "Potvrdit přihlášení" + "confirmAccess": { + "message": "Potvrdit přístup" }, - "denyLogIn": { - "message": "Zamítnout přihlášení" + "denyAccess": { + "message": "Zamítnout přístup" }, "logInConfirmedForEmailOnDevice": { "message": "Přihlášení bylo potvrzeno z $EMAIL$ pro $DEVICE$", @@ -2843,8 +2852,8 @@ "thisRequestIsNoLongerValid": { "message": "Tento požadavek již není platný." }, - "confirmLoginAtemptForMail": { - "message": "Potvrďte pokus o přihlášení z $EMAIL$", + "confirmAccessAttempt": { + "message": "Potvrďte pokus o přístup z $EMAIL$", "placeholders": { "email": { "content": "$1", @@ -2855,6 +2864,9 @@ "logInRequested": { "message": "Bylo vyžádáno přihlášení" }, + "accountAccessRequested": { + "message": "Požadován přístup k účtu" + }, "creatingAccountOn": { "message": "Vytváření účtu na" }, @@ -3484,14 +3496,17 @@ "changeAcctEmail": { "message": "Změnit e-mail účtu" }, - "organizationUpgradeRequired": { - "message": "Je vyžadována aktualizace organizace" + "allowScreenshots": { + "message": "Povolit záznam obrazovky" }, - "upgradeOrganization": { - "message": "Aktualizovat organizaci" + "allowScreenshotsDesc": { + "message": "Povolit zachycení aplikace Bitwarden ve snímcích obrazovky a zobrazení ve vzdálené desktopové relaci. Zakázáním této funkce se zabrání přístupu na některé externí displeje." }, - "upgradeOrganizationDesc": { - "message": "Tato funkce není dostupná pro bezplatné organizace. Přepněte na placenou verzi a odemkněte další funkce." + "confirmWindowStillVisibleTitle": { + "message": "Potvrdit stále viditelné okno" + }, + "confirmWindowStillVisibleContent": { + "message": "Potvrďte, že okno je stále viditelné." }, "updateBrowserOrDisableFingerprintDialogTitle": { "message": "Je vyžadována aktualiazce rozšíření" diff --git a/apps/desktop/src/locales/cy/messages.json b/apps/desktop/src/locales/cy/messages.json index 6488336a3cc..7e7f5ce943f 100644 --- a/apps/desktop/src/locales/cy/messages.json +++ b/apps/desktop/src/locales/cy/messages.json @@ -2745,14 +2745,23 @@ "loginInitiated": { "message": "Login initiated" }, + "logInRequestSent": { + "message": "Request sent" + }, "notificationSentDevice": { "message": "A notification has been sent to your device." }, "aNotificationWasSentToYourDevice": { "message": "A notification was sent to your device" }, - "makeSureYourAccountIsUnlockedAndTheFingerprintEtc": { - "message": "Make sure your account is unlocked and the fingerprint phrase matches on the other device" + "notificationSentDevicePart1": { + "message": "Unlock Bitwarden on your device or on the " + }, + "notificationSentDeviceAnchor": { + "message": "web app" + }, + "notificationSentDevicePart2": { + "message": "Make sure the Fingerprint phrase matches the one below before approving." }, "needAnotherOptionV1": { "message": "Need another option?" @@ -2782,11 +2791,11 @@ "message": "Toggle character count", "description": "'Character count' describes a feature that displays a number next to each character of the password." }, - "areYouTryingtoLogin": { - "message": "Are you trying to log in?" + "areYouTryingToAccessYourAccount": { + "message": "Are you trying to access your account?" }, - "logInAttemptBy": { - "message": "Login attempt by $EMAIL$", + "accessAttemptBy": { + "message": "Access attempt by $EMAIL$", "placeholders": { "email": { "content": "$1", @@ -2803,11 +2812,11 @@ "time": { "message": "Time" }, - "confirmLogIn": { - "message": "Confirm login" + "confirmAccess": { + "message": "Confirm access" }, - "denyLogIn": { - "message": "Deny login" + "denyAccess": { + "message": "Deny access" }, "logInConfirmedForEmailOnDevice": { "message": "Login confirmed for $EMAIL$ on $DEVICE$", @@ -2843,8 +2852,8 @@ "thisRequestIsNoLongerValid": { "message": "This request is no longer valid." }, - "confirmLoginAtemptForMail": { - "message": "Confirm login attempt for $EMAIL$", + "confirmAccessAttempt": { + "message": "Confirm access attempt for $EMAIL$", "placeholders": { "email": { "content": "$1", @@ -2855,6 +2864,9 @@ "logInRequested": { "message": "Log in requested" }, + "accountAccessRequested": { + "message": "Account access requested" + }, "creatingAccountOn": { "message": "Creating account on" }, @@ -3484,14 +3496,17 @@ "changeAcctEmail": { "message": "Change account email" }, - "organizationUpgradeRequired": { - "message": "Organization upgrade required" + "allowScreenshots": { + "message": "Allow screen capture" }, - "upgradeOrganization": { - "message": "Upgrade organization" + "allowScreenshotsDesc": { + "message": "Allow the Bitwarden desktop application to be captured in screenshots and viewed in remote desktop sessions. Disabling this will prevent access on some external displays." }, - "upgradeOrganizationDesc": { - "message": "This feature is not available for free organizations. Switch to a paid plan to unlock more features." + "confirmWindowStillVisibleTitle": { + "message": "Confirm window still visible" + }, + "confirmWindowStillVisibleContent": { + "message": "Please confirm that the window is still visible." }, "updateBrowserOrDisableFingerprintDialogTitle": { "message": "Extension update required" diff --git a/apps/desktop/src/locales/da/messages.json b/apps/desktop/src/locales/da/messages.json index b3b73c1a6cd..e4a4460dcc7 100644 --- a/apps/desktop/src/locales/da/messages.json +++ b/apps/desktop/src/locales/da/messages.json @@ -2745,14 +2745,23 @@ "loginInitiated": { "message": "Indlogning påbegyndt" }, + "logInRequestSent": { + "message": "Request sent" + }, "notificationSentDevice": { "message": "En notifikation er sendt til din enhed." }, "aNotificationWasSentToYourDevice": { "message": "En notifikation er sendt til enheden" }, - "makeSureYourAccountIsUnlockedAndTheFingerprintEtc": { - "message": "Sørg for, at boksen er oplåst, samt at fingeraftrykssætningen matcher på den anden enhed" + "notificationSentDevicePart1": { + "message": "Unlock Bitwarden on your device or on the " + }, + "notificationSentDeviceAnchor": { + "message": "web app" + }, + "notificationSentDevicePart2": { + "message": "Make sure the Fingerprint phrase matches the one below before approving." }, "needAnotherOptionV1": { "message": "Behov for en anden mulighed?" @@ -2782,11 +2791,11 @@ "message": "Vis/skjul tegnantal", "description": "'Character count' describes a feature that displays a number next to each character of the password." }, - "areYouTryingtoLogin": { - "message": "Forsøges at logge ind?" + "areYouTryingToAccessYourAccount": { + "message": "Are you trying to access your account?" }, - "logInAttemptBy": { - "message": "Loginforsøg fra $EMAIL$", + "accessAttemptBy": { + "message": "Access attempt by $EMAIL$", "placeholders": { "email": { "content": "$1", @@ -2803,11 +2812,11 @@ "time": { "message": "Tid" }, - "confirmLogIn": { - "message": "Bekræft login" + "confirmAccess": { + "message": "Confirm access" }, - "denyLogIn": { - "message": "Afvis login" + "denyAccess": { + "message": "Deny access" }, "logInConfirmedForEmailOnDevice": { "message": "Login bekræftet for $EMAIL$ på $DEVICE$", @@ -2843,8 +2852,8 @@ "thisRequestIsNoLongerValid": { "message": "Anmodningen er ikke længere gyldig." }, - "confirmLoginAtemptForMail": { - "message": "Bekræft loginforsøg for $EMAIL$", + "confirmAccessAttempt": { + "message": "Confirm access attempt for $EMAIL$", "placeholders": { "email": { "content": "$1", @@ -2855,6 +2864,9 @@ "logInRequested": { "message": "Login anmodet" }, + "accountAccessRequested": { + "message": "Account access requested" + }, "creatingAccountOn": { "message": "Opretter konto på" }, @@ -3484,14 +3496,17 @@ "changeAcctEmail": { "message": "Skift kontoe-mailadresse" }, - "organizationUpgradeRequired": { - "message": "Organisationsopgradering krævet" + "allowScreenshots": { + "message": "Allow screen capture" }, - "upgradeOrganization": { - "message": "Opgradér organisation" + "allowScreenshotsDesc": { + "message": "Allow the Bitwarden desktop application to be captured in screenshots and viewed in remote desktop sessions. Disabling this will prevent access on some external displays." }, - "upgradeOrganizationDesc": { - "message": "Denne funktion er utilgængelig for gratis organisationer. Skift til en betalingsabonnementstype for at oplåse flere funktioner." + "confirmWindowStillVisibleTitle": { + "message": "Confirm window still visible" + }, + "confirmWindowStillVisibleContent": { + "message": "Please confirm that the window is still visible." }, "updateBrowserOrDisableFingerprintDialogTitle": { "message": "Udvidelsesopdatering krævet" diff --git a/apps/desktop/src/locales/de/messages.json b/apps/desktop/src/locales/de/messages.json index e6aa0fba6b3..bd71c4bc363 100644 --- a/apps/desktop/src/locales/de/messages.json +++ b/apps/desktop/src/locales/de/messages.json @@ -211,7 +211,7 @@ "message": "Dein eingegebenes Passwort ist falsch." }, "importSshKey": { - "message": "Import" + "message": "Importieren" }, "confirmSshKeyPassword": { "message": "Passwort bestätigen" @@ -2745,14 +2745,23 @@ "loginInitiated": { "message": "Anmeldung eingeleitet" }, + "logInRequestSent": { + "message": "Anfrage gesendet" + }, "notificationSentDevice": { "message": "Eine Benachrichtigung wurde an dein Gerät gesendet." }, "aNotificationWasSentToYourDevice": { "message": "Eine Benachrichtigung wurde an dein Gerät gesendet" }, - "makeSureYourAccountIsUnlockedAndTheFingerprintEtc": { - "message": "Stelle sicher, dass dein Konto entsperrt ist und die Fingerabdruck-Phrase mit der vom anderen Gerät übereinstimmt" + "notificationSentDevicePart1": { + "message": "Entsperre Bitwarden auf deinem Gerät oder mit der " + }, + "notificationSentDeviceAnchor": { + "message": "Web-App" + }, + "notificationSentDevicePart2": { + "message": "Stelle vor der Genehmigung sicher, dass die Fingerabdruck-Phrase mit der unten stehenden übereinstimmt." }, "needAnotherOptionV1": { "message": "Brauchst du eine andere Option?" @@ -2782,11 +2791,11 @@ "message": "Zeichenanzahl ein-/ausschalten", "description": "'Character count' describes a feature that displays a number next to each character of the password." }, - "areYouTryingtoLogin": { - "message": "Versuchst du dich anzumelden?" + "areYouTryingToAccessYourAccount": { + "message": "Versuchst du auf dein Konto zuzugreifen?" }, - "logInAttemptBy": { - "message": "Anmeldeversuch von $EMAIL$", + "accessAttemptBy": { + "message": "Zugriffsversuch von $EMAIL$", "placeholders": { "email": { "content": "$1", @@ -2803,11 +2812,11 @@ "time": { "message": "Zeit" }, - "confirmLogIn": { - "message": "Anmeldung genehmigen" + "confirmAccess": { + "message": "Zugriff bestätigen" }, - "denyLogIn": { - "message": "Anmeldung ablehnen" + "denyAccess": { + "message": "Zugriff ablehnen" }, "logInConfirmedForEmailOnDevice": { "message": "Anmeldung von $EMAIL$ auf $DEVICE$ bestätigt", @@ -2843,8 +2852,8 @@ "thisRequestIsNoLongerValid": { "message": "Diese Anfrage ist nicht mehr gültig." }, - "confirmLoginAtemptForMail": { - "message": "Anmeldeversuch von $EMAIL$ genehmigen", + "confirmAccessAttempt": { + "message": "Zugriffsversuch für $EMAIL$ bestätigen", "placeholders": { "email": { "content": "$1", @@ -2855,6 +2864,9 @@ "logInRequested": { "message": "Anmeldung angefordert" }, + "accountAccessRequested": { + "message": "Kontozugriff angefragt" + }, "creatingAccountOn": { "message": "Konto wird erstellt bei" }, @@ -3484,14 +3496,17 @@ "changeAcctEmail": { "message": "E-Mail-Adresse des Kontos ändern" }, - "organizationUpgradeRequired": { - "message": "Organisations-Upgrade erforderlich" + "allowScreenshots": { + "message": "Bildschirmaufnahme erlauben" }, - "upgradeOrganization": { - "message": "Organisation upgraden" + "allowScreenshotsDesc": { + "message": "Erlaube der Bitwarden Desktop-Anwendung in Screenshots festgehalten und in Remote Desktop-Sitzungen angezeigt zu werden. Das Deaktivieren dieser Option verhindert den Zugriff über einige externe Displays." }, - "upgradeOrganizationDesc": { - "message": "Diese Funktion ist für kostenlose Organisationen nicht verfügbar. Wechsle zu einem kostenpflichtigen Abonnement, um weitere Funktionen freizuschalten." + "confirmWindowStillVisibleTitle": { + "message": "Bestätigungsfenster noch sichtbar" + }, + "confirmWindowStillVisibleContent": { + "message": "Bitte bestätige, dass das Fenster noch sichtbar ist." }, "updateBrowserOrDisableFingerprintDialogTitle": { "message": "Aktualisierung der Erweiterung notwendig" diff --git a/apps/desktop/src/locales/el/messages.json b/apps/desktop/src/locales/el/messages.json index 28afcbbd0c5..de62cd02434 100644 --- a/apps/desktop/src/locales/el/messages.json +++ b/apps/desktop/src/locales/el/messages.json @@ -2745,14 +2745,23 @@ "loginInitiated": { "message": "Η σύνδεση ξεκίνησε" }, + "logInRequestSent": { + "message": "Το αίτημα εστάλη" + }, "notificationSentDevice": { "message": "Μια ειδοποίηση έχει σταλεί στη συσκευή σας." }, "aNotificationWasSentToYourDevice": { "message": "Μια ειδοποίηση στάλθηκε στη συσκευή σας" }, - "makeSureYourAccountIsUnlockedAndTheFingerprintEtc": { - "message": "Βεβαιωθείτε ότι ο λογαριασμός σας είναι ξεκλείδωτος και ότι η φράση δακτυλικού αποτυπώματος ταιριάζει στην άλλη συσκευή" + "notificationSentDevicePart1": { + "message": "Ξεκλειδώστε το Bitwarden στη συσκευή σας ή στην " + }, + "notificationSentDeviceAnchor": { + "message": "εφαρμογή ιστού" + }, + "notificationSentDevicePart2": { + "message": "Βεβαιωθείτε ότι η φράση αποτυπωμάτων ταιριάζει με την παρακάτω φράση πριν την έγκριση." }, "needAnotherOptionV1": { "message": "Χρειάζεστε μια άλλη επιλογή;" @@ -2782,11 +2791,11 @@ "message": "Εναλλαγή αριθμού χαρακτήρων", "description": "'Character count' describes a feature that displays a number next to each character of the password." }, - "areYouTryingtoLogin": { - "message": "Προσπαθείτε να συνδεθείτε;" + "areYouTryingToAccessYourAccount": { + "message": "Προσπαθείτε να αποκτήσετε πρόσβαση στο λογαριασμό σας;" }, - "logInAttemptBy": { - "message": "Προσπάθεια σύνδεσης από $EMAIL$", + "accessAttemptBy": { + "message": "Προσπάθεια πρόσβασης από το $EMAIL$", "placeholders": { "email": { "content": "$1", @@ -2803,11 +2812,11 @@ "time": { "message": "Ώρα" }, - "confirmLogIn": { - "message": "Επιβεβαίωση σύνδεσης" + "confirmAccess": { + "message": "Επιβεβαίωση πρόσβασης" }, - "denyLogIn": { - "message": "Άρνηση σύνδεσης" + "denyAccess": { + "message": "Άρνηση πρόσβασης" }, "logInConfirmedForEmailOnDevice": { "message": "Επιβεβαιώθηκε η σύνδεση του $EMAIL$ στη συσκευή $DEVICE$", @@ -2843,8 +2852,8 @@ "thisRequestIsNoLongerValid": { "message": "Αυτό το αίτημα δεν είναι πλέον έγκυρο." }, - "confirmLoginAtemptForMail": { - "message": "Επιβεβαίωση προσπάθειας σύνδεσης για $EMAIL$", + "confirmAccessAttempt": { + "message": "Επιβεβαίωση προσπάθειας πρόσβασης για το $EMAIL$", "placeholders": { "email": { "content": "$1", @@ -2855,6 +2864,9 @@ "logInRequested": { "message": "Ζητήθηκε σύνδεση" }, + "accountAccessRequested": { + "message": "Ζητήθηκε πρόσβαση στον λογαριασμό" + }, "creatingAccountOn": { "message": "Δημιουργία λογαριασμού στο" }, @@ -3484,14 +3496,17 @@ "changeAcctEmail": { "message": "Αλλαγή email λογαριασμού" }, - "organizationUpgradeRequired": { - "message": "Απαιτείται αναβάθμιση οργανισμού" + "allowScreenshots": { + "message": "Allow screen capture" }, - "upgradeOrganization": { - "message": "Αναβάθμιση οργανισμού" + "allowScreenshotsDesc": { + "message": "Allow the Bitwarden desktop application to be captured in screenshots and viewed in remote desktop sessions. Disabling this will prevent access on some external displays." }, - "upgradeOrganizationDesc": { - "message": "Αυτή η λειτουργία, δεν είναι διαθέσιμη στους δωρεάν οργανισμούς. Μεταβείτε σε ένα πακέτο επί πληρωμής για να ξεκλειδώσετε περισσότερες λειτουργίες." + "confirmWindowStillVisibleTitle": { + "message": "Confirm window still visible" + }, + "confirmWindowStillVisibleContent": { + "message": "Please confirm that the window is still visible." }, "updateBrowserOrDisableFingerprintDialogTitle": { "message": "Απαιτείται ενημέρωση επέκτασης" diff --git a/apps/desktop/src/locales/en/messages.json b/apps/desktop/src/locales/en/messages.json index e45dceeaa78..5bc1f216880 100644 --- a/apps/desktop/src/locales/en/messages.json +++ b/apps/desktop/src/locales/en/messages.json @@ -3496,14 +3496,17 @@ "changeAcctEmail": { "message": "Change account email" }, - "organizationUpgradeRequired": { - "message": "Organization upgrade required" + "allowScreenshots": { + "message": "Allow screen capture" }, - "upgradeOrganization": { - "message": "Upgrade organization" + "allowScreenshotsDesc": { + "message": "Allow the Bitwarden desktop application to be captured in screenshots and viewed in remote desktop sessions. Disabling this will prevent access on some external displays." }, - "upgradeOrganizationDesc": { - "message": "This feature is not available for free organizations. Switch to a paid plan to unlock more features." + "confirmWindowStillVisibleTitle": { + "message": "Confirm window still visible" + }, + "confirmWindowStillVisibleContent": { + "message": "Please confirm that the window is still visible." }, "updateBrowserOrDisableFingerprintDialogTitle": { "message": "Extension update required" diff --git a/apps/desktop/src/locales/en_GB/messages.json b/apps/desktop/src/locales/en_GB/messages.json index b308f914302..fd12fbe1a30 100644 --- a/apps/desktop/src/locales/en_GB/messages.json +++ b/apps/desktop/src/locales/en_GB/messages.json @@ -2745,14 +2745,23 @@ "loginInitiated": { "message": "Login initiated" }, + "logInRequestSent": { + "message": "Request sent" + }, "notificationSentDevice": { "message": "A notification has been sent to your device." }, "aNotificationWasSentToYourDevice": { "message": "A notification was sent to your device" }, - "makeSureYourAccountIsUnlockedAndTheFingerprintEtc": { - "message": "Make sure your account is unlocked and the fingerprint phrase matches on the other device" + "notificationSentDevicePart1": { + "message": "Unlock Bitwarden on your device or on the " + }, + "notificationSentDeviceAnchor": { + "message": "web app" + }, + "notificationSentDevicePart2": { + "message": "Make sure the Fingerprint phrase matches the one below before approving." }, "needAnotherOptionV1": { "message": "Need another option?" @@ -2782,11 +2791,11 @@ "message": "Toggle character count", "description": "'Character count' describes a feature that displays a number next to each character of the password." }, - "areYouTryingtoLogin": { - "message": "Are you trying to log in?" + "areYouTryingToAccessYourAccount": { + "message": "Are you trying to access your account?" }, - "logInAttemptBy": { - "message": "Login attempt by $EMAIL$", + "accessAttemptBy": { + "message": "Access attempt by $EMAIL$", "placeholders": { "email": { "content": "$1", @@ -2803,11 +2812,11 @@ "time": { "message": "Time" }, - "confirmLogIn": { - "message": "Confirm login" + "confirmAccess": { + "message": "Confirm access" }, - "denyLogIn": { - "message": "Deny login" + "denyAccess": { + "message": "Deny access" }, "logInConfirmedForEmailOnDevice": { "message": "Login confirmed for $EMAIL$ on $DEVICE$", @@ -2843,8 +2852,8 @@ "thisRequestIsNoLongerValid": { "message": "This request is no longer valid." }, - "confirmLoginAtemptForMail": { - "message": "Confirm login attempt for $EMAIL$", + "confirmAccessAttempt": { + "message": "Confirm access attempt for $EMAIL$", "placeholders": { "email": { "content": "$1", @@ -2855,6 +2864,9 @@ "logInRequested": { "message": "Log in requested" }, + "accountAccessRequested": { + "message": "Account access requested" + }, "creatingAccountOn": { "message": "Creating account on" }, @@ -3484,14 +3496,17 @@ "changeAcctEmail": { "message": "Change account email" }, - "organizationUpgradeRequired": { - "message": "Organisation upgrade required" + "allowScreenshots": { + "message": "Allow screen capture" }, - "upgradeOrganization": { - "message": "Upgrade organisation" + "allowScreenshotsDesc": { + "message": "Allow the Bitwarden desktop application to be captured in screenshots and viewed in remote desktop sessions. Disabling this will prevent access on some external displays." }, - "upgradeOrganizationDesc": { - "message": "This feature is not available for free organisations. Switch to a paid plan to unlock more features." + "confirmWindowStillVisibleTitle": { + "message": "Confirm window still visible" + }, + "confirmWindowStillVisibleContent": { + "message": "Please confirm that the window is still visible." }, "updateBrowserOrDisableFingerprintDialogTitle": { "message": "Extension update required" diff --git a/apps/desktop/src/locales/en_IN/messages.json b/apps/desktop/src/locales/en_IN/messages.json index 3d37b6edf05..5aaa0918551 100644 --- a/apps/desktop/src/locales/en_IN/messages.json +++ b/apps/desktop/src/locales/en_IN/messages.json @@ -2745,14 +2745,23 @@ "loginInitiated": { "message": "Login initiated" }, + "logInRequestSent": { + "message": "Request sent" + }, "notificationSentDevice": { "message": "A notification has been sent to your device." }, "aNotificationWasSentToYourDevice": { "message": "A notification was sent to your device" }, - "makeSureYourAccountIsUnlockedAndTheFingerprintEtc": { - "message": "Make sure your account is unlocked and the fingerprint phrase matches on the other device" + "notificationSentDevicePart1": { + "message": "Unlock Bitwarden on your device or on the " + }, + "notificationSentDeviceAnchor": { + "message": "web app" + }, + "notificationSentDevicePart2": { + "message": "Make sure the Fingerprint phrase matches the one below before approving." }, "needAnotherOptionV1": { "message": "Need another option?" @@ -2782,11 +2791,11 @@ "message": "Toggle character count", "description": "'Character count' describes a feature that displays a number next to each character of the password." }, - "areYouTryingtoLogin": { - "message": "Are you trying to log in?" + "areYouTryingToAccessYourAccount": { + "message": "Are you trying to access your account?" }, - "logInAttemptBy": { - "message": "Login attempt by $EMAIL$", + "accessAttemptBy": { + "message": "Access attempt by $EMAIL$", "placeholders": { "email": { "content": "$1", @@ -2803,11 +2812,11 @@ "time": { "message": "Time" }, - "confirmLogIn": { - "message": "Confirm login" + "confirmAccess": { + "message": "Confirm access" }, - "denyLogIn": { - "message": "Deny login" + "denyAccess": { + "message": "Deny access" }, "logInConfirmedForEmailOnDevice": { "message": "Login confirmed for $EMAIL$ on $DEVICE$", @@ -2843,8 +2852,8 @@ "thisRequestIsNoLongerValid": { "message": "This request is no longer valid." }, - "confirmLoginAtemptForMail": { - "message": "Confirm login attempt for $EMAIL$", + "confirmAccessAttempt": { + "message": "Confirm access attempt for $EMAIL$", "placeholders": { "email": { "content": "$1", @@ -2855,6 +2864,9 @@ "logInRequested": { "message": "Log in requested" }, + "accountAccessRequested": { + "message": "Account access requested" + }, "creatingAccountOn": { "message": "Creating account on" }, @@ -3484,14 +3496,17 @@ "changeAcctEmail": { "message": "Change account email" }, - "organizationUpgradeRequired": { - "message": "Organisation upgrade required" + "allowScreenshots": { + "message": "Allow screen capture" }, - "upgradeOrganization": { - "message": "Upgrade organisation" + "allowScreenshotsDesc": { + "message": "Allow the Bitwarden desktop application to be captured in screenshots and viewed in remote desktop sessions. Disabling this will prevent access on some external displays." }, - "upgradeOrganizationDesc": { - "message": "This feature is not available for free organisations. Switch to a paid plan to unlock more features." + "confirmWindowStillVisibleTitle": { + "message": "Confirm window still visible" + }, + "confirmWindowStillVisibleContent": { + "message": "Please confirm that the window is still visible." }, "updateBrowserOrDisableFingerprintDialogTitle": { "message": "Extension update required" diff --git a/apps/desktop/src/locales/eo/messages.json b/apps/desktop/src/locales/eo/messages.json index 43cdeb65e88..c8616957a93 100644 --- a/apps/desktop/src/locales/eo/messages.json +++ b/apps/desktop/src/locales/eo/messages.json @@ -36,7 +36,7 @@ "message": "Kolektoj" }, "searchVault": { - "message": "Traserĉi trezorejon" + "message": "Traserĉi la trezorejon" }, "addItem": { "message": "Aldoni eron" @@ -2745,14 +2745,23 @@ "loginInitiated": { "message": "Login initiated" }, + "logInRequestSent": { + "message": "Request sent" + }, "notificationSentDevice": { "message": "A notification has been sent to your device." }, "aNotificationWasSentToYourDevice": { "message": "A notification was sent to your device" }, - "makeSureYourAccountIsUnlockedAndTheFingerprintEtc": { - "message": "Make sure your account is unlocked and the fingerprint phrase matches on the other device" + "notificationSentDevicePart1": { + "message": "Unlock Bitwarden on your device or on the " + }, + "notificationSentDeviceAnchor": { + "message": "web app" + }, + "notificationSentDevicePart2": { + "message": "Make sure the Fingerprint phrase matches the one below before approving." }, "needAnotherOptionV1": { "message": "Need another option?" @@ -2782,11 +2791,11 @@ "message": "Toggle character count", "description": "'Character count' describes a feature that displays a number next to each character of the password." }, - "areYouTryingtoLogin": { - "message": "Are you trying to log in?" + "areYouTryingToAccessYourAccount": { + "message": "Are you trying to access your account?" }, - "logInAttemptBy": { - "message": "Login attempt by $EMAIL$", + "accessAttemptBy": { + "message": "Access attempt by $EMAIL$", "placeholders": { "email": { "content": "$1", @@ -2803,11 +2812,11 @@ "time": { "message": "Tempo" }, - "confirmLogIn": { - "message": "Confirm login" + "confirmAccess": { + "message": "Confirm access" }, - "denyLogIn": { - "message": "Deny login" + "denyAccess": { + "message": "Deny access" }, "logInConfirmedForEmailOnDevice": { "message": "Login confirmed for $EMAIL$ on $DEVICE$", @@ -2843,8 +2852,8 @@ "thisRequestIsNoLongerValid": { "message": "This request is no longer valid." }, - "confirmLoginAtemptForMail": { - "message": "Confirm login attempt for $EMAIL$", + "confirmAccessAttempt": { + "message": "Confirm access attempt for $EMAIL$", "placeholders": { "email": { "content": "$1", @@ -2855,6 +2864,9 @@ "logInRequested": { "message": "Log in requested" }, + "accountAccessRequested": { + "message": "Account access requested" + }, "creatingAccountOn": { "message": "Creating account on" }, @@ -3484,14 +3496,17 @@ "changeAcctEmail": { "message": "Change account email" }, - "organizationUpgradeRequired": { - "message": "Organization upgrade required" + "allowScreenshots": { + "message": "Allow screen capture" }, - "upgradeOrganization": { - "message": "Upgrade organization" + "allowScreenshotsDesc": { + "message": "Allow the Bitwarden desktop application to be captured in screenshots and viewed in remote desktop sessions. Disabling this will prevent access on some external displays." }, - "upgradeOrganizationDesc": { - "message": "This feature is not available for free organizations. Switch to a paid plan to unlock more features." + "confirmWindowStillVisibleTitle": { + "message": "Confirm window still visible" + }, + "confirmWindowStillVisibleContent": { + "message": "Please confirm that the window is still visible." }, "updateBrowserOrDisableFingerprintDialogTitle": { "message": "Extension update required" diff --git a/apps/desktop/src/locales/es/messages.json b/apps/desktop/src/locales/es/messages.json index 50737ed8d51..49ca15bfed2 100644 --- a/apps/desktop/src/locales/es/messages.json +++ b/apps/desktop/src/locales/es/messages.json @@ -2745,14 +2745,23 @@ "loginInitiated": { "message": "Inicio de sesión iniciado" }, + "logInRequestSent": { + "message": "Request sent" + }, "notificationSentDevice": { "message": "Se ha enviado una notificación a tu dispositivo." }, "aNotificationWasSentToYourDevice": { "message": "A notification was sent to your device" }, - "makeSureYourAccountIsUnlockedAndTheFingerprintEtc": { - "message": "Make sure your account is unlocked and the fingerprint phrase matches on the other device" + "notificationSentDevicePart1": { + "message": "Unlock Bitwarden on your device or on the " + }, + "notificationSentDeviceAnchor": { + "message": "web app" + }, + "notificationSentDevicePart2": { + "message": "Make sure the Fingerprint phrase matches the one below before approving." }, "needAnotherOptionV1": { "message": "Need another option?" @@ -2782,11 +2791,11 @@ "message": "Activar recuento de caracteres", "description": "'Character count' describes a feature that displays a number next to each character of the password." }, - "areYouTryingtoLogin": { - "message": "¿Estás intentando iniciar sesión?" + "areYouTryingToAccessYourAccount": { + "message": "Are you trying to access your account?" }, - "logInAttemptBy": { - "message": "Intento de inicio de sesión de $EMAIL$", + "accessAttemptBy": { + "message": "Access attempt by $EMAIL$", "placeholders": { "email": { "content": "$1", @@ -2803,11 +2812,11 @@ "time": { "message": "Hora" }, - "confirmLogIn": { - "message": "Confirmar inicio de sesión" + "confirmAccess": { + "message": "Confirm access" }, - "denyLogIn": { - "message": "Denegar inicio de sesión" + "denyAccess": { + "message": "Deny access" }, "logInConfirmedForEmailOnDevice": { "message": "Inicio de sesión confirmado para $EMAIL$ en $DEVICE$", @@ -2843,8 +2852,8 @@ "thisRequestIsNoLongerValid": { "message": "Esta solicitud ya no es válida." }, - "confirmLoginAtemptForMail": { - "message": "Confirmar intento de inicio de sesión para $EMAIL$", + "confirmAccessAttempt": { + "message": "Confirm access attempt for $EMAIL$", "placeholders": { "email": { "content": "$1", @@ -2855,6 +2864,9 @@ "logInRequested": { "message": "Inicio de sesión solicitado" }, + "accountAccessRequested": { + "message": "Account access requested" + }, "creatingAccountOn": { "message": "Creando una cuenta en" }, @@ -3484,14 +3496,17 @@ "changeAcctEmail": { "message": "Change account email" }, - "organizationUpgradeRequired": { - "message": "Organization upgrade required" + "allowScreenshots": { + "message": "Allow screen capture" }, - "upgradeOrganization": { - "message": "Upgrade organization" + "allowScreenshotsDesc": { + "message": "Allow the Bitwarden desktop application to be captured in screenshots and viewed in remote desktop sessions. Disabling this will prevent access on some external displays." }, - "upgradeOrganizationDesc": { - "message": "This feature is not available for free organizations. Switch to a paid plan to unlock more features." + "confirmWindowStillVisibleTitle": { + "message": "Confirm window still visible" + }, + "confirmWindowStillVisibleContent": { + "message": "Please confirm that the window is still visible." }, "updateBrowserOrDisableFingerprintDialogTitle": { "message": "Extension update required" diff --git a/apps/desktop/src/locales/et/messages.json b/apps/desktop/src/locales/et/messages.json index b90ca62d6f6..a39e9d5d93b 100644 --- a/apps/desktop/src/locales/et/messages.json +++ b/apps/desktop/src/locales/et/messages.json @@ -2745,14 +2745,23 @@ "loginInitiated": { "message": "Alustan sisselogimist" }, + "logInRequestSent": { + "message": "Request sent" + }, "notificationSentDevice": { "message": "Sinu seadmesse saadeti teavitus." }, "aNotificationWasSentToYourDevice": { "message": "A notification was sent to your device" }, - "makeSureYourAccountIsUnlockedAndTheFingerprintEtc": { - "message": "Make sure your account is unlocked and the fingerprint phrase matches on the other device" + "notificationSentDevicePart1": { + "message": "Unlock Bitwarden on your device or on the " + }, + "notificationSentDeviceAnchor": { + "message": "web app" + }, + "notificationSentDevicePart2": { + "message": "Make sure the Fingerprint phrase matches the one below before approving." }, "needAnotherOptionV1": { "message": "Need another option?" @@ -2782,11 +2791,11 @@ "message": "Loenda kirjatähtede hulka", "description": "'Character count' describes a feature that displays a number next to each character of the password." }, - "areYouTryingtoLogin": { - "message": "Oled sisse logimas?" + "areYouTryingToAccessYourAccount": { + "message": "Are you trying to access your account?" }, - "logInAttemptBy": { - "message": "Sisselogimise päring $EMAIL$-lt", + "accessAttemptBy": { + "message": "Access attempt by $EMAIL$", "placeholders": { "email": { "content": "$1", @@ -2803,11 +2812,11 @@ "time": { "message": "Aeg" }, - "confirmLogIn": { - "message": "Kinnita sisselogimine" + "confirmAccess": { + "message": "Confirm access" }, - "denyLogIn": { - "message": "Tühista sisselogimine" + "denyAccess": { + "message": "Deny access" }, "logInConfirmedForEmailOnDevice": { "message": "$EMAIL$ sisselogimine seadmes $DEVICE$ on kinnitatud", @@ -2843,8 +2852,8 @@ "thisRequestIsNoLongerValid": { "message": "See päring ei ole enam kehtiv." }, - "confirmLoginAtemptForMail": { - "message": "Kinnita sisselogimise katse $EMAIL$-le", + "confirmAccessAttempt": { + "message": "Confirm access attempt for $EMAIL$", "placeholders": { "email": { "content": "$1", @@ -2855,6 +2864,9 @@ "logInRequested": { "message": "Sisselogimise päring on saadetud" }, + "accountAccessRequested": { + "message": "Account access requested" + }, "creatingAccountOn": { "message": "Loon kontot asukohas" }, @@ -3484,14 +3496,17 @@ "changeAcctEmail": { "message": "Change account email" }, - "organizationUpgradeRequired": { - "message": "Organization upgrade required" + "allowScreenshots": { + "message": "Allow screen capture" }, - "upgradeOrganization": { - "message": "Upgrade organization" + "allowScreenshotsDesc": { + "message": "Allow the Bitwarden desktop application to be captured in screenshots and viewed in remote desktop sessions. Disabling this will prevent access on some external displays." }, - "upgradeOrganizationDesc": { - "message": "This feature is not available for free organizations. Switch to a paid plan to unlock more features." + "confirmWindowStillVisibleTitle": { + "message": "Confirm window still visible" + }, + "confirmWindowStillVisibleContent": { + "message": "Please confirm that the window is still visible." }, "updateBrowserOrDisableFingerprintDialogTitle": { "message": "Extension update required" diff --git a/apps/desktop/src/locales/eu/messages.json b/apps/desktop/src/locales/eu/messages.json index 0ecef30080b..2c842c561e5 100644 --- a/apps/desktop/src/locales/eu/messages.json +++ b/apps/desktop/src/locales/eu/messages.json @@ -2745,14 +2745,23 @@ "loginInitiated": { "message": "Login initiated" }, + "logInRequestSent": { + "message": "Request sent" + }, "notificationSentDevice": { "message": "A notification has been sent to your device." }, "aNotificationWasSentToYourDevice": { "message": "A notification was sent to your device" }, - "makeSureYourAccountIsUnlockedAndTheFingerprintEtc": { - "message": "Make sure your account is unlocked and the fingerprint phrase matches on the other device" + "notificationSentDevicePart1": { + "message": "Unlock Bitwarden on your device or on the " + }, + "notificationSentDeviceAnchor": { + "message": "web app" + }, + "notificationSentDevicePart2": { + "message": "Make sure the Fingerprint phrase matches the one below before approving." }, "needAnotherOptionV1": { "message": "Need another option?" @@ -2782,11 +2791,11 @@ "message": "Toggle character count", "description": "'Character count' describes a feature that displays a number next to each character of the password." }, - "areYouTryingtoLogin": { - "message": "Are you trying to log in?" + "areYouTryingToAccessYourAccount": { + "message": "Are you trying to access your account?" }, - "logInAttemptBy": { - "message": "Login attempt by $EMAIL$", + "accessAttemptBy": { + "message": "Access attempt by $EMAIL$", "placeholders": { "email": { "content": "$1", @@ -2803,11 +2812,11 @@ "time": { "message": "Time" }, - "confirmLogIn": { - "message": "Confirm login" + "confirmAccess": { + "message": "Confirm access" }, - "denyLogIn": { - "message": "Deny login" + "denyAccess": { + "message": "Deny access" }, "logInConfirmedForEmailOnDevice": { "message": "Login confirmed for $EMAIL$ on $DEVICE$", @@ -2843,8 +2852,8 @@ "thisRequestIsNoLongerValid": { "message": "This request is no longer valid." }, - "confirmLoginAtemptForMail": { - "message": "Confirm login attempt for $EMAIL$", + "confirmAccessAttempt": { + "message": "Confirm access attempt for $EMAIL$", "placeholders": { "email": { "content": "$1", @@ -2855,6 +2864,9 @@ "logInRequested": { "message": "Log in requested" }, + "accountAccessRequested": { + "message": "Account access requested" + }, "creatingAccountOn": { "message": "Creating account on" }, @@ -3484,14 +3496,17 @@ "changeAcctEmail": { "message": "Change account email" }, - "organizationUpgradeRequired": { - "message": "Organization upgrade required" + "allowScreenshots": { + "message": "Allow screen capture" }, - "upgradeOrganization": { - "message": "Upgrade organization" + "allowScreenshotsDesc": { + "message": "Allow the Bitwarden desktop application to be captured in screenshots and viewed in remote desktop sessions. Disabling this will prevent access on some external displays." }, - "upgradeOrganizationDesc": { - "message": "This feature is not available for free organizations. Switch to a paid plan to unlock more features." + "confirmWindowStillVisibleTitle": { + "message": "Confirm window still visible" + }, + "confirmWindowStillVisibleContent": { + "message": "Please confirm that the window is still visible." }, "updateBrowserOrDisableFingerprintDialogTitle": { "message": "Extension update required" diff --git a/apps/desktop/src/locales/fa/messages.json b/apps/desktop/src/locales/fa/messages.json index aa7c772795d..182cbc11da0 100644 --- a/apps/desktop/src/locales/fa/messages.json +++ b/apps/desktop/src/locales/fa/messages.json @@ -2745,14 +2745,23 @@ "loginInitiated": { "message": "ورود به سیستم آغاز شد" }, + "logInRequestSent": { + "message": "Request sent" + }, "notificationSentDevice": { "message": "یک اعلان به دستگاه شما ارسال شده است." }, "aNotificationWasSentToYourDevice": { "message": "A notification was sent to your device" }, - "makeSureYourAccountIsUnlockedAndTheFingerprintEtc": { - "message": "Make sure your account is unlocked and the fingerprint phrase matches on the other device" + "notificationSentDevicePart1": { + "message": "Unlock Bitwarden on your device or on the " + }, + "notificationSentDeviceAnchor": { + "message": "web app" + }, + "notificationSentDevicePart2": { + "message": "Make sure the Fingerprint phrase matches the one below before approving." }, "needAnotherOptionV1": { "message": "Need another option?" @@ -2782,11 +2791,11 @@ "message": "تغییر تعداد کاراکترها", "description": "'Character count' describes a feature that displays a number next to each character of the password." }, - "areYouTryingtoLogin": { - "message": "آیا در تلاش برای ورود به سیستم هستید؟" + "areYouTryingToAccessYourAccount": { + "message": "Are you trying to access your account?" }, - "logInAttemptBy": { - "message": "تلاش برای ورود به سیستم توسط $EMAIL$", + "accessAttemptBy": { + "message": "Access attempt by $EMAIL$", "placeholders": { "email": { "content": "$1", @@ -2803,11 +2812,11 @@ "time": { "message": "زمان" }, - "confirmLogIn": { - "message": "تأیید ورود" + "confirmAccess": { + "message": "Confirm access" }, - "denyLogIn": { - "message": "رد ورود" + "denyAccess": { + "message": "Deny access" }, "logInConfirmedForEmailOnDevice": { "message": "ورود به سیستم برای $EMAIL$ در $DEVICE$ تأیید شد", @@ -2843,8 +2852,8 @@ "thisRequestIsNoLongerValid": { "message": "این درخواست دیگر معتبر نیست." }, - "confirmLoginAtemptForMail": { - "message": "تأیید تلاش برای ورود به سیستم برای $EMAIL$", + "confirmAccessAttempt": { + "message": "Confirm access attempt for $EMAIL$", "placeholders": { "email": { "content": "$1", @@ -2855,6 +2864,9 @@ "logInRequested": { "message": "ورود الزامیست" }, + "accountAccessRequested": { + "message": "Account access requested" + }, "creatingAccountOn": { "message": "Creating account on" }, @@ -3484,14 +3496,17 @@ "changeAcctEmail": { "message": "Change account email" }, - "organizationUpgradeRequired": { - "message": "Organization upgrade required" + "allowScreenshots": { + "message": "Allow screen capture" }, - "upgradeOrganization": { - "message": "Upgrade organization" + "allowScreenshotsDesc": { + "message": "Allow the Bitwarden desktop application to be captured in screenshots and viewed in remote desktop sessions. Disabling this will prevent access on some external displays." }, - "upgradeOrganizationDesc": { - "message": "This feature is not available for free organizations. Switch to a paid plan to unlock more features." + "confirmWindowStillVisibleTitle": { + "message": "Confirm window still visible" + }, + "confirmWindowStillVisibleContent": { + "message": "Please confirm that the window is still visible." }, "updateBrowserOrDisableFingerprintDialogTitle": { "message": "Extension update required" diff --git a/apps/desktop/src/locales/fi/messages.json b/apps/desktop/src/locales/fi/messages.json index d92c6a6df31..f182343f11e 100644 --- a/apps/desktop/src/locales/fi/messages.json +++ b/apps/desktop/src/locales/fi/messages.json @@ -2745,14 +2745,23 @@ "loginInitiated": { "message": "Kirjautuminen aloitettu" }, + "logInRequestSent": { + "message": "Request sent" + }, "notificationSentDevice": { "message": "Laitteellesi on lähetetty ilmoitus." }, "aNotificationWasSentToYourDevice": { "message": "Laitteeseesi lähetettiin ilmoitus" }, - "makeSureYourAccountIsUnlockedAndTheFingerprintEtc": { - "message": "Varmista, että vahvistavan laitteen holvi on avattu ja että se näyttää saman tunnistelausekkeen" + "notificationSentDevicePart1": { + "message": "Unlock Bitwarden on your device or on the " + }, + "notificationSentDeviceAnchor": { + "message": "web app" + }, + "notificationSentDevicePart2": { + "message": "Make sure the Fingerprint phrase matches the one below before approving." }, "needAnotherOptionV1": { "message": "Tarvitsetko toisen vaihtoehdon?" @@ -2782,11 +2791,11 @@ "message": "Näytä/piilota merkkikohtainen numerointi", "description": "'Character count' describes a feature that displays a number next to each character of the password." }, - "areYouTryingtoLogin": { - "message": "Yritätkö kirjautua sisään?" + "areYouTryingToAccessYourAccount": { + "message": "Are you trying to access your account?" }, - "logInAttemptBy": { - "message": "Kirjautumisyritys tunnuksella $EMAIL$.", + "accessAttemptBy": { + "message": "Access attempt by $EMAIL$", "placeholders": { "email": { "content": "$1", @@ -2803,11 +2812,11 @@ "time": { "message": "Aika" }, - "confirmLogIn": { - "message": "Vahvista kirjautuminen" + "confirmAccess": { + "message": "Confirm access" }, - "denyLogIn": { - "message": "Hylkää kirjautuminen" + "denyAccess": { + "message": "Deny access" }, "logInConfirmedForEmailOnDevice": { "message": "Kirjautuminen vahvistettu tunnuksella $EMAIL$ alustalla $DEVICE$", @@ -2843,8 +2852,8 @@ "thisRequestIsNoLongerValid": { "message": "Pyyntö ei ole enää voimassa." }, - "confirmLoginAtemptForMail": { - "message": "Vahvista kirjautuminen tunnuksella $EMAIL$", + "confirmAccessAttempt": { + "message": "Confirm access attempt for $EMAIL$", "placeholders": { "email": { "content": "$1", @@ -2855,6 +2864,9 @@ "logInRequested": { "message": "Kirjautumista pyydetty" }, + "accountAccessRequested": { + "message": "Account access requested" + }, "creatingAccountOn": { "message": "Luodaan tili palvelimelle" }, @@ -3484,14 +3496,17 @@ "changeAcctEmail": { "message": "Muuta tilin sähköpostiosoitetta" }, - "organizationUpgradeRequired": { - "message": "Organisaation päivitys vaaditaan" + "allowScreenshots": { + "message": "Allow screen capture" }, - "upgradeOrganization": { - "message": "Päivitä organisaatio" + "allowScreenshotsDesc": { + "message": "Allow the Bitwarden desktop application to be captured in screenshots and viewed in remote desktop sessions. Disabling this will prevent access on some external displays." }, - "upgradeOrganizationDesc": { - "message": "Ominaisuus ei ole ilmaisorganisaatioiden käytettävissä. Avaa lisää ominaisuuksia vaihtamalla maksulliseen tilaukseen." + "confirmWindowStillVisibleTitle": { + "message": "Confirm window still visible" + }, + "confirmWindowStillVisibleContent": { + "message": "Please confirm that the window is still visible." }, "updateBrowserOrDisableFingerprintDialogTitle": { "message": "Extension update required" diff --git a/apps/desktop/src/locales/fil/messages.json b/apps/desktop/src/locales/fil/messages.json index cfb4759ed12..51ed7ba776d 100644 --- a/apps/desktop/src/locales/fil/messages.json +++ b/apps/desktop/src/locales/fil/messages.json @@ -2745,14 +2745,23 @@ "loginInitiated": { "message": "Login initiated" }, + "logInRequestSent": { + "message": "Request sent" + }, "notificationSentDevice": { "message": "Naipadala na ang notification sa iyong device." }, "aNotificationWasSentToYourDevice": { "message": "A notification was sent to your device" }, - "makeSureYourAccountIsUnlockedAndTheFingerprintEtc": { - "message": "Make sure your account is unlocked and the fingerprint phrase matches on the other device" + "notificationSentDevicePart1": { + "message": "Unlock Bitwarden on your device or on the " + }, + "notificationSentDeviceAnchor": { + "message": "web app" + }, + "notificationSentDevicePart2": { + "message": "Make sure the Fingerprint phrase matches the one below before approving." }, "needAnotherOptionV1": { "message": "Need another option?" @@ -2782,11 +2791,11 @@ "message": "I-toggle ang bilang ng character", "description": "'Character count' describes a feature that displays a number next to each character of the password." }, - "areYouTryingtoLogin": { - "message": "Sinusubukan mo bang mag-log in?" + "areYouTryingToAccessYourAccount": { + "message": "Are you trying to access your account?" }, - "logInAttemptBy": { - "message": "Pag-login pagtatangka sa pamamagitan ng $EMAIL$", + "accessAttemptBy": { + "message": "Access attempt by $EMAIL$", "placeholders": { "email": { "content": "$1", @@ -2803,11 +2812,11 @@ "time": { "message": "Oras na" }, - "confirmLogIn": { - "message": "Kumpirmahin ang pag-login" + "confirmAccess": { + "message": "Confirm access" }, - "denyLogIn": { - "message": "Tanggihan ang pag login" + "denyAccess": { + "message": "Deny access" }, "logInConfirmedForEmailOnDevice": { "message": "Nakumpirma ang pag-login para sa $EMAIL$ sa $DEVICE$", @@ -2843,8 +2852,8 @@ "thisRequestIsNoLongerValid": { "message": "Hindi na valid ang request na ito." }, - "confirmLoginAtemptForMail": { - "message": "Kumpirmahin ang pagtatangka sa pag-login para sa $EMAIL$", + "confirmAccessAttempt": { + "message": "Confirm access attempt for $EMAIL$", "placeholders": { "email": { "content": "$1", @@ -2855,6 +2864,9 @@ "logInRequested": { "message": "Hiniling ang pag log in" }, + "accountAccessRequested": { + "message": "Account access requested" + }, "creatingAccountOn": { "message": "Creating account on" }, @@ -3484,14 +3496,17 @@ "changeAcctEmail": { "message": "Change account email" }, - "organizationUpgradeRequired": { - "message": "Organization upgrade required" + "allowScreenshots": { + "message": "Allow screen capture" }, - "upgradeOrganization": { - "message": "Upgrade organization" + "allowScreenshotsDesc": { + "message": "Allow the Bitwarden desktop application to be captured in screenshots and viewed in remote desktop sessions. Disabling this will prevent access on some external displays." }, - "upgradeOrganizationDesc": { - "message": "This feature is not available for free organizations. Switch to a paid plan to unlock more features." + "confirmWindowStillVisibleTitle": { + "message": "Confirm window still visible" + }, + "confirmWindowStillVisibleContent": { + "message": "Please confirm that the window is still visible." }, "updateBrowserOrDisableFingerprintDialogTitle": { "message": "Extension update required" diff --git a/apps/desktop/src/locales/fr/messages.json b/apps/desktop/src/locales/fr/messages.json index aa1c1d69f57..31113ef5142 100644 --- a/apps/desktop/src/locales/fr/messages.json +++ b/apps/desktop/src/locales/fr/messages.json @@ -2745,14 +2745,23 @@ "loginInitiated": { "message": "Connexion initiée" }, + "logInRequestSent": { + "message": "Request sent" + }, "notificationSentDevice": { "message": "Une notification a été envoyée à votre appareil." }, "aNotificationWasSentToYourDevice": { "message": "A notification was sent to your device" }, - "makeSureYourAccountIsUnlockedAndTheFingerprintEtc": { - "message": "Assurez-vous que votre compte est déverrouillé et que la phrase d'empreinte digitale correspond à celle de l'autre appareil" + "notificationSentDevicePart1": { + "message": "Unlock Bitwarden on your device or on the " + }, + "notificationSentDeviceAnchor": { + "message": "web app" + }, + "notificationSentDevicePart2": { + "message": "Make sure the Fingerprint phrase matches the one below before approving." }, "needAnotherOptionV1": { "message": "Besoin d'une autre option ?" @@ -2782,11 +2791,11 @@ "message": "Activer / désactiver le compte de caractères", "description": "'Character count' describes a feature that displays a number next to each character of the password." }, - "areYouTryingtoLogin": { - "message": "Essayez-vous de vous connecter ?" + "areYouTryingToAccessYourAccount": { + "message": "Are you trying to access your account?" }, - "logInAttemptBy": { - "message": "Tentative de connexion par $EMAIL$", + "accessAttemptBy": { + "message": "Access attempt by $EMAIL$", "placeholders": { "email": { "content": "$1", @@ -2803,11 +2812,11 @@ "time": { "message": "Heure" }, - "confirmLogIn": { - "message": "Confirmer la connexion" + "confirmAccess": { + "message": "Confirm access" }, - "denyLogIn": { - "message": "Refuser la connexion" + "denyAccess": { + "message": "Deny access" }, "logInConfirmedForEmailOnDevice": { "message": "Connexion confirmée pour $EMAIL$ sur $DEVICE$", @@ -2843,8 +2852,8 @@ "thisRequestIsNoLongerValid": { "message": "Cette demande n'est plus valide." }, - "confirmLoginAtemptForMail": { - "message": "Confirmer la tentative de connexion pour $EMAIL$", + "confirmAccessAttempt": { + "message": "Confirm access attempt for $EMAIL$", "placeholders": { "email": { "content": "$1", @@ -2855,6 +2864,9 @@ "logInRequested": { "message": "Connexion demandée" }, + "accountAccessRequested": { + "message": "Account access requested" + }, "creatingAccountOn": { "message": "Création du compte sur" }, @@ -3484,14 +3496,17 @@ "changeAcctEmail": { "message": "Changer le courriel du compte" }, - "organizationUpgradeRequired": { - "message": "Organization upgrade required" + "allowScreenshots": { + "message": "Allow screen capture" }, - "upgradeOrganization": { - "message": "Upgrade organization" + "allowScreenshotsDesc": { + "message": "Allow the Bitwarden desktop application to be captured in screenshots and viewed in remote desktop sessions. Disabling this will prevent access on some external displays." }, - "upgradeOrganizationDesc": { - "message": "This feature is not available for free organizations. Switch to a paid plan to unlock more features." + "confirmWindowStillVisibleTitle": { + "message": "Confirm window still visible" + }, + "confirmWindowStillVisibleContent": { + "message": "Please confirm that the window is still visible." }, "updateBrowserOrDisableFingerprintDialogTitle": { "message": "Extension update required" diff --git a/apps/desktop/src/locales/gl/messages.json b/apps/desktop/src/locales/gl/messages.json index 354ca094a78..5bc1f216880 100644 --- a/apps/desktop/src/locales/gl/messages.json +++ b/apps/desktop/src/locales/gl/messages.json @@ -2745,14 +2745,23 @@ "loginInitiated": { "message": "Login initiated" }, + "logInRequestSent": { + "message": "Request sent" + }, "notificationSentDevice": { "message": "A notification has been sent to your device." }, "aNotificationWasSentToYourDevice": { "message": "A notification was sent to your device" }, - "makeSureYourAccountIsUnlockedAndTheFingerprintEtc": { - "message": "Make sure your account is unlocked and the fingerprint phrase matches on the other device" + "notificationSentDevicePart1": { + "message": "Unlock Bitwarden on your device or on the " + }, + "notificationSentDeviceAnchor": { + "message": "web app" + }, + "notificationSentDevicePart2": { + "message": "Make sure the Fingerprint phrase matches the one below before approving." }, "needAnotherOptionV1": { "message": "Need another option?" @@ -2782,11 +2791,11 @@ "message": "Toggle character count", "description": "'Character count' describes a feature that displays a number next to each character of the password." }, - "areYouTryingtoLogin": { - "message": "Are you trying to log in?" + "areYouTryingToAccessYourAccount": { + "message": "Are you trying to access your account?" }, - "logInAttemptBy": { - "message": "Login attempt by $EMAIL$", + "accessAttemptBy": { + "message": "Access attempt by $EMAIL$", "placeholders": { "email": { "content": "$1", @@ -2803,11 +2812,11 @@ "time": { "message": "Time" }, - "confirmLogIn": { - "message": "Confirm login" + "confirmAccess": { + "message": "Confirm access" }, - "denyLogIn": { - "message": "Deny login" + "denyAccess": { + "message": "Deny access" }, "logInConfirmedForEmailOnDevice": { "message": "Login confirmed for $EMAIL$ on $DEVICE$", @@ -2843,8 +2852,8 @@ "thisRequestIsNoLongerValid": { "message": "This request is no longer valid." }, - "confirmLoginAtemptForMail": { - "message": "Confirm login attempt for $EMAIL$", + "confirmAccessAttempt": { + "message": "Confirm access attempt for $EMAIL$", "placeholders": { "email": { "content": "$1", @@ -2855,6 +2864,9 @@ "logInRequested": { "message": "Log in requested" }, + "accountAccessRequested": { + "message": "Account access requested" + }, "creatingAccountOn": { "message": "Creating account on" }, @@ -3484,14 +3496,17 @@ "changeAcctEmail": { "message": "Change account email" }, - "organizationUpgradeRequired": { - "message": "Organization upgrade required" + "allowScreenshots": { + "message": "Allow screen capture" }, - "upgradeOrganization": { - "message": "Upgrade organization" + "allowScreenshotsDesc": { + "message": "Allow the Bitwarden desktop application to be captured in screenshots and viewed in remote desktop sessions. Disabling this will prevent access on some external displays." }, - "upgradeOrganizationDesc": { - "message": "This feature is not available for free organizations. Switch to a paid plan to unlock more features." + "confirmWindowStillVisibleTitle": { + "message": "Confirm window still visible" + }, + "confirmWindowStillVisibleContent": { + "message": "Please confirm that the window is still visible." }, "updateBrowserOrDisableFingerprintDialogTitle": { "message": "Extension update required" diff --git a/apps/desktop/src/locales/he/messages.json b/apps/desktop/src/locales/he/messages.json index 33b2a1a287b..d5113b3a29f 100644 --- a/apps/desktop/src/locales/he/messages.json +++ b/apps/desktop/src/locales/he/messages.json @@ -2745,14 +2745,23 @@ "loginInitiated": { "message": "Login initiated" }, + "logInRequestSent": { + "message": "Request sent" + }, "notificationSentDevice": { "message": "התראה נשלחה למכשירך." }, "aNotificationWasSentToYourDevice": { "message": "A notification was sent to your device" }, - "makeSureYourAccountIsUnlockedAndTheFingerprintEtc": { - "message": "Make sure your account is unlocked and the fingerprint phrase matches on the other device" + "notificationSentDevicePart1": { + "message": "Unlock Bitwarden on your device or on the " + }, + "notificationSentDeviceAnchor": { + "message": "web app" + }, + "notificationSentDevicePart2": { + "message": "Make sure the Fingerprint phrase matches the one below before approving." }, "needAnotherOptionV1": { "message": "Need another option?" @@ -2782,11 +2791,11 @@ "message": "החלפת מצב ספירת תווים", "description": "'Character count' describes a feature that displays a number next to each character of the password." }, - "areYouTryingtoLogin": { - "message": "האם את/ה מנסה להתחבר? " + "areYouTryingToAccessYourAccount": { + "message": "Are you trying to access your account?" }, - "logInAttemptBy": { - "message": "ניסיון התחברות של $EMAIL$", + "accessAttemptBy": { + "message": "Access attempt by $EMAIL$", "placeholders": { "email": { "content": "$1", @@ -2803,11 +2812,11 @@ "time": { "message": "זמן" }, - "confirmLogIn": { - "message": "אישור ההתחברות" + "confirmAccess": { + "message": "Confirm access" }, - "denyLogIn": { - "message": "ביטול התחברות" + "denyAccess": { + "message": "Deny access" }, "logInConfirmedForEmailOnDevice": { "message": "התחברות אושרה עבור $EMAIL$ במכשיר $DEVICE$", @@ -2843,8 +2852,8 @@ "thisRequestIsNoLongerValid": { "message": "This request is no longer valid." }, - "confirmLoginAtemptForMail": { - "message": "Confirm login attempt for $EMAIL$", + "confirmAccessAttempt": { + "message": "Confirm access attempt for $EMAIL$", "placeholders": { "email": { "content": "$1", @@ -2855,6 +2864,9 @@ "logInRequested": { "message": "Log in requested" }, + "accountAccessRequested": { + "message": "Account access requested" + }, "creatingAccountOn": { "message": "Creating account on" }, @@ -3484,14 +3496,17 @@ "changeAcctEmail": { "message": "Change account email" }, - "organizationUpgradeRequired": { - "message": "Organization upgrade required" + "allowScreenshots": { + "message": "Allow screen capture" }, - "upgradeOrganization": { - "message": "Upgrade organization" + "allowScreenshotsDesc": { + "message": "Allow the Bitwarden desktop application to be captured in screenshots and viewed in remote desktop sessions. Disabling this will prevent access on some external displays." }, - "upgradeOrganizationDesc": { - "message": "This feature is not available for free organizations. Switch to a paid plan to unlock more features." + "confirmWindowStillVisibleTitle": { + "message": "Confirm window still visible" + }, + "confirmWindowStillVisibleContent": { + "message": "Please confirm that the window is still visible." }, "updateBrowserOrDisableFingerprintDialogTitle": { "message": "Extension update required" diff --git a/apps/desktop/src/locales/hi/messages.json b/apps/desktop/src/locales/hi/messages.json index b5fc39ef715..cc5ee64e2d4 100644 --- a/apps/desktop/src/locales/hi/messages.json +++ b/apps/desktop/src/locales/hi/messages.json @@ -2745,14 +2745,23 @@ "loginInitiated": { "message": "Login initiated" }, + "logInRequestSent": { + "message": "Request sent" + }, "notificationSentDevice": { "message": "A notification has been sent to your device." }, "aNotificationWasSentToYourDevice": { "message": "A notification was sent to your device" }, - "makeSureYourAccountIsUnlockedAndTheFingerprintEtc": { - "message": "Make sure your account is unlocked and the fingerprint phrase matches on the other device" + "notificationSentDevicePart1": { + "message": "Unlock Bitwarden on your device or on the " + }, + "notificationSentDeviceAnchor": { + "message": "web app" + }, + "notificationSentDevicePart2": { + "message": "Make sure the Fingerprint phrase matches the one below before approving." }, "needAnotherOptionV1": { "message": "Need another option?" @@ -2782,11 +2791,11 @@ "message": "Toggle character count", "description": "'Character count' describes a feature that displays a number next to each character of the password." }, - "areYouTryingtoLogin": { - "message": "Are you trying to log in?" + "areYouTryingToAccessYourAccount": { + "message": "Are you trying to access your account?" }, - "logInAttemptBy": { - "message": "Login attempt by $EMAIL$", + "accessAttemptBy": { + "message": "Access attempt by $EMAIL$", "placeholders": { "email": { "content": "$1", @@ -2803,11 +2812,11 @@ "time": { "message": "Time" }, - "confirmLogIn": { - "message": "Confirm login" + "confirmAccess": { + "message": "Confirm access" }, - "denyLogIn": { - "message": "Deny login" + "denyAccess": { + "message": "Deny access" }, "logInConfirmedForEmailOnDevice": { "message": "Login confirmed for $EMAIL$ on $DEVICE$", @@ -2843,8 +2852,8 @@ "thisRequestIsNoLongerValid": { "message": "This request is no longer valid." }, - "confirmLoginAtemptForMail": { - "message": "Confirm login attempt for $EMAIL$", + "confirmAccessAttempt": { + "message": "Confirm access attempt for $EMAIL$", "placeholders": { "email": { "content": "$1", @@ -2855,6 +2864,9 @@ "logInRequested": { "message": "Log in requested" }, + "accountAccessRequested": { + "message": "Account access requested" + }, "creatingAccountOn": { "message": "Creating account on" }, @@ -3484,14 +3496,17 @@ "changeAcctEmail": { "message": "Change account email" }, - "organizationUpgradeRequired": { - "message": "Organization upgrade required" + "allowScreenshots": { + "message": "Allow screen capture" }, - "upgradeOrganization": { - "message": "Upgrade organization" + "allowScreenshotsDesc": { + "message": "Allow the Bitwarden desktop application to be captured in screenshots and viewed in remote desktop sessions. Disabling this will prevent access on some external displays." }, - "upgradeOrganizationDesc": { - "message": "This feature is not available for free organizations. Switch to a paid plan to unlock more features." + "confirmWindowStillVisibleTitle": { + "message": "Confirm window still visible" + }, + "confirmWindowStillVisibleContent": { + "message": "Please confirm that the window is still visible." }, "updateBrowserOrDisableFingerprintDialogTitle": { "message": "Extension update required" diff --git a/apps/desktop/src/locales/hr/messages.json b/apps/desktop/src/locales/hr/messages.json index 98116940199..b8aa5b1f160 100644 --- a/apps/desktop/src/locales/hr/messages.json +++ b/apps/desktop/src/locales/hr/messages.json @@ -250,17 +250,17 @@ "message": "Pogreška" }, "decryptionError": { - "message": "Decryption error" + "message": "Pogreška pri dešifriranju" }, "couldNotDecryptVaultItemsBelow": { - "message": "Bitwarden could not decrypt the vault item(s) listed below." + "message": "Bitwarden nije mogao dešifrirati sljedeće stavke trezora." }, "contactCSToAvoidDataLossPart1": { - "message": "Contact customer success", + "message": "Kontaktiraj službu za korisnike", "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": "kako bi izbjegli gubitak podataka.", "description": "This is part of a larger sentence. The full sentence will read 'Contact customer success to avoid additional data loss.'" }, "january": { @@ -886,13 +886,13 @@ "description": "'Duo Security' and 'Duo Mobile' are product names and should not be translated." }, "verifyIdentity": { - "message": "Verify your Identity" + "message": "Potvrdi svoj identitet" }, "weDontRecognizeThisDevice": { - "message": "We don't recognize this device. Enter the code sent to your email to verify your identity." + "message": "Ne prepoznajemo ovaj uređaj. Za potvrdu identiteta unesi kôd poslan e-poštom." }, "continueLoggingIn": { - "message": "Continue logging in" + "message": "Nastavi prijavu" }, "webAuthnTitle": { "message": "FIDO2 WebAuthn" @@ -1127,7 +1127,7 @@ "message": "Neispravna glavna lozinka" }, "twoStepLoginConfirmation": { - "message": "Prijava dvostrukom autentifikacijom čini tvoj račun još sigurnijim tako što će zahtijevati potvrdu prijave putem drugog uređaja kao što su sigurnosni ključ, autentifikatorske aplikacije, SMS-om, pozivom ili e-poštom. Prijavu dvostrukom autentifikacijom možeš omogućiti na web trezoru. Želiš li sada posjetiti bitwarden.com?" + "message": "Prijava dvostrukom autentifikacijom čini tvoj račun još sigurnijim tako što će zahtijevati potvrdu prijave drugim uređajem kao što je sigurnosni ključ, autentifikatorska aplikacija, SMS, poziv ili e-pošta. Prijavu dvostrukom autentifikacijom možeš omogućiti na web trezoru. Želiš li sada posjetiti bitwarden.com?" }, "twoStepLogin": { "message": "Prijava dvostrukom autentifikacijom" @@ -2551,7 +2551,7 @@ "message": "Koristi konfigurirani catch-all sandučić svoje domene." }, "useThisEmail": { - "message": "Use this email" + "message": "Koristi ovu e-poštu" }, "random": { "message": "Nasumično" @@ -2745,14 +2745,23 @@ "loginInitiated": { "message": "Prijava pokrenuta" }, + "logInRequestSent": { + "message": "Zahtjev poslan" + }, "notificationSentDevice": { "message": "Obavijest je poslana na tvoj uređaj." }, "aNotificationWasSentToYourDevice": { "message": "Obavijest je poslana na tvoj uređaj" }, - "makeSureYourAccountIsUnlockedAndTheFingerprintEtc": { - "message": "Provjeri je li trezor otključan i slaže li se jedinstvena fraza s drugim uređajem" + "notificationSentDevicePart1": { + "message": "Otključaj Bitwarden na svojem uređaju ili na " + }, + "notificationSentDeviceAnchor": { + "message": "web trezoru" + }, + "notificationSentDevicePart2": { + "message": "Provjeri slaže li se jedinstvena fraza s ovdje prikazanom prije odobravanja." }, "needAnotherOptionV1": { "message": "Trebaš drugu opciju?" @@ -2782,11 +2791,11 @@ "message": "Prikaži/Sakrij broj znakova", "description": "'Character count' describes a feature that displays a number next to each character of the password." }, - "areYouTryingtoLogin": { - "message": "Pokušavaš li se prijaviti?" + "areYouTryingToAccessYourAccount": { + "message": "Pokušavaš li pristupiti svom računu?" }, - "logInAttemptBy": { - "message": "$EMAIL$ se pokušava prijaviti", + "accessAttemptBy": { + "message": "$EMAIL$ pokušava pristupiti", "placeholders": { "email": { "content": "$1", @@ -2803,11 +2812,11 @@ "time": { "message": "Vrijeme" }, - "confirmLogIn": { - "message": "Potvrdi prijavu" + "confirmAccess": { + "message": "Potvrdi pristup" }, - "denyLogIn": { - "message": "Odbij prijavu" + "denyAccess": { + "message": "Odbij pristup" }, "logInConfirmedForEmailOnDevice": { "message": "Prijava za $EMAIL$ potvrđena na uređaju $DEVICE$", @@ -2843,7 +2852,7 @@ "thisRequestIsNoLongerValid": { "message": "Ovaj zahtjev više nije valjan." }, - "confirmLoginAtemptForMail": { + "confirmAccessAttempt": { "message": "Potvrdi pokušaj prijave za $EMAIL$", "placeholders": { "email": { @@ -2855,6 +2864,9 @@ "logInRequested": { "message": "Zatražena je prijava" }, + "accountAccessRequested": { + "message": "Zatražen je pristup računu" + }, "creatingAccountOn": { "message": "Stvaranje računa na" }, @@ -2889,10 +2901,10 @@ "message": "Slaba lozinka je nađena među ukradenima tijekom krađa podataka. Za zaštitu svog računa koristi jaku i jedinstvenu lozinku. Želiš li svejedno korisiti slabu, ukradenu lozinku?" }, "useThisPassword": { - "message": "Use this password" + "message": "Koristi ovu lozinku" }, "useThisUsername": { - "message": "Use this username" + "message": "Koristi ovo korisničko ime" }, "checkForBreaches": { "message": "Provjeri je li lozinka ukradena prilikom krađe podataka" @@ -3392,19 +3404,19 @@ "message": "Nisu nađeni slobodni portovi za SSO prijavu." }, "biometricsStatusHelptextUnlockNeeded": { - "message": "Biometric unlock is unavailable because PIN or password unlock is required first." + "message": "Biometrijsko otključavanje nije dostupno jer je prvo potrebno otključati PIN-om ili lozinkom." }, "biometricsStatusHelptextHardwareUnavailable": { - "message": "Biometric unlock is currently unavailable." + "message": "Biometrijsko otključavanje trenutno nije dostupno." }, "biometricsStatusHelptextAutoSetupNeeded": { - "message": "Biometric unlock is unavailable due to misconfigured system files." + "message": "Biometrijsko otključavanje nije dostupno zbog pogrešno konfiguriranih sistemskih datoteka." }, "biometricsStatusHelptextManualSetupNeeded": { - "message": "Biometric unlock is unavailable due to misconfigured system files." + "message": "Biometrijsko otključavanje nije dostupno zbog pogrešno konfiguriranih sistemskih datoteka." }, "biometricsStatusHelptextNotEnabledLocally": { - "message": "Biometric unlock is unavailable because it is not enabled for $EMAIL$ in the Bitwarden desktop app.", + "message": "Biometrijsko otključavanje nije dostupno jer nije omogućeno za $EMAIL$ u Bitwarden desktop aplikaciji.", "placeholders": { "email": { "content": "$1", @@ -3413,7 +3425,7 @@ } }, "biometricsStatusHelptextUnavailableReasonUnknown": { - "message": "Biometric unlock is currently unavailable for an unknown reason." + "message": "Biometrijsko otključavanje trenutno nije dostupno iz nepoznatog razloga." }, "authorize": { "message": "Autoriziraj" @@ -3484,19 +3496,22 @@ "changeAcctEmail": { "message": "Promjeni e-poštu računa" }, - "organizationUpgradeRequired": { - "message": "Organization upgrade required" + "allowScreenshots": { + "message": "Dozvoli snimanje zaslona" }, - "upgradeOrganization": { - "message": "Upgrade organization" + "allowScreenshotsDesc": { + "message": "Dozvoli da Bitwarden desktop aplikacija bude snimljena u snimkama zaslona i prikazana u sesijama udaljene radne površine. Onemogućavanje ove opcije onemogućit će pristup nekim vanjskim zaslonima." }, - "upgradeOrganizationDesc": { - "message": "This feature is not available for free organizations. Switch to a paid plan to unlock more features." + "confirmWindowStillVisibleTitle": { + "message": "Potvrdi prozor je još uvijek vidljiv" + }, + "confirmWindowStillVisibleContent": { + "message": "Potvrdi da je prozor još uvijek vidljiv." }, "updateBrowserOrDisableFingerprintDialogTitle": { - "message": "Extension update required" + "message": "Potrebno je ažurirati proširenje" }, "updateBrowserOrDisableFingerprintDialogMessage": { - "message": "The browser extension you are using is out of date. Please update it or disable browser integration fingerprint validation in the desktop app settings." + "message": "Proširenje preglednika koje koristitš zastarjelo. Ažuriraj ga ili onemogući provjeru otiska prsta u pregledniku u postavkama aplikacije za stolno računalo." } } diff --git a/apps/desktop/src/locales/hu/messages.json b/apps/desktop/src/locales/hu/messages.json index dac7c8128b4..4bcc210f671 100644 --- a/apps/desktop/src/locales/hu/messages.json +++ b/apps/desktop/src/locales/hu/messages.json @@ -2745,14 +2745,23 @@ "loginInitiated": { "message": "A bejelentkezés elindításra került." }, + "logInRequestSent": { + "message": "A kérés elküldésre került." + }, "notificationSentDevice": { "message": "Egy értesítés lett elküldve az eszközre." }, "aNotificationWasSentToYourDevice": { "message": "Egy értesítés lett elküldve az eszközre." }, - "makeSureYourAccountIsUnlockedAndTheFingerprintEtc": { - "message": "Ellenőrizzük, hogy a széf feloldásra került és az ujjlenyomat kifejezés egyezik a másik eszközön levővel." + "notificationSentDevicePart1": { + "message": "A Bitwarden zárolás feloldása az eszközön vagy: " + }, + "notificationSentDeviceAnchor": { + "message": "webalkalmazás" + }, + "notificationSentDevicePart2": { + "message": "Jóváhagyás előtt győződjünk meg arról, hogy az ujjlenyomat kifejezés megegyezik az alábbi kifejezéssel." }, "needAnotherOptionV1": { "message": "Másik opció szükséges?" @@ -2782,10 +2791,10 @@ "message": "Karakterszámláló váltás", "description": "'Character count' describes a feature that displays a number next to each character of the password." }, - "areYouTryingtoLogin": { - "message": "Megpróbálunk bejelentkezni?" + "areYouTryingToAccessYourAccount": { + "message": "A fiókhoz próbálunk hozzáférni?" }, - "logInAttemptBy": { + "accessAttemptBy": { "message": "Bejelentkezési kísérlet $EMAIL$ segítségével", "placeholders": { "email": { @@ -2803,11 +2812,11 @@ "time": { "message": "Időpont" }, - "confirmLogIn": { - "message": "Bejelentkezés megerősítése" + "confirmAccess": { + "message": "Hozzáférés megerősítése" }, - "denyLogIn": { - "message": "Bejelentkezés megtagadása" + "denyAccess": { + "message": "Hozzáférés megtagadása" }, "logInConfirmedForEmailOnDevice": { "message": "A bejelelentketés $EMAIL$ email címmel megerősítésre került $DEVICE$ eszközön.", @@ -2843,7 +2852,7 @@ "thisRequestIsNoLongerValid": { "message": "A kérés a továbbiakban már nem érvényes." }, - "confirmLoginAtemptForMail": { + "confirmAccessAttempt": { "message": "Bejelentkezési kísérlet megerősítése $EMAIL$ email címmel", "placeholders": { "email": { @@ -2855,6 +2864,9 @@ "logInRequested": { "message": "Bejelentkezés megkérve" }, + "accountAccessRequested": { + "message": "Fiók hozzáférés kérés történt." + }, "creatingAccountOn": { "message": "Fiók létrehozása:" }, @@ -3484,14 +3496,17 @@ "changeAcctEmail": { "message": "Fiók email cím megváltoztatása" }, - "organizationUpgradeRequired": { - "message": "A szervezet felminősítése szükséges." + "allowScreenshots": { + "message": "Képernyőrögzítés engedélyezése" }, - "upgradeOrganization": { - "message": "Szervezeti áttérés" + "allowScreenshotsDesc": { + "message": "Engedélyezi a Bitwarden asztali alkalmazásnak a képernyőképek rögzítését és távoli asztali munkamenetekben megtekintését. Ennek letiltása megakadályozza a hozzáférést bizonyos külső kijelzőkhöz." }, - "upgradeOrganizationDesc": { - "message": "Ez a szolgáltatás nem elérhető ingyenes szervezeteknek. Váltás fizetős díjcsomagra a további funkciók feloldásához." + "confirmWindowStillVisibleTitle": { + "message": "Erősítsük meg, hogy az ablak továbbra is látható." + }, + "confirmWindowStillVisibleContent": { + "message": "Ellenőrizzük, hogy az ablak továbbra is látható-e." }, "updateBrowserOrDisableFingerprintDialogTitle": { "message": "Kiterjesztés frissítés szükséges" diff --git a/apps/desktop/src/locales/id/messages.json b/apps/desktop/src/locales/id/messages.json index 78c8c7ab73f..a74a65ed00a 100644 --- a/apps/desktop/src/locales/id/messages.json +++ b/apps/desktop/src/locales/id/messages.json @@ -2745,14 +2745,23 @@ "loginInitiated": { "message": "Login initiated" }, + "logInRequestSent": { + "message": "Request sent" + }, "notificationSentDevice": { "message": "A notification has been sent to your device." }, "aNotificationWasSentToYourDevice": { "message": "A notification was sent to your device" }, - "makeSureYourAccountIsUnlockedAndTheFingerprintEtc": { - "message": "Make sure your account is unlocked and the fingerprint phrase matches on the other device" + "notificationSentDevicePart1": { + "message": "Unlock Bitwarden on your device or on the " + }, + "notificationSentDeviceAnchor": { + "message": "web app" + }, + "notificationSentDevicePart2": { + "message": "Make sure the Fingerprint phrase matches the one below before approving." }, "needAnotherOptionV1": { "message": "Need another option?" @@ -2782,11 +2791,11 @@ "message": "Toggle character count", "description": "'Character count' describes a feature that displays a number next to each character of the password." }, - "areYouTryingtoLogin": { - "message": "Are you trying to log in?" + "areYouTryingToAccessYourAccount": { + "message": "Are you trying to access your account?" }, - "logInAttemptBy": { - "message": "Login attempt by $EMAIL$", + "accessAttemptBy": { + "message": "Access attempt by $EMAIL$", "placeholders": { "email": { "content": "$1", @@ -2803,11 +2812,11 @@ "time": { "message": "Time" }, - "confirmLogIn": { - "message": "Confirm login" + "confirmAccess": { + "message": "Confirm access" }, - "denyLogIn": { - "message": "Deny login" + "denyAccess": { + "message": "Deny access" }, "logInConfirmedForEmailOnDevice": { "message": "Login confirmed for $EMAIL$ on $DEVICE$", @@ -2843,8 +2852,8 @@ "thisRequestIsNoLongerValid": { "message": "This request is no longer valid." }, - "confirmLoginAtemptForMail": { - "message": "Confirm login attempt for $EMAIL$", + "confirmAccessAttempt": { + "message": "Confirm access attempt for $EMAIL$", "placeholders": { "email": { "content": "$1", @@ -2855,6 +2864,9 @@ "logInRequested": { "message": "Log in requested" }, + "accountAccessRequested": { + "message": "Account access requested" + }, "creatingAccountOn": { "message": "Creating account on" }, @@ -3484,14 +3496,17 @@ "changeAcctEmail": { "message": "Change account email" }, - "organizationUpgradeRequired": { - "message": "Organization upgrade required" + "allowScreenshots": { + "message": "Allow screen capture" }, - "upgradeOrganization": { - "message": "Upgrade organization" + "allowScreenshotsDesc": { + "message": "Allow the Bitwarden desktop application to be captured in screenshots and viewed in remote desktop sessions. Disabling this will prevent access on some external displays." }, - "upgradeOrganizationDesc": { - "message": "This feature is not available for free organizations. Switch to a paid plan to unlock more features." + "confirmWindowStillVisibleTitle": { + "message": "Confirm window still visible" + }, + "confirmWindowStillVisibleContent": { + "message": "Please confirm that the window is still visible." }, "updateBrowserOrDisableFingerprintDialogTitle": { "message": "Extension update required" diff --git a/apps/desktop/src/locales/it/messages.json b/apps/desktop/src/locales/it/messages.json index 2340545e659..a6d3fe6fda6 100644 --- a/apps/desktop/src/locales/it/messages.json +++ b/apps/desktop/src/locales/it/messages.json @@ -2745,14 +2745,23 @@ "loginInitiated": { "message": "Accesso avviato" }, + "logInRequestSent": { + "message": "Richiesta inviata" + }, "notificationSentDevice": { "message": "Una notifica è stata inviata al tuo dispositivo." }, "aNotificationWasSentToYourDevice": { "message": "Una notifica è stata inviata al tuo dispositivo" }, - "makeSureYourAccountIsUnlockedAndTheFingerprintEtc": { - "message": "Assicurati che il tuo account sia sbloccato e che la frase dell'impronta digitale corrisponda nell'altro dispositivo" + "notificationSentDevicePart1": { + "message": "Sblocca Bitwarden sul tuo dispositivo o su " + }, + "notificationSentDeviceAnchor": { + "message": "app web" + }, + "notificationSentDevicePart2": { + "message": "Assicurarsi che la frase di impronta digitale corrisponda a quella sottostante prima dell'approvazione." }, "needAnotherOptionV1": { "message": "Bisogno di un'altra opzione?" @@ -2782,10 +2791,10 @@ "message": "Attiva/disattiva conteggio caratteri", "description": "'Character count' describes a feature that displays a number next to each character of the password." }, - "areYouTryingtoLogin": { - "message": "Stai cercando di accedere?" + "areYouTryingToAccessYourAccount": { + "message": "Stai cercando di accedere al tuo account?" }, - "logInAttemptBy": { + "accessAttemptBy": { "message": "Tentativo di accesso di $EMAIL$", "placeholders": { "email": { @@ -2803,10 +2812,10 @@ "time": { "message": "Ora" }, - "confirmLogIn": { - "message": "Consenti accesso" + "confirmAccess": { + "message": "Conferma accesso" }, - "denyLogIn": { + "denyAccess": { "message": "Nega accesso" }, "logInConfirmedForEmailOnDevice": { @@ -2843,8 +2852,8 @@ "thisRequestIsNoLongerValid": { "message": "La richiesta non è più valida." }, - "confirmLoginAtemptForMail": { - "message": "Conferma il tentativo di accesso di $EMAIL$", + "confirmAccessAttempt": { + "message": "Conferma il tentativo di accesso per $EMAIL$", "placeholders": { "email": { "content": "$1", @@ -2855,6 +2864,9 @@ "logInRequested": { "message": "Accesso richiesto" }, + "accountAccessRequested": { + "message": "Accesso all'account richiesto" + }, "creatingAccountOn": { "message": "Creazione account su" }, @@ -3484,14 +3496,17 @@ "changeAcctEmail": { "message": "Cambia l'e-mail dell'account" }, - "organizationUpgradeRequired": { - "message": "Aggiornamento dell'organizzazione richiesto" + "allowScreenshots": { + "message": "Permetti cattura dello schermo" }, - "upgradeOrganization": { - "message": "Aggiorna organizzazione" + "allowScreenshotsDesc": { + "message": "Consenti all' applicazione desktop Bitwarden di essere catturata in schermate e visualizzata in sessioni desktop remote. Disattivando questa opzione si impedirà l'accesso in alcuni schermi esterni." }, - "upgradeOrganizationDesc": { - "message": "Questa funzione non è disponibile per le organizzazioni gratuite. Passa a un piano a pagamento per sbloccare più funzioni." + "confirmWindowStillVisibleTitle": { + "message": "Conferma la finestra ancora visibile" + }, + "confirmWindowStillVisibleContent": { + "message": "Si prega di confermare che la finestra è ancora visibile." }, "updateBrowserOrDisableFingerprintDialogTitle": { "message": "Aggiornamento estensione richiesto" diff --git a/apps/desktop/src/locales/ja/messages.json b/apps/desktop/src/locales/ja/messages.json index b28f69819f9..fa4c6e7e641 100644 --- a/apps/desktop/src/locales/ja/messages.json +++ b/apps/desktop/src/locales/ja/messages.json @@ -2745,14 +2745,23 @@ "loginInitiated": { "message": "ログイン開始" }, + "logInRequestSent": { + "message": "Request sent" + }, "notificationSentDevice": { "message": "デバイスに通知を送信しました。" }, "aNotificationWasSentToYourDevice": { "message": "お使いのデバイスに通知が送信されました" }, - "makeSureYourAccountIsUnlockedAndTheFingerprintEtc": { - "message": "アカウントがロック解除されていることと、フィンガープリントフレーズが他の端末と一致していることを確認してください" + "notificationSentDevicePart1": { + "message": "Unlock Bitwarden on your device or on the " + }, + "notificationSentDeviceAnchor": { + "message": "web app" + }, + "notificationSentDevicePart2": { + "message": "Make sure the Fingerprint phrase matches the one below before approving." }, "needAnotherOptionV1": { "message": "別の選択肢が必要ですか?" @@ -2782,11 +2791,11 @@ "message": "文字カウントを切り替える", "description": "'Character count' describes a feature that displays a number next to each character of the password." }, - "areYouTryingtoLogin": { - "message": "ログインしようとしていますか?" + "areYouTryingToAccessYourAccount": { + "message": "Are you trying to access your account?" }, - "logInAttemptBy": { - "message": "$EMAIL$ によるログインの試行", + "accessAttemptBy": { + "message": "Access attempt by $EMAIL$", "placeholders": { "email": { "content": "$1", @@ -2803,11 +2812,11 @@ "time": { "message": "時間" }, - "confirmLogIn": { - "message": "ログインを承認" + "confirmAccess": { + "message": "Confirm access" }, - "denyLogIn": { - "message": "ログインを拒否" + "denyAccess": { + "message": "Deny access" }, "logInConfirmedForEmailOnDevice": { "message": "$EMAIL$ に $DEVICE$ でのログインを承認しました", @@ -2843,8 +2852,8 @@ "thisRequestIsNoLongerValid": { "message": "このリクエストは無効になりました。" }, - "confirmLoginAtemptForMail": { - "message": "$EMAIL$ のログイン試行を確認", + "confirmAccessAttempt": { + "message": "Confirm access attempt for $EMAIL$", "placeholders": { "email": { "content": "$1", @@ -2855,6 +2864,9 @@ "logInRequested": { "message": "ログインリクエスト済み" }, + "accountAccessRequested": { + "message": "Account access requested" + }, "creatingAccountOn": { "message": "アカウント作成:" }, @@ -3484,14 +3496,17 @@ "changeAcctEmail": { "message": "アカウントのメールアドレスを変更する" }, - "organizationUpgradeRequired": { - "message": "Organization upgrade required" + "allowScreenshots": { + "message": "Allow screen capture" }, - "upgradeOrganization": { - "message": "Upgrade organization" + "allowScreenshotsDesc": { + "message": "Allow the Bitwarden desktop application to be captured in screenshots and viewed in remote desktop sessions. Disabling this will prevent access on some external displays." }, - "upgradeOrganizationDesc": { - "message": "This feature is not available for free organizations. Switch to a paid plan to unlock more features." + "confirmWindowStillVisibleTitle": { + "message": "Confirm window still visible" + }, + "confirmWindowStillVisibleContent": { + "message": "Please confirm that the window is still visible." }, "updateBrowserOrDisableFingerprintDialogTitle": { "message": "Extension update required" diff --git a/apps/desktop/src/locales/ka/messages.json b/apps/desktop/src/locales/ka/messages.json index 52204b185cc..f5155cd7ccb 100644 --- a/apps/desktop/src/locales/ka/messages.json +++ b/apps/desktop/src/locales/ka/messages.json @@ -2745,14 +2745,23 @@ "loginInitiated": { "message": "Login initiated" }, + "logInRequestSent": { + "message": "Request sent" + }, "notificationSentDevice": { "message": "A notification has been sent to your device." }, "aNotificationWasSentToYourDevice": { "message": "A notification was sent to your device" }, - "makeSureYourAccountIsUnlockedAndTheFingerprintEtc": { - "message": "Make sure your account is unlocked and the fingerprint phrase matches on the other device" + "notificationSentDevicePart1": { + "message": "Unlock Bitwarden on your device or on the " + }, + "notificationSentDeviceAnchor": { + "message": "web app" + }, + "notificationSentDevicePart2": { + "message": "Make sure the Fingerprint phrase matches the one below before approving." }, "needAnotherOptionV1": { "message": "Need another option?" @@ -2782,11 +2791,11 @@ "message": "Toggle character count", "description": "'Character count' describes a feature that displays a number next to each character of the password." }, - "areYouTryingtoLogin": { - "message": "Are you trying to log in?" + "areYouTryingToAccessYourAccount": { + "message": "Are you trying to access your account?" }, - "logInAttemptBy": { - "message": "Login attempt by $EMAIL$", + "accessAttemptBy": { + "message": "Access attempt by $EMAIL$", "placeholders": { "email": { "content": "$1", @@ -2803,11 +2812,11 @@ "time": { "message": "დრო" }, - "confirmLogIn": { - "message": "Confirm login" + "confirmAccess": { + "message": "Confirm access" }, - "denyLogIn": { - "message": "Deny login" + "denyAccess": { + "message": "Deny access" }, "logInConfirmedForEmailOnDevice": { "message": "Login confirmed for $EMAIL$ on $DEVICE$", @@ -2843,8 +2852,8 @@ "thisRequestIsNoLongerValid": { "message": "This request is no longer valid." }, - "confirmLoginAtemptForMail": { - "message": "Confirm login attempt for $EMAIL$", + "confirmAccessAttempt": { + "message": "Confirm access attempt for $EMAIL$", "placeholders": { "email": { "content": "$1", @@ -2855,6 +2864,9 @@ "logInRequested": { "message": "Log in requested" }, + "accountAccessRequested": { + "message": "Account access requested" + }, "creatingAccountOn": { "message": "Creating account on" }, @@ -3484,14 +3496,17 @@ "changeAcctEmail": { "message": "Change account email" }, - "organizationUpgradeRequired": { - "message": "Organization upgrade required" + "allowScreenshots": { + "message": "Allow screen capture" }, - "upgradeOrganization": { - "message": "Upgrade organization" + "allowScreenshotsDesc": { + "message": "Allow the Bitwarden desktop application to be captured in screenshots and viewed in remote desktop sessions. Disabling this will prevent access on some external displays." }, - "upgradeOrganizationDesc": { - "message": "This feature is not available for free organizations. Switch to a paid plan to unlock more features." + "confirmWindowStillVisibleTitle": { + "message": "Confirm window still visible" + }, + "confirmWindowStillVisibleContent": { + "message": "Please confirm that the window is still visible." }, "updateBrowserOrDisableFingerprintDialogTitle": { "message": "Extension update required" diff --git a/apps/desktop/src/locales/km/messages.json b/apps/desktop/src/locales/km/messages.json index 354ca094a78..5bc1f216880 100644 --- a/apps/desktop/src/locales/km/messages.json +++ b/apps/desktop/src/locales/km/messages.json @@ -2745,14 +2745,23 @@ "loginInitiated": { "message": "Login initiated" }, + "logInRequestSent": { + "message": "Request sent" + }, "notificationSentDevice": { "message": "A notification has been sent to your device." }, "aNotificationWasSentToYourDevice": { "message": "A notification was sent to your device" }, - "makeSureYourAccountIsUnlockedAndTheFingerprintEtc": { - "message": "Make sure your account is unlocked and the fingerprint phrase matches on the other device" + "notificationSentDevicePart1": { + "message": "Unlock Bitwarden on your device or on the " + }, + "notificationSentDeviceAnchor": { + "message": "web app" + }, + "notificationSentDevicePart2": { + "message": "Make sure the Fingerprint phrase matches the one below before approving." }, "needAnotherOptionV1": { "message": "Need another option?" @@ -2782,11 +2791,11 @@ "message": "Toggle character count", "description": "'Character count' describes a feature that displays a number next to each character of the password." }, - "areYouTryingtoLogin": { - "message": "Are you trying to log in?" + "areYouTryingToAccessYourAccount": { + "message": "Are you trying to access your account?" }, - "logInAttemptBy": { - "message": "Login attempt by $EMAIL$", + "accessAttemptBy": { + "message": "Access attempt by $EMAIL$", "placeholders": { "email": { "content": "$1", @@ -2803,11 +2812,11 @@ "time": { "message": "Time" }, - "confirmLogIn": { - "message": "Confirm login" + "confirmAccess": { + "message": "Confirm access" }, - "denyLogIn": { - "message": "Deny login" + "denyAccess": { + "message": "Deny access" }, "logInConfirmedForEmailOnDevice": { "message": "Login confirmed for $EMAIL$ on $DEVICE$", @@ -2843,8 +2852,8 @@ "thisRequestIsNoLongerValid": { "message": "This request is no longer valid." }, - "confirmLoginAtemptForMail": { - "message": "Confirm login attempt for $EMAIL$", + "confirmAccessAttempt": { + "message": "Confirm access attempt for $EMAIL$", "placeholders": { "email": { "content": "$1", @@ -2855,6 +2864,9 @@ "logInRequested": { "message": "Log in requested" }, + "accountAccessRequested": { + "message": "Account access requested" + }, "creatingAccountOn": { "message": "Creating account on" }, @@ -3484,14 +3496,17 @@ "changeAcctEmail": { "message": "Change account email" }, - "organizationUpgradeRequired": { - "message": "Organization upgrade required" + "allowScreenshots": { + "message": "Allow screen capture" }, - "upgradeOrganization": { - "message": "Upgrade organization" + "allowScreenshotsDesc": { + "message": "Allow the Bitwarden desktop application to be captured in screenshots and viewed in remote desktop sessions. Disabling this will prevent access on some external displays." }, - "upgradeOrganizationDesc": { - "message": "This feature is not available for free organizations. Switch to a paid plan to unlock more features." + "confirmWindowStillVisibleTitle": { + "message": "Confirm window still visible" + }, + "confirmWindowStillVisibleContent": { + "message": "Please confirm that the window is still visible." }, "updateBrowserOrDisableFingerprintDialogTitle": { "message": "Extension update required" diff --git a/apps/desktop/src/locales/kn/messages.json b/apps/desktop/src/locales/kn/messages.json index 24fd070ff4b..a4ca8863c44 100644 --- a/apps/desktop/src/locales/kn/messages.json +++ b/apps/desktop/src/locales/kn/messages.json @@ -2745,14 +2745,23 @@ "loginInitiated": { "message": "Login initiated" }, + "logInRequestSent": { + "message": "Request sent" + }, "notificationSentDevice": { "message": "A notification has been sent to your device." }, "aNotificationWasSentToYourDevice": { "message": "A notification was sent to your device" }, - "makeSureYourAccountIsUnlockedAndTheFingerprintEtc": { - "message": "Make sure your account is unlocked and the fingerprint phrase matches on the other device" + "notificationSentDevicePart1": { + "message": "Unlock Bitwarden on your device or on the " + }, + "notificationSentDeviceAnchor": { + "message": "web app" + }, + "notificationSentDevicePart2": { + "message": "Make sure the Fingerprint phrase matches the one below before approving." }, "needAnotherOptionV1": { "message": "Need another option?" @@ -2782,11 +2791,11 @@ "message": "Toggle character count", "description": "'Character count' describes a feature that displays a number next to each character of the password." }, - "areYouTryingtoLogin": { - "message": "Are you trying to log in?" + "areYouTryingToAccessYourAccount": { + "message": "Are you trying to access your account?" }, - "logInAttemptBy": { - "message": "Login attempt by $EMAIL$", + "accessAttemptBy": { + "message": "Access attempt by $EMAIL$", "placeholders": { "email": { "content": "$1", @@ -2803,11 +2812,11 @@ "time": { "message": "Time" }, - "confirmLogIn": { - "message": "Confirm login" + "confirmAccess": { + "message": "Confirm access" }, - "denyLogIn": { - "message": "Deny login" + "denyAccess": { + "message": "Deny access" }, "logInConfirmedForEmailOnDevice": { "message": "Login confirmed for $EMAIL$ on $DEVICE$", @@ -2843,8 +2852,8 @@ "thisRequestIsNoLongerValid": { "message": "This request is no longer valid." }, - "confirmLoginAtemptForMail": { - "message": "Confirm login attempt for $EMAIL$", + "confirmAccessAttempt": { + "message": "Confirm access attempt for $EMAIL$", "placeholders": { "email": { "content": "$1", @@ -2855,6 +2864,9 @@ "logInRequested": { "message": "Log in requested" }, + "accountAccessRequested": { + "message": "Account access requested" + }, "creatingAccountOn": { "message": "Creating account on" }, @@ -3484,14 +3496,17 @@ "changeAcctEmail": { "message": "Change account email" }, - "organizationUpgradeRequired": { - "message": "Organization upgrade required" + "allowScreenshots": { + "message": "Allow screen capture" }, - "upgradeOrganization": { - "message": "Upgrade organization" + "allowScreenshotsDesc": { + "message": "Allow the Bitwarden desktop application to be captured in screenshots and viewed in remote desktop sessions. Disabling this will prevent access on some external displays." }, - "upgradeOrganizationDesc": { - "message": "This feature is not available for free organizations. Switch to a paid plan to unlock more features." + "confirmWindowStillVisibleTitle": { + "message": "Confirm window still visible" + }, + "confirmWindowStillVisibleContent": { + "message": "Please confirm that the window is still visible." }, "updateBrowserOrDisableFingerprintDialogTitle": { "message": "Extension update required" diff --git a/apps/desktop/src/locales/ko/messages.json b/apps/desktop/src/locales/ko/messages.json index 80170407b6b..956f44281f6 100644 --- a/apps/desktop/src/locales/ko/messages.json +++ b/apps/desktop/src/locales/ko/messages.json @@ -2745,14 +2745,23 @@ "loginInitiated": { "message": "Login initiated" }, + "logInRequestSent": { + "message": "Request sent" + }, "notificationSentDevice": { "message": "기기에 알림이 전송되었습니다." }, "aNotificationWasSentToYourDevice": { "message": "A notification was sent to your device" }, - "makeSureYourAccountIsUnlockedAndTheFingerprintEtc": { - "message": "Make sure your account is unlocked and the fingerprint phrase matches on the other device" + "notificationSentDevicePart1": { + "message": "Unlock Bitwarden on your device or on the " + }, + "notificationSentDeviceAnchor": { + "message": "web app" + }, + "notificationSentDevicePart2": { + "message": "Make sure the Fingerprint phrase matches the one below before approving." }, "needAnotherOptionV1": { "message": "Need another option?" @@ -2782,11 +2791,11 @@ "message": "글자 수 표시하기", "description": "'Character count' describes a feature that displays a number next to each character of the password." }, - "areYouTryingtoLogin": { - "message": "로그인을 시도하셨나요?" + "areYouTryingToAccessYourAccount": { + "message": "Are you trying to access your account?" }, - "logInAttemptBy": { - "message": "$EMAIL$(으)로의 로그인 시도", + "accessAttemptBy": { + "message": "Access attempt by $EMAIL$", "placeholders": { "email": { "content": "$1", @@ -2803,11 +2812,11 @@ "time": { "message": "시각" }, - "confirmLogIn": { - "message": "로그인 확인" + "confirmAccess": { + "message": "Confirm access" }, - "denyLogIn": { - "message": "로그인 거부" + "denyAccess": { + "message": "Deny access" }, "logInConfirmedForEmailOnDevice": { "message": "$DEVICE$에서 $EMAIL$(으)로의 로그인이 확인되었습니다", @@ -2843,8 +2852,8 @@ "thisRequestIsNoLongerValid": { "message": "더 이상 유효하지 않은 요청입니다." }, - "confirmLoginAtemptForMail": { - "message": "$EMAIL$(으)로의 로그인 시도 확인", + "confirmAccessAttempt": { + "message": "Confirm access attempt for $EMAIL$", "placeholders": { "email": { "content": "$1", @@ -2855,6 +2864,9 @@ "logInRequested": { "message": "로그인 요청됨" }, + "accountAccessRequested": { + "message": "Account access requested" + }, "creatingAccountOn": { "message": "Creating account on" }, @@ -3484,14 +3496,17 @@ "changeAcctEmail": { "message": "Change account email" }, - "organizationUpgradeRequired": { - "message": "Organization upgrade required" + "allowScreenshots": { + "message": "Allow screen capture" }, - "upgradeOrganization": { - "message": "Upgrade organization" + "allowScreenshotsDesc": { + "message": "Allow the Bitwarden desktop application to be captured in screenshots and viewed in remote desktop sessions. Disabling this will prevent access on some external displays." }, - "upgradeOrganizationDesc": { - "message": "This feature is not available for free organizations. Switch to a paid plan to unlock more features." + "confirmWindowStillVisibleTitle": { + "message": "Confirm window still visible" + }, + "confirmWindowStillVisibleContent": { + "message": "Please confirm that the window is still visible." }, "updateBrowserOrDisableFingerprintDialogTitle": { "message": "Extension update required" diff --git a/apps/desktop/src/locales/lt/messages.json b/apps/desktop/src/locales/lt/messages.json index 8df650da355..06c60f174ab 100644 --- a/apps/desktop/src/locales/lt/messages.json +++ b/apps/desktop/src/locales/lt/messages.json @@ -2745,14 +2745,23 @@ "loginInitiated": { "message": "Pradėtas prisijungimas" }, + "logInRequestSent": { + "message": "Request sent" + }, "notificationSentDevice": { "message": "Į jūsų įrenginį išsiųstas pranešimas." }, "aNotificationWasSentToYourDevice": { "message": "A notification was sent to your device" }, - "makeSureYourAccountIsUnlockedAndTheFingerprintEtc": { - "message": "Make sure your account is unlocked and the fingerprint phrase matches on the other device" + "notificationSentDevicePart1": { + "message": "Unlock Bitwarden on your device or on the " + }, + "notificationSentDeviceAnchor": { + "message": "web app" + }, + "notificationSentDevicePart2": { + "message": "Make sure the Fingerprint phrase matches the one below before approving." }, "needAnotherOptionV1": { "message": "Need another option?" @@ -2782,11 +2791,11 @@ "message": "Perjungti simbolių skaičių", "description": "'Character count' describes a feature that displays a number next to each character of the password." }, - "areYouTryingtoLogin": { - "message": "Ar bandote prisijungti?" + "areYouTryingToAccessYourAccount": { + "message": "Are you trying to access your account?" }, - "logInAttemptBy": { - "message": "Prisijungimo bandymas iš $EMAIL$", + "accessAttemptBy": { + "message": "Access attempt by $EMAIL$", "placeholders": { "email": { "content": "$1", @@ -2803,11 +2812,11 @@ "time": { "message": "Laikas" }, - "confirmLogIn": { - "message": "Patvirtinkite prisijungimą" + "confirmAccess": { + "message": "Confirm access" }, - "denyLogIn": { - "message": "Neleisti prisijungti" + "denyAccess": { + "message": "Deny access" }, "logInConfirmedForEmailOnDevice": { "message": "$EMAIL$ prisijungimas patvirtinas $DEVICE$ įrenginyje", @@ -2843,8 +2852,8 @@ "thisRequestIsNoLongerValid": { "message": "Ši užklausa nebegalioja." }, - "confirmLoginAtemptForMail": { - "message": "Patvirtinti bandymą prisijungti iš $EMAIL$", + "confirmAccessAttempt": { + "message": "Confirm access attempt for $EMAIL$", "placeholders": { "email": { "content": "$1", @@ -2855,6 +2864,9 @@ "logInRequested": { "message": "Prašoma prisijungti" }, + "accountAccessRequested": { + "message": "Account access requested" + }, "creatingAccountOn": { "message": "Creating account on" }, @@ -3484,14 +3496,17 @@ "changeAcctEmail": { "message": "Change account email" }, - "organizationUpgradeRequired": { - "message": "Organization upgrade required" + "allowScreenshots": { + "message": "Allow screen capture" }, - "upgradeOrganization": { - "message": "Upgrade organization" + "allowScreenshotsDesc": { + "message": "Allow the Bitwarden desktop application to be captured in screenshots and viewed in remote desktop sessions. Disabling this will prevent access on some external displays." }, - "upgradeOrganizationDesc": { - "message": "This feature is not available for free organizations. Switch to a paid plan to unlock more features." + "confirmWindowStillVisibleTitle": { + "message": "Confirm window still visible" + }, + "confirmWindowStillVisibleContent": { + "message": "Please confirm that the window is still visible." }, "updateBrowserOrDisableFingerprintDialogTitle": { "message": "Extension update required" diff --git a/apps/desktop/src/locales/lv/messages.json b/apps/desktop/src/locales/lv/messages.json index 588b9f7e8db..8d9cc316b43 100644 --- a/apps/desktop/src/locales/lv/messages.json +++ b/apps/desktop/src/locales/lv/messages.json @@ -2551,7 +2551,7 @@ "message": "Izmantot uzstādīto domēna visu tverošo iesūtni." }, "useThisEmail": { - "message": "Use this email" + "message": "Izmantot šo e-pasta adresi" }, "random": { "message": "Nejauši" @@ -2745,14 +2745,23 @@ "loginInitiated": { "message": "Uzsākta pieteikšanās" }, + "logInRequestSent": { + "message": "Pieprasījums nosūtīts" + }, "notificationSentDevice": { "message": "Uz jūsu ierīci ir nosūtīts paziņojums." }, "aNotificationWasSentToYourDevice": { "message": "Uz ierīci tika nosūtīts paziņojums" }, - "makeSureYourAccountIsUnlockedAndTheFingerprintEtc": { - "message": "Lūgums pārliecināties, ka konts ir atslēgts un atpazīšanas vārdkopa ir tāda pati arī otrā ierīcē" + "notificationSentDevicePart1": { + "message": "Bitwarden jāatslēdz savā ierīcē vai " + }, + "notificationSentDeviceAnchor": { + "message": "tīmekļa lietotnē" + }, + "notificationSentDevicePart2": { + "message": "Pirms apstiprināšanas jāpārliecinās, ka pirkstu nospieduma vārdkopa atbilst zemāk esošajai." }, "needAnotherOptionV1": { "message": "Nepieciešama cita iespēja?" @@ -2782,11 +2791,11 @@ "message": "Pārslēgt rakstzīmju skaita attēlošanu", "description": "'Character count' describes a feature that displays a number next to each character of the password." }, - "areYouTryingtoLogin": { - "message": "Vai mēģini pieteikties?" + "areYouTryingToAccessYourAccount": { + "message": "Vai mēģini piekļūt savam kontam?" }, - "logInAttemptBy": { - "message": "$EMAIL$ pieteikšanās mēģinājums", + "accessAttemptBy": { + "message": "$EMAIL$ piekļuves mēģinājums", "placeholders": { "email": { "content": "$1", @@ -2803,11 +2812,11 @@ "time": { "message": "Laiks" }, - "confirmLogIn": { - "message": "Apstiprināt pieteikšanos" + "confirmAccess": { + "message": "Apstiprināt piekļuvi" }, - "denyLogIn": { - "message": "Atteikt pieteikšanos" + "denyAccess": { + "message": "Noraidīt piekļuvi" }, "logInConfirmedForEmailOnDevice": { "message": "$EMAIL$ pieteikšanās apstiprināta ierīcē $DEVICE$", @@ -2843,8 +2852,8 @@ "thisRequestIsNoLongerValid": { "message": "Šis pieprasījums vairs nav derīgs." }, - "confirmLoginAtemptForMail": { - "message": "Apstiprināt $EMAIL$ pieteikšanās mēģinājumu", + "confirmAccessAttempt": { + "message": "Apstiprināt $EMAIL$ piekļuves mēģinājumu", "placeholders": { "email": { "content": "$1", @@ -2855,6 +2864,9 @@ "logInRequested": { "message": "Pieprasīta pieteikšanās" }, + "accountAccessRequested": { + "message": "Pieprasīta piekļuve kontam" + }, "creatingAccountOn": { "message": "Tiek veidots konts" }, @@ -3484,14 +3496,17 @@ "changeAcctEmail": { "message": "Mainīt konta e-pasta adresi" }, - "organizationUpgradeRequired": { - "message": "Nepieciešams apvienības uzlabojums" + "allowScreenshots": { + "message": "Atļaut ekrāna tveršanu" }, - "upgradeOrganization": { - "message": "Uzlabot apvienību" + "allowScreenshotsDesc": { + "message": "Ļaut Bitwarden darbvirsmas lietotni tvert ekrānuzņēmumos un rādīt attālās darbvirsmas sesijās. Atspējošana liegs piekļuvu atsevišķos ārējos ekrānos." }, - "upgradeOrganizationDesc": { - "message": "Šī iespēja nav pieejama bezmaksas apvienībām. Maksas plāna izvēle sniedz plašākas iespējas." + "confirmWindowStillVisibleTitle": { + "message": "Apstirpināt, ka logs joprojām ir redzams" + }, + "confirmWindowStillVisibleContent": { + "message": "Lūgums apstiprināt, ka logs joprojām ir redzams." }, "updateBrowserOrDisableFingerprintDialogTitle": { "message": "Nepieciešama paplašinājuma atjaunināšana" diff --git a/apps/desktop/src/locales/me/messages.json b/apps/desktop/src/locales/me/messages.json index d594a5d15e1..4f3ade1e189 100644 --- a/apps/desktop/src/locales/me/messages.json +++ b/apps/desktop/src/locales/me/messages.json @@ -2745,14 +2745,23 @@ "loginInitiated": { "message": "Login initiated" }, + "logInRequestSent": { + "message": "Request sent" + }, "notificationSentDevice": { "message": "A notification has been sent to your device." }, "aNotificationWasSentToYourDevice": { "message": "A notification was sent to your device" }, - "makeSureYourAccountIsUnlockedAndTheFingerprintEtc": { - "message": "Make sure your account is unlocked and the fingerprint phrase matches on the other device" + "notificationSentDevicePart1": { + "message": "Unlock Bitwarden on your device or on the " + }, + "notificationSentDeviceAnchor": { + "message": "web app" + }, + "notificationSentDevicePart2": { + "message": "Make sure the Fingerprint phrase matches the one below before approving." }, "needAnotherOptionV1": { "message": "Need another option?" @@ -2782,11 +2791,11 @@ "message": "Toggle character count", "description": "'Character count' describes a feature that displays a number next to each character of the password." }, - "areYouTryingtoLogin": { - "message": "Are you trying to log in?" + "areYouTryingToAccessYourAccount": { + "message": "Are you trying to access your account?" }, - "logInAttemptBy": { - "message": "Login attempt by $EMAIL$", + "accessAttemptBy": { + "message": "Access attempt by $EMAIL$", "placeholders": { "email": { "content": "$1", @@ -2803,11 +2812,11 @@ "time": { "message": "Time" }, - "confirmLogIn": { - "message": "Confirm login" + "confirmAccess": { + "message": "Confirm access" }, - "denyLogIn": { - "message": "Deny login" + "denyAccess": { + "message": "Deny access" }, "logInConfirmedForEmailOnDevice": { "message": "Login confirmed for $EMAIL$ on $DEVICE$", @@ -2843,8 +2852,8 @@ "thisRequestIsNoLongerValid": { "message": "This request is no longer valid." }, - "confirmLoginAtemptForMail": { - "message": "Confirm login attempt for $EMAIL$", + "confirmAccessAttempt": { + "message": "Confirm access attempt for $EMAIL$", "placeholders": { "email": { "content": "$1", @@ -2855,6 +2864,9 @@ "logInRequested": { "message": "Log in requested" }, + "accountAccessRequested": { + "message": "Account access requested" + }, "creatingAccountOn": { "message": "Creating account on" }, @@ -3484,14 +3496,17 @@ "changeAcctEmail": { "message": "Change account email" }, - "organizationUpgradeRequired": { - "message": "Organization upgrade required" + "allowScreenshots": { + "message": "Allow screen capture" }, - "upgradeOrganization": { - "message": "Upgrade organization" + "allowScreenshotsDesc": { + "message": "Allow the Bitwarden desktop application to be captured in screenshots and viewed in remote desktop sessions. Disabling this will prevent access on some external displays." }, - "upgradeOrganizationDesc": { - "message": "This feature is not available for free organizations. Switch to a paid plan to unlock more features." + "confirmWindowStillVisibleTitle": { + "message": "Confirm window still visible" + }, + "confirmWindowStillVisibleContent": { + "message": "Please confirm that the window is still visible." }, "updateBrowserOrDisableFingerprintDialogTitle": { "message": "Extension update required" diff --git a/apps/desktop/src/locales/ml/messages.json b/apps/desktop/src/locales/ml/messages.json index 36e483a7597..86ca9d83daf 100644 --- a/apps/desktop/src/locales/ml/messages.json +++ b/apps/desktop/src/locales/ml/messages.json @@ -2745,14 +2745,23 @@ "loginInitiated": { "message": "Login initiated" }, + "logInRequestSent": { + "message": "Request sent" + }, "notificationSentDevice": { "message": "A notification has been sent to your device." }, "aNotificationWasSentToYourDevice": { "message": "A notification was sent to your device" }, - "makeSureYourAccountIsUnlockedAndTheFingerprintEtc": { - "message": "Make sure your account is unlocked and the fingerprint phrase matches on the other device" + "notificationSentDevicePart1": { + "message": "Unlock Bitwarden on your device or on the " + }, + "notificationSentDeviceAnchor": { + "message": "web app" + }, + "notificationSentDevicePart2": { + "message": "Make sure the Fingerprint phrase matches the one below before approving." }, "needAnotherOptionV1": { "message": "Need another option?" @@ -2782,11 +2791,11 @@ "message": "Toggle character count", "description": "'Character count' describes a feature that displays a number next to each character of the password." }, - "areYouTryingtoLogin": { - "message": "Are you trying to log in?" + "areYouTryingToAccessYourAccount": { + "message": "Are you trying to access your account?" }, - "logInAttemptBy": { - "message": "Login attempt by $EMAIL$", + "accessAttemptBy": { + "message": "Access attempt by $EMAIL$", "placeholders": { "email": { "content": "$1", @@ -2803,11 +2812,11 @@ "time": { "message": "Time" }, - "confirmLogIn": { - "message": "Confirm login" + "confirmAccess": { + "message": "Confirm access" }, - "denyLogIn": { - "message": "Deny login" + "denyAccess": { + "message": "Deny access" }, "logInConfirmedForEmailOnDevice": { "message": "Login confirmed for $EMAIL$ on $DEVICE$", @@ -2843,8 +2852,8 @@ "thisRequestIsNoLongerValid": { "message": "This request is no longer valid." }, - "confirmLoginAtemptForMail": { - "message": "Confirm login attempt for $EMAIL$", + "confirmAccessAttempt": { + "message": "Confirm access attempt for $EMAIL$", "placeholders": { "email": { "content": "$1", @@ -2855,6 +2864,9 @@ "logInRequested": { "message": "Log in requested" }, + "accountAccessRequested": { + "message": "Account access requested" + }, "creatingAccountOn": { "message": "Creating account on" }, @@ -3484,14 +3496,17 @@ "changeAcctEmail": { "message": "Change account email" }, - "organizationUpgradeRequired": { - "message": "Organization upgrade required" + "allowScreenshots": { + "message": "Allow screen capture" }, - "upgradeOrganization": { - "message": "Upgrade organization" + "allowScreenshotsDesc": { + "message": "Allow the Bitwarden desktop application to be captured in screenshots and viewed in remote desktop sessions. Disabling this will prevent access on some external displays." }, - "upgradeOrganizationDesc": { - "message": "This feature is not available for free organizations. Switch to a paid plan to unlock more features." + "confirmWindowStillVisibleTitle": { + "message": "Confirm window still visible" + }, + "confirmWindowStillVisibleContent": { + "message": "Please confirm that the window is still visible." }, "updateBrowserOrDisableFingerprintDialogTitle": { "message": "Extension update required" diff --git a/apps/desktop/src/locales/mr/messages.json b/apps/desktop/src/locales/mr/messages.json index 354ca094a78..5bc1f216880 100644 --- a/apps/desktop/src/locales/mr/messages.json +++ b/apps/desktop/src/locales/mr/messages.json @@ -2745,14 +2745,23 @@ "loginInitiated": { "message": "Login initiated" }, + "logInRequestSent": { + "message": "Request sent" + }, "notificationSentDevice": { "message": "A notification has been sent to your device." }, "aNotificationWasSentToYourDevice": { "message": "A notification was sent to your device" }, - "makeSureYourAccountIsUnlockedAndTheFingerprintEtc": { - "message": "Make sure your account is unlocked and the fingerprint phrase matches on the other device" + "notificationSentDevicePart1": { + "message": "Unlock Bitwarden on your device or on the " + }, + "notificationSentDeviceAnchor": { + "message": "web app" + }, + "notificationSentDevicePart2": { + "message": "Make sure the Fingerprint phrase matches the one below before approving." }, "needAnotherOptionV1": { "message": "Need another option?" @@ -2782,11 +2791,11 @@ "message": "Toggle character count", "description": "'Character count' describes a feature that displays a number next to each character of the password." }, - "areYouTryingtoLogin": { - "message": "Are you trying to log in?" + "areYouTryingToAccessYourAccount": { + "message": "Are you trying to access your account?" }, - "logInAttemptBy": { - "message": "Login attempt by $EMAIL$", + "accessAttemptBy": { + "message": "Access attempt by $EMAIL$", "placeholders": { "email": { "content": "$1", @@ -2803,11 +2812,11 @@ "time": { "message": "Time" }, - "confirmLogIn": { - "message": "Confirm login" + "confirmAccess": { + "message": "Confirm access" }, - "denyLogIn": { - "message": "Deny login" + "denyAccess": { + "message": "Deny access" }, "logInConfirmedForEmailOnDevice": { "message": "Login confirmed for $EMAIL$ on $DEVICE$", @@ -2843,8 +2852,8 @@ "thisRequestIsNoLongerValid": { "message": "This request is no longer valid." }, - "confirmLoginAtemptForMail": { - "message": "Confirm login attempt for $EMAIL$", + "confirmAccessAttempt": { + "message": "Confirm access attempt for $EMAIL$", "placeholders": { "email": { "content": "$1", @@ -2855,6 +2864,9 @@ "logInRequested": { "message": "Log in requested" }, + "accountAccessRequested": { + "message": "Account access requested" + }, "creatingAccountOn": { "message": "Creating account on" }, @@ -3484,14 +3496,17 @@ "changeAcctEmail": { "message": "Change account email" }, - "organizationUpgradeRequired": { - "message": "Organization upgrade required" + "allowScreenshots": { + "message": "Allow screen capture" }, - "upgradeOrganization": { - "message": "Upgrade organization" + "allowScreenshotsDesc": { + "message": "Allow the Bitwarden desktop application to be captured in screenshots and viewed in remote desktop sessions. Disabling this will prevent access on some external displays." }, - "upgradeOrganizationDesc": { - "message": "This feature is not available for free organizations. Switch to a paid plan to unlock more features." + "confirmWindowStillVisibleTitle": { + "message": "Confirm window still visible" + }, + "confirmWindowStillVisibleContent": { + "message": "Please confirm that the window is still visible." }, "updateBrowserOrDisableFingerprintDialogTitle": { "message": "Extension update required" diff --git a/apps/desktop/src/locales/my/messages.json b/apps/desktop/src/locales/my/messages.json index 93bbd900190..6d48d60407c 100644 --- a/apps/desktop/src/locales/my/messages.json +++ b/apps/desktop/src/locales/my/messages.json @@ -2745,14 +2745,23 @@ "loginInitiated": { "message": "Login initiated" }, + "logInRequestSent": { + "message": "Request sent" + }, "notificationSentDevice": { "message": "A notification has been sent to your device." }, "aNotificationWasSentToYourDevice": { "message": "A notification was sent to your device" }, - "makeSureYourAccountIsUnlockedAndTheFingerprintEtc": { - "message": "Make sure your account is unlocked and the fingerprint phrase matches on the other device" + "notificationSentDevicePart1": { + "message": "Unlock Bitwarden on your device or on the " + }, + "notificationSentDeviceAnchor": { + "message": "web app" + }, + "notificationSentDevicePart2": { + "message": "Make sure the Fingerprint phrase matches the one below before approving." }, "needAnotherOptionV1": { "message": "Need another option?" @@ -2782,11 +2791,11 @@ "message": "Toggle character count", "description": "'Character count' describes a feature that displays a number next to each character of the password." }, - "areYouTryingtoLogin": { - "message": "Are you trying to log in?" + "areYouTryingToAccessYourAccount": { + "message": "Are you trying to access your account?" }, - "logInAttemptBy": { - "message": "Login attempt by $EMAIL$", + "accessAttemptBy": { + "message": "Access attempt by $EMAIL$", "placeholders": { "email": { "content": "$1", @@ -2803,11 +2812,11 @@ "time": { "message": "Time" }, - "confirmLogIn": { - "message": "Confirm login" + "confirmAccess": { + "message": "Confirm access" }, - "denyLogIn": { - "message": "Deny login" + "denyAccess": { + "message": "Deny access" }, "logInConfirmedForEmailOnDevice": { "message": "Login confirmed for $EMAIL$ on $DEVICE$", @@ -2843,8 +2852,8 @@ "thisRequestIsNoLongerValid": { "message": "This request is no longer valid." }, - "confirmLoginAtemptForMail": { - "message": "Confirm login attempt for $EMAIL$", + "confirmAccessAttempt": { + "message": "Confirm access attempt for $EMAIL$", "placeholders": { "email": { "content": "$1", @@ -2855,6 +2864,9 @@ "logInRequested": { "message": "Log in requested" }, + "accountAccessRequested": { + "message": "Account access requested" + }, "creatingAccountOn": { "message": "Creating account on" }, @@ -3484,14 +3496,17 @@ "changeAcctEmail": { "message": "Change account email" }, - "organizationUpgradeRequired": { - "message": "Organization upgrade required" + "allowScreenshots": { + "message": "Allow screen capture" }, - "upgradeOrganization": { - "message": "Upgrade organization" + "allowScreenshotsDesc": { + "message": "Allow the Bitwarden desktop application to be captured in screenshots and viewed in remote desktop sessions. Disabling this will prevent access on some external displays." }, - "upgradeOrganizationDesc": { - "message": "This feature is not available for free organizations. Switch to a paid plan to unlock more features." + "confirmWindowStillVisibleTitle": { + "message": "Confirm window still visible" + }, + "confirmWindowStillVisibleContent": { + "message": "Please confirm that the window is still visible." }, "updateBrowserOrDisableFingerprintDialogTitle": { "message": "Extension update required" diff --git a/apps/desktop/src/locales/nb/messages.json b/apps/desktop/src/locales/nb/messages.json index aa75e60accf..51e2e7fc742 100644 --- a/apps/desktop/src/locales/nb/messages.json +++ b/apps/desktop/src/locales/nb/messages.json @@ -27,7 +27,7 @@ "message": "Sikker notis" }, "typeSshKey": { - "message": "SSH key" + "message": "SSH-nøkkel" }, "folders": { "message": "Mapper" @@ -64,7 +64,7 @@ } }, "welcomeBack": { - "message": "Welcome back" + "message": "Velkommen tilbake" }, "moveToOrgDesc": { "message": "Velg en organisasjon som du ønsker å flyttet elementet til. Ved å flytte til en organisasjon, overfører du eierskapet til elementet til den organisasjonen. Du vil ikke lenger være den direkte eieren av elementet etter at den har blitt flyttet." @@ -181,16 +181,16 @@ "message": "Adresse" }, "sshPrivateKey": { - "message": "Private key" + "message": "Privat nøkkel" }, "sshPublicKey": { - "message": "Public key" + "message": "Offentlig nøkkel" }, "sshFingerprint": { - "message": "Fingerprint" + "message": "Fingeravtrykk" }, "sshKeyAlgorithm": { - "message": "Key type" + "message": "Nøkkeltype" }, "sshKeyAlgorithmED25519": { "message": "ED25519" @@ -208,19 +208,19 @@ "message": "A new SSH key was generated" }, "sshKeyWrongPassword": { - "message": "The password you entered is incorrect." + "message": "Passordet du skrev inn er feil." }, "importSshKey": { - "message": "Import" + "message": "Importer" }, "confirmSshKeyPassword": { - "message": "Confirm password" + "message": "Bekreft passordet" }, "enterSshKeyPasswordDesc": { "message": "Enter the password for the SSH key." }, "enterSshKeyPassword": { - "message": "Enter password" + "message": "Skriv inn passord" }, "sshAgentUnlockRequired": { "message": "Please unlock your vault to approve the SSH key request." @@ -229,7 +229,7 @@ "message": "SSH key request timed out." }, "enableSshAgent": { - "message": "Enable SSH agent" + "message": "Skru på SSH-agent" }, "enableSshAgentDesc": { "message": "Enable the SSH agent to sign SSH requests right from your Bitwarden vault." @@ -250,7 +250,7 @@ "message": "Feil" }, "decryptionError": { - "message": "Decryption error" + "message": "Dekrypteringsfeil" }, "couldNotDecryptVaultItemsBelow": { "message": "Bitwarden could not decrypt the vault item(s) listed below." @@ -260,7 +260,7 @@ "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": "for å unngå ytterligere datatap.", "description": "This is part of a larger sentence. The full sentence will read 'Contact customer success to avoid additional data loss.'" }, "january": { @@ -337,7 +337,7 @@ "message": "Generer et passord" }, "generatePassphrase": { - "message": "Generate passphrase" + "message": "Generér passordfrase" }, "type": { "message": "Type" @@ -475,7 +475,7 @@ "message": "Kopier passordet" }, "regenerateSshKey": { - "message": "Regenerate SSH key" + "message": "Generér SSH-nøkkel på nytt" }, "copySshPrivateKey": { "message": "Copy SSH private key" @@ -512,19 +512,19 @@ "message": "Spesialtegn (!@#$%^&*)" }, "include": { - "message": "Include", + "message": "Inkluder", "description": "Card header for password generator include block" }, "uppercaseDescription": { - "message": "Include uppercase characters", + "message": "Inkluder store bokstaver", "description": "Tooltip for the password generator uppercase character checkbox" }, "uppercaseLabel": { - "message": "A-Z", + "message": "A-Å", "description": "Label for the password generator uppercase character checkbox" }, "lowercaseDescription": { - "message": "Include lowercase characters", + "message": "Inkluder små bokstaver", "description": "Full description for the password generator lowercase character checkbox" }, "lowercaseLabel": { @@ -532,7 +532,7 @@ "description": "Label for the password generator lowercase character checkbox" }, "numbersDescription": { - "message": "Include numbers", + "message": "Inkluder tall", "description": "Full description for the password generator numbers checkbox" }, "numbersLabel": { @@ -540,7 +540,7 @@ "description": "Label for the password generator numbers checkbox" }, "specialCharactersDescription": { - "message": "Include special characters", + "message": "Inkluder spesialtegn", "description": "Full description for the password generator special characters checkbox" }, "specialCharactersLabel": { @@ -575,7 +575,7 @@ "description": "deprecated. Use avoidAmbiguous instead." }, "avoidAmbiguous": { - "message": "Avoid ambiguous characters", + "message": "Unngå forvekslingsbare tegn", "description": "Label for the avoid ambiguous characters checkbox." }, "generatorPolicyInEffect": { @@ -638,7 +638,7 @@ "message": "Opprett en konto" }, "newToBitwarden": { - "message": "New to Bitwarden?" + "message": "Er du ny til Bitwarden?" }, "setAStrongPassword": { "message": "Velg et sterkt passord" @@ -650,13 +650,13 @@ "message": "Logg på" }, "logInToBitwarden": { - "message": "Log in to Bitwarden" + "message": "Logg inn på Bitwarden" }, "logInWithPasskey": { - "message": "Log in with passkey" + "message": "Logg inn med passnøkkel" }, "loginWithDevice": { - "message": "Log in with device" + "message": "Logg på med enhet" }, "useSingleSignOn": { "message": "Use single sign-on" @@ -723,13 +723,13 @@ "message": "Innstillinger" }, "accountEmail": { - "message": "Account email" + "message": "Kontoens E-postadresse" }, "requestHint": { "message": "Be om hint" }, "requestPasswordHint": { - "message": "Request password hint" + "message": "Be om passordhint" }, "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { "message": "Enter your account email address and your password hint will be sent to you" @@ -766,7 +766,7 @@ } }, "youSuccessfullyLoggedIn": { - "message": "You successfully logged in" + "message": "Du har vellykket logget inn" }, "youMayCloseThisWindow": { "message": "Du kan lukke dette vinduet" @@ -778,10 +778,10 @@ "message": "Din nye konto har blitt opprettet! Du kan nå logge på." }, "newAccountCreated2": { - "message": "Your new account has been created!" + "message": "Den nye kontoen din er opprettet!" }, "youHaveBeenLoggedIn": { - "message": "You have been logged in!" + "message": "Du har blitt logget inn!" }, "masterPassSent": { "message": "Vi har sendt deg en E-post med hintet til superpassordet." @@ -892,7 +892,7 @@ "message": "We don't recognize this device. Enter the code sent to your email to verify your identity." }, "continueLoggingIn": { - "message": "Continue logging in" + "message": "Fortsett innloggingen" }, "webAuthnTitle": { "message": "FIDO2 WebAuthn" @@ -904,7 +904,7 @@ "message": "E-post" }, "emailDescV2": { - "message": "Enter a code sent to your email." + "message": "Skriv inn koden du har fått tilsendt på E-post." }, "loginUnavailable": { "message": "Innloggingen er utilgjengelig" @@ -992,7 +992,7 @@ "message": "Logget av" }, "loggedOutDesc": { - "message": "You have been logged out of your account." + "message": "Du har blitt logget ut av kontoen din." }, "loginExpired": { "message": "Din innloggingsøkt har utløpt." @@ -1007,7 +1007,7 @@ "message": "Please restart registration or try logging in." }, "youMayAlreadyHaveAnAccount": { - "message": "You may already have an account" + "message": "Du har kanskje allerede en konto" }, "logOutConfirmation": { "message": "Er du sikker på at du vil logge av?" @@ -1064,10 +1064,10 @@ "message": "Endre hovedpassordet" }, "continueToWebApp": { - "message": "Continue to web app?" + "message": "Vil du fortsette til nettappen?" }, "changeMasterPasswordOnWebConfirmation": { - "message": "You can change your master password on the Bitwarden web app." + "message": "Du kan endre hovedpassordet ditt i Bitwardens nettapp." }, "fingerprintPhrase": { "message": "Fingeravtrykksfrase", @@ -1096,16 +1096,16 @@ "message": "Hvelvet ditt er låst. Bekreft hovedpassordet ditt for å fortsette." }, "yourAccountIsLocked": { - "message": "Your account is locked" + "message": "Kontoen din er låst" }, "or": { - "message": "or" + "message": "eller" }, "unlockWithBiometrics": { - "message": "Unlock with biometrics" + "message": "Lås opp med biometri" }, "unlockWithMasterPassword": { - "message": "Unlock with master password" + "message": "Lås opp med hovedpassord" }, "unlock": { "message": "Lås opp" @@ -1413,10 +1413,10 @@ "message": "Passordhistorikk" }, "generatorHistory": { - "message": "Generator history" + "message": "Generatorhistorikk" }, "clearGeneratorHistoryTitle": { - "message": "Clear generator history" + "message": "Tøm generatorhistorikk" }, "cleargGeneratorHistoryDescription": { "message": "If you continue, all entries will be permanently deleted from generator's history. Are you sure you want to continue?" @@ -1429,13 +1429,13 @@ "message": "Det er ingen passord å liste opp." }, "clearHistory": { - "message": "Clear history" + "message": "Tøm historikk" }, "nothingToShow": { - "message": "Nothing to show" + "message": "Ingenting å vise" }, "nothingGeneratedRecently": { - "message": "You haven't generated anything recently" + "message": "Du har ikke generert noe i det siste" }, "undo": { "message": "Angre" @@ -1512,7 +1512,7 @@ } }, "copySuccessful": { - "message": "Copy Successful" + "message": "Kopiering lyktes" }, "errorRefreshingAccessToken": { "message": "Access Token Refresh Error" @@ -1635,7 +1635,7 @@ "message": "Set a file password to encrypt the export and import it to any Bitwarden account using the password for decryption." }, "exportTypeHeading": { - "message": "Export type" + "message": "Eksporttype" }, "accountRestricted": { "message": "Konto begrenset" @@ -1749,7 +1749,7 @@ "message": "Ytterligere Windows Hello-innstillinger" }, "unlockWithPolkit": { - "message": "Unlock with system authentication" + "message": "Lås opp med systemautentisering" }, "windowsHelloConsentMessage": { "message": "Bekreft for Bitwarden." @@ -1907,7 +1907,7 @@ "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": "av $TOTAL$", "placeholders": { "total": { "content": "$1", @@ -1974,16 +1974,16 @@ "message": "Get advice, announcements, and research opportunities from Bitwarden in your inbox." }, "unsubscribe": { - "message": "Unsubscribe" + "message": "Avabonner" }, "atAnyTime": { - "message": "at any time." + "message": "når som helst." }, "byContinuingYouAgreeToThe": { - "message": "By continuing, you agree to the" + "message": "Ved å fortsette, samtykker du til" }, "and": { - "message": "and" + "message": "og" }, "acceptPolicies": { "message": "Ved å huke av i denne boksen sier du deg enig i følgende:" @@ -2028,7 +2028,7 @@ "message": "Aktiver et ekstra lag sikkerhet ved å kreve fingeravtrykksvalidering når du oppretter en kobling mellom skrivebordet og nettleseren. Når dette er aktivert kreves det brukerintervensjon og verifisering hver gang en tilkobling etableres." }, "enableHardwareAcceleration": { - "message": "Use hardware acceleration" + "message": "Bruk maskinvareakselerering" }, "enableHardwareAccelerationDesc": { "message": "By default this setting is ON. Turn OFF only if you experience graphical issues. Restart is required." @@ -2440,7 +2440,7 @@ "message": "Bytt konto" }, "alreadyHaveAccount": { - "message": "Already have an account?" + "message": "Har du allerede en konto?" }, "options": { "message": "Alternativer" @@ -2476,7 +2476,7 @@ "message": "Låst" }, "yourVaultIsLockedV2": { - "message": "Your vault is locked" + "message": "Hvelvet ditt er låst" }, "unlocked": { "message": "Opplåst" @@ -2498,10 +2498,10 @@ "message": "Generer brukernavn" }, "generateEmail": { - "message": "Generate email" + "message": "Generér E-post" }, "spinboxBoundariesHint": { - "message": "Value must be between $MIN$ and $MAX$.", + "message": "Verdien må være mellom $MIN$ og $MAX$.", "description": "Explains spin box minimum and maximum values to the user", "placeholders": { "min": { @@ -2515,7 +2515,7 @@ } }, "passwordLengthRecommendationHint": { - "message": " Use $RECOMMENDED$ characters or more to generate a strong password.", + "message": " Bruk minst $RECOMMENDED$ tegn for å generere et sterkt passord.", "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": { @@ -2551,7 +2551,7 @@ "message": "Bruk domenets konfigurerte catch-all innboks." }, "useThisEmail": { - "message": "Use this email" + "message": "Bruk denne E-postadressen" }, "random": { "message": "Tilfeldig" @@ -2581,11 +2581,11 @@ "message": "Generer et e-postalias med en ekstern videresendingstjeneste." }, "forwarderDomainName": { - "message": "Email domain", + "message": "E-postdomene", "description": "Labels the domain name email forwarder service option" }, "forwarderDomainNameHint": { - "message": "Choose a domain that is supported by the selected service", + "message": "Velg et domene som støttes av den valgte tjenesten", "description": "Guidance provided for email forwarding services that support multiple email domains." }, "forwarderError": { @@ -2603,11 +2603,11 @@ } }, "forwarderGeneratedBy": { - "message": "Generated by Bitwarden.", + "message": "Generert av Bitwarden.", "description": "Displayed with the address on the forwarding service's configuration screen." }, "forwarderGeneratedByWithWebsite": { - "message": "Website: $WEBSITE$. Generated by Bitwarden.", + "message": "Nettsted: $WEBSITE$. Generert av Bitwarden.", "description": "Displayed with the address on the forwarding service's configuration screen.", "placeholders": { "WEBSITE": { @@ -2617,7 +2617,7 @@ } }, "forwaderInvalidToken": { - "message": "Invalid $SERVICENAME$ API token", + "message": "Ugyldig $SERVICENAME$-API-sjetong", "description": "Displayed when the user's API token is empty or rejected by the forwarding service.", "placeholders": { "servicename": { @@ -2627,7 +2627,7 @@ } }, "forwaderInvalidTokenWithMessage": { - "message": "Invalid $SERVICENAME$ API token: $ERRORMESSAGE$", + "message": "Ugyldig $SERVICENAME$-API-sjetong: $ERRORMESSAGE$", "description": "Displayed when the user's API token is rejected by the forwarding service with an error message.", "placeholders": { "servicename": { @@ -2651,7 +2651,7 @@ } }, "forwarderNoDomain": { - "message": "Invalid $SERVICENAME$ domain.", + "message": "Ugyldig $SERVICENAME$-domene.", "description": "Displayed when the domain is empty or domain authorization failed at the forwarding service.", "placeholders": { "servicename": { @@ -2671,7 +2671,7 @@ } }, "forwarderUnknownError": { - "message": "Unknown $SERVICENAME$ error occurred.", + "message": "Ukjent $SERVICENAME$-feil oppstod.", "description": "Displayed when the forwarding service failed due to an unknown error.", "placeholders": { "servicename": { @@ -2743,19 +2743,28 @@ "message": "Logg inn med en annen enhet" }, "loginInitiated": { - "message": "Login initiated" + "message": "Innlogging igangsatt" + }, + "logInRequestSent": { + "message": "Forespørsel sendt" }, "notificationSentDevice": { "message": "Et varsel har blitt sendt til enheten din." }, "aNotificationWasSentToYourDevice": { - "message": "A notification was sent to your device" + "message": "Et varsel ble sendt til enheten din" }, - "makeSureYourAccountIsUnlockedAndTheFingerprintEtc": { - "message": "Make sure your account is unlocked and the fingerprint phrase matches on the other device" + "notificationSentDevicePart1": { + "message": "Unlock Bitwarden on your device or on the " + }, + "notificationSentDeviceAnchor": { + "message": "nett-app" + }, + "notificationSentDevicePart2": { + "message": "Make sure the Fingerprint phrase matches the one below before approving." }, "needAnotherOptionV1": { - "message": "Need another option?" + "message": "Trenger du et annet alternativ?" }, "fingerprintMatchInfo": { "message": "Please make sure your vault is unlocked and Fingerprint phrase matches the other device." @@ -2770,7 +2779,7 @@ "message": "Log in with device must be set up in the settings of the Bitwarden app. Need another option?" }, "viewAllLogInOptions": { - "message": "View all log in options" + "message": "Vis alle påloggingsalternativer" }, "viewAllLoginOptions": { "message": "Vis alle påloggingsalternativer" @@ -2782,11 +2791,11 @@ "message": "Toggle character count", "description": "'Character count' describes a feature that displays a number next to each character of the password." }, - "areYouTryingtoLogin": { - "message": "Prøver du å logge på?" + "areYouTryingToAccessYourAccount": { + "message": "Are you trying to access your account?" }, - "logInAttemptBy": { - "message": "Påloggingsforsøk av $EMAIL$", + "accessAttemptBy": { + "message": "Access attempt by $EMAIL$", "placeholders": { "email": { "content": "$1", @@ -2803,11 +2812,11 @@ "time": { "message": "Tid" }, - "confirmLogIn": { - "message": "Bekreft innlogging" + "confirmAccess": { + "message": "Bekreft tilgang" }, - "denyLogIn": { - "message": "Avslå innlogging" + "denyAccess": { + "message": "Nekt tilgang" }, "logInConfirmedForEmailOnDevice": { "message": "Login confirmed for $EMAIL$ on $DEVICE$", @@ -2843,8 +2852,8 @@ "thisRequestIsNoLongerValid": { "message": "Denne forespørselen er ikke lenger gyldig." }, - "confirmLoginAtemptForMail": { - "message": "Bekreft påloggingsforsøket til $EMAIL$", + "confirmAccessAttempt": { + "message": "Confirm access attempt for $EMAIL$", "placeholders": { "email": { "content": "$1", @@ -2855,14 +2864,17 @@ "logInRequested": { "message": "Log in requested" }, + "accountAccessRequested": { + "message": "Account access requested" + }, "creatingAccountOn": { - "message": "Creating account on" + "message": "Oppretter en konto på" }, "checkYourEmail": { - "message": "Check your email" + "message": "Sjekk E-postinnboksen din" }, "followTheLinkInTheEmailSentTo": { - "message": "Follow the link in the email sent to" + "message": "Følg lenken i E-postadressen som ble sendt til" }, "andContinueCreatingYourAccount": { "message": "and continue creating your account." @@ -2874,7 +2886,7 @@ "message": "Gå tilbake" }, "toEditYourEmailAddress": { - "message": "to edit your email address." + "message": "for å redigere E-postadressen din." }, "exposedMasterPassword": { "message": "Eksponert hovedpassord" @@ -2889,22 +2901,22 @@ "message": "Weak password identified and found in a data breach. Use a strong and unique password to protect your account. Are you sure you want to use this password?" }, "useThisPassword": { - "message": "Use this password" + "message": "Bruk dette passordet" }, "useThisUsername": { - "message": "Use this username" + "message": "Bruk dette brukernavnet" }, "checkForBreaches": { "message": "Check known data breaches for this password" }, "loggedInExclamation": { - "message": "Logged in!" + "message": "Innlogget!" }, "important": { "message": "Viktig:" }, "accessing": { - "message": "Accessing" + "message": "Logger inn på" }, "accessTokenUnableToBeDecrypted": { "message": "You have been logged out because your access token could not be decrypted. Please log in again to resolve this issue." @@ -2937,7 +2949,7 @@ "message": "Device approval required. Select an approval option below:" }, "deviceApprovalRequiredV2": { - "message": "Device approval required" + "message": "Enhetsgodkjennelse kreves" }, "selectAnApprovalOptionBelow": { "message": "Select an approval option below" @@ -2998,7 +3010,7 @@ "message": "Active user email not found. Logging you out." }, "deviceTrusted": { - "message": "Device trusted" + "message": "Enheten er betrodd" }, "inputRequired": { "message": "Inndata er påkrevd." @@ -3107,10 +3119,10 @@ "message": "Hopp frem til innholdet" }, "typePasskey": { - "message": "Passkey" + "message": "Passnøkkel" }, "passkeyNotCopied": { - "message": "Passkey will not be copied" + "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?" @@ -3123,7 +3135,7 @@ "description": "Used for the desktop menu item and the header of the import dialog" }, "importError": { - "message": "Import error" + "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." @@ -3183,7 +3195,7 @@ "message": "Invalid file password, please use the password you entered when you created the export file." }, "destination": { - "message": "Destination" + "message": "Destinasjon" }, "learnAboutImportOptions": { "message": "Lær mer om importalternativene dine" @@ -3242,7 +3254,7 @@ "message": "Bekreft filpassord" }, "exportSuccess": { - "message": "Vault data exported" + "message": "Hvelvdataen ble eksportert" }, "multifactorAuthenticationCancelled": { "message": "Multifaktorautentisering ble avbrutt" @@ -3284,7 +3296,7 @@ "message": "Approve the login request in your authentication app or enter a one-time passcode." }, "passcode": { - "message": "Passcode" + "message": "Passkode" }, "lastPassMasterPassword": { "message": "LastPass-hovedpassord" @@ -3322,10 +3334,10 @@ "description": "Label indicating the most common import formats" }, "success": { - "message": "Success" + "message": "Suksess" }, "troubleshooting": { - "message": "Troubleshooting" + "message": "Feilsøking" }, "disableHardwareAccelerationRestart": { "message": "Disable hardware acceleration and restart" @@ -3334,7 +3346,7 @@ "message": "Enable hardware acceleration and restart" }, "removePasskey": { - "message": "Remove passkey" + "message": "Fjern passordnøkkel" }, "passkeyRemoved": { "message": "Passkey removed" @@ -3346,7 +3358,7 @@ "message": "Error assigning target folder." }, "viewItemsIn": { - "message": "View items in $NAME$", + "message": "Vis gjenstander i $NAME$", "description": "Button to view the contents of a folder or collection", "placeholders": { "name": { @@ -3356,7 +3368,7 @@ } }, "backTo": { - "message": "Back to $NAME$", + "message": "Tilbake til $NAME$", "description": "Navigate back to a previous folder or collection", "placeholders": { "name": { @@ -3366,11 +3378,11 @@ } }, "back": { - "message": "Back", + "message": "Tilbake", "description": "Button text to navigate back" }, "removeItem": { - "message": "Remove $NAME$", + "message": "Fjern $NAME$", "description": "Remove a selected option, such as a folder or collection", "placeholders": { "name": { @@ -3395,7 +3407,7 @@ "message": "Biometric unlock is unavailable because PIN or password unlock is required first." }, "biometricsStatusHelptextHardwareUnavailable": { - "message": "Biometric unlock is currently unavailable." + "message": "Biometrisk opplåsing er utilgjengelig for øyeblikket." }, "biometricsStatusHelptextAutoSetupNeeded": { "message": "Biometric unlock is unavailable due to misconfigured system files." @@ -3416,10 +3428,10 @@ "message": "Biometric unlock is currently unavailable for an unknown reason." }, "authorize": { - "message": "Authorize" + "message": "Autoriser" }, "deny": { - "message": "Deny" + "message": "Avvis" }, "sshkeyApprovalTitle": { "message": "Confirm SSH key usage" @@ -3428,13 +3440,13 @@ "message": "is requesting access to" }, "unknownApplication": { - "message": "An application" + "message": "Et program" }, "sshKeyPasswordUnsupported": { "message": "Importing password protected SSH keys is not yet supported" }, "invalidSshKey": { - "message": "The SSH key is invalid" + "message": "SSH-nøkkelen er ugyldig" }, "sshKeyTypeUnsupported": { "message": "The SSH key type is not supported" @@ -3449,10 +3461,10 @@ "message": "File saved to device. Manage from your device downloads." }, "importantNotice": { - "message": "Important notice" + "message": "Viktig melding" }, "setupTwoStepLogin": { - "message": "Set up two-step login" + "message": "Sett opp 2-trinnspålogging" }, "newDeviceVerificationNoticeContentPage1": { "message": "Bitwarden will send a code to your account email to verify logins from new devices starting in February 2025." @@ -3461,7 +3473,7 @@ "message": "You can set up two-step login as an alternative way to protect your account or change your email to one you can access." }, "remindMeLater": { - "message": "Remind me later" + "message": "Minn meg på det senere" }, "newDeviceVerificationNoticePageOneFormContent": { "message": "Do you have reliable access to your email, $EMAIL$?", @@ -3473,25 +3485,28 @@ } }, "newDeviceVerificationNoticePageOneEmailAccessNo": { - "message": "No, I do not" + "message": "Nei, det gjør jeg ikke" }, "newDeviceVerificationNoticePageOneEmailAccessYes": { "message": "Yes, I can reliably access my email" }, "turnOnTwoStepLogin": { - "message": "Turn on two-step login" + "message": "Slå på 2-trinnsinnlogging" }, "changeAcctEmail": { - "message": "Change account email" + "message": "Endre kontoens E-postadresse" }, - "organizationUpgradeRequired": { - "message": "Organization upgrade required" + "allowScreenshots": { + "message": "Allow screen capture" }, - "upgradeOrganization": { - "message": "Upgrade organization" + "allowScreenshotsDesc": { + "message": "Allow the Bitwarden desktop application to be captured in screenshots and viewed in remote desktop sessions. Disabling this will prevent access on some external displays." }, - "upgradeOrganizationDesc": { - "message": "This feature is not available for free organizations. Switch to a paid plan to unlock more features." + "confirmWindowStillVisibleTitle": { + "message": "Confirm window still visible" + }, + "confirmWindowStillVisibleContent": { + "message": "Please confirm that the window is still visible." }, "updateBrowserOrDisableFingerprintDialogTitle": { "message": "Extension update required" diff --git a/apps/desktop/src/locales/ne/messages.json b/apps/desktop/src/locales/ne/messages.json index 8b3da3ddb94..f3c4a910d6f 100644 --- a/apps/desktop/src/locales/ne/messages.json +++ b/apps/desktop/src/locales/ne/messages.json @@ -2745,14 +2745,23 @@ "loginInitiated": { "message": "Login initiated" }, + "logInRequestSent": { + "message": "Request sent" + }, "notificationSentDevice": { "message": "A notification has been sent to your device." }, "aNotificationWasSentToYourDevice": { "message": "A notification was sent to your device" }, - "makeSureYourAccountIsUnlockedAndTheFingerprintEtc": { - "message": "Make sure your account is unlocked and the fingerprint phrase matches on the other device" + "notificationSentDevicePart1": { + "message": "Unlock Bitwarden on your device or on the " + }, + "notificationSentDeviceAnchor": { + "message": "web app" + }, + "notificationSentDevicePart2": { + "message": "Make sure the Fingerprint phrase matches the one below before approving." }, "needAnotherOptionV1": { "message": "Need another option?" @@ -2782,11 +2791,11 @@ "message": "Toggle character count", "description": "'Character count' describes a feature that displays a number next to each character of the password." }, - "areYouTryingtoLogin": { - "message": "Are you trying to log in?" + "areYouTryingToAccessYourAccount": { + "message": "Are you trying to access your account?" }, - "logInAttemptBy": { - "message": "Login attempt by $EMAIL$", + "accessAttemptBy": { + "message": "Access attempt by $EMAIL$", "placeholders": { "email": { "content": "$1", @@ -2803,11 +2812,11 @@ "time": { "message": "Time" }, - "confirmLogIn": { - "message": "Confirm login" + "confirmAccess": { + "message": "Confirm access" }, - "denyLogIn": { - "message": "Deny login" + "denyAccess": { + "message": "Deny access" }, "logInConfirmedForEmailOnDevice": { "message": "Login confirmed for $EMAIL$ on $DEVICE$", @@ -2843,8 +2852,8 @@ "thisRequestIsNoLongerValid": { "message": "This request is no longer valid." }, - "confirmLoginAtemptForMail": { - "message": "Confirm login attempt for $EMAIL$", + "confirmAccessAttempt": { + "message": "Confirm access attempt for $EMAIL$", "placeholders": { "email": { "content": "$1", @@ -2855,6 +2864,9 @@ "logInRequested": { "message": "Log in requested" }, + "accountAccessRequested": { + "message": "Account access requested" + }, "creatingAccountOn": { "message": "Creating account on" }, @@ -3484,14 +3496,17 @@ "changeAcctEmail": { "message": "Change account email" }, - "organizationUpgradeRequired": { - "message": "Organization upgrade required" + "allowScreenshots": { + "message": "Allow screen capture" }, - "upgradeOrganization": { - "message": "Upgrade organization" + "allowScreenshotsDesc": { + "message": "Allow the Bitwarden desktop application to be captured in screenshots and viewed in remote desktop sessions. Disabling this will prevent access on some external displays." }, - "upgradeOrganizationDesc": { - "message": "This feature is not available for free organizations. Switch to a paid plan to unlock more features." + "confirmWindowStillVisibleTitle": { + "message": "Confirm window still visible" + }, + "confirmWindowStillVisibleContent": { + "message": "Please confirm that the window is still visible." }, "updateBrowserOrDisableFingerprintDialogTitle": { "message": "Extension update required" diff --git a/apps/desktop/src/locales/nl/messages.json b/apps/desktop/src/locales/nl/messages.json index 18fa7900b99..32335e98538 100644 --- a/apps/desktop/src/locales/nl/messages.json +++ b/apps/desktop/src/locales/nl/messages.json @@ -2745,14 +2745,23 @@ "loginInitiated": { "message": "Inloggen gestart" }, + "logInRequestSent": { + "message": "Verzoek verzonden" + }, "notificationSentDevice": { "message": "Er is een melding naar je apparaat verzonden." }, "aNotificationWasSentToYourDevice": { "message": "Er is een melding naar je apparaat verzonden" }, - "makeSureYourAccountIsUnlockedAndTheFingerprintEtc": { - "message": "Zorg ervoor dat je account is ontgrendeld en dat de vingerafdrukzin overeenkomt met het andere apparaat" + "notificationSentDevicePart1": { + "message": "Ontgrendel Bitwarden op je apparaat of op de " + }, + "notificationSentDeviceAnchor": { + "message": "webapp" + }, + "notificationSentDevicePart2": { + "message": "Zorg ervoor dat de Vingerafdrukzin overeenkomt met de onderstaande voor je deze goedkeurt." }, "needAnotherOptionV1": { "message": "Nog een optie nodig?" @@ -2782,10 +2791,10 @@ "message": "Tekentelling in-/uitschakelen", "description": "'Character count' describes a feature that displays a number next to each character of the password." }, - "areYouTryingtoLogin": { - "message": "Probeer je in te loggen?" + "areYouTryingToAccessYourAccount": { + "message": "Probeer je toegang te krijgen tot je account?" }, - "logInAttemptBy": { + "accessAttemptBy": { "message": "Inlogpoging door $EMAIL$", "placeholders": { "email": { @@ -2803,11 +2812,11 @@ "time": { "message": "Tijd" }, - "confirmLogIn": { - "message": "Inloggen bevestigen" + "confirmAccess": { + "message": "Toegang bevestigen" }, - "denyLogIn": { - "message": "Inloggen afwijzen" + "denyAccess": { + "message": "Toegang weigeren" }, "logInConfirmedForEmailOnDevice": { "message": "Inloggen voor $EMAIL$ bevestigd op $DEVICE$", @@ -2843,7 +2852,7 @@ "thisRequestIsNoLongerValid": { "message": "Dit verzoek is niet langer geldig." }, - "confirmLoginAtemptForMail": { + "confirmAccessAttempt": { "message": "Inlogpoging voor $EMAIL$ bevestigen", "placeholders": { "email": { @@ -2855,6 +2864,9 @@ "logInRequested": { "message": "Inloggen verzocht" }, + "accountAccessRequested": { + "message": "Accounttoegang aangevraagd" + }, "creatingAccountOn": { "message": "Account maken bij" }, @@ -3484,14 +3496,17 @@ "changeAcctEmail": { "message": "E-mailadres van het account veranderen" }, - "organizationUpgradeRequired": { - "message": "Organisatie-upgrade vereist" + "allowScreenshots": { + "message": "Schermopname toestaan" }, - "upgradeOrganization": { - "message": "Organisatie upgraden" + "allowScreenshotsDesc": { + "message": "Toestaan dat de Bitwarden desktopapplicatie wordt vastgelegd in schermafbeeldingen en bekeken in externe desktopsessies. Als je dit uitgeschakeld, wordt de toegang van sommige externe monitors geblokkeerd." }, - "upgradeOrganizationDesc": { - "message": "Deze mogelijkheid is niet beschikbaar voor gratis organisaties. Schakel over naar een betaald abonnement om meer mogelijkheden te ontgrendelen." + "confirmWindowStillVisibleTitle": { + "message": "Venster is nog zichtbaar" + }, + "confirmWindowStillVisibleContent": { + "message": "Bevestig dat het venster nog zichtbaar is." }, "updateBrowserOrDisableFingerprintDialogTitle": { "message": "Extensie update vereist" diff --git a/apps/desktop/src/locales/nn/messages.json b/apps/desktop/src/locales/nn/messages.json index 82f7c478b21..63d30ea49a1 100644 --- a/apps/desktop/src/locales/nn/messages.json +++ b/apps/desktop/src/locales/nn/messages.json @@ -2745,14 +2745,23 @@ "loginInitiated": { "message": "Login initiated" }, + "logInRequestSent": { + "message": "Request sent" + }, "notificationSentDevice": { "message": "A notification has been sent to your device." }, "aNotificationWasSentToYourDevice": { "message": "A notification was sent to your device" }, - "makeSureYourAccountIsUnlockedAndTheFingerprintEtc": { - "message": "Make sure your account is unlocked and the fingerprint phrase matches on the other device" + "notificationSentDevicePart1": { + "message": "Unlock Bitwarden on your device or on the " + }, + "notificationSentDeviceAnchor": { + "message": "web app" + }, + "notificationSentDevicePart2": { + "message": "Make sure the Fingerprint phrase matches the one below before approving." }, "needAnotherOptionV1": { "message": "Need another option?" @@ -2782,11 +2791,11 @@ "message": "Toggle character count", "description": "'Character count' describes a feature that displays a number next to each character of the password." }, - "areYouTryingtoLogin": { - "message": "Are you trying to log in?" + "areYouTryingToAccessYourAccount": { + "message": "Are you trying to access your account?" }, - "logInAttemptBy": { - "message": "Login attempt by $EMAIL$", + "accessAttemptBy": { + "message": "Access attempt by $EMAIL$", "placeholders": { "email": { "content": "$1", @@ -2803,11 +2812,11 @@ "time": { "message": "Time" }, - "confirmLogIn": { - "message": "Confirm login" + "confirmAccess": { + "message": "Confirm access" }, - "denyLogIn": { - "message": "Deny login" + "denyAccess": { + "message": "Deny access" }, "logInConfirmedForEmailOnDevice": { "message": "Login confirmed for $EMAIL$ on $DEVICE$", @@ -2843,8 +2852,8 @@ "thisRequestIsNoLongerValid": { "message": "This request is no longer valid." }, - "confirmLoginAtemptForMail": { - "message": "Confirm login attempt for $EMAIL$", + "confirmAccessAttempt": { + "message": "Confirm access attempt for $EMAIL$", "placeholders": { "email": { "content": "$1", @@ -2855,6 +2864,9 @@ "logInRequested": { "message": "Log in requested" }, + "accountAccessRequested": { + "message": "Account access requested" + }, "creatingAccountOn": { "message": "Creating account on" }, @@ -3484,14 +3496,17 @@ "changeAcctEmail": { "message": "Change account email" }, - "organizationUpgradeRequired": { - "message": "Organization upgrade required" + "allowScreenshots": { + "message": "Allow screen capture" }, - "upgradeOrganization": { - "message": "Upgrade organization" + "allowScreenshotsDesc": { + "message": "Allow the Bitwarden desktop application to be captured in screenshots and viewed in remote desktop sessions. Disabling this will prevent access on some external displays." }, - "upgradeOrganizationDesc": { - "message": "This feature is not available for free organizations. Switch to a paid plan to unlock more features." + "confirmWindowStillVisibleTitle": { + "message": "Confirm window still visible" + }, + "confirmWindowStillVisibleContent": { + "message": "Please confirm that the window is still visible." }, "updateBrowserOrDisableFingerprintDialogTitle": { "message": "Extension update required" diff --git a/apps/desktop/src/locales/or/messages.json b/apps/desktop/src/locales/or/messages.json index 3fba3115f0e..7b6006b8f5d 100644 --- a/apps/desktop/src/locales/or/messages.json +++ b/apps/desktop/src/locales/or/messages.json @@ -2745,14 +2745,23 @@ "loginInitiated": { "message": "Login initiated" }, + "logInRequestSent": { + "message": "Request sent" + }, "notificationSentDevice": { "message": "A notification has been sent to your device." }, "aNotificationWasSentToYourDevice": { "message": "A notification was sent to your device" }, - "makeSureYourAccountIsUnlockedAndTheFingerprintEtc": { - "message": "Make sure your account is unlocked and the fingerprint phrase matches on the other device" + "notificationSentDevicePart1": { + "message": "Unlock Bitwarden on your device or on the " + }, + "notificationSentDeviceAnchor": { + "message": "web app" + }, + "notificationSentDevicePart2": { + "message": "Make sure the Fingerprint phrase matches the one below before approving." }, "needAnotherOptionV1": { "message": "Need another option?" @@ -2782,11 +2791,11 @@ "message": "Toggle character count", "description": "'Character count' describes a feature that displays a number next to each character of the password." }, - "areYouTryingtoLogin": { - "message": "Are you trying to log in?" + "areYouTryingToAccessYourAccount": { + "message": "Are you trying to access your account?" }, - "logInAttemptBy": { - "message": "Login attempt by $EMAIL$", + "accessAttemptBy": { + "message": "Access attempt by $EMAIL$", "placeholders": { "email": { "content": "$1", @@ -2803,11 +2812,11 @@ "time": { "message": "Time" }, - "confirmLogIn": { - "message": "Confirm login" + "confirmAccess": { + "message": "Confirm access" }, - "denyLogIn": { - "message": "Deny login" + "denyAccess": { + "message": "Deny access" }, "logInConfirmedForEmailOnDevice": { "message": "Login confirmed for $EMAIL$ on $DEVICE$", @@ -2843,8 +2852,8 @@ "thisRequestIsNoLongerValid": { "message": "This request is no longer valid." }, - "confirmLoginAtemptForMail": { - "message": "Confirm login attempt for $EMAIL$", + "confirmAccessAttempt": { + "message": "Confirm access attempt for $EMAIL$", "placeholders": { "email": { "content": "$1", @@ -2855,6 +2864,9 @@ "logInRequested": { "message": "Log in requested" }, + "accountAccessRequested": { + "message": "Account access requested" + }, "creatingAccountOn": { "message": "Creating account on" }, @@ -3484,14 +3496,17 @@ "changeAcctEmail": { "message": "Change account email" }, - "organizationUpgradeRequired": { - "message": "Organization upgrade required" + "allowScreenshots": { + "message": "Allow screen capture" }, - "upgradeOrganization": { - "message": "Upgrade organization" + "allowScreenshotsDesc": { + "message": "Allow the Bitwarden desktop application to be captured in screenshots and viewed in remote desktop sessions. Disabling this will prevent access on some external displays." }, - "upgradeOrganizationDesc": { - "message": "This feature is not available for free organizations. Switch to a paid plan to unlock more features." + "confirmWindowStillVisibleTitle": { + "message": "Confirm window still visible" + }, + "confirmWindowStillVisibleContent": { + "message": "Please confirm that the window is still visible." }, "updateBrowserOrDisableFingerprintDialogTitle": { "message": "Extension update required" diff --git a/apps/desktop/src/locales/pl/messages.json b/apps/desktop/src/locales/pl/messages.json index 43659a925e2..c3d2a347df2 100644 --- a/apps/desktop/src/locales/pl/messages.json +++ b/apps/desktop/src/locales/pl/messages.json @@ -27,7 +27,7 @@ "message": "Bezpieczna notatka" }, "typeSshKey": { - "message": "SSH key" + "message": "Klucz SSH" }, "folders": { "message": "Foldery" @@ -64,7 +64,7 @@ } }, "welcomeBack": { - "message": "Welcome back" + "message": "Witaj ponownie" }, "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." @@ -181,61 +181,61 @@ "message": "Adres" }, "sshPrivateKey": { - "message": "Private key" + "message": "Klucz prywatny" }, "sshPublicKey": { - "message": "Public key" + "message": "Klucz publiczny" }, "sshFingerprint": { - "message": "Fingerprint" + "message": "Odcisk palca" }, "sshKeyAlgorithm": { - "message": "Key type" + "message": "Typ klucza" }, "sshKeyAlgorithmED25519": { "message": "ED25519" }, "sshKeyAlgorithmRSA2048": { - "message": "RSA 2048-Bit" + "message": "RSA 2048-bitowy" }, "sshKeyAlgorithmRSA3072": { - "message": "RSA 3072-Bit" + "message": "RSA 3072-bitowy" }, "sshKeyAlgorithmRSA4096": { - "message": "RSA 4096-Bit" + "message": "RSA 4096-bitowy" }, "sshKeyGenerated": { - "message": "A new SSH key was generated" + "message": "Nowy klucz SSH został wygenerowany" }, "sshKeyWrongPassword": { - "message": "The password you entered is incorrect." + "message": "Wprowadzone hasło jest nieprawidłowe." }, "importSshKey": { - "message": "Import" + "message": "Importuj" }, "confirmSshKeyPassword": { - "message": "Confirm password" + "message": "Potwierdź hasło" }, "enterSshKeyPasswordDesc": { - "message": "Enter the password for the SSH key." + "message": "Wprowadź hasło do klucza SSH." }, "enterSshKeyPassword": { - "message": "Enter password" + "message": "Wprowadź hasło" }, "sshAgentUnlockRequired": { - "message": "Please unlock your vault to approve the SSH key request." + "message": "Odblokuj swój sejf, aby zatwierdzić żądanie klucza SSH." }, "sshAgentUnlockTimeout": { - "message": "SSH key request timed out." + "message": "Przekroczono limit czasu żądania klucza SSH." }, "enableSshAgent": { - "message": "Enable SSH agent" + "message": "Włącz agenta SSH" }, "enableSshAgentDesc": { - "message": "Enable the SSH agent to sign SSH requests right from your Bitwarden vault." + "message": "Włącz agenta SSH do podpisywania żądań SSH bezpośrednio z Twojego sejfu Bitwarden." }, "enableSshAgentHelp": { - "message": "The SSH agent is a service targeted at developers that allows you to sign SSH requests directly from your Bitwarden vault." + "message": "Agent SSH to usługa skierowana do programistów, która umożliwia podpisywanie żądań SSH bezpośrednio z Twojego sejfu Bitwarden." }, "premiumRequired": { "message": "Konto Premium jest wymagane" @@ -250,17 +250,17 @@ "message": "Błąd" }, "decryptionError": { - "message": "Decryption error" + "message": "Błąd odszyfrowywania" }, "couldNotDecryptVaultItemsBelow": { - "message": "Bitwarden could not decrypt the vault item(s) listed below." + "message": "Bitwarden nie mógł odszyfrować elementów sejfu wymienionych poniżej." }, "contactCSToAvoidDataLossPart1": { - "message": "Contact customer success", + "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": "to avoid additional data loss.", + "message": "aby uniknąć dalszej utraty danych.", "description": "This is part of a larger sentence. The full sentence will read 'Contact customer success to avoid additional data loss.'" }, "january": { @@ -337,7 +337,7 @@ "message": "Wygeneruj hasło" }, "generatePassphrase": { - "message": "Generate passphrase" + "message": "Wygeneruj hasło wyrazowe" }, "type": { "message": "Rodzaj" @@ -475,13 +475,13 @@ "message": "Kopiuj hasło" }, "regenerateSshKey": { - "message": "Regenerate SSH key" + "message": "Wygeneruj ponownie klucz SSH" }, "copySshPrivateKey": { - "message": "Copy SSH private key" + "message": "Skopiuj klucz prywatny SSH" }, "copyPassphrase": { - "message": "Copy passphrase", + "message": "Skopiuj hasło wyrazowe", "description": "Copy passphrase to clipboard" }, "copyUri": { @@ -512,11 +512,11 @@ "message": "Znaki specjalne (!@#$%^&*)" }, "include": { - "message": "Include", + "message": "Uwzględnij", "description": "Card header for password generator include block" }, "uppercaseDescription": { - "message": "Include uppercase characters", + "message": "Uwzględnij wielkie litery", "description": "Tooltip for the password generator uppercase character checkbox" }, "uppercaseLabel": { @@ -524,7 +524,7 @@ "description": "Label for the password generator uppercase character checkbox" }, "lowercaseDescription": { - "message": "Include lowercase characters", + "message": "Uwzględnij małe litery", "description": "Full description for the password generator lowercase character checkbox" }, "lowercaseLabel": { @@ -532,7 +532,7 @@ "description": "Label for the password generator lowercase character checkbox" }, "numbersDescription": { - "message": "Include numbers", + "message": "Uwzględnij cyfry", "description": "Full description for the password generator numbers checkbox" }, "numbersLabel": { @@ -540,7 +540,7 @@ "description": "Label for the password generator numbers checkbox" }, "specialCharactersDescription": { - "message": "Include special characters", + "message": "Uwzględnij znaki specjalne", "description": "Full description for the password generator special characters checkbox" }, "specialCharactersLabel": { @@ -575,7 +575,7 @@ "description": "deprecated. Use avoidAmbiguous instead." }, "avoidAmbiguous": { - "message": "Avoid ambiguous characters", + "message": "Unikaj niejednoznacznych znaków", "description": "Label for the avoid ambiguous characters checkbox." }, "generatorPolicyInEffect": { @@ -638,7 +638,7 @@ "message": "Utwórz konto" }, "newToBitwarden": { - "message": "New to Bitwarden?" + "message": "Nowy na Bitwarden?" }, "setAStrongPassword": { "message": "Ustaw silne hasło" @@ -650,16 +650,16 @@ "message": "Zaloguj się" }, "logInToBitwarden": { - "message": "Log in to Bitwarden" + "message": "Zaloguj do Bitwarden" }, "logInWithPasskey": { - "message": "Log in with passkey" + "message": "Zaloguj się używając klucza dostępu" }, "loginWithDevice": { - "message": "Log in with device" + "message": "Zaloguj się za pomocą urządzenia" }, "useSingleSignOn": { - "message": "Use single sign-on" + "message": "Użyj jednokrotnego logowania" }, "submit": { "message": "Wyślij" @@ -708,7 +708,7 @@ "message": "Dołącz do organizacji" }, "joinOrganizationName": { - "message": "Join $ORGANIZATIONNAME$", + "message": "Dołącz do $ORGANIZATIONNAME$", "placeholders": { "organizationName": { "content": "$1", @@ -886,13 +886,13 @@ "description": "'Duo Security' and 'Duo Mobile' are product names and should not be translated." }, "verifyIdentity": { - "message": "Verify your Identity" + "message": "Zweryfikuj swoją tożsamość" }, "weDontRecognizeThisDevice": { - "message": "We don't recognize this device. Enter the code sent to your email to verify your identity." + "message": "Nie rozpoznajemy tego urządzenia. Wpisz kod wysłany na Twój e-mail, aby zweryfikować tożsamość." }, "continueLoggingIn": { - "message": "Continue logging in" + "message": "Kontynuuj logowanie" }, "webAuthnTitle": { "message": "FIDO2 WebAuthn" @@ -943,13 +943,13 @@ "message": "Adres URL serwera" }, "authenticationTimeout": { - "message": "Authentication timeout" + "message": "Limit czasu uwierzytelniania" }, "authenticationSessionTimedOut": { - "message": "The authentication session timed out. Please restart the login process." + "message": "Upłynął limit czasu uwierzytelniania. Uruchom ponownie proces logowania." }, "selfHostBaseUrl": { - "message": "Self-host server URL", + "message": "URL samodzielnie hostowanego serwera", "description": "Label for field requesting a self-hosted integration service URL" }, "apiUrl": { @@ -1096,16 +1096,16 @@ "message": "Sejf jest zablokowany. Zweryfikuj swoją tożsamość, aby kontynuować." }, "yourAccountIsLocked": { - "message": "Your account is locked" + "message": "Twoje konto jest zablokowane" }, "or": { - "message": "or" + "message": "lub" }, "unlockWithBiometrics": { - "message": "Unlock with biometrics" + "message": "Odblokuj za pomocą danych biometrycznych" }, "unlockWithMasterPassword": { - "message": "Unlock with master password" + "message": "Odblokuj przy użyciu hasła głównego" }, "unlock": { "message": "Odblokuj" @@ -1343,7 +1343,7 @@ "description": "Copy credit card number" }, "copyEmail": { - "message": "Copy email" + "message": "Skopiuj e-mail" }, "copySecurityCode": { "message": "Kopiuj kod zabezpieczający", @@ -1413,13 +1413,13 @@ "message": "Historia hasła" }, "generatorHistory": { - "message": "Generator history" + "message": "Historia generatora" }, "clearGeneratorHistoryTitle": { - "message": "Clear generator history" + "message": "Wyczyść historię generatora" }, "cleargGeneratorHistoryDescription": { - "message": "If you continue, all entries will be permanently deleted from generator's history. Are you sure you want to continue?" + "message": "Jeśli zatwierdzisz, wszystkie wygenerowane hasła zostaną usunięte z historii generatora. Czy chcesz kontynuować mimo to?" }, "clear": { "message": "Wyczyść", @@ -1429,13 +1429,13 @@ "message": "Brak haseł." }, "clearHistory": { - "message": "Clear history" + "message": "Wyczyść historię" }, "nothingToShow": { - "message": "Nothing to show" + "message": "Brak zawartości do pokazania" }, "nothingGeneratedRecently": { - "message": "You haven't generated anything recently" + "message": "Nic nie zostało wygenerowane przez ciebie w ostatnim czasie" }, "undo": { "message": "Cofnij" @@ -1791,10 +1791,10 @@ "message": "Usunięcie konta jest nieodwracalne. Ta czynność nie może zostać cofnięta." }, "cannotDeleteAccount": { - "message": "Cannot delete account" + "message": "Nie można usunąć konta" }, "cannotDeleteAccountDesc": { - "message": "This action cannot be completed because your account is owned by an organization. Contact your organization administrator for additional details." + "message": "Tej akcji nie można zakończyć, ponieważ Twoje konto jest zarządzane przez organizację. Skontaktuj się z administratorem organizacji, aby uzyskać dodatkowe informacje." }, "accountDeleted": { "message": "Konto zostało usunięte" @@ -1907,7 +1907,7 @@ "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": "z $TOTAL$", "placeholders": { "total": { "content": "$1", @@ -1995,7 +1995,7 @@ "message": "Włącz połączenie z przeglądarką" }, "enableBrowserIntegrationDesc1": { - "message": "Used to allow biometric unlock in browsers that are not Safari." + "message": "Używane do odblokowania biometrycznego w przeglądarkach innych niż Safari." }, "enableDuckDuckGoBrowserIntegration": { "message": "Włącz połączenie z przeglądarką DuckDuckGo" @@ -2476,7 +2476,7 @@ "message": "Zablokowany" }, "yourVaultIsLockedV2": { - "message": "Your vault is locked" + "message": "Twój sejf jest zablokowany" }, "unlocked": { "message": "Odblokowany" @@ -2498,10 +2498,10 @@ "message": "Wygeneruj nazwę użytkownika" }, "generateEmail": { - "message": "Generate email" + "message": "Wygeneruj e-mail" }, "spinboxBoundariesHint": { - "message": "Value must be between $MIN$ and $MAX$.", + "message": "Wartość musi być pomiędzy $MIN$ a $MAX$.", "description": "Explains spin box minimum and maximum values to the user", "placeholders": { "min": { @@ -2515,7 +2515,7 @@ } }, "passwordLengthRecommendationHint": { - "message": " Use $RECOMMENDED$ characters or more to generate a strong password.", + "message": " Użyj $RECOMMENDED$ znaków lub więcej, aby wygenerować 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": { @@ -2525,7 +2525,7 @@ } }, "passphraseNumWordsRecommendationHint": { - "message": " Use $RECOMMENDED$ words or more to generate a strong passphrase.", + "message": " Użyj $RECOMMENDED$ słów lub więcej, aby wygenerować silne hasło.", "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": { @@ -2551,7 +2551,7 @@ "message": "Użyj skonfigurowanej skrzynki catch-all w swojej domenie." }, "useThisEmail": { - "message": "Use this email" + "message": "Użyj tego adresu e-mail" }, "random": { "message": "Losowa" @@ -2581,11 +2581,11 @@ "message": "Wygeneruj alias adresu e-mail z zewnętrznej usługi przekazywania." }, "forwarderDomainName": { - "message": "Email domain", + "message": "Domena e-mail", "description": "Labels the domain name email forwarder service option" }, "forwarderDomainNameHint": { - "message": "Choose a domain that is supported by the selected service", + "message": "Wybierz domenę, która jest obsługiwana przez wybraną usługę", "description": "Guidance provided for email forwarding services that support multiple email domains." }, "forwarderError": { @@ -2745,17 +2745,26 @@ "loginInitiated": { "message": "Logowanie rozpoczęte" }, + "logInRequestSent": { + "message": "Żądanie wysłane" + }, "notificationSentDevice": { "message": "Powiadomienie zostało wysłane na urządzenie." }, "aNotificationWasSentToYourDevice": { - "message": "A notification was sent to your device" + "message": "Powiadomienie zostało wysłane na twoje urządzenie" }, - "makeSureYourAccountIsUnlockedAndTheFingerprintEtc": { - "message": "Make sure your account is unlocked and the fingerprint phrase matches on the other device" + "notificationSentDevicePart1": { + "message": "Odblokuj Bitwarden na swoim urządzeniu lub w" + }, + "notificationSentDeviceAnchor": { + "message": "aplikacji internetowej" + }, + "notificationSentDevicePart2": { + "message": "Upewnij się, że fraza odcisku palca zgadza się z tą poniżej, zanim zatwierdzisz." }, "needAnotherOptionV1": { - "message": "Need another option?" + "message": "Potrzebujesz innego sposobu?" }, "fingerprintMatchInfo": { "message": "Upewnij się, że sejf jest odblokowany, a unikalny identyfikator konta pasuje do innego urządzenia." @@ -2764,13 +2773,13 @@ "message": "Unikalny identyfikator konta" }, "youWillBeNotifiedOnceTheRequestIsApproved": { - "message": "You will be notified once the request is approved" + "message": "Zostaniesz powiadomiony po zatwierdzeniu prośby" }, "needAnotherOption": { "message": "Logowanie za pomocą urządzenia musi być włączone w ustawieniach aplikacji Bitwarden. Potrzebujesz innej opcji?" }, "viewAllLogInOptions": { - "message": "View all log in options" + "message": "Zobacz wszystkie sposoby logowania" }, "viewAllLoginOptions": { "message": "Zobacz wszystkie sposoby logowania" @@ -2782,11 +2791,11 @@ "message": "Pokaż / Ukryj licznik znaków", "description": "'Character count' describes a feature that displays a number next to each character of the password." }, - "areYouTryingtoLogin": { - "message": "Próbujesz się zalogować?" + "areYouTryingToAccessYourAccount": { + "message": "Czy próbujesz uzyskać dostęp do swojego konta?" }, - "logInAttemptBy": { - "message": "Próba logowania przez $EMAIL$", + "accessAttemptBy": { + "message": "Próba dostępu przez $EMAIL$", "placeholders": { "email": { "content": "$1", @@ -2803,11 +2812,11 @@ "time": { "message": "Godzina" }, - "confirmLogIn": { - "message": "Potwierdź logowanie" + "confirmAccess": { + "message": "Potwierdź dostęp" }, - "denyLogIn": { - "message": "Odrzuć logowanie" + "denyAccess": { + "message": "Odmów dostępu" }, "logInConfirmedForEmailOnDevice": { "message": "Logowanie potwierdzone dla $EMAIL$ dnia $DEVICE$", @@ -2843,8 +2852,8 @@ "thisRequestIsNoLongerValid": { "message": "Ta prośba nie jest już ważna." }, - "confirmLoginAtemptForMail": { - "message": "Potwierdź próbę logowania dla $EMAIL$", + "confirmAccessAttempt": { + "message": "Potwierdź próbę dostępu dla $EMAIL$", "placeholders": { "email": { "content": "$1", @@ -2855,6 +2864,9 @@ "logInRequested": { "message": "Wysłano prośbę logowania" }, + "accountAccessRequested": { + "message": "Poproszono o dostęp do konta" + }, "creatingAccountOn": { "message": "Tworzenie konta na" }, @@ -2889,22 +2901,22 @@ "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?" }, "useThisPassword": { - "message": "Use this password" + "message": "Użyj tego hasła" }, "useThisUsername": { - "message": "Use this username" + "message": "Użyj tej nazwy użytkownika" }, "checkForBreaches": { "message": "Sprawdź znane naruszenia ochrony danych tego hasła" }, "loggedInExclamation": { - "message": "Logged in!" + "message": "Zalogowano!" }, "important": { "message": "Ważne:" }, "accessing": { - "message": "Accessing" + "message": "Uzyskiwanie dostępu" }, "accessTokenUnableToBeDecrypted": { "message": "Zostałeś wylogowany, ponieważ token dostępu nie mógł zostać odszyfrowany. Zaloguj się ponownie, aby rozwiązać ten problem." @@ -2931,16 +2943,16 @@ "message": "Aktualizacja ustawień zalecanych" }, "rememberThisDeviceToMakeFutureLoginsSeamless": { - "message": "Remember this device to make future logins seamless" + "message": "Zapamiętaj to urządzenie, aby przyszłe logowania były bezproblemowe" }, "deviceApprovalRequired": { "message": "Wymagane zatwierdzenie urządzenia. Wybierz opcję zatwierdzenia poniżej:" }, "deviceApprovalRequiredV2": { - "message": "Device approval required" + "message": "Wymagane zatwierdzenie urządzenia" }, "selectAnApprovalOptionBelow": { - "message": "Select an approval option below" + "message": "Wybierz opcję zatwierdzenia poniżej" }, "rememberThisDevice": { "message": "Zapamiętaj to urządzenie" @@ -2995,7 +3007,7 @@ "message": "Brak adresu e-mail użytkownika" }, "activeUserEmailNotFoundLoggingYouOut": { - "message": "Active user email not found. Logging you out." + "message": "Nie znaleziono aktywnego adresu e-mail. Trwa wylogowanie." }, "deviceTrusted": { "message": "Zaufano urządzeniu" @@ -3383,28 +3395,28 @@ "message": "Dane" }, "fileSends": { - "message": "File Sends" + "message": "Wysyłki plików" }, "textSends": { - "message": "Text Sends" + "message": "Wysyłki tekstów" }, "ssoError": { "message": "Nie znaleziono wolnych portów dla logowania SSO." }, "biometricsStatusHelptextUnlockNeeded": { - "message": "Biometric unlock is unavailable because PIN or password unlock is required first." + "message": "Odblokowanie odciskiem palca jest niedostępne, ponieważ najpierw wymagane jest odblokowanie kodem PIN lub hasłem." }, "biometricsStatusHelptextHardwareUnavailable": { - "message": "Biometric unlock is currently unavailable." + "message": "Odblokowanie biometryczne jest obecnie niedostępne." }, "biometricsStatusHelptextAutoSetupNeeded": { - "message": "Biometric unlock is unavailable due to misconfigured system files." + "message": "Odblokowanie biometryczne jest niedostępne z powodu nieprawidłowej konfiguracji plików systemowych." }, "biometricsStatusHelptextManualSetupNeeded": { - "message": "Biometric unlock is unavailable due to misconfigured system files." + "message": "Odblokowanie biometryczne jest niedostępne z powodu nieprawidłowej konfiguracji plików systemowych." }, "biometricsStatusHelptextNotEnabledLocally": { - "message": "Biometric unlock is unavailable because it is not enabled for $EMAIL$ in the Bitwarden desktop app.", + "message": "Odblokowanie biometryczne jest niedostępne, ponieważ nie jest włączone dla $EMAIL$ w aplikacji desktopowej Bitwarden.", "placeholders": { "email": { "content": "$1", @@ -3413,58 +3425,58 @@ } }, "biometricsStatusHelptextUnavailableReasonUnknown": { - "message": "Biometric unlock is currently unavailable for an unknown reason." + "message": "Odblokowanie biometryczne jest obecnie niedostępne z nieznanego powodu." }, "authorize": { - "message": "Authorize" + "message": "Autoryzuj" }, "deny": { - "message": "Deny" + "message": "Odmów" }, "sshkeyApprovalTitle": { - "message": "Confirm SSH key usage" + "message": "Potwierdź użycie klucza SSH" }, "sshkeyApprovalMessageInfix": { - "message": "is requesting access to" + "message": "wnioskuje o dostęp do" }, "unknownApplication": { - "message": "An application" + "message": "Aplikacja" }, "sshKeyPasswordUnsupported": { - "message": "Importing password protected SSH keys is not yet supported" + "message": "Importowanie kluczy SSH chronionych hasłem nie jest jeszcze obsługiwane" }, "invalidSshKey": { - "message": "The SSH key is invalid" + "message": "Klucz SSH jest nieprawidłowy" }, "sshKeyTypeUnsupported": { - "message": "The SSH key type is not supported" + "message": "Typ klucza SSH nie jest obsługiwany" }, "importSshKeyFromClipboard": { - "message": "Import key from clipboard" + "message": "Importuj klucz ze schowka" }, "sshKeyPasted": { - "message": "SSH key imported successfully" + "message": "Pomyślnie zaimportowano klucz SSH" }, "fileSavedToDevice": { "message": "Plik zapisany na urządzeniu. Zarządzaj plikiem na swoim urządzeniu." }, "importantNotice": { - "message": "Important notice" + "message": "Ważna informacja" }, "setupTwoStepLogin": { - "message": "Set up two-step login" + "message": "Skonfiguruj dwustopniowe logowanie" }, "newDeviceVerificationNoticeContentPage1": { - "message": "Bitwarden will send a code to your account email to verify logins from new devices starting in February 2025." + "message": "Bitwarden wyśle kod na Twój adres e-mail w celu zweryfikowania logowania z nowych urządzeń, począwszy od lutego 2025 r." }, "newDeviceVerificationNoticeContentPage2": { - "message": "You can set up two-step login as an alternative way to protect your account or change your email to one you can access." + "message": "Możesz skonfigurować dwustopniowe logowanie jako alternatywny sposób ochrony konta lub zmienić swój adres e-mail, do którego masz dostęp." }, "remindMeLater": { - "message": "Remind me later" + "message": "Przypomnij mi później" }, "newDeviceVerificationNoticePageOneFormContent": { - "message": "Do you have reliable access to your email, $EMAIL$?", + "message": "Czy masz pewny dostęp do swojego adresu e-mail, $EMAIL$?", "placeholders": { "email": { "content": "$1", @@ -3473,30 +3485,33 @@ } }, "newDeviceVerificationNoticePageOneEmailAccessNo": { - "message": "No, I do not" + "message": "Nie, nie mam" }, "newDeviceVerificationNoticePageOneEmailAccessYes": { - "message": "Yes, I can reliably access my email" + "message": "Tak, mam pewny dostęp do mojego adresu e-mail" }, "turnOnTwoStepLogin": { - "message": "Turn on two-step login" + "message": "Włącz dwustopniowe logowanie" }, "changeAcctEmail": { - "message": "Change account email" + "message": "Zmień adres e-mail konta" }, - "organizationUpgradeRequired": { - "message": "Organization upgrade required" + "allowScreenshots": { + "message": "Zezwól na przechwytywanie ekranu" }, - "upgradeOrganization": { - "message": "Upgrade organization" + "allowScreenshotsDesc": { + "message": "Zezwól aplikacji desktopowej Bitwarden na przechwytywanie w zrzutach ekranu i przeglądanie w sesjach zdalnego pulpitu. Wyłączenie tej opcji uniemożliwi dostęp na niektórych zewnętrznych wyświetlaczach." }, - "upgradeOrganizationDesc": { - "message": "This feature is not available for free organizations. Switch to a paid plan to unlock more features." + "confirmWindowStillVisibleTitle": { + "message": "Potwierdź widoczność okna" + }, + "confirmWindowStillVisibleContent": { + "message": "Potwierdź, że okno jest nadal widoczne." }, "updateBrowserOrDisableFingerprintDialogTitle": { - "message": "Extension update required" + "message": "Wymagana aktualizacja rozszerzenia" }, "updateBrowserOrDisableFingerprintDialogMessage": { - "message": "The browser extension you are using is out of date. Please update it or disable browser integration fingerprint validation in the desktop app settings." + "message": "Rozszerzenie przeglądarki, którego używasz, jest nieaktualne. Zaktualizuj je lub wyłącz weryfikację odcisku palca integracji przeglądarki w ustawieniach aplikacji desktopowej." } } diff --git a/apps/desktop/src/locales/pt_BR/messages.json b/apps/desktop/src/locales/pt_BR/messages.json index 39c62737f8d..7404b5d9e48 100644 --- a/apps/desktop/src/locales/pt_BR/messages.json +++ b/apps/desktop/src/locales/pt_BR/messages.json @@ -2745,14 +2745,23 @@ "loginInitiated": { "message": "Login iniciado" }, + "logInRequestSent": { + "message": "Request sent" + }, "notificationSentDevice": { "message": "Uma notificação foi enviada para seu dispositivo." }, "aNotificationWasSentToYourDevice": { "message": "Uma notificação foi enviada para seu dispositivo" }, - "makeSureYourAccountIsUnlockedAndTheFingerprintEtc": { - "message": "Certifique-se que sua conta esteja desbloqueada e que a frase de identificação corresponda à do outro dispositivo" + "notificationSentDevicePart1": { + "message": "Unlock Bitwarden on your device or on the " + }, + "notificationSentDeviceAnchor": { + "message": "web app" + }, + "notificationSentDevicePart2": { + "message": "Make sure the Fingerprint phrase matches the one below before approving." }, "needAnotherOptionV1": { "message": "Precisa de outra opção?" @@ -2782,11 +2791,11 @@ "message": "Ativar/Desativar contagem de caracteres", "description": "'Character count' describes a feature that displays a number next to each character of the password." }, - "areYouTryingtoLogin": { - "message": "Você está tentando fazer login?" + "areYouTryingToAccessYourAccount": { + "message": "Are you trying to access your account?" }, - "logInAttemptBy": { - "message": "Tentativa de login por $EMAIL$", + "accessAttemptBy": { + "message": "Access attempt by $EMAIL$", "placeholders": { "email": { "content": "$1", @@ -2803,11 +2812,11 @@ "time": { "message": "Horário" }, - "confirmLogIn": { - "message": "Confirmar acesso" + "confirmAccess": { + "message": "Confirm access" }, - "denyLogIn": { - "message": "Negar acesso" + "denyAccess": { + "message": "Deny access" }, "logInConfirmedForEmailOnDevice": { "message": "Acesso confirmado para $EMAIL$ em $DEVICE$", @@ -2843,8 +2852,8 @@ "thisRequestIsNoLongerValid": { "message": "Este pedido não é mais válido." }, - "confirmLoginAtemptForMail": { - "message": "Confirmar tentativa de acesso de $EMAIL$", + "confirmAccessAttempt": { + "message": "Confirm access attempt for $EMAIL$", "placeholders": { "email": { "content": "$1", @@ -2855,6 +2864,9 @@ "logInRequested": { "message": "Acesso solicitado" }, + "accountAccessRequested": { + "message": "Account access requested" + }, "creatingAccountOn": { "message": "Criando conta em" }, @@ -3484,14 +3496,17 @@ "changeAcctEmail": { "message": "Alterar e-mail" }, - "organizationUpgradeRequired": { - "message": "Organization upgrade required" + "allowScreenshots": { + "message": "Allow screen capture" }, - "upgradeOrganization": { - "message": "Upgrade organization" + "allowScreenshotsDesc": { + "message": "Allow the Bitwarden desktop application to be captured in screenshots and viewed in remote desktop sessions. Disabling this will prevent access on some external displays." }, - "upgradeOrganizationDesc": { - "message": "This feature is not available for free organizations. Switch to a paid plan to unlock more features." + "confirmWindowStillVisibleTitle": { + "message": "Confirm window still visible" + }, + "confirmWindowStillVisibleContent": { + "message": "Please confirm that the window is still visible." }, "updateBrowserOrDisableFingerprintDialogTitle": { "message": "Extension update required" diff --git a/apps/desktop/src/locales/pt_PT/messages.json b/apps/desktop/src/locales/pt_PT/messages.json index 6e8bdd24474..909f43175c0 100644 --- a/apps/desktop/src/locales/pt_PT/messages.json +++ b/apps/desktop/src/locales/pt_PT/messages.json @@ -2745,14 +2745,23 @@ "loginInitiated": { "message": "A preparar o início de sessão" }, + "logInRequestSent": { + "message": "Pedido enviado" + }, "notificationSentDevice": { "message": "Foi enviada uma notificação para o seu dispositivo." }, "aNotificationWasSentToYourDevice": { "message": "Foi enviada uma notificação para o seu dispositivo" }, - "makeSureYourAccountIsUnlockedAndTheFingerprintEtc": { - "message": "Certifique-se de que a sua conta está desbloqueada e que a frase de impressão digital corresponde à do outro dispositivo" + "notificationSentDevicePart1": { + "message": "Desbloqueie o Bitwarden no seu dispositivo ou no " + }, + "notificationSentDeviceAnchor": { + "message": "aplicação web" + }, + "notificationSentDevicePart2": { + "message": "Certifique-se de que a frase da impressão digital corresponde à frase abaixo indicada antes de a aprovar." }, "needAnotherOptionV1": { "message": "Precisa de outra opção?" @@ -2782,11 +2791,11 @@ "message": "Mostrar/ocultar contagem de carateres", "description": "'Character count' describes a feature that displays a number next to each character of the password." }, - "areYouTryingtoLogin": { - "message": "Está a tentar iniciar sessão?" + "areYouTryingToAccessYourAccount": { + "message": "Está a tentar aceder à sua conta?" }, - "logInAttemptBy": { - "message": "Tentativa de início de sessão por $EMAIL$", + "accessAttemptBy": { + "message": "Tentativa de acesso por $EMAIL$", "placeholders": { "email": { "content": "$1", @@ -2803,11 +2812,11 @@ "time": { "message": "Hora" }, - "confirmLogIn": { - "message": "Confirmar início de sessão" + "confirmAccess": { + "message": "Confirmar acesso" }, - "denyLogIn": { - "message": "Recusar início de sessão" + "denyAccess": { + "message": "Recusar acesso" }, "logInConfirmedForEmailOnDevice": { "message": "Início de sessão confirmado para $EMAIL$ no $DEVICE$", @@ -2843,8 +2852,8 @@ "thisRequestIsNoLongerValid": { "message": "Este pedido já não é válido." }, - "confirmLoginAtemptForMail": { - "message": "Confirmar tentativa de início de sessão de $EMAIL$", + "confirmAccessAttempt": { + "message": "Confirmar tentativa de acesso para $EMAIL$", "placeholders": { "email": { "content": "$1", @@ -2855,6 +2864,9 @@ "logInRequested": { "message": "Pedido de início de sessão" }, + "accountAccessRequested": { + "message": "Acesso à conta solicitado" + }, "creatingAccountOn": { "message": "A criar uma conta em" }, @@ -3446,7 +3458,7 @@ "message": "Chave SSH importada com sucesso" }, "fileSavedToDevice": { - "message": "Ficheiro guardado no dispositivo. Gira-o a partir das transferências do seu dispositivo." + "message": "Ficheiro guardado no dispositivo. Faça a gestão a partir das transferências do seu dispositivo." }, "importantNotice": { "message": "Aviso importante" @@ -3484,14 +3496,17 @@ "changeAcctEmail": { "message": "Alterar o e-mail da conta" }, - "organizationUpgradeRequired": { - "message": "Atualização da organização necessária" + "allowScreenshots": { + "message": "Permitir a captura de ecrã" }, - "upgradeOrganization": { - "message": "Atualizar organização" + "allowScreenshotsDesc": { + "message": "Permitir capturas de ecrã à aplicação para computador do Bitwarden e que seja vista em sessões remotas no computador. Desativar esta opção impedirá o acesso de alguns monitores externos." }, - "upgradeOrganizationDesc": { - "message": "Esta funcionalidade não está disponível para organizações gratuitas. Mude para um plano pago para desbloquear mais funcionalidades." + "confirmWindowStillVisibleTitle": { + "message": "Janela de confirmação ainda visível" + }, + "confirmWindowStillVisibleContent": { + "message": "Por favor, confirme se a janela ainda está visível." }, "updateBrowserOrDisableFingerprintDialogTitle": { "message": "Atualização da extensão necessária" diff --git a/apps/desktop/src/locales/ro/messages.json b/apps/desktop/src/locales/ro/messages.json index e434f782e40..52a05028351 100644 --- a/apps/desktop/src/locales/ro/messages.json +++ b/apps/desktop/src/locales/ro/messages.json @@ -2745,14 +2745,23 @@ "loginInitiated": { "message": "Login initiated" }, + "logInRequestSent": { + "message": "Request sent" + }, "notificationSentDevice": { "message": "A notification has been sent to your device." }, "aNotificationWasSentToYourDevice": { "message": "A notification was sent to your device" }, - "makeSureYourAccountIsUnlockedAndTheFingerprintEtc": { - "message": "Make sure your account is unlocked and the fingerprint phrase matches on the other device" + "notificationSentDevicePart1": { + "message": "Unlock Bitwarden on your device or on the " + }, + "notificationSentDeviceAnchor": { + "message": "web app" + }, + "notificationSentDevicePart2": { + "message": "Make sure the Fingerprint phrase matches the one below before approving." }, "needAnotherOptionV1": { "message": "Need another option?" @@ -2782,11 +2791,11 @@ "message": "Toggle character count", "description": "'Character count' describes a feature that displays a number next to each character of the password." }, - "areYouTryingtoLogin": { - "message": "Are you trying to log in?" + "areYouTryingToAccessYourAccount": { + "message": "Are you trying to access your account?" }, - "logInAttemptBy": { - "message": "Login attempt by $EMAIL$", + "accessAttemptBy": { + "message": "Access attempt by $EMAIL$", "placeholders": { "email": { "content": "$1", @@ -2803,11 +2812,11 @@ "time": { "message": "Time" }, - "confirmLogIn": { - "message": "Confirm login" + "confirmAccess": { + "message": "Confirm access" }, - "denyLogIn": { - "message": "Deny login" + "denyAccess": { + "message": "Deny access" }, "logInConfirmedForEmailOnDevice": { "message": "Login confirmed for $EMAIL$ on $DEVICE$", @@ -2843,8 +2852,8 @@ "thisRequestIsNoLongerValid": { "message": "This request is no longer valid." }, - "confirmLoginAtemptForMail": { - "message": "Confirm login attempt for $EMAIL$", + "confirmAccessAttempt": { + "message": "Confirm access attempt for $EMAIL$", "placeholders": { "email": { "content": "$1", @@ -2855,6 +2864,9 @@ "logInRequested": { "message": "Log in requested" }, + "accountAccessRequested": { + "message": "Account access requested" + }, "creatingAccountOn": { "message": "Creating account on" }, @@ -3484,14 +3496,17 @@ "changeAcctEmail": { "message": "Change account email" }, - "organizationUpgradeRequired": { - "message": "Organization upgrade required" + "allowScreenshots": { + "message": "Allow screen capture" }, - "upgradeOrganization": { - "message": "Upgrade organization" + "allowScreenshotsDesc": { + "message": "Allow the Bitwarden desktop application to be captured in screenshots and viewed in remote desktop sessions. Disabling this will prevent access on some external displays." }, - "upgradeOrganizationDesc": { - "message": "This feature is not available for free organizations. Switch to a paid plan to unlock more features." + "confirmWindowStillVisibleTitle": { + "message": "Confirm window still visible" + }, + "confirmWindowStillVisibleContent": { + "message": "Please confirm that the window is still visible." }, "updateBrowserOrDisableFingerprintDialogTitle": { "message": "Extension update required" diff --git a/apps/desktop/src/locales/ru/messages.json b/apps/desktop/src/locales/ru/messages.json index 55ddbb82d38..de864627bd3 100644 --- a/apps/desktop/src/locales/ru/messages.json +++ b/apps/desktop/src/locales/ru/messages.json @@ -2745,14 +2745,23 @@ "loginInitiated": { "message": "Вход инициирован" }, + "logInRequestSent": { + "message": "Запрос отправлен" + }, "notificationSentDevice": { "message": "На ваше устройство отправлено уведомление." }, "aNotificationWasSentToYourDevice": { "message": "На ваше устройство было отправлено уведомление" }, - "makeSureYourAccountIsUnlockedAndTheFingerprintEtc": { - "message": "Убедитесь, что ваш аккаунт разблокирован и фраза отпечатка совпадает с фразой на другом устройстве" + "notificationSentDevicePart1": { + "message": "Разблокируйте Bitwarden на своем устройстве или " + }, + "notificationSentDeviceAnchor": { + "message": "веб-приложении" + }, + "notificationSentDevicePart2": { + "message": "Перед одобрением убедитесь, что фраза отпечатка совпадает с приведенной ниже." }, "needAnotherOptionV1": { "message": "Нужен другой вариант?" @@ -2782,11 +2791,11 @@ "message": "Показать количество символов", "description": "'Character count' describes a feature that displays a number next to each character of the password." }, - "areYouTryingtoLogin": { - "message": "Вы пытаетесь войти?" + "areYouTryingToAccessYourAccount": { + "message": "Вы пытаетесь получить доступ к своему аккаунту?" }, - "logInAttemptBy": { - "message": "Попытка авторизации через $EMAIL$", + "accessAttemptBy": { + "message": "Попытка доступа $EMAIL$", "placeholders": { "email": { "content": "$1", @@ -2803,11 +2812,11 @@ "time": { "message": "Время" }, - "confirmLogIn": { - "message": "Подтвердить вход" + "confirmAccess": { + "message": "Подтвердить доступ" }, - "denyLogIn": { - "message": "Запретить вход" + "denyAccess": { + "message": "Отказать в доступе" }, "logInConfirmedForEmailOnDevice": { "message": "Вход подтвержден для $EMAIL$ на $DEVICE$", @@ -2843,8 +2852,8 @@ "thisRequestIsNoLongerValid": { "message": "Этот запрос больше не действителен." }, - "confirmLoginAtemptForMail": { - "message": "Подтвердите попытку входа для $EMAIL$", + "confirmAccessAttempt": { + "message": "Подтвердить попытку доступа $EMAIL$", "placeholders": { "email": { "content": "$1", @@ -2855,6 +2864,9 @@ "logInRequested": { "message": "Запрошено разрешение на вход" }, + "accountAccessRequested": { + "message": "Запрошен доступ к аккаунту" + }, "creatingAccountOn": { "message": "Создание аккаунта" }, @@ -3484,14 +3496,17 @@ "changeAcctEmail": { "message": "Изменить email аккаунта" }, - "organizationUpgradeRequired": { - "message": "Требуется обновление организации" + "allowScreenshots": { + "message": "Разрешить захват экрана" }, - "upgradeOrganization": { - "message": "Обновить организацию" + "allowScreenshotsDesc": { + "message": "Разрешить приложению Bitwarden захват экрана для скриншотов и просмотра в сеансах удаленного рабочего стола. Отключение параметра запретит доступ на некоторых внешних дисплеях." }, - "upgradeOrganizationDesc": { - "message": "Эта функция недоступна для бесплатных организаций. Переключитесь на платный план, чтобы разблокировать дополнительные возможности." + "confirmWindowStillVisibleTitle": { + "message": "Окно подтверждения остается видимым" + }, + "confirmWindowStillVisibleContent": { + "message": "Убедитесь, что окно по-прежнему видно." }, "updateBrowserOrDisableFingerprintDialogTitle": { "message": "Необходимо обновить расширение" diff --git a/apps/desktop/src/locales/si/messages.json b/apps/desktop/src/locales/si/messages.json index 8914fe3c688..7f26d586cf4 100644 --- a/apps/desktop/src/locales/si/messages.json +++ b/apps/desktop/src/locales/si/messages.json @@ -2745,14 +2745,23 @@ "loginInitiated": { "message": "Login initiated" }, + "logInRequestSent": { + "message": "Request sent" + }, "notificationSentDevice": { "message": "A notification has been sent to your device." }, "aNotificationWasSentToYourDevice": { "message": "A notification was sent to your device" }, - "makeSureYourAccountIsUnlockedAndTheFingerprintEtc": { - "message": "Make sure your account is unlocked and the fingerprint phrase matches on the other device" + "notificationSentDevicePart1": { + "message": "Unlock Bitwarden on your device or on the " + }, + "notificationSentDeviceAnchor": { + "message": "web app" + }, + "notificationSentDevicePart2": { + "message": "Make sure the Fingerprint phrase matches the one below before approving." }, "needAnotherOptionV1": { "message": "Need another option?" @@ -2782,11 +2791,11 @@ "message": "Toggle character count", "description": "'Character count' describes a feature that displays a number next to each character of the password." }, - "areYouTryingtoLogin": { - "message": "Are you trying to log in?" + "areYouTryingToAccessYourAccount": { + "message": "Are you trying to access your account?" }, - "logInAttemptBy": { - "message": "Login attempt by $EMAIL$", + "accessAttemptBy": { + "message": "Access attempt by $EMAIL$", "placeholders": { "email": { "content": "$1", @@ -2803,11 +2812,11 @@ "time": { "message": "Time" }, - "confirmLogIn": { - "message": "Confirm login" + "confirmAccess": { + "message": "Confirm access" }, - "denyLogIn": { - "message": "Deny login" + "denyAccess": { + "message": "Deny access" }, "logInConfirmedForEmailOnDevice": { "message": "Login confirmed for $EMAIL$ on $DEVICE$", @@ -2843,8 +2852,8 @@ "thisRequestIsNoLongerValid": { "message": "This request is no longer valid." }, - "confirmLoginAtemptForMail": { - "message": "Confirm login attempt for $EMAIL$", + "confirmAccessAttempt": { + "message": "Confirm access attempt for $EMAIL$", "placeholders": { "email": { "content": "$1", @@ -2855,6 +2864,9 @@ "logInRequested": { "message": "Log in requested" }, + "accountAccessRequested": { + "message": "Account access requested" + }, "creatingAccountOn": { "message": "Creating account on" }, @@ -3484,14 +3496,17 @@ "changeAcctEmail": { "message": "Change account email" }, - "organizationUpgradeRequired": { - "message": "Organization upgrade required" + "allowScreenshots": { + "message": "Allow screen capture" }, - "upgradeOrganization": { - "message": "Upgrade organization" + "allowScreenshotsDesc": { + "message": "Allow the Bitwarden desktop application to be captured in screenshots and viewed in remote desktop sessions. Disabling this will prevent access on some external displays." }, - "upgradeOrganizationDesc": { - "message": "This feature is not available for free organizations. Switch to a paid plan to unlock more features." + "confirmWindowStillVisibleTitle": { + "message": "Confirm window still visible" + }, + "confirmWindowStillVisibleContent": { + "message": "Please confirm that the window is still visible." }, "updateBrowserOrDisableFingerprintDialogTitle": { "message": "Extension update required" diff --git a/apps/desktop/src/locales/sk/messages.json b/apps/desktop/src/locales/sk/messages.json index 62175e5a4ac..14ec7d125bc 100644 --- a/apps/desktop/src/locales/sk/messages.json +++ b/apps/desktop/src/locales/sk/messages.json @@ -2575,10 +2575,10 @@ "message": "Prehľadávať môj trezor" }, "forwardedEmail": { - "message": "Alias preposlaného e-mailu" + "message": "Alias presmerovaného e-mailu" }, "forwardedEmailDesc": { - "message": "Vytvoriť e-mailový alias pomocou externej služby preposielania." + "message": "Vytvoriť e-mailový alias pomocou externej služby presmerovania." }, "forwarderDomainName": { "message": "E-mailová doména", @@ -2603,11 +2603,11 @@ } }, "forwarderGeneratedBy": { - "message": "Vygenerované s Bitwarden.", + "message": "Vygenerované Bitwardenom.", "description": "Displayed with the address on the forwarding service's configuration screen." }, "forwarderGeneratedByWithWebsite": { - "message": "Webstránka: $WEBSITE$. Vygenerované s Bitwarden.", + "message": "Webstránka: $WEBSITE$. Vygenerované Bitwardenon.", "description": "Displayed with the address on the forwarding service's configuration screen.", "placeholders": { "WEBSITE": { @@ -2745,14 +2745,23 @@ "loginInitiated": { "message": "Iniciované prihlásenie" }, + "logInRequestSent": { + "message": "Požiadavka bola odoslaná" + }, "notificationSentDevice": { "message": "Do vášho zariadenia bolo odoslané upozornenie." }, "aNotificationWasSentToYourDevice": { "message": "Do vášho zariadenia bolo odoslané upozornenie" }, - "makeSureYourAccountIsUnlockedAndTheFingerprintEtc": { - "message": "Uistite sa, že je váš účet odomknutý a fráza odtlačku prsta sa zhoduje s frázou na druhom zariadení" + "notificationSentDevicePart1": { + "message": "Odomknúť Bitwarden vo svojom zariadení alebo vo " + }, + "notificationSentDeviceAnchor": { + "message": "webovej aplikácii" + }, + "notificationSentDevicePart2": { + "message": "Pred schválením sa uistite, že sa odtlačok prístupovej frázy zhoduje s tou uvedenou nižšie." }, "needAnotherOptionV1": { "message": "Potrebujete inú možnosť?" @@ -2782,11 +2791,11 @@ "message": "Prepnúť počítadlo znakov", "description": "'Character count' describes a feature that displays a number next to each character of the password." }, - "areYouTryingtoLogin": { - "message": "Snažíte sa prihlásiť?" + "areYouTryingToAccessYourAccount": { + "message": "Snažíte sa získať prístup k svojmu účtu?" }, - "logInAttemptBy": { - "message": "Pokus o prihlásenie pomocou $EMAIL$", + "accessAttemptBy": { + "message": "Pokus o prístup z $EMAIL$", "placeholders": { "email": { "content": "$1", @@ -2803,11 +2812,11 @@ "time": { "message": "Čas" }, - "confirmLogIn": { - "message": "Potvrdiť prihlásenie" + "confirmAccess": { + "message": "Potvrdiť prístup" }, - "denyLogIn": { - "message": "Odmietnuť prihlásenie" + "denyAccess": { + "message": "Zamietnuť prístup" }, "logInConfirmedForEmailOnDevice": { "message": "Potvrdené prihlásenie pomocou $EMAIL$ na $DEVICE$", @@ -2843,8 +2852,8 @@ "thisRequestIsNoLongerValid": { "message": "Táto žiadosť už nie je platná." }, - "confirmLoginAtemptForMail": { - "message": "Potvrdiť pokus o prihlásenie pomocou $EMAIL$", + "confirmAccessAttempt": { + "message": "Potvrďte pokus o prístup pre $EMAIL$", "placeholders": { "email": { "content": "$1", @@ -2855,6 +2864,9 @@ "logInRequested": { "message": "Požadované prihlásenie" }, + "accountAccessRequested": { + "message": "Žiadosť o prístup k účtu" + }, "creatingAccountOn": { "message": "Vytváranie účtu na" }, @@ -3484,14 +3496,17 @@ "changeAcctEmail": { "message": "Zmeniť e-mail účtu" }, - "organizationUpgradeRequired": { - "message": "Vyžaduje sa upgrade organizácie" + "allowScreenshots": { + "message": "Povoliť snímanie obrazovky" }, - "upgradeOrganization": { - "message": "Upgrade organizácie" + "allowScreenshotsDesc": { + "message": "Umožní zachytenie Bitwardenu na snímkach obrazovky a jej zobrazenie v reláciách vzdialenej plochy. Zakázanie tejto funkcie zabráni prístupu na niektoré externé displeje." }, - "upgradeOrganizationDesc": { - "message": "Táto funkcia nie je k dispozícii pre bezplatné organizácie. Ak chcete odomknúť ďalšie funkcie, prejdite na platený plán." + "confirmWindowStillVisibleTitle": { + "message": "Potvrdiť viditeľnosť okna" + }, + "confirmWindowStillVisibleContent": { + "message": "Potvrďte, že okno je stále viditeľné." }, "updateBrowserOrDisableFingerprintDialogTitle": { "message": "Rozšírenie musíte aktualizovať" diff --git a/apps/desktop/src/locales/sl/messages.json b/apps/desktop/src/locales/sl/messages.json index d31e9883221..1f272bc7040 100644 --- a/apps/desktop/src/locales/sl/messages.json +++ b/apps/desktop/src/locales/sl/messages.json @@ -2745,14 +2745,23 @@ "loginInitiated": { "message": "Login initiated" }, + "logInRequestSent": { + "message": "Request sent" + }, "notificationSentDevice": { "message": "A notification has been sent to your device." }, "aNotificationWasSentToYourDevice": { "message": "A notification was sent to your device" }, - "makeSureYourAccountIsUnlockedAndTheFingerprintEtc": { - "message": "Make sure your account is unlocked and the fingerprint phrase matches on the other device" + "notificationSentDevicePart1": { + "message": "Unlock Bitwarden on your device or on the " + }, + "notificationSentDeviceAnchor": { + "message": "web app" + }, + "notificationSentDevicePart2": { + "message": "Make sure the Fingerprint phrase matches the one below before approving." }, "needAnotherOptionV1": { "message": "Need another option?" @@ -2782,11 +2791,11 @@ "message": "Toggle character count", "description": "'Character count' describes a feature that displays a number next to each character of the password." }, - "areYouTryingtoLogin": { - "message": "Are you trying to log in?" + "areYouTryingToAccessYourAccount": { + "message": "Are you trying to access your account?" }, - "logInAttemptBy": { - "message": "Login attempt by $EMAIL$", + "accessAttemptBy": { + "message": "Access attempt by $EMAIL$", "placeholders": { "email": { "content": "$1", @@ -2803,11 +2812,11 @@ "time": { "message": "Time" }, - "confirmLogIn": { - "message": "Confirm login" + "confirmAccess": { + "message": "Confirm access" }, - "denyLogIn": { - "message": "Deny login" + "denyAccess": { + "message": "Deny access" }, "logInConfirmedForEmailOnDevice": { "message": "Login confirmed for $EMAIL$ on $DEVICE$", @@ -2843,8 +2852,8 @@ "thisRequestIsNoLongerValid": { "message": "This request is no longer valid." }, - "confirmLoginAtemptForMail": { - "message": "Confirm login attempt for $EMAIL$", + "confirmAccessAttempt": { + "message": "Confirm access attempt for $EMAIL$", "placeholders": { "email": { "content": "$1", @@ -2855,6 +2864,9 @@ "logInRequested": { "message": "Log in requested" }, + "accountAccessRequested": { + "message": "Account access requested" + }, "creatingAccountOn": { "message": "Creating account on" }, @@ -3484,14 +3496,17 @@ "changeAcctEmail": { "message": "Change account email" }, - "organizationUpgradeRequired": { - "message": "Organization upgrade required" + "allowScreenshots": { + "message": "Allow screen capture" }, - "upgradeOrganization": { - "message": "Upgrade organization" + "allowScreenshotsDesc": { + "message": "Allow the Bitwarden desktop application to be captured in screenshots and viewed in remote desktop sessions. Disabling this will prevent access on some external displays." }, - "upgradeOrganizationDesc": { - "message": "This feature is not available for free organizations. Switch to a paid plan to unlock more features." + "confirmWindowStillVisibleTitle": { + "message": "Confirm window still visible" + }, + "confirmWindowStillVisibleContent": { + "message": "Please confirm that the window is still visible." }, "updateBrowserOrDisableFingerprintDialogTitle": { "message": "Extension update required" diff --git a/apps/desktop/src/locales/sr/messages.json b/apps/desktop/src/locales/sr/messages.json index 11d5f23ca12..5f4a3fa8c4d 100644 --- a/apps/desktop/src/locales/sr/messages.json +++ b/apps/desktop/src/locales/sr/messages.json @@ -2745,14 +2745,23 @@ "loginInitiated": { "message": "Пријава је покренута" }, + "logInRequestSent": { + "message": "Request sent" + }, "notificationSentDevice": { "message": "Обавештење је послато на ваш уређај." }, "aNotificationWasSentToYourDevice": { "message": "Обавештење је послато на ваш уређај" }, - "makeSureYourAccountIsUnlockedAndTheFingerprintEtc": { - "message": "Уверите се да је ваш налог откључан и да се фраза отиска подудара на другом уређају" + "notificationSentDevicePart1": { + "message": "Unlock Bitwarden on your device or on the " + }, + "notificationSentDeviceAnchor": { + "message": "web app" + }, + "notificationSentDevicePart2": { + "message": "Make sure the Fingerprint phrase matches the one below before approving." }, "needAnotherOptionV1": { "message": "Треба Вам друга опција?" @@ -2782,11 +2791,11 @@ "message": "Пребаци бројање слова", "description": "'Character count' describes a feature that displays a number next to each character of the password." }, - "areYouTryingtoLogin": { - "message": "Да ли покушавате да се пријавите?" + "areYouTryingToAccessYourAccount": { + "message": "Are you trying to access your account?" }, - "logInAttemptBy": { - "message": "Покушај пријаве од $EMAIL$", + "accessAttemptBy": { + "message": "Access attempt by $EMAIL$", "placeholders": { "email": { "content": "$1", @@ -2803,11 +2812,11 @@ "time": { "message": "Време" }, - "confirmLogIn": { - "message": "Потврди пријављивање" + "confirmAccess": { + "message": "Confirm access" }, - "denyLogIn": { - "message": "Одбиј пријављивање" + "denyAccess": { + "message": "Deny access" }, "logInConfirmedForEmailOnDevice": { "message": "Пријава потврђена за $EMAIL$ на $DEVICE$", @@ -2843,8 +2852,8 @@ "thisRequestIsNoLongerValid": { "message": "Овај захтев више не важи." }, - "confirmLoginAtemptForMail": { - "message": "Потврдити пријаву за $EMAIL$", + "confirmAccessAttempt": { + "message": "Confirm access attempt for $EMAIL$", "placeholders": { "email": { "content": "$1", @@ -2855,6 +2864,9 @@ "logInRequested": { "message": "Захтев пријаве" }, + "accountAccessRequested": { + "message": "Account access requested" + }, "creatingAccountOn": { "message": "Креирај налог на" }, @@ -3484,14 +3496,17 @@ "changeAcctEmail": { "message": "Променити имејл налога" }, - "organizationUpgradeRequired": { - "message": "Потребна је надоградња организације" + "allowScreenshots": { + "message": "Allow screen capture" }, - "upgradeOrganization": { - "message": "Надогради организацију" + "allowScreenshotsDesc": { + "message": "Allow the Bitwarden desktop application to be captured in screenshots and viewed in remote desktop sessions. Disabling this will prevent access on some external displays." }, - "upgradeOrganizationDesc": { - "message": "Ова функција није доступна за бесплатне организације. Пребаците се на плаћени пакет да бисте откључали више функција." + "confirmWindowStillVisibleTitle": { + "message": "Confirm window still visible" + }, + "confirmWindowStillVisibleContent": { + "message": "Please confirm that the window is still visible." }, "updateBrowserOrDisableFingerprintDialogTitle": { "message": "Неопходна надоградња додатка" diff --git a/apps/desktop/src/locales/sv/messages.json b/apps/desktop/src/locales/sv/messages.json index 4a146c05c1a..a7eee510c5c 100644 --- a/apps/desktop/src/locales/sv/messages.json +++ b/apps/desktop/src/locales/sv/messages.json @@ -2745,14 +2745,23 @@ "loginInitiated": { "message": "Inloggning påbörjad" }, + "logInRequestSent": { + "message": "Request sent" + }, "notificationSentDevice": { "message": "En avisering har skickats till din enhet." }, "aNotificationWasSentToYourDevice": { "message": "A notification was sent to your device" }, - "makeSureYourAccountIsUnlockedAndTheFingerprintEtc": { - "message": "Make sure your account is unlocked and the fingerprint phrase matches on the other device" + "notificationSentDevicePart1": { + "message": "Unlock Bitwarden on your device or on the " + }, + "notificationSentDeviceAnchor": { + "message": "web app" + }, + "notificationSentDevicePart2": { + "message": "Make sure the Fingerprint phrase matches the one below before approving." }, "needAnotherOptionV1": { "message": "Need another option?" @@ -2782,11 +2791,11 @@ "message": "Växla teckenantal", "description": "'Character count' describes a feature that displays a number next to each character of the password." }, - "areYouTryingtoLogin": { - "message": "Försöker du logga in?" + "areYouTryingToAccessYourAccount": { + "message": "Are you trying to access your account?" }, - "logInAttemptBy": { - "message": "Inloggningsförsök av $EMAIL$", + "accessAttemptBy": { + "message": "Access attempt by $EMAIL$", "placeholders": { "email": { "content": "$1", @@ -2803,11 +2812,11 @@ "time": { "message": "Tid" }, - "confirmLogIn": { - "message": "Bekräfta inloggning" + "confirmAccess": { + "message": "Confirm access" }, - "denyLogIn": { - "message": "Neka inloggning" + "denyAccess": { + "message": "Deny access" }, "logInConfirmedForEmailOnDevice": { "message": "Inloggning bekräftad för $EMAIL$ på $DEVICE$", @@ -2843,8 +2852,8 @@ "thisRequestIsNoLongerValid": { "message": "Denna begäran är inte längre giltig." }, - "confirmLoginAtemptForMail": { - "message": "Bekräfta inloggningsförsök för $EMAIL$", + "confirmAccessAttempt": { + "message": "Confirm access attempt for $EMAIL$", "placeholders": { "email": { "content": "$1", @@ -2855,6 +2864,9 @@ "logInRequested": { "message": "Inloggning begärd" }, + "accountAccessRequested": { + "message": "Account access requested" + }, "creatingAccountOn": { "message": "Skapa konto på" }, @@ -3484,14 +3496,17 @@ "changeAcctEmail": { "message": "Change account email" }, - "organizationUpgradeRequired": { - "message": "Organization upgrade required" + "allowScreenshots": { + "message": "Allow screen capture" }, - "upgradeOrganization": { - "message": "Upgrade organization" + "allowScreenshotsDesc": { + "message": "Allow the Bitwarden desktop application to be captured in screenshots and viewed in remote desktop sessions. Disabling this will prevent access on some external displays." }, - "upgradeOrganizationDesc": { - "message": "This feature is not available for free organizations. Switch to a paid plan to unlock more features." + "confirmWindowStillVisibleTitle": { + "message": "Confirm window still visible" + }, + "confirmWindowStillVisibleContent": { + "message": "Please confirm that the window is still visible." }, "updateBrowserOrDisableFingerprintDialogTitle": { "message": "Extension update required" diff --git a/apps/desktop/src/locales/te/messages.json b/apps/desktop/src/locales/te/messages.json index 354ca094a78..5bc1f216880 100644 --- a/apps/desktop/src/locales/te/messages.json +++ b/apps/desktop/src/locales/te/messages.json @@ -2745,14 +2745,23 @@ "loginInitiated": { "message": "Login initiated" }, + "logInRequestSent": { + "message": "Request sent" + }, "notificationSentDevice": { "message": "A notification has been sent to your device." }, "aNotificationWasSentToYourDevice": { "message": "A notification was sent to your device" }, - "makeSureYourAccountIsUnlockedAndTheFingerprintEtc": { - "message": "Make sure your account is unlocked and the fingerprint phrase matches on the other device" + "notificationSentDevicePart1": { + "message": "Unlock Bitwarden on your device or on the " + }, + "notificationSentDeviceAnchor": { + "message": "web app" + }, + "notificationSentDevicePart2": { + "message": "Make sure the Fingerprint phrase matches the one below before approving." }, "needAnotherOptionV1": { "message": "Need another option?" @@ -2782,11 +2791,11 @@ "message": "Toggle character count", "description": "'Character count' describes a feature that displays a number next to each character of the password." }, - "areYouTryingtoLogin": { - "message": "Are you trying to log in?" + "areYouTryingToAccessYourAccount": { + "message": "Are you trying to access your account?" }, - "logInAttemptBy": { - "message": "Login attempt by $EMAIL$", + "accessAttemptBy": { + "message": "Access attempt by $EMAIL$", "placeholders": { "email": { "content": "$1", @@ -2803,11 +2812,11 @@ "time": { "message": "Time" }, - "confirmLogIn": { - "message": "Confirm login" + "confirmAccess": { + "message": "Confirm access" }, - "denyLogIn": { - "message": "Deny login" + "denyAccess": { + "message": "Deny access" }, "logInConfirmedForEmailOnDevice": { "message": "Login confirmed for $EMAIL$ on $DEVICE$", @@ -2843,8 +2852,8 @@ "thisRequestIsNoLongerValid": { "message": "This request is no longer valid." }, - "confirmLoginAtemptForMail": { - "message": "Confirm login attempt for $EMAIL$", + "confirmAccessAttempt": { + "message": "Confirm access attempt for $EMAIL$", "placeholders": { "email": { "content": "$1", @@ -2855,6 +2864,9 @@ "logInRequested": { "message": "Log in requested" }, + "accountAccessRequested": { + "message": "Account access requested" + }, "creatingAccountOn": { "message": "Creating account on" }, @@ -3484,14 +3496,17 @@ "changeAcctEmail": { "message": "Change account email" }, - "organizationUpgradeRequired": { - "message": "Organization upgrade required" + "allowScreenshots": { + "message": "Allow screen capture" }, - "upgradeOrganization": { - "message": "Upgrade organization" + "allowScreenshotsDesc": { + "message": "Allow the Bitwarden desktop application to be captured in screenshots and viewed in remote desktop sessions. Disabling this will prevent access on some external displays." }, - "upgradeOrganizationDesc": { - "message": "This feature is not available for free organizations. Switch to a paid plan to unlock more features." + "confirmWindowStillVisibleTitle": { + "message": "Confirm window still visible" + }, + "confirmWindowStillVisibleContent": { + "message": "Please confirm that the window is still visible." }, "updateBrowserOrDisableFingerprintDialogTitle": { "message": "Extension update required" diff --git a/apps/desktop/src/locales/th/messages.json b/apps/desktop/src/locales/th/messages.json index deae9dca9cd..8cb62fbe7f9 100644 --- a/apps/desktop/src/locales/th/messages.json +++ b/apps/desktop/src/locales/th/messages.json @@ -2745,14 +2745,23 @@ "loginInitiated": { "message": "Login initiated" }, + "logInRequestSent": { + "message": "Request sent" + }, "notificationSentDevice": { "message": "A notification has been sent to your device." }, "aNotificationWasSentToYourDevice": { "message": "A notification was sent to your device" }, - "makeSureYourAccountIsUnlockedAndTheFingerprintEtc": { - "message": "Make sure your account is unlocked and the fingerprint phrase matches on the other device" + "notificationSentDevicePart1": { + "message": "Unlock Bitwarden on your device or on the " + }, + "notificationSentDeviceAnchor": { + "message": "web app" + }, + "notificationSentDevicePart2": { + "message": "Make sure the Fingerprint phrase matches the one below before approving." }, "needAnotherOptionV1": { "message": "Need another option?" @@ -2782,11 +2791,11 @@ "message": "Toggle character count", "description": "'Character count' describes a feature that displays a number next to each character of the password." }, - "areYouTryingtoLogin": { - "message": "Are you trying to log in?" + "areYouTryingToAccessYourAccount": { + "message": "Are you trying to access your account?" }, - "logInAttemptBy": { - "message": "Login attempt by $EMAIL$", + "accessAttemptBy": { + "message": "Access attempt by $EMAIL$", "placeholders": { "email": { "content": "$1", @@ -2803,11 +2812,11 @@ "time": { "message": "Time" }, - "confirmLogIn": { - "message": "Confirm login" + "confirmAccess": { + "message": "Confirm access" }, - "denyLogIn": { - "message": "Deny login" + "denyAccess": { + "message": "Deny access" }, "logInConfirmedForEmailOnDevice": { "message": "Login confirmed for $EMAIL$ on $DEVICE$", @@ -2843,8 +2852,8 @@ "thisRequestIsNoLongerValid": { "message": "This request is no longer valid." }, - "confirmLoginAtemptForMail": { - "message": "Confirm login attempt for $EMAIL$", + "confirmAccessAttempt": { + "message": "Confirm access attempt for $EMAIL$", "placeholders": { "email": { "content": "$1", @@ -2855,6 +2864,9 @@ "logInRequested": { "message": "Log in requested" }, + "accountAccessRequested": { + "message": "Account access requested" + }, "creatingAccountOn": { "message": "Creating account on" }, @@ -3484,14 +3496,17 @@ "changeAcctEmail": { "message": "Change account email" }, - "organizationUpgradeRequired": { - "message": "Organization upgrade required" + "allowScreenshots": { + "message": "Allow screen capture" }, - "upgradeOrganization": { - "message": "Upgrade organization" + "allowScreenshotsDesc": { + "message": "Allow the Bitwarden desktop application to be captured in screenshots and viewed in remote desktop sessions. Disabling this will prevent access on some external displays." }, - "upgradeOrganizationDesc": { - "message": "This feature is not available for free organizations. Switch to a paid plan to unlock more features." + "confirmWindowStillVisibleTitle": { + "message": "Confirm window still visible" + }, + "confirmWindowStillVisibleContent": { + "message": "Please confirm that the window is still visible." }, "updateBrowserOrDisableFingerprintDialogTitle": { "message": "Extension update required" diff --git a/apps/desktop/src/locales/tr/messages.json b/apps/desktop/src/locales/tr/messages.json index dd103096be6..9f73a16c52c 100644 --- a/apps/desktop/src/locales/tr/messages.json +++ b/apps/desktop/src/locales/tr/messages.json @@ -2745,14 +2745,23 @@ "loginInitiated": { "message": "Giriş başlatıldı" }, + "logInRequestSent": { + "message": "İstek gönderildi" + }, "notificationSentDevice": { "message": "Cihazınıza bir bildirim gönderildi." }, "aNotificationWasSentToYourDevice": { "message": "Cihazınıza bir bildirim gönderildi" }, - "makeSureYourAccountIsUnlockedAndTheFingerprintEtc": { - "message": "Lütfen hesabınızın kilidinin açık olduğundan ve parmak izi ifadesinin diğer cihazla eşleştiğinden emin olun" + "notificationSentDevicePart1": { + "message": "Bitwarden kilidini cihazınızdan veya " + }, + "notificationSentDeviceAnchor": { + "message": "web uygulamasından açın" + }, + "notificationSentDevicePart2": { + "message": "Onay vermeden önce parmak izi ifadesinin aşağıdakiyle eşleştiğini kontrol edin." }, "needAnotherOptionV1": { "message": "Başka bir seçeneğe mi ihtiyacınız var?" @@ -2782,11 +2791,11 @@ "message": "Karakter sayacını aç/kapat", "description": "'Character count' describes a feature that displays a number next to each character of the password." }, - "areYouTryingtoLogin": { - "message": "Giriş yapmaya mı çalışıyorsunuz?" + "areYouTryingToAccessYourAccount": { + "message": "Hesabınıza erişmeye mi çalışıyorsunuz?" }, - "logInAttemptBy": { - "message": "$EMAIL$ giriş denemesi", + "accessAttemptBy": { + "message": "$EMAIL$ erişim denemesi", "placeholders": { "email": { "content": "$1", @@ -2803,11 +2812,11 @@ "time": { "message": "Saat" }, - "confirmLogIn": { - "message": "Girişi onayla" + "confirmAccess": { + "message": "Erişimi onayla" }, - "denyLogIn": { - "message": "Girişi reddet" + "denyAccess": { + "message": "Erişimi reddet" }, "logInConfirmedForEmailOnDevice": { "message": "$DEVICE$ cihazında $EMAIL$ girişi onaylandı", @@ -2843,8 +2852,8 @@ "thisRequestIsNoLongerValid": { "message": "Bu istek artık geçerli değil." }, - "confirmLoginAtemptForMail": { - "message": "$EMAIL$ giriş isteğini onayla", + "confirmAccessAttempt": { + "message": "$EMAIL$ erişimini onayla", "placeholders": { "email": { "content": "$1", @@ -2855,6 +2864,9 @@ "logInRequested": { "message": "Giriş istendi" }, + "accountAccessRequested": { + "message": "Hesap erişimi istendi" + }, "creatingAccountOn": { "message": "Hesap oluşturuluyor:" }, @@ -3484,14 +3496,17 @@ "changeAcctEmail": { "message": "Hesap e-postasını değiştir" }, - "organizationUpgradeRequired": { - "message": "Organization upgrade required" + "allowScreenshots": { + "message": "Ekran kaydına izin ver" }, - "upgradeOrganization": { - "message": "Upgrade organization" + "allowScreenshotsDesc": { + "message": "Allow the Bitwarden desktop application to be captured in screenshots and viewed in remote desktop sessions. Disabling this will prevent access on some external displays." }, - "upgradeOrganizationDesc": { - "message": "This feature is not available for free organizations. Switch to a paid plan to unlock more features." + "confirmWindowStillVisibleTitle": { + "message": "Confirm window still visible" + }, + "confirmWindowStillVisibleContent": { + "message": "Please confirm that the window is still visible." }, "updateBrowserOrDisableFingerprintDialogTitle": { "message": "Uzantıyı güncellemeniz gerekiyor" diff --git a/apps/desktop/src/locales/uk/messages.json b/apps/desktop/src/locales/uk/messages.json index c21b86e2fd4..445185142b8 100644 --- a/apps/desktop/src/locales/uk/messages.json +++ b/apps/desktop/src/locales/uk/messages.json @@ -1204,7 +1204,7 @@ "message": "Показувати піктограми вебсайтів" }, "faviconDesc": { - "message": "Показувати впізнаване зображення біля кожного запису." + "message": "Показувати зображення біля кожного запису." }, "enableMinToTray": { "message": "Згортати до системного лотка" @@ -2551,7 +2551,7 @@ "message": "Використовуйте свою скриньку вхідних Catch-All власного домену." }, "useThisEmail": { - "message": "Use this email" + "message": "Використати цю е-пошту" }, "random": { "message": "Випадково" @@ -2745,14 +2745,23 @@ "loginInitiated": { "message": "Ініційовано вхід" }, + "logInRequestSent": { + "message": "Запит надіслано" + }, "notificationSentDevice": { "message": "Сповіщення було надіслано на ваш пристрій." }, "aNotificationWasSentToYourDevice": { "message": "Сповіщення надіслано на ваш пристрій" }, - "makeSureYourAccountIsUnlockedAndTheFingerprintEtc": { - "message": "Переконайтеся, що ваш обліковий запис розблоковано і фраза відбитка на іншому пристрої збігається" + "notificationSentDevicePart1": { + "message": "Розблокуйте Bitwarden на своєму пристрої або у " + }, + "notificationSentDeviceAnchor": { + "message": "вебпрограмі" + }, + "notificationSentDevicePart2": { + "message": "Перш ніж підтверджувати, обов'язково перевірте відповідність зазначеної нижче фрази відбитка." }, "needAnotherOptionV1": { "message": "Потрібен інший варіант?" @@ -2782,11 +2791,11 @@ "message": "Перемкнути лічильник символів", "description": "'Character count' describes a feature that displays a number next to each character of the password." }, - "areYouTryingtoLogin": { - "message": "Ви намагаєтесь увійти?" + "areYouTryingToAccessYourAccount": { + "message": "Ви намагаєтесь отримати доступ до свого облікового запису?" }, - "logInAttemptBy": { - "message": "Спроба входу з $EMAIL$", + "accessAttemptBy": { + "message": "Спроба доступу з $EMAIL$", "placeholders": { "email": { "content": "$1", @@ -2803,11 +2812,11 @@ "time": { "message": "Час" }, - "confirmLogIn": { - "message": "Підтвердити вхід" + "confirmAccess": { + "message": "Підтвердити доступ" }, - "denyLogIn": { - "message": "Заборонити вхід" + "denyAccess": { + "message": "Заборонити доступ" }, "logInConfirmedForEmailOnDevice": { "message": "Підтверджено вхід для $EMAIL$ на $DEVICE$", @@ -2843,8 +2852,8 @@ "thisRequestIsNoLongerValid": { "message": "Цей запит більше недійсний." }, - "confirmLoginAtemptForMail": { - "message": "Підтвердити спробу входу для $EMAIL$", + "confirmAccessAttempt": { + "message": "Підтвердити спробу доступу для $EMAIL$", "placeholders": { "email": { "content": "$1", @@ -2855,6 +2864,9 @@ "logInRequested": { "message": "Виконано запит входу" }, + "accountAccessRequested": { + "message": "Запитано доступ до облікового запису" + }, "creatingAccountOn": { "message": "Створення облікового запису" }, @@ -3484,14 +3496,17 @@ "changeAcctEmail": { "message": "Змінити адресу е-пошти" }, - "organizationUpgradeRequired": { - "message": "Необхідне оновлення організації" + "allowScreenshots": { + "message": "Дозволити захоплення екрана" }, - "upgradeOrganization": { - "message": "Підвищити рівень організації" + "allowScreenshotsDesc": { + "message": "Дозволити захоплення екрана і перегляд у віддаленому доступі комп'ютерної програми Bitwarden. Вимкнення цього параметра запобігає доступу на деяких зовнішніх дисплеях." }, - "upgradeOrganizationDesc": { - "message": "Ця функція недоступна для безплатних організацій. Передплатіть тарифний план, щоб розблокувати додаткові можливості." + "confirmWindowStillVisibleTitle": { + "message": "Вікно підтвердження все ще видиме" + }, + "confirmWindowStillVisibleContent": { + "message": "Підтвердьте, що вікно все ще видиме." }, "updateBrowserOrDisableFingerprintDialogTitle": { "message": "Необхідно оновити розширення" diff --git a/apps/desktop/src/locales/vi/messages.json b/apps/desktop/src/locales/vi/messages.json index 54aa44f0c73..0f799871dfd 100644 --- a/apps/desktop/src/locales/vi/messages.json +++ b/apps/desktop/src/locales/vi/messages.json @@ -2745,14 +2745,23 @@ "loginInitiated": { "message": "Bắt đầu đăng nhập" }, + "logInRequestSent": { + "message": "Request sent" + }, "notificationSentDevice": { "message": "Một thông báo đã được gửi đến thiết bị của bạn." }, "aNotificationWasSentToYourDevice": { "message": "A notification was sent to your device" }, - "makeSureYourAccountIsUnlockedAndTheFingerprintEtc": { - "message": "Make sure your account is unlocked and the fingerprint phrase matches on the other device" + "notificationSentDevicePart1": { + "message": "Unlock Bitwarden on your device or on the " + }, + "notificationSentDeviceAnchor": { + "message": "web app" + }, + "notificationSentDevicePart2": { + "message": "Make sure the Fingerprint phrase matches the one below before approving." }, "needAnotherOptionV1": { "message": "Need another option?" @@ -2782,11 +2791,11 @@ "message": "Bật tắt đếm kí tự", "description": "'Character count' describes a feature that displays a number next to each character of the password." }, - "areYouTryingtoLogin": { - "message": "Bạn đang cố đăng nhập?" + "areYouTryingToAccessYourAccount": { + "message": "Are you trying to access your account?" }, - "logInAttemptBy": { - "message": "Nỗ lực đăng nhập bằng $EMAIL$", + "accessAttemptBy": { + "message": "Access attempt by $EMAIL$", "placeholders": { "email": { "content": "$1", @@ -2803,11 +2812,11 @@ "time": { "message": "Thời Gian" }, - "confirmLogIn": { - "message": "Xác nhận đăng nhập" + "confirmAccess": { + "message": "Confirm access" }, - "denyLogIn": { - "message": "Từ chối đăng nhập" + "denyAccess": { + "message": "Deny access" }, "logInConfirmedForEmailOnDevice": { "message": "Đã xác nhận đăng nhập cho $EMAIL$ trên $DEVICE$", @@ -2843,8 +2852,8 @@ "thisRequestIsNoLongerValid": { "message": "Yêu cầu này không còn hiệu lực." }, - "confirmLoginAtemptForMail": { - "message": "Phê duyệt đăng nhập cho $EMAIL$", + "confirmAccessAttempt": { + "message": "Confirm access attempt for $EMAIL$", "placeholders": { "email": { "content": "$1", @@ -2855,6 +2864,9 @@ "logInRequested": { "message": "Yêu cầu đăng nhập" }, + "accountAccessRequested": { + "message": "Account access requested" + }, "creatingAccountOn": { "message": "Đang tạo tài khoản trên" }, @@ -3484,14 +3496,17 @@ "changeAcctEmail": { "message": "Change account email" }, - "organizationUpgradeRequired": { - "message": "Organization upgrade required" + "allowScreenshots": { + "message": "Allow screen capture" }, - "upgradeOrganization": { - "message": "Upgrade organization" + "allowScreenshotsDesc": { + "message": "Allow the Bitwarden desktop application to be captured in screenshots and viewed in remote desktop sessions. Disabling this will prevent access on some external displays." }, - "upgradeOrganizationDesc": { - "message": "This feature is not available for free organizations. Switch to a paid plan to unlock more features." + "confirmWindowStillVisibleTitle": { + "message": "Confirm window still visible" + }, + "confirmWindowStillVisibleContent": { + "message": "Please confirm that the window is still visible." }, "updateBrowserOrDisableFingerprintDialogTitle": { "message": "Extension update required" diff --git a/apps/desktop/src/locales/zh_CN/messages.json b/apps/desktop/src/locales/zh_CN/messages.json index 36e08c99ccf..21d3dd4284f 100644 --- a/apps/desktop/src/locales/zh_CN/messages.json +++ b/apps/desktop/src/locales/zh_CN/messages.json @@ -1907,7 +1907,7 @@ "description": "Used as a card title description on the set password page to explain why the user is there" }, "cardMetrics": { - "message": "$TOTAL$ 不足", + "message": "总计 $TOTAL$", "placeholders": { "total": { "content": "$1", @@ -2016,7 +2016,7 @@ "message": "很遗憾,目前仅 Mac App Store 版本支持浏览器集成。" }, "browserIntegrationWindowsStoreDesc": { - "message": "很遗憾,Microsoft Store 版本目前不支持浏览器整合。" + "message": "很遗憾,Microsoft Store 版本目前不支持浏览器集成。" }, "browserIntegrationLinuxDesc": { "message": "很遗憾,Linux 版本目前不支持浏览器集成。" @@ -2239,7 +2239,7 @@ "message": "已过期" }, "pendingDeletion": { - "message": "等待删除" + "message": "待删除" }, "webAuthnAuthenticate": { "message": "验证 WebAuthn" @@ -2551,7 +2551,7 @@ "message": "使用您的域名配置的 Catch-all 收件箱。" }, "useThisEmail": { - "message": "Use this email" + "message": "使用此电子邮箱" }, "random": { "message": "随机" @@ -2745,14 +2745,23 @@ "loginInitiated": { "message": "登录已发起" }, + "logInRequestSent": { + "message": "请求已发送" + }, "notificationSentDevice": { "message": "通知已发送到您的设备。" }, "aNotificationWasSentToYourDevice": { "message": "通知已发送到您的设备" }, - "makeSureYourAccountIsUnlockedAndTheFingerprintEtc": { - "message": "确保您的账户已解锁,并且指纹短语与其他设备上的相匹配。" + "notificationSentDevicePart1": { + "message": "Unlock Bitwarden on your device or on the " + }, + "notificationSentDeviceAnchor": { + "message": "网页 App" + }, + "notificationSentDevicePart2": { + "message": "在批准前,请确保指纹短语与下面的相匹配。" }, "needAnotherOptionV1": { "message": "需要其他选项吗?" @@ -2782,11 +2791,11 @@ "message": "字符计数开关", "description": "'Character count' describes a feature that displays a number next to each character of the password." }, - "areYouTryingtoLogin": { - "message": "您正在尝试登录吗?" + "areYouTryingToAccessYourAccount": { + "message": "您正在尝试访问您的账户吗?" }, - "logInAttemptBy": { - "message": "$EMAIL$ 的登录尝试", + "accessAttemptBy": { + "message": "$EMAIL$ 的访问尝试", "placeholders": { "email": { "content": "$1", @@ -2803,11 +2812,11 @@ "time": { "message": "时间" }, - "confirmLogIn": { - "message": "确认登录" + "confirmAccess": { + "message": "确认访问" }, - "denyLogIn": { - "message": "拒绝登录" + "denyAccess": { + "message": "拒绝访问" }, "logInConfirmedForEmailOnDevice": { "message": "已确认 $EMAIL$ 在 $DEVICE$ 上的登录", @@ -2843,8 +2852,8 @@ "thisRequestIsNoLongerValid": { "message": "此请求已失效。" }, - "confirmLoginAtemptForMail": { - "message": "确认 $EMAIL$ 的登录尝试", + "confirmAccessAttempt": { + "message": "确认 $EMAIL$ 的访问尝试", "placeholders": { "email": { "content": "$1", @@ -2855,6 +2864,9 @@ "logInRequested": { "message": "已请求登录" }, + "accountAccessRequested": { + "message": "已请求账户访问" + }, "creatingAccountOn": { "message": "创建账户至" }, @@ -3484,14 +3496,17 @@ "changeAcctEmail": { "message": "更改账户电子邮箱" }, - "organizationUpgradeRequired": { - "message": "需要升级组织" + "allowScreenshots": { + "message": "允许屏幕截图" }, - "upgradeOrganization": { - "message": "升级组织" + "allowScreenshotsDesc": { + "message": "允许捕获 Bitwarden 桌面应用程序屏幕截图并在远程桌面会话中查看。禁用后将阻止在某些外部显示器上访问。" }, - "upgradeOrganizationDesc": { - "message": "此功能不适用于免费组织。请切换到付费计划以解锁更多功能。" + "confirmWindowStillVisibleTitle": { + "message": "确认窗口仍然可见" + }, + "confirmWindowStillVisibleContent": { + "message": "请确认窗口仍然可见。" }, "updateBrowserOrDisableFingerprintDialogTitle": { "message": "扩展需要更新" diff --git a/apps/desktop/src/locales/zh_TW/messages.json b/apps/desktop/src/locales/zh_TW/messages.json index 874f0a27a67..86ddf5f707e 100644 --- a/apps/desktop/src/locales/zh_TW/messages.json +++ b/apps/desktop/src/locales/zh_TW/messages.json @@ -2745,14 +2745,23 @@ "loginInitiated": { "message": "登入已啟動" }, + "logInRequestSent": { + "message": "Request sent" + }, "notificationSentDevice": { "message": "已傳送通知至您的裝置。" }, "aNotificationWasSentToYourDevice": { "message": "已傳送通知至您的裝置" }, - "makeSureYourAccountIsUnlockedAndTheFingerprintEtc": { - "message": "Make sure your account is unlocked and the fingerprint phrase matches on the other device" + "notificationSentDevicePart1": { + "message": "Unlock Bitwarden on your device or on the " + }, + "notificationSentDeviceAnchor": { + "message": "web app" + }, + "notificationSentDevicePart2": { + "message": "Make sure the Fingerprint phrase matches the one below before approving." }, "needAnotherOptionV1": { "message": "需要另一個選項嗎?" @@ -2782,11 +2791,11 @@ "message": "切換字元計數", "description": "'Character count' describes a feature that displays a number next to each character of the password." }, - "areYouTryingtoLogin": { - "message": "您正在嘗試登入嗎?" + "areYouTryingToAccessYourAccount": { + "message": "Are you trying to access your account?" }, - "logInAttemptBy": { - "message": "來自 $EMAIL$ 的登入嘗試", + "accessAttemptBy": { + "message": "Access attempt by $EMAIL$", "placeholders": { "email": { "content": "$1", @@ -2803,11 +2812,11 @@ "time": { "message": "時間" }, - "confirmLogIn": { - "message": "確認登入" + "confirmAccess": { + "message": "Confirm access" }, - "denyLogIn": { - "message": "拒絕登入" + "denyAccess": { + "message": "Deny access" }, "logInConfirmedForEmailOnDevice": { "message": "已確認 $EMAIL$ 在 $DEVICE$ 上的登入", @@ -2843,8 +2852,8 @@ "thisRequestIsNoLongerValid": { "message": "此請求已失效。" }, - "confirmLoginAtemptForMail": { - "message": "確認 $EMAIL$ 的登入嘗試", + "confirmAccessAttempt": { + "message": "Confirm access attempt for $EMAIL$", "placeholders": { "email": { "content": "$1", @@ -2855,6 +2864,9 @@ "logInRequested": { "message": "已要求登入" }, + "accountAccessRequested": { + "message": "Account access requested" + }, "creatingAccountOn": { "message": "Creating account on" }, @@ -3484,14 +3496,17 @@ "changeAcctEmail": { "message": "更改帳號電子郵件位址" }, - "organizationUpgradeRequired": { - "message": "Organization upgrade required" + "allowScreenshots": { + "message": "Allow screen capture" }, - "upgradeOrganization": { - "message": "Upgrade organization" + "allowScreenshotsDesc": { + "message": "Allow the Bitwarden desktop application to be captured in screenshots and viewed in remote desktop sessions. Disabling this will prevent access on some external displays." }, - "upgradeOrganizationDesc": { - "message": "This feature is not available for free organizations. Switch to a paid plan to unlock more features." + "confirmWindowStillVisibleTitle": { + "message": "Confirm window still visible" + }, + "confirmWindowStillVisibleContent": { + "message": "Please confirm that the window is still visible." }, "updateBrowserOrDisableFingerprintDialogTitle": { "message": "Extension update required" diff --git a/apps/desktop/src/main/window.main.ts b/apps/desktop/src/main/window.main.ts index 8fe17772072..e05ce100675 100644 --- a/apps/desktop/src/main/window.main.ts +++ b/apps/desktop/src/main/window.main.ts @@ -76,6 +76,13 @@ export class WindowMain { } }); + this.desktopSettingsService.preventScreenshots$.subscribe((prevent) => { + if (this.win == null) { + return; + } + this.win.setContentProtection(prevent); + }); + return new Promise((resolve, reject) => { try { if (!isMacAppStore()) { @@ -277,6 +284,14 @@ export class WindowMain { }); }); + firstValueFrom(this.desktopSettingsService.preventScreenshots$) + .then((preventScreenshots) => { + this.win.setContentProtection(preventScreenshots); + }) + .catch((e) => { + this.logService.error(e); + }); + if (this.createWindowCallback) { this.createWindowCallback(this.win); } diff --git a/apps/desktop/src/package-lock.json b/apps/desktop/src/package-lock.json index 4d4b1572b5c..bd54446f4e4 100644 --- a/apps/desktop/src/package-lock.json +++ b/apps/desktop/src/package-lock.json @@ -1,12 +1,12 @@ { "name": "@bitwarden/desktop", - "version": "2025.2.0", + "version": "2025.2.2", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@bitwarden/desktop", - "version": "2025.2.0", + "version": "2025.2.2", "license": "GPL-3.0", "dependencies": { "@bitwarden/desktop-napi": "file:../desktop_native/napi" diff --git a/apps/desktop/src/package.json b/apps/desktop/src/package.json index 91dd860e9f9..3c504913522 100644 --- a/apps/desktop/src/package.json +++ b/apps/desktop/src/package.json @@ -2,7 +2,7 @@ "name": "@bitwarden/desktop", "productName": "Bitwarden", "description": "A secure and free password manager for all of your devices.", - "version": "2025.2.0", + "version": "2025.2.2", "author": "Bitwarden Inc. (https://bitwarden.com)", "homepage": "https://bitwarden.com", "license": "GPL-3.0", diff --git a/apps/desktop/src/platform/services/desktop-settings.service.ts b/apps/desktop/src/platform/services/desktop-settings.service.ts index c698e7d5b1b..f0d5d124de2 100644 --- a/apps/desktop/src/platform/services/desktop-settings.service.ts +++ b/apps/desktop/src/platform/services/desktop-settings.service.ts @@ -75,6 +75,14 @@ const MINIMIZE_ON_COPY = new UserKeyDefinition(DESKTOP_SETTINGS_DISK, " clearOn: [], // User setting, no need to clear }); +const PREVENT_SCREENSHOTS = new KeyDefinition( + DESKTOP_SETTINGS_DISK, + "preventScreenshots", + { + deserializer: (b) => b, + }, +); + /** * Various settings for controlling application behavior specific to the desktop client. */ @@ -147,6 +155,13 @@ export class DesktopSettingsService { sshAgentEnabled$ = this.sshAgentEnabledState.state$.pipe(map(Boolean)); + private readonly preventScreenshotState = this.stateProvider.getGlobal(PREVENT_SCREENSHOTS); + + /** + * The application setting for whether or not to allow screenshots of the app. + */ + preventScreenshots$ = this.preventScreenshotState.state$.pipe(map(Boolean)); + private readonly minimizeOnCopyState = this.stateProvider.getActive(MINIMIZE_ON_COPY); /** @@ -270,4 +285,12 @@ export class DesktopSettingsService { async setMinimizeOnCopy(value: boolean, userId: UserId) { await this.stateProvider.getUser(userId, MINIMIZE_ON_COPY).update(() => value); } + + /** + * Sets the setting for whether or not the screenshot protection is enabled. + * @param value `true` if the screenshot protection is enabled, `false` if it is not. + */ + async setPreventScreenshots(value: boolean) { + await this.preventScreenshotState.update(() => value); + } } diff --git a/apps/desktop/src/platform/services/ssh-agent.service.ts b/apps/desktop/src/platform/services/ssh-agent.service.ts index d4c7c5f460e..31b615dd365 100644 --- a/apps/desktop/src/platform/services/ssh-agent.service.ts +++ b/apps/desktop/src/platform/services/ssh-agent.service.ts @@ -29,6 +29,7 @@ import { ConfigService } from "@bitwarden/common/platform/abstractions/config/co import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; import { LogService } from "@bitwarden/common/platform/abstractions/log.service"; import { CommandDefinition, MessageListener } from "@bitwarden/common/platform/messaging"; +import { UserId } from "@bitwarden/common/types/guid"; import { CipherService } from "@bitwarden/common/vault/abstractions/cipher.service"; import { CipherType } from "@bitwarden/common/vault/enums"; import { DialogService, ToastService } from "@bitwarden/components"; @@ -92,14 +93,14 @@ export class SshAgentService implements OnDestroy { }), filter(({ enabled }) => enabled), map(({ message }) => message), - withLatestFrom(this.authService.activeAccountStatus$), + withLatestFrom(this.authService.activeAccountStatus$, this.accountService.activeAccount$), // This switchMap handles unlocking the vault if it is locked: // - If the vault is locked, we will wait for it to be unlocked. // - If the vault is not unlocked within the timeout, we will abort the flow. // - If the vault is unlocked, we will continue with the flow. // switchMap is used here to prevent multiple requests from being processed at the same time, // and will cancel the previous request if a new one is received. - switchMap(([message, status]) => { + switchMap(([message, status, account]) => { if (status !== AuthenticationStatus.Unlocked) { ipc.platform.focusWindow(); this.toastService.showToast({ @@ -133,11 +134,11 @@ export class SshAgentService implements OnDestroy { ); } - return of(message); + return of([message, account.id]); }), // This switchMap handles fetching the ciphers from the vault. - switchMap((message) => - from(this.cipherService.getAllDecrypted()).pipe( + switchMap(([message, userId]: [Record, UserId]) => + from(this.cipherService.getAllDecrypted(userId)).pipe( map((ciphers) => [message, ciphers] as const), ), ), @@ -245,7 +246,7 @@ export class SshAgentService implements OnDestroy { return; } - const ciphers = await this.cipherService.getAllDecrypted(); + const ciphers = await this.cipherService.getAllDecrypted(activeAccount.id); if (ciphers == null) { await ipc.platform.sshAgent.lock(); return; diff --git a/apps/desktop/src/services/biometric-message-handler.service.spec.ts b/apps/desktop/src/services/biometric-message-handler.service.spec.ts index 7c16f766607..cc82c165219 100644 --- a/apps/desktop/src/services/biometric-message-handler.service.spec.ts +++ b/apps/desktop/src/services/biometric-message-handler.service.spec.ts @@ -2,7 +2,7 @@ import { NgZone } from "@angular/core"; import { mock, MockProxy } from "jest-mock-extended"; import { of } from "rxjs"; -import { AccountService } from "@bitwarden/common/auth/abstractions/account.service"; +import { AccountInfo, 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 { EncryptService } from "@bitwarden/common/key-management/crypto/abstractions/encrypt.service"; @@ -27,7 +27,7 @@ import { BiometricMessageHandlerService } from "./biometric-message-handler.serv const SomeUser = "SomeUser" as UserId; const AnotherUser = "SomeOtherUser" as UserId; -const accounts = { +const accounts: Record = { [SomeUser]: { name: "some user", email: "some.user@example.com", @@ -108,6 +108,30 @@ describe("BiometricMessageHandlerService", () => { }); describe("setup encryption", () => { + it("should ignore when public key missing in message", async () => { + await service.handleMessage({ + appId: "appId", + message: { + command: "setupEncryption", + messageId: 0, + userId: "unknownUser" as UserId, + }, + }); + expect((global as any).ipc.platform.nativeMessaging.sendMessage).not.toHaveBeenCalled(); + }); + + it("should ignore when user id missing in message", async () => { + await service.handleMessage({ + appId: "appId", + message: { + command: "setupEncryption", + messageId: 0, + publicKey: Utils.fromUtf8ToB64("publicKey"), + }, + }); + expect((global as any).ipc.platform.nativeMessaging.sendMessage).not.toHaveBeenCalled(); + }); + it("should reject when user is not in app", async () => { await service.handleMessage({ appId: "appId", @@ -115,6 +139,7 @@ describe("BiometricMessageHandlerService", () => { command: "setupEncryption", messageId: 0, userId: "unknownUser" as UserId, + publicKey: Utils.fromUtf8ToB64("publicKey"), }, }); expect((global as any).ipc.platform.nativeMessaging.sendMessage).toHaveBeenCalledWith({ @@ -362,12 +387,15 @@ describe("BiometricMessageHandlerService", () => { // always reload when another user is active than the requested one [SomeUser, AuthenticationStatus.Unlocked, AnotherUser, false, true], [SomeUser, AuthenticationStatus.Locked, AnotherUser, false, true], + // don't reload when no active user + [null, AuthenticationStatus.Unlocked, AnotherUser, false, false], // don't reload in dev mode [SomeUser, AuthenticationStatus.Unlocked, SomeUser, true, false], [SomeUser, AuthenticationStatus.Locked, SomeUser, true, false], [SomeUser, AuthenticationStatus.Unlocked, AnotherUser, true, false], [SomeUser, AuthenticationStatus.Locked, AnotherUser, true, false], + [null, AuthenticationStatus.Unlocked, AnotherUser, true, false], ]; it.each(testCases)( diff --git a/apps/desktop/src/services/biometric-message-handler.service.ts b/apps/desktop/src/services/biometric-message-handler.service.ts index ea31d068b4e..7f4adce29d9 100644 --- a/apps/desktop/src/services/biometric-message-handler.service.ts +++ b/apps/desktop/src/services/biometric-message-handler.service.ts @@ -1,5 +1,3 @@ -// FIXME: Update this file to be type safe and remove this and next line -// @ts-strict-ignore import { Injectable, NgZone } from "@angular/core"; import { combineLatest, concatMap, firstValueFrom, map } from "rxjs"; @@ -25,8 +23,7 @@ import { } from "@bitwarden/key-management"; import { BrowserSyncVerificationDialogComponent } from "../app/components/browser-sync-verification-dialog.component"; -import { LegacyMessage } from "../models/native-messaging/legacy-message"; -import { LegacyMessageWrapper } from "../models/native-messaging/legacy-message-wrapper"; +import { LegacyMessage, LegacyMessageWrapper } from "../models/native-messaging"; import { DesktopSettingsService } from "../platform/services/desktop-settings.service"; const MessageValidTimeout = 10 * 1000; @@ -34,14 +31,14 @@ const HashAlgorithmForAsymmetricEncryption = "sha1"; type ConnectedApp = { publicKey: string; - sessionSecret: string; + sessionSecret: string | null; trusted: boolean; }; const ConnectedAppPrefix = "connectedApp_"; class ConnectedApps { - async get(appId: string): Promise { + async get(appId: string): Promise { if (!(await this.has(appId))) { return null; } @@ -112,6 +109,12 @@ export class BiometricMessageHandlerService { // Request to setup secure encryption if ("command" in rawMessage && rawMessage.command === "setupEncryption") { + if (rawMessage.publicKey == null || rawMessage.userId == null) { + this.logService.warning( + "[Native Messaging IPC] Received invalid setupEncryption message. Ignoring.", + ); + return; + } const remotePublicKey = Utils.fromB64ToArray(rawMessage.publicKey); // Validate the UserId to ensure we are logged into the same account. @@ -134,16 +137,18 @@ export class BiometricMessageHandlerService { ); } - await this.connectedApps.set(appId, { + const connectedApp = { publicKey: Utils.fromBufferToB64(remotePublicKey), sessionSecret: null, trusted: false, - }); - await this.secureCommunication(remotePublicKey, appId); + } as ConnectedApp; + await this.connectedApps.set(appId, connectedApp); + await this.secureCommunication(connectedApp, remotePublicKey, appId); return; } - if ((await this.connectedApps.get(appId))?.sessionSecret == null) { + const sessionSecret = (await this.connectedApps.get(appId))?.sessionSecret; + if (sessionSecret == null) { this.logService.info( "[Native Messaging IPC] Session secret for secure channel is missing. Invalidating encryption...", ); @@ -157,7 +162,7 @@ export class BiometricMessageHandlerService { const message: LegacyMessage = JSON.parse( await this.encryptService.decryptToUtf8( rawMessage as EncString, - SymmetricCryptoKey.fromString((await this.connectedApps.get(appId)).sessionSecret), + SymmetricCryptoKey.fromString(sessionSecret), ), ); @@ -173,7 +178,10 @@ export class BiometricMessageHandlerService { return; } - if (Math.abs(message.timestamp - Date.now()) > MessageValidTimeout) { + if ( + message.timestamp == null || + Math.abs(message.timestamp - Date.now()) > MessageValidTimeout + ) { this.logService.info("[Native Messaging IPC] Received a too old message. Ignoring."); return; } @@ -277,11 +285,11 @@ export class BiometricMessageHandlerService { return this.send({ command: "biometricUnlock", response: "not unlocked" }, appId); } - const biometricUnlockPromise = + const biometricUnlock = message.userId == null - ? firstValueFrom(this.biometricStateService.biometricUnlockEnabled$) - : this.biometricStateService.getBiometricUnlockEnabled(message.userId as UserId); - if (!(await biometricUnlockPromise)) { + ? await firstValueFrom(this.biometricStateService.biometricUnlockEnabled$) + : await this.biometricStateService.getBiometricUnlockEnabled(message.userId as UserId); + if (!biometricUnlock) { await this.send({ command: "biometricUnlock", response: "not enabled" }, appId); return this.ngZone.run(() => @@ -310,13 +318,13 @@ export class BiometricMessageHandlerService { const currentlyActiveAccountId = ( await firstValueFrom(this.accountService.activeAccount$) - ).id; + )?.id; const isCurrentlyActiveAccountUnlocked = (await this.authService.getAuthStatus(userId)) == AuthenticationStatus.Unlocked; // prevent proc reloading an active account, when it is the same as the browser if (currentlyActiveAccountId != message.userId || !isCurrentlyActiveAccountUnlocked) { - await ipc.platform.reloadProcess(); + ipc.platform.reloadProcess(); } } else { await this.send({ command: "biometricUnlock", response: "canceled" }, appId); @@ -337,9 +345,14 @@ export class BiometricMessageHandlerService { private async send(message: any, appId: string) { message.timestamp = Date.now(); + const sessionSecret = (await this.connectedApps.get(appId))?.sessionSecret; + if (sessionSecret == null) { + throw new Error("Session secret is missing"); + } + const encrypted = await this.encryptService.encrypt( JSON.stringify(message), - SymmetricCryptoKey.fromString((await this.connectedApps.get(appId)).sessionSecret), + SymmetricCryptoKey.fromString(sessionSecret), ); ipc.platform.nativeMessaging.sendMessage({ @@ -349,9 +362,13 @@ export class BiometricMessageHandlerService { }); } - private async secureCommunication(remotePublicKey: Uint8Array, appId: string) { + private async secureCommunication( + connectedApp: ConnectedApp, + remotePublicKey: Uint8Array, + appId: string, + ) { const secret = await this.cryptoFunctionService.randomBytes(64); - const connectedApp = await this.connectedApps.get(appId); + connectedApp.sessionSecret = new SymmetricCryptoKey(secret).keyB64; await this.connectedApps.set(appId, connectedApp); @@ -421,11 +438,15 @@ export class BiometricMessageHandlerService { } } - /** A process reload after a biometric unlock should happen if the userkey that was used for biometric unlock is for a different user than the + /** + * A process reload after a biometric unlock should happen if the userkey that was used for biometric unlock is for a different user than the * currently active account. The userkey for the active account was in memory anyways. Further, if the desktop app is locked, a reload should occur (since the userkey was not already in memory). */ async processReloadWhenRequired(messageUserId: UserId) { - const currentlyActiveAccountId = (await firstValueFrom(this.accountService.activeAccount$)).id; + const currentlyActiveAccountId = (await firstValueFrom(this.accountService.activeAccount$))?.id; + if (currentlyActiveAccountId == null) { + return; + } const isCurrentlyActiveAccountUnlocked = (await firstValueFrom(this.authService.authStatusFor$(currentlyActiveAccountId))) == AuthenticationStatus.Unlocked; diff --git a/apps/desktop/src/services/encrypted-message-handler.service.ts b/apps/desktop/src/services/encrypted-message-handler.service.ts index 43c4b9065a7..a8a1e738644 100644 --- a/apps/desktop/src/services/encrypted-message-handler.service.ts +++ b/apps/desktop/src/services/encrypted-message-handler.service.ts @@ -1,12 +1,13 @@ // FIXME: Update this file to be type safe and remove this and next line // @ts-strict-ignore -import { firstValueFrom, map } from "rxjs"; +import { firstValueFrom } from "rxjs"; import { PolicyService } from "@bitwarden/common/admin-console/abstractions/policy/policy.service.abstraction"; import { PolicyType } from "@bitwarden/common/admin-console/enums"; import { AccountService } from "@bitwarden/common/auth/abstractions/account.service"; 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"; import { MessagingService } from "@bitwarden/common/platform/abstractions/messaging.service"; import { UserId } from "@bitwarden/common/types/guid"; import { CipherService } from "@bitwarden/common/vault/abstractions/cipher.service"; @@ -65,9 +66,7 @@ export class EncryptedMessageHandlerService { } private async checkUserStatus(userId: string): Promise { - const activeUserId = await firstValueFrom( - this.accountService.activeAccount$.pipe(map((a) => a?.id)), - ); + const activeUserId = await firstValueFrom(getUserId(this.accountService.activeAccount$)); if (userId !== activeUserId) { return "not-active-user"; @@ -83,9 +82,7 @@ export class EncryptedMessageHandlerService { private async statusCommandHandler(): Promise { const accounts = await firstValueFrom(this.accountService.accounts$); - const activeUserId = await firstValueFrom( - this.accountService.activeAccount$.pipe(map((a) => a?.id)), - ); + const activeUserId = await firstValueFrom(getUserId(this.accountService.activeAccount$)); if (!accounts || !Object.keys(accounts)) { return []; @@ -114,16 +111,14 @@ export class EncryptedMessageHandlerService { } const ciphersResponse: CipherResponse[] = []; - const activeUserId = await firstValueFrom( - this.accountService.activeAccount$.pipe(map((a) => a?.id)), - ); + const activeUserId = await firstValueFrom(getUserId(this.accountService.activeAccount$)); const authStatus = await this.authService.getAuthStatus(activeUserId); if (authStatus !== AuthenticationStatus.Unlocked) { return { error: "locked" }; } - const ciphers = await this.cipherService.getAllDecryptedForUrl(payload.uri); + const ciphers = await this.cipherService.getAllDecryptedForUrl(payload.uri, activeUserId); ciphers.sort((a, b) => this.cipherService.sortCiphersByLastUsedThenName(a, b)); ciphers.forEach((c) => { @@ -166,9 +161,7 @@ export class EncryptedMessageHandlerService { cipherView.login.uris[0].uri = credentialCreatePayload.uri; try { - const activeUserId = await firstValueFrom( - this.accountService.activeAccount$.pipe(map((a) => a?.id)), - ); + const activeUserId = await firstValueFrom(getUserId(this.accountService.activeAccount$)); const encrypted = await this.cipherService.encrypt(cipherView, activeUserId); await this.cipherService.createWithServer(encrypted); @@ -200,13 +193,16 @@ export class EncryptedMessageHandlerService { } try { - const cipher = await this.cipherService.get(credentialUpdatePayload.credentialId); + const activeUserId = await firstValueFrom(getUserId(this.accountService.activeAccount$)); + + const cipher = await this.cipherService.get( + credentialUpdatePayload.credentialId, + activeUserId, + ); if (cipher === null) { return { status: "failure" }; } - const activeUserId = await firstValueFrom( - this.accountService.activeAccount$.pipe(map((a) => a?.id)), - ); + const cipherView = await cipher.decrypt( await this.cipherService.getKeyForCipherKeyDecryption(cipher, activeUserId), ); diff --git a/apps/desktop/src/vault/app/vault/vault-items.component.ts b/apps/desktop/src/vault/app/vault/vault-items.component.ts index 348071729e8..5d7285e570b 100644 --- a/apps/desktop/src/vault/app/vault/vault-items.component.ts +++ b/apps/desktop/src/vault/app/vault/vault-items.component.ts @@ -5,6 +5,7 @@ import { distinctUntilChanged } from "rxjs"; import { VaultItemsComponent as BaseVaultItemsComponent } from "@bitwarden/angular/vault/components/vault-items.component"; import { SearchService } from "@bitwarden/common/abstractions/search.service"; +import { AccountService } from "@bitwarden/common/auth/abstractions/account.service"; import { CipherService } from "@bitwarden/common/vault/abstractions/cipher.service"; import { CipherView } from "@bitwarden/common/vault/models/view/cipher.view"; @@ -20,8 +21,9 @@ export class VaultItemsComponent extends BaseVaultItemsComponent { searchService: SearchService, searchBarService: SearchBarService, cipherService: CipherService, + accountService: AccountService, ) { - super(searchService, cipherService); + super(searchService, cipherService, accountService); // eslint-disable-next-line rxjs-angular/prefer-takeuntil searchBarService.searchText$.pipe(distinctUntilChanged()).subscribe((searchText) => { diff --git a/apps/desktop/src/vault/app/vault/vault.component.ts b/apps/desktop/src/vault/app/vault/vault.component.ts index 8ee7cce3c77..6f844a7bf51 100644 --- a/apps/desktop/src/vault/app/vault/vault.component.ts +++ b/apps/desktop/src/vault/app/vault/vault.component.ts @@ -10,7 +10,7 @@ import { ViewContainerRef, } from "@angular/core"; import { ActivatedRoute, Router } from "@angular/router"; -import { combineLatest, firstValueFrom, Subject, takeUntil, switchMap } from "rxjs"; +import { firstValueFrom, Subject, takeUntil, switchMap } from "rxjs"; import { filter, first, map, take } from "rxjs/operators"; import { ModalRef } from "@bitwarden/angular/components/modal/modal.ref"; @@ -19,6 +19,7 @@ import { VaultFilter } from "@bitwarden/angular/vault/vault-filter/models/vault- import { ApiService } from "@bitwarden/common/abstractions/api.service"; import { EventCollectionService } from "@bitwarden/common/abstractions/event/event-collection.service"; import { AccountService } from "@bitwarden/common/auth/abstractions/account.service"; +import { getUserId } from "@bitwarden/common/auth/services/account.service"; import { BillingAccountProfileStateService } from "@bitwarden/common/billing/abstractions/account/billing-account-profile-state.service"; import { EventType } from "@bitwarden/common/enums"; import { BroadcasterService } from "@bitwarden/common/platform/abstractions/broadcaster.service"; @@ -27,7 +28,7 @@ import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.servic import { MessagingService } from "@bitwarden/common/platform/abstractions/messaging.service"; import { PlatformUtilsService } from "@bitwarden/common/platform/abstractions/platform-utils.service"; import { SyncService } from "@bitwarden/common/platform/sync"; -import { CipherId } from "@bitwarden/common/types/guid"; +import { CipherId, UserId } from "@bitwarden/common/types/guid"; import { CipherService } from "@bitwarden/common/vault/abstractions/cipher.service"; import { TotpService } from "@bitwarden/common/vault/abstractions/totp.service"; import { CipherType } from "@bitwarden/common/vault/enums"; @@ -89,6 +90,7 @@ export class VaultComponent implements OnInit, OnDestroy { deleted = false; userHasPremiumAccess = false; activeFilter: VaultFilter = new VaultFilter(); + activeUserId: UserId; private modal: ModalRef = null; private componentIsDestroyed$ = new Subject(); @@ -236,15 +238,12 @@ export class VaultComponent implements OnInit, OnDestroy { }); } - // Store a reference to the current active account during page init - const activeAccount = await firstValueFrom(this.accountService.activeAccount$); + this.activeUserId = await firstValueFrom(this.accountService.activeAccount$.pipe(getUserId)); - // Combine with the activeAccount$ to ensure we only show the dialog for the current account from ngOnInit. - // The account switching process updates the cipherService before Vault is destroyed and would cause duplicate emissions - combineLatest([this.accountService.activeAccount$, this.cipherService.failedToDecryptCiphers$]) + this.cipherService + .failedToDecryptCiphers$(this.activeUserId) .pipe( - filter(([account]) => account.id === activeAccount.id), - map(([_, ciphers]) => ciphers.filter((c) => !c.isDeleted)), + map((ciphers) => ciphers?.filter((c) => !c.isDeleted) ?? []), filter((ciphers) => ciphers.length > 0), take(1), takeUntil(this.componentIsDestroyed$), @@ -496,8 +495,10 @@ export class VaultComponent implements OnInit, OnDestroy { async savedCipher(cipher: CipherView) { this.cipherId = cipher.id; this.action = "view"; - this.go(); await this.vaultItemsComponent.refresh(); + await this.cipherService.clearCache(this.activeUserId); + await this.viewComponent.load(); + this.go(); } async deletedCipher(cipher: CipherView) { diff --git a/apps/desktop/src/vault/app/vault/view.component.html b/apps/desktop/src/vault/app/vault/view.component.html index f589ba53046..59e609312d7 100644 --- a/apps/desktop/src/vault/app/vault/view.component.html +++ b/apps/desktop/src/vault/app/vault/view.component.html @@ -186,16 +186,6 @@
-
-
- {{ "verificationCodeTotp" | i18n }} - - {{ "organizationUpgradeRequired" | i18n }} - - -
-
diff --git a/apps/desktop/src/vault/app/vault/view.component.ts b/apps/desktop/src/vault/app/vault/view.component.ts index 136a537dd37..aee1f34437b 100644 --- a/apps/desktop/src/vault/app/vault/view.component.ts +++ b/apps/desktop/src/vault/app/vault/view.component.ts @@ -159,10 +159,4 @@ export class ViewComponent extends BaseViewComponent implements OnInit, OnDestro this.messagingService.send("premiumRequired"); } } - - upgradeOrganization() { - this.messagingService.send("upgradeOrganization", { - organizationId: this.cipher.organizationId, - }); - } } diff --git a/apps/desktop/tsconfig.json b/apps/desktop/tsconfig.json index 0bef5a5564d..05253fc47d7 100644 --- a/apps/desktop/tsconfig.json +++ b/apps/desktop/tsconfig.json @@ -45,8 +45,7 @@ "useDefineForClassFields": false }, "angularCompilerOptions": { - "strictTemplates": true, - "preserveWhitespaces": true + "strictTemplates": true }, "include": ["src", "../../libs/common/src/key-management/crypto/services/encrypt.worker.ts"] } diff --git a/apps/web/package.json b/apps/web/package.json index 7047b0fb137..cf2df649773 100644 --- a/apps/web/package.json +++ b/apps/web/package.json @@ -1,6 +1,6 @@ { "name": "@bitwarden/web-vault", - "version": "2025.1.2", + "version": "2025.2.1", "scripts": { "build:oss": "cross-env NODE_OPTIONS=\"--max-old-space-size=8192\" webpack", "build:bit": "cross-env NODE_OPTIONS=\"--max-old-space-size=8192\" webpack -c ../../bitwarden_license/bit-web/webpack.config.js", diff --git a/apps/web/src/app/admin-console/organizations/layouts/organization-layout.component.ts b/apps/web/src/app/admin-console/organizations/layouts/organization-layout.component.ts index 1f31ae4fc0c..4485396b80d 100644 --- a/apps/web/src/app/admin-console/organizations/layouts/organization-layout.component.ts +++ b/apps/web/src/app/admin-console/organizations/layouts/organization-layout.component.ts @@ -129,10 +129,7 @@ export class OrganizationLayoutComponent implements OnInit { ), ); - this.integrationPageEnabled$ = combineLatest( - this.organization$, - this.configService.getFeatureFlag$(FeatureFlag.PM14505AdminConsoleIntegrationPage), - ).pipe(map(([org, featureFlagEnabled]) => featureFlagEnabled && org.canAccessIntegrations)); + this.integrationPageEnabled$ = this.organization$.pipe(map((org) => org.canAccessIntegrations)); this.domainVerificationNavigationTextKey = (await this.configService.getFeatureFlag( FeatureFlag.AccountDeprovisioning, diff --git a/apps/web/src/app/admin-console/organizations/manage/entity-events.component.ts b/apps/web/src/app/admin-console/organizations/manage/entity-events.component.ts index 58efc7348e1..68ba5830c35 100644 --- a/apps/web/src/app/admin-console/organizations/manage/entity-events.component.ts +++ b/apps/web/src/app/admin-console/organizations/manage/entity-events.component.ts @@ -1,8 +1,10 @@ // FIXME: Update this file to be type safe and remove this and next line // @ts-strict-ignore import { DIALOG_DATA, DialogConfig } from "@angular/cdk/dialog"; -import { Component, Inject, OnInit } from "@angular/core"; +import { Component, Inject, OnDestroy, OnInit } from "@angular/core"; import { FormBuilder } from "@angular/forms"; +import { ActivatedRoute, Router } from "@angular/router"; +import { firstValueFrom, switchMap } from "rxjs"; import { OrganizationUserApiService } from "@bitwarden/admin-console/common"; import { UserNamePipe } from "@bitwarden/angular/pipes/user-name.pipe"; @@ -12,7 +14,6 @@ import { ListResponse } from "@bitwarden/common/models/response/list.response"; import { EventView } from "@bitwarden/common/models/view/event.view"; import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; import { LogService } from "@bitwarden/common/platform/abstractions/log.service"; -import { PlatformUtilsService } from "@bitwarden/common/platform/abstractions/platform-utils.service"; import { ValidationService } from "@bitwarden/common/platform/abstractions/validation.service"; import { DialogService, TableDataSource, ToastService } from "@bitwarden/components"; @@ -34,7 +35,7 @@ export interface EntityEventsDialogParams { templateUrl: "entity-events.component.html", standalone: true, }) -export class EntityEventsComponent implements OnInit { +export class EntityEventsComponent implements OnInit, OnDestroy { loading = true; continuationToken: string; protected dataSource = new TableDataSource(); @@ -59,13 +60,14 @@ export class EntityEventsComponent implements OnInit { private apiService: ApiService, private i18nService: I18nService, private eventService: EventService, - private platformUtilsService: PlatformUtilsService, private userNamePipe: UserNamePipe, private logService: LogService, private organizationUserApiService: OrganizationUserApiService, private formBuilder: FormBuilder, private validationService: ValidationService, private toastService: ToastService, + private router: Router, + private activeRoute: ActivatedRoute, ) {} async ngOnInit() { @@ -77,6 +79,21 @@ export class EntityEventsComponent implements OnInit { await this.load(); } + async ngOnDestroy() { + await firstValueFrom( + this.activeRoute.queryParams.pipe( + switchMap(async (params) => { + await this.router.navigate([], { + queryParams: { + ...params, + viewEvents: null, + }, + }); + }), + ), + ); + } + async load() { try { if (this.showUser) { diff --git a/apps/web/src/app/admin-console/organizations/members/components/bulk/bulk-delete-dialog.component.html b/apps/web/src/app/admin-console/organizations/members/components/bulk/bulk-delete-dialog.component.html index bb5294ebf02..f666decae81 100644 --- a/apps/web/src/app/admin-console/organizations/members/components/bulk/bulk-delete-dialog.component.html +++ b/apps/web/src/app/admin-console/organizations/members/components/bulk/bulk-delete-dialog.component.html @@ -7,9 +7,9 @@ {{ error }} - -

{{ "deleteManyOrganizationUsersWarningDesc" | i18n }}

-
+

+ {{ "deleteManyOrganizationUsersWarningDesc" | i18n }} +

diff --git a/apps/web/src/app/admin-console/organizations/members/components/bulk/bulk-restore-revoke.component.html b/apps/web/src/app/admin-console/organizations/members/components/bulk/bulk-restore-revoke.component.html index ebe27afabf5..4925c210039 100644 --- a/apps/web/src/app/admin-console/organizations/members/components/bulk/bulk-restore-revoke.component.html +++ b/apps/web/src/app/admin-console/organizations/members/components/bulk/bulk-restore-revoke.component.html @@ -3,9 +3,9 @@ *ngIf="{ enabled: accountDeprovisioningEnabled$ | async } as accountDeprovisioning" > -

{{ bulkMemberTitle }}

+ {{ bulkMemberTitle }} -

{{ bulkTitle }}

+ {{ bulkTitle }}
@@ -46,10 +46,7 @@ - -

{{ "revokeUsersWarning" | i18n }}

-
- +

{{ "revokeUsersWarning" | i18n }}

@@ -109,7 +106,13 @@
- diff --git a/apps/web/src/app/auth/settings/two-factor/two-factor-setup.component.ts b/apps/web/src/app/auth/settings/two-factor/two-factor-setup.component.ts index 4530692ebee..a76505930d4 100644 --- a/apps/web/src/app/auth/settings/two-factor/two-factor-setup.component.ts +++ b/apps/web/src/app/auth/settings/two-factor/two-factor-setup.component.ts @@ -29,6 +29,9 @@ import { TwoFactorProviders } from "@bitwarden/common/auth/services/two-factor.s import { AuthResponse } from "@bitwarden/common/auth/types/auth-response"; import { BillingAccountProfileStateService } from "@bitwarden/common/billing/abstractions/account/billing-account-profile-state.service"; import { ProductTierType } from "@bitwarden/common/billing/enums"; +import { FeatureFlag } from "@bitwarden/common/enums/feature-flag.enum"; +import { ConfigService } from "@bitwarden/common/platform/abstractions/config/config.service"; +import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; import { MessagingService } from "@bitwarden/common/platform/abstractions/messaging.service"; import { DialogService } from "@bitwarden/components"; @@ -52,6 +55,7 @@ export class TwoFactorSetupComponent implements OnInit, OnDestroy { organization: Organization; providers: any[] = []; canAccessPremium$: Observable; + recoveryCodeWarningMessage: string; showPolicyWarning = false; loading = true; modal: ModalRef; @@ -70,6 +74,8 @@ export class TwoFactorSetupComponent implements OnInit, OnDestroy { protected policyService: PolicyService, billingAccountProfileStateService: BillingAccountProfileStateService, protected accountService: AccountService, + protected configService: ConfigService, + protected i18nService: I18nService, ) { this.canAccessPremium$ = this.accountService.activeAccount$.pipe( switchMap((account) => @@ -79,6 +85,13 @@ export class TwoFactorSetupComponent implements OnInit, OnDestroy { } async ngOnInit() { + const recoveryCodeLoginFeatureFlagEnabled = await this.configService.getFeatureFlag( + FeatureFlag.RecoveryCodeLogin, + ); + this.recoveryCodeWarningMessage = recoveryCodeLoginFeatureFlagEnabled + ? this.i18nService.t("yourSingleUseRecoveryCode") + : this.i18nService.t("twoStepLoginRecoveryWarning"); + for (const key in TwoFactorProviders) { // eslint-disable-next-line if (!TwoFactorProviders.hasOwnProperty(key)) { diff --git a/apps/web/src/app/auth/verify-email-token.component.html b/apps/web/src/app/auth/verify-email-token.component.html index 39a7d4524f8..63437352e19 100644 --- a/apps/web/src/app/auth/verify-email-token.component.html +++ b/apps/web/src/app/auth/verify-email-token.component.html @@ -1,13 +1,6 @@ -
-
- -

- - {{ "loading" | i18n }} -

+
+ Bitwarden +
+
diff --git a/apps/web/src/app/billing/accounts/trial-initiation/trial-billing-step.component.html b/apps/web/src/app/billing/accounts/trial-initiation/trial-billing-step.component.html index 361b2d9a3a3..b3b8668e90b 100644 --- a/apps/web/src/app/billing/accounts/trial-initiation/trial-billing-step.component.html +++ b/apps/web/src/app/billing/accounts/trial-initiation/trial-billing-step.component.html @@ -50,7 +50,9 @@

{{ "paymentType" | i18n }}

- +
diff --git a/apps/web/src/app/layouts/header/web-header.skip-stories.ts b/apps/web/src/app/layouts/header/web-header.skip-stories.ts deleted file mode 100644 index 8db4aea3061..00000000000 --- a/apps/web/src/app/layouts/header/web-header.skip-stories.ts +++ /dev/null @@ -1,232 +0,0 @@ -// import { CommonModule } from "@angular/common"; -// import { Component, importProvidersFrom, Injectable, Input } from "@angular/core"; -// import { RouterModule } from "@angular/router"; -// import { -// applicationConfig, -// componentWrapperDecorator, -// Meta, -// moduleMetadata, -// Story, -// } from "@storybook/angular"; -// import { BehaviorSubject, combineLatest, map, of } from "rxjs"; - -// import { JslibModule } from "@bitwarden/angular/jslib.module"; -// import { VaultTimeoutSettingsService } from "@bitwarden/common/abstractions/vault-timeout/vault-timeout-settings.service"; -// import { VaultTimeoutAction } from "@bitwarden/common/enums/vault-timeout-action.enum"; -// 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 { -// AvatarModule, -// BreadcrumbsModule, -// ButtonModule, -// IconButtonModule, -// IconModule, -// InputModule, -// MenuModule, -// NavigationModule, -// TabsModule, -// TypographyModule, -// } from "@bitwarden/components"; - -// import { DynamicAvatarComponent } from "../../components/dynamic-avatar.component"; -// import { PreloadedEnglishI18nModule } from "../../core/tests"; -// import { WebHeaderComponent } from "../header/web-header.component"; - -// import { WebLayoutMigrationBannerService } from "./web-layout-migration-banner.service"; - -// @Injectable({ -// providedIn: "root", -// }) -// class MockStateService { -// activeAccount$ = new BehaviorSubject("1").asObservable(); -// accounts$ = new BehaviorSubject({ "1": { profile: { name: "Foo" } } }).asObservable(); -// } - -// class MockMessagingService implements MessagingService { -// send(subscriber: string, arg?: any) { -// alert(subscriber); -// } -// } - -// class MockVaultTimeoutService { -// availableVaultTimeoutActions$() { -// return new BehaviorSubject([VaultTimeoutAction.Lock]).asObservable(); -// } -// } - -// class MockPlatformUtilsService { -// isSelfHost() { -// return false; -// } -// } - -// @Component({ -// selector: "product-switcher", -// template: ``, -// }) -// class MockProductSwitcher {} - -// @Component({ -// selector: "dynamic-avatar", -// template: ``, -// standalone: true, -// imports: [CommonModule, AvatarModule], -// }) -// class MockDynamicAvatar implements Partial { -// protected name$ = combineLatest([ -// this.stateService.accounts$, -// this.stateService.activeAccount$, -// ]).pipe( -// map( -// ([accounts, activeAccount]) => accounts[activeAccount as keyof typeof accounts].profile.name, -// ), -// ); - -// @Input() -// text: string; - -// constructor(private stateService: MockStateService) {} -// } - -// export default { -// title: "Web/Header", -// component: WebHeaderComponent, -// decorators: [ -// componentWrapperDecorator( -// (story) => `
${story}
`, -// ), -// moduleMetadata({ -// imports: [ -// JslibModule, -// AvatarModule, -// BreadcrumbsModule, -// ButtonModule, -// IconButtonModule, -// IconModule, -// InputModule, -// MenuModule, -// TabsModule, -// TypographyModule, -// NavigationModule, -// MockDynamicAvatar, -// ], -// declarations: [WebHeaderComponent, MockProductSwitcher], -// providers: [ -// { provide: StateService, useClass: MockStateService }, -// { -// provide: WebLayoutMigrationBannerService, -// useValue: { -// showBanner$: of(false), -// } as Partial, -// }, -// { provide: PlatformUtilsService, useClass: MockPlatformUtilsService }, -// { provide: VaultTimeoutSettingsService, useClass: MockVaultTimeoutService }, -// { -// provide: MessagingService, -// useFactory: () => { -// return new MockMessagingService(); -// }, -// }, -// ], -// }), -// applicationConfig({ -// providers: [ -// importProvidersFrom(RouterModule.forRoot([], { useHash: true })), -// importProvidersFrom(PreloadedEnglishI18nModule), -// ], -// }), -// ], -// } as Meta; - -// export const KitchenSink: Story = (args) => ({ -// props: args, -// template: ` -// -// -// Foo -// Bar -// -// -// -// -// -// Foo -// Bar -// -// -// `, -// }); - -// export const Basic: Story = (args) => ({ -// props: args, -// template: ` -// -// `, -// }); - -// export const WithLongTitle: Story = (args) => ({ -// props: args, -// template: ` -// -// `, -// }); - -// export const WithBreadcrumbs: Story = (args) => ({ -// props: args, -// template: ` -// -// -// Foo -// Bar -// -// -// `, -// }); - -// export const WithSearch: Story = (args) => ({ -// props: args, -// template: ` -// -// -// -// `, -// }); - -// export const WithSecondaryContent: Story = (args) => ({ -// props: args, -// template: ` -// -// -// -// `, -// }); - -// export const WithTabs: Story = (args) => ({ -// props: args, -// template: ` -// -// -// Foo -// Bar -// -// -// `, -// }); - -// export const WithTitleSuffixComponent: Story = (args) => ({ -// props: args, -// template: ` -// -// -// -// `, -// }); diff --git a/apps/web/src/app/layouts/header/web-header.stories.ts b/apps/web/src/app/layouts/header/web-header.stories.ts new file mode 100644 index 00000000000..80e98ba7a57 --- /dev/null +++ b/apps/web/src/app/layouts/header/web-header.stories.ts @@ -0,0 +1,260 @@ +import { CommonModule } from "@angular/common"; +import { Component, importProvidersFrom, Injectable, Input } from "@angular/core"; +import { RouterModule } from "@angular/router"; +import { + applicationConfig, + componentWrapperDecorator, + Meta, + moduleMetadata, + StoryObj, +} from "@storybook/angular"; +import { BehaviorSubject, combineLatest, map, of } from "rxjs"; + +import { JslibModule } from "@bitwarden/angular/jslib.module"; +import { VaultTimeoutSettingsService } from "@bitwarden/common/abstractions/vault-timeout/vault-timeout-settings.service"; +import { AccountService } from "@bitwarden/common/auth/abstractions/account.service"; +import { VaultTimeoutAction } from "@bitwarden/common/enums/vault-timeout-action.enum"; +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 { + AvatarModule, + BreadcrumbsModule, + ButtonModule, + IconButtonModule, + IconModule, + InputModule, + MenuModule, + NavigationModule, + TabsModule, + TypographyModule, +} from "@bitwarden/components"; + +import { DynamicAvatarComponent } from "../../components/dynamic-avatar.component"; +import { PreloadedEnglishI18nModule } from "../../core/tests"; +import { WebHeaderComponent } from "../header/web-header.component"; + +import { WebLayoutMigrationBannerService } from "./web-layout-migration-banner.service"; + +@Injectable({ + providedIn: "root", +}) +class MockStateService { + activeAccount$ = new BehaviorSubject("1").asObservable(); + accounts$ = new BehaviorSubject({ "1": { profile: { name: "Foo" } } }).asObservable(); +} + +@Component({ + selector: "product-switcher", + template: ``, +}) +class MockProductSwitcher {} + +@Component({ + selector: "dynamic-avatar", + template: ``, + standalone: true, + imports: [CommonModule, AvatarModule], +}) +class MockDynamicAvatar implements Partial { + protected name$ = combineLatest([ + this.stateService.accounts$, + this.stateService.activeAccount$, + ]).pipe( + map( + ([accounts, activeAccount]) => accounts[activeAccount as keyof typeof accounts].profile.name, + ), + ); + + @Input() + text?: string; + + constructor(private stateService: MockStateService) {} +} + +export default { + title: "Web/Header", + component: WebHeaderComponent, + decorators: [ + componentWrapperDecorator( + (story) => `
${story}
`, + ), + moduleMetadata({ + imports: [ + JslibModule, + AvatarModule, + BreadcrumbsModule, + ButtonModule, + IconButtonModule, + IconModule, + InputModule, + MenuModule, + TabsModule, + TypographyModule, + NavigationModule, + MockDynamicAvatar, + ], + declarations: [WebHeaderComponent, MockProductSwitcher], + providers: [ + { provide: StateService, useClass: MockStateService }, + { + provide: AccountService, + useValue: { + activeAccount$: of({ + name: "Foobar Warden", + }), + } as Partial, + }, + { + provide: WebLayoutMigrationBannerService, + useValue: { + showBanner$: of(false), + } as Partial, + }, + { + provide: PlatformUtilsService, + useValue: { + isSelfHost() { + return false; + }, + } as Partial, + }, + { + provide: VaultTimeoutSettingsService, + useValue: { + availableVaultTimeoutActions$() { + return new BehaviorSubject([VaultTimeoutAction.Lock]).asObservable(); + }, + } as Partial, + }, + { + provide: MessagingService, + useValue: { + send: (...args: any[]) => { + // eslint-disable-next-line no-console + console.log("MessagingService.send", args); + }, + } as Partial, + }, + ], + }), + applicationConfig({ + providers: [ + importProvidersFrom(RouterModule.forRoot([], { useHash: true })), + importProvidersFrom(PreloadedEnglishI18nModule), + ], + }), + ], +} as Meta; + +type Story = StoryObj; + +export const KitchenSink: Story = { + render: (args) => ({ + props: args, + template: ` + + + Foo + Bar + + + + + + Foo + Bar + + + `, + }), +}; + +export const Basic: Story = { + render: (args: any) => ({ + props: args, + template: ` + + `, + }), +}; + +export const WithLongTitle: Story = { + render: (arg: any) => ({ + props: arg, + template: ` + + + + `, + }), +}; + +export const WithBreadcrumbs: Story = { + render: (args: any) => ({ + props: args, + template: ` + + + Foo + Bar + + + `, + }), +}; + +export const WithSearch: Story = { + render: (args: any) => ({ + props: args, + template: ` + + + + `, + }), +}; + +export const WithSecondaryContent: Story = { + render: (args) => ({ + props: args, + template: ` + + + + `, + }), +}; + +export const WithTabs: Story = { + render: (args) => ({ + props: args, + template: ` + + + Foo + Bar + + + `, + }), +}; + +export const WithTitleSuffixComponent: Story = { + render: (args) => ({ + props: args, + template: ` + + + + `, + }), +}; diff --git a/apps/web/src/app/layouts/product-switcher/navigation-switcher/navigation-switcher.stories.ts b/apps/web/src/app/layouts/product-switcher/navigation-switcher/navigation-switcher.stories.ts index 181779c7c2e..fca9063c8cf 100644 --- a/apps/web/src/app/layouts/product-switcher/navigation-switcher/navigation-switcher.stories.ts +++ b/apps/web/src/app/layouts/product-switcher/navigation-switcher/navigation-switcher.stories.ts @@ -10,6 +10,7 @@ import { Organization } from "@bitwarden/common/admin-console/models/domain/orga import { Provider } from "@bitwarden/common/admin-console/models/domain/provider"; import { AccountService, Account } from "@bitwarden/common/auth/abstractions/account.service"; import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; +import { PlatformUtilsService } from "@bitwarden/common/platform/abstractions/platform-utils.service"; import { SyncService } from "@bitwarden/common/platform/sync"; import { UserId } from "@bitwarden/common/types/guid"; import { LayoutComponent, NavigationModule } from "@bitwarden/components"; @@ -68,6 +69,12 @@ class MockAccountService implements Partial { }); } +class MockPlatformUtilsService implements Partial { + isSelfHost() { + return false; + } +} + @Component({ selector: "story-layout", template: ``, @@ -105,6 +112,7 @@ export default { { provide: AccountService, useClass: MockAccountService }, { provide: ProviderService, useClass: MockProviderService }, { provide: SyncService, useClass: MockSyncService }, + { provide: PlatformUtilsService, useClass: MockPlatformUtilsService }, ProductSwitcherService, { provide: I18nPipe, diff --git a/apps/web/src/app/layouts/product-switcher/product-switcher.stories.ts b/apps/web/src/app/layouts/product-switcher/product-switcher.stories.ts index 44467bb2b29..ca27aae4581 100644 --- a/apps/web/src/app/layouts/product-switcher/product-switcher.stories.ts +++ b/apps/web/src/app/layouts/product-switcher/product-switcher.stories.ts @@ -10,6 +10,7 @@ import { Organization } from "@bitwarden/common/admin-console/models/domain/orga import { Provider } from "@bitwarden/common/admin-console/models/domain/provider"; import { AccountService, Account } from "@bitwarden/common/auth/abstractions/account.service"; import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; +import { PlatformUtilsService } from "@bitwarden/common/platform/abstractions/platform-utils.service"; import { SyncService } from "@bitwarden/common/platform/sync"; import { UserId } from "@bitwarden/common/types/guid"; import { IconButtonModule, LinkModule, MenuModule } from "@bitwarden/components"; @@ -68,6 +69,12 @@ class MockAccountService implements Partial { }); } +class MockPlatformUtilsService implements Partial { + isSelfHost() { + return false; + } +} + @Component({ selector: "story-layout", template: ``, @@ -101,6 +108,8 @@ export default { { provide: ProviderService, useClass: MockProviderService }, MockProviderService, { provide: SyncService, useClass: MockSyncService }, + { provide: PlatformUtilsService, useClass: MockPlatformUtilsService }, + MockPlatformUtilsService, ProductSwitcherService, { provide: I18nService, diff --git a/apps/web/src/app/oss-routing.module.ts b/apps/web/src/app/oss-routing.module.ts index ac7e8cd8625..554f1f62e24 100644 --- a/apps/web/src/app/oss-routing.module.ts +++ b/apps/web/src/app/oss-routing.module.ts @@ -90,9 +90,10 @@ import { DomainRulesComponent } from "./settings/domain-rules.component"; import { PreferencesComponent } from "./settings/preferences.component"; import { CredentialGeneratorComponent } from "./tools/credential-generator/credential-generator.component"; import { ReportsModule } from "./tools/reports"; -import { AccessComponent } from "./tools/send/access.component"; -import { SendAccessExplainerComponent } from "./tools/send/send-access-explainer.component"; +import { AccessComponent, SendAccessExplainerComponent } from "./tools/send/send-access"; import { SendComponent } from "./tools/send/send.component"; +import { BrowserExtensionPromptInstallComponent } from "./vault/components/browser-extension-prompt/browser-extension-prompt-install.component"; +import { BrowserExtensionPromptComponent } from "./vault/components/browser-extension-prompt/browser-extension-prompt.component"; import { VaultModule } from "./vault/individual-vault/vault.module"; const routes: Routes = [ @@ -696,6 +697,23 @@ const routes: Routes = [ maxWidth: "3xl", } satisfies AnonLayoutWrapperData, }, + { + path: "browser-extension-prompt", + data: { + pageIcon: VaultIcons.BrowserExtensionIcon, + } satisfies AnonLayoutWrapperData, + children: [ + { + path: "", + component: BrowserExtensionPromptComponent, + }, + { + path: "", + component: BrowserExtensionPromptInstallComponent, + outlet: "secondary", + }, + ], + }, ], }, { diff --git a/apps/web/src/app/oss.module.ts b/apps/web/src/app/oss.module.ts index 0810a138de2..39d0a9ae202 100644 --- a/apps/web/src/app/oss.module.ts +++ b/apps/web/src/app/oss.module.ts @@ -4,7 +4,7 @@ import { AuthModule } from "./auth"; import { LoginModule } from "./auth/login/login.module"; import { TrialInitiationModule } from "./billing/trial-initiation/trial-initiation.module"; import { LooseComponentsModule, SharedModule } from "./shared"; -import { AccessComponent } from "./tools/send/access.component"; +import { AccessComponent } from "./tools/send/send-access/access.component"; import { OrganizationBadgeModule } from "./vault/individual-vault/organization-badge/organization-badge.module"; import { VaultFilterModule } from "./vault/individual-vault/vault-filter/vault-filter.module"; diff --git a/apps/web/src/app/shared/loose-components.module.ts b/apps/web/src/app/shared/loose-components.module.ts index 881b87e0819..b565621b776 100644 --- a/apps/web/src/app/shared/loose-components.module.ts +++ b/apps/web/src/app/shared/loose-components.module.ts @@ -35,7 +35,6 @@ import { EmergencyAccessAddEditComponent } from "../auth/settings/emergency-acce import { EmergencyAccessComponent } from "../auth/settings/emergency-access/emergency-access.component"; import { EmergencyAccessTakeoverComponent } from "../auth/settings/emergency-access/takeover/emergency-access-takeover.component"; import { EmergencyAccessViewComponent } from "../auth/settings/emergency-access/view/emergency-access-view.component"; -import { EmergencyAddEditCipherComponent } from "../auth/settings/emergency-access/view/emergency-add-edit-cipher.component"; import { ApiKeyComponent } from "../auth/settings/security/api-key.component"; import { ChangeKdfModule } from "../auth/settings/security/change-kdf/change-kdf.module"; import { SecurityKeysComponent } from "../auth/settings/security/security-keys.component"; @@ -124,7 +123,6 @@ import { SharedModule } from "./shared.module"; EmergencyAccessConfirmComponent, EmergencyAccessTakeoverComponent, EmergencyAccessViewComponent, - EmergencyAddEditCipherComponent, FolderAddEditComponent, FrontendLayoutComponent, HintComponent, @@ -188,7 +186,6 @@ import { SharedModule } from "./shared.module"; EmergencyAccessConfirmComponent, EmergencyAccessTakeoverComponent, EmergencyAccessViewComponent, - EmergencyAddEditCipherComponent, FolderAddEditComponent, FrontendLayoutComponent, HintComponent, diff --git a/apps/web/src/app/tools/reports/pages/cipher-report.component.ts b/apps/web/src/app/tools/reports/pages/cipher-report.component.ts index f78b2920410..792563c4fab 100644 --- a/apps/web/src/app/tools/reports/pages/cipher-report.component.ts +++ b/apps/web/src/app/tools/reports/pages/cipher-report.component.ts @@ -1,12 +1,13 @@ // FIXME: Update this file to be type safe and remove this and next line // @ts-strict-ignore import { Directive, ViewChild, ViewContainerRef, OnDestroy } from "@angular/core"; -import { BehaviorSubject, Observable, Subject, switchMap, takeUntil } from "rxjs"; +import { BehaviorSubject, Observable, Subject, firstValueFrom, switchMap, takeUntil } from "rxjs"; import { ModalService } from "@bitwarden/angular/services/modal.service"; import { OrganizationService } from "@bitwarden/common/admin-console/abstractions/organization/organization.service.abstraction"; import { Organization } from "@bitwarden/common/admin-console/models/domain/organization"; import { AccountService } from "@bitwarden/common/auth/abstractions/account.service"; +import { getUserId } from "@bitwarden/common/auth/services/account.service"; import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; import { OrganizationId } from "@bitwarden/common/types/guid"; import { CipherService } from "@bitwarden/common/vault/abstractions/cipher.service"; @@ -51,8 +52,10 @@ export class CipherReportComponent implements OnDestroy { private syncService: SyncService, ) { this.organizations$ = this.accountService.activeAccount$.pipe( - switchMap((account) => this.organizationService.organizations$(account?.id)), + getUserId, + switchMap((userId) => this.organizationService.organizations$(userId)), ); + this.organizations$.pipe(takeUntil(this.destroyed$)).subscribe((orgs) => { this.organizations = orgs; }); @@ -182,7 +185,8 @@ export class CipherReportComponent implements OnDestroy { } protected async getAllCiphers(): Promise { - return await this.cipherService.getAllDecrypted(); + const activeUserId = await firstValueFrom(this.accountService.activeAccount$.pipe(getUserId)); + return await this.cipherService.getAllDecrypted(activeUserId); } protected filterCiphersByOrg(ciphersList: CipherView[]) { diff --git a/apps/web/src/app/tools/reports/pages/exposed-passwords-report.component.spec.ts b/apps/web/src/app/tools/reports/pages/exposed-passwords-report.component.spec.ts index 16541bdc109..47e4a9d3652 100644 --- a/apps/web/src/app/tools/reports/pages/exposed-passwords-report.component.spec.ts +++ b/apps/web/src/app/tools/reports/pages/exposed-passwords-report.component.spec.ts @@ -25,15 +25,14 @@ describe("ExposedPasswordsReportComponent", () => { let auditService: MockProxy; let organizationService: MockProxy; let syncServiceMock: MockProxy; - let accountService: FakeAccountService; const userId = Utils.newGuid() as UserId; + const accountService: FakeAccountService = mockAccountServiceWith(userId); beforeEach(() => { syncServiceMock = mock(); auditService = mock(); organizationService = mock(); organizationService.organizations$.mockReturnValue(of([])); - accountService = mockAccountServiceWith(userId); // 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 TestBed.configureTestingModule({ diff --git a/apps/web/src/app/tools/reports/pages/inactive-two-factor-report.component.spec.ts b/apps/web/src/app/tools/reports/pages/inactive-two-factor-report.component.spec.ts index 385bda03f28..033b88ea34f 100644 --- a/apps/web/src/app/tools/reports/pages/inactive-two-factor-report.component.spec.ts +++ b/apps/web/src/app/tools/reports/pages/inactive-two-factor-report.component.spec.ts @@ -24,14 +24,13 @@ describe("InactiveTwoFactorReportComponent", () => { let fixture: ComponentFixture; let organizationService: MockProxy; let syncServiceMock: MockProxy; - let accountService: FakeAccountService; const userId = Utils.newGuid() as UserId; + const accountService: FakeAccountService = mockAccountServiceWith(userId); beforeEach(() => { organizationService = mock(); organizationService.organizations$.mockReturnValue(of([])); syncServiceMock = mock(); - accountService = mockAccountServiceWith(userId); // 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 TestBed.configureTestingModule({ diff --git a/apps/web/src/app/tools/reports/pages/reused-passwords-report.component.spec.ts b/apps/web/src/app/tools/reports/pages/reused-passwords-report.component.spec.ts index 6a26cd24fe5..7c895423159 100644 --- a/apps/web/src/app/tools/reports/pages/reused-passwords-report.component.spec.ts +++ b/apps/web/src/app/tools/reports/pages/reused-passwords-report.component.spec.ts @@ -23,15 +23,13 @@ describe("ReusedPasswordsReportComponent", () => { let fixture: ComponentFixture; let organizationService: MockProxy; let syncServiceMock: MockProxy; - let accountService: FakeAccountService; const userId = Utils.newGuid() as UserId; + const accountService: FakeAccountService = mockAccountServiceWith(userId); beforeEach(() => { organizationService = mock(); organizationService.organizations$.mockReturnValue(of([])); syncServiceMock = mock(); - accountService = mockAccountServiceWith(userId); - // 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 TestBed.configureTestingModule({ diff --git a/apps/web/src/app/tools/reports/pages/unsecured-websites-report.component.spec.ts b/apps/web/src/app/tools/reports/pages/unsecured-websites-report.component.spec.ts index 7cd159108b8..337aa41b56b 100644 --- a/apps/web/src/app/tools/reports/pages/unsecured-websites-report.component.spec.ts +++ b/apps/web/src/app/tools/reports/pages/unsecured-websites-report.component.spec.ts @@ -25,15 +25,14 @@ describe("UnsecuredWebsitesReportComponent", () => { let organizationService: MockProxy; let syncServiceMock: MockProxy; let collectionService: MockProxy; - let accountService: FakeAccountService; const userId = Utils.newGuid() as UserId; + const accountService: FakeAccountService = mockAccountServiceWith(userId); beforeEach(() => { organizationService = mock(); organizationService.organizations$.mockReturnValue(of([])); syncServiceMock = mock(); collectionService = mock(); - accountService = mockAccountServiceWith(userId); // 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 TestBed.configureTestingModule({ diff --git a/apps/web/src/app/tools/reports/pages/weak-passwords-report.component.spec.ts b/apps/web/src/app/tools/reports/pages/weak-passwords-report.component.spec.ts index 578c220f396..3d19511a252 100644 --- a/apps/web/src/app/tools/reports/pages/weak-passwords-report.component.spec.ts +++ b/apps/web/src/app/tools/reports/pages/weak-passwords-report.component.spec.ts @@ -25,15 +25,14 @@ describe("WeakPasswordsReportComponent", () => { let passwordStrengthService: MockProxy; let organizationService: MockProxy; let syncServiceMock: MockProxy; - let accountService: FakeAccountService; const userId = Utils.newGuid() as UserId; + const accountService: FakeAccountService = mockAccountServiceWith(userId); beforeEach(() => { syncServiceMock = mock(); passwordStrengthService = mock(); organizationService = mock(); organizationService.organizations$.mockReturnValue(of([])); - accountService = mockAccountServiceWith(userId); // 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 TestBed.configureTestingModule({ diff --git a/apps/web/src/app/tools/send/access.component.html b/apps/web/src/app/tools/send/send-access/access.component.html similarity index 100% rename from apps/web/src/app/tools/send/access.component.html rename to apps/web/src/app/tools/send/send-access/access.component.html diff --git a/apps/web/src/app/tools/send/access.component.ts b/apps/web/src/app/tools/send/send-access/access.component.ts similarity index 99% rename from apps/web/src/app/tools/send/access.component.ts rename to apps/web/src/app/tools/send/send-access/access.component.ts index ccfecdd197e..a2922914ba5 100644 --- a/apps/web/src/app/tools/send/access.component.ts +++ b/apps/web/src/app/tools/send/send-access/access.component.ts @@ -21,7 +21,7 @@ import { NoItemsModule, ToastService } from "@bitwarden/components"; import { KeyService } from "@bitwarden/key-management"; import { ExpiredSendIcon } from "@bitwarden/send-ui"; -import { SharedModule } from "../../shared"; +import { SharedModule } from "../../../shared"; import { SendAccessFileComponent } from "./send-access-file.component"; import { SendAccessPasswordComponent } from "./send-access-password.component"; diff --git a/apps/web/src/app/tools/send/send-access/index.ts b/apps/web/src/app/tools/send/send-access/index.ts new file mode 100644 index 00000000000..c9df5ce5193 --- /dev/null +++ b/apps/web/src/app/tools/send/send-access/index.ts @@ -0,0 +1,2 @@ +export { AccessComponent } from "./access.component"; +export { SendAccessExplainerComponent } from "./send-access-explainer.component"; diff --git a/apps/web/src/app/tools/send/send-access-explainer.component.html b/apps/web/src/app/tools/send/send-access/send-access-explainer.component.html similarity index 100% rename from apps/web/src/app/tools/send/send-access-explainer.component.html rename to apps/web/src/app/tools/send/send-access/send-access-explainer.component.html diff --git a/apps/web/src/app/tools/send/send-access-explainer.component.ts b/apps/web/src/app/tools/send/send-access/send-access-explainer.component.ts similarity index 84% rename from apps/web/src/app/tools/send/send-access-explainer.component.ts rename to apps/web/src/app/tools/send/send-access/send-access-explainer.component.ts index e7106110a65..ec39d970444 100644 --- a/apps/web/src/app/tools/send/send-access-explainer.component.ts +++ b/apps/web/src/app/tools/send/send-access/send-access-explainer.component.ts @@ -1,6 +1,6 @@ import { Component } from "@angular/core"; -import { SharedModule } from "../../shared"; +import { SharedModule } from "../../../shared"; @Component({ selector: "app-send-access-explainer", diff --git a/apps/web/src/app/tools/send/send-access-file.component.html b/apps/web/src/app/tools/send/send-access/send-access-file.component.html similarity index 100% rename from apps/web/src/app/tools/send/send-access-file.component.html rename to apps/web/src/app/tools/send/send-access/send-access-file.component.html diff --git a/apps/web/src/app/tools/send/send-access-file.component.ts b/apps/web/src/app/tools/send/send-access/send-access-file.component.ts similarity index 98% rename from apps/web/src/app/tools/send/send-access-file.component.ts rename to apps/web/src/app/tools/send/send-access/send-access-file.component.ts index 05408bc34f7..eec0bfd787b 100644 --- a/apps/web/src/app/tools/send/send-access-file.component.ts +++ b/apps/web/src/app/tools/send/send-access/send-access-file.component.ts @@ -13,7 +13,7 @@ import { SendAccessView } from "@bitwarden/common/tools/send/models/view/send-ac import { SendApiService } from "@bitwarden/common/tools/send/services/send-api.service.abstraction"; import { ToastService } from "@bitwarden/components"; -import { SharedModule } from "../../shared"; +import { SharedModule } from "../../../shared"; @Component({ selector: "app-send-access-file", diff --git a/apps/web/src/app/tools/send/send-access-password.component.html b/apps/web/src/app/tools/send/send-access/send-access-password.component.html similarity index 100% rename from apps/web/src/app/tools/send/send-access-password.component.html rename to apps/web/src/app/tools/send/send-access/send-access-password.component.html diff --git a/apps/web/src/app/tools/send/send-access-password.component.ts b/apps/web/src/app/tools/send/send-access/send-access-password.component.ts similarity index 95% rename from apps/web/src/app/tools/send/send-access-password.component.ts rename to apps/web/src/app/tools/send/send-access/send-access-password.component.ts index bd98e9d18c8..0cfd93fcea0 100644 --- a/apps/web/src/app/tools/send/send-access-password.component.ts +++ b/apps/web/src/app/tools/send/send-access/send-access-password.component.ts @@ -4,7 +4,7 @@ import { Component, EventEmitter, Input, OnDestroy, OnInit, Output } from "@angu import { FormBuilder, Validators } from "@angular/forms"; import { Subject, takeUntil } from "rxjs"; -import { SharedModule } from "../../shared"; +import { SharedModule } from "../../../shared"; @Component({ selector: "app-send-access-password", diff --git a/apps/web/src/app/tools/send/send-access-text.component.html b/apps/web/src/app/tools/send/send-access/send-access-text.component.html similarity index 100% rename from apps/web/src/app/tools/send/send-access-text.component.html rename to apps/web/src/app/tools/send/send-access/send-access-text.component.html diff --git a/apps/web/src/app/tools/send/send-access-text.component.ts b/apps/web/src/app/tools/send/send-access/send-access-text.component.ts similarity index 97% rename from apps/web/src/app/tools/send/send-access-text.component.ts rename to apps/web/src/app/tools/send/send-access/send-access-text.component.ts index 6568fe482ad..6f9bc798d4b 100644 --- a/apps/web/src/app/tools/send/send-access-text.component.ts +++ b/apps/web/src/app/tools/send/send-access/send-access-text.component.ts @@ -8,7 +8,7 @@ import { PlatformUtilsService } from "@bitwarden/common/platform/abstractions/pl import { SendAccessView } from "@bitwarden/common/tools/send/models/view/send-access.view"; import { ToastService } from "@bitwarden/components"; -import { SharedModule } from "../../shared"; +import { SharedModule } from "../../../shared"; @Component({ selector: "app-send-access-text", diff --git a/apps/web/src/app/vault/components/browser-extension-prompt/browser-extension-prompt-install.component.html b/apps/web/src/app/vault/components/browser-extension-prompt/browser-extension-prompt-install.component.html new file mode 100644 index 00000000000..709f4e8993e --- /dev/null +++ b/apps/web/src/app/vault/components/browser-extension-prompt/browser-extension-prompt-install.component.html @@ -0,0 +1,4 @@ +
+

{{ "doNotHaveExtension" | i18n }}

+ {{ "installExtension" | i18n }} +
diff --git a/apps/web/src/app/vault/components/browser-extension-prompt/browser-extension-prompt-install.component.spec.ts b/apps/web/src/app/vault/components/browser-extension-prompt/browser-extension-prompt-install.component.spec.ts new file mode 100644 index 00000000000..e3729130a01 --- /dev/null +++ b/apps/web/src/app/vault/components/browser-extension-prompt/browser-extension-prompt-install.component.spec.ts @@ -0,0 +1,145 @@ +import { ComponentFixture, TestBed } from "@angular/core/testing"; +import { By } from "@angular/platform-browser"; +import { BehaviorSubject } from "rxjs"; + +import { DeviceType } from "@bitwarden/common/enums"; +import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; +import { PlatformUtilsService } from "@bitwarden/common/platform/abstractions/platform-utils.service"; + +import { + BrowserExtensionPromptService, + BrowserPromptState, +} from "../../services/browser-extension-prompt.service"; + +import { BrowserExtensionPromptInstallComponent } from "./browser-extension-prompt-install.component"; + +describe("BrowserExtensionInstallComponent", () => { + let fixture: ComponentFixture; + let component: BrowserExtensionPromptInstallComponent; + const pageState$ = new BehaviorSubject(BrowserPromptState.Loading); + + const getDevice = jest.fn(); + + beforeEach(async () => { + getDevice.mockClear(); + await TestBed.configureTestingModule({ + providers: [ + { + provide: BrowserExtensionPromptService, + useValue: { pageState$ }, + }, + { + provide: I18nService, + useValue: { t: (key: string) => key }, + }, + { + provide: PlatformUtilsService, + useValue: { getDevice }, + }, + ], + }).compileComponents(); + + fixture = TestBed.createComponent(BrowserExtensionPromptInstallComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it("only shows during error state", () => { + expect(fixture.nativeElement.textContent).toBe(""); + + pageState$.next(BrowserPromptState.Success); + fixture.detectChanges(); + + expect(fixture.nativeElement.textContent).toBe(""); + + pageState$.next(BrowserPromptState.Error); + fixture.detectChanges(); + + expect(fixture.nativeElement.textContent).not.toBe(""); + + pageState$.next(BrowserPromptState.ManualOpen); + fixture.detectChanges(); + + expect(fixture.nativeElement.textContent).not.toBe(""); + }); + + describe("error state", () => { + beforeEach(() => { + pageState$.next(BrowserPromptState.Error); + fixture.detectChanges(); + }); + + it("shows error text", () => { + const errorText = fixture.debugElement.query(By.css("p")).nativeElement; + expect(errorText.textContent).toBe("doNotHaveExtension"); + }); + + it("links to bitwarden installation page by default", () => { + const link = fixture.debugElement.query(By.css("a")).nativeElement; + + expect(link.getAttribute("href")).toBe( + "https://bitwarden.com/download/#downloads-web-browser", + ); + }); + + it("links to bitwarden installation page for Chrome", () => { + getDevice.mockReturnValue(DeviceType.ChromeBrowser); + component.ngOnInit(); + fixture.detectChanges(); + + const link = fixture.debugElement.query(By.css("a")).nativeElement; + + expect(link.getAttribute("href")).toBe( + "https://chrome.google.com/webstore/detail/bitwarden-password-manage/nngceckbapebfimnlniiiahkandclblb", + ); + }); + + it("links to bitwarden installation page for Firefox", () => { + getDevice.mockReturnValue(DeviceType.FirefoxBrowser); + component.ngOnInit(); + fixture.detectChanges(); + + const link = fixture.debugElement.query(By.css("a")).nativeElement; + + expect(link.getAttribute("href")).toBe( + "https://addons.mozilla.org/en-US/firefox/addon/bitwarden-password-manager/", + ); + }); + + it("links to bitwarden installation page for Safari", () => { + getDevice.mockReturnValue(DeviceType.SafariBrowser); + component.ngOnInit(); + fixture.detectChanges(); + + const link = fixture.debugElement.query(By.css("a")).nativeElement; + + expect(link.getAttribute("href")).toBe( + "https://apps.apple.com/us/app/bitwarden/id1352778147?mt=12", + ); + }); + + it("links to bitwarden installation page for Opera", () => { + getDevice.mockReturnValue(DeviceType.OperaBrowser); + component.ngOnInit(); + fixture.detectChanges(); + + const link = fixture.debugElement.query(By.css("a")).nativeElement; + + expect(link.getAttribute("href")).toBe( + "https://addons.opera.com/extensions/details/bitwarden-free-password-manager/", + ); + }); + + it("links to bitwarden installation page for Edge", () => { + getDevice.mockReturnValue(DeviceType.EdgeBrowser); + component.ngOnInit(); + fixture.detectChanges(); + + const link = fixture.debugElement.query(By.css("a")).nativeElement; + + expect(link.getAttribute("href")).toBe( + "https://microsoftedge.microsoft.com/addons/detail/jbkfoedolllekgbhcbcoahefnbanhhlh", + ); + }); + }); +}); diff --git a/apps/web/src/app/vault/components/browser-extension-prompt/browser-extension-prompt-install.component.ts b/apps/web/src/app/vault/components/browser-extension-prompt/browser-extension-prompt-install.component.ts new file mode 100644 index 00000000000..73f4307d9cc --- /dev/null +++ b/apps/web/src/app/vault/components/browser-extension-prompt/browser-extension-prompt-install.component.ts @@ -0,0 +1,66 @@ +import { CommonModule } from "@angular/common"; +import { Component, OnInit } from "@angular/core"; +import { map } from "rxjs"; + +import { DeviceType } from "@bitwarden/common/enums"; +import { PlatformUtilsService } from "@bitwarden/common/platform/abstractions/platform-utils.service"; +import { LinkModule } from "@bitwarden/components"; +import { I18nPipe } from "@bitwarden/ui-common"; + +import { + BrowserExtensionPromptService, + BrowserPromptState, +} from "../../services/browser-extension-prompt.service"; + +/** Device specific Urls for the extension */ +const WebStoreUrls: Partial> = { + [DeviceType.ChromeBrowser]: + "https://chrome.google.com/webstore/detail/bitwarden-password-manage/nngceckbapebfimnlniiiahkandclblb", + [DeviceType.FirefoxBrowser]: + "https://addons.mozilla.org/en-US/firefox/addon/bitwarden-password-manager/", + [DeviceType.SafariBrowser]: "https://apps.apple.com/us/app/bitwarden/id1352778147?mt=12", + [DeviceType.OperaBrowser]: + "https://addons.opera.com/extensions/details/bitwarden-free-password-manager/", + [DeviceType.EdgeBrowser]: + "https://microsoftedge.microsoft.com/addons/detail/jbkfoedolllekgbhcbcoahefnbanhhlh", +}; + +@Component({ + selector: "vault-browser-extension-prompt-install", + templateUrl: "./browser-extension-prompt-install.component.html", + standalone: true, + imports: [CommonModule, I18nPipe, LinkModule], +}) +export class BrowserExtensionPromptInstallComponent implements OnInit { + /** The install link should only show for the error states */ + protected shouldShow$ = this.browserExtensionPromptService.pageState$.pipe( + map((state) => state === BrowserPromptState.Error || state === BrowserPromptState.ManualOpen), + ); + + /** All available page states */ + protected BrowserPromptState = BrowserPromptState; + + /** + * Installation link for the extension + */ + protected webStoreUrl: string = "https://bitwarden.com/download/#downloads-web-browser"; + + constructor( + private browserExtensionPromptService: BrowserExtensionPromptService, + private platformService: PlatformUtilsService, + ) {} + + ngOnInit(): void { + this.setBrowserStoreLink(); + } + + /** If available, set web store specific URL for the extension */ + private setBrowserStoreLink(): void { + const deviceType = this.platformService.getDevice(); + const platformSpecificUrl = WebStoreUrls[deviceType]; + + if (platformSpecificUrl) { + this.webStoreUrl = platformSpecificUrl; + } + } +} diff --git a/apps/web/src/app/vault/components/browser-extension-prompt/browser-extension-prompt.component.html b/apps/web/src/app/vault/components/browser-extension-prompt/browser-extension-prompt.component.html new file mode 100644 index 00000000000..1c643fcc3e4 --- /dev/null +++ b/apps/web/src/app/vault/components/browser-extension-prompt/browser-extension-prompt.component.html @@ -0,0 +1,44 @@ +
+ + +

{{ "openingExtension" | i18n }}

+
+ + +

{{ "openingExtensionError" | i18n }}

+ +
+ + + +

+ {{ "openedExtensionViewAtRiskPasswords" | i18n }} +

+
+ + +

+ {{ "openExtensionManuallyPart1" | i18n }} + + {{ "openExtensionManuallyPart2" | i18n }} +

+
+ + +

+ {{ "reopenLinkOnDesktop" | i18n }} +

+
+
diff --git a/apps/web/src/app/vault/components/browser-extension-prompt/browser-extension-prompt.component.spec.ts b/apps/web/src/app/vault/components/browser-extension-prompt/browser-extension-prompt.component.spec.ts new file mode 100644 index 00000000000..40dbc0d442e --- /dev/null +++ b/apps/web/src/app/vault/components/browser-extension-prompt/browser-extension-prompt.component.spec.ts @@ -0,0 +1,104 @@ +import { ComponentFixture, TestBed } from "@angular/core/testing"; +import { By } from "@angular/platform-browser"; +import { BehaviorSubject } from "rxjs"; + +import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; + +import { + BrowserExtensionPromptService, + BrowserPromptState, +} from "../../services/browser-extension-prompt.service"; + +import { BrowserExtensionPromptComponent } from "./browser-extension-prompt.component"; + +describe("BrowserExtensionPromptComponent", () => { + let fixture: ComponentFixture; + + const start = jest.fn(); + const pageState$ = new BehaviorSubject(BrowserPromptState.Loading); + + beforeEach(async () => { + start.mockClear(); + + await TestBed.configureTestingModule({ + providers: [ + { + provide: BrowserExtensionPromptService, + useValue: { start, pageState$ }, + }, + { + provide: I18nService, + useValue: { t: (key: string) => key }, + }, + ], + }).compileComponents(); + + fixture = TestBed.createComponent(BrowserExtensionPromptComponent); + fixture.detectChanges(); + }); + + it("calls start on initialization", () => { + expect(start).toHaveBeenCalledTimes(1); + }); + + describe("loading state", () => { + beforeEach(() => { + pageState$.next(BrowserPromptState.Loading); + fixture.detectChanges(); + }); + + it("shows loading text", () => { + const element = fixture.nativeElement; + expect(element.textContent.trim()).toBe("openingExtension"); + }); + }); + + describe("error state", () => { + beforeEach(() => { + pageState$.next(BrowserPromptState.Error); + fixture.detectChanges(); + }); + + it("shows error text", () => { + const errorText = fixture.debugElement.query(By.css("p")).nativeElement; + expect(errorText.textContent.trim()).toBe("openingExtensionError"); + }); + }); + + describe("success state", () => { + beforeEach(() => { + pageState$.next(BrowserPromptState.Success); + fixture.detectChanges(); + }); + + it("shows success message", () => { + const successText = fixture.debugElement.query(By.css("p")).nativeElement; + expect(successText.textContent.trim()).toBe("openedExtensionViewAtRiskPasswords"); + }); + }); + + describe("mobile state", () => { + beforeEach(() => { + pageState$.next(BrowserPromptState.MobileBrowser); + fixture.detectChanges(); + }); + + it("shows mobile message", () => { + const mobileText = fixture.debugElement.query(By.css("p")).nativeElement; + expect(mobileText.textContent.trim()).toBe("reopenLinkOnDesktop"); + }); + }); + + describe("manual error state", () => { + beforeEach(() => { + pageState$.next(BrowserPromptState.ManualOpen); + fixture.detectChanges(); + }); + + it("shows manual open error message", () => { + const manualText = fixture.debugElement.query(By.css("p")).nativeElement; + expect(manualText.textContent.trim()).toContain("openExtensionManuallyPart1"); + expect(manualText.textContent.trim()).toContain("openExtensionManuallyPart2"); + }); + }); +}); diff --git a/apps/web/src/app/vault/components/browser-extension-prompt/browser-extension-prompt.component.ts b/apps/web/src/app/vault/components/browser-extension-prompt/browser-extension-prompt.component.ts new file mode 100644 index 00000000000..640a1b0d771 --- /dev/null +++ b/apps/web/src/app/vault/components/browser-extension-prompt/browser-extension-prompt.component.ts @@ -0,0 +1,37 @@ +import { CommonModule } from "@angular/common"; +import { Component, OnInit } from "@angular/core"; + +import { ButtonComponent, IconModule } from "@bitwarden/components"; +import { I18nPipe } from "@bitwarden/ui-common"; +import { VaultIcons } from "@bitwarden/vault"; + +import { + BrowserExtensionPromptService, + BrowserPromptState, +} from "../../services/browser-extension-prompt.service"; + +@Component({ + selector: "vault-browser-extension-prompt", + templateUrl: "./browser-extension-prompt.component.html", + standalone: true, + imports: [CommonModule, I18nPipe, ButtonComponent, IconModule], +}) +export class BrowserExtensionPromptComponent implements OnInit { + /** Current state of the prompt page */ + protected pageState$ = this.browserExtensionPromptService.pageState$; + + /** All available page states */ + protected BrowserPromptState = BrowserPromptState; + + protected BitwardenIcon = VaultIcons.BitwardenIcon; + + constructor(private browserExtensionPromptService: BrowserExtensionPromptService) {} + + ngOnInit(): void { + this.browserExtensionPromptService.start(); + } + + openExtension(): void { + this.browserExtensionPromptService.openExtension(); + } +} diff --git a/apps/web/src/app/vault/components/vault-item-dialog/vault-item-dialog.component.ts b/apps/web/src/app/vault/components/vault-item-dialog/vault-item-dialog.component.ts index eb2289d7229..3dc3b8f9f84 100644 --- a/apps/web/src/app/vault/components/vault-item-dialog/vault-item-dialog.component.ts +++ b/apps/web/src/app/vault/components/vault-item-dialog/vault-item-dialog.component.ts @@ -12,6 +12,7 @@ import { ApiService } from "@bitwarden/common/abstractions/api.service"; import { EventCollectionService } from "@bitwarden/common/abstractions/event/event-collection.service"; import { Organization } from "@bitwarden/common/admin-console/models/domain/organization"; import { AccountService } from "@bitwarden/common/auth/abstractions/account.service"; +import { getUserId } from "@bitwarden/common/auth/services/account.service"; import { BillingAccountProfileStateService } from "@bitwarden/common/billing/abstractions"; import { EventType } from "@bitwarden/common/enums"; import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; @@ -355,8 +356,8 @@ export class VaultItemDialogComponent implements OnInit, OnDestroy { this.formConfig.mode = "edit"; this.formConfig.initialValues = null; } - - let cipher = await this.cipherService.get(cipherView.id); + const activeUserId = await firstValueFrom(this.accountService.activeAccount$.pipe(getUserId)); + let cipher = await this.cipherService.get(cipherView.id, activeUserId); // When the form config is used within the Admin Console, retrieve the cipher from the admin endpoint (if not found in local state) if (this.formConfig.isAdminConsole && (cipher == null || this.formConfig.admin)) { @@ -448,10 +449,13 @@ export class VaultItemDialogComponent implements OnInit, OnDestroy { result.action === AttachmentDialogResult.Removed || result.action === AttachmentDialogResult.Uploaded ) { - const updatedCipher = await this.cipherService.get(this.formConfig.originalCipher?.id); const activeUserId = await firstValueFrom( this.accountService.activeAccount$.pipe(map((a) => a?.id)), ); + const updatedCipher = await this.cipherService.get( + this.formConfig.originalCipher?.id, + activeUserId, + ); const updatedCipherView = await updatedCipher.decrypt( await this.cipherService.getKeyForCipherKeyDecryption(updatedCipher, activeUserId), @@ -490,9 +494,7 @@ export class VaultItemDialogComponent implements OnInit, OnDestroy { if (config.originalCipher == null) { return; } - const activeUserId = await firstValueFrom( - this.accountService.activeAccount$.pipe(map((a) => a?.id)), - ); + const activeUserId = await firstValueFrom(this.accountService.activeAccount$.pipe(getUserId)); return await config.originalCipher.decrypt( await this.cipherService.getKeyForCipherKeyDecryption(config.originalCipher, activeUserId), ); @@ -574,10 +576,14 @@ export class VaultItemDialogComponent implements OnInit, OnDestroy { // - The cipher is unassigned const asAdmin = this.organization?.canEditAllCiphers || cipherIsUnassigned; + const activeUserId = await firstValueFrom( + this.accountService.activeAccount$.pipe(map((a) => a?.id)), + ); + if (this.cipher.isDeleted) { - await this.cipherService.deleteWithServer(this.cipher.id, asAdmin); + await this.cipherService.deleteWithServer(this.cipher.id, activeUserId, asAdmin); } else { - await this.cipherService.softDeleteWithServer(this.cipher.id, asAdmin); + await this.cipherService.softDeleteWithServer(this.cipher.id, activeUserId, asAdmin); } } diff --git a/apps/web/src/app/vault/components/vault-items/vault-cipher-row.component.html b/apps/web/src/app/vault/components/vault-items/vault-cipher-row.component.html index 7e59853851c..befeee43f69 100644 --- a/apps/web/src/app/vault/components/vault-items/vault-cipher-row.component.html +++ b/apps/web/src/app/vault/components/vault-items/vault-cipher-row.component.html @@ -22,7 +22,7 @@ [routerLink]="[]" [queryParams]="{ itemId: cipher.id, action: clickAction }" queryParamsHandling="merge" - [replaceUrl]="extensionRefreshEnabled" + [replaceUrl]="true" title="{{ 'editItemWithName' | i18n: cipher.name }}" type="button" appStopProp diff --git a/apps/web/src/app/vault/components/vault-items/vault-cipher-row.component.ts b/apps/web/src/app/vault/components/vault-items/vault-cipher-row.component.ts index 4af08e19d74..5f686fcec9c 100644 --- a/apps/web/src/app/vault/components/vault-items/vault-cipher-row.component.ts +++ b/apps/web/src/app/vault/components/vault-items/vault-cipher-row.component.ts @@ -1,12 +1,9 @@ // FIXME: Update this file to be type safe and remove this and next line // @ts-strict-ignore import { Component, EventEmitter, Input, OnInit, Output } from "@angular/core"; -import { firstValueFrom } from "rxjs"; import { CollectionView } from "@bitwarden/admin-console/common"; import { Organization } from "@bitwarden/common/admin-console/models/domain/organization"; -import { FeatureFlag } from "@bitwarden/common/enums/feature-flag.enum"; -import { ConfigService } from "@bitwarden/common/platform/abstractions/config/config.service"; import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; import { CipherType } from "@bitwarden/common/vault/enums"; import { CipherView } from "@bitwarden/common/vault/models/view/cipher.view"; @@ -25,11 +22,6 @@ import { RowHeightClass } from "./vault-items.component"; export class VaultCipherRowComponent implements OnInit { protected RowHeightClass = RowHeightClass; - /** - * Flag to determine if the extension refresh feature flag is enabled. - */ - protected extensionRefreshEnabled = false; - @Input() disabled: boolean; @Input() cipher: CipherView; @Input() showOwner: boolean; @@ -61,19 +53,12 @@ export class VaultCipherRowComponent implements OnInit { ]; protected organization?: Organization; - constructor( - private configService: ConfigService, - private i18nService: I18nService, - ) {} + constructor(private i18nService: I18nService) {} /** * Lifecycle hook for component initialization. - * Checks if the extension refresh feature flag is enabled to provide to template. */ async ngOnInit(): Promise { - this.extensionRefreshEnabled = await firstValueFrom( - this.configService.getFeatureFlag$(FeatureFlag.ExtensionRefresh), - ); if (this.cipher.organizationId != null) { this.organization = this.organizations.find((o) => o.id === this.cipher.organizationId); } @@ -83,7 +68,7 @@ export class VaultCipherRowComponent implements OnInit { if (this.cipher.decryptionFailure) { return "showFailedToDecrypt"; } - return this.extensionRefreshEnabled ? "view" : null; + return "view"; } protected get showTotpCopyButton() { diff --git a/apps/web/src/app/vault/components/vault-items/vault-collection-row.component.html b/apps/web/src/app/vault/components/vault-items/vault-collection-row.component.html index 2f9e84fc6d5..c7d16908241 100644 --- a/apps/web/src/app/vault/components/vault-items/vault-collection-row.component.html +++ b/apps/web/src/app/vault/components/vault-items/vault-collection-row.component.html @@ -11,7 +11,7 @@ /> - diff --git a/apps/web/src/app/vault/org-vault/vault-header/vault-header.component.ts b/apps/web/src/app/vault/org-vault/vault-header/vault-header.component.ts index 7f118a48db3..e3c99231a86 100644 --- a/apps/web/src/app/vault/org-vault/vault-header/vault-header.component.ts +++ b/apps/web/src/app/vault/org-vault/vault-header/vault-header.component.ts @@ -13,7 +13,6 @@ import { import { JslibModule } from "@bitwarden/angular/jslib.module"; import { Organization } from "@bitwarden/common/admin-console/models/domain/organization"; import { ProductTierType } from "@bitwarden/common/billing/enums"; -import { FeatureFlag } from "@bitwarden/common/enums/feature-flag.enum"; import { ConfigService } from "@bitwarden/common/platform/abstractions/config/config.service"; import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; import { CipherType } from "@bitwarden/common/vault/enums"; @@ -90,11 +89,6 @@ export class VaultHeaderComponent implements OnInit { protected CollectionDialogTabType = CollectionDialogTabType; - /** - * Whether the extension refresh feature flag is enabled. - */ - protected extensionRefreshEnabled = false; - /** The cipher type enum. */ protected CipherType = CipherType; @@ -106,11 +100,7 @@ export class VaultHeaderComponent implements OnInit { private configService: ConfigService, ) {} - async ngOnInit() { - this.extensionRefreshEnabled = await this.configService.getFeatureFlag( - FeatureFlag.ExtensionRefresh, - ); - } + async ngOnInit() {} get title() { const headerType = this.i18nService.t("collections").toLowerCase(); diff --git a/apps/web/src/app/vault/org-vault/vault.component.ts b/apps/web/src/app/vault/org-vault/vault.component.ts index fe76f9842e9..f14a8fcf5ee 100644 --- a/apps/web/src/app/vault/org-vault/vault.component.ts +++ b/apps/web/src/app/vault/org-vault/vault.component.ts @@ -1,15 +1,7 @@ // FIXME: Update this file to be type safe and remove this and next line // @ts-strict-ignore import { DialogRef } from "@angular/cdk/dialog"; -import { - ChangeDetectorRef, - Component, - NgZone, - OnDestroy, - OnInit, - ViewChild, - ViewContainerRef, -} from "@angular/core"; +import { ChangeDetectorRef, Component, NgZone, OnDestroy, OnInit } from "@angular/core"; import { ActivatedRoute, Params, Router } from "@angular/router"; import { BehaviorSubject, @@ -37,12 +29,10 @@ import { import { CollectionAdminService, CollectionAdminView, - CollectionService, CollectionView, Unassigned, } from "@bitwarden/admin-console/common"; import { SearchPipe } from "@bitwarden/angular/pipes/search.pipe"; -import { ModalService } from "@bitwarden/angular/services/modal.service"; import { ApiService } from "@bitwarden/common/abstractions/api.service"; import { EventCollectionService } from "@bitwarden/common/abstractions/event/event-collection.service"; import { SearchService } from "@bitwarden/common/abstractions/search.service"; @@ -50,6 +40,7 @@ import { OrganizationApiServiceAbstraction } from "@bitwarden/common/admin-conso import { OrganizationService } from "@bitwarden/common/admin-console/abstractions/organization/organization.service.abstraction"; import { Organization } from "@bitwarden/common/admin-console/models/domain/organization"; import { AccountService } from "@bitwarden/common/auth/abstractions/account.service"; +import { getUserId } from "@bitwarden/common/auth/services/account.service"; import { OrganizationBillingServiceAbstraction } from "@bitwarden/common/billing/abstractions"; import { BillingApiServiceAbstraction } from "@bitwarden/common/billing/abstractions/billing-api.service.abstraction"; import { EventType } from "@bitwarden/common/enums"; @@ -62,7 +53,7 @@ import { MessagingService } from "@bitwarden/common/platform/abstractions/messag import { PlatformUtilsService } from "@bitwarden/common/platform/abstractions/platform-utils.service"; import { Utils } from "@bitwarden/common/platform/misc/utils"; import { SyncService } from "@bitwarden/common/platform/sync"; -import { CipherId, CollectionId, OrganizationId } from "@bitwarden/common/types/guid"; +import { CipherId, CollectionId, OrganizationId, UserId } from "@bitwarden/common/types/guid"; import { CipherService } from "@bitwarden/common/vault/abstractions/cipher.service"; import { TotpService } from "@bitwarden/common/vault/abstractions/totp.service"; import { CipherType } from "@bitwarden/common/vault/enums"; @@ -127,7 +118,6 @@ import { import { VaultHeaderComponent } from "../org-vault/vault-header/vault-header.component"; import { getNestedCollectionTree } from "../utils/collection-utils"; -import { AddEditComponent } from "./add-edit.component"; import { BulkCollectionsDialogComponent, BulkCollectionsDialogResult, @@ -166,13 +156,6 @@ enum AddAccessStatusType { export class VaultComponent implements OnInit, OnDestroy { protected Unassigned = Unassigned; - @ViewChild("attachments", { read: ViewContainerRef, static: true }) - attachmentsModalRef: ViewContainerRef; - @ViewChild("cipherAddEdit", { read: ViewContainerRef, static: true }) - cipherAddEditModalRef: ViewContainerRef; - @ViewChild("collectionsModal", { read: ViewContainerRef, static: true }) - collectionsModalRef: ViewContainerRef; - trashCleanupWarning: string = null; activeFilter: VaultFilter = new VaultFilter(); @@ -210,7 +193,6 @@ export class VaultComponent implements OnInit, OnDestroy { private refresh$ = new BehaviorSubject(null); private destroy$ = new Subject(); protected addAccessStatus$ = new BehaviorSubject(0); - private extensionRefreshEnabled: boolean; private resellerManagedOrgAlert: boolean; private vaultItemDialogRef?: DialogRef | undefined; @@ -249,7 +231,6 @@ export class VaultComponent implements OnInit, OnDestroy { private changeDetectorRef: ChangeDetectorRef, private syncService: SyncService, private i18nService: I18nService, - private modalService: ModalService, private dialogService: DialogService, private messagingService: MessagingService, private broadcasterService: BroadcasterService, @@ -265,7 +246,6 @@ export class VaultComponent implements OnInit, OnDestroy { private eventCollectionService: EventCollectionService, private totpService: TotpService, private apiService: ApiService, - private collectionService: CollectionService, private toastService: ToastService, private configService: ConfigService, private cipherFormConfigService: CipherFormConfigService, @@ -278,10 +258,6 @@ export class VaultComponent implements OnInit, OnDestroy { ) {} async ngOnInit() { - this.extensionRefreshEnabled = await this.configService.getFeatureFlag( - FeatureFlag.ExtensionRefresh, - ); - this.resellerManagedOrgAlert = await this.configService.getFeatureFlag( FeatureFlag.ResellerManagedOrgAlert, ); @@ -555,7 +531,7 @@ export class VaultComponent implements OnInit, OnDestroy { firstSetup$ .pipe( switchMap(() => combineLatest([this.route.queryParams, allCipherMap$])), - filter(() => this.vaultItemDialogRef == undefined || !this.extensionRefreshEnabled), + filter(() => this.vaultItemDialogRef == undefined), switchMap(async ([qParams, allCiphersMap]) => { const cipherId = getCipherIdFromParams(qParams); @@ -586,15 +562,15 @@ export class VaultComponent implements OnInit, OnDestroy { return; } - // Default to "view" if extension refresh is enabled - if (action == null && this.extensionRefreshEnabled) { + // Default to "view" + if (action == null) { action = "view"; } if (action === "view") { await this.viewCipherById(cipher); } else { - await this.editCipherId(cipher, false); + await this.editCipher(cipher, false); } } else { this.toastService.showToast({ @@ -836,27 +812,8 @@ export class VaultComponent implements OnInit, OnDestroy { } } + /** Opens the Add/Edit Dialog */ async addCipher(cipherType?: CipherType) { - if (this.extensionRefreshEnabled) { - return this.addCipherV2(cipherType); - } - - let collections: CollectionView[] = []; - - // Admins limited to only adding items to collections they have access to. - collections = await firstValueFrom(this.editableCollections$); - - await this.editCipher(null, false, (comp) => { - comp.type = cipherType || this.activeFilter.cipherType; - comp.collections = collections; - if (this.activeFilter.collectionId) { - comp.collectionIds = [this.activeFilter.collectionId]; - } - }); - } - - /** Opens the Add/Edit Dialog. Only to be used when the BrowserExtension feature flag is active */ - async addCipherV2(cipherType?: CipherType) { const cipherFormConfig = await this.cipherFormConfigService.buildConfig( "add", null, @@ -877,24 +834,8 @@ export class VaultComponent implements OnInit, OnDestroy { * Edit the given cipher or add a new cipher * @param cipherView - When set, the cipher to be edited * @param cloneCipher - `true` when the cipher should be cloned. - * Used in place of the `additionalComponentParameters`, as - * the `editCipherIdV2` method has a differing implementation. - * @param defaultComponentParameters - A method that takes in an instance of - * the `AddEditComponent` to edit methods directly. */ - async editCipher( - cipher: CipherView | null, - cloneCipher: boolean, - additionalComponentParameters?: (comp: AddEditComponent) => void, - ) { - return this.editCipherId(cipher, cloneCipher, additionalComponentParameters); - } - - async editCipherId( - cipher: CipherView | null, - cloneCipher: boolean, - additionalComponentParameters?: (comp: AddEditComponent) => void, - ) { + async editCipher(cipher: CipherView | null, cloneCipher: boolean) { if ( cipher && cipher.reprompt !== 0 && @@ -905,55 +846,6 @@ export class VaultComponent implements OnInit, OnDestroy { return; } - if (this.extensionRefreshEnabled) { - await this.editCipherIdV2(cipher, cloneCipher); - return; - } - - const defaultComponentParameters = (comp: AddEditComponent) => { - comp.organization = this.organization; - comp.organizationId = this.organization.id; - comp.cipherId = cipher?.id; - comp.collectionId = this.activeFilter.collectionId; - comp.onSavedCipher.pipe(takeUntil(this.destroy$)).subscribe(() => { - modal.close(); - this.refresh(); - }); - comp.onDeletedCipher.pipe(takeUntil(this.destroy$)).subscribe(() => { - modal.close(); - this.refresh(); - }); - comp.onRestoredCipher.pipe(takeUntil(this.destroy$)).subscribe(() => { - modal.close(); - this.refresh(); - }); - }; - - const [modal, childComponent] = await this.modalService.openViewRef( - AddEditComponent, - this.cipherAddEditModalRef, - additionalComponentParameters == null - ? defaultComponentParameters - : (comp) => { - defaultComponentParameters(comp); - additionalComponentParameters(comp); - }, - ); - - // 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 - modal.onClosedPromise().then(() => { - this.go({ cipherId: null, itemId: null, action: null }); - }); - - return childComponent; - } - - /** - * Edit a cipher using the new AddEditCipherDialogV2 component. - * Only to be used behind the ExtensionRefresh feature flag. - */ - private async editCipherIdV2(cipher: CipherView | null, cloneCipher: boolean) { const cipherFormConfig = await this.cipherFormConfigService.buildConfig( cloneCipher ? "clone" : "edit", cipher?.id as CipherId | null, @@ -1038,16 +930,7 @@ export class VaultComponent implements OnInit, OnDestroy { } } - let collections: CollectionView[] = []; - - // Admins limited to only adding items to collections they have access to. - collections = await firstValueFrom(this.editableCollections$); - - await this.editCipher(cipher, true, (comp) => { - comp.cloneMode = true; - comp.collections = collections; - comp.collectionIds = cipher.collectionIds; - }); + await this.editCipher(cipher, true); } restore = async (c: CipherView): Promise => { @@ -1070,8 +953,9 @@ export class VaultComponent implements OnInit, OnDestroy { // Allow restore of an Unassigned Item try { + const activeUserId = await firstValueFrom(this.accountService.activeAccount$.pipe(getUserId)); const asAdmin = this.organization?.canEditAnyCollection || c.isUnassigned; - await this.cipherService.restoreWithServer(c.id, asAdmin); + await this.cipherService.restoreWithServer(c.id, activeUserId, asAdmin); this.toastService.showToast({ variant: "success", title: null, @@ -1162,7 +1046,8 @@ export class VaultComponent implements OnInit, OnDestroy { } try { - await this.deleteCipherWithServer(c.id, permanent, c.isUnassigned); + const activeUserId = await firstValueFrom(this.accountService.activeAccount$.pipe(getUserId)); + await this.deleteCipherWithServer(c.id, activeUserId, permanent, c.isUnassigned); this.toastService.showToast({ variant: "success", title: null, @@ -1450,11 +1335,16 @@ export class VaultComponent implements OnInit, OnDestroy { }); } - protected deleteCipherWithServer(id: string, permanent: boolean, isUnassigned: boolean) { + protected deleteCipherWithServer( + id: string, + userId: UserId, + permanent: boolean, + isUnassigned: boolean, + ) { const asAdmin = this.organization?.canEditAllCiphers || isUnassigned; return permanent - ? this.cipherService.deleteWithServer(id, asAdmin) - : this.cipherService.softDeleteWithServer(id, asAdmin); + ? this.cipherService.deleteWithServer(id, userId, asAdmin) + : this.cipherService.softDeleteWithServer(id, userId, asAdmin); } protected async repromptCipher(ciphers: CipherView[]) { diff --git a/apps/web/src/app/vault/services/browser-extension-prompt.service.spec.ts b/apps/web/src/app/vault/services/browser-extension-prompt.service.spec.ts new file mode 100644 index 00000000000..647af007eca --- /dev/null +++ b/apps/web/src/app/vault/services/browser-extension-prompt.service.spec.ts @@ -0,0 +1,173 @@ +import { TestBed } from "@angular/core/testing"; + +import { AnonLayoutWrapperDataService } from "@bitwarden/auth/angular"; +import { PlatformUtilsService } from "@bitwarden/common/platform/abstractions/platform-utils.service"; +import { Utils } from "@bitwarden/common/platform/misc/utils"; +import { VaultMessages } from "@bitwarden/common/vault/enums/vault-messages.enum"; + +import { + BrowserExtensionPromptService, + BrowserPromptState, +} from "./browser-extension-prompt.service"; + +describe("BrowserExtensionPromptService", () => { + let service: BrowserExtensionPromptService; + const setAnonLayoutWrapperData = jest.fn(); + const isFirefox = jest.fn().mockReturnValue(false); + const postMessage = jest.fn(); + window.postMessage = postMessage; + + beforeEach(() => { + setAnonLayoutWrapperData.mockClear(); + postMessage.mockClear(); + isFirefox.mockClear(); + + TestBed.configureTestingModule({ + providers: [ + BrowserExtensionPromptService, + { provide: AnonLayoutWrapperDataService, useValue: { setAnonLayoutWrapperData } }, + { provide: PlatformUtilsService, useValue: { isFirefox } }, + ], + }); + jest.useFakeTimers(); + service = TestBed.inject(BrowserExtensionPromptService); + }); + + afterEach(() => { + jest.clearAllTimers(); + jest.useRealTimers(); + }); + + it("defaults page state to loading", (done) => { + service.pageState$.subscribe((state) => { + expect(state).toBe(BrowserPromptState.Loading); + done(); + }); + }); + + describe("start", () => { + it("posts message to check for extension", () => { + service.start(); + + expect(window.postMessage).toHaveBeenCalledWith({ + command: VaultMessages.checkBwInstalled, + }); + }); + + it("sets timeout for error state", () => { + service.start(); + + expect(service["extensionCheckTimeout"]).not.toBeNull(); + }); + + it("attempts to open the extension when installed", () => { + service.start(); + + window.dispatchEvent( + new MessageEvent("message", { data: { command: VaultMessages.HasBwInstalled } }), + ); + + expect(window.postMessage).toHaveBeenCalledTimes(2); + expect(window.postMessage).toHaveBeenCalledWith({ command: VaultMessages.OpenPopup }); + }); + }); + + describe("success state", () => { + beforeEach(() => { + service.start(); + + window.dispatchEvent( + new MessageEvent("message", { data: { command: VaultMessages.PopupOpened } }), + ); + }); + + it("sets layout title", () => { + expect(setAnonLayoutWrapperData).toHaveBeenCalledWith({ + pageTitle: { key: "openedExtension" }, + }); + }); + + it("sets success page state", (done) => { + service.pageState$.subscribe((state) => { + expect(state).toBe(BrowserPromptState.Success); + done(); + }); + }); + + it("clears the error timeout", () => { + expect(service["extensionCheckTimeout"]).toBeUndefined(); + }); + }); + + describe("firefox", () => { + beforeEach(() => { + isFirefox.mockReturnValue(true); + service.start(); + }); + + afterEach(() => { + isFirefox.mockReturnValue(false); + }); + + it("sets manual open state", (done) => { + service.pageState$.subscribe((state) => { + expect(state).toBe(BrowserPromptState.ManualOpen); + done(); + }); + }); + + it("sets error state after timeout", () => { + expect(setAnonLayoutWrapperData).toHaveBeenCalledWith({ + pageTitle: { key: "somethingWentWrong" }, + }); + }); + }); + + describe("mobile state", () => { + beforeEach(() => { + Utils.isMobileBrowser = true; + service.start(); + }); + + afterEach(() => { + Utils.isMobileBrowser = false; + }); + + it("sets mobile state", (done) => { + service.pageState$.subscribe((state) => { + expect(state).toBe(BrowserPromptState.MobileBrowser); + done(); + }); + }); + + it("sets desktop required title", () => { + expect(setAnonLayoutWrapperData).toHaveBeenCalledWith({ + pageTitle: { key: "desktopRequired" }, + }); + }); + + it("clears the error timeout", () => { + expect(service["extensionCheckTimeout"]).toBeUndefined(); + }); + }); + + describe("error state", () => { + beforeEach(() => { + service.start(); + jest.advanceTimersByTime(1000); + }); + + it("sets error state", (done) => { + service.pageState$.subscribe((state) => { + expect(state).toBe(BrowserPromptState.Error); + done(); + }); + }); + + it("sets error state after timeout", () => { + expect(setAnonLayoutWrapperData).toHaveBeenCalledWith({ + pageTitle: { key: "somethingWentWrong" }, + }); + }); + }); +}); diff --git a/apps/web/src/app/vault/services/browser-extension-prompt.service.ts b/apps/web/src/app/vault/services/browser-extension-prompt.service.ts new file mode 100644 index 00000000000..fec27758d3c --- /dev/null +++ b/apps/web/src/app/vault/services/browser-extension-prompt.service.ts @@ -0,0 +1,125 @@ +import { DestroyRef, Injectable } from "@angular/core"; +import { takeUntilDestroyed } from "@angular/core/rxjs-interop"; +import { BehaviorSubject, fromEvent } from "rxjs"; + +import { AnonLayoutWrapperDataService } from "@bitwarden/auth/angular"; +import { PlatformUtilsService } from "@bitwarden/common/platform/abstractions/platform-utils.service"; +import { Utils } from "@bitwarden/common/platform/misc/utils"; +import { VaultMessages } from "@bitwarden/common/vault/enums/vault-messages.enum"; + +export enum BrowserPromptState { + Loading = "loading", + Error = "error", + Success = "success", + ManualOpen = "manualOpen", + MobileBrowser = "mobileBrowser", +} + +type PromptErrorStates = BrowserPromptState.Error | BrowserPromptState.ManualOpen; + +@Injectable({ + providedIn: "root", +}) +export class BrowserExtensionPromptService { + private _pageState$ = new BehaviorSubject(BrowserPromptState.Loading); + + /** Current state of the prompt page */ + pageState$ = this._pageState$.asObservable(); + + /** Timeout identifier for extension check */ + private extensionCheckTimeout: number | undefined; + + constructor( + private anonLayoutWrapperDataService: AnonLayoutWrapperDataService, + private destroyRef: DestroyRef, + private platformUtilsService: PlatformUtilsService, + ) {} + + start(): void { + if (Utils.isMobileBrowser) { + this.setMobileState(); + return; + } + + // Firefox does not support automatically opening the extension, + // it currently requires a user gesture within the context of the extension to open. + // Show message to direct the user to manually open the extension. + // Mozilla Bug: https://bugzilla.mozilla.org/show_bug.cgi?id=1799344 + if (this.platformUtilsService.isFirefox()) { + this.setErrorState(BrowserPromptState.ManualOpen); + return; + } + + this.checkForBrowserExtension(); + } + + /** Post a message to the extension to open */ + openExtension() { + window.postMessage({ command: VaultMessages.OpenPopup }); + } + + /** Send message checking for the browser extension */ + private checkForBrowserExtension() { + fromEvent(window, "message") + .pipe(takeUntilDestroyed(this.destroyRef)) + .subscribe((event) => { + void this.getMessages(event); + }); + + window.postMessage({ command: VaultMessages.checkBwInstalled }); + + // Wait a second for the extension to respond and open, else show the error state + this.extensionCheckTimeout = window.setTimeout(() => { + this.setErrorState(); + }, 1000); + } + + /** Handle window message events */ + private getMessages(event: any) { + if (event.data.command === VaultMessages.HasBwInstalled) { + this.openExtension(); + } + + if (event.data.command === VaultMessages.PopupOpened) { + this.setSuccessState(); + } + } + + /** Show message that this page should be opened on a desktop browser */ + private setMobileState() { + this.clearExtensionCheckTimeout(); + this._pageState$.next(BrowserPromptState.MobileBrowser); + this.anonLayoutWrapperDataService.setAnonLayoutWrapperData({ + pageTitle: { + key: "desktopRequired", + }, + }); + } + + /** Show the open extension success state */ + private setSuccessState() { + this.clearExtensionCheckTimeout(); + this._pageState$.next(BrowserPromptState.Success); + this.anonLayoutWrapperDataService.setAnonLayoutWrapperData({ + pageTitle: { + key: "openedExtension", + }, + }); + } + + /** Show open extension error state */ + private setErrorState(errorState?: PromptErrorStates) { + this.clearExtensionCheckTimeout(); + this._pageState$.next(errorState ?? BrowserPromptState.Error); + this.anonLayoutWrapperDataService.setAnonLayoutWrapperData({ + pageTitle: { + key: "somethingWentWrong", + }, + }); + } + + private clearExtensionCheckTimeout() { + window.clearTimeout(this.extensionCheckTimeout); + this.extensionCheckTimeout = undefined; + } +} diff --git a/apps/web/src/locales/af/messages.json b/apps/web/src/locales/af/messages.json index a6f4e282b74..6addd540801 100644 --- a/apps/web/src/locales/af/messages.json +++ b/apps/web/src/locales/af/messages.json @@ -464,6 +464,18 @@ "editFolder": { "message": "Wysig vouer" }, + "newFolder": { + "message": "New folder" + }, + "folderName": { + "message": "Folder name" + }, + "folderHintText": { + "message": "Nest a folder by adding the parent folder's name followed by a “/”. Example: Social/Forums" + }, + "deleteFolderPermanently": { + "message": "Are you sure you want to permanently delete this folder?" + }, "baseDomain": { "message": "Basisdomein", "description": "Domain name. Example: website.com" @@ -728,15 +740,6 @@ "itemName": { "message": "Item name" }, - "cannotRemoveViewOnlyCollections": { - "message": "You cannot remove collections with View only permissions: $COLLECTIONS$", - "placeholders": { - "collections": { - "content": "$1", - "example": "Work, Personal" - } - } - }, "ex": { "message": "bv.", "description": "Short abbreviation for 'example'." @@ -1182,6 +1185,9 @@ "logInInitiated": { "message": "Log in initiated" }, + "logInRequestSent": { + "message": "Request sent" + }, "submit": { "message": "Dien in" }, @@ -1371,12 +1377,39 @@ "notificationSentDevice": { "message": "’n Kennisgewing is na u toestel gestuur." }, + "notificationSentDevicePart1": { + "message": "Unlock Bitwarden on your device or on the " + }, + "areYouTryingToAccessYourAccount": { + "message": "Are you trying to access your account?" + }, + "accessAttemptBy": { + "message": "Access attempt by $EMAIL$", + "placeholders": { + "email": { + "content": "$1", + "example": "name@example.com" + } + } + }, + "confirmAccess": { + "message": "Confirm access" + }, + "denyAccess": { + "message": "Deny access" + }, + "notificationSentDeviceAnchor": { + "message": "web app" + }, + "notificationSentDevicePart2": { + "message": "Make sure the Fingerprint phrase matches the one below before approving." + }, + "notificationSentDeviceComplete": { + "message": "Unlock Bitwarden on your device. Make sure the Fingerprint phrase matches the one below before approving." + }, "aNotificationWasSentToYourDevice": { "message": "A notification was sent to your device" }, - "makeSureYourAccountIsUnlockedAndTheFingerprintEtc": { - "message": "Make sure your account is unlocked and the fingerprint phrase matches on the other device" - }, "versionNumber": { "message": "Weergawe $VERSION_NUMBER$", "placeholders": { @@ -1664,9 +1697,6 @@ "message": "Avoid ambiguous characters", "description": "Label for the avoid ambiguous characters checkbox." }, - "regeneratePassword": { - "message": "Hergenereer wagwoord" - }, "length": { "message": "Lengte" }, @@ -2170,8 +2200,20 @@ "manage": { "message": "Bestuur" }, - "canManage": { - "message": "Can manage" + "manageCollection": { + "message": "Manage collection" + }, + "viewItems": { + "message": "View items" + }, + "viewItemsHidePass": { + "message": "View items, hidden passwords" + }, + "editItems": { + "message": "Edit items" + }, + "editItemsHidePass": { + "message": "Edit items, hidden passwords" }, "disable": { "message": "Deaktiveer" @@ -2368,11 +2410,8 @@ "twoFactorU2fProblemReadingTryAgain": { "message": "There was a problem reading the security key. Try again." }, - "twoFactorWebAuthnWarning": { - "message": "Due to platform limitations, WebAuthn cannot be used on all Bitwarden applications. You should set up another two-step login provider so that you can access your account when WebAuthn cannot be used. Supported platforms:" - }, - "twoFactorWebAuthnSupportWeb": { - "message": "Web vault and browser extensions on a desktop/laptop with a WebAuthn supported browser (Chrome, Opera, Vivaldi, or Firefox with FIDO U2F turned on)." + "twoFactorWebAuthnWarning1": { + "message": "Due to platform limitations, WebAuthn cannot be used on all Bitwarden applications. You should set up another two-step login provider so that you can access your account when WebAuthn cannot be used." }, "twoFactorRecoveryYourCode": { "message": "U herstelkode vir Bitwarden-tweestapaantekening" @@ -4710,9 +4749,6 @@ "passwordGeneratorPolicyDesc": { "message": "Stel minimum vereistes vir opstelling van wagwoordgenereerder." }, - "passwordGeneratorPolicyInEffect": { - "message": "Een of meer organisasiebeleide beïnvloed u genereerderinstellings." - }, "masterPasswordPolicyInEffect": { "message": "Een of meer organisasiebeleide stel die volgende eise aan u hoofwagwoord:" }, @@ -6681,15 +6717,6 @@ "message": "Genereerder", "description": "Short for 'credential generator'." }, - "whatWouldYouLikeToGenerate": { - "message": "Wat wil u genereer?" - }, - "passwordType": { - "message": "Wagwoordtipe" - }, - "regenerateUsername": { - "message": "Hergenereer gebruikersnaam" - }, "generateUsername": { "message": "Genereer gebruikersnaam" }, @@ -6730,9 +6757,6 @@ } } }, - "usernameType": { - "message": "Gebruikersnaamtipe" - }, "plusAddressedEmail": { "message": "E-posadres met plus", "description": "Username generator option that appends a random sub-address to the username. For example: address+subaddress@email.com" @@ -6952,9 +6976,6 @@ "message": "Gasheernaam", "description": "Part of a URL." }, - "apiAccessToken": { - "message": "API-toegangsteken" - }, "deviceVerification": { "message": "Toestelbevestiging" }, @@ -7666,18 +7687,6 @@ "noCollection": { "message": "Geen versameling" }, - "canView": { - "message": "Kan bekyk" - }, - "canViewExceptPass": { - "message": "Kan bekyk, behalwe wagwoorde" - }, - "canEdit": { - "message": "Kan wysig" - }, - "canEditExceptPass": { - "message": "Kan wysig behalwe wagwoorde" - }, "noCollectionsAdded": { "message": "Geen versamelings toegevoeg" }, @@ -8677,9 +8686,6 @@ "message": "Self-host server URL", "description": "Label for field requesting a self-hosted integration service URL" }, - "aliasDomain": { - "message": "Alias domain" - }, "alreadyHaveAccount": { "message": "Already have an account?" }, @@ -8741,11 +8747,11 @@ "readOnlyCollectionAccess": { "message": "You do not have access to manage this collection." }, - "grantAddAccessCollectionWarningTitle": { - "message": "Missing Can Manage Permissions" + "grantManageCollectionWarningTitle": { + "message": "Missing Manage Collection Permissions" }, - "grantAddAccessCollectionWarning": { - "message": "Grant Can manage permissions to allow full collection management including deletion of collection." + "grantManageCollectionWarning": { + "message": "Grant Manage collection permissions to allow full collection management including deletion of collection." }, "grantCollectionAccess": { "message": "Grant groups or members access to this collection." @@ -10091,6 +10097,15 @@ "descriptorCode": { "message": "Descriptor code" }, + "cannotRemoveViewOnlyCollections": { + "message": "You cannot remove collections with View only permissions: $COLLECTIONS$", + "placeholders": { + "collections": { + "content": "$1", + "example": "Work, Personal" + } + } + }, "importantNotice": { "message": "Important notice" }, @@ -10281,5 +10296,54 @@ "example": "Acme c" } } + }, + "accountDeprovisioningNotification": { + "message": "Administrators now have the ability to delete member accounts that belong to a claimed domain." + }, + "deleteManagedUserWarningDesc": { + "message": "This action will delete the member account including all items in their vault. This replaces the previous Remove action." + }, + "deleteManagedUserWarning": { + "message": "Delete is a new action!" + }, + "seatsRemaining": { + "message": "You have $REMAINING$ seats remaining out of $TOTAL$ seats assigned to this organization. Contact your provider to manage your subscription.", + "placeholders": { + "remaining": { + "content": "$1", + "example": "5" + }, + "total": { + "content": "$2", + "example": "10" + } + } + }, + "existingOrganization": { + "message": "Existing organization" + }, + "selectOrganizationProviderPortal": { + "message": "Select an organization to add to your Provider Portal." + }, + "noOrganizations": { + "message": "There are no organizations to list" + }, + "yourProviderSubscriptionCredit": { + "message": "Your provider subscription will receive a credit for any remaining time in the organization's subscription." + }, + "doYouWantToAddThisOrg": { + "message": "Do you want to add this organization to $PROVIDER$?", + "placeholders": { + "provider": { + "content": "$1", + "example": "Cool MSP" + } + } + }, + "addedExistingOrganization": { + "message": "Added existing organization" + }, + "assignedExceedsAvailable": { + "message": "Assigned seats exceed available seats." } } diff --git a/apps/web/src/locales/ar/messages.json b/apps/web/src/locales/ar/messages.json index 78536d62d2c..7cd5b2eef01 100644 --- a/apps/web/src/locales/ar/messages.json +++ b/apps/web/src/locales/ar/messages.json @@ -1,6 +1,6 @@ { "allApplications": { - "message": "All applications" + "message": "كل التطبيقات" }, "criticalApplications": { "message": "Critical applications" @@ -96,19 +96,19 @@ "message": "Apps marked as critical" }, "application": { - "message": "Application" + "message": "تطبيق" }, "atRiskPasswords": { "message": "At-risk passwords" }, "requestPasswordChange": { - "message": "Request password change" + "message": "طلب تغيير كلمة المرور" }, "totalPasswords": { "message": "Total passwords" }, "searchApps": { - "message": "Search applications" + "message": "البحث في التطبيقات" }, "atRiskMembers": { "message": "At-risk members" @@ -147,7 +147,7 @@ } }, "totalMembers": { - "message": "Total members" + "message": "إجمالي الأعضاء" }, "atRiskApplications": { "message": "At-risk applications" @@ -199,7 +199,7 @@ "message": "ملاحظات" }, "note": { - "message": "Note" + "message": "ملاحظة" }, "customFields": { "message": "حقول مخصصة" @@ -208,19 +208,19 @@ "message": "اسم حامل البطاقة" }, "loginCredentials": { - "message": "Login credentials" + "message": "معلومات الدخول" }, "personalDetails": { - "message": "Personal details" + "message": "البيانات الشخصية" }, "identification": { - "message": "Identification" + "message": "التعريف" }, "contactInfo": { - "message": "Contact info" + "message": "معلومات الاتصال" }, "cardDetails": { - "message": "Card details" + "message": "بيانات البطاقة" }, "cardBrandDetails": { "message": "$BRAND$ details", @@ -232,13 +232,13 @@ } }, "itemHistory": { - "message": "Item history" + "message": "تاريخ العنصر" }, "authenticatorKey": { - "message": "Authenticator key" + "message": "مفتاح المصادقة" }, "autofillOptions": { - "message": "Autofill options" + "message": "خيارات الملء التلقائي" }, "websiteUri": { "message": "Website (URI)" @@ -432,17 +432,17 @@ "message": "قيمة منطقية" }, "cfTypeCheckbox": { - "message": "Checkbox" + "message": "مربع اختيار" }, "cfTypeLinked": { "message": "مرتبط", "description": "This describes a field that is 'linked' (related) to another field." }, "fieldType": { - "message": "Field type" + "message": "نوع الحقل" }, "fieldLabel": { - "message": "Field label" + "message": "اسم الحقل" }, "remove": { "message": "إزالة" @@ -455,7 +455,7 @@ "description": "This is the folder for uncategorized items" }, "selfOwnershipLabel": { - "message": "You", + "message": "أنت", "description": "Used as a label to indicate that the user is the owner of an item." }, "addFolder": { @@ -464,6 +464,18 @@ "editFolder": { "message": "تعديل المجلد" }, + "newFolder": { + "message": "مجلد جديد" + }, + "folderName": { + "message": "اسم المجلد" + }, + "folderHintText": { + "message": "Nest a folder by adding the parent folder's name followed by a “/”. Example: Social/Forums" + }, + "deleteFolderPermanently": { + "message": "هل أنت متأكد من أنك تريد حذف هذا المجلد بشكل دائم؟" + }, "baseDomain": { "message": "النطاق الأساسي", "description": "Domain name. Example: website.com" @@ -508,7 +520,7 @@ "message": "توليد كلمة مرور" }, "generatePassphrase": { - "message": "Generate passphrase" + "message": "توليد عبارة مرور" }, "checkPassword": { "message": "تحقق مما إذا تم الكشف عن كلمة المرور." @@ -611,7 +623,7 @@ "message": "ملاحظة سرية" }, "typeSshKey": { - "message": "SSH key" + "message": "مفتاح بروتوكول النقل الآمن" }, "typeLoginPlural": { "message": "تسجيلات الدخول" @@ -644,7 +656,7 @@ "message": "الاسم الكامل" }, "address": { - "message": "Address" + "message": "العنوان" }, "address1": { "message": "العنوان 1" @@ -723,19 +735,10 @@ "message": "عنصر" }, "itemDetails": { - "message": "Item details" + "message": "تفاصيل العنصر" }, "itemName": { - "message": "Item name" - }, - "cannotRemoveViewOnlyCollections": { - "message": "You cannot remove collections with View only permissions: $COLLECTIONS$", - "placeholders": { - "collections": { - "content": "$1", - "example": "Work, Personal" - } - } + "message": "اسم العنصر" }, "ex": { "message": "مثال.", @@ -761,7 +764,7 @@ } }, "copySuccessful": { - "message": "Copy Successful" + "message": "تم النسخ بنجاح" }, "copyValue": { "message": "نسخ القيمة", @@ -772,11 +775,11 @@ "description": "Copy password to clipboard" }, "copyPassphrase": { - "message": "Copy passphrase", + "message": "نسخ عبارة المرور", "description": "Copy passphrase to clipboard" }, "passwordCopied": { - "message": "Password copied" + "message": "تم نسخ كلمة المرور" }, "copyUsername": { "message": "نسخ اسم المستخدم", @@ -795,7 +798,7 @@ "description": "Copy URI to clipboard" }, "copyCustomField": { - "message": "Copy $FIELD$", + "message": "نسخ $FIELD$", "placeholders": { "field": { "content": "$1", @@ -804,34 +807,34 @@ } }, "copyWebsite": { - "message": "Copy website" + "message": "نسخ الموقع الإلكتروني" }, "copyNotes": { - "message": "Copy notes" + "message": "نسخ الملاحظات" }, "copyAddress": { - "message": "Copy address" + "message": "نسخ العنوان" }, "copyPhone": { "message": "Copy phone" }, "copyEmail": { - "message": "Copy email" + "message": "نسخ البريد الإلكتروني" }, "copyCompany": { - "message": "Copy company" + "message": "نسخ الشركة" }, "copySSN": { - "message": "Copy Social Security number" + "message": "نسخ رقم الضمان الاجتماعي" }, "copyPassportNumber": { - "message": "Copy passport number" + "message": "نسخ رقم جواز السفر" }, "copyLicenseNumber": { - "message": "Copy license number" + "message": "نسخ رقم الرخصة" }, "copyName": { - "message": "Copy name" + "message": "نسخ الاسم" }, "me": { "message": "أنا" @@ -991,22 +994,22 @@ "message": "تم تسجيل الخروج" }, "loggedOutDesc": { - "message": "You have been logged out of your account." + "message": "لقد تم تسجيل خروجك من الحساب." }, "loginExpired": { "message": "انتهت صَلاحِيَة جَلسة الدخول." }, "restartRegistration": { - "message": "Restart registration" + "message": "إعادة التسجيل" }, "expiredLink": { - "message": "Expired link" + "message": "رابط منتهي الصلاحية" }, "pleaseRestartRegistrationOrTryLoggingIn": { - "message": "Please restart registration or try logging in." + "message": "الرجاء إعادة تشغيل التسجيل أو محاولة تسجيل الدخول." }, "youMayAlreadyHaveAnAccount": { - "message": "You may already have an account" + "message": "قد يكون لديك حساب بالفعل" }, "logOutConfirmation": { "message": "هل أنت متأكد من أنك تريد تسجيل الخروج؟" @@ -1033,7 +1036,7 @@ "message": "تسجيل الدخول باستخدام الجهاز يجب أن يتم إعداده في إعدادات تطبيق Bitwarden. هل تحتاج إلى خيار آخر؟" }, "needAnotherOptionV1": { - "message": "Need another option?" + "message": "هل تحتاج إلى خيار آخر؟" }, "loginWithMasterPassword": { "message": "تسجيل الدخول باستخدام كلمة المرور الرئيسية" @@ -1048,13 +1051,13 @@ "message": "استخدم طريقة أخرى للولوج" }, "logInWithPasskey": { - "message": "Log in with passkey" + "message": "تسجيل الدخول باستخدام مفتاح المرور" }, "useSingleSignOn": { "message": "Use single sign-on" }, "welcomeBack": { - "message": "Welcome back" + "message": "مرحباً بعودتك" }, "invalidPasskeyPleaseTryAgain": { "message": "مفتاح المرور غير صالح. الرجاء المحاولة مرة أخرى." @@ -1078,13 +1081,13 @@ "message": "Keep this window open and follow prompts from your browser." }, "errorCreatingPasskey": { - "message": "Error creating passkey" + "message": "خطأ في إنشاء مفتاح المرور" }, "errorCreatingPasskeyInfo": { "message": "There was a problem creating your passkey." }, "passkeySuccessfullyCreated": { - "message": "Passkey successfully created!" + "message": "تم إنشاء مفتاح المرور بنجاح!" }, "customPasskeyNameInfo": { "message": "Name your passkey to help you identify it." @@ -1132,16 +1135,16 @@ "message": "Passkey limit reached. Remove a passkey to add another." }, "tryAgain": { - "message": "Try again" + "message": "حاول مرة أخرى" }, "createAccount": { "message": "إنشاء حساب" }, "newToBitwarden": { - "message": "New to Bitwarden?" + "message": "هل أنت جديد في بيتواردن؟" }, "setAStrongPassword": { - "message": "Set a strong password" + "message": "تعيين كلمة مرور قوية" }, "finishCreatingYourAccountBySettingAPassword": { "message": "Finish creating your account by setting a password" @@ -1156,16 +1159,16 @@ "message": "تسجيل الدخول" }, "logInToBitwarden": { - "message": "Log in to Bitwarden" + "message": "تسجيل الدخول إلى بيتواردن" }, "authenticationTimeout": { - "message": "Authentication timeout" + "message": "مهلة المصادقة" }, "authenticationSessionTimedOut": { "message": "The authentication session timed out. Please restart the login process." }, "verifyIdentity": { - "message": "Verify your Identity" + "message": "قم بتأكيد هويتك" }, "weDontRecognizeThisDevice": { "message": "We don't recognize this device. Enter the code sent to your email to verify your identity." @@ -1182,6 +1185,9 @@ "logInInitiated": { "message": "بَدْء تسجيل الدخول" }, + "logInRequestSent": { + "message": "تم إرسال الطلب" + }, "submit": { "message": "قدِّم" }, @@ -1235,7 +1241,7 @@ "message": "الإعدادات" }, "accountEmail": { - "message": "Account email" + "message": "البريد الإلكتروني للحساب" }, "requestHint": { "message": "Request hint" @@ -1287,7 +1293,7 @@ "message": "Your new account has been created!" }, "youHaveBeenLoggedIn": { - "message": "You have been logged in!" + "message": "لقد قمت بتسجيل الدخول!" }, "trialAccountCreated": { "message": "تم إنشاء الحساب بنجاح." @@ -1371,12 +1377,39 @@ "notificationSentDevice": { "message": "تم إرسال إشعار إلى جهازك." }, + "notificationSentDevicePart1": { + "message": "Unlock Bitwarden on your device or on the " + }, + "areYouTryingToAccessYourAccount": { + "message": "هل تحاول الوصول إلى حسابك؟" + }, + "accessAttemptBy": { + "message": "محاولة تسجيل الدخول بواسطة $EMAIL$", + "placeholders": { + "email": { + "content": "$1", + "example": "name@example.com" + } + } + }, + "confirmAccess": { + "message": "تأكيد الوصول" + }, + "denyAccess": { + "message": "Deny access" + }, + "notificationSentDeviceAnchor": { + "message": "web app" + }, + "notificationSentDevicePart2": { + "message": "Make sure the Fingerprint phrase matches the one below before approving." + }, + "notificationSentDeviceComplete": { + "message": "Unlock Bitwarden on your device. Make sure the Fingerprint phrase matches the one below before approving." + }, "aNotificationWasSentToYourDevice": { "message": "A notification was sent to your device" }, - "makeSureYourAccountIsUnlockedAndTheFingerprintEtc": { - "message": "Make sure your account is unlocked and the fingerprint phrase matches on the other device" - }, "versionNumber": { "message": "الإصدار $VERSION_NUMBER$", "placeholders": { @@ -1414,7 +1447,7 @@ "message": "إرسال رمز التحقق إلى البريد الإلكتروني مرة أخرى" }, "useAnotherTwoStepMethod": { - "message": "Use another two-step login method" + "message": "استخدام طريقة أخرى لتسجيل الدخول بخطوتين" }, "insertYubiKey": { "message": "Insert your YubiKey into your computer's USB port, then touch its button." @@ -1468,7 +1501,7 @@ "message": "FIDO U2F security a key" }, "webAuthnTitle": { - "message": "Passkey" + "message": "مفتاح المرور" }, "webAuthnDesc": { "message": "Use your device's biometrics or a FIDO2 compatible security key." @@ -1480,7 +1513,7 @@ "message": "البريد الإلكتروني" }, "emailDescV2": { - "message": "Enter a code sent to your email." + "message": "أدخل الرمز الذي تم إرساله إلى بريدك الإلكتروني." }, "continue": { "message": "استمرار" @@ -1587,7 +1620,7 @@ "message": "تصدير" }, "exportFrom": { - "message": "Export from" + "message": "التصدير من" }, "exportVault": { "message": "تصدير الخزانة" @@ -1611,10 +1644,10 @@ "message": "تأكيد التنسيق" }, "filePassword": { - "message": "File password" + "message": "كلمة مرور الملف" }, "confirmFilePassword": { - "message": "Confirm file password" + "message": "تأكيد كلمة مرور الملف" }, "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." @@ -1626,7 +1659,7 @@ "message": "نوع التصدير" }, "accountRestricted": { - "message": "Account restricted" + "message": "تم تقييد الحساب" }, "passwordProtected": { "message": "Password protected" @@ -1664,38 +1697,35 @@ "message": "Avoid ambiguous characters", "description": "Label for the avoid ambiguous characters checkbox." }, - "regeneratePassword": { - "message": "إعادة توليد كلمة المرور" - }, "length": { "message": "الطول" }, "passwordMinLength": { - "message": "Minimum password length" + "message": "الحد الأدنى لطول كلمة المرور" }, "uppercase": { - "message": "Uppercase (A-Z)", + "message": "أحرف كبيرة (من A إلى Z)", "description": "deprecated. Use uppercaseLabel instead." }, "lowercase": { - "message": "Lowercase (a-z)", + "message": "أحرف صغيرة (من a إلى z)", "description": "deprecated. Use lowercaseLabel instead." }, "numbers": { - "message": "Numbers (0-9)", + "message": "أرقام (من 0 إلى 9)", "description": "deprecated. Use numbersLabel instead." }, "specialCharacters": { - "message": "Special characters (!@#$%^&*)" + "message": "أحرف خاصة (!@#$%^&*)" }, "numWords": { "message": "عدد الكلمات" }, "wordSeparator": { - "message": "Word separator" + "message": "فاصل الكلمات" }, "capitalize": { - "message": "Capitalize", + "message": "كبِّر الحروف", "description": "Make the first letter of a word uppercase." }, "includeNumber": { @@ -1709,7 +1739,7 @@ "message": "سجل كلمات المرور" }, "generatorHistory": { - "message": "Generator history" + "message": "سجل المولد" }, "clearGeneratorHistoryTitle": { "message": "Clear generator history" @@ -1718,16 +1748,16 @@ "message": "If you continue, all entries will be permanently deleted from generator's history. Are you sure you want to continue?" }, "noPasswordsInList": { - "message": "There are no passwords to list." + "message": "لا توجد كلمات مرور للعرض." }, "clearHistory": { - "message": "Clear history" + "message": "مسح السجل" }, "nothingToShow": { - "message": "Nothing to show" + "message": "لا يوجد شيء لعرضه" }, "nothingGeneratedRecently": { - "message": "You haven't generated anything recently" + "message": "لم تقم بتوليد أي شيء مؤخراً" }, "clear": { "message": "مسح", @@ -1767,10 +1797,10 @@ "message": "الرجاء تسجيل الدخول مرة أخرى." }, "currentSession": { - "message": "Current session" + "message": "الجلسة الحالية" }, "requestPending": { - "message": "Request pending" + "message": "الطلب معلًق" }, "logBackInOthersToo": { "message": "Please log back in. If you are using other Bitwarden applications log out and back in to those as well." @@ -1849,7 +1879,7 @@ "message": "Proceeding will also log you out of your current session, requiring you to log back in. You will also be prompted for two-step login again, if set up. Active sessions on other devices may continue to remain active for up to one hour." }, "newDeviceLoginProtection": { - "message": "New device login" + "message": "تسجيل الدخول لجهاز جديد" }, "turnOffNewDeviceLoginProtection": { "message": "Turn off new device login protection" @@ -1909,13 +1939,13 @@ "message": "Proceed below to delete your account and all vault data." }, "deleteAccountWarning": { - "message": "Deleting your account is permanent. It cannot be undone." + "message": "حذف حسابك بشكل نهائي. لا يمكن التراجع عنه." }, "accountDeleted": { - "message": "Account deleted" + "message": "تم حذف الحساب" }, "accountDeletedDesc": { - "message": "Your account has been closed and all associated data has been deleted." + "message": "لقد تم إغلاق حسابك وتم حذف جميع البيانات المرتبطة به." }, "deleteOrganizationWarning": { "message": "Deleting your organization is permanent. It cannot be undone." @@ -1934,11 +1964,11 @@ "description": "This will be part of a larger sentence, that will read like this: If you don't have any data to import, you can create a new item instead. (Optional second half: You may need to wait until your administrator confirms your organization membership.)" }, "onboardingImportDataDetailsLink": { - "message": "new item", + "message": "عنصر جديد", "description": "This will be part of a larger sentence, that will read like this: If you don't have any data to import, you can create a new item instead. (Optional second half: You may need to wait until your administrator confirms your organization membership.)" }, "onboardingImportDataDetailsLoginLink": { - "message": "new login", + "message": "تسجيل دخول جديد", "description": "This will be part of a larger sentence, that will read like this: If you don't have any data to import, you can create a new login instead. (Optional second half: You may need to wait until your administrator confirms your organization membership.)" }, "onboardingImportDataDetailsPartTwoNoOrgs": { @@ -1983,22 +2013,22 @@ "message": "Data is not formatted correctly. Please check your import file and try again." }, "importNothingError": { - "message": "Nothing was imported." + "message": "لم يتم استيراد أي شيء." }, "importEncKeyError": { "message": "Error decrypting the exported file. Your encryption key does not match the encryption key used export the data." }, "destination": { - "message": "Destination" + "message": "الوجهة" }, "learnAboutImportOptions": { "message": "Learn about your import options" }, "selectImportFolder": { - "message": "Select a folder" + "message": "تحديد المجلد" }, "selectImportCollection": { - "message": "Select a collection" + "message": "اختر مجموعة" }, "importTargetHint": { "message": "Select this option if you want the imported file contents moved to a $DESTINATION$", @@ -2023,13 +2053,13 @@ "message": "اختيار ملف" }, "noFileChosen": { - "message": "No file chosen" + "message": "لم يتم اختيار ملف" }, "orCopyPasteFileContents": { "message": "او قم بنسخ ولصق محتويات مِلَفّ الاستيراد" }, "instructionsFor": { - "message": "$NAME$ Instructions", + "message": "تعليمات $NAME$", "description": "The title for the import tool instructions.", "placeholders": { "name": { @@ -2048,7 +2078,7 @@ "message": "تخصيص تجرِبة خزانة الويب الخاصة بك." }, "preferencesUpdated": { - "message": "Preferences saved" + "message": "تم حفظ التفضيلات" }, "language": { "message": "اللّغة" @@ -2063,7 +2093,7 @@ "message": "Show a recognizable image next to each login." }, "default": { - "message": "Default" + "message": "الافتراضي" }, "domainRules": { "message": "قواعد النطاق" @@ -2078,13 +2108,13 @@ "message": "Custom equivalent domains" }, "exclude": { - "message": "Exclude" + "message": "استثناء" }, "include": { - "message": "Include" + "message": "تضمين" }, "customize": { - "message": "Customize" + "message": "تخصيص" }, "newCustomDomain": { "message": "New custom domain" @@ -2136,17 +2166,17 @@ "message": "View recovery code" }, "providers": { - "message": "Providers", + "message": "المزودون", "description": "Two-step login providers such as YubiKey, Duo, Authenticator apps, Email, etc." }, "enable": { - "message": "Turn on" + "message": "تفعيل" }, "enabled": { - "message": "Turned on" + "message": "تم التفعيل" }, "restoreAccess": { - "message": "Restore access" + "message": "استعادة الوصول" }, "premium": { "message": "بريميوم", @@ -2170,14 +2200,26 @@ "manage": { "message": "إدارة" }, - "canManage": { - "message": "Can manage" + "manageCollection": { + "message": "Manage collection" + }, + "viewItems": { + "message": "عرض العناصر" + }, + "viewItemsHidePass": { + "message": "View items, hidden passwords" + }, + "editItems": { + "message": "تعديل العناصر" + }, + "editItemsHidePass": { + "message": "Edit items, hidden passwords" }, "disable": { - "message": "Turn off" + "message": "إيقاف" }, "revokeAccess": { - "message": "Revoke access" + "message": "إلغاء الوصول" }, "twoStepLoginProviderEnabled": { "message": "This two-step login provider is active on your account." @@ -2189,16 +2231,16 @@ "message": "Download an authenticator app such as" }, "twoStepAuthenticatorInstructionInfix1": { - "message": "," + "message": "،" }, "twoStepAuthenticatorInstructionInfix2": { - "message": "or" + "message": "أو" }, "twoStepAuthenticatorInstructionSuffix": { "message": "." }, "continueToExternalUrlTitle": { - "message": "Continue to $URL$?", + "message": "هل تريد المتابعة إلى $URL$؟", "placeholders": { "url": { "content": "$1", @@ -2210,7 +2252,7 @@ "message": "You are leaving Bitwarden and launching an external website in a new window." }, "twoStepContinueToBitwardenUrlTitle": { - "message": "Continue to bitwarden.com?" + "message": "هل تريد المتابعة إلى bitwarden.com؟" }, "twoStepContinueToBitwardenUrlDesc": { "message": "Bitwarden Authenticator allows you to store authenticator keys and generate TOTP codes for 2-step verification flows. Learn more on the bitwarden.com website." @@ -2222,10 +2264,10 @@ "message": "Could not load QR code. Try again or use the key below." }, "key": { - "message": "Key" + "message": "المفتاح" }, "twoStepAuthenticatorEnterCodeV2": { - "message": "Verification code" + "message": "رمز التحقق" }, "twoStepAuthenticatorReaddDesc": { "message": "In case you need to add it to another device, below is the QR code (or key) required by your authenticator app." @@ -2249,7 +2291,7 @@ "message": "Touch the YubiKey's button." }, "twoFactorYubikeySaveForm": { - "message": "Save the form." + "message": "حفظ النموذج." }, "twoFactorYubikeyWarning": { "message": "Due to platform limitations, YubiKeys cannot be used on all Bitwarden applications. You should set up another two-step login provider so that you can access your account when YubiKeys cannot be used. Supported platforms:" @@ -2306,7 +2348,7 @@ "message": "Enter the Bitwarden application information from your Duo Admin panel." }, "twoFactorDuoClientId": { - "message": "Client Id" + "message": "معرّف العميل" }, "twoFactorDuoClientSecret": { "message": "Client Secret" @@ -2351,7 +2393,7 @@ "message": "If the security key has a button, touch it." }, "twoFactorU2fSaveForm": { - "message": "Save the form." + "message": "حفظ النموذج." }, "twoFactorU2fWarning": { "message": "Due to platform limitations, FIDO U2F cannot be used on all Bitwarden applications. You should set up another two-step login provider so that you can access your account when FIDO U2F cannot be used. Supported platforms:" @@ -2368,11 +2410,8 @@ "twoFactorU2fProblemReadingTryAgain": { "message": "There was a problem reading the security key. Try again." }, - "twoFactorWebAuthnWarning": { - "message": "Due to platform limitations, WebAuthn cannot be used on all Bitwarden applications. You should set up another two-step login provider so that you can access your account when WebAuthn cannot be used. Supported platforms:" - }, - "twoFactorWebAuthnSupportWeb": { - "message": "Web vault and browser extensions on a desktop/laptop with a WebAuthn supported browser (Chrome, Opera, Vivaldi, or Firefox with FIDO U2F turned on)." + "twoFactorWebAuthnWarning1": { + "message": "Due to platform limitations, WebAuthn cannot be used on all Bitwarden applications. You should set up another two-step login provider so that you can access your account when WebAuthn cannot be used." }, "twoFactorRecoveryYourCode": { "message": "Your Bitwarden two-step login recovery code" @@ -2381,7 +2420,7 @@ "message": "You have not set up any two-step login providers yet. After you have set up a two-step login provider you can check back here for your recovery code." }, "printCode": { - "message": "Print code", + "message": "طباعة الرمز", "description": "Print 2FA recovery code" }, "reports": { @@ -2396,13 +2435,13 @@ "description": "Vault health reports can be used to evaluate the security of your Bitwarden individual or organization vault." }, "unsecuredWebsitesReport": { - "message": "Unsecure websites" + "message": "مواقع الويب غير الآمنة" }, "unsecuredWebsitesReportDesc": { "message": "URLs that start with http:// don’t use the best available encryption. Change the login URIs for these accounts to https:// for safer browsing." }, "unsecuredWebsitesFound": { - "message": "Unsecured websites found" + "message": "تم العثور على مواقع ويب غير آمنة" }, "unsecuredWebsitesFoundReportDesc": { "message": "We found $COUNT$ items in your $VAULT$ with unsecured URIs. You should change their URI scheme to https:// if the website allows it.", @@ -2446,7 +2485,7 @@ "message": "No websites were found in your vault with a missing two-step login configuration." }, "instructions": { - "message": "Instructions" + "message": "التعليمات" }, "exposedPasswordsReport": { "message": "Exposed passwords" @@ -2489,13 +2528,13 @@ } }, "weakPasswordsReport": { - "message": "Weak passwords" + "message": "كلمات المرور الضعيفة" }, "weakPasswordsReportDesc": { "message": "Weak passwords can be easily guessed by attackers. Change these passwords to strong ones using the password generator." }, "weakPasswordsFound": { - "message": "Weak passwords found" + "message": "تم العثور على كلمات مرور ضعيفة" }, "weakPasswordsFoundReportDesc": { "message": "We found $COUNT$ items in your $VAULT$ with passwords that are not strong. You should update them to use stronger passwords.", @@ -2542,10 +2581,10 @@ "message": "No logins in your vault have passwords that are being reused." }, "timesReused": { - "message": "Times reused" + "message": "عدد مرات إعادة الاستخدام" }, "reusedXTimes": { - "message": "Reused $COUNT$ times", + "message": "تمت إعادة الاستخدام $COUNT$ مرة", "placeholders": { "count": { "content": "$1", @@ -2575,7 +2614,7 @@ } }, "goodNews": { - "message": "Good news", + "message": "أخبار جيدة!", "description": "ex. Good News, No Breached Accounts Found!" }, "breachUsernameFound": { @@ -2601,7 +2640,7 @@ "message": "موقع الويب" }, "affectedUsers": { - "message": "Affected users" + "message": "المستخدمون المتأثرون" }, "breachOccurred": { "message": "Breach occurred" @@ -2613,24 +2652,24 @@ "message": "An error occurred trying to load the report. Try again" }, "billing": { - "message": "Billing" + "message": "الفوترة" }, "billingPlanLabel": { - "message": "Billing plan" + "message": "خطة الفوترة" }, "paymentType": { - "message": "Payment type" + "message": "طريقة الدفع" }, "accountCredit": { "message": "Account credit", "description": "Financial term. In the case of Bitwarden, a positive balance means that you owe money, while a negative balance means that you have a credit (Bitwarden owes you money)." }, "accountBalance": { - "message": "Account balance", + "message": "رصيد الحساب", "description": "Financial term. In the case of Bitwarden, a positive balance means that you owe money, while a negative balance means that you have a credit (Bitwarden owes you money)." }, "addCredit": { - "message": "Add credit", + "message": "إضافة رصيد", "description": "Add more credit to your account's balance." }, "amount": { @@ -2703,10 +2742,10 @@ "message": "Bitwarden Families plan." }, "addons": { - "message": "Add-ons" + "message": "الإضافات" }, "premiumAccess": { - "message": "Premium access" + "message": "الوصول المميز" }, "premiumAccessDesc": { "message": "You can add Premium access to all members of your organization for $PRICE$ /$INTERVAL$.", @@ -2754,13 +2793,13 @@ "message": "سنة" }, "yr": { - "message": "yr" + "message": "سنة" }, "month": { "message": "شهر" }, "monthAbbr": { - "message": "mo.", + "message": "شهر", "description": "Short abbreviation for 'month'" }, "paymentChargedAnnually": { @@ -2782,10 +2821,10 @@ "message": "Your plan comes with a free 7 day trial. Your payment method will not be charged until the trial has ended. You may cancel at any time." }, "paymentInformation": { - "message": "Payment information" + "message": "معلومات الدفع" }, "billingInformation": { - "message": "Billing information" + "message": "معلومات الفوترة" }, "billingTrialSubLabel": { "message": "Your payment method will not be charged during the 7 day free trial." @@ -2797,13 +2836,13 @@ "message": "Select the PayPal button to log into your PayPal account, then click the Submit button below to continue." }, "cancelSubscription": { - "message": "Cancel subscription" + "message": "إلغاء الاشتراك" }, "subscriptionExpiration": { - "message": "Subscription expiration" + "message": "تاريخ انتهاء الاشتراك" }, "subscriptionCanceled": { - "message": "The subscription has been canceled." + "message": "تم إلغاء الاشتراك." }, "pendingCancellation": { "message": "Pending cancellation" @@ -2824,40 +2863,40 @@ "message": "Are you sure you want to cancel? You will lose access to all of this subscription's features at the end of this billing cycle." }, "canceledSubscription": { - "message": "Subscription canceled" + "message": "تم إلغاء الإشتراك" }, "neverExpires": { - "message": "Never expires" + "message": "صلاحية غير محدودة" }, "status": { - "message": "Status" + "message": "الحالة" }, "nextCharge": { - "message": "Next charge" + "message": "الدفعة القادمة" }, "details": { "message": "التفاصيل" }, "downloadLicense": { - "message": "Download license" + "message": "تنزيل الرخصة" }, "viewBillingToken": { "message": "View Billing Token" }, "updateLicense": { - "message": "Update license" + "message": "تحديث الرخصة" }, "manageSubscription": { - "message": "Manage subscription" + "message": "إدارة الاشتراك" }, "launchCloudSubscription": { "message": "Launch Cloud Subscription" }, "storage": { - "message": "Storage" + "message": "مساحة التخزين" }, "addStorage": { - "message": "Add storage" + "message": "إضافة مساحة تخزين" }, "removeStorage": { "message": "Remove storage" @@ -2876,47 +2915,47 @@ } }, "paymentMethod": { - "message": "Payment method" + "message": "طريقة الدفع" }, "noPaymentMethod": { "message": "No payment method on file." }, "addPaymentMethod": { - "message": "Add payment method" + "message": "إضافة طريقة دفع" }, "changePaymentMethod": { - "message": "Change payment method" + "message": "تغيير طريقة الدفع" }, "invoices": { - "message": "Invoices" + "message": "الفواتير" }, "noUnpaidInvoices": { - "message": "No unpaid invoices." + "message": "لا يوجد فواتير غير مدفوعة." }, "noPaidInvoices": { - "message": "No paid invoices." + "message": "لا يوجد فواتير مدفوعة." }, "paid": { - "message": "Paid", + "message": "مدفوع", "description": "Past tense status of an invoice. ex. Paid or unpaid." }, "unpaid": { - "message": "Unpaid", + "message": "غير مدفوع", "description": "Past tense status of an invoice. ex. Paid or unpaid." }, "transactions": { - "message": "Transactions", + "message": "الحركات المالية", "description": "Payment/credit transactions." }, "noTransactions": { - "message": "No transactions." + "message": "لا يوجد حركات مالية." }, "chargeNoun": { "message": "Charge", "description": "Noun. A charge from a payment method." }, "refundNoun": { - "message": "Refund", + "message": "استرداد مالي", "description": "Noun. A refunded payment that was charged." }, "chargesStatement": { @@ -2953,7 +2992,7 @@ "message": "Contact customer support" }, "contactSupportShort": { - "message": "Contact Support" + "message": "الاتصال بالدعم الفني" }, "updatedPaymentMethod": { "message": "Updated payment method." @@ -2998,7 +3037,7 @@ "message": "البريد الإلكتروني للفوترة" }, "businessName": { - "message": "Business name" + "message": "الاسم التجاري" }, "chooseYourPlan": { "message": "اختر خِطَّة اشتراكك" @@ -3045,7 +3084,7 @@ } }, "planNameFamilies": { - "message": "Families" + "message": "العائلات" }, "planDescFamilies": { "message": "For personal use, to share with family & friends." @@ -3078,7 +3117,7 @@ } }, "additionalUsers": { - "message": "Additional users" + "message": "مستخدمين إضافيين" }, "costPerUser": { "message": "$COST$ per user", @@ -3195,13 +3234,13 @@ "message": "شهريا" }, "annually": { - "message": "Annually" + "message": "سنويّاً" }, "annual": { - "message": "Annual" + "message": "سنوي" }, "basePrice": { - "message": "Base price" + "message": "السعر الأساسي" }, "organizationCreated": { "message": "Organization created" @@ -3213,7 +3252,7 @@ "message": "Organization upgraded" }, "leave": { - "message": "Leave" + "message": "خروج" }, "leaveOrganizationConfirmation": { "message": "Are you sure you want to leave this organization?" @@ -3297,25 +3336,25 @@ "message": "Access control" }, "readOnly": { - "message": "Read only" + "message": "للقراءة فقط" }, "newCollection": { - "message": "New collection" + "message": "مجموعة جديدة" }, "addCollection": { - "message": "Add collection" + "message": "إضافة مجموعة" }, "editCollection": { - "message": "Edit collection" + "message": "تعديل المجموعة" }, "collectionInfo": { - "message": "Collection info" + "message": "بيانات المجموعة" }, "deleteCollectionConfirmation": { - "message": "Are you sure you want to delete this collection?" + "message": "هل أنت متأكد من أنك تريد حذف هذه المجموعة؟" }, "editMember": { - "message": "Edit member" + "message": "تعديل العضو" }, "fieldOnTabRequiresAttention": { "message": "A field on the '$TAB$' tab requires your attention.", @@ -3339,10 +3378,10 @@ } }, "inviteSingleEmailDesc": { - "message": "You have 1 invite remaining." + "message": "تبقى لك دعوة واحدة." }, "inviteZeroEmailDesc": { - "message": "You have 0 invites remaining." + "message": "لم يتبق لك أي دعوات." }, "userUsingTwoStep": { "message": "This user is using two-step login to protect their account." @@ -3399,10 +3438,10 @@ "message": "Event" }, "unknown": { - "message": "Unknown" + "message": "مجهول" }, "loadMore": { - "message": "Load more" + "message": "تحميل المزيد" }, "mobile": { "message": "Mobile", @@ -3459,7 +3498,7 @@ "message": "Incorrect PIN" }, "pin": { - "message": "PIN", + "message": "رقم التعريف الشخصي", "description": "PIN code. Ex. The short code (often numeric) that you use to unlock a device." }, "exportedVault": { @@ -3631,10 +3670,10 @@ } }, "deletedCollections": { - "message": "Deleted collections" + "message": "المجموعات المحذوفة" }, "deletedCollectionId": { - "message": "Deleted collection $ID$.", + "message": "المجموعة المحذوفة $ID$.", "placeholders": { "id": { "content": "$1", @@ -3932,13 +3971,13 @@ "message": "No email?" }, "goBack": { - "message": "Go back" + "message": "الرجوع إلى الخلف" }, "toEditYourEmailAddress": { "message": "to edit your email address." }, "view": { - "message": "View" + "message": "عرض" }, "invalidDateRange": { "message": "Invalid date range." @@ -3947,10 +3986,10 @@ "message": "لقد حدث خطأ." }, "userAccess": { - "message": "User access" + "message": "وصول المستخدم" }, "userType": { - "message": "User type" + "message": "نوع المستخدم" }, "groupAccess": { "message": "Group access" @@ -3965,7 +4004,7 @@ "message": "Resend invitation" }, "resendEmail": { - "message": "Resend email" + "message": "إعادة إرسال البريد الإلكتروني" }, "hasBeenReinvited": { "message": "$USER$ reinvited", @@ -3977,10 +4016,10 @@ } }, "confirm": { - "message": "Confirm" + "message": "تأكيد" }, "confirmUser": { - "message": "Confirm user" + "message": "تأكيد المستخدم" }, "hasBeenConfirmed": { "message": "$USER$ confirmed.", @@ -3992,7 +4031,7 @@ } }, "confirmUsers": { - "message": "Confirm members" + "message": "تأكيد الأعضاء" }, "usersNeedConfirmed": { "message": "You have members that have accepted their invitation, but still need to be confirmed. Members will not have access to the organization until they are confirmed." @@ -4710,9 +4749,6 @@ "passwordGeneratorPolicyDesc": { "message": "Set requirements for password generator." }, - "passwordGeneratorPolicyInEffect": { - "message": "One or more organization policies are affecting your generator settings." - }, "masterPasswordPolicyInEffect": { "message": "One or more organization policies require your master password to meet the following requirements:" }, @@ -6681,15 +6717,6 @@ "message": "المولّد", "description": "Short for 'credential generator'." }, - "whatWouldYouLikeToGenerate": { - "message": "ما الذي ترغب في توليده؟" - }, - "passwordType": { - "message": "نوع كلمة المرور" - }, - "regenerateUsername": { - "message": "إعادة توليد اسم المستخدم" - }, "generateUsername": { "message": "Generate username" }, @@ -6730,9 +6757,6 @@ } } }, - "usernameType": { - "message": "Username type" - }, "plusAddressedEmail": { "message": "Plus addressed email", "description": "Username generator option that appends a random sub-address to the username. For example: address+subaddress@email.com" @@ -6952,9 +6976,6 @@ "message": "اسم المضيف", "description": "Part of a URL." }, - "apiAccessToken": { - "message": "API access token" - }, "deviceVerification": { "message": "Device verification" }, @@ -7666,18 +7687,6 @@ "noCollection": { "message": "No collection" }, - "canView": { - "message": "Can view" - }, - "canViewExceptPass": { - "message": "Can view, except passwords" - }, - "canEdit": { - "message": "Can edit" - }, - "canEditExceptPass": { - "message": "Can edit, except passwords" - }, "noCollectionsAdded": { "message": "No collections added" }, @@ -8677,9 +8686,6 @@ "message": "Self-host server URL", "description": "Label for field requesting a self-hosted integration service URL" }, - "aliasDomain": { - "message": "Alias domain" - }, "alreadyHaveAccount": { "message": "Already have an account?" }, @@ -8741,11 +8747,11 @@ "readOnlyCollectionAccess": { "message": "You do not have access to manage this collection." }, - "grantAddAccessCollectionWarningTitle": { - "message": "Missing Can Manage Permissions" + "grantManageCollectionWarningTitle": { + "message": "Missing Manage Collection Permissions" }, - "grantAddAccessCollectionWarning": { - "message": "Grant Can manage permissions to allow full collection management including deletion of collection." + "grantManageCollectionWarning": { + "message": "Grant Manage collection permissions to allow full collection management including deletion of collection." }, "grantCollectionAccess": { "message": "Grant groups or members access to this collection." @@ -10091,6 +10097,15 @@ "descriptorCode": { "message": "Descriptor code" }, + "cannotRemoveViewOnlyCollections": { + "message": "You cannot remove collections with View only permissions: $COLLECTIONS$", + "placeholders": { + "collections": { + "content": "$1", + "example": "Work, Personal" + } + } + }, "importantNotice": { "message": "Important notice" }, @@ -10281,5 +10296,54 @@ "example": "Acme c" } } + }, + "accountDeprovisioningNotification": { + "message": "Administrators now have the ability to delete member accounts that belong to a claimed domain." + }, + "deleteManagedUserWarningDesc": { + "message": "This action will delete the member account including all items in their vault. This replaces the previous Remove action." + }, + "deleteManagedUserWarning": { + "message": "Delete is a new action!" + }, + "seatsRemaining": { + "message": "You have $REMAINING$ seats remaining out of $TOTAL$ seats assigned to this organization. Contact your provider to manage your subscription.", + "placeholders": { + "remaining": { + "content": "$1", + "example": "5" + }, + "total": { + "content": "$2", + "example": "10" + } + } + }, + "existingOrganization": { + "message": "Existing organization" + }, + "selectOrganizationProviderPortal": { + "message": "Select an organization to add to your Provider Portal." + }, + "noOrganizations": { + "message": "There are no organizations to list" + }, + "yourProviderSubscriptionCredit": { + "message": "Your provider subscription will receive a credit for any remaining time in the organization's subscription." + }, + "doYouWantToAddThisOrg": { + "message": "Do you want to add this organization to $PROVIDER$?", + "placeholders": { + "provider": { + "content": "$1", + "example": "Cool MSP" + } + } + }, + "addedExistingOrganization": { + "message": "Added existing organization" + }, + "assignedExceedsAvailable": { + "message": "Assigned seats exceed available seats." } } diff --git a/apps/web/src/locales/az/messages.json b/apps/web/src/locales/az/messages.json index e53908cf452..4c49936c88e 100644 --- a/apps/web/src/locales/az/messages.json +++ b/apps/web/src/locales/az/messages.json @@ -464,6 +464,18 @@ "editFolder": { "message": "Qovluğa düzəliş et" }, + "newFolder": { + "message": "Yeni qovluq" + }, + "folderName": { + "message": "Qovluq adı" + }, + "folderHintText": { + "message": "Ana qovluğun adından sonra \"/\" əlavə edərək qovluğu ardıcıl yerləşdirin. Nümunə: Social/Forums" + }, + "deleteFolderPermanently": { + "message": "Bu qovluğu həmişəlik silmək istədiyinizə əminsiniz?" + }, "baseDomain": { "message": "Baza domeni", "description": "Domain name. Example: website.com" @@ -728,15 +740,6 @@ "itemName": { "message": "Element adı" }, - "cannotRemoveViewOnlyCollections": { - "message": "\"Yalnız baxma\" icazələrinə sahib kolleksiyaları silə bilməzsiniz: $COLLECTIONS$", - "placeholders": { - "collections": { - "content": "$1", - "example": "Work, Personal" - } - } - }, "ex": { "message": "məs.", "description": "Short abbreviation for 'example'." @@ -1182,6 +1185,9 @@ "logInInitiated": { "message": "Giriş etmə başladıldı" }, + "logInRequestSent": { + "message": "Tələb göndərildi" + }, "submit": { "message": "Göndər" }, @@ -1371,12 +1377,39 @@ "notificationSentDevice": { "message": "Cihazınıza bir bildiriş göndərildi." }, + "notificationSentDevicePart1": { + "message": "Cihazınızda Bitwarden kilidini açın, ya da " + }, + "areYouTryingToAccessYourAccount": { + "message": "Hesabınıza müraciət etməyə çalışırsınız?" + }, + "accessAttemptBy": { + "message": "$EMAIL$ ilə müraciət cəhdi", + "placeholders": { + "email": { + "content": "$1", + "example": "name@example.com" + } + } + }, + "confirmAccess": { + "message": "Müraciəti təsdiqlə" + }, + "denyAccess": { + "message": "Müraciətə rədd cavabı ver" + }, + "notificationSentDeviceAnchor": { + "message": "veb tətbiqinizdə" + }, + "notificationSentDevicePart2": { + "message": "Təsdiqləməzdən əvvəl Barmaq izi ifadəsinin aşağıdakı ifadə ilə uyuşduğuna əmin olun." + }, + "notificationSentDeviceComplete": { + "message": "Cihazınızda Bitwarden-in kilidini açın. Təsdiqləməzdən əvvəl Barmaq izi ifadəsinin aşağıdakı ifadə ilə uyuşduğuna əmin olun." + }, "aNotificationWasSentToYourDevice": { "message": "Cihazınıza bir bildiriş göndərildi" }, - "makeSureYourAccountIsUnlockedAndTheFingerprintEtc": { - "message": "Hesabınızın kilidinin açıq olduğuna və barmaq izi ifadəsinin digər cihazda uyuşduğuna əmin olun" - }, "versionNumber": { "message": "Versiya $VERSION_NUMBER$", "placeholders": { @@ -1664,9 +1697,6 @@ "message": "Anlaşılmaz xarakterlərdən çəkin", "description": "Label for the avoid ambiguous characters checkbox." }, - "regeneratePassword": { - "message": "Parolu yenidən yarat" - }, "length": { "message": "Uzunluq" }, @@ -2170,8 +2200,20 @@ "manage": { "message": "İdarə et" }, - "canManage": { - "message": "İdarə edə bilər" + "manageCollection": { + "message": "Kolleksiyanı idarə et" + }, + "viewItems": { + "message": "Elementlərə bax" + }, + "viewItemsHidePass": { + "message": "Elementlərə, gizli parollara bax" + }, + "editItems": { + "message": "Elementlərə düzəliş et" + }, + "editItemsHidePass": { + "message": "Elementlərə, gizli parollara düzəliş et" }, "disable": { "message": "Sıradan çıxart" @@ -2368,11 +2410,8 @@ "twoFactorU2fProblemReadingTryAgain": { "message": "Güvənlik açarı oxunarkən problem yarandı. Yenidən sınayın." }, - "twoFactorWebAuthnWarning": { - "message": "Platforma məhdudiyyətlərinə görə, WebAuthn bütün Bitwarden tətbiqlərində istifadə edilə bilmir. WebAuthn istifadə edilə bilməyəndə, hesabınıza müraciət edə bilməyiniz üçün başqa bir iki addımlı giriş provayderini fəallaşdırmalısınız. Dəstəklənən platformalar:" - }, - "twoFactorWebAuthnSupportWeb": { - "message": "WebAuthn dəstəkli brauzerə sahib masaüstü/dizüstü kompüterdə veb seyf və brauzer uzantıları (FIDO U2F açıq olan Chrome, Opera, Vivaldi və ya Firefox)." + "twoFactorWebAuthnWarning1": { + "message": "Platforma məhdudiyyətlərinə görə, WebAuthn bütün Bitwarden tətbiqlərində istifadə edilə bilmir. WebAuthn istifadə edilə bilməyəndə, hesabınıza müraciət edə bilməyiniz üçün başqa bir iki addımlı giriş provayderini fəallaşdırmalısınız." }, "twoFactorRecoveryYourCode": { "message": "Bitwarden iki addımlı giriş üçün geri qaytarma kodunuz" @@ -3013,7 +3052,7 @@ "message": "Əlavə istifadəçi yerləri" }, "userSeatsDesc": { - "message": "İstifadəçi sayı" + "message": "# / istifadəçi yeri" }, "userSeatsAdditionalDesc": { "message": "Planınızda $BASE_SEATS$ istifadəçi yeri var. İstifadəçiləri, istifadəçi/ay başına $SEAT_PRICE$ qarşılığında əlavə edə bilərsiniz.", @@ -4284,7 +4323,7 @@ "message": "Sirr Menecerinə abunəliyiniz üçün bir limit müəyyən edin. Bu limitə çatanda, yeni istifadəçiləri dəvət edə bilməyəcəksiniz." }, "maxSeatLimit": { - "message": "Maksimum yer limiti (ixtiyari)", + "message": "Yer limiti (ixtiyari)", "description": "Upper limit of seats to allow through autoscaling" }, "maxSeatCost": { @@ -4710,9 +4749,6 @@ "passwordGeneratorPolicyDesc": { "message": "Parol yaradıcı üçün tələbləri ayarla." }, - "passwordGeneratorPolicyInEffect": { - "message": "Bir və ya daha çox təşkilat siyasətləri yaradıcı seçimlərinizə təsir edir." - }, "masterPasswordPolicyInEffect": { "message": "Bir və ya daha çox təşkilat siyasəti, aşağıdakı tələbləri qarşılamaq üçün ana parolunuzu tələb edir:" }, @@ -6681,15 +6717,6 @@ "message": "Yaradıcı", "description": "Short for 'credential generator'." }, - "whatWouldYouLikeToGenerate": { - "message": "Nə yaratmaq istəyirsiniz?" - }, - "passwordType": { - "message": "Parol növü" - }, - "regenerateUsername": { - "message": "İstifadəçi adını yenidən yarat" - }, "generateUsername": { "message": "İstifadəçi adı yarat" }, @@ -6730,9 +6757,6 @@ } } }, - "usernameType": { - "message": "İstifadəçi adı növü" - }, "plusAddressedEmail": { "message": "Plyus ünvanlı e-poçt", "description": "Username generator option that appends a random sub-address to the username. For example: address+subaddress@email.com" @@ -6952,9 +6976,6 @@ "message": "Host adı", "description": "Part of a URL." }, - "apiAccessToken": { - "message": "API müraciət tokeni" - }, "deviceVerification": { "message": "Cihaz doğrulaması" }, @@ -7666,18 +7687,6 @@ "noCollection": { "message": "Kolleksiya yoxdur" }, - "canView": { - "message": "Baxa bilər" - }, - "canViewExceptPass": { - "message": "Parollar istisna olmaqla baxa bilər" - }, - "canEdit": { - "message": "Düzəliş edə bilər" - }, - "canEditExceptPass": { - "message": "Parollar istisna olmaqla düzəliş edə bilər" - }, "noCollectionsAdded": { "message": "Heç bir kolleksiya əlavə edilmədi" }, @@ -8626,7 +8635,7 @@ "message": "Kolleksiya silinməsini sahibləri və adminləri ilə məhdudlaşdır" }, "limitItemDeletionDesc": { - "message": "Limit item deletion to members with the Can manage permission" + "message": "Elementin silinməsini \"İdarə edə bilər\" icazəsinə sahib üzvlərlə məhdudlaşdır" }, "allowAdminAccessToAllCollectionItemsDesc": { "message": "Sahiblər və adminlər bütün kolleksiyaları və elementləri idarə edə bilər" @@ -8677,9 +8686,6 @@ "message": "Self-host server URL-si", "description": "Label for field requesting a self-hosted integration service URL" }, - "aliasDomain": { - "message": "Domen ləqəbi" - }, "alreadyHaveAccount": { "message": "Artıq bir hesabınız var?" }, @@ -8741,11 +8747,11 @@ "readOnlyCollectionAccess": { "message": "Bu kolleksiyanı idarə etmək üçün müraciətiniz yoxdur." }, - "grantAddAccessCollectionWarningTitle": { - "message": "İdarə edə bilər icazələri əskikdir" + "grantManageCollectionWarningTitle": { + "message": "\"Kolleksiyanı idarə etmə\" icazələri əskikdir" }, - "grantAddAccessCollectionWarning": { - "message": "Kolleksiyanın silinməsi daxil olmaqla tam kolleksiya idarəetməsinə icazə vermək üçün \"İdarə edə bilər\" icazələrini verin." + "grantManageCollectionWarning": { + "message": "Kolleksiyanın silinməsi daxil olmaqla tam kolleksiya idarəetməsinə icazə vermək üçün \"Kolleksiyanı idarə etmə\" icazələrini verin." }, "grantCollectionAccess": { "message": "Qrup və ya üzvlərin bu kolleksiyaya müraciətinə icazə verin." @@ -10091,6 +10097,15 @@ "descriptorCode": { "message": "Açıqlayıcı kod" }, + "cannotRemoveViewOnlyCollections": { + "message": "\"Yalnız baxma\" icazələrinə sahib kolleksiyaları silə bilməzsiniz: $COLLECTIONS$", + "placeholders": { + "collections": { + "content": "$1", + "example": "Work, Personal" + } + } + }, "importantNotice": { "message": "Vacib bildiriş" }, @@ -10281,5 +10296,54 @@ "example": "Acme c" } } + }, + "accountDeprovisioningNotification": { + "message": "İnzibatçılar, artıq götürülmüş domenlərə aid üzv hesablarını silmə imkanına sahibdir." + }, + "deleteManagedUserWarningDesc": { + "message": "Bu əməliyyat, seyfdəki bütün elementlər daxil olmaqla üzv hesabını siləcək. Bu, əvvəlki Sil əməliyyatını əvəz edir." + }, + "deleteManagedUserWarning": { + "message": "Silmək, yeni bir əməliyyatdır!" + }, + "seatsRemaining": { + "message": "Bu təşkilata təyin edilmiş $TOTAL$ yerdən $REMAINING$ yeriniz qalıb. Abunəliyinizi idarə etmək üçün provayderinizlə əlaqə saxlayın.", + "placeholders": { + "remaining": { + "content": "$1", + "example": "5" + }, + "total": { + "content": "$2", + "example": "10" + } + } + }, + "existingOrganization": { + "message": "Mövcud təşkilat" + }, + "selectOrganizationProviderPortal": { + "message": "Provayder Portalınıza əlavə ediləcək təşkilatı seçin." + }, + "noOrganizations": { + "message": "Sadalanacaq heç bir təşkilat yoxdur." + }, + "yourProviderSubscriptionCredit": { + "message": "Provayder abunəliyiniz, təşkilatınızın abunəliyində qalan vaxt üçün bir kredit alacaq." + }, + "doYouWantToAddThisOrg": { + "message": "Bu təşkilatı bura əlavə etmək istəyirsiniz: $PROVIDER$?", + "placeholders": { + "provider": { + "content": "$1", + "example": "Cool MSP" + } + } + }, + "addedExistingOrganization": { + "message": "Mövcud təşkilat əlavə edildi" + }, + "assignedExceedsAvailable": { + "message": "Təyin edilmiş yer sayı, boş yer sayından çoxdur." } } diff --git a/apps/web/src/locales/be/messages.json b/apps/web/src/locales/be/messages.json index 6d275bac7b2..8dcb31a1d0f 100644 --- a/apps/web/src/locales/be/messages.json +++ b/apps/web/src/locales/be/messages.json @@ -1,24 +1,24 @@ { "allApplications": { - "message": "All applications" + "message": "Усе праграмы" }, "criticalApplications": { - "message": "Critical applications" + "message": "Крытычныя праграмы" }, "accessIntelligence": { - "message": "Access Intelligence" + "message": "Кіраванне доступам" }, "riskInsights": { - "message": "Risk Insights" + "message": "Разуменне рызык" }, "passwordRisk": { - "message": "Password Risk" + "message": "Рызыка пароля" }, "reviewAtRiskPasswords": { - "message": "Review at-risk passwords (weak, exposed, or reused) across applications. Select your most critical applications to prioritize security actions for your users to address at-risk passwords." + "message": "Праглядайце паролі, якія знаходзяцца ў зоне рызыкі (ненадзейныя, скампраметаваныя або паўторна выкарыстаныя) ва ўсіх вашых праграмах. Выберыце найбольш крытычныя праграмы для вызначэння прыярытэту бяспекі дзеянняў для вашых карыстальнікаў, якія выкарыстоўваюць рызыкоўныя паролі." }, "dataLastUpdated": { - "message": "Data last updated: $DATE$", + "message": "Апошняе абнаўленне даных: $DATE$", "placeholders": { "date": { "content": "$1", @@ -27,19 +27,19 @@ } }, "notifiedMembers": { - "message": "Notified members" + "message": "Апавешчаныя ўдзельнікі" }, "revokeMembers": { - "message": "Revoke members" + "message": "Адклікаць удзельнікаў" }, "restoreMembers": { - "message": "Restore members" + "message": "Аднавіць удзельнікаў" }, "cannotRestoreAccessError": { - "message": "Cannot restore organization access" + "message": "Немагчыма аднавіць доступ да арганізацыі" }, "allApplicationsWithCount": { - "message": "All applications ($COUNT$)", + "message": "Усе праграмы ($COUNT$)", "placeholders": { "count": { "content": "$1", @@ -48,10 +48,10 @@ } }, "createNewLoginItem": { - "message": "Create new login item" + "message": "Стварыць новы элемент запісу ўваходу" }, "criticalApplicationsWithCount": { - "message": "Critical applications ($COUNT$)", + "message": "Крытычныя праграмы ($COUNT$)", "placeholders": { "count": { "content": "$1", @@ -60,7 +60,7 @@ } }, "notifiedMembersWithCount": { - "message": "Notified members ($COUNT$)", + "message": "Апавешчаныя ўдзельнікі ($COUNT$)", "placeholders": { "count": { "content": "$1", @@ -69,7 +69,7 @@ } }, "noAppsInOrgTitle": { - "message": "No applications found in $ORG NAME$", + "message": "Праграмы ў $ORG NAME$ не знойдзены", "placeholders": { "org name": { "content": "$1", @@ -78,43 +78,43 @@ } }, "noAppsInOrgDescription": { - "message": "As users save logins, applications appear here, showing any at-risk passwords. Mark critical apps and notify users to update passwords." + "message": "Тут будуць адлюстроўвацца праграмы па меры таго, як карыстальнікі будуць захоўваць запісы ўваходу, якія знаходзяцца ў зоне рызыкі. Пазначце крытычныя праграмы і апавяшчайце карыстальнікаў аб неабходнасці абнавіць паролі." }, "noCriticalAppsTitle": { - "message": "You haven't marked any applications as a Critical" + "message": "Вы не пазначылі ніводную праграму ў якасці кратычнай" }, "noCriticalAppsDescription": { - "message": "Select your most critical applications to discover at-risk passwords, and notify users to change those passwords." + "message": "Выберыце найбольш крытычныя праграмы для выяўлення пароляў, якія знаходзяцца ў зоне рызыкі. Апавяшчайце карыстальнікаў аб неабходнасці змяніць іх." }, "markCriticalApps": { - "message": "Mark critical apps" + "message": "Пазначыць крытычныя праграмы" }, "markAppAsCritical": { - "message": "Mark app as critical" + "message": "Пазначыць праграму як крытычную" }, "appsMarkedAsCritical": { - "message": "Apps marked as critical" + "message": "Праграмы пазначаныя як крытычныя" }, "application": { - "message": "Application" + "message": "Праграма" }, "atRiskPasswords": { - "message": "At-risk passwords" + "message": "Паролі ў зоне рызыкі" }, "requestPasswordChange": { - "message": "Request password change" + "message": "Запытаць змену пароля" }, "totalPasswords": { - "message": "Total passwords" + "message": "Усяго пароляў" }, "searchApps": { - "message": "Search applications" + "message": "Пошук праграм" }, "atRiskMembers": { - "message": "At-risk members" + "message": "Удзельнікі ў зоне рызыкі" }, "atRiskMembersWithCount": { - "message": "At-risk members ($COUNT$)", + "message": "Удзельнікі ў зоне рызыкі ($COUNT$)", "placeholders": { "count": { "content": "$1", @@ -123,7 +123,7 @@ } }, "atRiskApplicationsWithCount": { - "message": "At-risk applications ($COUNT$)", + "message": "Праграмы ў зоне рызыкі ($COUNT$)", "placeholders": { "count": { "content": "$1", @@ -132,13 +132,13 @@ } }, "atRiskMembersDescription": { - "message": "These members are logging into applications with weak, exposed, or reused passwords." + "message": "Гэтыя ўдзельнікі ўваходзяць у праграму з ненадзейнымі, скампраметаванымі або паўторна выкарыстанымі паролямі." }, "atRiskApplicationsDescription": { - "message": "These applications have weak, exposed, or reused passwords." + "message": "Гэтыя праграмы маюць ненадзейныя, скампраметаваныя або паўторна выкарыстаныя паролі." }, "atRiskMembersDescriptionWithApp": { - "message": "These members are logging into $APPNAME$ with weak, exposed, or reused passwords.", + "message": "Гэтыя ўдзельнікі ўваходзяць у праграму $APPNAME$ з ненадзейнымі, скампраметаванымі або паўторна выкарыстанымі паролямі.", "placeholders": { "appname": { "content": "$1", @@ -147,19 +147,19 @@ } }, "totalMembers": { - "message": "Total members" + "message": "Усяго ўдзельнікаў" }, "atRiskApplications": { - "message": "At-risk applications" + "message": "Праграмы ў зоне рызыкі" }, "totalApplications": { - "message": "Total applications" + "message": "Усяго праграм" }, "unmarkAsCriticalApp": { - "message": "Unmark as critical app" + "message": "Зняць пазнаку крытычнай праграмы" }, "criticalApplicationSuccessfullyUnmarked": { - "message": "Critical application successfully unmarked" + "message": "Пазнака з крытычнай праграмы паспяхова знята" }, "whatTypeOfItem": { "message": "Які гэта элемент запісу?" @@ -260,10 +260,10 @@ "message": "Дадаць вэб-сайт" }, "deleteWebsite": { - "message": "Delete website" + "message": "Выдаліць вэб-сайт" }, "defaultLabel": { - "message": "Default ($VALUE$)", + "message": "Прадвызначана ($VALUE$)", "description": "A label that indicates the default value for a field with the current default value in parentheses.", "placeholders": { "value": { @@ -273,7 +273,7 @@ } }, "showMatchDetection": { - "message": "Show match detection $WEBSITE$", + "message": "Паказаць выяўленне супадзенняў $WEBSITE$", "placeholders": { "website": { "content": "$1", @@ -282,7 +282,7 @@ } }, "hideMatchDetection": { - "message": "Hide match detection $WEBSITE$", + "message": "Схаваць выяўленне супадзенняў $WEBSITE$", "placeholders": { "website": { "content": "$1", @@ -291,7 +291,7 @@ } }, "autoFillOnPageLoad": { - "message": "Autofill on page load?" + "message": "Аўтазапаўняць пры загрузцы старонкі?" }, "number": { "message": "Нумар" @@ -306,7 +306,7 @@ "message": "Код бяспекі (CVV)" }, "securityCodeSlashCVV": { - "message": "Security code / CVV" + "message": "Код бяспекі (CVV)" }, "identityName": { "message": "Імя пасведчання" @@ -384,10 +384,10 @@ "message": "Доктар" }, "cardExpiredTitle": { - "message": "Expired card" + "message": "Картка пратэрмінавана" }, "cardExpiredMessage": { - "message": "If you've renewed it, update the card's information" + "message": "Калі вы падаўжалі картку, то абнавіце яе звесткі" }, "expirationMonth": { "message": "Месяц завяршэння" @@ -399,7 +399,7 @@ "message": "Ключ аўтэнтыфікацыі (TOTP)" }, "totpHelperTitle": { - "message": "Make 2-step verification seamless" + "message": "Спрасціце двухэтапную праверку" }, "totpHelper": { "message": "Bitwarden can store and fill 2-step verification codes. Copy and paste the key into this field." @@ -464,6 +464,18 @@ "editFolder": { "message": "Рэдагаваць папку" }, + "newFolder": { + "message": "New folder" + }, + "folderName": { + "message": "Folder name" + }, + "folderHintText": { + "message": "Nest a folder by adding the parent folder's name followed by a “/”. Example: Social/Forums" + }, + "deleteFolderPermanently": { + "message": "Are you sure you want to permanently delete this folder?" + }, "baseDomain": { "message": "Асноўны дамен", "description": "Domain name. Example: website.com" @@ -728,15 +740,6 @@ "itemName": { "message": "Item name" }, - "cannotRemoveViewOnlyCollections": { - "message": "You cannot remove collections with View only permissions: $COLLECTIONS$", - "placeholders": { - "collections": { - "content": "$1", - "example": "Work, Personal" - } - } - }, "ex": { "message": "напр.", "description": "Short abbreviation for 'example'." @@ -1182,6 +1185,9 @@ "logInInitiated": { "message": "Ініцыяваны ўваход" }, + "logInRequestSent": { + "message": "Request sent" + }, "submit": { "message": "Адправіць" }, @@ -1371,12 +1377,39 @@ "notificationSentDevice": { "message": "Апавяшчэнне было адпраўлена на вашу прыладу." }, + "notificationSentDevicePart1": { + "message": "Unlock Bitwarden on your device or on the " + }, + "areYouTryingToAccessYourAccount": { + "message": "Are you trying to access your account?" + }, + "accessAttemptBy": { + "message": "Access attempt by $EMAIL$", + "placeholders": { + "email": { + "content": "$1", + "example": "name@example.com" + } + } + }, + "confirmAccess": { + "message": "Confirm access" + }, + "denyAccess": { + "message": "Deny access" + }, + "notificationSentDeviceAnchor": { + "message": "web app" + }, + "notificationSentDevicePart2": { + "message": "Make sure the Fingerprint phrase matches the one below before approving." + }, + "notificationSentDeviceComplete": { + "message": "Unlock Bitwarden on your device. Make sure the Fingerprint phrase matches the one below before approving." + }, "aNotificationWasSentToYourDevice": { "message": "A notification was sent to your device" }, - "makeSureYourAccountIsUnlockedAndTheFingerprintEtc": { - "message": "Make sure your account is unlocked and the fingerprint phrase matches on the other device" - }, "versionNumber": { "message": "Версія $VERSION_NUMBER$", "placeholders": { @@ -1664,9 +1697,6 @@ "message": "Avoid ambiguous characters", "description": "Label for the avoid ambiguous characters checkbox." }, - "regeneratePassword": { - "message": "Паўторна генерыраваць пароль" - }, "length": { "message": "Даўжыня" }, @@ -2170,8 +2200,20 @@ "manage": { "message": "Кіраванне" }, - "canManage": { - "message": "Can manage" + "manageCollection": { + "message": "Manage collection" + }, + "viewItems": { + "message": "View items" + }, + "viewItemsHidePass": { + "message": "View items, hidden passwords" + }, + "editItems": { + "message": "Edit items" + }, + "editItemsHidePass": { + "message": "Edit items, hidden passwords" }, "disable": { "message": "Адключыць" @@ -2368,11 +2410,8 @@ "twoFactorU2fProblemReadingTryAgain": { "message": "Праблема чытання ключа бяспекі. Паспрабуйце яшчэ раз." }, - "twoFactorWebAuthnWarning": { - "message": "У сувязі з абмежаваннямі платформы, WebAuthn немагчыма выкарыстоўваць ва ўсіх праграмах Bitwarden. Вам неабходна актываваць іншага пастаўшчыка двухэтапнага ўваходу, каб вы маглі атрымаць доступ да свайго ўліковага запісу, калі немагчыма скарыстацца WebAuthn. Платформы, які падтрымліваюцца:" - }, - "twoFactorWebAuthnSupportWeb": { - "message": "Вэб-сховішча і пашырэнні браўзера на камп'ютары/ноўтбуку з браўзерам, які падтрымлівае WebAuthn (Chrome, Opera, Vivaldi або Firefox з уключаным FIDO U2F)." + "twoFactorWebAuthnWarning1": { + "message": "Due to platform limitations, WebAuthn cannot be used on all Bitwarden applications. You should set up another two-step login provider so that you can access your account when WebAuthn cannot be used." }, "twoFactorRecoveryYourCode": { "message": "Ваш код аднаўлення двухэтапнага ўваходу Bitwarden" @@ -4710,9 +4749,6 @@ "passwordGeneratorPolicyDesc": { "message": "Прызначыць патрабаванні для генератара пароляў." }, - "passwordGeneratorPolicyInEffect": { - "message": "Адна або больш палітык арганізацыі ўплывае на налады генератара." - }, "masterPasswordPolicyInEffect": { "message": "Адна або больш палітык арганізацыі патрабуе, каб ваш асноўны пароль адпавядаў наступным патрабаванням:" }, @@ -6681,15 +6717,6 @@ "message": "Генератар", "description": "Short for 'credential generator'." }, - "whatWouldYouLikeToGenerate": { - "message": "Што вы хочаце генерыраваць?" - }, - "passwordType": { - "message": "Тып пароля" - }, - "regenerateUsername": { - "message": "Паўторна генерыраваць імя карыстальніка" - }, "generateUsername": { "message": "Генерыраваць імя карыстальніка" }, @@ -6730,9 +6757,6 @@ } } }, - "usernameType": { - "message": "Тып імя карыстальніка" - }, "plusAddressedEmail": { "message": "Адрасы электроннай пошты з плюсам", "description": "Username generator option that appends a random sub-address to the username. For example: address+subaddress@email.com" @@ -6952,9 +6976,6 @@ "message": "Назва вузла", "description": "Part of a URL." }, - "apiAccessToken": { - "message": "Токен доступу да API" - }, "deviceVerification": { "message": "Праверка прылады" }, @@ -7666,18 +7687,6 @@ "noCollection": { "message": "Няма калекцый" }, - "canView": { - "message": "Можа праглядаць" - }, - "canViewExceptPass": { - "message": "Можа праглядаць (без пароляў)" - }, - "canEdit": { - "message": "Можа рэдагаваць" - }, - "canEditExceptPass": { - "message": "Можа рэдагаваць (без пароляў)" - }, "noCollectionsAdded": { "message": "Няма дадзеных калекцый" }, @@ -8677,9 +8686,6 @@ "message": "Self-host server URL", "description": "Label for field requesting a self-hosted integration service URL" }, - "aliasDomain": { - "message": "Мянушка дамена" - }, "alreadyHaveAccount": { "message": "Ужо маеце ўліковы запіс?" }, @@ -8741,11 +8747,11 @@ "readOnlyCollectionAccess": { "message": "You do not have access to manage this collection." }, - "grantAddAccessCollectionWarningTitle": { - "message": "Missing Can Manage Permissions" + "grantManageCollectionWarningTitle": { + "message": "Missing Manage Collection Permissions" }, - "grantAddAccessCollectionWarning": { - "message": "Grant Can manage permissions to allow full collection management including deletion of collection." + "grantManageCollectionWarning": { + "message": "Grant Manage collection permissions to allow full collection management including deletion of collection." }, "grantCollectionAccess": { "message": "Grant groups or members access to this collection." @@ -10091,6 +10097,15 @@ "descriptorCode": { "message": "Descriptor code" }, + "cannotRemoveViewOnlyCollections": { + "message": "You cannot remove collections with View only permissions: $COLLECTIONS$", + "placeholders": { + "collections": { + "content": "$1", + "example": "Work, Personal" + } + } + }, "importantNotice": { "message": "Important notice" }, @@ -10281,5 +10296,54 @@ "example": "Acme c" } } + }, + "accountDeprovisioningNotification": { + "message": "Administrators now have the ability to delete member accounts that belong to a claimed domain." + }, + "deleteManagedUserWarningDesc": { + "message": "This action will delete the member account including all items in their vault. This replaces the previous Remove action." + }, + "deleteManagedUserWarning": { + "message": "Delete is a new action!" + }, + "seatsRemaining": { + "message": "You have $REMAINING$ seats remaining out of $TOTAL$ seats assigned to this organization. Contact your provider to manage your subscription.", + "placeholders": { + "remaining": { + "content": "$1", + "example": "5" + }, + "total": { + "content": "$2", + "example": "10" + } + } + }, + "existingOrganization": { + "message": "Existing organization" + }, + "selectOrganizationProviderPortal": { + "message": "Select an organization to add to your Provider Portal." + }, + "noOrganizations": { + "message": "There are no organizations to list" + }, + "yourProviderSubscriptionCredit": { + "message": "Your provider subscription will receive a credit for any remaining time in the organization's subscription." + }, + "doYouWantToAddThisOrg": { + "message": "Do you want to add this organization to $PROVIDER$?", + "placeholders": { + "provider": { + "content": "$1", + "example": "Cool MSP" + } + } + }, + "addedExistingOrganization": { + "message": "Added existing organization" + }, + "assignedExceedsAvailable": { + "message": "Assigned seats exceed available seats." } } diff --git a/apps/web/src/locales/bg/messages.json b/apps/web/src/locales/bg/messages.json index 972b34bcf15..c985e4eb74e 100644 --- a/apps/web/src/locales/bg/messages.json +++ b/apps/web/src/locales/bg/messages.json @@ -464,6 +464,18 @@ "editFolder": { "message": "Редактиране на папка" }, + "newFolder": { + "message": "Нова папка" + }, + "folderName": { + "message": "Име на папката" + }, + "folderHintText": { + "message": "Можете да вложите една папка в друга като въведете името на горната папка, а след това „/“. Пример: Социални/Форуми" + }, + "deleteFolderPermanently": { + "message": "Наистина ли искате да изтриете тази папка окончателно?" + }, "baseDomain": { "message": "Основен домейн", "description": "Domain name. Example: website.com" @@ -728,15 +740,6 @@ "itemName": { "message": "Име на елемента" }, - "cannotRemoveViewOnlyCollections": { - "message": "Не можете да премахвате колекции с права „Само за преглед“: $COLLECTIONS$", - "placeholders": { - "collections": { - "content": "$1", - "example": "Work, Personal" - } - } - }, "ex": { "message": "напр.", "description": "Short abbreviation for 'example'." @@ -1182,6 +1185,9 @@ "logInInitiated": { "message": "Вписването е стартирано" }, + "logInRequestSent": { + "message": "Заявката е изпратена" + }, "submit": { "message": "Подаване" }, @@ -1371,12 +1377,39 @@ "notificationSentDevice": { "message": "Към устройството Ви е изпратено известие." }, + "notificationSentDevicePart1": { + "message": "Отключете Битоурден на устройството си или в " + }, + "areYouTryingToAccessYourAccount": { + "message": "Опитвате ли се да получите достъп до акаунта си?" + }, + "accessAttemptBy": { + "message": "Опит за достъп от $EMAIL$", + "placeholders": { + "email": { + "content": "$1", + "example": "name@example.com" + } + } + }, + "confirmAccess": { + "message": "Разрешаване на достъпа" + }, + "denyAccess": { + "message": "Отказване на достъпа" + }, + "notificationSentDeviceAnchor": { + "message": "приложението по уеб" + }, + "notificationSentDevicePart2": { + "message": "Уверете се, че уникалната фраза съвпада с тази по-долу, преди да одобрите." + }, + "notificationSentDeviceComplete": { + "message": "Отключете Битоурден на устройството си. Уверете се, че уникалната фраза съвпада с тази по-долу, преди да одобрите." + }, "aNotificationWasSentToYourDevice": { "message": "Към устройството Ви е изпратено известие" }, - "makeSureYourAccountIsUnlockedAndTheFingerprintEtc": { - "message": "Уверете се, че регистрацията Ви е отключена и че уникалната фраза съвпада с другото устройство" - }, "versionNumber": { "message": "Версия $VERSION_NUMBER$", "placeholders": { @@ -1664,9 +1697,6 @@ "message": "Без нееднозначни знаци", "description": "Label for the avoid ambiguous characters checkbox." }, - "regeneratePassword": { - "message": "Друга парола" - }, "length": { "message": "Дължина" }, @@ -2170,8 +2200,20 @@ "manage": { "message": "Управление" }, - "canManage": { - "message": "Може да управлява" + "manageCollection": { + "message": "Управление на колекцията" + }, + "viewItems": { + "message": "Преглед на елементите" + }, + "viewItemsHidePass": { + "message": "Преглед на елементите, със скрити пароли" + }, + "editItems": { + "message": "Редактиране на елементите" + }, + "editItemsHidePass": { + "message": "Редактиране на елементите, със скрити пароли" }, "disable": { "message": "Изключване" @@ -2368,11 +2410,8 @@ "twoFactorU2fProblemReadingTryAgain": { "message": "Проблем при изчитането на ключа за сигурност. Пробвайте отново." }, - "twoFactorWebAuthnWarning": { - "message": "Поради платформени ограничения устройствата на WebAuthn не могат да се използват с всички приложения на Битуорден. В такъв случай ще трябва да добавите друг доставчик на двустепенно удостоверяване, за да имате достъп до абонамента си, дори когато WebAuthn не работи. Поддържани платформи:" - }, - "twoFactorWebAuthnSupportWeb": { - "message": "Трезорът по уеб както и разширенията за браузърите с поддръжка на WebAuthn (Chrome, Opera, Vivaldi и Firefox с поддръжка на FIDO U2F)." + "twoFactorWebAuthnWarning1": { + "message": "Поради платформени ограничения устройствата на WebAuthn не могат да се използват с всички приложения на Битуорден. Ще трябва да настроите друг доставчик на двустепенно удостоверяване, за да имате достъп до акаунта си, когато WebAuthn не може да се ползва." }, "twoFactorRecoveryYourCode": { "message": "Код за възстановяване на достъпа до Битуорден при двустепенна идентификация" @@ -4710,9 +4749,6 @@ "passwordGeneratorPolicyDesc": { "message": "Задаване на минимална сила на генератора на пароли." }, - "passwordGeneratorPolicyInEffect": { - "message": "Поне една политика на организация влияе на настройките на генерирането на паролите." - }, "masterPasswordPolicyInEffect": { "message": "Поне една политика на организация има следните изисквания към главната ви парола:" }, @@ -6681,15 +6717,6 @@ "message": "Генератор", "description": "Short for 'credential generator'." }, - "whatWouldYouLikeToGenerate": { - "message": "Какво бихте искали да генерирате?" - }, - "passwordType": { - "message": "Тип парола" - }, - "regenerateUsername": { - "message": "Повторно генериране на потр. име" - }, "generateUsername": { "message": "Генериране на потр. име" }, @@ -6730,9 +6757,6 @@ } } }, - "usernameType": { - "message": "Тип потребителско име" - }, "plusAddressedEmail": { "message": "Адрес на е-поща с плюс", "description": "Username generator option that appends a random sub-address to the username. For example: address+subaddress@email.com" @@ -6952,9 +6976,6 @@ "message": "Име на сървъра", "description": "Part of a URL." }, - "apiAccessToken": { - "message": "Идентификатор за достъп до API" - }, "deviceVerification": { "message": "Потвърждаване на устройствата" }, @@ -7666,18 +7687,6 @@ "noCollection": { "message": "Няма колекция" }, - "canView": { - "message": "Може да преглежда" - }, - "canViewExceptPass": { - "message": "Може да преглежда, без пароли" - }, - "canEdit": { - "message": "Може да редактира" - }, - "canEditExceptPass": { - "message": "Може да редактира, без пароли" - }, "noCollectionsAdded": { "message": "Няма добавени колекции" }, @@ -8626,7 +8635,7 @@ "message": "Ограничаване на изтриването на колекции, така че да може да се извършва само от собствениците и администраторите" }, "limitItemDeletionDesc": { - "message": "Limit item deletion to members with the Can manage permission" + "message": "Ограничаване на изтриването на елементи, така че да може да се извършва само от членове с правомощие за управление" }, "allowAdminAccessToAllCollectionItemsDesc": { "message": "Собствениците и администраторите могат да управляват всички колекции и елементи" @@ -8677,9 +8686,6 @@ "message": "Адрес на собствения сървър", "description": "Label for field requesting a self-hosted integration service URL" }, - "aliasDomain": { - "message": "Псевдонимен домейн" - }, "alreadyHaveAccount": { "message": "Вече имате регистрация?" }, @@ -8741,11 +8747,11 @@ "readOnlyCollectionAccess": { "message": "Нямате достъп за управление на тази колекция." }, - "grantAddAccessCollectionWarningTitle": { - "message": "Липсват правомощия за управление" + "grantManageCollectionWarningTitle": { + "message": "Липсват правомощия за управление на колекции" }, - "grantAddAccessCollectionWarning": { - "message": "Дайте правомощия за управление, за да позволите пълното управление на колекции, включително изтриването им." + "grantManageCollectionWarning": { + "message": "Дайте правомощия за управление на колекциите, за да позволите пълното управление на колекции, включително изтриването им." }, "grantCollectionAccess": { "message": "Дайте права на групи и членове до тази колекция." @@ -10091,6 +10097,15 @@ "descriptorCode": { "message": "Код от описанието" }, + "cannotRemoveViewOnlyCollections": { + "message": "Не можете да премахвате колекции с права „Само за преглед“: $COLLECTIONS$", + "placeholders": { + "collections": { + "content": "$1", + "example": "Work, Personal" + } + } + }, "importantNotice": { "message": "Важно съобщение" }, @@ -10281,5 +10296,54 @@ "example": "Acme c" } } + }, + "accountDeprovisioningNotification": { + "message": "Администраторите вече имат възможността да изтриват акаунтите на членовете, които принадлежат към присвоен домейн." + }, + "deleteManagedUserWarningDesc": { + "message": "Това действие ще изтрие акаунта на члена, включително всички елементи в неговия трезор. Това заменя предишното действие за Премахване." + }, + "deleteManagedUserWarning": { + "message": "Изтриването е ново действие!" + }, + "seatsRemaining": { + "message": "Остават Ви $REMAINING$ от общо $TOTAL$ места в тази организация. Свържете се с доставчика си, ако искате да управлявате абонамента си.", + "placeholders": { + "remaining": { + "content": "$1", + "example": "5" + }, + "total": { + "content": "$2", + "example": "10" + } + } + }, + "existingOrganization": { + "message": "Съществуваща организация" + }, + "selectOrganizationProviderPortal": { + "message": "Изберете организацията, която искате да добавите към своя Портал за доставчици." + }, + "noOrganizations": { + "message": "Няма организации за показване" + }, + "yourProviderSubscriptionCredit": { + "message": "Вашият абонамент за доставчик ще получи кредит за оставащото време в абонамента на организацията, ако има такова." + }, + "doYouWantToAddThisOrg": { + "message": "Искате ли да добавите тази организация към $PROVIDER$?", + "placeholders": { + "provider": { + "content": "$1", + "example": "Cool MSP" + } + } + }, + "addedExistingOrganization": { + "message": "Добавена е съществуваща организация" + }, + "assignedExceedsAvailable": { + "message": "Назначените места превишават наличния брой." } } diff --git a/apps/web/src/locales/bn/messages.json b/apps/web/src/locales/bn/messages.json index e4b8884de3d..c2b6fdf4671 100644 --- a/apps/web/src/locales/bn/messages.json +++ b/apps/web/src/locales/bn/messages.json @@ -464,6 +464,18 @@ "editFolder": { "message": "ফোল্ডার সম্পাদনা" }, + "newFolder": { + "message": "New folder" + }, + "folderName": { + "message": "Folder name" + }, + "folderHintText": { + "message": "Nest a folder by adding the parent folder's name followed by a “/”. Example: Social/Forums" + }, + "deleteFolderPermanently": { + "message": "Are you sure you want to permanently delete this folder?" + }, "baseDomain": { "message": "ভিত্তি ডোমেইন", "description": "Domain name. Example: website.com" @@ -728,15 +740,6 @@ "itemName": { "message": "Item name" }, - "cannotRemoveViewOnlyCollections": { - "message": "You cannot remove collections with View only permissions: $COLLECTIONS$", - "placeholders": { - "collections": { - "content": "$1", - "example": "Work, Personal" - } - } - }, "ex": { "message": "উদাহরণ", "description": "Short abbreviation for 'example'." @@ -1182,6 +1185,9 @@ "logInInitiated": { "message": "Log in initiated" }, + "logInRequestSent": { + "message": "Request sent" + }, "submit": { "message": "Submit" }, @@ -1371,12 +1377,39 @@ "notificationSentDevice": { "message": "A notification has been sent to your device." }, + "notificationSentDevicePart1": { + "message": "Unlock Bitwarden on your device or on the " + }, + "areYouTryingToAccessYourAccount": { + "message": "Are you trying to access your account?" + }, + "accessAttemptBy": { + "message": "Access attempt by $EMAIL$", + "placeholders": { + "email": { + "content": "$1", + "example": "name@example.com" + } + } + }, + "confirmAccess": { + "message": "Confirm access" + }, + "denyAccess": { + "message": "Deny access" + }, + "notificationSentDeviceAnchor": { + "message": "web app" + }, + "notificationSentDevicePart2": { + "message": "Make sure the Fingerprint phrase matches the one below before approving." + }, + "notificationSentDeviceComplete": { + "message": "Unlock Bitwarden on your device. Make sure the Fingerprint phrase matches the one below before approving." + }, "aNotificationWasSentToYourDevice": { "message": "A notification was sent to your device" }, - "makeSureYourAccountIsUnlockedAndTheFingerprintEtc": { - "message": "Make sure your account is unlocked and the fingerprint phrase matches on the other device" - }, "versionNumber": { "message": "সংস্করণ $VERSION_NUMBER$", "placeholders": { @@ -1664,9 +1697,6 @@ "message": "Avoid ambiguous characters", "description": "Label for the avoid ambiguous characters checkbox." }, - "regeneratePassword": { - "message": "Regenerate password" - }, "length": { "message": "Length" }, @@ -2170,8 +2200,20 @@ "manage": { "message": "Manage" }, - "canManage": { - "message": "Can manage" + "manageCollection": { + "message": "Manage collection" + }, + "viewItems": { + "message": "View items" + }, + "viewItemsHidePass": { + "message": "View items, hidden passwords" + }, + "editItems": { + "message": "Edit items" + }, + "editItemsHidePass": { + "message": "Edit items, hidden passwords" }, "disable": { "message": "Turn off" @@ -2368,11 +2410,8 @@ "twoFactorU2fProblemReadingTryAgain": { "message": "There was a problem reading the security key. Try again." }, - "twoFactorWebAuthnWarning": { - "message": "Due to platform limitations, WebAuthn cannot be used on all Bitwarden applications. You should set up another two-step login provider so that you can access your account when WebAuthn cannot be used. Supported platforms:" - }, - "twoFactorWebAuthnSupportWeb": { - "message": "Web vault and browser extensions on a desktop/laptop with a WebAuthn supported browser (Chrome, Opera, Vivaldi, or Firefox with FIDO U2F turned on)." + "twoFactorWebAuthnWarning1": { + "message": "Due to platform limitations, WebAuthn cannot be used on all Bitwarden applications. You should set up another two-step login provider so that you can access your account when WebAuthn cannot be used." }, "twoFactorRecoveryYourCode": { "message": "Your Bitwarden two-step login recovery code" @@ -4710,9 +4749,6 @@ "passwordGeneratorPolicyDesc": { "message": "পাসওয়ার্ড উৎপাদকের কনফিগারেশনের জন্য ন্যূনতম প্রয়োজনীয়তা সেট করুন।" }, - "passwordGeneratorPolicyInEffect": { - "message": "এক বা একাধিক সংস্থার নীতিগুলি আপনার উৎপাদকের সেটিংসকে প্রভাবিত করছে।" - }, "masterPasswordPolicyInEffect": { "message": "One or more organization policies require your master password to meet the following requirements:" }, @@ -6681,15 +6717,6 @@ "message": "Generator", "description": "Short for 'credential generator'." }, - "whatWouldYouLikeToGenerate": { - "message": "What would you like to generate?" - }, - "passwordType": { - "message": "Password type" - }, - "regenerateUsername": { - "message": "Regenerate username" - }, "generateUsername": { "message": "Generate username" }, @@ -6730,9 +6757,6 @@ } } }, - "usernameType": { - "message": "Username type" - }, "plusAddressedEmail": { "message": "Plus addressed email", "description": "Username generator option that appends a random sub-address to the username. For example: address+subaddress@email.com" @@ -6952,9 +6976,6 @@ "message": "Hostname", "description": "Part of a URL." }, - "apiAccessToken": { - "message": "API access token" - }, "deviceVerification": { "message": "Device verification" }, @@ -7666,18 +7687,6 @@ "noCollection": { "message": "No collection" }, - "canView": { - "message": "Can view" - }, - "canViewExceptPass": { - "message": "Can view, except passwords" - }, - "canEdit": { - "message": "Can edit" - }, - "canEditExceptPass": { - "message": "Can edit, except passwords" - }, "noCollectionsAdded": { "message": "No collections added" }, @@ -8677,9 +8686,6 @@ "message": "Self-host server URL", "description": "Label for field requesting a self-hosted integration service URL" }, - "aliasDomain": { - "message": "Alias domain" - }, "alreadyHaveAccount": { "message": "Already have an account?" }, @@ -8741,11 +8747,11 @@ "readOnlyCollectionAccess": { "message": "You do not have access to manage this collection." }, - "grantAddAccessCollectionWarningTitle": { - "message": "Missing Can Manage Permissions" + "grantManageCollectionWarningTitle": { + "message": "Missing Manage Collection Permissions" }, - "grantAddAccessCollectionWarning": { - "message": "Grant Can manage permissions to allow full collection management including deletion of collection." + "grantManageCollectionWarning": { + "message": "Grant Manage collection permissions to allow full collection management including deletion of collection." }, "grantCollectionAccess": { "message": "Grant groups or members access to this collection." @@ -10091,6 +10097,15 @@ "descriptorCode": { "message": "Descriptor code" }, + "cannotRemoveViewOnlyCollections": { + "message": "You cannot remove collections with View only permissions: $COLLECTIONS$", + "placeholders": { + "collections": { + "content": "$1", + "example": "Work, Personal" + } + } + }, "importantNotice": { "message": "Important notice" }, @@ -10281,5 +10296,54 @@ "example": "Acme c" } } + }, + "accountDeprovisioningNotification": { + "message": "Administrators now have the ability to delete member accounts that belong to a claimed domain." + }, + "deleteManagedUserWarningDesc": { + "message": "This action will delete the member account including all items in their vault. This replaces the previous Remove action." + }, + "deleteManagedUserWarning": { + "message": "Delete is a new action!" + }, + "seatsRemaining": { + "message": "You have $REMAINING$ seats remaining out of $TOTAL$ seats assigned to this organization. Contact your provider to manage your subscription.", + "placeholders": { + "remaining": { + "content": "$1", + "example": "5" + }, + "total": { + "content": "$2", + "example": "10" + } + } + }, + "existingOrganization": { + "message": "Existing organization" + }, + "selectOrganizationProviderPortal": { + "message": "Select an organization to add to your Provider Portal." + }, + "noOrganizations": { + "message": "There are no organizations to list" + }, + "yourProviderSubscriptionCredit": { + "message": "Your provider subscription will receive a credit for any remaining time in the organization's subscription." + }, + "doYouWantToAddThisOrg": { + "message": "Do you want to add this organization to $PROVIDER$?", + "placeholders": { + "provider": { + "content": "$1", + "example": "Cool MSP" + } + } + }, + "addedExistingOrganization": { + "message": "Added existing organization" + }, + "assignedExceedsAvailable": { + "message": "Assigned seats exceed available seats." } } diff --git a/apps/web/src/locales/bs/messages.json b/apps/web/src/locales/bs/messages.json index cd3df3e0a1a..a4750d36eac 100644 --- a/apps/web/src/locales/bs/messages.json +++ b/apps/web/src/locales/bs/messages.json @@ -464,6 +464,18 @@ "editFolder": { "message": "Uredite folder" }, + "newFolder": { + "message": "New folder" + }, + "folderName": { + "message": "Folder name" + }, + "folderHintText": { + "message": "Nest a folder by adding the parent folder's name followed by a “/”. Example: Social/Forums" + }, + "deleteFolderPermanently": { + "message": "Are you sure you want to permanently delete this folder?" + }, "baseDomain": { "message": "Osnovni domen", "description": "Domain name. Example: website.com" @@ -728,15 +740,6 @@ "itemName": { "message": "Item name" }, - "cannotRemoveViewOnlyCollections": { - "message": "You cannot remove collections with View only permissions: $COLLECTIONS$", - "placeholders": { - "collections": { - "content": "$1", - "example": "Work, Personal" - } - } - }, "ex": { "message": "npr.", "description": "Short abbreviation for 'example'." @@ -1182,6 +1185,9 @@ "logInInitiated": { "message": "Log in initiated" }, + "logInRequestSent": { + "message": "Request sent" + }, "submit": { "message": "Submit" }, @@ -1371,12 +1377,39 @@ "notificationSentDevice": { "message": "A notification has been sent to your device." }, + "notificationSentDevicePart1": { + "message": "Unlock Bitwarden on your device or on the " + }, + "areYouTryingToAccessYourAccount": { + "message": "Are you trying to access your account?" + }, + "accessAttemptBy": { + "message": "Access attempt by $EMAIL$", + "placeholders": { + "email": { + "content": "$1", + "example": "name@example.com" + } + } + }, + "confirmAccess": { + "message": "Confirm access" + }, + "denyAccess": { + "message": "Deny access" + }, + "notificationSentDeviceAnchor": { + "message": "web app" + }, + "notificationSentDevicePart2": { + "message": "Make sure the Fingerprint phrase matches the one below before approving." + }, + "notificationSentDeviceComplete": { + "message": "Unlock Bitwarden on your device. Make sure the Fingerprint phrase matches the one below before approving." + }, "aNotificationWasSentToYourDevice": { "message": "A notification was sent to your device" }, - "makeSureYourAccountIsUnlockedAndTheFingerprintEtc": { - "message": "Make sure your account is unlocked and the fingerprint phrase matches on the other device" - }, "versionNumber": { "message": "Verzija $VERSION_NUMBER$", "placeholders": { @@ -1664,9 +1697,6 @@ "message": "Avoid ambiguous characters", "description": "Label for the avoid ambiguous characters checkbox." }, - "regeneratePassword": { - "message": "Regenerate password" - }, "length": { "message": "Length" }, @@ -2170,8 +2200,20 @@ "manage": { "message": "Manage" }, - "canManage": { - "message": "Can manage" + "manageCollection": { + "message": "Manage collection" + }, + "viewItems": { + "message": "View items" + }, + "viewItemsHidePass": { + "message": "View items, hidden passwords" + }, + "editItems": { + "message": "Edit items" + }, + "editItemsHidePass": { + "message": "Edit items, hidden passwords" }, "disable": { "message": "Turn off" @@ -2368,11 +2410,8 @@ "twoFactorU2fProblemReadingTryAgain": { "message": "There was a problem reading the security key. Try again." }, - "twoFactorWebAuthnWarning": { - "message": "Due to platform limitations, WebAuthn cannot be used on all Bitwarden applications. You should set up another two-step login provider so that you can access your account when WebAuthn cannot be used. Supported platforms:" - }, - "twoFactorWebAuthnSupportWeb": { - "message": "Web vault and browser extensions on a desktop/laptop with a WebAuthn supported browser (Chrome, Opera, Vivaldi, or Firefox with FIDO U2F turned on)." + "twoFactorWebAuthnWarning1": { + "message": "Due to platform limitations, WebAuthn cannot be used on all Bitwarden applications. You should set up another two-step login provider so that you can access your account when WebAuthn cannot be used." }, "twoFactorRecoveryYourCode": { "message": "Your Bitwarden two-step login recovery code" @@ -4710,9 +4749,6 @@ "passwordGeneratorPolicyDesc": { "message": "Set requirements for password generator." }, - "passwordGeneratorPolicyInEffect": { - "message": "One or more organization policies are affecting your generator settings." - }, "masterPasswordPolicyInEffect": { "message": "One or more organization policies require your master password to meet the following requirements:" }, @@ -6681,15 +6717,6 @@ "message": "Generator", "description": "Short for 'credential generator'." }, - "whatWouldYouLikeToGenerate": { - "message": "What would you like to generate?" - }, - "passwordType": { - "message": "Password type" - }, - "regenerateUsername": { - "message": "Regenerate username" - }, "generateUsername": { "message": "Generate username" }, @@ -6730,9 +6757,6 @@ } } }, - "usernameType": { - "message": "Username type" - }, "plusAddressedEmail": { "message": "Plus addressed email", "description": "Username generator option that appends a random sub-address to the username. For example: address+subaddress@email.com" @@ -6952,9 +6976,6 @@ "message": "Hostname", "description": "Part of a URL." }, - "apiAccessToken": { - "message": "API access token" - }, "deviceVerification": { "message": "Device verification" }, @@ -7666,18 +7687,6 @@ "noCollection": { "message": "No collection" }, - "canView": { - "message": "Can view" - }, - "canViewExceptPass": { - "message": "Can view, except passwords" - }, - "canEdit": { - "message": "Can edit" - }, - "canEditExceptPass": { - "message": "Can edit, except passwords" - }, "noCollectionsAdded": { "message": "No collections added" }, @@ -8677,9 +8686,6 @@ "message": "Self-host server URL", "description": "Label for field requesting a self-hosted integration service URL" }, - "aliasDomain": { - "message": "Alias domain" - }, "alreadyHaveAccount": { "message": "Already have an account?" }, @@ -8741,11 +8747,11 @@ "readOnlyCollectionAccess": { "message": "You do not have access to manage this collection." }, - "grantAddAccessCollectionWarningTitle": { - "message": "Missing Can Manage Permissions" + "grantManageCollectionWarningTitle": { + "message": "Missing Manage Collection Permissions" }, - "grantAddAccessCollectionWarning": { - "message": "Grant Can manage permissions to allow full collection management including deletion of collection." + "grantManageCollectionWarning": { + "message": "Grant Manage collection permissions to allow full collection management including deletion of collection." }, "grantCollectionAccess": { "message": "Grant groups or members access to this collection." @@ -10091,6 +10097,15 @@ "descriptorCode": { "message": "Descriptor code" }, + "cannotRemoveViewOnlyCollections": { + "message": "You cannot remove collections with View only permissions: $COLLECTIONS$", + "placeholders": { + "collections": { + "content": "$1", + "example": "Work, Personal" + } + } + }, "importantNotice": { "message": "Important notice" }, @@ -10281,5 +10296,54 @@ "example": "Acme c" } } + }, + "accountDeprovisioningNotification": { + "message": "Administrators now have the ability to delete member accounts that belong to a claimed domain." + }, + "deleteManagedUserWarningDesc": { + "message": "This action will delete the member account including all items in their vault. This replaces the previous Remove action." + }, + "deleteManagedUserWarning": { + "message": "Delete is a new action!" + }, + "seatsRemaining": { + "message": "You have $REMAINING$ seats remaining out of $TOTAL$ seats assigned to this organization. Contact your provider to manage your subscription.", + "placeholders": { + "remaining": { + "content": "$1", + "example": "5" + }, + "total": { + "content": "$2", + "example": "10" + } + } + }, + "existingOrganization": { + "message": "Existing organization" + }, + "selectOrganizationProviderPortal": { + "message": "Select an organization to add to your Provider Portal." + }, + "noOrganizations": { + "message": "There are no organizations to list" + }, + "yourProviderSubscriptionCredit": { + "message": "Your provider subscription will receive a credit for any remaining time in the organization's subscription." + }, + "doYouWantToAddThisOrg": { + "message": "Do you want to add this organization to $PROVIDER$?", + "placeholders": { + "provider": { + "content": "$1", + "example": "Cool MSP" + } + } + }, + "addedExistingOrganization": { + "message": "Added existing organization" + }, + "assignedExceedsAvailable": { + "message": "Assigned seats exceed available seats." } } diff --git a/apps/web/src/locales/ca/messages.json b/apps/web/src/locales/ca/messages.json index 09e533b2060..b9e8f0f2336 100644 --- a/apps/web/src/locales/ca/messages.json +++ b/apps/web/src/locales/ca/messages.json @@ -102,7 +102,7 @@ "message": "At-risk passwords" }, "requestPasswordChange": { - "message": "Request password change" + "message": "Sol·licita canvi de contrasenya" }, "totalPasswords": { "message": "Contrasenyes totals" @@ -464,6 +464,18 @@ "editFolder": { "message": "Edita la carpeta" }, + "newFolder": { + "message": "Carpeta nova" + }, + "folderName": { + "message": "Nom de la carpeta" + }, + "folderHintText": { + "message": "Nest a folder by adding the parent folder's name followed by a “/”. Example: Social/Forums" + }, + "deleteFolderPermanently": { + "message": "Are you sure you want to permanently delete this folder?" + }, "baseDomain": { "message": "Domini base", "description": "Domain name. Example: website.com" @@ -728,15 +740,6 @@ "itemName": { "message": "Nom d'element" }, - "cannotRemoveViewOnlyCollections": { - "message": "You cannot remove collections with View only permissions: $COLLECTIONS$", - "placeholders": { - "collections": { - "content": "$1", - "example": "Work, Personal" - } - } - }, "ex": { "message": "ex.", "description": "Short abbreviation for 'example'." @@ -1182,6 +1185,9 @@ "logInInitiated": { "message": "S'ha iniciat la sessió" }, + "logInRequestSent": { + "message": "Request sent" + }, "submit": { "message": "Envia" }, @@ -1371,11 +1377,38 @@ "notificationSentDevice": { "message": "S'ha enviat una notificació al vostre dispositiu." }, - "aNotificationWasSentToYourDevice": { - "message": "A notification was sent to your device" + "notificationSentDevicePart1": { + "message": "Unlock Bitwarden on your device or on the " }, - "makeSureYourAccountIsUnlockedAndTheFingerprintEtc": { - "message": "Make sure your account is unlocked and the fingerprint phrase matches on the other device" + "areYouTryingToAccessYourAccount": { + "message": "Are you trying to access your account?" + }, + "accessAttemptBy": { + "message": "Access attempt by $EMAIL$", + "placeholders": { + "email": { + "content": "$1", + "example": "name@example.com" + } + } + }, + "confirmAccess": { + "message": "Confirmeu l'accés" + }, + "denyAccess": { + "message": "Denega l'accés" + }, + "notificationSentDeviceAnchor": { + "message": "aplicació web" + }, + "notificationSentDevicePart2": { + "message": "Make sure the Fingerprint phrase matches the one below before approving." + }, + "notificationSentDeviceComplete": { + "message": "Unlock Bitwarden on your device. Make sure the Fingerprint phrase matches the one below before approving." + }, + "aNotificationWasSentToYourDevice": { + "message": "S'ha enviat una notificació al vostre dispositiu" }, "versionNumber": { "message": "Versió $VERSION_NUMBER$", @@ -1480,7 +1513,7 @@ "message": "Correu electrònic" }, "emailDescV2": { - "message": "Enter a code sent to your email." + "message": "Introduïu el codi que us hem enviat al correu electrònic." }, "continue": { "message": "Continua" @@ -1661,12 +1694,9 @@ "description": "deprecated. Use avoidAmbiguous instead." }, "avoidAmbiguous": { - "message": "Avoid ambiguous characters", + "message": "Eviteu caràcters ambigus", "description": "Label for the avoid ambiguous characters checkbox." }, - "regeneratePassword": { - "message": "Regenera contrasenya" - }, "length": { "message": "Longitud" }, @@ -1702,7 +1732,7 @@ "message": "Inclou número" }, "generatorPolicyInEffect": { - "message": "Enterprise policy requirements have been applied to your generator options.", + "message": "Els requisits de la política empresarial s'han aplicat a les opcions del generador.", "description": "Indicates that a policy limits the credential generator screen." }, "passwordHistory": { @@ -1767,10 +1797,10 @@ "message": "Torneu a iniciar sessió." }, "currentSession": { - "message": "Current session" + "message": "Sessió actual" }, "requestPending": { - "message": "Request pending" + "message": "Sol·licitud pendent" }, "logBackInOthersToo": { "message": "Torneu a iniciar la sessió. Si esteu utilitzant altres aplicacions Bitwarden, tanqueu-les i torneu-les a obrir també." @@ -2170,8 +2200,20 @@ "manage": { "message": "Administra" }, - "canManage": { - "message": "Pot gestionar" + "manageCollection": { + "message": "Manage collection" + }, + "viewItems": { + "message": "View items" + }, + "viewItemsHidePass": { + "message": "View items, hidden passwords" + }, + "editItems": { + "message": "Edita elements" + }, + "editItemsHidePass": { + "message": "Edit items, hidden passwords" }, "disable": { "message": "Inhabilita" @@ -2368,11 +2410,8 @@ "twoFactorU2fProblemReadingTryAgain": { "message": "Hi ha hagut un problema en llegir la clau de seguretat. Torneu-ho a provar." }, - "twoFactorWebAuthnWarning": { - "message": "A causa de les limitacions de la plataforma, WebAuthn no es pot utilitzar en totes les aplicacions Bitwarden. Heu d’habilitar un altre proveïdor d’inici de sessió en dos passos perquè pugueu accedir al vostre compte quan no es puga utilitzar WebAuthn. Plataformes compatibles:" - }, - "twoFactorWebAuthnSupportWeb": { - "message": "Caixa forta web i extensions de navegador en un escriptori/portàtil amb un navegador compatible amb WebAuthn (Chrome, Opera, Vivaldi, o Firefox amb FIDO U2F activat)." + "twoFactorWebAuthnWarning1": { + "message": "Due to platform limitations, WebAuthn cannot be used on all Bitwarden applications. You should set up another two-step login provider so that you can access your account when WebAuthn cannot be used." }, "twoFactorRecoveryYourCode": { "message": "El codi de recuperació d'inici de sessió en dues passes de Bitwarden" @@ -4710,9 +4749,6 @@ "passwordGeneratorPolicyDesc": { "message": "Estableix els requisits mínims per a la configuració del generador de contrasenyes." }, - "passwordGeneratorPolicyInEffect": { - "message": "Una o més polítiques d’organització afecten la configuració del generador." - }, "masterPasswordPolicyInEffect": { "message": "Una o més polítiques d’organització requereixen que la vostra contrasenya principal complisca els requisits següents:" }, @@ -6681,15 +6717,6 @@ "message": "Generador", "description": "Short for 'credential generator'." }, - "whatWouldYouLikeToGenerate": { - "message": "Què voleu generar?" - }, - "passwordType": { - "message": "Tipus de contrasenya" - }, - "regenerateUsername": { - "message": "Regenera el nom d'usuari" - }, "generateUsername": { "message": "Genera un nom d'usuari" }, @@ -6730,9 +6757,6 @@ } } }, - "usernameType": { - "message": "Tipus de nom d'usuari" - }, "plusAddressedEmail": { "message": "Adreça amb sufix", "description": "Username generator option that appends a random sub-address to the username. For example: address+subaddress@email.com" @@ -6952,9 +6976,6 @@ "message": "Nom de l'amfitrió", "description": "Part of a URL." }, - "apiAccessToken": { - "message": "Token d'accés a l'API" - }, "deviceVerification": { "message": "Verificació del dispositiu" }, @@ -7666,18 +7687,6 @@ "noCollection": { "message": "Cap col·lecció" }, - "canView": { - "message": "Pot veure" - }, - "canViewExceptPass": { - "message": "Pot veure, excepte les contrasenyes" - }, - "canEdit": { - "message": "Pot editar" - }, - "canEditExceptPass": { - "message": "Pot editar, excepte les contrasenyes" - }, "noCollectionsAdded": { "message": "No s'han afegit col·leccions" }, @@ -8677,9 +8686,6 @@ "message": "Self-host server URL", "description": "Label for field requesting a self-hosted integration service URL" }, - "aliasDomain": { - "message": "Alies de domini" - }, "alreadyHaveAccount": { "message": "Ja tens un compte?" }, @@ -8741,11 +8747,11 @@ "readOnlyCollectionAccess": { "message": "No teniu accés per gestionar aquesta col·lecció." }, - "grantAddAccessCollectionWarningTitle": { - "message": "Missing Can Manage Permissions" + "grantManageCollectionWarningTitle": { + "message": "Missing Manage Collection Permissions" }, - "grantAddAccessCollectionWarning": { - "message": "Grant Can manage permissions to allow full collection management including deletion of collection." + "grantManageCollectionWarning": { + "message": "Grant Manage collection permissions to allow full collection management including deletion of collection." }, "grantCollectionAccess": { "message": "Concedeix als grups o membres l'accés a aquesta col·lecció." @@ -10091,6 +10097,15 @@ "descriptorCode": { "message": "Descriptor code" }, + "cannotRemoveViewOnlyCollections": { + "message": "You cannot remove collections with View only permissions: $COLLECTIONS$", + "placeholders": { + "collections": { + "content": "$1", + "example": "Work, Personal" + } + } + }, "importantNotice": { "message": "Important notice" }, @@ -10281,5 +10296,54 @@ "example": "Acme c" } } + }, + "accountDeprovisioningNotification": { + "message": "Administrators now have the ability to delete member accounts that belong to a claimed domain." + }, + "deleteManagedUserWarningDesc": { + "message": "This action will delete the member account including all items in their vault. This replaces the previous Remove action." + }, + "deleteManagedUserWarning": { + "message": "Delete is a new action!" + }, + "seatsRemaining": { + "message": "You have $REMAINING$ seats remaining out of $TOTAL$ seats assigned to this organization. Contact your provider to manage your subscription.", + "placeholders": { + "remaining": { + "content": "$1", + "example": "5" + }, + "total": { + "content": "$2", + "example": "10" + } + } + }, + "existingOrganization": { + "message": "Existing organization" + }, + "selectOrganizationProviderPortal": { + "message": "Select an organization to add to your Provider Portal." + }, + "noOrganizations": { + "message": "There are no organizations to list" + }, + "yourProviderSubscriptionCredit": { + "message": "Your provider subscription will receive a credit for any remaining time in the organization's subscription." + }, + "doYouWantToAddThisOrg": { + "message": "Do you want to add this organization to $PROVIDER$?", + "placeholders": { + "provider": { + "content": "$1", + "example": "Cool MSP" + } + } + }, + "addedExistingOrganization": { + "message": "Added existing organization" + }, + "assignedExceedsAvailable": { + "message": "Assigned seats exceed available seats." } } diff --git a/apps/web/src/locales/cs/messages.json b/apps/web/src/locales/cs/messages.json index d8aae6a2f0d..4fa1a50512c 100644 --- a/apps/web/src/locales/cs/messages.json +++ b/apps/web/src/locales/cs/messages.json @@ -464,6 +464,18 @@ "editFolder": { "message": "Upravit složku" }, + "newFolder": { + "message": "Nová složka" + }, + "folderName": { + "message": "Název složky" + }, + "folderHintText": { + "message": "Vnořte složku přidáním názvu nadřazené složky následovaného znakem \"/\". Příklad: Sociální/Fóra" + }, + "deleteFolderPermanently": { + "message": "Opravdu chcete trvale smazat tuto složku?" + }, "baseDomain": { "message": "Základní doména", "description": "Domain name. Example: website.com" @@ -728,15 +740,6 @@ "itemName": { "message": "Název položky" }, - "cannotRemoveViewOnlyCollections": { - "message": "Nemůžete odebrat kolekce s oprávněními jen pro zobrazení: $COLLECTIONS$", - "placeholders": { - "collections": { - "content": "$1", - "example": "Work, Personal" - } - } - }, "ex": { "message": "např.", "description": "Short abbreviation for 'example'." @@ -1182,6 +1185,9 @@ "logInInitiated": { "message": "Bylo zahájeno přihlášení" }, + "logInRequestSent": { + "message": "Požadavek odeslán" + }, "submit": { "message": "Odeslat" }, @@ -1371,12 +1377,39 @@ "notificationSentDevice": { "message": "Na Vaše zařízení bylo odesláno oznámení." }, + "notificationSentDevicePart1": { + "message": "Odemknout Bitwarden na Vašem zařízení nebo na " + }, + "areYouTryingToAccessYourAccount": { + "message": "Pokoušíte se získat přístup k Vašemu účtu?" + }, + "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" + }, + "notificationSentDeviceAnchor": { + "message": "webová aplikace" + }, + "notificationSentDevicePart2": { + "message": "Před schválením se ujistěte, že fráze otisku prstu odpovídá frázi níže." + }, + "notificationSentDeviceComplete": { + "message": "Odemkněte Bitwarden na Vašem zařízení. Před schválením se ujistěte, že fráze otisku prstu odpovídá frázi níže." + }, "aNotificationWasSentToYourDevice": { "message": "Na Vaše zařízení bylo odesláno oznámení" }, - "makeSureYourAccountIsUnlockedAndTheFingerprintEtc": { - "message": "Ujistěte se, že je Váš trezor odemčen a fráze otisku prstu se shodují s druhým zařízením" - }, "versionNumber": { "message": "Verze $VERSION_NUMBER$", "placeholders": { @@ -1664,9 +1697,6 @@ "message": "Nepoužívat zaměnitelné znaky", "description": "Label for the avoid ambiguous characters checkbox." }, - "regeneratePassword": { - "message": "Vygenerovat jiné heslo" - }, "length": { "message": "Délka" }, @@ -2170,8 +2200,20 @@ "manage": { "message": "Spravovat" }, - "canManage": { - "message": "Může spravovat" + "manageCollection": { + "message": "Spravovat kolekci" + }, + "viewItems": { + "message": "Zobrazit položky" + }, + "viewItemsHidePass": { + "message": "Zobrazit položky, skrytá hesla" + }, + "editItems": { + "message": "Upravit položky" + }, + "editItemsHidePass": { + "message": "Upravit položky, skrytá hesla" }, "disable": { "message": "Vypnout" @@ -2368,11 +2410,8 @@ "twoFactorU2fProblemReadingTryAgain": { "message": "Při čtení bezpečnostního klíče došlo k potížím. Zkuste to znovu." }, - "twoFactorWebAuthnWarning": { - "message": "Z důvodu omezení platformy nelze WebAuthn použít ve všech aplikacích Bitwarden. Měli byste využít i jiného poskytovatele dvoufaktorového přihlášení, abyste měli přístup ke svému účtu, když nelze použít WebAuthn. Podporované platformy:" - }, - "twoFactorWebAuthnSupportWeb": { - "message": "Webový trezor a rozšíření pro prohlížeče na počítači/notebooku s podporou WebAuthn (Chrome, Opera, Vivaldi nebo Firefox se zapnutým FIDO U2F)." + "twoFactorWebAuthnWarning1": { + "message": "Z důvodu omezení platformy nelze WebAuthn použít ve všech aplikacích Bitwarden. Měli byste využít i jiného poskytovatele dvoufaktorového přihlášení, abyste měli přístup ke svému účtu, když nelze použít WebAuthn." }, "twoFactorRecoveryYourCode": { "message": "Váš kód pro obnovení dvoufázového přihlášení" @@ -4710,9 +4749,6 @@ "passwordGeneratorPolicyDesc": { "message": "Nastaví požadavky pro generátor hesel." }, - "passwordGeneratorPolicyInEffect": { - "message": "Jedna nebo více zásad organizace ovlivňují nastavení generátoru." - }, "masterPasswordPolicyInEffect": { "message": "Jedna nebo více zásad organizace vyžaduje, aby hlavní heslo splňovalo následující požadavky:" }, @@ -6681,15 +6717,6 @@ "message": "Generátor", "description": "Short for 'credential generator'." }, - "whatWouldYouLikeToGenerate": { - "message": "Co chcete vygenerovat?" - }, - "passwordType": { - "message": "Typ hesla" - }, - "regenerateUsername": { - "message": "Znovu vygenerovat uživatelské jméno" - }, "generateUsername": { "message": "Vygenerovat uživatelské jméno" }, @@ -6730,9 +6757,6 @@ } } }, - "usernameType": { - "message": "Typ uživatelského jména" - }, "plusAddressedEmail": { "message": "E-mailová adresa s plusem", "description": "Username generator option that appends a random sub-address to the username. For example: address+subaddress@email.com" @@ -6952,9 +6976,6 @@ "message": "Název hostitele", "description": "Part of a URL." }, - "apiAccessToken": { - "message": "Přístupový token API" - }, "deviceVerification": { "message": "Ověřování zařízení" }, @@ -7666,18 +7687,6 @@ "noCollection": { "message": "Žádná kolekce" }, - "canView": { - "message": "Může zobrazit" - }, - "canViewExceptPass": { - "message": "Může zobrazit kromě hesel" - }, - "canEdit": { - "message": "Může upravovat" - }, - "canEditExceptPass": { - "message": "Může upravovat kromě hesel" - }, "noCollectionsAdded": { "message": "Nebyly přidány žádné kolekce" }, @@ -8626,7 +8635,7 @@ "message": "Omezí mazání kolekce na vlastníky a správce" }, "limitItemDeletionDesc": { - "message": "Limit item deletion to members with the Can manage permission" + "message": "Omezit smazání položky na členy s oprávněním ke správě" }, "allowAdminAccessToAllCollectionItemsDesc": { "message": "Vlastníci a správci mohou spravovat všechny kolekce a předměty" @@ -8677,9 +8686,6 @@ "message": "Adresa URL serveru vlastního hostování", "description": "Label for field requesting a self-hosted integration service URL" }, - "aliasDomain": { - "message": "Doména aliasu" - }, "alreadyHaveAccount": { "message": "Už máte účet?" }, @@ -8741,11 +8747,11 @@ "readOnlyCollectionAccess": { "message": "Nemáte přístup ke správě této kolekce." }, - "grantAddAccessCollectionWarningTitle": { - "message": "Chybějící oprávnění \"Může spravovat\"" + "grantManageCollectionWarningTitle": { + "message": "Chybějící oprávnění pro správu kolekcí" }, - "grantAddAccessCollectionWarning": { - "message": "Udělte oprávnění \"Může spravovat\" pro úplnou správu kolekce, včetně jejího smazání." + "grantManageCollectionWarning": { + "message": "Udělte oprávnění \"Spravovat kolekci\" pro úplnou správu kolekce, včetně jejího smazání." }, "grantCollectionAccess": { "message": "Udělí skupinám nebo členům přístup k této kolekci." @@ -10091,6 +10097,15 @@ "descriptorCode": { "message": "Kód z popisu" }, + "cannotRemoveViewOnlyCollections": { + "message": "Nemůžete odebrat kolekce s oprávněními jen pro zobrazení: $COLLECTIONS$", + "placeholders": { + "collections": { + "content": "$1", + "example": "Work, Personal" + } + } + }, "importantNotice": { "message": "Důležité upozornění" }, @@ -10281,5 +10296,54 @@ "example": "Acme c" } } + }, + "accountDeprovisioningNotification": { + "message": "Správci mají nyní možnost smazat účty členů, které patří k nárokované doméně." + }, + "deleteManagedUserWarningDesc": { + "message": "Tato akce smaže účet uživatele včetně všech jeho položek v trezoru. Tím se nahradí předchozí akce odebrání." + }, + "deleteManagedUserWarning": { + "message": "Smazat je nová akce!" + }, + "seatsRemaining": { + "message": "Máte zbývajících $REMAINING$ uživatelů z $TOTAL$ uživatelů přidělených této organizaci. Kontaktujte svého poskytovatele pro správu předplatného.", + "placeholders": { + "remaining": { + "content": "$1", + "example": "5" + }, + "total": { + "content": "$2", + "example": "10" + } + } + }, + "existingOrganization": { + "message": "Existující organizace" + }, + "selectOrganizationProviderPortal": { + "message": "Vyberte organizaci pro přidání do portálu poskytovatele." + }, + "noOrganizations": { + "message": "Žádné organizace k zobrazení" + }, + "yourProviderSubscriptionCredit": { + "message": "Předplatné poskytovatele obdrží kredit za zbývající čas v předplatném organizace." + }, + "doYouWantToAddThisOrg": { + "message": "Chcete přidat tuto organizaci do $PROVIDER$?", + "placeholders": { + "provider": { + "content": "$1", + "example": "Cool MSP" + } + } + }, + "addedExistingOrganization": { + "message": "Přidána existující organizace" + }, + "assignedExceedsAvailable": { + "message": "Přiřazení uživatelé překračují dostupné uživatele." } } diff --git a/apps/web/src/locales/cy/messages.json b/apps/web/src/locales/cy/messages.json index 6d0c87ed1a0..01c4f390ddc 100644 --- a/apps/web/src/locales/cy/messages.json +++ b/apps/web/src/locales/cy/messages.json @@ -464,6 +464,18 @@ "editFolder": { "message": "Edit folder" }, + "newFolder": { + "message": "New folder" + }, + "folderName": { + "message": "Folder name" + }, + "folderHintText": { + "message": "Nest a folder by adding the parent folder's name followed by a “/”. Example: Social/Forums" + }, + "deleteFolderPermanently": { + "message": "Are you sure you want to permanently delete this folder?" + }, "baseDomain": { "message": "Base domain", "description": "Domain name. Example: website.com" @@ -728,15 +740,6 @@ "itemName": { "message": "Item name" }, - "cannotRemoveViewOnlyCollections": { - "message": "You cannot remove collections with View only permissions: $COLLECTIONS$", - "placeholders": { - "collections": { - "content": "$1", - "example": "Work, Personal" - } - } - }, "ex": { "message": "ex.", "description": "Short abbreviation for 'example'." @@ -1182,6 +1185,9 @@ "logInInitiated": { "message": "Log in initiated" }, + "logInRequestSent": { + "message": "Request sent" + }, "submit": { "message": "Submit" }, @@ -1371,12 +1377,39 @@ "notificationSentDevice": { "message": "A notification has been sent to your device." }, + "notificationSentDevicePart1": { + "message": "Unlock Bitwarden on your device or on the " + }, + "areYouTryingToAccessYourAccount": { + "message": "Are you trying to access your account?" + }, + "accessAttemptBy": { + "message": "Access attempt by $EMAIL$", + "placeholders": { + "email": { + "content": "$1", + "example": "name@example.com" + } + } + }, + "confirmAccess": { + "message": "Confirm access" + }, + "denyAccess": { + "message": "Deny access" + }, + "notificationSentDeviceAnchor": { + "message": "web app" + }, + "notificationSentDevicePart2": { + "message": "Make sure the Fingerprint phrase matches the one below before approving." + }, + "notificationSentDeviceComplete": { + "message": "Unlock Bitwarden on your device. Make sure the Fingerprint phrase matches the one below before approving." + }, "aNotificationWasSentToYourDevice": { "message": "A notification was sent to your device" }, - "makeSureYourAccountIsUnlockedAndTheFingerprintEtc": { - "message": "Make sure your account is unlocked and the fingerprint phrase matches on the other device" - }, "versionNumber": { "message": "Version $VERSION_NUMBER$", "placeholders": { @@ -1664,9 +1697,6 @@ "message": "Avoid ambiguous characters", "description": "Label for the avoid ambiguous characters checkbox." }, - "regeneratePassword": { - "message": "Regenerate password" - }, "length": { "message": "Length" }, @@ -2170,8 +2200,20 @@ "manage": { "message": "Manage" }, - "canManage": { - "message": "Can manage" + "manageCollection": { + "message": "Manage collection" + }, + "viewItems": { + "message": "View items" + }, + "viewItemsHidePass": { + "message": "View items, hidden passwords" + }, + "editItems": { + "message": "Edit items" + }, + "editItemsHidePass": { + "message": "Edit items, hidden passwords" }, "disable": { "message": "Turn off" @@ -2368,11 +2410,8 @@ "twoFactorU2fProblemReadingTryAgain": { "message": "There was a problem reading the security key. Try again." }, - "twoFactorWebAuthnWarning": { - "message": "Due to platform limitations, WebAuthn cannot be used on all Bitwarden applications. You should set up another two-step login provider so that you can access your account when WebAuthn cannot be used. Supported platforms:" - }, - "twoFactorWebAuthnSupportWeb": { - "message": "Web vault and browser extensions on a desktop/laptop with a WebAuthn supported browser (Chrome, Opera, Vivaldi, or Firefox with FIDO U2F turned on)." + "twoFactorWebAuthnWarning1": { + "message": "Due to platform limitations, WebAuthn cannot be used on all Bitwarden applications. You should set up another two-step login provider so that you can access your account when WebAuthn cannot be used." }, "twoFactorRecoveryYourCode": { "message": "Your Bitwarden two-step login recovery code" @@ -4710,9 +4749,6 @@ "passwordGeneratorPolicyDesc": { "message": "Set requirements for password generator." }, - "passwordGeneratorPolicyInEffect": { - "message": "One or more organization policies are affecting your generator settings." - }, "masterPasswordPolicyInEffect": { "message": "One or more organization policies require your master password to meet the following requirements:" }, @@ -6681,15 +6717,6 @@ "message": "Generator", "description": "Short for 'credential generator'." }, - "whatWouldYouLikeToGenerate": { - "message": "What would you like to generate?" - }, - "passwordType": { - "message": "Password type" - }, - "regenerateUsername": { - "message": "Regenerate username" - }, "generateUsername": { "message": "Generate username" }, @@ -6730,9 +6757,6 @@ } } }, - "usernameType": { - "message": "Username type" - }, "plusAddressedEmail": { "message": "Plus addressed email", "description": "Username generator option that appends a random sub-address to the username. For example: address+subaddress@email.com" @@ -6952,9 +6976,6 @@ "message": "Hostname", "description": "Part of a URL." }, - "apiAccessToken": { - "message": "API access token" - }, "deviceVerification": { "message": "Device verification" }, @@ -7666,18 +7687,6 @@ "noCollection": { "message": "No collection" }, - "canView": { - "message": "Can view" - }, - "canViewExceptPass": { - "message": "Can view, except passwords" - }, - "canEdit": { - "message": "Can edit" - }, - "canEditExceptPass": { - "message": "Can edit, except passwords" - }, "noCollectionsAdded": { "message": "No collections added" }, @@ -8677,9 +8686,6 @@ "message": "Self-host server URL", "description": "Label for field requesting a self-hosted integration service URL" }, - "aliasDomain": { - "message": "Alias domain" - }, "alreadyHaveAccount": { "message": "Already have an account?" }, @@ -8741,11 +8747,11 @@ "readOnlyCollectionAccess": { "message": "You do not have access to manage this collection." }, - "grantAddAccessCollectionWarningTitle": { - "message": "Missing Can Manage Permissions" + "grantManageCollectionWarningTitle": { + "message": "Missing Manage Collection Permissions" }, - "grantAddAccessCollectionWarning": { - "message": "Grant Can manage permissions to allow full collection management including deletion of collection." + "grantManageCollectionWarning": { + "message": "Grant Manage collection permissions to allow full collection management including deletion of collection." }, "grantCollectionAccess": { "message": "Grant groups or members access to this collection." @@ -10091,6 +10097,15 @@ "descriptorCode": { "message": "Descriptor code" }, + "cannotRemoveViewOnlyCollections": { + "message": "You cannot remove collections with View only permissions: $COLLECTIONS$", + "placeholders": { + "collections": { + "content": "$1", + "example": "Work, Personal" + } + } + }, "importantNotice": { "message": "Important notice" }, @@ -10281,5 +10296,54 @@ "example": "Acme c" } } + }, + "accountDeprovisioningNotification": { + "message": "Administrators now have the ability to delete member accounts that belong to a claimed domain." + }, + "deleteManagedUserWarningDesc": { + "message": "This action will delete the member account including all items in their vault. This replaces the previous Remove action." + }, + "deleteManagedUserWarning": { + "message": "Delete is a new action!" + }, + "seatsRemaining": { + "message": "You have $REMAINING$ seats remaining out of $TOTAL$ seats assigned to this organization. Contact your provider to manage your subscription.", + "placeholders": { + "remaining": { + "content": "$1", + "example": "5" + }, + "total": { + "content": "$2", + "example": "10" + } + } + }, + "existingOrganization": { + "message": "Existing organization" + }, + "selectOrganizationProviderPortal": { + "message": "Select an organization to add to your Provider Portal." + }, + "noOrganizations": { + "message": "There are no organizations to list" + }, + "yourProviderSubscriptionCredit": { + "message": "Your provider subscription will receive a credit for any remaining time in the organization's subscription." + }, + "doYouWantToAddThisOrg": { + "message": "Do you want to add this organization to $PROVIDER$?", + "placeholders": { + "provider": { + "content": "$1", + "example": "Cool MSP" + } + } + }, + "addedExistingOrganization": { + "message": "Added existing organization" + }, + "assignedExceedsAvailable": { + "message": "Assigned seats exceed available seats." } } diff --git a/apps/web/src/locales/da/messages.json b/apps/web/src/locales/da/messages.json index a0d1674d181..bd357b4cba4 100644 --- a/apps/web/src/locales/da/messages.json +++ b/apps/web/src/locales/da/messages.json @@ -464,6 +464,18 @@ "editFolder": { "message": "Redigér mappe" }, + "newFolder": { + "message": "New folder" + }, + "folderName": { + "message": "Folder name" + }, + "folderHintText": { + "message": "Nest a folder by adding the parent folder's name followed by a “/”. Example: Social/Forums" + }, + "deleteFolderPermanently": { + "message": "Are you sure you want to permanently delete this folder?" + }, "baseDomain": { "message": "Basisdomæne", "description": "Domain name. Example: website.com" @@ -728,15 +740,6 @@ "itemName": { "message": "Emnenavn" }, - "cannotRemoveViewOnlyCollections": { - "message": "Samlinger med kun tilladelsen Vis kan ikke fjernes: $COLLECTIONS$", - "placeholders": { - "collections": { - "content": "$1", - "example": "Work, Personal" - } - } - }, "ex": { "message": "eks.", "description": "Short abbreviation for 'example'." @@ -1182,6 +1185,9 @@ "logInInitiated": { "message": "Indlogning påbegyndt" }, + "logInRequestSent": { + "message": "Request sent" + }, "submit": { "message": "Indsend" }, @@ -1371,12 +1377,39 @@ "notificationSentDevice": { "message": "En notifikation er sendt til din enhed." }, + "notificationSentDevicePart1": { + "message": "Unlock Bitwarden on your device or on the " + }, + "areYouTryingToAccessYourAccount": { + "message": "Are you trying to access your account?" + }, + "accessAttemptBy": { + "message": "Access attempt by $EMAIL$", + "placeholders": { + "email": { + "content": "$1", + "example": "name@example.com" + } + } + }, + "confirmAccess": { + "message": "Confirm access" + }, + "denyAccess": { + "message": "Deny access" + }, + "notificationSentDeviceAnchor": { + "message": "web app" + }, + "notificationSentDevicePart2": { + "message": "Make sure the Fingerprint phrase matches the one below before approving." + }, + "notificationSentDeviceComplete": { + "message": "Unlock Bitwarden on your device. Make sure the Fingerprint phrase matches the one below before approving." + }, "aNotificationWasSentToYourDevice": { "message": "En notifikation er sendt til enheden" }, - "makeSureYourAccountIsUnlockedAndTheFingerprintEtc": { - "message": "Sørg for, at boksen er oplåst, samt at fingeraftrykssætningen matcher på den anden enhed" - }, "versionNumber": { "message": "Version $VERSION_NUMBER$", "placeholders": { @@ -1664,9 +1697,6 @@ "message": "Undgå tvetydige tegn", "description": "Label for the avoid ambiguous characters checkbox." }, - "regeneratePassword": { - "message": "Regenerér adgangskode" - }, "length": { "message": "Længde" }, @@ -2170,8 +2200,20 @@ "manage": { "message": "Håndtér" }, - "canManage": { - "message": "Kan håndtere" + "manageCollection": { + "message": "Manage collection" + }, + "viewItems": { + "message": "View items" + }, + "viewItemsHidePass": { + "message": "View items, hidden passwords" + }, + "editItems": { + "message": "Edit items" + }, + "editItemsHidePass": { + "message": "Edit items, hidden passwords" }, "disable": { "message": "Deaktivér" @@ -2368,11 +2410,8 @@ "twoFactorU2fProblemReadingTryAgain": { "message": "Problem med at læse sikkerhedsnøglen. Forsøg igen." }, - "twoFactorWebAuthnWarning": { - "message": "Grundet platformsbegrænsninger kan WebAuthn ikke bruges i alle Bitwarden-applikationer. Man bør opsætte en anden totrins-loginudbyder, så man kan tilgå sin konto, når WebAuthn ikke kan benyttes. Understøttede platforme:" - }, - "twoFactorWebAuthnSupportWeb": { - "message": "Web-boks og browserudvidelser på en stationær/bærbar computer med en WebAuthn-aktiveret browser (Chrome, Opera, Vivaldi eller Firefox med FIDO U2F aktiveret)." + "twoFactorWebAuthnWarning1": { + "message": "Due to platform limitations, WebAuthn cannot be used on all Bitwarden applications. You should set up another two-step login provider so that you can access your account when WebAuthn cannot be used." }, "twoFactorRecoveryYourCode": { "message": "Gendannelseskoden til Bitwarden totrins-login" @@ -4710,9 +4749,6 @@ "passwordGeneratorPolicyDesc": { "message": "Angiv krav til adgangskodegenerator." }, - "passwordGeneratorPolicyInEffect": { - "message": "Én eller flere organisationspolitikker påvirker dine generatorindstillinger." - }, "masterPasswordPolicyInEffect": { "message": "Én eller flere organisationspolitikker kræver din hovedadgangskode opfylder følgende krav:" }, @@ -6681,15 +6717,6 @@ "message": "Generator", "description": "Short for 'credential generator'." }, - "whatWouldYouLikeToGenerate": { - "message": "Hvad ønskes genereret?" - }, - "passwordType": { - "message": "Adgangskodetype" - }, - "regenerateUsername": { - "message": "Regenerér brugernavn" - }, "generateUsername": { "message": "Generér brugernavn" }, @@ -6730,9 +6757,6 @@ } } }, - "usernameType": { - "message": "Brugernavnstype" - }, "plusAddressedEmail": { "message": "Plus adresseret e-mail", "description": "Username generator option that appends a random sub-address to the username. For example: address+subaddress@email.com" @@ -6952,9 +6976,6 @@ "message": "Værtsnavn", "description": "Part of a URL." }, - "apiAccessToken": { - "message": "API-adgangstoken" - }, "deviceVerification": { "message": "Enhedsbekræftelse" }, @@ -7666,18 +7687,6 @@ "noCollection": { "message": "Ingen samling" }, - "canView": { - "message": "Kan se" - }, - "canViewExceptPass": { - "message": "Kan se, undtagen adgangskoder" - }, - "canEdit": { - "message": "Kan redigere" - }, - "canEditExceptPass": { - "message": "Kan redigere, undtagen adgangskoder" - }, "noCollectionsAdded": { "message": "Ingen samlinger tilføjet" }, @@ -8677,9 +8686,6 @@ "message": "URL til selv-hostet server", "description": "Label for field requesting a self-hosted integration service URL" }, - "aliasDomain": { - "message": "Aliasdomæne" - }, "alreadyHaveAccount": { "message": "Har allerede en konto?" }, @@ -8741,11 +8747,11 @@ "readOnlyCollectionAccess": { "message": "Du har ikke adgang til at håndtere denne samling." }, - "grantAddAccessCollectionWarningTitle": { - "message": "Manglende Kan håndtere tilladelser" + "grantManageCollectionWarningTitle": { + "message": "Missing Manage Collection Permissions" }, - "grantAddAccessCollectionWarning": { - "message": "Tildel Kan håndtere tilladelser for at tillade fuld samlingshåndtering, herunder sletning af samling." + "grantManageCollectionWarning": { + "message": "Grant Manage collection permissions to allow full collection management including deletion of collection." }, "grantCollectionAccess": { "message": "Tildel grupper eller medlemmer adgang til denne samling." @@ -10091,6 +10097,15 @@ "descriptorCode": { "message": "Beskrivelseskode" }, + "cannotRemoveViewOnlyCollections": { + "message": "Samlinger med kun tilladelsen Vis kan ikke fjernes: $COLLECTIONS$", + "placeholders": { + "collections": { + "content": "$1", + "example": "Work, Personal" + } + } + }, "importantNotice": { "message": "Vigtig notits" }, @@ -10281,5 +10296,54 @@ "example": "Acme c" } } + }, + "accountDeprovisioningNotification": { + "message": "Administrators now have the ability to delete member accounts that belong to a claimed domain." + }, + "deleteManagedUserWarningDesc": { + "message": "This action will delete the member account including all items in their vault. This replaces the previous Remove action." + }, + "deleteManagedUserWarning": { + "message": "Delete is a new action!" + }, + "seatsRemaining": { + "message": "You have $REMAINING$ seats remaining out of $TOTAL$ seats assigned to this organization. Contact your provider to manage your subscription.", + "placeholders": { + "remaining": { + "content": "$1", + "example": "5" + }, + "total": { + "content": "$2", + "example": "10" + } + } + }, + "existingOrganization": { + "message": "Existing organization" + }, + "selectOrganizationProviderPortal": { + "message": "Select an organization to add to your Provider Portal." + }, + "noOrganizations": { + "message": "There are no organizations to list" + }, + "yourProviderSubscriptionCredit": { + "message": "Your provider subscription will receive a credit for any remaining time in the organization's subscription." + }, + "doYouWantToAddThisOrg": { + "message": "Do you want to add this organization to $PROVIDER$?", + "placeholders": { + "provider": { + "content": "$1", + "example": "Cool MSP" + } + } + }, + "addedExistingOrganization": { + "message": "Added existing organization" + }, + "assignedExceedsAvailable": { + "message": "Assigned seats exceed available seats." } } diff --git a/apps/web/src/locales/de/messages.json b/apps/web/src/locales/de/messages.json index 0ae02ed0977..ffc65be543c 100644 --- a/apps/web/src/locales/de/messages.json +++ b/apps/web/src/locales/de/messages.json @@ -464,6 +464,18 @@ "editFolder": { "message": "Ordner bearbeiten" }, + "newFolder": { + "message": "Neuer Ordner" + }, + "folderName": { + "message": "Ordnername" + }, + "folderHintText": { + "message": "Verschachtel einen Ordner, indem du den Namen des übergeordneten Ordners hinzufügst, gefolgt von einem „/“. Beispiel: Sozial/Foren" + }, + "deleteFolderPermanently": { + "message": "Bist du sicher, dass du diesen Ordner dauerhaft löschen willst?" + }, "baseDomain": { "message": "Basisdomäne", "description": "Domain name. Example: website.com" @@ -728,15 +740,6 @@ "itemName": { "message": "Eintrags-Name" }, - "cannotRemoveViewOnlyCollections": { - "message": "Du kannst Sammlungen mit Leseberechtigung nicht entfernen: $COLLECTIONS$", - "placeholders": { - "collections": { - "content": "$1", - "example": "Work, Personal" - } - } - }, "ex": { "message": "Bsp.", "description": "Short abbreviation for 'example'." @@ -1182,6 +1185,9 @@ "logInInitiated": { "message": "Anmeldung eingeleitet" }, + "logInRequestSent": { + "message": "Anfrage gesendet" + }, "submit": { "message": "Absenden" }, @@ -1371,12 +1377,39 @@ "notificationSentDevice": { "message": "Eine Benachrichtigung wurde an dein Gerät gesendet." }, + "notificationSentDevicePart1": { + "message": "Entsperre Bitwarden auf deinem Gerät oder mit der " + }, + "areYouTryingToAccessYourAccount": { + "message": "Versuchst du auf dein Konto zuzugreifen?" + }, + "accessAttemptBy": { + "message": "Zugriffsversuch von $EMAIL$", + "placeholders": { + "email": { + "content": "$1", + "example": "name@example.com" + } + } + }, + "confirmAccess": { + "message": "Zugriff bestätigen" + }, + "denyAccess": { + "message": "Zugriff ablehnen" + }, + "notificationSentDeviceAnchor": { + "message": "Web-App" + }, + "notificationSentDevicePart2": { + "message": "Stelle vor der Genehmigung sicher, dass die Fingerabdruck-Phrase mit der unten stehenden übereinstimmt." + }, + "notificationSentDeviceComplete": { + "message": "Entsperre Bitwarden auf deinem Gerät. Stelle vor der Genehmigung sicher, dass die Fingerabdruck-Phrase mit der unten stehenden übereinstimmt." + }, "aNotificationWasSentToYourDevice": { "message": "Eine Benachrichtigung wurde an dein Gerät gesendet" }, - "makeSureYourAccountIsUnlockedAndTheFingerprintEtc": { - "message": "Stelle sicher, dass dein Konto entsperrt ist und die Fingerabdruck-Phrase mit der vom anderen Gerät übereinstimmt" - }, "versionNumber": { "message": "Version $VERSION_NUMBER$", "placeholders": { @@ -1664,9 +1697,6 @@ "message": "Mehrdeutige Zeichen vermeiden", "description": "Label for the avoid ambiguous characters checkbox." }, - "regeneratePassword": { - "message": "Passwort neu generieren" - }, "length": { "message": "Länge" }, @@ -2170,8 +2200,20 @@ "manage": { "message": "Verwalten" }, - "canManage": { - "message": "Darf verwalten" + "manageCollection": { + "message": "Sammlung verwalten" + }, + "viewItems": { + "message": "Einträge anzeigen" + }, + "viewItemsHidePass": { + "message": "Einträge anzeigen, versteckte Passwörter" + }, + "editItems": { + "message": "Einträge bearbeiten" + }, + "editItemsHidePass": { + "message": "Einträge bearbeiten, versteckte Passwörter" }, "disable": { "message": "Deaktivieren" @@ -2368,11 +2410,8 @@ "twoFactorU2fProblemReadingTryAgain": { "message": "Es gab ein Problem beim Lesen des Sicherheitsschlüssels, bitte versuche es erneut." }, - "twoFactorWebAuthnWarning": { - "message": "Aufgrund von Plattformbeschränkungen kann WebAuthn nicht in allen Bitwarden-Anwendungen verwendet werden. Du solltest einen anderen Zwei-Faktor-Authentifizierungsanbieter aktivieren, damit du auf dein Konto zugreifen kannst, wenn WebAuthn nicht verwendet werden kann. Unterstützte Plattformen:" - }, - "twoFactorWebAuthnSupportWeb": { - "message": "Web-Tresor und Browser-Erweiterungen auf einem Desktop/Laptop mit einem WebAuthn-fähigen Browser (Chrome, Opera, Vivaldi oder Firefox mit aktiviertem FIDO U2F)." + "twoFactorWebAuthnWarning1": { + "message": "Aufgrund von Plattformbeschränkungen kann WebAuthn nicht in allen Bitwarden-Anwendungen verwendet werden. Du solltest einen anderen Zwei-Faktor-Authentifizierungsanbieter einrichten, damit du auf dein Konto zugreifen kannst, wenn WebAuthn nicht verwendet werden kann." }, "twoFactorRecoveryYourCode": { "message": "Ihr Wiederherstellungsschlüssel für die Zwei-Faktor-Anmeldung in Bitwarden" @@ -4710,9 +4749,6 @@ "passwordGeneratorPolicyDesc": { "message": "Mindestanforderungen für den Passwort-Generator festlegen." }, - "passwordGeneratorPolicyInEffect": { - "message": "Eine oder mehrere Organisationsrichtlinien beeinflussen deine Generator-Einstellungen." - }, "masterPasswordPolicyInEffect": { "message": "Eine oder mehrere Organisationsrichtlinien erfordern, dass dein Master-Passwort die folgenden Anforderungen erfüllt:" }, @@ -6681,15 +6717,6 @@ "message": "Generator", "description": "Short for 'credential generator'." }, - "whatWouldYouLikeToGenerate": { - "message": "Was möchtest du generieren?" - }, - "passwordType": { - "message": "Passworttyp" - }, - "regenerateUsername": { - "message": "Benutzername neu generieren" - }, "generateUsername": { "message": "Benutzername generieren" }, @@ -6730,9 +6757,6 @@ } } }, - "usernameType": { - "message": "Benutzernamenstyp" - }, "plusAddressedEmail": { "message": "Plus-adressierte E-Mail-Adresse", "description": "Username generator option that appends a random sub-address to the username. For example: address+subaddress@email.com" @@ -6952,9 +6976,6 @@ "message": "Hostname", "description": "Part of a URL." }, - "apiAccessToken": { - "message": "API-Zugriffstoken" - }, "deviceVerification": { "message": "Geräteverifizierung" }, @@ -7666,18 +7687,6 @@ "noCollection": { "message": "Keine Sammlung" }, - "canView": { - "message": "Darf anzeigen" - }, - "canViewExceptPass": { - "message": "Darf anzeigen, Passwörter ausgenommen" - }, - "canEdit": { - "message": "Darf bearbeiten" - }, - "canEditExceptPass": { - "message": "Darf bearbeiten, Passwörter ausgenommen" - }, "noCollectionsAdded": { "message": "Keine Sammlungen hinzugefügt" }, @@ -8677,9 +8686,6 @@ "message": "Selbst gehostete Server-URL", "description": "Label for field requesting a self-hosted integration service URL" }, - "aliasDomain": { - "message": "Alias-Domain" - }, "alreadyHaveAccount": { "message": "Hast du bereits ein Konto?" }, @@ -8741,11 +8747,11 @@ "readOnlyCollectionAccess": { "message": "Du hast keinen Zugriff zur Verwaltung dieser Sammlung." }, - "grantAddAccessCollectionWarningTitle": { - "message": "Fehlende \"Darf verwalten\"-Berechtigungen" + "grantManageCollectionWarningTitle": { + "message": "Berechtigungen zur Verwaltung von Sammlungen fehlen" }, - "grantAddAccessCollectionWarning": { - "message": "\"Darf verwalten\"-Berechtigungen gewähren, um die vollständige Sammlungsverwaltung einschließlich der Löschung von Sammlungen zu ermöglichen." + "grantManageCollectionWarning": { + "message": "Berechtigungen zur Verwaltung von Sammlungen gewähren, um die vollständige Verwaltung von Sammlungen, einschließlich der Löschung von Sammlungen, zu erlauben." }, "grantCollectionAccess": { "message": "Gewähre Gruppen oder Mitgliedern Zugriff auf diese Sammlung." @@ -9307,7 +9313,7 @@ "message": "Monat pro Mitglied" }, "monthPerMemberBilledAnnually": { - "message": "month per member billed annually" + "message": "Monat pro Mitglied jährlich in Rechnung gestellt" }, "seats": { "message": "Benutzerplätze" @@ -10091,6 +10097,15 @@ "descriptorCode": { "message": "Beschreibungscode" }, + "cannotRemoveViewOnlyCollections": { + "message": "Du kannst Sammlungen mit Leseberechtigung nicht entfernen: $COLLECTIONS$", + "placeholders": { + "collections": { + "content": "$1", + "example": "Work, Personal" + } + } + }, "importantNotice": { "message": "Wichtiger Hinweis" }, @@ -10281,5 +10296,54 @@ "example": "Acme c" } } + }, + "accountDeprovisioningNotification": { + "message": "Administratoren haben nun die Möglichkeit, Mitgliedskonten, die zu einer beanspruchten Domain gehören, zu löschen." + }, + "deleteManagedUserWarningDesc": { + "message": "Diese Aktion löscht das Mitgliedskonto, einschließlich aller Einträge in seinem Tresor. Dies ersetzt die vorherige Entfernen-Aktion." + }, + "deleteManagedUserWarning": { + "message": "Löschen ist eine neue Aktion!" + }, + "seatsRemaining": { + "message": "Du hast $REMAINING$ Plätze von $TOTAL$ dieser Organisation zugewiesenen Plätzen verfügbar. Kontaktiere deinen Anbieter, um dein Abonnement zu verwalten.", + "placeholders": { + "remaining": { + "content": "$1", + "example": "5" + }, + "total": { + "content": "$2", + "example": "10" + } + } + }, + "existingOrganization": { + "message": "Vorhandene Organisation" + }, + "selectOrganizationProviderPortal": { + "message": "Wähle eine Organisation aus, um sie deinem Anbieterportal hinzuzufügen." + }, + "noOrganizations": { + "message": "Keine Sammlungen vorhanden" + }, + "yourProviderSubscriptionCredit": { + "message": "Dein Anbieterabonnement erhält ein Guthaben für jede verbleibende Zeit im Abonnement der Organisation." + }, + "doYouWantToAddThisOrg": { + "message": "Möchtest du diese Organisation zu $PROVIDER$ hinzufügen?", + "placeholders": { + "provider": { + "content": "$1", + "example": "Cool MSP" + } + } + }, + "addedExistingOrganization": { + "message": "Vorhandene Organisation hinzugefügt" + }, + "assignedExceedsAvailable": { + "message": "Die zugewiesenen Plätze überschreiten die verfügbaren Plätze." } } diff --git a/apps/web/src/locales/el/messages.json b/apps/web/src/locales/el/messages.json index cade0d1f120..ea5f11e9162 100644 --- a/apps/web/src/locales/el/messages.json +++ b/apps/web/src/locales/el/messages.json @@ -464,6 +464,18 @@ "editFolder": { "message": "Επεξεργασία Φακέλου" }, + "newFolder": { + "message": "New folder" + }, + "folderName": { + "message": "Folder name" + }, + "folderHintText": { + "message": "Nest a folder by adding the parent folder's name followed by a “/”. Example: Social/Forums" + }, + "deleteFolderPermanently": { + "message": "Are you sure you want to permanently delete this folder?" + }, "baseDomain": { "message": "Βασικός τομέας", "description": "Domain name. Example: website.com" @@ -728,15 +740,6 @@ "itemName": { "message": "Όνομα αντικειμένου" }, - "cannotRemoveViewOnlyCollections": { - "message": "Δεν μπορείτε να αφαιρέσετε συλλογές που έχουν μόνο δικαιώματα Προβολής: $COLLECTIONS$", - "placeholders": { - "collections": { - "content": "$1", - "example": "Work, Personal" - } - } - }, "ex": { "message": "πχ.", "description": "Short abbreviation for 'example'." @@ -1182,6 +1185,9 @@ "logInInitiated": { "message": "Η σύνδεση ξεκίνησε" }, + "logInRequestSent": { + "message": "Request sent" + }, "submit": { "message": "Υποβολή" }, @@ -1371,12 +1377,39 @@ "notificationSentDevice": { "message": "Μια ειδοποίηση έχει σταλεί στη συσκευή σας." }, + "notificationSentDevicePart1": { + "message": "Unlock Bitwarden on your device or on the " + }, + "areYouTryingToAccessYourAccount": { + "message": "Are you trying to access your account?" + }, + "accessAttemptBy": { + "message": "Access attempt by $EMAIL$", + "placeholders": { + "email": { + "content": "$1", + "example": "name@example.com" + } + } + }, + "confirmAccess": { + "message": "Confirm access" + }, + "denyAccess": { + "message": "Deny access" + }, + "notificationSentDeviceAnchor": { + "message": "web app" + }, + "notificationSentDevicePart2": { + "message": "Make sure the Fingerprint phrase matches the one below before approving." + }, + "notificationSentDeviceComplete": { + "message": "Unlock Bitwarden on your device. Make sure the Fingerprint phrase matches the one below before approving." + }, "aNotificationWasSentToYourDevice": { "message": "A notification was sent to your device" }, - "makeSureYourAccountIsUnlockedAndTheFingerprintEtc": { - "message": "Make sure your account is unlocked and the fingerprint phrase matches on the other device" - }, "versionNumber": { "message": "Έκδοση $VERSION_NUMBER$", "placeholders": { @@ -1664,9 +1697,6 @@ "message": "Avoid ambiguous characters", "description": "Label for the avoid ambiguous characters checkbox." }, - "regeneratePassword": { - "message": "Επαναδημιουργία Κωδικού" - }, "length": { "message": "Μήκος" }, @@ -2170,8 +2200,20 @@ "manage": { "message": "Διαχείριση" }, - "canManage": { - "message": "Δυνατότητα διαχείρισης" + "manageCollection": { + "message": "Manage collection" + }, + "viewItems": { + "message": "View items" + }, + "viewItemsHidePass": { + "message": "View items, hidden passwords" + }, + "editItems": { + "message": "Edit items" + }, + "editItemsHidePass": { + "message": "Edit items, hidden passwords" }, "disable": { "message": "Απενεργοποίηση" @@ -2368,11 +2410,8 @@ "twoFactorU2fProblemReadingTryAgain": { "message": "Παρουσιάστηκε πρόβλημα κατά την ανάγνωση του κλειδιού ασφαλείας. Προσπάθησε ξανά." }, - "twoFactorWebAuthnWarning": { - "message": "Λόγω περιορισμών της πλατφόρμας, το WebAuthn δεν μπορεί να χρησιμοποιηθεί σε όλες τις εφαρμογές Bitwarden. Θα πρέπει να ενεργοποιήσετε έναν άλλο πάροχο σύνδεσης δύο βημάτων, ώστε να έχετε πρόσβαση στο λογαριασμό σας όταν δεν μπορεί να χρησιμοποιηθεί το WebAuthn. Υποστηριζόμενες πλατφόρμες:" - }, - "twoFactorWebAuthnSupportWeb": { - "message": "Web vault και επεκτάσεις browser σε έναν σταθερό / φορητό υπολογιστή με ένα πρόγραμμα περιήγησης WebAuthn (Chrome, Opera, Vivaldi, ή Firefox με FIDO U2F ενεργοποιημένο)." + "twoFactorWebAuthnWarning1": { + "message": "Due to platform limitations, WebAuthn cannot be used on all Bitwarden applications. You should set up another two-step login provider so that you can access your account when WebAuthn cannot be used." }, "twoFactorRecoveryYourCode": { "message": "Ο Bitwarden κωδικός ανάκτησης, εισόδου δύο βημάτων" @@ -4710,9 +4749,6 @@ "passwordGeneratorPolicyDesc": { "message": "Ελάχιστες απαιτήσεις διαμόρφωσης γεννήτριας κωδικών." }, - "passwordGeneratorPolicyInEffect": { - "message": "Μία ή περισσότερες πολιτικές του οργανισμού επηρεάζουν τις ρυθμίσεις της γεννήτριας." - }, "masterPasswordPolicyInEffect": { "message": "Σε μία ή περισσότερες πολιτικές του οργανισμού απαιτείται ο κύριος κωδικός να πληρεί τις ακόλουθες απαιτήσεις:" }, @@ -6681,15 +6717,6 @@ "message": "Γεννήτρια", "description": "Short for 'credential generator'." }, - "whatWouldYouLikeToGenerate": { - "message": "Τι θα θέλατε να δημιουργήσετε;" - }, - "passwordType": { - "message": "Τύπος Κωδικού" - }, - "regenerateUsername": { - "message": "Επαναδημιουργία Ονόματος Χρήστη" - }, "generateUsername": { "message": "Δημιουργία Ονόματος Χρήστη" }, @@ -6730,9 +6757,6 @@ } } }, - "usernameType": { - "message": "Τύπος Ονόματος Χρήστη" - }, "plusAddressedEmail": { "message": "Συν Διεύθυνση Email", "description": "Username generator option that appends a random sub-address to the username. For example: address+subaddress@email.com" @@ -6952,9 +6976,6 @@ "message": "Όνομα κεντρικού υπολογιστή", "description": "Part of a URL." }, - "apiAccessToken": { - "message": "Διακριτικό πρόσβασης API" - }, "deviceVerification": { "message": "Επαλήθευση συσκευής" }, @@ -7666,18 +7687,6 @@ "noCollection": { "message": "Καμία συλλογή" }, - "canView": { - "message": "Δυνατότητα προβολής" - }, - "canViewExceptPass": { - "message": "Δυνατότητα προβολής, εκτός των κωδικών πρόσβασης" - }, - "canEdit": { - "message": "Δυνατότητα επεξεργασίας" - }, - "canEditExceptPass": { - "message": "Δυνατότητα επεξεργασίας, εκτός των κωδικών πρόσβασης" - }, "noCollectionsAdded": { "message": "Δεν προστέθηκαν συλλογές" }, @@ -8677,9 +8686,6 @@ "message": "Self-host server URL", "description": "Label for field requesting a self-hosted integration service URL" }, - "aliasDomain": { - "message": "Ψευδώνυμο τομέα" - }, "alreadyHaveAccount": { "message": "Έχετε ήδη λογαριασμό;" }, @@ -8741,11 +8747,11 @@ "readOnlyCollectionAccess": { "message": "Δεν έχετε πρόσβαση για να διαχειριστείτε αυτήν τη συλλογή." }, - "grantAddAccessCollectionWarningTitle": { - "message": "Missing Can Manage Permissions" + "grantManageCollectionWarningTitle": { + "message": "Missing Manage Collection Permissions" }, - "grantAddAccessCollectionWarning": { - "message": "Grant Can manage permissions to allow full collection management including deletion of collection." + "grantManageCollectionWarning": { + "message": "Grant Manage collection permissions to allow full collection management including deletion of collection." }, "grantCollectionAccess": { "message": "Grant groups or members access to this collection." @@ -10091,6 +10097,15 @@ "descriptorCode": { "message": "Descriptor code" }, + "cannotRemoveViewOnlyCollections": { + "message": "Δεν μπορείτε να αφαιρέσετε συλλογές που έχουν μόνο δικαιώματα Προβολής: $COLLECTIONS$", + "placeholders": { + "collections": { + "content": "$1", + "example": "Work, Personal" + } + } + }, "importantNotice": { "message": "Important notice" }, @@ -10281,5 +10296,54 @@ "example": "Acme c" } } + }, + "accountDeprovisioningNotification": { + "message": "Administrators now have the ability to delete member accounts that belong to a claimed domain." + }, + "deleteManagedUserWarningDesc": { + "message": "This action will delete the member account including all items in their vault. This replaces the previous Remove action." + }, + "deleteManagedUserWarning": { + "message": "Delete is a new action!" + }, + "seatsRemaining": { + "message": "You have $REMAINING$ seats remaining out of $TOTAL$ seats assigned to this organization. Contact your provider to manage your subscription.", + "placeholders": { + "remaining": { + "content": "$1", + "example": "5" + }, + "total": { + "content": "$2", + "example": "10" + } + } + }, + "existingOrganization": { + "message": "Existing organization" + }, + "selectOrganizationProviderPortal": { + "message": "Select an organization to add to your Provider Portal." + }, + "noOrganizations": { + "message": "There are no organizations to list" + }, + "yourProviderSubscriptionCredit": { + "message": "Your provider subscription will receive a credit for any remaining time in the organization's subscription." + }, + "doYouWantToAddThisOrg": { + "message": "Do you want to add this organization to $PROVIDER$?", + "placeholders": { + "provider": { + "content": "$1", + "example": "Cool MSP" + } + } + }, + "addedExistingOrganization": { + "message": "Added existing organization" + }, + "assignedExceedsAvailable": { + "message": "Assigned seats exceed available seats." } } diff --git a/apps/web/src/locales/en/messages.json b/apps/web/src/locales/en/messages.json index 0f48595f09b..2ae1b8905ab 100644 --- a/apps/web/src/locales/en/messages.json +++ b/apps/web/src/locales/en/messages.json @@ -2183,6 +2183,9 @@ "twoStepLoginRecoveryWarning": { "message": "Setting up two-step login can permanently lock you out of your Bitwarden account. A recovery code allows you to access your account in the event that you can no longer use your normal two-step login provider (example: you lose your device). Bitwarden support will not be able to assist you if you lose access to your account. We recommend you write down or print the recovery code and keep it in a safe place." }, + "yourSingleUseRecoveryCode": { + "message": "Your single-use recovery code can be used to turn off two-step login in the event that you lose access to your two-step login provider. Bitwarden recommends you write down the recovery code and keep it in a safe place." + }, "viewRecoveryCode": { "message": "View recovery code" }, @@ -4193,6 +4196,9 @@ "recoverAccountTwoStepDesc": { "message": "If you cannot access your account through your normal two-step login methods, you can use your two-step login recovery code to turn off all two-step providers on your account." }, + "logInBelowUsingYourSingleUseRecoveryCode": { + "message": "Log in below using your single-use recovery code. This will turn off all two-step providers on your account." + }, "recoverAccountTwoStep": { "message": "Recover account two-step login" }, @@ -9269,7 +9275,12 @@ }, "deviceManagementDesc":{ "message": "Configure device management for Bitwarden using the implementation guide for your platform." - + }, + "desktopRequired": { + "message": "Desktop required" + }, + "reopenLinkOnDesktop": { + "message": "Reopen this link from your email on a desktop." }, "integrationCardTooltip":{ "message": "Launch $INTEGRATION$ implementation guide.", @@ -10264,6 +10275,38 @@ "organizationNameMaxLength": { "message": "Organization name cannot exceed 50 characters." }, + "openingExtension": { + "message": "Opening the Bitwarden browser extension" + }, + "somethingWentWrong":{ + "message": "Something went wrong..." + }, + "openingExtensionError": { + "message": "We had trouble opening the Bitwarden browser extension. Click the button to open it now." + }, + "openExtension": { + "message": "Open extension" + }, + "doNotHaveExtension": { + "message": "Don't have the Bitwarden browser extension?" + }, + "installExtension": { + "message": "Install extension" + }, + "openedExtension": { + "message": "Opened the browser extension" + }, + "openedExtensionViewAtRiskPasswords": { + "message": "Successfully opened the Bitwarden browser extension. You can now review your at-risk passwords." + }, + "openExtensionManuallyPart1": { + "message": "We had trouble opening the Bitwarden browser extension. Open the Bitwarden icon", + "description": "This will be used as part of a larger sentence, broken up to include the Bitwarden icon. The full sentence will read 'We had trouble opening the Bitwarden browser extension. Open the Bitwarden icon [Bitwarden Icon] from the toolbar.'" + }, + "openExtensionManuallyPart2": { + "message": "from the toolbar.", + "description": "This will be used as part of a larger sentence, broken up to include the Bitwarden icon. The full sentence will read 'We had trouble opening the Bitwarden browser extension. Open the Bitwarden icon [Bitwarden Icon] from the toolbar.'" + }, "resellerRenewalWarningMsg": { "message": "Your subscription will renew soon. To ensure uninterrupted service, contact $RESELLER$ to confirm your renewal before $RENEWAL_DATE$.", "placeholders": { diff --git a/apps/web/src/locales/en_GB/messages.json b/apps/web/src/locales/en_GB/messages.json index bebc54d2a8a..24aa0b675ab 100644 --- a/apps/web/src/locales/en_GB/messages.json +++ b/apps/web/src/locales/en_GB/messages.json @@ -464,6 +464,18 @@ "editFolder": { "message": "Edit folder" }, + "newFolder": { + "message": "New folder" + }, + "folderName": { + "message": "Folder name" + }, + "folderHintText": { + "message": "Nest a folder by adding the parent folder's name followed by a “/”. Example: Social/Forums" + }, + "deleteFolderPermanently": { + "message": "Are you sure you want to permanently delete this folder?" + }, "baseDomain": { "message": "Base domain", "description": "Domain name. Example: website.com" @@ -728,15 +740,6 @@ "itemName": { "message": "Item name" }, - "cannotRemoveViewOnlyCollections": { - "message": "You cannot remove collections with View only permissions: $COLLECTIONS$", - "placeholders": { - "collections": { - "content": "$1", - "example": "Work, Personal" - } - } - }, "ex": { "message": "e.g.", "description": "Short abbreviation for 'example'." @@ -1182,6 +1185,9 @@ "logInInitiated": { "message": "Log in initiated" }, + "logInRequestSent": { + "message": "Request sent" + }, "submit": { "message": "Submit" }, @@ -1371,12 +1377,39 @@ "notificationSentDevice": { "message": "A notification has been sent to your device." }, + "notificationSentDevicePart1": { + "message": "Unlock Bitwarden on your device or on the " + }, + "areYouTryingToAccessYourAccount": { + "message": "Are you trying to access your account?" + }, + "accessAttemptBy": { + "message": "Access attempt by $EMAIL$", + "placeholders": { + "email": { + "content": "$1", + "example": "name@example.com" + } + } + }, + "confirmAccess": { + "message": "Confirm access" + }, + "denyAccess": { + "message": "Deny access" + }, + "notificationSentDeviceAnchor": { + "message": "web app" + }, + "notificationSentDevicePart2": { + "message": "Make sure the Fingerprint phrase matches the one below before approving." + }, + "notificationSentDeviceComplete": { + "message": "Unlock Bitwarden on your device. Make sure the Fingerprint phrase matches the one below before approving." + }, "aNotificationWasSentToYourDevice": { "message": "A notification was sent to your device" }, - "makeSureYourAccountIsUnlockedAndTheFingerprintEtc": { - "message": "Make sure your account is unlocked and the fingerprint phrase matches on the other device" - }, "versionNumber": { "message": "Version $VERSION_NUMBER$", "placeholders": { @@ -1664,9 +1697,6 @@ "message": "Avoid ambiguous characters", "description": "Label for the avoid ambiguous characters checkbox." }, - "regeneratePassword": { - "message": "Regenerate password" - }, "length": { "message": "Length" }, @@ -2170,8 +2200,20 @@ "manage": { "message": "Manage" }, - "canManage": { - "message": "Can manage" + "manageCollection": { + "message": "Manage collection" + }, + "viewItems": { + "message": "View items" + }, + "viewItemsHidePass": { + "message": "View items, hidden passwords" + }, + "editItems": { + "message": "Edit items" + }, + "editItemsHidePass": { + "message": "Edit items, hidden passwords" }, "disable": { "message": "Turn off" @@ -2368,11 +2410,8 @@ "twoFactorU2fProblemReadingTryAgain": { "message": "There was a problem reading the security key. Try again." }, - "twoFactorWebAuthnWarning": { - "message": "Due to platform limitations, WebAuthn cannot be used on all Bitwarden applications. You should set up another two-step login provider so that you can access your account when WebAuthn cannot be used. Supported platforms:" - }, - "twoFactorWebAuthnSupportWeb": { - "message": "Web vault and browser extensions on a desktop/laptop with a WebAuthn supported browser (Chrome, Opera, Vivaldi, or Firefox with FIDO U2F turned on)." + "twoFactorWebAuthnWarning1": { + "message": "Due to platform limitations, WebAuthn cannot be used on all Bitwarden applications. You should set up another two-step login provider so that you can access your account when WebAuthn cannot be used." }, "twoFactorRecoveryYourCode": { "message": "Your Bitwarden two-step login recovery code" @@ -4710,9 +4749,6 @@ "passwordGeneratorPolicyDesc": { "message": "Set requirements for password generator." }, - "passwordGeneratorPolicyInEffect": { - "message": "One or more organisation policies are affecting your generator settings." - }, "masterPasswordPolicyInEffect": { "message": "One or more organisation policies require your master password to meet the following requirements:" }, @@ -6681,15 +6717,6 @@ "message": "Generator", "description": "Short for 'credential generator'." }, - "whatWouldYouLikeToGenerate": { - "message": "What would you like to generate?" - }, - "passwordType": { - "message": "Password type" - }, - "regenerateUsername": { - "message": "Regenerate username" - }, "generateUsername": { "message": "Generate username" }, @@ -6730,9 +6757,6 @@ } } }, - "usernameType": { - "message": "Username type" - }, "plusAddressedEmail": { "message": "Plus addressed email", "description": "Username generator option that appends a random sub-address to the username. For example: address+subaddress@email.com" @@ -6952,9 +6976,6 @@ "message": "Hostname", "description": "Part of a URL." }, - "apiAccessToken": { - "message": "API access token" - }, "deviceVerification": { "message": "Device verification" }, @@ -7666,18 +7687,6 @@ "noCollection": { "message": "No collection" }, - "canView": { - "message": "Can view" - }, - "canViewExceptPass": { - "message": "Can view, except passwords" - }, - "canEdit": { - "message": "Can edit" - }, - "canEditExceptPass": { - "message": "Can edit, except passwords" - }, "noCollectionsAdded": { "message": "No collections added" }, @@ -8677,9 +8686,6 @@ "message": "Self-host server URL", "description": "Label for field requesting a self-hosted integration service URL" }, - "aliasDomain": { - "message": "Alias domain" - }, "alreadyHaveAccount": { "message": "Already have an account?" }, @@ -8741,11 +8747,11 @@ "readOnlyCollectionAccess": { "message": "You do not have access to manage this collection." }, - "grantAddAccessCollectionWarningTitle": { - "message": "Missing Can Manage Permissions" + "grantManageCollectionWarningTitle": { + "message": "Missing Manage Collection Permissions" }, - "grantAddAccessCollectionWarning": { - "message": "Grant Can manage permissions to allow full collection management including deletion of collection." + "grantManageCollectionWarning": { + "message": "Grant Manage collection permissions to allow full collection management including deletion of collection." }, "grantCollectionAccess": { "message": "Grant groups or members access to this collection." @@ -10091,6 +10097,15 @@ "descriptorCode": { "message": "Descriptor code" }, + "cannotRemoveViewOnlyCollections": { + "message": "You cannot remove collections with View only permissions: $COLLECTIONS$", + "placeholders": { + "collections": { + "content": "$1", + "example": "Work, Personal" + } + } + }, "importantNotice": { "message": "Important notice" }, @@ -10281,5 +10296,54 @@ "example": "Acme c" } } + }, + "accountDeprovisioningNotification": { + "message": "Administrators now have the ability to delete member accounts that belong to a claimed domain." + }, + "deleteManagedUserWarningDesc": { + "message": "This action will delete the member account including all items in their vault. This replaces the previous Remove action." + }, + "deleteManagedUserWarning": { + "message": "Delete is a new action!" + }, + "seatsRemaining": { + "message": "You have $REMAINING$ seats remaining out of $TOTAL$ seats assigned to this organisation. Contact your provider to manage your subscription.", + "placeholders": { + "remaining": { + "content": "$1", + "example": "5" + }, + "total": { + "content": "$2", + "example": "10" + } + } + }, + "existingOrganization": { + "message": "Existing organisation" + }, + "selectOrganizationProviderPortal": { + "message": "Select an organisation to add to your Provider Portal." + }, + "noOrganizations": { + "message": "There are no organisations to list" + }, + "yourProviderSubscriptionCredit": { + "message": "Your provider subscription will receive a credit for any remaining time in the organisation's subscription." + }, + "doYouWantToAddThisOrg": { + "message": "Do you want to add this organisation to $PROVIDER$?", + "placeholders": { + "provider": { + "content": "$1", + "example": "Cool MSP" + } + } + }, + "addedExistingOrganization": { + "message": "Added existing organisation" + }, + "assignedExceedsAvailable": { + "message": "Assigned seats exceed available seats." } } diff --git a/apps/web/src/locales/en_IN/messages.json b/apps/web/src/locales/en_IN/messages.json index 14e17c15382..f4e4756b393 100644 --- a/apps/web/src/locales/en_IN/messages.json +++ b/apps/web/src/locales/en_IN/messages.json @@ -464,6 +464,18 @@ "editFolder": { "message": "Edit folder" }, + "newFolder": { + "message": "New folder" + }, + "folderName": { + "message": "Folder name" + }, + "folderHintText": { + "message": "Nest a folder by adding the parent folder's name followed by a “/”. Example: Social/Forums" + }, + "deleteFolderPermanently": { + "message": "Are you sure you want to permanently delete this folder?" + }, "baseDomain": { "message": "Base domain", "description": "Domain name. Example: website.com" @@ -728,15 +740,6 @@ "itemName": { "message": "Item name" }, - "cannotRemoveViewOnlyCollections": { - "message": "You cannot remove collections with View only permissions: $COLLECTIONS$", - "placeholders": { - "collections": { - "content": "$1", - "example": "Work, Personal" - } - } - }, "ex": { "message": "e.g.", "description": "Short abbreviation for 'example'." @@ -1182,6 +1185,9 @@ "logInInitiated": { "message": "Log in initiated" }, + "logInRequestSent": { + "message": "Request sent" + }, "submit": { "message": "Submit" }, @@ -1371,12 +1377,39 @@ "notificationSentDevice": { "message": "A notification has been sent to your device." }, + "notificationSentDevicePart1": { + "message": "Unlock Bitwarden on your device or on the " + }, + "areYouTryingToAccessYourAccount": { + "message": "Are you trying to access your account?" + }, + "accessAttemptBy": { + "message": "Access attempt by $EMAIL$", + "placeholders": { + "email": { + "content": "$1", + "example": "name@example.com" + } + } + }, + "confirmAccess": { + "message": "Confirm access" + }, + "denyAccess": { + "message": "Deny access" + }, + "notificationSentDeviceAnchor": { + "message": "web app" + }, + "notificationSentDevicePart2": { + "message": "Make sure the Fingerprint phrase matches the one below before approving." + }, + "notificationSentDeviceComplete": { + "message": "Unlock Bitwarden on your device. Make sure the Fingerprint phrase matches the one below before approving." + }, "aNotificationWasSentToYourDevice": { "message": "A notification was sent to your device" }, - "makeSureYourAccountIsUnlockedAndTheFingerprintEtc": { - "message": "Make sure your account is unlocked and the fingerprint phrase matches on the other device" - }, "versionNumber": { "message": "Version $VERSION_NUMBER$", "placeholders": { @@ -1664,9 +1697,6 @@ "message": "Avoid ambiguous characters", "description": "Label for the avoid ambiguous characters checkbox." }, - "regeneratePassword": { - "message": "Regenerate password" - }, "length": { "message": "Length" }, @@ -2170,8 +2200,20 @@ "manage": { "message": "Manage" }, - "canManage": { - "message": "Can manage" + "manageCollection": { + "message": "Manage collection" + }, + "viewItems": { + "message": "View items" + }, + "viewItemsHidePass": { + "message": "View items, hidden passwords" + }, + "editItems": { + "message": "Edit items" + }, + "editItemsHidePass": { + "message": "Edit items, hidden passwords" }, "disable": { "message": "Disable" @@ -2368,11 +2410,8 @@ "twoFactorU2fProblemReadingTryAgain": { "message": "There was a problem reading the security key. Try again." }, - "twoFactorWebAuthnWarning": { - "message": "Due to platform limitations, WebAuthn cannot be used on all Bitwarden applications. You should enable another two-step login provider so that you can access your account when WebAuthn cannot be used. Supported platforms:" - }, - "twoFactorWebAuthnSupportWeb": { - "message": "Web vault and browser extensions on a desktop/laptop with a WebAuthn enabled browser (Chrome, Opera, Vivaldi, or Firefox with FIDO U2F enabled)." + "twoFactorWebAuthnWarning1": { + "message": "Due to platform limitations, WebAuthn cannot be used on all Bitwarden applications. You should set up another two-step login provider so that you can access your account when WebAuthn cannot be used." }, "twoFactorRecoveryYourCode": { "message": "Your Bitwarden two-step login recovery code" @@ -4710,9 +4749,6 @@ "passwordGeneratorPolicyDesc": { "message": "Set minimum requirements for password generator configuration." }, - "passwordGeneratorPolicyInEffect": { - "message": "One or more organisation policies are affecting your generator settings." - }, "masterPasswordPolicyInEffect": { "message": "One or more organisation policies require your master password to meet the following requirements:" }, @@ -6681,15 +6717,6 @@ "message": "Generator", "description": "Short for 'credential generator'." }, - "whatWouldYouLikeToGenerate": { - "message": "What would you like to generate?" - }, - "passwordType": { - "message": "Password type" - }, - "regenerateUsername": { - "message": "Regenerate username" - }, "generateUsername": { "message": "Generate username" }, @@ -6730,9 +6757,6 @@ } } }, - "usernameType": { - "message": "Username type" - }, "plusAddressedEmail": { "message": "Plus addressed email", "description": "Username generator option that appends a random sub-address to the username. For example: address+subaddress@email.com" @@ -6952,9 +6976,6 @@ "message": "Hostname", "description": "Part of a URL." }, - "apiAccessToken": { - "message": "API access token" - }, "deviceVerification": { "message": "Device verification" }, @@ -7666,18 +7687,6 @@ "noCollection": { "message": "No collection" }, - "canView": { - "message": "Can view" - }, - "canViewExceptPass": { - "message": "Can view, except passwords" - }, - "canEdit": { - "message": "Can edit" - }, - "canEditExceptPass": { - "message": "Can edit, except passwords" - }, "noCollectionsAdded": { "message": "No collections added" }, @@ -8677,9 +8686,6 @@ "message": "Self-host server URL", "description": "Label for field requesting a self-hosted integration service URL" }, - "aliasDomain": { - "message": "Alias domain" - }, "alreadyHaveAccount": { "message": "Already have an account?" }, @@ -8741,11 +8747,11 @@ "readOnlyCollectionAccess": { "message": "You do not have access to manage this collection." }, - "grantAddAccessCollectionWarningTitle": { - "message": "Missing Can Manage Permissions" + "grantManageCollectionWarningTitle": { + "message": "Missing Manage Collection Permissions" }, - "grantAddAccessCollectionWarning": { - "message": "Grant Can manage permissions to allow full collection management including deletion of collection." + "grantManageCollectionWarning": { + "message": "Grant Manage collection permissions to allow full collection management including deletion of collection." }, "grantCollectionAccess": { "message": "Grant groups or members access to this collection." @@ -10091,6 +10097,15 @@ "descriptorCode": { "message": "Descriptor code" }, + "cannotRemoveViewOnlyCollections": { + "message": "You cannot remove collections with View only permissions: $COLLECTIONS$", + "placeholders": { + "collections": { + "content": "$1", + "example": "Work, Personal" + } + } + }, "importantNotice": { "message": "Important notice" }, @@ -10281,5 +10296,54 @@ "example": "Acme c" } } + }, + "accountDeprovisioningNotification": { + "message": "Administrators now have the ability to delete member accounts that belong to a claimed domain." + }, + "deleteManagedUserWarningDesc": { + "message": "This action will delete the member account including all items in their vault. This replaces the previous Remove action." + }, + "deleteManagedUserWarning": { + "message": "Delete is a new action!" + }, + "seatsRemaining": { + "message": "You have $REMAINING$ seats remaining out of $TOTAL$ seats assigned to this organisation. Contact your provider to manage your subscription.", + "placeholders": { + "remaining": { + "content": "$1", + "example": "5" + }, + "total": { + "content": "$2", + "example": "10" + } + } + }, + "existingOrganization": { + "message": "Existing organisation" + }, + "selectOrganizationProviderPortal": { + "message": "Select an organisation to add to your Provider Portal." + }, + "noOrganizations": { + "message": "There are no organisations to list" + }, + "yourProviderSubscriptionCredit": { + "message": "Your provider subscription will receive a credit for any remaining time in the organisation's subscription." + }, + "doYouWantToAddThisOrg": { + "message": "Do you want to add this organisation to $PROVIDER$?", + "placeholders": { + "provider": { + "content": "$1", + "example": "Cool MSP" + } + } + }, + "addedExistingOrganization": { + "message": "Added existing organisation" + }, + "assignedExceedsAvailable": { + "message": "Assigned seats exceed available seats." } } diff --git a/apps/web/src/locales/eo/messages.json b/apps/web/src/locales/eo/messages.json index e2721fe3f3d..a864ee99590 100644 --- a/apps/web/src/locales/eo/messages.json +++ b/apps/web/src/locales/eo/messages.json @@ -464,6 +464,18 @@ "editFolder": { "message": "Redakti dosierujon" }, + "newFolder": { + "message": "New folder" + }, + "folderName": { + "message": "Folder name" + }, + "folderHintText": { + "message": "Nest a folder by adding the parent folder's name followed by a “/”. Example: Social/Forums" + }, + "deleteFolderPermanently": { + "message": "Are you sure you want to permanently delete this folder?" + }, "baseDomain": { "message": "Baza domajno", "description": "Domain name. Example: website.com" @@ -728,15 +740,6 @@ "itemName": { "message": "Item name" }, - "cannotRemoveViewOnlyCollections": { - "message": "You cannot remove collections with View only permissions: $COLLECTIONS$", - "placeholders": { - "collections": { - "content": "$1", - "example": "Work, Personal" - } - } - }, "ex": { "message": "ekz.", "description": "Short abbreviation for 'example'." @@ -1182,6 +1185,9 @@ "logInInitiated": { "message": "Log in initiated" }, + "logInRequestSent": { + "message": "Request sent" + }, "submit": { "message": "Sendu" }, @@ -1371,12 +1377,39 @@ "notificationSentDevice": { "message": "A notification has been sent to your device." }, + "notificationSentDevicePart1": { + "message": "Unlock Bitwarden on your device or on the " + }, + "areYouTryingToAccessYourAccount": { + "message": "Are you trying to access your account?" + }, + "accessAttemptBy": { + "message": "Access attempt by $EMAIL$", + "placeholders": { + "email": { + "content": "$1", + "example": "name@example.com" + } + } + }, + "confirmAccess": { + "message": "Confirm access" + }, + "denyAccess": { + "message": "Deny access" + }, + "notificationSentDeviceAnchor": { + "message": "web app" + }, + "notificationSentDevicePart2": { + "message": "Make sure the Fingerprint phrase matches the one below before approving." + }, + "notificationSentDeviceComplete": { + "message": "Unlock Bitwarden on your device. Make sure the Fingerprint phrase matches the one below before approving." + }, "aNotificationWasSentToYourDevice": { "message": "A notification was sent to your device" }, - "makeSureYourAccountIsUnlockedAndTheFingerprintEtc": { - "message": "Make sure your account is unlocked and the fingerprint phrase matches on the other device" - }, "versionNumber": { "message": "Versio $VERSION_NUMBER$", "placeholders": { @@ -1664,9 +1697,6 @@ "message": "Avoid ambiguous characters", "description": "Label for the avoid ambiguous characters checkbox." }, - "regeneratePassword": { - "message": "Regeneri Pasvorton" - }, "length": { "message": "Longo" }, @@ -2170,8 +2200,20 @@ "manage": { "message": "Administri" }, - "canManage": { - "message": "Can manage" + "manageCollection": { + "message": "Manage collection" + }, + "viewItems": { + "message": "View items" + }, + "viewItemsHidePass": { + "message": "View items, hidden passwords" + }, + "editItems": { + "message": "Edit items" + }, + "editItemsHidePass": { + "message": "Edit items, hidden passwords" }, "disable": { "message": "Neebligi" @@ -2368,11 +2410,8 @@ "twoFactorU2fProblemReadingTryAgain": { "message": "There was a problem reading the security key. Try again." }, - "twoFactorWebAuthnWarning": { - "message": "Due to platform limitations, WebAuthn cannot be used on all Bitwarden applications. You should set up another two-step login provider so that you can access your account when WebAuthn cannot be used. Supported platforms:" - }, - "twoFactorWebAuthnSupportWeb": { - "message": "Web vault and browser extensions on a desktop/laptop with a WebAuthn supported browser (Chrome, Opera, Vivaldi, or Firefox with FIDO U2F turned on)." + "twoFactorWebAuthnWarning1": { + "message": "Due to platform limitations, WebAuthn cannot be used on all Bitwarden applications. You should set up another two-step login provider so that you can access your account when WebAuthn cannot be used." }, "twoFactorRecoveryYourCode": { "message": "Via kodo de senpaneigo de du-ŝtupa saluto de Bitwarden" @@ -4710,9 +4749,6 @@ "passwordGeneratorPolicyDesc": { "message": "Agordi minimumajn postulojn por agordi pasvortan generilon." }, - "passwordGeneratorPolicyInEffect": { - "message": "Unu aŭ pluraj organizaj politikoj influas viajn generatorajn agordojn." - }, "masterPasswordPolicyInEffect": { "message": "Unu aŭ pluraj organizaj politikoj postulas vian ĉefan pasvorton por plenumi la jenajn postulojn:" }, @@ -6681,15 +6717,6 @@ "message": "Generator", "description": "Short for 'credential generator'." }, - "whatWouldYouLikeToGenerate": { - "message": "What would you like to generate?" - }, - "passwordType": { - "message": "Password type" - }, - "regenerateUsername": { - "message": "Regenerate username" - }, "generateUsername": { "message": "Generate username" }, @@ -6730,9 +6757,6 @@ } } }, - "usernameType": { - "message": "Username type" - }, "plusAddressedEmail": { "message": "Plus addressed email", "description": "Username generator option that appends a random sub-address to the username. For example: address+subaddress@email.com" @@ -6952,9 +6976,6 @@ "message": "Domajna nomo", "description": "Part of a URL." }, - "apiAccessToken": { - "message": "API access token" - }, "deviceVerification": { "message": "Device verification" }, @@ -7666,18 +7687,6 @@ "noCollection": { "message": "No collection" }, - "canView": { - "message": "Can view" - }, - "canViewExceptPass": { - "message": "Can view, except passwords" - }, - "canEdit": { - "message": "Can edit" - }, - "canEditExceptPass": { - "message": "Can edit, except passwords" - }, "noCollectionsAdded": { "message": "No collections added" }, @@ -8677,9 +8686,6 @@ "message": "Self-host server URL", "description": "Label for field requesting a self-hosted integration service URL" }, - "aliasDomain": { - "message": "Alias domain" - }, "alreadyHaveAccount": { "message": "Already have an account?" }, @@ -8741,11 +8747,11 @@ "readOnlyCollectionAccess": { "message": "You do not have access to manage this collection." }, - "grantAddAccessCollectionWarningTitle": { - "message": "Missing Can Manage Permissions" + "grantManageCollectionWarningTitle": { + "message": "Missing Manage Collection Permissions" }, - "grantAddAccessCollectionWarning": { - "message": "Grant Can manage permissions to allow full collection management including deletion of collection." + "grantManageCollectionWarning": { + "message": "Grant Manage collection permissions to allow full collection management including deletion of collection." }, "grantCollectionAccess": { "message": "Grant groups or members access to this collection." @@ -10091,6 +10097,15 @@ "descriptorCode": { "message": "Descriptor code" }, + "cannotRemoveViewOnlyCollections": { + "message": "You cannot remove collections with View only permissions: $COLLECTIONS$", + "placeholders": { + "collections": { + "content": "$1", + "example": "Work, Personal" + } + } + }, "importantNotice": { "message": "Important notice" }, @@ -10281,5 +10296,54 @@ "example": "Acme c" } } + }, + "accountDeprovisioningNotification": { + "message": "Administrators now have the ability to delete member accounts that belong to a claimed domain." + }, + "deleteManagedUserWarningDesc": { + "message": "This action will delete the member account including all items in their vault. This replaces the previous Remove action." + }, + "deleteManagedUserWarning": { + "message": "Delete is a new action!" + }, + "seatsRemaining": { + "message": "You have $REMAINING$ seats remaining out of $TOTAL$ seats assigned to this organization. Contact your provider to manage your subscription.", + "placeholders": { + "remaining": { + "content": "$1", + "example": "5" + }, + "total": { + "content": "$2", + "example": "10" + } + } + }, + "existingOrganization": { + "message": "Existing organization" + }, + "selectOrganizationProviderPortal": { + "message": "Select an organization to add to your Provider Portal." + }, + "noOrganizations": { + "message": "There are no organizations to list" + }, + "yourProviderSubscriptionCredit": { + "message": "Your provider subscription will receive a credit for any remaining time in the organization's subscription." + }, + "doYouWantToAddThisOrg": { + "message": "Do you want to add this organization to $PROVIDER$?", + "placeholders": { + "provider": { + "content": "$1", + "example": "Cool MSP" + } + } + }, + "addedExistingOrganization": { + "message": "Added existing organization" + }, + "assignedExceedsAvailable": { + "message": "Assigned seats exceed available seats." } } diff --git a/apps/web/src/locales/es/messages.json b/apps/web/src/locales/es/messages.json index c93410b4e49..3ed9b7964f8 100644 --- a/apps/web/src/locales/es/messages.json +++ b/apps/web/src/locales/es/messages.json @@ -6,7 +6,7 @@ "message": "Aplicaciones críticas" }, "accessIntelligence": { - "message": "Access Intelligence" + "message": "Inteligencia de Acceso" }, "riskInsights": { "message": "Risk Insights" @@ -464,6 +464,18 @@ "editFolder": { "message": "Editar carpeta" }, + "newFolder": { + "message": "New folder" + }, + "folderName": { + "message": "Folder name" + }, + "folderHintText": { + "message": "Nest a folder by adding the parent folder's name followed by a “/”. Example: Social/Forums" + }, + "deleteFolderPermanently": { + "message": "Are you sure you want to permanently delete this folder?" + }, "baseDomain": { "message": "Dominio base", "description": "Domain name. Example: website.com" @@ -728,15 +740,6 @@ "itemName": { "message": "Nombre del elemento" }, - "cannotRemoveViewOnlyCollections": { - "message": "No puedes eliminar colecciones con permisos de solo visualización: $COLLECTIONS$", - "placeholders": { - "collections": { - "content": "$1", - "example": "Work, Personal" - } - } - }, "ex": { "message": "ej.", "description": "Short abbreviation for 'example'." @@ -1182,6 +1185,9 @@ "logInInitiated": { "message": "Inicio de sesión en proceso" }, + "logInRequestSent": { + "message": "Request sent" + }, "submit": { "message": "Enviar" }, @@ -1371,12 +1377,39 @@ "notificationSentDevice": { "message": "Se ha enviado una notificación a tu dispositivo." }, + "notificationSentDevicePart1": { + "message": "Unlock Bitwarden on your device or on the " + }, + "areYouTryingToAccessYourAccount": { + "message": "Are you trying to access your account?" + }, + "accessAttemptBy": { + "message": "Access attempt by $EMAIL$", + "placeholders": { + "email": { + "content": "$1", + "example": "name@example.com" + } + } + }, + "confirmAccess": { + "message": "Confirm access" + }, + "denyAccess": { + "message": "Deny access" + }, + "notificationSentDeviceAnchor": { + "message": "web app" + }, + "notificationSentDevicePart2": { + "message": "Make sure the Fingerprint phrase matches the one below before approving." + }, + "notificationSentDeviceComplete": { + "message": "Unlock Bitwarden on your device. Make sure the Fingerprint phrase matches the one below before approving." + }, "aNotificationWasSentToYourDevice": { "message": "A notification was sent to your device" }, - "makeSureYourAccountIsUnlockedAndTheFingerprintEtc": { - "message": "Make sure your account is unlocked and the fingerprint phrase matches on the other device" - }, "versionNumber": { "message": "Versión $VERSION_NUMBER$", "placeholders": { @@ -1664,9 +1697,6 @@ "message": "Avoid ambiguous characters", "description": "Label for the avoid ambiguous characters checkbox." }, - "regeneratePassword": { - "message": "Regenerar contraseña" - }, "length": { "message": "Longitud" }, @@ -2170,8 +2200,20 @@ "manage": { "message": "Gestionar" }, - "canManage": { - "message": "Puede gestionar" + "manageCollection": { + "message": "Manage collection" + }, + "viewItems": { + "message": "View items" + }, + "viewItemsHidePass": { + "message": "View items, hidden passwords" + }, + "editItems": { + "message": "Edit items" + }, + "editItemsHidePass": { + "message": "Edit items, hidden passwords" }, "disable": { "message": "Desactivar" @@ -2368,11 +2410,8 @@ "twoFactorU2fProblemReadingTryAgain": { "message": "Hubo un problema al leer la llave de seguridad. Inténtalo de nuevo." }, - "twoFactorWebAuthnWarning": { - "message": "Debido a las limitaciones de la plataforma, WebAuthn no puede ser utilizado en todas las aplicaciones de Bitwarden. Debería habilitar otro proveedor de inicio de sesión en dos-pasos para que pueda acceder a su cuenta cuando WebAuthn no pueda ser usado. Plataformas soportadas:" - }, - "twoFactorWebAuthnSupportWeb": { - "message": "Caja fuerte web y extensiones de navegador en un escritorio/portátil con un navegador WebAuthn habilitado (Chrome, Opera, Vivaldi o Firefox con FIDO U2F habilitado)." + "twoFactorWebAuthnWarning1": { + "message": "Due to platform limitations, WebAuthn cannot be used on all Bitwarden applications. You should set up another two-step login provider so that you can access your account when WebAuthn cannot be used." }, "twoFactorRecoveryYourCode": { "message": "Tu código de recuperación de inicio de sesión de dos pasos de Bitwarden" @@ -4710,9 +4749,6 @@ "passwordGeneratorPolicyDesc": { "message": "Establecer requisitos mínimos para la configuración del generador de contraseñas." }, - "passwordGeneratorPolicyInEffect": { - "message": "Una o más políticas de la organización están afectando su configuración del generador." - }, "masterPasswordPolicyInEffect": { "message": "Una o más políticas de la organización requieren que su contraseña maestra cumpla con los siguientes requisitos:" }, @@ -6681,15 +6717,6 @@ "message": "Generador", "description": "Short for 'credential generator'." }, - "whatWouldYouLikeToGenerate": { - "message": "¿Qué desea generar?" - }, - "passwordType": { - "message": "Tipo de contraseña" - }, - "regenerateUsername": { - "message": "Regenerar nombre de usuario" - }, "generateUsername": { "message": "Generar nombre de usuario" }, @@ -6730,9 +6757,6 @@ } } }, - "usernameType": { - "message": "Tipo de nombre de usuario" - }, "plusAddressedEmail": { "message": "Correo electrónico más dirigido", "description": "Username generator option that appends a random sub-address to the username. For example: address+subaddress@email.com" @@ -6952,9 +6976,6 @@ "message": "Nombre del host", "description": "Part of a URL." }, - "apiAccessToken": { - "message": "Token de acceso API" - }, "deviceVerification": { "message": "Verificación del dispositivo" }, @@ -7666,18 +7687,6 @@ "noCollection": { "message": "Sin colecciones" }, - "canView": { - "message": "Puede ver" - }, - "canViewExceptPass": { - "message": "Puede ver, excepto contraseñas" - }, - "canEdit": { - "message": "Puede editar" - }, - "canEditExceptPass": { - "message": "Puede editar, excepto contraseñas" - }, "noCollectionsAdded": { "message": "No hay colecciones añadidas" }, @@ -8677,9 +8686,6 @@ "message": "Self-host server URL", "description": "Label for field requesting a self-hosted integration service URL" }, - "aliasDomain": { - "message": "Dominio alias" - }, "alreadyHaveAccount": { "message": "¿Ya tienes una cuenta?" }, @@ -8741,11 +8747,11 @@ "readOnlyCollectionAccess": { "message": "You do not have access to manage this collection." }, - "grantAddAccessCollectionWarningTitle": { - "message": "Missing Can Manage Permissions" + "grantManageCollectionWarningTitle": { + "message": "Missing Manage Collection Permissions" }, - "grantAddAccessCollectionWarning": { - "message": "Grant Can manage permissions to allow full collection management including deletion of collection." + "grantManageCollectionWarning": { + "message": "Grant Manage collection permissions to allow full collection management including deletion of collection." }, "grantCollectionAccess": { "message": "Grant groups or members access to this collection." @@ -10091,6 +10097,15 @@ "descriptorCode": { "message": "Descriptor code" }, + "cannotRemoveViewOnlyCollections": { + "message": "No puedes eliminar colecciones con permisos de solo visualización: $COLLECTIONS$", + "placeholders": { + "collections": { + "content": "$1", + "example": "Work, Personal" + } + } + }, "importantNotice": { "message": "Important notice" }, @@ -10281,5 +10296,54 @@ "example": "Acme c" } } + }, + "accountDeprovisioningNotification": { + "message": "Administrators now have the ability to delete member accounts that belong to a claimed domain." + }, + "deleteManagedUserWarningDesc": { + "message": "This action will delete the member account including all items in their vault. This replaces the previous Remove action." + }, + "deleteManagedUserWarning": { + "message": "Delete is a new action!" + }, + "seatsRemaining": { + "message": "You have $REMAINING$ seats remaining out of $TOTAL$ seats assigned to this organization. Contact your provider to manage your subscription.", + "placeholders": { + "remaining": { + "content": "$1", + "example": "5" + }, + "total": { + "content": "$2", + "example": "10" + } + } + }, + "existingOrganization": { + "message": "Existing organization" + }, + "selectOrganizationProviderPortal": { + "message": "Select an organization to add to your Provider Portal." + }, + "noOrganizations": { + "message": "There are no organizations to list" + }, + "yourProviderSubscriptionCredit": { + "message": "Your provider subscription will receive a credit for any remaining time in the organization's subscription." + }, + "doYouWantToAddThisOrg": { + "message": "Do you want to add this organization to $PROVIDER$?", + "placeholders": { + "provider": { + "content": "$1", + "example": "Cool MSP" + } + } + }, + "addedExistingOrganization": { + "message": "Added existing organization" + }, + "assignedExceedsAvailable": { + "message": "Assigned seats exceed available seats." } } diff --git a/apps/web/src/locales/et/messages.json b/apps/web/src/locales/et/messages.json index 52c61c301b2..ede248d2b93 100644 --- a/apps/web/src/locales/et/messages.json +++ b/apps/web/src/locales/et/messages.json @@ -464,6 +464,18 @@ "editFolder": { "message": "Muuda kausta" }, + "newFolder": { + "message": "New folder" + }, + "folderName": { + "message": "Folder name" + }, + "folderHintText": { + "message": "Nest a folder by adding the parent folder's name followed by a “/”. Example: Social/Forums" + }, + "deleteFolderPermanently": { + "message": "Are you sure you want to permanently delete this folder?" + }, "baseDomain": { "message": "Domeen", "description": "Domain name. Example: website.com" @@ -728,15 +740,6 @@ "itemName": { "message": "Kirje nimi" }, - "cannotRemoveViewOnlyCollections": { - "message": "Sa ei saa eemaldada neid kogumikke ainult vaatamisloaga: $COLLECTIONS$", - "placeholders": { - "collections": { - "content": "$1", - "example": "Work, Personal" - } - } - }, "ex": { "message": "nt.", "description": "Short abbreviation for 'example'." @@ -1182,6 +1185,9 @@ "logInInitiated": { "message": "Sisselogimine käivitatud" }, + "logInRequestSent": { + "message": "Request sent" + }, "submit": { "message": "Kinnita" }, @@ -1371,12 +1377,39 @@ "notificationSentDevice": { "message": "Sinu seadmesse saadeti teavitus." }, + "notificationSentDevicePart1": { + "message": "Unlock Bitwarden on your device or on the " + }, + "areYouTryingToAccessYourAccount": { + "message": "Are you trying to access your account?" + }, + "accessAttemptBy": { + "message": "Access attempt by $EMAIL$", + "placeholders": { + "email": { + "content": "$1", + "example": "name@example.com" + } + } + }, + "confirmAccess": { + "message": "Confirm access" + }, + "denyAccess": { + "message": "Deny access" + }, + "notificationSentDeviceAnchor": { + "message": "web app" + }, + "notificationSentDevicePart2": { + "message": "Make sure the Fingerprint phrase matches the one below before approving." + }, + "notificationSentDeviceComplete": { + "message": "Unlock Bitwarden on your device. Make sure the Fingerprint phrase matches the one below before approving." + }, "aNotificationWasSentToYourDevice": { "message": "A notification was sent to your device" }, - "makeSureYourAccountIsUnlockedAndTheFingerprintEtc": { - "message": "Make sure your account is unlocked and the fingerprint phrase matches on the other device" - }, "versionNumber": { "message": "Versioon $VERSION_NUMBER$", "placeholders": { @@ -1664,9 +1697,6 @@ "message": "Avoid ambiguous characters", "description": "Label for the avoid ambiguous characters checkbox." }, - "regeneratePassword": { - "message": "Genereeri parool uuesti" - }, "length": { "message": "Pikkus" }, @@ -2170,8 +2200,20 @@ "manage": { "message": "Haldus" }, - "canManage": { - "message": "Saab muuta" + "manageCollection": { + "message": "Manage collection" + }, + "viewItems": { + "message": "View items" + }, + "viewItemsHidePass": { + "message": "View items, hidden passwords" + }, + "editItems": { + "message": "Edit items" + }, + "editItemsHidePass": { + "message": "Edit items, hidden passwords" }, "disable": { "message": "Keela" @@ -2368,11 +2410,8 @@ "twoFactorU2fProblemReadingTryAgain": { "message": "Turvavõtme lugemisel tekkis tõrge. Proovi uuesti." }, - "twoFactorWebAuthnWarning": { - "message": "Mõnede platvormi piirangute tõttu ei saa WebAuthn'i kõikide Bitwardeni rakendustega kasutada. Võiksid kaaluda teise kaheastmelise kinnitamise aktiveerimist olukordadeks, kus WebAuthn'i ei saa kasutada. Toetatud platvormid:" - }, - "twoFactorWebAuthnSupportWeb": { - "message": "Veebihoidla- ja brauseri laiendused laua- ja sülearvutis, kus on WebAuthn toega brauser (Chrome, Opera, Vivaldi või Firefox, kus on FIDO U2F sisse lülitatud)." + "twoFactorWebAuthnWarning1": { + "message": "Due to platform limitations, WebAuthn cannot be used on all Bitwarden applications. You should set up another two-step login provider so that you can access your account when WebAuthn cannot be used." }, "twoFactorRecoveryYourCode": { "message": "Bitwardeni kaheastmelise logimise varukood" @@ -4710,9 +4749,6 @@ "passwordGeneratorPolicyDesc": { "message": "Määra parooli genereerija konfiguratsiooni tingimused." }, - "passwordGeneratorPolicyInEffect": { - "message": "Organisatsiooni seaded mõjutavad parooli genereerija sätteid." - }, "masterPasswordPolicyInEffect": { "message": "Üks või enam organisatsiooni eeskirja nõuavad, et ülemparool vastaks nendele nõudmistele:" }, @@ -6681,15 +6717,6 @@ "message": "Genereerija", "description": "Short for 'credential generator'." }, - "whatWouldYouLikeToGenerate": { - "message": "Mida sa soovid genereerida?" - }, - "passwordType": { - "message": "Parooli tüüp" - }, - "regenerateUsername": { - "message": "Genereeri kasutajanimi uuesti" - }, "generateUsername": { "message": "Genereeri kasutajanimi" }, @@ -6730,9 +6757,6 @@ } } }, - "usernameType": { - "message": "Kasutajanime tüüp" - }, "plusAddressedEmail": { "message": "Plussiga e-posti aadress", "description": "Username generator option that appends a random sub-address to the username. For example: address+subaddress@email.com" @@ -6952,9 +6976,6 @@ "message": "Hosti nimi", "description": "Part of a URL." }, - "apiAccessToken": { - "message": "API võti" - }, "deviceVerification": { "message": "Seadme kinnitamine" }, @@ -7666,18 +7687,6 @@ "noCollection": { "message": "No collection" }, - "canView": { - "message": "Can view" - }, - "canViewExceptPass": { - "message": "Can view, except passwords" - }, - "canEdit": { - "message": "Can edit" - }, - "canEditExceptPass": { - "message": "Can edit, except passwords" - }, "noCollectionsAdded": { "message": "No collections added" }, @@ -8677,9 +8686,6 @@ "message": "Self-host server URL", "description": "Label for field requesting a self-hosted integration service URL" }, - "aliasDomain": { - "message": "Alias domeen" - }, "alreadyHaveAccount": { "message": "Already have an account?" }, @@ -8741,11 +8747,11 @@ "readOnlyCollectionAccess": { "message": "You do not have access to manage this collection." }, - "grantAddAccessCollectionWarningTitle": { - "message": "Missing Can Manage Permissions" + "grantManageCollectionWarningTitle": { + "message": "Missing Manage Collection Permissions" }, - "grantAddAccessCollectionWarning": { - "message": "Grant Can manage permissions to allow full collection management including deletion of collection." + "grantManageCollectionWarning": { + "message": "Grant Manage collection permissions to allow full collection management including deletion of collection." }, "grantCollectionAccess": { "message": "Grant groups or members access to this collection." @@ -10091,6 +10097,15 @@ "descriptorCode": { "message": "Descriptor code" }, + "cannotRemoveViewOnlyCollections": { + "message": "Sa ei saa eemaldada neid kogumikke ainult vaatamisloaga: $COLLECTIONS$", + "placeholders": { + "collections": { + "content": "$1", + "example": "Work, Personal" + } + } + }, "importantNotice": { "message": "Important notice" }, @@ -10281,5 +10296,54 @@ "example": "Acme c" } } + }, + "accountDeprovisioningNotification": { + "message": "Administrators now have the ability to delete member accounts that belong to a claimed domain." + }, + "deleteManagedUserWarningDesc": { + "message": "This action will delete the member account including all items in their vault. This replaces the previous Remove action." + }, + "deleteManagedUserWarning": { + "message": "Delete is a new action!" + }, + "seatsRemaining": { + "message": "You have $REMAINING$ seats remaining out of $TOTAL$ seats assigned to this organization. Contact your provider to manage your subscription.", + "placeholders": { + "remaining": { + "content": "$1", + "example": "5" + }, + "total": { + "content": "$2", + "example": "10" + } + } + }, + "existingOrganization": { + "message": "Existing organization" + }, + "selectOrganizationProviderPortal": { + "message": "Select an organization to add to your Provider Portal." + }, + "noOrganizations": { + "message": "There are no organizations to list" + }, + "yourProviderSubscriptionCredit": { + "message": "Your provider subscription will receive a credit for any remaining time in the organization's subscription." + }, + "doYouWantToAddThisOrg": { + "message": "Do you want to add this organization to $PROVIDER$?", + "placeholders": { + "provider": { + "content": "$1", + "example": "Cool MSP" + } + } + }, + "addedExistingOrganization": { + "message": "Added existing organization" + }, + "assignedExceedsAvailable": { + "message": "Assigned seats exceed available seats." } } diff --git a/apps/web/src/locales/eu/messages.json b/apps/web/src/locales/eu/messages.json index 8e4d12fb1f4..0b230da1545 100644 --- a/apps/web/src/locales/eu/messages.json +++ b/apps/web/src/locales/eu/messages.json @@ -464,6 +464,18 @@ "editFolder": { "message": "Editatu Karpeta" }, + "newFolder": { + "message": "New folder" + }, + "folderName": { + "message": "Folder name" + }, + "folderHintText": { + "message": "Nest a folder by adding the parent folder's name followed by a “/”. Example: Social/Forums" + }, + "deleteFolderPermanently": { + "message": "Are you sure you want to permanently delete this folder?" + }, "baseDomain": { "message": "Oinarrizko domeinua", "description": "Domain name. Example: website.com" @@ -728,15 +740,6 @@ "itemName": { "message": "Item name" }, - "cannotRemoveViewOnlyCollections": { - "message": "You cannot remove collections with View only permissions: $COLLECTIONS$", - "placeholders": { - "collections": { - "content": "$1", - "example": "Work, Personal" - } - } - }, "ex": { "message": "adb.", "description": "Short abbreviation for 'example'." @@ -1182,6 +1185,9 @@ "logInInitiated": { "message": "Saioa hastea martxan da" }, + "logInRequestSent": { + "message": "Request sent" + }, "submit": { "message": "Bidali" }, @@ -1371,12 +1377,39 @@ "notificationSentDevice": { "message": "Jakinarazpen bat bidali da zure gailura." }, + "notificationSentDevicePart1": { + "message": "Unlock Bitwarden on your device or on the " + }, + "areYouTryingToAccessYourAccount": { + "message": "Are you trying to access your account?" + }, + "accessAttemptBy": { + "message": "Access attempt by $EMAIL$", + "placeholders": { + "email": { + "content": "$1", + "example": "name@example.com" + } + } + }, + "confirmAccess": { + "message": "Confirm access" + }, + "denyAccess": { + "message": "Deny access" + }, + "notificationSentDeviceAnchor": { + "message": "web app" + }, + "notificationSentDevicePart2": { + "message": "Make sure the Fingerprint phrase matches the one below before approving." + }, + "notificationSentDeviceComplete": { + "message": "Unlock Bitwarden on your device. Make sure the Fingerprint phrase matches the one below before approving." + }, "aNotificationWasSentToYourDevice": { "message": "A notification was sent to your device" }, - "makeSureYourAccountIsUnlockedAndTheFingerprintEtc": { - "message": "Make sure your account is unlocked and the fingerprint phrase matches on the other device" - }, "versionNumber": { "message": "$VERSION_NUMBER$ bertsioa", "placeholders": { @@ -1664,9 +1697,6 @@ "message": "Avoid ambiguous characters", "description": "Label for the avoid ambiguous characters checkbox." }, - "regeneratePassword": { - "message": "Berrezarri pasahitza" - }, "length": { "message": "Luzera" }, @@ -2170,8 +2200,20 @@ "manage": { "message": "Kudeatu" }, - "canManage": { - "message": "Can manage" + "manageCollection": { + "message": "Manage collection" + }, + "viewItems": { + "message": "View items" + }, + "viewItemsHidePass": { + "message": "View items, hidden passwords" + }, + "editItems": { + "message": "Edit items" + }, + "editItemsHidePass": { + "message": "Edit items, hidden passwords" }, "disable": { "message": "Desgaitu" @@ -2368,11 +2410,8 @@ "twoFactorU2fProblemReadingTryAgain": { "message": "Arazo bat egon da segurtasun-gakoa irakurtzean. Saiatu berriro mesedez." }, - "twoFactorWebAuthnWarning": { - "message": "Plataformaren mugak direla eta, WebAuthn ezin da erabili Bitwarden-en aplikazio guztietan. Bi urratseko saio hasierako beste hornitzaile bat gaitu beharko duzu, WebAuthn erabili ezin denean zure kontuan sartzeko. Plataforma bateragarriak:" - }, - "twoFactorWebAuthnSupportWeb": { - "message": "Webguneko kutxa gotorra eta nabigatzailearen gehiagarriak mahaigain/ordenagailu eramangarri batean, WebAuthn nabigatzaile gaitu batekin (Chrome, Opera, Vivaldi edo Firefox, FIDO U2F gaitua duena)." + "twoFactorWebAuthnWarning1": { + "message": "Due to platform limitations, WebAuthn cannot be used on all Bitwarden applications. You should set up another two-step login provider so that you can access your account when WebAuthn cannot be used." }, "twoFactorRecoveryYourCode": { "message": "Zure Bitwardeneko bi urratseko saio hasierako berreskuratze-kodea" @@ -4710,9 +4749,6 @@ "passwordGeneratorPolicyDesc": { "message": "Ezarri pasahitz sortzailearen gutxieneko baldintzak." }, - "passwordGeneratorPolicyInEffect": { - "message": "Erakundeko politika batek edo gehiagok sortzailearen konfigurazioari eragiten diote." - }, "masterPasswordPolicyInEffect": { "message": "Erakundeko politika batek edo gehiagok pasahitz nagusia behar dute baldintza hauek betetzeko:" }, @@ -6681,15 +6717,6 @@ "message": "Sortzailea", "description": "Short for 'credential generator'." }, - "whatWouldYouLikeToGenerate": { - "message": "Zer sortu nahi duzu?" - }, - "passwordType": { - "message": "Pasahitz mota" - }, - "regenerateUsername": { - "message": "Berrezarri erabiltzaile izena" - }, "generateUsername": { "message": "Sortu erabiltzaile izena" }, @@ -6730,9 +6757,6 @@ } } }, - "usernameType": { - "message": "Erabiltzaile izen mota" - }, "plusAddressedEmail": { "message": "Atzizkidun emaila", "description": "Username generator option that appends a random sub-address to the username. For example: address+subaddress@email.com" @@ -6952,9 +6976,6 @@ "message": "Ostalariaren izena", "description": "Part of a URL." }, - "apiAccessToken": { - "message": "Token sarbide API-a" - }, "deviceVerification": { "message": "Gailu egiaztapena" }, @@ -7666,18 +7687,6 @@ "noCollection": { "message": "No collection" }, - "canView": { - "message": "Ikus dezake" - }, - "canViewExceptPass": { - "message": "Ikus dezake, pasahitza izan ezik" - }, - "canEdit": { - "message": "Editatu dezake" - }, - "canEditExceptPass": { - "message": "Editatu dezake, pasahitza izan ezik" - }, "noCollectionsAdded": { "message": "No collections added" }, @@ -8677,9 +8686,6 @@ "message": "Self-host server URL", "description": "Label for field requesting a self-hosted integration service URL" }, - "aliasDomain": { - "message": "Alias domain" - }, "alreadyHaveAccount": { "message": "Already have an account?" }, @@ -8741,11 +8747,11 @@ "readOnlyCollectionAccess": { "message": "You do not have access to manage this collection." }, - "grantAddAccessCollectionWarningTitle": { - "message": "Missing Can Manage Permissions" + "grantManageCollectionWarningTitle": { + "message": "Missing Manage Collection Permissions" }, - "grantAddAccessCollectionWarning": { - "message": "Grant Can manage permissions to allow full collection management including deletion of collection." + "grantManageCollectionWarning": { + "message": "Grant Manage collection permissions to allow full collection management including deletion of collection." }, "grantCollectionAccess": { "message": "Grant groups or members access to this collection." @@ -10091,6 +10097,15 @@ "descriptorCode": { "message": "Descriptor code" }, + "cannotRemoveViewOnlyCollections": { + "message": "You cannot remove collections with View only permissions: $COLLECTIONS$", + "placeholders": { + "collections": { + "content": "$1", + "example": "Work, Personal" + } + } + }, "importantNotice": { "message": "Important notice" }, @@ -10281,5 +10296,54 @@ "example": "Acme c" } } + }, + "accountDeprovisioningNotification": { + "message": "Administrators now have the ability to delete member accounts that belong to a claimed domain." + }, + "deleteManagedUserWarningDesc": { + "message": "This action will delete the member account including all items in their vault. This replaces the previous Remove action." + }, + "deleteManagedUserWarning": { + "message": "Delete is a new action!" + }, + "seatsRemaining": { + "message": "You have $REMAINING$ seats remaining out of $TOTAL$ seats assigned to this organization. Contact your provider to manage your subscription.", + "placeholders": { + "remaining": { + "content": "$1", + "example": "5" + }, + "total": { + "content": "$2", + "example": "10" + } + } + }, + "existingOrganization": { + "message": "Existing organization" + }, + "selectOrganizationProviderPortal": { + "message": "Select an organization to add to your Provider Portal." + }, + "noOrganizations": { + "message": "There are no organizations to list" + }, + "yourProviderSubscriptionCredit": { + "message": "Your provider subscription will receive a credit for any remaining time in the organization's subscription." + }, + "doYouWantToAddThisOrg": { + "message": "Do you want to add this organization to $PROVIDER$?", + "placeholders": { + "provider": { + "content": "$1", + "example": "Cool MSP" + } + } + }, + "addedExistingOrganization": { + "message": "Added existing organization" + }, + "assignedExceedsAvailable": { + "message": "Assigned seats exceed available seats." } } diff --git a/apps/web/src/locales/fa/messages.json b/apps/web/src/locales/fa/messages.json index 51d862e5314..cfcf12c7907 100644 --- a/apps/web/src/locales/fa/messages.json +++ b/apps/web/src/locales/fa/messages.json @@ -464,6 +464,18 @@ "editFolder": { "message": "ويرايش پوشه" }, + "newFolder": { + "message": "New folder" + }, + "folderName": { + "message": "Folder name" + }, + "folderHintText": { + "message": "Nest a folder by adding the parent folder's name followed by a “/”. Example: Social/Forums" + }, + "deleteFolderPermanently": { + "message": "Are you sure you want to permanently delete this folder?" + }, "baseDomain": { "message": "دامنه پایه", "description": "Domain name. Example: website.com" @@ -728,15 +740,6 @@ "itemName": { "message": "Item name" }, - "cannotRemoveViewOnlyCollections": { - "message": "You cannot remove collections with View only permissions: $COLLECTIONS$", - "placeholders": { - "collections": { - "content": "$1", - "example": "Work, Personal" - } - } - }, "ex": { "message": "مثال.", "description": "Short abbreviation for 'example'." @@ -1182,6 +1185,9 @@ "logInInitiated": { "message": "ورود به سیستم آغاز شد" }, + "logInRequestSent": { + "message": "Request sent" + }, "submit": { "message": "ثبت" }, @@ -1371,12 +1377,39 @@ "notificationSentDevice": { "message": "یک اعلان به دستگاه شما ارسال شده است." }, + "notificationSentDevicePart1": { + "message": "Unlock Bitwarden on your device or on the " + }, + "areYouTryingToAccessYourAccount": { + "message": "Are you trying to access your account?" + }, + "accessAttemptBy": { + "message": "Access attempt by $EMAIL$", + "placeholders": { + "email": { + "content": "$1", + "example": "name@example.com" + } + } + }, + "confirmAccess": { + "message": "Confirm access" + }, + "denyAccess": { + "message": "Deny access" + }, + "notificationSentDeviceAnchor": { + "message": "web app" + }, + "notificationSentDevicePart2": { + "message": "Make sure the Fingerprint phrase matches the one below before approving." + }, + "notificationSentDeviceComplete": { + "message": "Unlock Bitwarden on your device. Make sure the Fingerprint phrase matches the one below before approving." + }, "aNotificationWasSentToYourDevice": { "message": "A notification was sent to your device" }, - "makeSureYourAccountIsUnlockedAndTheFingerprintEtc": { - "message": "Make sure your account is unlocked and the fingerprint phrase matches on the other device" - }, "versionNumber": { "message": "نسخه $VERSION_NUMBER$", "placeholders": { @@ -1664,9 +1697,6 @@ "message": "Avoid ambiguous characters", "description": "Label for the avoid ambiguous characters checkbox." }, - "regeneratePassword": { - "message": "تولید مجدد کلمه عبور" - }, "length": { "message": "طول" }, @@ -2170,8 +2200,20 @@ "manage": { "message": "مدیریت" }, - "canManage": { - "message": "Can manage" + "manageCollection": { + "message": "Manage collection" + }, + "viewItems": { + "message": "View items" + }, + "viewItemsHidePass": { + "message": "View items, hidden passwords" + }, + "editItems": { + "message": "Edit items" + }, + "editItemsHidePass": { + "message": "Edit items, hidden passwords" }, "disable": { "message": "خاموش کردن" @@ -2368,11 +2410,8 @@ "twoFactorU2fProblemReadingTryAgain": { "message": "مشکلی در خواندن کلید امنیتی وجود داشت. دوباره امتحان کنید." }, - "twoFactorWebAuthnWarning": { - "message": "به دلیل محدودیت‌های پلتفرم، WebAuthn نمی‌تواند در همه برنامه‌های Bitwarden استفاده شود. باید یک ارائه‌دهنده‌ی ورود دو مرحله‌ای دیگر راه‌اندازی کنید تا زمانی که WebAuthn قابل استفاده نیست، بتوانید به حساب خود دسترسی داشته باشید. پلتفرم های پشتیبانی شده:" - }, - "twoFactorWebAuthnSupportWeb": { - "message": "گاوصندوق وب و برنامه‌های افزودنی مرورگر روی دسکتاپ/لپ‌تاپ با مرورگر پشتیبانی‌شده از WebAuthn (Chrome، Opera، Vivaldi یا Firefox با FIDO U2F روشن)." + "twoFactorWebAuthnWarning1": { + "message": "Due to platform limitations, WebAuthn cannot be used on all Bitwarden applications. You should set up another two-step login provider so that you can access your account when WebAuthn cannot be used." }, "twoFactorRecoveryYourCode": { "message": "کد بازیابی ورود دو مرحله ای Bitwarden شما" @@ -4710,9 +4749,6 @@ "passwordGeneratorPolicyDesc": { "message": "الزامات را برای تولید کننده کلمه عبور تنظیم کنید." }, - "passwordGeneratorPolicyInEffect": { - "message": "یک یا چند سیاست سازمان بر تنظیمات تولید کننده شما تأثیر می‌گذارد." - }, "masterPasswordPolicyInEffect": { "message": "یک یا چند سیاست سازمانی برای تأمین شرایط زیر به کلمه عبور اصلی شما احتیاج دارد:" }, @@ -6681,15 +6717,6 @@ "message": "تولید کننده", "description": "Short for 'credential generator'." }, - "whatWouldYouLikeToGenerate": { - "message": "چه چیزی دوست دارید تولید کنید؟" - }, - "passwordType": { - "message": "نوع کلمه عبور" - }, - "regenerateUsername": { - "message": "ایجاد مجدد نام کاربری" - }, "generateUsername": { "message": "ایجاد نام کاربری" }, @@ -6730,9 +6757,6 @@ } } }, - "usernameType": { - "message": "نوع نام کاربری" - }, "plusAddressedEmail": { "message": "به علاوه نشانی ایمیل داده شده", "description": "Username generator option that appends a random sub-address to the username. For example: address+subaddress@email.com" @@ -6952,9 +6976,6 @@ "message": "نام میزبان", "description": "Part of a URL." }, - "apiAccessToken": { - "message": "توکن دسترسی API" - }, "deviceVerification": { "message": "تأیید دستگاه" }, @@ -7666,18 +7687,6 @@ "noCollection": { "message": "مجموعه ای وجود ندارد" }, - "canView": { - "message": "می‌تواند مشاهده کند" - }, - "canViewExceptPass": { - "message": "قابل مشاهده، به غیر از کلمه‌های عبور" - }, - "canEdit": { - "message": "می‌تواند ویرایش کند" - }, - "canEditExceptPass": { - "message": "قابل ویرایش، به غیر از کلمه‌های عبور" - }, "noCollectionsAdded": { "message": "مجموعه ای اضافه نشد" }, @@ -8677,9 +8686,6 @@ "message": "Self-host server URL", "description": "Label for field requesting a self-hosted integration service URL" }, - "aliasDomain": { - "message": "دامنه مستعار" - }, "alreadyHaveAccount": { "message": "پیشتر حساب کاربری داشته اید؟" }, @@ -8741,11 +8747,11 @@ "readOnlyCollectionAccess": { "message": "You do not have access to manage this collection." }, - "grantAddAccessCollectionWarningTitle": { - "message": "Missing Can Manage Permissions" + "grantManageCollectionWarningTitle": { + "message": "Missing Manage Collection Permissions" }, - "grantAddAccessCollectionWarning": { - "message": "Grant Can manage permissions to allow full collection management including deletion of collection." + "grantManageCollectionWarning": { + "message": "Grant Manage collection permissions to allow full collection management including deletion of collection." }, "grantCollectionAccess": { "message": "Grant groups or members access to this collection." @@ -10091,6 +10097,15 @@ "descriptorCode": { "message": "Descriptor code" }, + "cannotRemoveViewOnlyCollections": { + "message": "You cannot remove collections with View only permissions: $COLLECTIONS$", + "placeholders": { + "collections": { + "content": "$1", + "example": "Work, Personal" + } + } + }, "importantNotice": { "message": "Important notice" }, @@ -10281,5 +10296,54 @@ "example": "Acme c" } } + }, + "accountDeprovisioningNotification": { + "message": "Administrators now have the ability to delete member accounts that belong to a claimed domain." + }, + "deleteManagedUserWarningDesc": { + "message": "This action will delete the member account including all items in their vault. This replaces the previous Remove action." + }, + "deleteManagedUserWarning": { + "message": "Delete is a new action!" + }, + "seatsRemaining": { + "message": "You have $REMAINING$ seats remaining out of $TOTAL$ seats assigned to this organization. Contact your provider to manage your subscription.", + "placeholders": { + "remaining": { + "content": "$1", + "example": "5" + }, + "total": { + "content": "$2", + "example": "10" + } + } + }, + "existingOrganization": { + "message": "Existing organization" + }, + "selectOrganizationProviderPortal": { + "message": "Select an organization to add to your Provider Portal." + }, + "noOrganizations": { + "message": "There are no organizations to list" + }, + "yourProviderSubscriptionCredit": { + "message": "Your provider subscription will receive a credit for any remaining time in the organization's subscription." + }, + "doYouWantToAddThisOrg": { + "message": "Do you want to add this organization to $PROVIDER$?", + "placeholders": { + "provider": { + "content": "$1", + "example": "Cool MSP" + } + } + }, + "addedExistingOrganization": { + "message": "Added existing organization" + }, + "assignedExceedsAvailable": { + "message": "Assigned seats exceed available seats." } } diff --git a/apps/web/src/locales/fi/messages.json b/apps/web/src/locales/fi/messages.json index a1d909455c9..00d56fdb1c1 100644 --- a/apps/web/src/locales/fi/messages.json +++ b/apps/web/src/locales/fi/messages.json @@ -464,6 +464,18 @@ "editFolder": { "message": "Muokkaa kansiota" }, + "newFolder": { + "message": "New folder" + }, + "folderName": { + "message": "Folder name" + }, + "folderHintText": { + "message": "Nest a folder by adding the parent folder's name followed by a “/”. Example: Social/Forums" + }, + "deleteFolderPermanently": { + "message": "Are you sure you want to permanently delete this folder?" + }, "baseDomain": { "message": "Pääverkkotunnus", "description": "Domain name. Example: website.com" @@ -728,15 +740,6 @@ "itemName": { "message": "Kohteen nimi" }, - "cannotRemoveViewOnlyCollections": { - "message": "Et voi poistaa kokoelmia, joihin sinulla on vain tarkasteluoikeus: $COLLECTIONS$", - "placeholders": { - "collections": { - "content": "$1", - "example": "Work, Personal" - } - } - }, "ex": { "message": "esim.", "description": "Short abbreviation for 'example'." @@ -1182,6 +1185,9 @@ "logInInitiated": { "message": "Kirjautuminen aloitettu" }, + "logInRequestSent": { + "message": "Request sent" + }, "submit": { "message": "Jatka" }, @@ -1371,12 +1377,39 @@ "notificationSentDevice": { "message": "Laitteellesi on lähetetty ilmoitus." }, + "notificationSentDevicePart1": { + "message": "Unlock Bitwarden on your device or on the " + }, + "areYouTryingToAccessYourAccount": { + "message": "Are you trying to access your account?" + }, + "accessAttemptBy": { + "message": "Access attempt by $EMAIL$", + "placeholders": { + "email": { + "content": "$1", + "example": "name@example.com" + } + } + }, + "confirmAccess": { + "message": "Confirm access" + }, + "denyAccess": { + "message": "Deny access" + }, + "notificationSentDeviceAnchor": { + "message": "web app" + }, + "notificationSentDevicePart2": { + "message": "Make sure the Fingerprint phrase matches the one below before approving." + }, + "notificationSentDeviceComplete": { + "message": "Unlock Bitwarden on your device. Make sure the Fingerprint phrase matches the one below before approving." + }, "aNotificationWasSentToYourDevice": { "message": "Laitteeseesi lähetettiin ilmoitus" }, - "makeSureYourAccountIsUnlockedAndTheFingerprintEtc": { - "message": "Make sure your account is unlocked and the fingerprint phrase matches on the other device" - }, "versionNumber": { "message": "Versio $VERSION_NUMBER$", "placeholders": { @@ -1664,9 +1697,6 @@ "message": "Vältä epäselviä merkkejä", "description": "Label for the avoid ambiguous characters checkbox." }, - "regeneratePassword": { - "message": "Luo uusi salasana" - }, "length": { "message": "Pituus" }, @@ -2170,8 +2200,20 @@ "manage": { "message": "Hallitse" }, - "canManage": { - "message": "Voi hallita" + "manageCollection": { + "message": "Manage collection" + }, + "viewItems": { + "message": "View items" + }, + "viewItemsHidePass": { + "message": "View items, hidden passwords" + }, + "editItems": { + "message": "Edit items" + }, + "editItemsHidePass": { + "message": "Edit items, hidden passwords" }, "disable": { "message": "Poista käytöstä" @@ -2368,11 +2410,8 @@ "twoFactorU2fProblemReadingTryAgain": { "message": "Suojausavainta luettaessa havaittiin ongelma. Yritä uudelleen." }, - "twoFactorWebAuthnWarning": { - "message": "Alustakohtaisten rajoitusten vuoksi WebAuthn-todennuslaiteet eivät ole käytettävissä kaikissa Bitwarden-sovelluksissa. Sinun tulisi määrittää eri kaksivaiheisen kirjautumisen todentaja, jotta pääset tilillesi myös silloin kun WebAuthn-laitteen käyttö ei ole mahdollista. Tuetut alustat:" - }, - "twoFactorWebAuthnSupportWeb": { - "message": "Verkkoholvi ja selainlaajennukset pöytäkoneissa/kannettavissa, joissa on WebAuthn-tekniikkaa tukeva selain (Chrome, Opera, Vivaldi tai Firefox FIDO U2F käyttöön otettuna)." + "twoFactorWebAuthnWarning1": { + "message": "Due to platform limitations, WebAuthn cannot be used on all Bitwarden applications. You should set up another two-step login provider so that you can access your account when WebAuthn cannot be used." }, "twoFactorRecoveryYourCode": { "message": "Bitwardenin kaksivaiheisen kirjautumisen palautuskoodisi" @@ -3339,10 +3378,10 @@ } }, "inviteSingleEmailDesc": { - "message": "You have 1 invite remaining." + "message": "Sinulla on 1 kutsu jäljellä." }, "inviteZeroEmailDesc": { - "message": "You have 0 invites remaining." + "message": "Sinulla on 0 kutsua jäljellä." }, "userUsingTwoStep": { "message": "Käyttäjä on suojannut tilinsä kaksivaiheisella kirjautumisella." @@ -3847,22 +3886,22 @@ "message": "Laite" }, "loginStatus": { - "message": "Login status" + "message": "Kirjautumisen tila" }, "firstLogin": { - "message": "First login" + "message": "Ensimmäinen kirjautuminen" }, "trusted": { - "message": "Trusted" + "message": "Luotettu" }, "needsApproval": { - "message": "Needs approval" + "message": "Vaatii hyväksynnän" }, "areYouTryingtoLogin": { - "message": "Are you trying to log in?" + "message": "Yritätkö kirjautua sisään?" }, "logInAttemptBy": { - "message": "Login attempt by $EMAIL$", + "message": "Kirjautumisyritys osoitteella $EMAIL$", "placeholders": { "email": { "content": "$1", @@ -3905,10 +3944,10 @@ "message": "Login request has already expired." }, "justNow": { - "message": "Just now" + "message": "Juuri nyt" }, "requestedXMinutesAgo": { - "message": "Requested $MINUTES$ minutes ago", + "message": "Pyydetty $MINUTES$ minuuttia sitten", "placeholders": { "minutes": { "content": "$1", @@ -4710,9 +4749,6 @@ "passwordGeneratorPolicyDesc": { "message": "Aseta salasanageneraattorin vaatimukset." }, - "passwordGeneratorPolicyInEffect": { - "message": "Yksi tai useampi organisaatiokäytäntö vaikuttaa generaattorisi asetuksiin." - }, "masterPasswordPolicyInEffect": { "message": "Yksi tai useampi organisaatiokäytäntö edellyttää, että pääsalasanasi täyttää seuraavat vaatimukset:" }, @@ -5813,11 +5849,11 @@ "message": "Bitwarden could not decrypt the vault item(s) listed below." }, "contactCSToAvoidDataLossPart1": { - "message": "Contact customer success", + "message": "Ota yhteyttä asiakkaaseen", "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": "lisätietojen menettämisen välttämiseksi.", "description": "This is part of a larger sentence. The full sentence will read 'Contact customer success to avoid additional data loss.'" }, "accountRecoveryManageUsers": { @@ -6681,15 +6717,6 @@ "message": "Generaattori", "description": "Short for 'credential generator'." }, - "whatWouldYouLikeToGenerate": { - "message": "Mitä haluat luoda?" - }, - "passwordType": { - "message": "Salasanan tyyppi" - }, - "regenerateUsername": { - "message": "Luo uusi käyttäjätunnus" - }, "generateUsername": { "message": "Luo käyttäjätunnus" }, @@ -6730,9 +6757,6 @@ } } }, - "usernameType": { - "message": "Käyttäjätunnuksen tyyppi" - }, "plusAddressedEmail": { "message": "Plus+merkkinen sähköposti", "description": "Username generator option that appends a random sub-address to the username. For example: address+subaddress@email.com" @@ -6952,9 +6976,6 @@ "message": "Isäntä", "description": "Part of a URL." }, - "apiAccessToken": { - "message": "API-käyttötunniste" - }, "deviceVerification": { "message": "Laitevahvistus" }, @@ -7666,18 +7687,6 @@ "noCollection": { "message": "Ei kokoelmaa" }, - "canView": { - "message": "Voi tarkastella" - }, - "canViewExceptPass": { - "message": "Voi tarkastella (ei salasanoja)" - }, - "canEdit": { - "message": "Voi muokata" - }, - "canEditExceptPass": { - "message": "Voi muokata (ei salasanoja)" - }, "noCollectionsAdded": { "message": "Kokoelmia ei ole lisätty" }, @@ -8677,9 +8686,6 @@ "message": "Itse ylläpidetyn palvelimen URL-osoite", "description": "Label for field requesting a self-hosted integration service URL" }, - "aliasDomain": { - "message": "Aliaksen verkkotunnus" - }, "alreadyHaveAccount": { "message": "Onko sinulla jo tili?" }, @@ -8741,11 +8747,11 @@ "readOnlyCollectionAccess": { "message": "Oikeutesi eivät riitä kokoelman hallintaan." }, - "grantAddAccessCollectionWarningTitle": { - "message": "\"Voi hallita\" -käyttöoikeus puuttuu" + "grantManageCollectionWarningTitle": { + "message": "Missing Manage Collection Permissions" }, - "grantAddAccessCollectionWarning": { - "message": "Myönnä ”Voi hallita” -oikeus, joka mahdollistaa kokoelman täydellisen hallinnan, mukaan lukien sen poistamisen." + "grantManageCollectionWarning": { + "message": "Grant Manage collection permissions to allow full collection management including deletion of collection." }, "grantCollectionAccess": { "message": "Myönnä ryhmille tai henkilöille kokoelman käyttöoikeus." @@ -10091,6 +10097,15 @@ "descriptorCode": { "message": "Descriptor code" }, + "cannotRemoveViewOnlyCollections": { + "message": "Et voi poistaa kokoelmia, joihin sinulla on vain tarkasteluoikeus: $COLLECTIONS$", + "placeholders": { + "collections": { + "content": "$1", + "example": "Work, Personal" + } + } + }, "importantNotice": { "message": "Tärkeä ilmoitus" }, @@ -10281,5 +10296,54 @@ "example": "Acme c" } } + }, + "accountDeprovisioningNotification": { + "message": "Administrators now have the ability to delete member accounts that belong to a claimed domain." + }, + "deleteManagedUserWarningDesc": { + "message": "This action will delete the member account including all items in their vault. This replaces the previous Remove action." + }, + "deleteManagedUserWarning": { + "message": "Delete is a new action!" + }, + "seatsRemaining": { + "message": "You have $REMAINING$ seats remaining out of $TOTAL$ seats assigned to this organization. Contact your provider to manage your subscription.", + "placeholders": { + "remaining": { + "content": "$1", + "example": "5" + }, + "total": { + "content": "$2", + "example": "10" + } + } + }, + "existingOrganization": { + "message": "Existing organization" + }, + "selectOrganizationProviderPortal": { + "message": "Select an organization to add to your Provider Portal." + }, + "noOrganizations": { + "message": "There are no organizations to list" + }, + "yourProviderSubscriptionCredit": { + "message": "Your provider subscription will receive a credit for any remaining time in the organization's subscription." + }, + "doYouWantToAddThisOrg": { + "message": "Do you want to add this organization to $PROVIDER$?", + "placeholders": { + "provider": { + "content": "$1", + "example": "Cool MSP" + } + } + }, + "addedExistingOrganization": { + "message": "Added existing organization" + }, + "assignedExceedsAvailable": { + "message": "Assigned seats exceed available seats." } } diff --git a/apps/web/src/locales/fil/messages.json b/apps/web/src/locales/fil/messages.json index cebcaa22aef..42b4882bf20 100644 --- a/apps/web/src/locales/fil/messages.json +++ b/apps/web/src/locales/fil/messages.json @@ -464,6 +464,18 @@ "editFolder": { "message": "Baguhin ang folder" }, + "newFolder": { + "message": "New folder" + }, + "folderName": { + "message": "Folder name" + }, + "folderHintText": { + "message": "Nest a folder by adding the parent folder's name followed by a “/”. Example: Social/Forums" + }, + "deleteFolderPermanently": { + "message": "Are you sure you want to permanently delete this folder?" + }, "baseDomain": { "message": "Base domain", "description": "Domain name. Example: website.com" @@ -728,15 +740,6 @@ "itemName": { "message": "Item name" }, - "cannotRemoveViewOnlyCollections": { - "message": "You cannot remove collections with View only permissions: $COLLECTIONS$", - "placeholders": { - "collections": { - "content": "$1", - "example": "Work, Personal" - } - } - }, "ex": { "message": "hal.", "description": "Short abbreviation for 'example'." @@ -1182,6 +1185,9 @@ "logInInitiated": { "message": "Sinimulan ang pag-log in" }, + "logInRequestSent": { + "message": "Request sent" + }, "submit": { "message": "Ipadala" }, @@ -1371,12 +1377,39 @@ "notificationSentDevice": { "message": "Nakapagpadala na ng notipikasyon sa device mo." }, + "notificationSentDevicePart1": { + "message": "Unlock Bitwarden on your device or on the " + }, + "areYouTryingToAccessYourAccount": { + "message": "Are you trying to access your account?" + }, + "accessAttemptBy": { + "message": "Access attempt by $EMAIL$", + "placeholders": { + "email": { + "content": "$1", + "example": "name@example.com" + } + } + }, + "confirmAccess": { + "message": "Confirm access" + }, + "denyAccess": { + "message": "Deny access" + }, + "notificationSentDeviceAnchor": { + "message": "web app" + }, + "notificationSentDevicePart2": { + "message": "Make sure the Fingerprint phrase matches the one below before approving." + }, + "notificationSentDeviceComplete": { + "message": "Unlock Bitwarden on your device. Make sure the Fingerprint phrase matches the one below before approving." + }, "aNotificationWasSentToYourDevice": { "message": "A notification was sent to your device" }, - "makeSureYourAccountIsUnlockedAndTheFingerprintEtc": { - "message": "Make sure your account is unlocked and the fingerprint phrase matches on the other device" - }, "versionNumber": { "message": "Bersyon $VERSION_NUMBER$", "placeholders": { @@ -1664,9 +1697,6 @@ "message": "Avoid ambiguous characters", "description": "Label for the avoid ambiguous characters checkbox." }, - "regeneratePassword": { - "message": "Gumawa ng isa pang password" - }, "length": { "message": "Haba" }, @@ -2170,8 +2200,20 @@ "manage": { "message": "Pamahalaan" }, - "canManage": { - "message": "Can manage" + "manageCollection": { + "message": "Manage collection" + }, + "viewItems": { + "message": "View items" + }, + "viewItemsHidePass": { + "message": "View items, hidden passwords" + }, + "editItems": { + "message": "Edit items" + }, + "editItemsHidePass": { + "message": "Edit items, hidden passwords" }, "disable": { "message": "Isara" @@ -2368,11 +2410,8 @@ "twoFactorU2fProblemReadingTryAgain": { "message": "Nagkaproblema sa pagbabasa ng security key. Pakisubukan ulit." }, - "twoFactorWebAuthnWarning": { - "message": "Hindi magagamit sa lahat ng mga aplikasyon ng Bitwarden ang WebAuthn dahil sa mga limitasyon ng platform. Dapat mag-set up ka ng isa pang provider ng dalawang-hakbang na pag-log in para ma-access mo ang account mo sakaling hindi magamit ang WebAuthn. Mga suportadong platform:" - }, - "twoFactorWebAuthnSupportWeb": { - "message": "Web vault at mga ekstensyon pang-browser sa desktop/laptop na may browser na sinusuportahan ang WebAuthn (Chrome, Opera, Vivaldi, o Firefox na nakabukas ang FIDO U2F)." + "twoFactorWebAuthnWarning1": { + "message": "Due to platform limitations, WebAuthn cannot be used on all Bitwarden applications. You should set up another two-step login provider so that you can access your account when WebAuthn cannot be used." }, "twoFactorRecoveryYourCode": { "message": "Code pang-recover mo sa dalawang-hakbang na pag-log in sa Bitwarden" @@ -4710,9 +4749,6 @@ "passwordGeneratorPolicyDesc": { "message": "Magtakda ng mga kinakailangan para sa generator ng password." }, - "passwordGeneratorPolicyInEffect": { - "message": "Isang o higit pang patakaran ng organisasyon ay nakakaapekto sa iyong mga setting ng generator." - }, "masterPasswordPolicyInEffect": { "message": "Isang o higit pang mga patakaran ng organisasyon ay nangangailangan ng iyong master password upang matugunan ang sumusunod na kinakailangan:" }, @@ -6681,15 +6717,6 @@ "message": "Magmamana", "description": "Short for 'credential generator'." }, - "whatWouldYouLikeToGenerate": { - "message": "Ano ang nais mong bumuo?" - }, - "passwordType": { - "message": "Uri ng Password" - }, - "regenerateUsername": { - "message": "Muling bumuo ng username" - }, "generateUsername": { "message": "Lumikha ng username" }, @@ -6730,9 +6757,6 @@ } } }, - "usernameType": { - "message": "Uri ng username" - }, "plusAddressedEmail": { "message": "Plus na naka-address na email", "description": "Username generator option that appends a random sub-address to the username. For example: address+subaddress@email.com" @@ -6952,9 +6976,6 @@ "message": "Pangalan ng Hostname", "description": "Part of a URL." }, - "apiAccessToken": { - "message": "Token ng Access sa API" - }, "deviceVerification": { "message": "Pag verify ng aparato" }, @@ -7666,18 +7687,6 @@ "noCollection": { "message": "Walang koleksyon" }, - "canView": { - "message": "Maaaring tingnan" - }, - "canViewExceptPass": { - "message": "Maaaring tingnan, maliban sa mga password" - }, - "canEdit": { - "message": "Maaaring i-edit" - }, - "canEditExceptPass": { - "message": "Maaaring mag edit, maliban sa mga password" - }, "noCollectionsAdded": { "message": "Walang idinagdag na mga koleksyon" }, @@ -8677,9 +8686,6 @@ "message": "Self-host server URL", "description": "Label for field requesting a self-hosted integration service URL" }, - "aliasDomain": { - "message": "Alias domain" - }, "alreadyHaveAccount": { "message": "Already have an account?" }, @@ -8741,11 +8747,11 @@ "readOnlyCollectionAccess": { "message": "You do not have access to manage this collection." }, - "grantAddAccessCollectionWarningTitle": { - "message": "Missing Can Manage Permissions" + "grantManageCollectionWarningTitle": { + "message": "Missing Manage Collection Permissions" }, - "grantAddAccessCollectionWarning": { - "message": "Grant Can manage permissions to allow full collection management including deletion of collection." + "grantManageCollectionWarning": { + "message": "Grant Manage collection permissions to allow full collection management including deletion of collection." }, "grantCollectionAccess": { "message": "Grant groups or members access to this collection." @@ -10091,6 +10097,15 @@ "descriptorCode": { "message": "Descriptor code" }, + "cannotRemoveViewOnlyCollections": { + "message": "You cannot remove collections with View only permissions: $COLLECTIONS$", + "placeholders": { + "collections": { + "content": "$1", + "example": "Work, Personal" + } + } + }, "importantNotice": { "message": "Important notice" }, @@ -10281,5 +10296,54 @@ "example": "Acme c" } } + }, + "accountDeprovisioningNotification": { + "message": "Administrators now have the ability to delete member accounts that belong to a claimed domain." + }, + "deleteManagedUserWarningDesc": { + "message": "This action will delete the member account including all items in their vault. This replaces the previous Remove action." + }, + "deleteManagedUserWarning": { + "message": "Delete is a new action!" + }, + "seatsRemaining": { + "message": "You have $REMAINING$ seats remaining out of $TOTAL$ seats assigned to this organization. Contact your provider to manage your subscription.", + "placeholders": { + "remaining": { + "content": "$1", + "example": "5" + }, + "total": { + "content": "$2", + "example": "10" + } + } + }, + "existingOrganization": { + "message": "Existing organization" + }, + "selectOrganizationProviderPortal": { + "message": "Select an organization to add to your Provider Portal." + }, + "noOrganizations": { + "message": "There are no organizations to list" + }, + "yourProviderSubscriptionCredit": { + "message": "Your provider subscription will receive a credit for any remaining time in the organization's subscription." + }, + "doYouWantToAddThisOrg": { + "message": "Do you want to add this organization to $PROVIDER$?", + "placeholders": { + "provider": { + "content": "$1", + "example": "Cool MSP" + } + } + }, + "addedExistingOrganization": { + "message": "Added existing organization" + }, + "assignedExceedsAvailable": { + "message": "Assigned seats exceed available seats." } } diff --git a/apps/web/src/locales/fr/messages.json b/apps/web/src/locales/fr/messages.json index c477a5d027d..a5a55255c28 100644 --- a/apps/web/src/locales/fr/messages.json +++ b/apps/web/src/locales/fr/messages.json @@ -114,7 +114,7 @@ "message": "Membres à risque" }, "atRiskMembersWithCount": { - "message": "At-risk members ($COUNT$)", + "message": "Membres à risque ($COUNT$)", "placeholders": { "count": { "content": "$1", @@ -132,13 +132,13 @@ } }, "atRiskMembersDescription": { - "message": "These members are logging into applications with weak, exposed, or reused passwords." + "message": "Ces membres se connectent à des applications avec des mots de passe faibles, exposés ou réutilisés." }, "atRiskApplicationsDescription": { "message": "Ces applications ont des mots de passe faibles, exposés ou réutilisés." }, "atRiskMembersDescriptionWithApp": { - "message": "These members are logging into $APPNAME$ with weak, exposed, or reused passwords.", + "message": "Ces membres se connectent à $APPNAME$ avec des mots de passe faibles, exposés ou réutilisés.", "placeholders": { "appname": { "content": "$1", @@ -464,6 +464,18 @@ "editFolder": { "message": "Modifier le dossier" }, + "newFolder": { + "message": "Nouveau dossier" + }, + "folderName": { + "message": "Nom de dossier" + }, + "folderHintText": { + "message": "Créez un sous-dossier en ajoutant le nom du dossier parent suivi d'un \"/\". Par exemple : Social/Forums" + }, + "deleteFolderPermanently": { + "message": "Êtes-vous sûr de vouloir supprimer définitivement ce dossier ?" + }, "baseDomain": { "message": "Domaine de base", "description": "Domain name. Example: website.com" @@ -728,15 +740,6 @@ "itemName": { "message": "Nom de l’élément" }, - "cannotRemoveViewOnlyCollections": { - "message": "Vous ne pouvez pas supprimer des collections avec les autorisations d'affichage uniquement : $COLLECTIONS$", - "placeholders": { - "collections": { - "content": "$1", - "example": "Work, Personal" - } - } - }, "ex": { "message": "ex.", "description": "Short abbreviation for 'example'." @@ -1182,6 +1185,9 @@ "logInInitiated": { "message": "Connexion initiée" }, + "logInRequestSent": { + "message": "Demande envoyée" + }, "submit": { "message": "Soumettre" }, @@ -1342,7 +1348,7 @@ "message": "Aucun élément à afficher." }, "noPermissionToViewAllCollectionItems": { - "message": "Vous n'avez pas la permission de voir tous les éléments de cette collection." + "message": "Vous n'avez pas l'autorisation d'afficher tous les éléments de cette collection." }, "youDoNotHavePermissions": { "message": "Vous n'avez pas les autorisations pour cette collection" @@ -1371,12 +1377,39 @@ "notificationSentDevice": { "message": "Une notification a été envoyée à votre appareil." }, + "notificationSentDevicePart1": { + "message": "Déverrouillez Bitwarden sur votre appareil ou sur le " + }, + "areYouTryingToAccessYourAccount": { + "message": "Essayez-vous d'accéder à votre compte ?" + }, + "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" + }, + "notificationSentDeviceAnchor": { + "message": "application web" + }, + "notificationSentDevicePart2": { + "message": "Assurez-vous que la phrase d'empreinte correspond à celle ci-dessous avant d'approuver." + }, + "notificationSentDeviceComplete": { + "message": "Déverrouillez Bitwarden sur votre appareil. Assurez-vous que la phrase d'empreinte correspond à celle ci-dessous avant d'approuver." + }, "aNotificationWasSentToYourDevice": { "message": "Une notification a été envoyée à votre appareil" }, - "makeSureYourAccountIsUnlockedAndTheFingerprintEtc": { - "message": "Assurez-vous que votre compte est déverrouillé et que la phrase d'empreinte correspond à l'autre appareil" - }, "versionNumber": { "message": "Version $VERSION_NUMBER$", "placeholders": { @@ -1664,9 +1697,6 @@ "message": "Éviter les caractères ambigus", "description": "Label for the avoid ambiguous characters checkbox." }, - "regeneratePassword": { - "message": "Régénérer un mot de passe" - }, "length": { "message": "Longueur" }, @@ -2170,8 +2200,20 @@ "manage": { "message": "Gérer" }, - "canManage": { - "message": "Peut gérer" + "manageCollection": { + "message": "Gérer la collection" + }, + "viewItems": { + "message": "Afficher les éléments" + }, + "viewItemsHidePass": { + "message": "Afficher les éléments, les mots de passe cachés" + }, + "editItems": { + "message": "Modifier les items" + }, + "editItemsHidePass": { + "message": "Modifier les éléments, les mots de passe cachés" }, "disable": { "message": "Désactiver" @@ -2368,11 +2410,8 @@ "twoFactorU2fProblemReadingTryAgain": { "message": "Un problème est survenu lors de la lecture de la clé de sécurité. Veuillez réessayer." }, - "twoFactorWebAuthnWarning": { - "message": "En raison des limitations de la plate-forme, WebAuthn ne peut pas être utilisé sur toutes les applications Bitwarden. Vous devriez mettre en place un autre fournisseur d'authentification à deux facteurs afin de pouvoir accéder à votre compte lorsque WebAuthn ne peut pas être utilisé. Plateformes supportées :" - }, - "twoFactorWebAuthnSupportWeb": { - "message": "Coffre web et extensions sur un ordinateur fixe/portable avec un navigateur compatible WebAuthn (Chrome, Opera, Vivaldi ou Firefox avec FIDO U2F activé)." + "twoFactorWebAuthnWarning1": { + "message": "En raison des limitations de plate-forme, WebAuthn ne peut pas être utilisé sur toutes les applications Bitwarden. Vous devriez mettre en place un autre fournisseur d'authentification à deux facteurs afin de pouvoir accéder à votre compte lorsque WebAuthn ne peut pas être utilisé." }, "twoFactorRecoveryYourCode": { "message": "Votre code de récupération de d'authentification à deux facteurs Bitwarden" @@ -3339,7 +3378,7 @@ } }, "inviteSingleEmailDesc": { - "message": "You have 1 invite remaining." + "message": "Il vous reste 1 invitation." }, "inviteZeroEmailDesc": { "message": "Il vous reste 0 invitations." @@ -3363,7 +3402,7 @@ "message": "Propriétaire" }, "ownerDesc": { - "message": "L’utilisateur avec l’accès le plus élevé qui peut gérer tous les aspects de votre organisation." + "message": "Gérer tous les aspects de votre organisation, y compris la facturation et les abonnements" }, "clientOwnerDesc": { "message": "Cet utilisateur doit être indépendant du fournisseur. Si le fournisseur est dissocié de l'organisation, cet utilisateur conservera la propriété de l'organisation." @@ -4710,9 +4749,6 @@ "passwordGeneratorPolicyDesc": { "message": "Définir les exigences pour le générateur de mot de passe." }, - "passwordGeneratorPolicyInEffect": { - "message": "Une ou plusieurs politiques de sécurité de l'organisation affectent les paramètres de votre générateur." - }, "masterPasswordPolicyInEffect": { "message": "Une ou plusieurs politiques de sécurité de l'organisation exigent que votre mot de passe principal réponde aux exigences suivantes :" }, @@ -5132,7 +5168,7 @@ "message": "Accordez et gérez l'accès d'urgence pour les contacts de confiance. Les contacts de confiance peuvent demander l'accès pour afficher ou reprendre le contrôle de votre compte en cas d'urgence. Consultez notre page d'aide pour plus d'informations et de détails sur le fonctionnement du partage à divulgation nulle de connaissance (zero knowledge sharing)." }, "emergencyAccessOwnerWarning": { - "message": "Vous êtes propriétaire d'une ou de plusieurs organisations. Si vous autorisez la prise de contrôle à un contact d'urgence, il sera en mesure d'utiliser toutes vos permissions de propriétaire après la prise de contrôle." + "message": "Vous êtes propriétaire d'une ou de plusieurs organisations. Si vous autorisez la prise de contrôle à un contact d'urgence, il sera en mesure d'utiliser toutes vos autorisations de propriétaire après la prise de contrôle." }, "trustedEmergencyContacts": { "message": "Contacts d'urgence de confiance" @@ -5359,7 +5395,7 @@ "message": "Permissions" }, "permission": { - "message": "Permission" + "message": "Autorisation" }, "accessEventLogs": { "message": "Accéder aux journaux d'événements" @@ -6641,7 +6677,7 @@ } }, "accessDenied": { - "message": "Accès Refusé. Vous n'avez pas la permission de voir cette page." + "message": "Accès Refusé. Vous n'avez pas l'autorisation d'afficher cette page." }, "masterPassword": { "message": "Mot de passe principal" @@ -6681,15 +6717,6 @@ "message": "Générateur", "description": "Short for 'credential generator'." }, - "whatWouldYouLikeToGenerate": { - "message": "Que souhaitez-vous générer ?" - }, - "passwordType": { - "message": "Type de mot de passe" - }, - "regenerateUsername": { - "message": "Régénérer le Nom d'Utilisateur" - }, "generateUsername": { "message": "Générer le Nom d'Utilisateur" }, @@ -6730,9 +6757,6 @@ } } }, - "usernameType": { - "message": "Type de Nom d'Utilisateur" - }, "plusAddressedEmail": { "message": "Courriel Adressé Plus", "description": "Username generator option that appends a random sub-address to the username. For example: address+subaddress@email.com" @@ -6780,7 +6804,7 @@ "message": "Service" }, "unknownCipher": { - "message": "Élément inconnu, vous devrez peut-être vous connecter avec un autre compte pour accéder à cet élément." + "message": "Élément inconnu, vous devrez peut-être demander l'autorisation d'accéder à cet élément." }, "cannotSponsorSelf": { "message": "Vous ne pouvez pas réclamer pour le compte actif. Saisissez un courriel différent." @@ -6952,9 +6976,6 @@ "message": "Nom d'hôte", "description": "Part of a URL." }, - "apiAccessToken": { - "message": "Jetons d'accès API" - }, "deviceVerification": { "message": "Vérification de l'Appareil" }, @@ -7666,18 +7687,6 @@ "noCollection": { "message": "Aucune collection" }, - "canView": { - "message": "Peut voir" - }, - "canViewExceptPass": { - "message": "Peut voir, sauf les mots de passe" - }, - "canEdit": { - "message": "Peut modifier" - }, - "canEditExceptPass": { - "message": "Peut modifier, sauf les mots de passe" - }, "noCollectionsAdded": { "message": "Pas de collections ajoutées" }, @@ -7868,7 +7877,7 @@ "message": "Sélectionner les groupes" }, "userPermissionOverrideHelperDesc": { - "message": "Les permissions définies pour un membre remplaceront les permissions définies par le groupe de ce membre." + "message": "Les autorisations définies pour un membre remplaceront les autorisations définies par le groupe de ce membre." }, "noMembersOrGroupsAdded": { "message": "Aucun membre ou groupe ajouté" @@ -8255,7 +8264,7 @@ "message": "Exiger que les membres existants changent leurs mots de passe" }, "smProjectDeleteAccessRestricted": { - "message": "Vous n'avez pas les droits pour supprimer ce projet", + "message": "Vous n'avez pas les autorisations pour supprimer ce projet", "description": "The individual description shown to the user when the user doesn't have access to delete a project." }, "smProjectsDeleteBulkConfirmation": { @@ -8626,7 +8635,7 @@ "message": "Limiter la suppression de collections aux propriétaires et administrateurs" }, "limitItemDeletionDesc": { - "message": "Limite la suppression de l'élément aux membres avc l'autorisation Peut gérer" + "message": "Limite la suppression de l'élément aux membres avec l'autorisation Peut gérer" }, "allowAdminAccessToAllCollectionItemsDesc": { "message": "Les propriétaires et les administrateurs peuvent gérer toutes les collections et tous les éléments" @@ -8677,9 +8686,6 @@ "message": "URL du serveur auto-hébergé", "description": "Label for field requesting a self-hosted integration service URL" }, - "aliasDomain": { - "message": "Domaine de l'alias" - }, "alreadyHaveAccount": { "message": "Vous avez déjà un compte ?" }, @@ -8690,7 +8696,7 @@ "message": "Sauter directement au contenu" }, "managePermissionRequired": { - "message": "Au moins un membre ou un groupe doit avoir la permission peut gérer." + "message": "Au moins un membre ou un groupe doit avoir l'autorisation peut gérer." }, "typePasskey": { "message": "Passkey" @@ -8741,11 +8747,11 @@ "readOnlyCollectionAccess": { "message": "Vous n'avez pas accès à la gestion de cette collection." }, - "grantAddAccessCollectionWarningTitle": { - "message": "\"Peut Gérer les Permissions\" manquant" + "grantManageCollectionWarningTitle": { + "message": "Autorisations pour Gérer la Collection manquantes" }, - "grantAddAccessCollectionWarning": { - "message": "Accorder \"Peut Gérer les Permissions\" pour permettre une gestion complète de la collection, y compris la suppression de la collection." + "grantManageCollectionWarning": { + "message": "Accorde les autorisations pour Gérer la collection pour permettre la gestion complète de la collection incluant sa suppression." }, "grantCollectionAccess": { "message": "Accorder l'accès à cette collection aux groupes ou aux membres." @@ -9458,16 +9464,16 @@ "message": "Informations sur les taxes mises à jour" }, "billingInvalidTaxIdError": { - "message": "Invalid tax ID, if you believe this is an error please contact support." + "message": "ID de taxe non valide, si vous pensez qu'il s'agit d'une erreur, veuillez contacter le support." }, "billingTaxIdTypeInferenceError": { - "message": "We were unable to validate your tax ID, if you believe this is an error please contact support." + "message": "Nous n'avons pu valider votre ID de taxes. Si vous pensez que c'est une erreur, veuillez contacter le support s'il-vous-plaît." }, "billingPreviewInvalidTaxIdError": { - "message": "Invalid tax ID, if you believe this is an error please contact support." + "message": "ID de taxe non valide, si vous pensez qu'il s'agit d'une erreur, veuillez contacter le support." }, "billingPreviewInvoiceError": { - "message": "An error occurred while previewing the invoice. Please try again later." + "message": "Une erreur s'est produite lors de la prévisualisation de la facture. Veuillez réessayer plus tard." }, "unverified": { "message": "Non vérifié" @@ -9510,7 +9516,7 @@ "message": "(Aucune collection)" }, "memberAccessReportNoCollectionPermission": { - "message": "(Aucune permission de collection)" + "message": "(Aucune Autorisation de Collection)" }, "memberAccessReportNoGroup": { "message": "(Aucun groupe)" @@ -9552,7 +9558,7 @@ "message": " Contactez le Support Client pour rétablir votre abonnement." }, "secretPeopleDescription": { - "message": "Autoriser les groupes ou les personnes à accéder à ce secret. Les permissions définies pour les personnes remplaceront les permissions définies par les groupes." + "message": "Autoriser les groupes ou les personnes à accéder à ce secret. Les autorisations définies pour les personnes remplaceront les autorisations définies par les groupes." }, "secretPeopleEmptyMessage": { "message": "Ajouter des personnes ou des groupes pour partager l'accès à ce secret" @@ -10091,6 +10097,15 @@ "descriptorCode": { "message": "Code descripteur" }, + "cannotRemoveViewOnlyCollections": { + "message": "Vous ne pouvez pas supprimer des collections avec les autorisations d'affichage uniquement : $COLLECTIONS$", + "placeholders": { + "collections": { + "content": "$1", + "example": "Work, Personal" + } + } + }, "importantNotice": { "message": "Avis important" }, @@ -10281,5 +10296,54 @@ "example": "Acme c" } } + }, + "accountDeprovisioningNotification": { + "message": "Les administrateurs ont maintenant la possibilité de supprimer les comptes de membre qui appartiennent à un domaine revendiqué." + }, + "deleteManagedUserWarningDesc": { + "message": "Cette action supprimera le compte du membre, incluant tous les éléments de son coffre. Cela remplace l'action précédente de Supprimer." + }, + "deleteManagedUserWarning": { + "message": "Supprimer est une nouvelle action !" + }, + "seatsRemaining": { + "message": "Vous avez $REMAINING$ places restantes sur $TOTAL$ attribuées à cette organisation. Contactez votre fournisseur pour gérer votre abonnement.", + "placeholders": { + "remaining": { + "content": "$1", + "example": "5" + }, + "total": { + "content": "$2", + "example": "10" + } + } + }, + "existingOrganization": { + "message": "Organisation existante" + }, + "selectOrganizationProviderPortal": { + "message": "Sélectionnez une organisation à ajouter à votre Portail fournisseur." + }, + "noOrganizations": { + "message": "Il n'y a aucune organisation à lister" + }, + "yourProviderSubscriptionCredit": { + "message": "Votre abonnement à un fournisseur recevra un crédit pour tout temps restant dans l'abonnement de l'organisation." + }, + "doYouWantToAddThisOrg": { + "message": "Voulez-vous ajouter cette organisation à $PROVIDER$?", + "placeholders": { + "provider": { + "content": "$1", + "example": "Cool MSP" + } + } + }, + "addedExistingOrganization": { + "message": "Organisation existante ajoutée" + }, + "assignedExceedsAvailable": { + "message": "Les places assignées dépassent les places disponibles." } } diff --git a/apps/web/src/locales/gl/messages.json b/apps/web/src/locales/gl/messages.json index b7baf7097ae..f5cd301fc5f 100644 --- a/apps/web/src/locales/gl/messages.json +++ b/apps/web/src/locales/gl/messages.json @@ -464,6 +464,18 @@ "editFolder": { "message": "Edit folder" }, + "newFolder": { + "message": "New folder" + }, + "folderName": { + "message": "Folder name" + }, + "folderHintText": { + "message": "Nest a folder by adding the parent folder's name followed by a “/”. Example: Social/Forums" + }, + "deleteFolderPermanently": { + "message": "Are you sure you want to permanently delete this folder?" + }, "baseDomain": { "message": "Base domain", "description": "Domain name. Example: website.com" @@ -728,15 +740,6 @@ "itemName": { "message": "Nome do elemento" }, - "cannotRemoveViewOnlyCollections": { - "message": "Non podes eliminar coleccións con permisos de só lectura: $COLLECTIONS$", - "placeholders": { - "collections": { - "content": "$1", - "example": "Work, Personal" - } - } - }, "ex": { "message": "ex.", "description": "Short abbreviation for 'example'." @@ -1182,6 +1185,9 @@ "logInInitiated": { "message": "Log in initiated" }, + "logInRequestSent": { + "message": "Request sent" + }, "submit": { "message": "Submit" }, @@ -1371,12 +1377,39 @@ "notificationSentDevice": { "message": "A notification has been sent to your device." }, + "notificationSentDevicePart1": { + "message": "Unlock Bitwarden on your device or on the " + }, + "areYouTryingToAccessYourAccount": { + "message": "Are you trying to access your account?" + }, + "accessAttemptBy": { + "message": "Access attempt by $EMAIL$", + "placeholders": { + "email": { + "content": "$1", + "example": "name@example.com" + } + } + }, + "confirmAccess": { + "message": "Confirm access" + }, + "denyAccess": { + "message": "Deny access" + }, + "notificationSentDeviceAnchor": { + "message": "web app" + }, + "notificationSentDevicePart2": { + "message": "Make sure the Fingerprint phrase matches the one below before approving." + }, + "notificationSentDeviceComplete": { + "message": "Unlock Bitwarden on your device. Make sure the Fingerprint phrase matches the one below before approving." + }, "aNotificationWasSentToYourDevice": { "message": "A notification was sent to your device" }, - "makeSureYourAccountIsUnlockedAndTheFingerprintEtc": { - "message": "Make sure your account is unlocked and the fingerprint phrase matches on the other device" - }, "versionNumber": { "message": "Version $VERSION_NUMBER$", "placeholders": { @@ -1664,9 +1697,6 @@ "message": "Avoid ambiguous characters", "description": "Label for the avoid ambiguous characters checkbox." }, - "regeneratePassword": { - "message": "Regenerate password" - }, "length": { "message": "Length" }, @@ -2170,8 +2200,20 @@ "manage": { "message": "Manage" }, - "canManage": { - "message": "Can manage" + "manageCollection": { + "message": "Manage collection" + }, + "viewItems": { + "message": "View items" + }, + "viewItemsHidePass": { + "message": "View items, hidden passwords" + }, + "editItems": { + "message": "Edit items" + }, + "editItemsHidePass": { + "message": "Edit items, hidden passwords" }, "disable": { "message": "Turn off" @@ -2368,11 +2410,8 @@ "twoFactorU2fProblemReadingTryAgain": { "message": "There was a problem reading the security key. Try again." }, - "twoFactorWebAuthnWarning": { - "message": "Due to platform limitations, WebAuthn cannot be used on all Bitwarden applications. You should set up another two-step login provider so that you can access your account when WebAuthn cannot be used. Supported platforms:" - }, - "twoFactorWebAuthnSupportWeb": { - "message": "Web vault and browser extensions on a desktop/laptop with a WebAuthn supported browser (Chrome, Opera, Vivaldi, or Firefox with FIDO U2F turned on)." + "twoFactorWebAuthnWarning1": { + "message": "Due to platform limitations, WebAuthn cannot be used on all Bitwarden applications. You should set up another two-step login provider so that you can access your account when WebAuthn cannot be used." }, "twoFactorRecoveryYourCode": { "message": "Your Bitwarden two-step login recovery code" @@ -4710,9 +4749,6 @@ "passwordGeneratorPolicyDesc": { "message": "Set requirements for password generator." }, - "passwordGeneratorPolicyInEffect": { - "message": "One or more organization policies are affecting your generator settings." - }, "masterPasswordPolicyInEffect": { "message": "One or more organization policies require your master password to meet the following requirements:" }, @@ -6681,15 +6717,6 @@ "message": "Generator", "description": "Short for 'credential generator'." }, - "whatWouldYouLikeToGenerate": { - "message": "What would you like to generate?" - }, - "passwordType": { - "message": "Password type" - }, - "regenerateUsername": { - "message": "Regenerate username" - }, "generateUsername": { "message": "Generate username" }, @@ -6730,9 +6757,6 @@ } } }, - "usernameType": { - "message": "Username type" - }, "plusAddressedEmail": { "message": "Plus addressed email", "description": "Username generator option that appends a random sub-address to the username. For example: address+subaddress@email.com" @@ -6952,9 +6976,6 @@ "message": "Hostname", "description": "Part of a URL." }, - "apiAccessToken": { - "message": "API access token" - }, "deviceVerification": { "message": "Device verification" }, @@ -7666,18 +7687,6 @@ "noCollection": { "message": "No collection" }, - "canView": { - "message": "Can view" - }, - "canViewExceptPass": { - "message": "Can view, except passwords" - }, - "canEdit": { - "message": "Can edit" - }, - "canEditExceptPass": { - "message": "Can edit, except passwords" - }, "noCollectionsAdded": { "message": "No collections added" }, @@ -8677,9 +8686,6 @@ "message": "Self-host server URL", "description": "Label for field requesting a self-hosted integration service URL" }, - "aliasDomain": { - "message": "Alias domain" - }, "alreadyHaveAccount": { "message": "Already have an account?" }, @@ -8741,11 +8747,11 @@ "readOnlyCollectionAccess": { "message": "You do not have access to manage this collection." }, - "grantAddAccessCollectionWarningTitle": { - "message": "Missing Can Manage Permissions" + "grantManageCollectionWarningTitle": { + "message": "Missing Manage Collection Permissions" }, - "grantAddAccessCollectionWarning": { - "message": "Grant Can manage permissions to allow full collection management including deletion of collection." + "grantManageCollectionWarning": { + "message": "Grant Manage collection permissions to allow full collection management including deletion of collection." }, "grantCollectionAccess": { "message": "Grant groups or members access to this collection." @@ -10091,6 +10097,15 @@ "descriptorCode": { "message": "Descriptor code" }, + "cannotRemoveViewOnlyCollections": { + "message": "Non podes eliminar coleccións con permisos de só lectura: $COLLECTIONS$", + "placeholders": { + "collections": { + "content": "$1", + "example": "Work, Personal" + } + } + }, "importantNotice": { "message": "Important notice" }, @@ -10281,5 +10296,54 @@ "example": "Acme c" } } + }, + "accountDeprovisioningNotification": { + "message": "Administrators now have the ability to delete member accounts that belong to a claimed domain." + }, + "deleteManagedUserWarningDesc": { + "message": "This action will delete the member account including all items in their vault. This replaces the previous Remove action." + }, + "deleteManagedUserWarning": { + "message": "Delete is a new action!" + }, + "seatsRemaining": { + "message": "You have $REMAINING$ seats remaining out of $TOTAL$ seats assigned to this organization. Contact your provider to manage your subscription.", + "placeholders": { + "remaining": { + "content": "$1", + "example": "5" + }, + "total": { + "content": "$2", + "example": "10" + } + } + }, + "existingOrganization": { + "message": "Existing organization" + }, + "selectOrganizationProviderPortal": { + "message": "Select an organization to add to your Provider Portal." + }, + "noOrganizations": { + "message": "There are no organizations to list" + }, + "yourProviderSubscriptionCredit": { + "message": "Your provider subscription will receive a credit for any remaining time in the organization's subscription." + }, + "doYouWantToAddThisOrg": { + "message": "Do you want to add this organization to $PROVIDER$?", + "placeholders": { + "provider": { + "content": "$1", + "example": "Cool MSP" + } + } + }, + "addedExistingOrganization": { + "message": "Added existing organization" + }, + "assignedExceedsAvailable": { + "message": "Assigned seats exceed available seats." } } diff --git a/apps/web/src/locales/he/messages.json b/apps/web/src/locales/he/messages.json index fe6b6008f66..27ea87bcfe4 100644 --- a/apps/web/src/locales/he/messages.json +++ b/apps/web/src/locales/he/messages.json @@ -464,6 +464,18 @@ "editFolder": { "message": "ערוך תיקייה" }, + "newFolder": { + "message": "New folder" + }, + "folderName": { + "message": "Folder name" + }, + "folderHintText": { + "message": "Nest a folder by adding the parent folder's name followed by a “/”. Example: Social/Forums" + }, + "deleteFolderPermanently": { + "message": "Are you sure you want to permanently delete this folder?" + }, "baseDomain": { "message": "שם בסיס הדומיין", "description": "Domain name. Example: website.com" @@ -728,15 +740,6 @@ "itemName": { "message": "Item name" }, - "cannotRemoveViewOnlyCollections": { - "message": "You cannot remove collections with View only permissions: $COLLECTIONS$", - "placeholders": { - "collections": { - "content": "$1", - "example": "Work, Personal" - } - } - }, "ex": { "message": "לדוגמא", "description": "Short abbreviation for 'example'." @@ -1182,6 +1185,9 @@ "logInInitiated": { "message": "Log in initiated" }, + "logInRequestSent": { + "message": "Request sent" + }, "submit": { "message": "שלח" }, @@ -1371,12 +1377,39 @@ "notificationSentDevice": { "message": "A notification has been sent to your device." }, + "notificationSentDevicePart1": { + "message": "Unlock Bitwarden on your device or on the " + }, + "areYouTryingToAccessYourAccount": { + "message": "Are you trying to access your account?" + }, + "accessAttemptBy": { + "message": "Access attempt by $EMAIL$", + "placeholders": { + "email": { + "content": "$1", + "example": "name@example.com" + } + } + }, + "confirmAccess": { + "message": "Confirm access" + }, + "denyAccess": { + "message": "Deny access" + }, + "notificationSentDeviceAnchor": { + "message": "web app" + }, + "notificationSentDevicePart2": { + "message": "Make sure the Fingerprint phrase matches the one below before approving." + }, + "notificationSentDeviceComplete": { + "message": "Unlock Bitwarden on your device. Make sure the Fingerprint phrase matches the one below before approving." + }, "aNotificationWasSentToYourDevice": { "message": "A notification was sent to your device" }, - "makeSureYourAccountIsUnlockedAndTheFingerprintEtc": { - "message": "Make sure your account is unlocked and the fingerprint phrase matches on the other device" - }, "versionNumber": { "message": "גרסה $VERSION_NUMBER$", "placeholders": { @@ -1664,9 +1697,6 @@ "message": "Avoid ambiguous characters", "description": "Label for the avoid ambiguous characters checkbox." }, - "regeneratePassword": { - "message": "צור סיסמה חדשה" - }, "length": { "message": "אורך" }, @@ -2170,8 +2200,20 @@ "manage": { "message": "נהל" }, - "canManage": { - "message": "Can manage" + "manageCollection": { + "message": "Manage collection" + }, + "viewItems": { + "message": "View items" + }, + "viewItemsHidePass": { + "message": "View items, hidden passwords" + }, + "editItems": { + "message": "Edit items" + }, + "editItemsHidePass": { + "message": "Edit items, hidden passwords" }, "disable": { "message": "בטל" @@ -2368,11 +2410,8 @@ "twoFactorU2fProblemReadingTryAgain": { "message": "היתה בעיה בקריאת מפתח האבטחה. נסה בשנית." }, - "twoFactorWebAuthnWarning": { - "message": "Due to platform limitations, WebAuthn cannot be used on all Bitwarden applications. You should set up another two-step login provider so that you can access your account when WebAuthn cannot be used. Supported platforms:" - }, - "twoFactorWebAuthnSupportWeb": { - "message": "Web vault and browser extensions on a desktop/laptop with a WebAuthn supported browser (Chrome, Opera, Vivaldi, or Firefox with FIDO U2F turned on)." + "twoFactorWebAuthnWarning1": { + "message": "Due to platform limitations, WebAuthn cannot be used on all Bitwarden applications. You should set up another two-step login provider so that you can access your account when WebAuthn cannot be used." }, "twoFactorRecoveryYourCode": { "message": "קוד השחזור שלך עבור כניסה דו שלבית לBitwarden" @@ -4710,9 +4749,6 @@ "passwordGeneratorPolicyDesc": { "message": "הגדר דרישות מינימום במחולל הסיסמאות." }, - "passwordGeneratorPolicyInEffect": { - "message": "מדיניות ארגונית אחת או יותר משפיעה על הגדרות המחולל שלך." - }, "masterPasswordPolicyInEffect": { "message": "אחד או יותר מכללי מדיניות הארגון דורשים שסיסמתך הראשית תעמוד בדרישות הבאות:" }, @@ -6681,15 +6717,6 @@ "message": "Generator", "description": "Short for 'credential generator'." }, - "whatWouldYouLikeToGenerate": { - "message": "What would you like to generate?" - }, - "passwordType": { - "message": "Password type" - }, - "regenerateUsername": { - "message": "Regenerate username" - }, "generateUsername": { "message": "Generate username" }, @@ -6730,9 +6757,6 @@ } } }, - "usernameType": { - "message": "Username type" - }, "plusAddressedEmail": { "message": "Plus addressed email", "description": "Username generator option that appends a random sub-address to the username. For example: address+subaddress@email.com" @@ -6952,9 +6976,6 @@ "message": "Hostname", "description": "Part of a URL." }, - "apiAccessToken": { - "message": "API access token" - }, "deviceVerification": { "message": "Device verification" }, @@ -7666,18 +7687,6 @@ "noCollection": { "message": "No collection" }, - "canView": { - "message": "Can view" - }, - "canViewExceptPass": { - "message": "Can view, except passwords" - }, - "canEdit": { - "message": "Can edit" - }, - "canEditExceptPass": { - "message": "Can edit, except passwords" - }, "noCollectionsAdded": { "message": "No collections added" }, @@ -8677,9 +8686,6 @@ "message": "Self-host server URL", "description": "Label for field requesting a self-hosted integration service URL" }, - "aliasDomain": { - "message": "Alias domain" - }, "alreadyHaveAccount": { "message": "Already have an account?" }, @@ -8741,11 +8747,11 @@ "readOnlyCollectionAccess": { "message": "You do not have access to manage this collection." }, - "grantAddAccessCollectionWarningTitle": { - "message": "Missing Can Manage Permissions" + "grantManageCollectionWarningTitle": { + "message": "Missing Manage Collection Permissions" }, - "grantAddAccessCollectionWarning": { - "message": "Grant Can manage permissions to allow full collection management including deletion of collection." + "grantManageCollectionWarning": { + "message": "Grant Manage collection permissions to allow full collection management including deletion of collection." }, "grantCollectionAccess": { "message": "Grant groups or members access to this collection." @@ -10091,6 +10097,15 @@ "descriptorCode": { "message": "Descriptor code" }, + "cannotRemoveViewOnlyCollections": { + "message": "You cannot remove collections with View only permissions: $COLLECTIONS$", + "placeholders": { + "collections": { + "content": "$1", + "example": "Work, Personal" + } + } + }, "importantNotice": { "message": "Important notice" }, @@ -10281,5 +10296,54 @@ "example": "Acme c" } } + }, + "accountDeprovisioningNotification": { + "message": "Administrators now have the ability to delete member accounts that belong to a claimed domain." + }, + "deleteManagedUserWarningDesc": { + "message": "This action will delete the member account including all items in their vault. This replaces the previous Remove action." + }, + "deleteManagedUserWarning": { + "message": "Delete is a new action!" + }, + "seatsRemaining": { + "message": "You have $REMAINING$ seats remaining out of $TOTAL$ seats assigned to this organization. Contact your provider to manage your subscription.", + "placeholders": { + "remaining": { + "content": "$1", + "example": "5" + }, + "total": { + "content": "$2", + "example": "10" + } + } + }, + "existingOrganization": { + "message": "Existing organization" + }, + "selectOrganizationProviderPortal": { + "message": "Select an organization to add to your Provider Portal." + }, + "noOrganizations": { + "message": "There are no organizations to list" + }, + "yourProviderSubscriptionCredit": { + "message": "Your provider subscription will receive a credit for any remaining time in the organization's subscription." + }, + "doYouWantToAddThisOrg": { + "message": "Do you want to add this organization to $PROVIDER$?", + "placeholders": { + "provider": { + "content": "$1", + "example": "Cool MSP" + } + } + }, + "addedExistingOrganization": { + "message": "Added existing organization" + }, + "assignedExceedsAvailable": { + "message": "Assigned seats exceed available seats." } } diff --git a/apps/web/src/locales/hi/messages.json b/apps/web/src/locales/hi/messages.json index f23ad758ea6..266a868e435 100644 --- a/apps/web/src/locales/hi/messages.json +++ b/apps/web/src/locales/hi/messages.json @@ -464,6 +464,18 @@ "editFolder": { "message": "Edit folder" }, + "newFolder": { + "message": "New folder" + }, + "folderName": { + "message": "Folder name" + }, + "folderHintText": { + "message": "Nest a folder by adding the parent folder's name followed by a “/”. Example: Social/Forums" + }, + "deleteFolderPermanently": { + "message": "Are you sure you want to permanently delete this folder?" + }, "baseDomain": { "message": "Base domain", "description": "Domain name. Example: website.com" @@ -728,15 +740,6 @@ "itemName": { "message": "Item name" }, - "cannotRemoveViewOnlyCollections": { - "message": "You cannot remove collections with View only permissions: $COLLECTIONS$", - "placeholders": { - "collections": { - "content": "$1", - "example": "Work, Personal" - } - } - }, "ex": { "message": "ex.", "description": "Short abbreviation for 'example'." @@ -1182,6 +1185,9 @@ "logInInitiated": { "message": "Log in initiated" }, + "logInRequestSent": { + "message": "Request sent" + }, "submit": { "message": "Submit" }, @@ -1371,12 +1377,39 @@ "notificationSentDevice": { "message": "A notification has been sent to your device." }, + "notificationSentDevicePart1": { + "message": "Unlock Bitwarden on your device or on the " + }, + "areYouTryingToAccessYourAccount": { + "message": "Are you trying to access your account?" + }, + "accessAttemptBy": { + "message": "Access attempt by $EMAIL$", + "placeholders": { + "email": { + "content": "$1", + "example": "name@example.com" + } + } + }, + "confirmAccess": { + "message": "Confirm access" + }, + "denyAccess": { + "message": "Deny access" + }, + "notificationSentDeviceAnchor": { + "message": "web app" + }, + "notificationSentDevicePart2": { + "message": "Make sure the Fingerprint phrase matches the one below before approving." + }, + "notificationSentDeviceComplete": { + "message": "Unlock Bitwarden on your device. Make sure the Fingerprint phrase matches the one below before approving." + }, "aNotificationWasSentToYourDevice": { "message": "A notification was sent to your device" }, - "makeSureYourAccountIsUnlockedAndTheFingerprintEtc": { - "message": "Make sure your account is unlocked and the fingerprint phrase matches on the other device" - }, "versionNumber": { "message": "Version $VERSION_NUMBER$", "placeholders": { @@ -1664,9 +1697,6 @@ "message": "Avoid ambiguous characters", "description": "Label for the avoid ambiguous characters checkbox." }, - "regeneratePassword": { - "message": "Regenerate password" - }, "length": { "message": "Length" }, @@ -2170,8 +2200,20 @@ "manage": { "message": "Manage" }, - "canManage": { - "message": "Can manage" + "manageCollection": { + "message": "Manage collection" + }, + "viewItems": { + "message": "View items" + }, + "viewItemsHidePass": { + "message": "View items, hidden passwords" + }, + "editItems": { + "message": "Edit items" + }, + "editItemsHidePass": { + "message": "Edit items, hidden passwords" }, "disable": { "message": "Turn off" @@ -2368,11 +2410,8 @@ "twoFactorU2fProblemReadingTryAgain": { "message": "There was a problem reading the security key. Try again." }, - "twoFactorWebAuthnWarning": { - "message": "Due to platform limitations, WebAuthn cannot be used on all Bitwarden applications. You should set up another two-step login provider so that you can access your account when WebAuthn cannot be used. Supported platforms:" - }, - "twoFactorWebAuthnSupportWeb": { - "message": "Web vault and browser extensions on a desktop/laptop with a WebAuthn supported browser (Chrome, Opera, Vivaldi, or Firefox with FIDO U2F turned on)." + "twoFactorWebAuthnWarning1": { + "message": "Due to platform limitations, WebAuthn cannot be used on all Bitwarden applications. You should set up another two-step login provider so that you can access your account when WebAuthn cannot be used." }, "twoFactorRecoveryYourCode": { "message": "Your Bitwarden two-step login recovery code" @@ -4710,9 +4749,6 @@ "passwordGeneratorPolicyDesc": { "message": "Set requirements for password generator." }, - "passwordGeneratorPolicyInEffect": { - "message": "One or more organization policies are affecting your generator settings." - }, "masterPasswordPolicyInEffect": { "message": "One or more organization policies require your master password to meet the following requirements:" }, @@ -6681,15 +6717,6 @@ "message": "Generator", "description": "Short for 'credential generator'." }, - "whatWouldYouLikeToGenerate": { - "message": "What would you like to generate?" - }, - "passwordType": { - "message": "Password type" - }, - "regenerateUsername": { - "message": "Regenerate username" - }, "generateUsername": { "message": "Generate username" }, @@ -6730,9 +6757,6 @@ } } }, - "usernameType": { - "message": "Username type" - }, "plusAddressedEmail": { "message": "Plus addressed email", "description": "Username generator option that appends a random sub-address to the username. For example: address+subaddress@email.com" @@ -6952,9 +6976,6 @@ "message": "Hostname", "description": "Part of a URL." }, - "apiAccessToken": { - "message": "API access token" - }, "deviceVerification": { "message": "Device verification" }, @@ -7666,18 +7687,6 @@ "noCollection": { "message": "No collection" }, - "canView": { - "message": "Can view" - }, - "canViewExceptPass": { - "message": "Can view, except passwords" - }, - "canEdit": { - "message": "Can edit" - }, - "canEditExceptPass": { - "message": "Can edit, except passwords" - }, "noCollectionsAdded": { "message": "No collections added" }, @@ -8677,9 +8686,6 @@ "message": "Self-host server URL", "description": "Label for field requesting a self-hosted integration service URL" }, - "aliasDomain": { - "message": "Alias domain" - }, "alreadyHaveAccount": { "message": "Already have an account?" }, @@ -8741,11 +8747,11 @@ "readOnlyCollectionAccess": { "message": "You do not have access to manage this collection." }, - "grantAddAccessCollectionWarningTitle": { - "message": "Missing Can Manage Permissions" + "grantManageCollectionWarningTitle": { + "message": "Missing Manage Collection Permissions" }, - "grantAddAccessCollectionWarning": { - "message": "Grant Can manage permissions to allow full collection management including deletion of collection." + "grantManageCollectionWarning": { + "message": "Grant Manage collection permissions to allow full collection management including deletion of collection." }, "grantCollectionAccess": { "message": "Grant groups or members access to this collection." @@ -10091,6 +10097,15 @@ "descriptorCode": { "message": "Descriptor code" }, + "cannotRemoveViewOnlyCollections": { + "message": "You cannot remove collections with View only permissions: $COLLECTIONS$", + "placeholders": { + "collections": { + "content": "$1", + "example": "Work, Personal" + } + } + }, "importantNotice": { "message": "Important notice" }, @@ -10281,5 +10296,54 @@ "example": "Acme c" } } + }, + "accountDeprovisioningNotification": { + "message": "Administrators now have the ability to delete member accounts that belong to a claimed domain." + }, + "deleteManagedUserWarningDesc": { + "message": "This action will delete the member account including all items in their vault. This replaces the previous Remove action." + }, + "deleteManagedUserWarning": { + "message": "Delete is a new action!" + }, + "seatsRemaining": { + "message": "You have $REMAINING$ seats remaining out of $TOTAL$ seats assigned to this organization. Contact your provider to manage your subscription.", + "placeholders": { + "remaining": { + "content": "$1", + "example": "5" + }, + "total": { + "content": "$2", + "example": "10" + } + } + }, + "existingOrganization": { + "message": "Existing organization" + }, + "selectOrganizationProviderPortal": { + "message": "Select an organization to add to your Provider Portal." + }, + "noOrganizations": { + "message": "There are no organizations to list" + }, + "yourProviderSubscriptionCredit": { + "message": "Your provider subscription will receive a credit for any remaining time in the organization's subscription." + }, + "doYouWantToAddThisOrg": { + "message": "Do you want to add this organization to $PROVIDER$?", + "placeholders": { + "provider": { + "content": "$1", + "example": "Cool MSP" + } + } + }, + "addedExistingOrganization": { + "message": "Added existing organization" + }, + "assignedExceedsAvailable": { + "message": "Assigned seats exceed available seats." } } diff --git a/apps/web/src/locales/hr/messages.json b/apps/web/src/locales/hr/messages.json index b157f158a53..a847caf7644 100644 --- a/apps/web/src/locales/hr/messages.json +++ b/apps/web/src/locales/hr/messages.json @@ -114,7 +114,7 @@ "message": "Rizični korisnici" }, "atRiskMembersWithCount": { - "message": "At-risk members ($COUNT$)", + "message": "Izloženi članovi ($COUNT$)", "placeholders": { "count": { "content": "$1", @@ -123,7 +123,7 @@ } }, "atRiskApplicationsWithCount": { - "message": "At-risk applications ($COUNT$)", + "message": "Izložene aplikacije ($COUNT$)", "placeholders": { "count": { "content": "$1", @@ -132,13 +132,13 @@ } }, "atRiskMembersDescription": { - "message": "These members are logging into applications with weak, exposed, or reused passwords." + "message": "Ovi članovi se prijavljuju u aplikacije slabim, izloženim ili ponovno korištenim lozinkama." }, "atRiskApplicationsDescription": { - "message": "These applications have weak, exposed, or reused passwords." + "message": "Ove aplikacije imaju slabe, izložene ili ponovno korištene lozinke." }, "atRiskMembersDescriptionWithApp": { - "message": "These members are logging into $APPNAME$ with weak, exposed, or reused passwords.", + "message": "Ovi članovi se u $APPNAME$ prijavljuju slabim, izloženim ili ponovno korištenim lozinkama.", "placeholders": { "appname": { "content": "$1", @@ -156,10 +156,10 @@ "message": "Ukupno aplikacija" }, "unmarkAsCriticalApp": { - "message": "Unmark as critical app" + "message": "Odznači kao kritičnu aplikaciju" }, "criticalApplicationSuccessfullyUnmarked": { - "message": "Critical application successfully unmarked" + "message": "Kritična aplikacija uspješno odznačena" }, "whatTypeOfItem": { "message": "Koja je ovo vrsta stavke?" @@ -235,7 +235,7 @@ "message": "Povijest stavke" }, "authenticatorKey": { - "message": "Kôd za provjeru" + "message": "Ključ autentifikatora" }, "autofillOptions": { "message": "Postavke auto-ispune" @@ -405,7 +405,7 @@ "message": "Bitwarden može pohraniti i ispuniti kodove za dvostruku autentifikaciju. Kopiraj i zalijepi ključ u ovo polje." }, "totpHelperWithCapture": { - "message": "Bitwarden može pohraniti i ispuniti kodove za dvostruku autentifikaciju. Odaberi ikonu kamere i označi QR kôd za provjeru autentičnosti ove web stranice ili kopiraj i zalijepi ključ u ovo polje." + "message": "Bitwarden može pohraniti i ispuniti kodove provjeru dvostruke autentifikacije. Odaberi ikonu kamere i označi QR kôd za provjeru autentičnosti ove web stranice ili kopiraj i zalijepi ključ u ovo polje." }, "learnMoreAboutAuthenticators": { "message": "Više o autentifikatorima" @@ -464,6 +464,18 @@ "editFolder": { "message": "Uredi mapu" }, + "newFolder": { + "message": "Nova mapa" + }, + "folderName": { + "message": "Naziv mape" + }, + "folderHintText": { + "message": "Ugnijezdi mapu dodavanjem naziva roditeljske mape i znaka kroz. Npr. Mreže/Forumi" + }, + "deleteFolderPermanently": { + "message": "Sigurno želiš trajno izbrisati ovu mapu?" + }, "baseDomain": { "message": "Primarna domena", "description": "Domain name. Example: website.com" @@ -728,15 +740,6 @@ "itemName": { "message": "Naziv stavke" }, - "cannotRemoveViewOnlyCollections": { - "message": "S dopuštenjima samo za prikaz ne možeš ukloniti zbirke: $COLLECTIONS$", - "placeholders": { - "collections": { - "content": "$1", - "example": "Work, Personal" - } - } - }, "ex": { "message": "npr.", "description": "Short abbreviation for 'example'." @@ -1168,20 +1171,23 @@ "message": "Potvrdi svoj identitet" }, "weDontRecognizeThisDevice": { - "message": "We don't recognize this device. Enter the code sent to your email to verify your identity." + "message": "Ne prepoznajemo ovaj uređaj. Za potvrdu identiteta unesi kôd poslan e-poštom." }, "continueLoggingIn": { - "message": "Continue logging in" + "message": "Nastavi prijavu" }, "whatIsADevice": { - "message": "What is a device?" + "message": "Što je uređaj?" }, "aDeviceIs": { - "message": "A device is a unique installation of the Bitwarden app where you have logged in. Reinstalling, clearing app data, or clearing your cookies could result in a device appearing multiple times." + "message": "Uređaj je jedinstvena instalacija Bitwarden aplikacije gdje si prijavljen/a. Ponovna instalacija, brisanje podataka aplikacije ili kolačića može rezultirati višestrukim prikazom uređaja." }, "logInInitiated": { "message": "Pokrenuta prijava" }, + "logInRequestSent": { + "message": "Zahtjev poslan" + }, "submit": { "message": "Pošalji" }, @@ -1371,12 +1377,39 @@ "notificationSentDevice": { "message": "Obavijest je poslana na tvoj uređaj." }, + "notificationSentDevicePart1": { + "message": "Otključaj Bitwarden na svojem uređaju ili na " + }, + "areYouTryingToAccessYourAccount": { + "message": "Pokušavaš li pristupiti svom računu?" + }, + "accessAttemptBy": { + "message": "$EMAIL$ pokušava pristupiti", + "placeholders": { + "email": { + "content": "$1", + "example": "name@example.com" + } + } + }, + "confirmAccess": { + "message": "Potvrdi pristup" + }, + "denyAccess": { + "message": "Odbij pristup" + }, + "notificationSentDeviceAnchor": { + "message": "web trezoru" + }, + "notificationSentDevicePart2": { + "message": "Provjeri slaže li se jedinstvena fraza s ovdje prikazanom prije odobravanja." + }, + "notificationSentDeviceComplete": { + "message": "Otključaj Bitwarden na svojem uređaju. Provjeri slaže li se jedinstvena fraza s ovdje prikazanom prije odobravanja." + }, "aNotificationWasSentToYourDevice": { "message": "Obavijest je poslana na tvoj uređaj" }, - "makeSureYourAccountIsUnlockedAndTheFingerprintEtc": { - "message": "Provjeri je li trezor otključan i slaže li se jedinstvena fraza s drugim uređajem" - }, "versionNumber": { "message": "Verzija $VERSION_NUMBER$", "placeholders": { @@ -1664,9 +1697,6 @@ "message": "Izbjegavaj dvosmislene znakove", "description": "Label for the avoid ambiguous characters checkbox." }, - "regeneratePassword": { - "message": "Ponovno generiraj lozinku" - }, "length": { "message": "Duljina" }, @@ -1767,10 +1797,10 @@ "message": "Molimo, ponovno se prijavi." }, "currentSession": { - "message": "Current session" + "message": "Trenutna sesija" }, "requestPending": { - "message": "Request pending" + "message": "Zahtjev u tijeku" }, "logBackInOthersToo": { "message": "Molimo, ponovno se prijavi. Ako koristiš druge aplikacije Bitwarden i u njima napravi odjavu/prijavu." @@ -1849,25 +1879,25 @@ "message": "Ako nastaviš, trenutna sesija će biti zatvorena, što će zahtijevati ponovnu prijavu uklljučujući i prijavu dvostrukom autentifikacijom, ako je ona aktivna. Aktivne sesije na drugim uređajima mogu ostati aktivne još jedan sat." }, "newDeviceLoginProtection": { - "message": "New device login" + "message": "Prijava novog uređaja" }, "turnOffNewDeviceLoginProtection": { - "message": "Turn off new device login protection" + "message": "Isključi zaštitu prijave novih uređaja" }, "turnOnNewDeviceLoginProtection": { - "message": "Turn on new device login protection" + "message": "Uključi zaštitu prijave novih uređaja" }, "turnOffNewDeviceLoginProtectionModalDesc": { - "message": "Proceed below to turn off the verification emails bitwarden sends when you login from a new device." + "message": "Za prestanak dobivanja e-pošte kada se prijaviš s novog uređaja, nastavi niže." }, "turnOnNewDeviceLoginProtectionModalDesc": { - "message": "Proceed below to have bitwarden send you verification emails when you login from a new device." + "message": "Za dobivanje e-pošte kada se prijaviš s novog uređaja, nastavi niže." }, "turnOffNewDeviceLoginProtectionWarning": { - "message": "With new device login protection turned off, anyone with your master password can access your account from any device. To protect your account without verification emails, set up two-step login." + "message": "Ako je zaštita prijave novih uređaja isključena, bilo tko s tvojom glavnom lozinkom može pristupiti tvom računu s bilo kojeg uređaja. Za zaštitu svog računa bez potvrde e-poštom, uključi dvostruku autentifikaciju." }, "accountNewDeviceLoginProtectionSaved": { - "message": "New device login protection changes saved" + "message": "Promjene zaštite prijave novih uređaja su spremljene" }, "sessionsDeauthorized": { "message": "Sve sesije deautorizirane" @@ -2170,8 +2200,20 @@ "manage": { "message": "Upravljaj" }, - "canManage": { - "message": "Može upravljati" + "manageCollection": { + "message": "Upravljaj zbirkom" + }, + "viewItems": { + "message": "Prikaz stavke" + }, + "viewItemsHidePass": { + "message": "Prikaz stavke, skrivene lozinke" + }, + "editItems": { + "message": "Uredi stavke" + }, + "editItemsHidePass": { + "message": "Uredi stavke, skrivene lozinke" }, "disable": { "message": "Onemogući" @@ -2213,7 +2255,7 @@ "message": "Nastavi na bitwarden.com?" }, "twoStepContinueToBitwardenUrlDesc": { - "message": "Bitwarden autentifikator omogućuje pohranu ključeva za autentifikaciju i generiranje TOTP kodova za dvostruku autentifikaciju. Saznaj više na bitwarden.com." + "message": "Bitwarden autentifikator omogućuje pohranu ključeva za autentifikator i generiranje TOTP kodova za provjeru dvostruke autentifikacije. Saznaj više na bitwarden.com." }, "twoStepAuthenticatorScanCodeV2": { "message": "Skeniraj donji QR kôd svojom autentifikatorskom aplikacijom ili unesi ključ." @@ -2368,11 +2410,8 @@ "twoFactorU2fProblemReadingTryAgain": { "message": "Došlo je do pogreške kod očitavanja sigurnosnog ključa. Pokušaj ponovno." }, - "twoFactorWebAuthnWarning": { - "message": "Zbog platformskih ograničenja, WebAuthn nije moguće koristiti s Bitwarden aplikacijama na svim platformama. Za pristup računu kada nije moguće koristiti WebAuthn, trebalo bi uključiti drugog pružatelja prijave dvostrukom autentifikacijom. Platforme na kojima je WebAuthn podržan:" - }, - "twoFactorWebAuthnSupportWeb": { - "message": "Web trezor i proširenja preglednika na stolnim/prijenosnim računalima s WebAuthn podržanim preglednikom (npr. Chrome, Opera, Vivaldi ili Firefox s omogućenim WebAuthn)." + "twoFactorWebAuthnWarning1": { + "message": "Zbog platformskih ograničenja, WebAuthn nije moguće koristiti sa svim Bitwarden aplikacijama. Uključi drugi način dvostruke autentifikacije za pristup računu kada se ne može koristiti WebAuthn." }, "twoFactorRecoveryYourCode": { "message": "Tvoj kôd za oporavak Bitwarden prijave dvostrukom autentifikacijom" @@ -3339,10 +3378,10 @@ } }, "inviteSingleEmailDesc": { - "message": "You have 1 invite remaining." + "message": "Imaš jednu preostalu pozivnicu." }, "inviteZeroEmailDesc": { - "message": "You have 0 invites remaining." + "message": "Nemaš preostalih pozivnica." }, "userUsingTwoStep": { "message": "Ovaj korisnik upotrebljava prijavu u dva koraka za zaštitu svog računa." @@ -3796,7 +3835,7 @@ } }, "unlinkedSso": { - "message": "Unlinked SSO." + "message": "SSO odspojen." }, "unlinkedSsoUser": { "message": "Odspojen SSO za korisnika $ID$.", @@ -3847,22 +3886,22 @@ "message": "Uređaj" }, "loginStatus": { - "message": "Login status" + "message": "Status prijave" }, "firstLogin": { - "message": "First login" + "message": "Prva prijava" }, "trusted": { - "message": "Trusted" + "message": "Pouzdan" }, "needsApproval": { - "message": "Needs approval" + "message": "Zahtjeva odobrenje" }, "areYouTryingtoLogin": { - "message": "Are you trying to log in?" + "message": "Pokušavaš li se prijaviti?" }, "logInAttemptBy": { - "message": "Login attempt by $EMAIL$", + "message": "$EMAIL$ se pokušava prijaviti", "placeholders": { "email": { "content": "$1", @@ -3871,22 +3910,22 @@ } }, "deviceType": { - "message": "Device Type" + "message": "Vrsta uređaja" }, "ipAddress": { - "message": "IP Address" + "message": "IP Adresa" }, "confirmLogIn": { - "message": "Confirm login" + "message": "Potvrdi prijavu" }, "denyLogIn": { - "message": "Deny login" + "message": "Odbij prijavu" }, "thisRequestIsNoLongerValid": { - "message": "This request is no longer valid." + "message": "Ovaj zahtjev više nije valjan." }, "logInConfirmedForEmailOnDevice": { - "message": "Login confirmed for $EMAIL$ on $DEVICE$", + "message": "Prijava za $EMAIL$ potvrđena na uređaju $DEVICE$", "placeholders": { "email": { "content": "$1", @@ -3899,16 +3938,16 @@ } }, "youDeniedALogInAttemptFromAnotherDevice": { - "message": "You denied a login attempt from another device. If this really was you, try to log in with the device again." + "message": "Odbijena je prijava na drugom uređaju. Ako si ovo stvarno ti, pokušaj se ponovno prijaviti uređajem." }, "loginRequestHasAlreadyExpired": { - "message": "Login request has already expired." + "message": "Zahtjev za prijavu je već istekao." }, "justNow": { - "message": "Just now" + "message": "Upravo" }, "requestedXMinutesAgo": { - "message": "Requested $MINUTES$ minutes ago", + "message": "Zatraženo prije $MINUTES$ minute/a", "placeholders": { "minutes": { "content": "$1", @@ -4710,9 +4749,6 @@ "passwordGeneratorPolicyDesc": { "message": "Postavi pravila sigurnosti koje mora zadovoljiti generator lozinki." }, - "passwordGeneratorPolicyInEffect": { - "message": "Jedna ili više organizacijskih pravila utječe na postavke generatora." - }, "masterPasswordPolicyInEffect": { "message": "Jedna ili više organizacijskih pravila zahtijeva da tvoja glavna lozinka ispunjava sljedeće uvjete:" }, @@ -5807,17 +5843,17 @@ "message": "Greška" }, "decryptionError": { - "message": "Decryption error" + "message": "Pogreška pri dešifriranju" }, "couldNotDecryptVaultItemsBelow": { - "message": "Bitwarden could not decrypt the vault item(s) listed below." + "message": "Bitwarden nije mogao dešifrirati sljedeće stavke trezora." }, "contactCSToAvoidDataLossPart1": { - "message": "Contact customer success", + "message": "Kontaktiraj službu za korisnike", "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": "kako bi izbjegli gubitak podataka.", "description": "This is part of a larger sentence. The full sentence will read 'Contact customer success to avoid additional data loss.'" }, "accountRecoveryManageUsers": { @@ -6681,15 +6717,6 @@ "message": "Generator", "description": "Short for 'credential generator'." }, - "whatWouldYouLikeToGenerate": { - "message": "Što želiš generirati?" - }, - "passwordType": { - "message": "Tip lozinke" - }, - "regenerateUsername": { - "message": "Ponovno generiraj korisničko ime" - }, "generateUsername": { "message": "Generiraj korisničko ime" }, @@ -6730,9 +6757,6 @@ } } }, - "usernameType": { - "message": "Tip korisničkog imena" - }, "plusAddressedEmail": { "message": "Plus adresa e-pošte", "description": "Username generator option that appends a random sub-address to the username. For example: address+subaddress@email.com" @@ -6747,7 +6771,7 @@ "message": "Koristi konfigurirani catch-all sandučić svoje domene." }, "useThisEmail": { - "message": "Use this email" + "message": "Koristi ovu e-poštu" }, "random": { "message": "Nasumično", @@ -6952,9 +6976,6 @@ "message": "Naziv poslužitelja", "description": "Part of a URL." }, - "apiAccessToken": { - "message": "Token za API pristup" - }, "deviceVerification": { "message": "Provjera uređaja" }, @@ -7666,18 +7687,6 @@ "noCollection": { "message": "Nema zbirke" }, - "canView": { - "message": "Može vidjeti" - }, - "canViewExceptPass": { - "message": "Može vidjeti, osim lozinke" - }, - "canEdit": { - "message": "Može urediti" - }, - "canEditExceptPass": { - "message": "Može urediti, osim lozinke" - }, "noCollectionsAdded": { "message": "Niti jedna zbirka nije dodana" }, @@ -8302,31 +8311,31 @@ "message": "Pouzdani uređaji" }, "memberDecryptionOptionTdeDescPart1": { - "message": "Members will not need a master password when logging in with SSO. Master password is replaced with an encryption key stored on the device, making that device trusted. The first device a member creates their account and logs into will be trusted. New devices will need to be approved by an existing trusted device or by an administrator. The", + "message": "Članovi neće trebati glavnu lozinku kada se prijavljuju putem SSO-a. Glavnu lozinku zamjenjuje ključem za šifriranje pohranjen na uređaju, što taj uređaj čini pouzdanim. Prvi uređaj na kojem član kreira svoj račun i s kojeg se prijavi bit će pouzdan. Nove uređaje morat će odobriti ili postojeći pouzdani uređaj ili administrator. Pravilo", "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Members will not need a master password when logging in with SSO. Master password is replaced with an encryption key stored on the device, making that device trusted. The first device a member creates their account and logs into will be trusted. New devices will need to be approved by an existing trusted device or by an administrator. The single organization policy, SSO required policy, and account recovery administration policy will turn on when this option is used.'" }, "memberDecryptionOptionTdeDescLink1": { - "message": "single organization", + "message": "isključive organizacije,", "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Members will not need a master password when logging in with SSO. Master password is replaced with an encryption key stored on the device, making that device trusted. The first device a member creates their account and logs into will be trusted. New devices will need to be approved by an existing trusted device or by an administrator. The single organization policy, SSO required policy, and account recovery administration policy will turn on when this option is used.'" }, "memberDecryptionOptionTdeDescPart2": { - "message": "policy,", + "message": "", "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Members will not need a master password when logging in with SSO. Master password is replaced with an encryption key stored on the device, making that device trusted. The first device a member creates their account and logs into will be trusted. New devices will need to be approved by an existing trusted device or by an administrator. The single organization policy, SSO required policy, and account recovery administration policy will turn on when this option is used.'" }, "memberDecryptionOptionTdeDescLink2": { - "message": "SSO required", + "message": "obavezne SSO prijave", "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Members will not need a master password when logging in with SSO. Master password is replaced with an encryption key stored on the device, making that device trusted. The first device a member creates their account and logs into will be trusted. New devices will need to be approved by an existing trusted device or by an administrator. The single organization policy, SSO required policy, and account recovery administration policy will turn on when this option is used.'" }, "memberDecryptionOptionTdeDescPart3": { - "message": "policy, and", + "message": "i", "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Members will not need a master password when logging in with SSO. Master password is replaced with an encryption key stored on the device, making that device trusted. The first device a member creates their account and logs into will be trusted. New devices will need to be approved by an existing trusted device or by an administrator. The single organization policy, SSO required policy, and account recovery administration policy will turn on when this option is used.'" }, "memberDecryptionOptionTdeDescLink3": { - "message": "account recovery administration", + "message": "administracije oporavka računa", "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Members will not need a master password when logging in with SSO. Master password is replaced with an encryption key stored on the device, making that device trusted. The first device a member creates their account and logs into will be trusted. New devices will need to be approved by an existing trusted device or by an administrator. The single organization policy, SSO required policy, and account recovery administration policy will turn on when this option is used.'" }, "memberDecryptionOptionTdeDescPart4": { - "message": "policy will turn on when this option is used.", + "message": "biti će uključeni ako se koristi ova opcija.", "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Members will not need a master password when logging in with SSO. Master password is replaced with an encryption key stored on the device, making that device trusted. The first device a member creates their account and logs into will be trusted. New devices will need to be approved by an existing trusted device or by an administrator. The single organization policy, SSO required policy, and account recovery administration policy will turn on when this option is used.'" }, "orgPermissionsUpdatedMustSetPassword": { @@ -8405,16 +8414,16 @@ "message": "Odobri zahtjev" }, "deviceApproved": { - "message": "Device approved" + "message": "Uređaj odobren" }, "deviceRemoved": { - "message": "Device removed" + "message": "Uređaj uklonjen" }, "removeDevice": { - "message": "Remove device" + "message": "Ukloni uređaj" }, "removeDeviceConfirmation": { - "message": "Are you sure you want to remove this device?" + "message": "Sigurno želiš ukoniti ovaj uređaj?" }, "noDeviceRequests": { "message": "Nema zahtjeva na čekanju" @@ -8626,7 +8635,7 @@ "message": "Omogući brisanje zbirki samo vlasnicima i adminima" }, "limitItemDeletionDesc": { - "message": "Limit item deletion to members with the Can manage permission" + "message": "Ograniči brisanje stavke samo članovima koji imaju dozvolu „Moguće upravljanje”" }, "allowAdminAccessToAllCollectionItemsDesc": { "message": "Vlasnici i admini mogu upravljati svim zbirkama i stavkama" @@ -8677,9 +8686,6 @@ "message": "URL vlastitog poslužitelja", "description": "Label for field requesting a self-hosted integration service URL" }, - "aliasDomain": { - "message": "Alias domene" - }, "alreadyHaveAccount": { "message": "Već imaš račun?" }, @@ -8741,11 +8747,11 @@ "readOnlyCollectionAccess": { "message": "Nemaš pristup za upravljanje ovom zbirkom." }, - "grantAddAccessCollectionWarningTitle": { - "message": "Neodstaju prava „Moguće upravljanje”" + "grantManageCollectionWarningTitle": { + "message": "Nedostaju prava za upravljanje zbirkom" }, - "grantAddAccessCollectionWarning": { - "message": "Dodijeli prava „Moguće upravljanje” kako bi dozvolili puni pristup zbirkama uključujući brisanje." + "grantManageCollectionWarning": { + "message": "Dodijeli potpuna prava upravljanja zbirkom što uključuje i brisanje." }, "grantCollectionAccess": { "message": "Dodijeli grupama i članovima pristup ovoj zbirki." @@ -9307,7 +9313,7 @@ "message": "mjesečno po korisniku" }, "monthPerMemberBilledAnnually": { - "message": "month per member billed annually" + "message": "mjesečno po članu, naplata godišnje" }, "seats": { "message": "Mjesta" @@ -9458,16 +9464,16 @@ "message": "Ažurirane porezne informacije" }, "billingInvalidTaxIdError": { - "message": "Invalid tax ID, if you believe this is an error please contact support." + "message": "Neispravni porezni broj. Ako misliš da je broj ispravan, kontaktiraj podršku." }, "billingTaxIdTypeInferenceError": { - "message": "We were unable to validate your tax ID, if you believe this is an error please contact support." + "message": "Nismo mogli provjeriti tvoj porezni broj. Ako misliš da je broj ispravan, kontaktiraj podršku." }, "billingPreviewInvalidTaxIdError": { - "message": "Invalid tax ID, if you believe this is an error please contact support." + "message": "Neispravni porezni broj. Ako misliš da je broj ispravan, kontaktiraj podršku." }, "billingPreviewInvoiceError": { - "message": "An error occurred while previewing the invoice. Please try again later." + "message": "Greška kod pregleda fakture. Pokušaj ponovno kasnije." }, "unverified": { "message": "Nepotvrđeno" @@ -9830,13 +9836,13 @@ "message": "Algoritam ključa" }, "sshPrivateKey": { - "message": "Private key" + "message": "Privatni ključ" }, "sshPublicKey": { - "message": "Public key" + "message": "Javni ključ" }, "sshFingerprint": { - "message": "Fingerprint" + "message": "Otisak prsta" }, "sshKeyFingerprint": { "message": "Otisak prsta" @@ -10091,6 +10097,15 @@ "descriptorCode": { "message": "Šifra uplate" }, + "cannotRemoveViewOnlyCollections": { + "message": "S dopuštenjima samo za prikaz ne možeš ukloniti zbirke: $COLLECTIONS$", + "placeholders": { + "collections": { + "content": "$1", + "example": "Work, Personal" + } + } + }, "importantNotice": { "message": "Važna napomena" }, @@ -10131,13 +10146,13 @@ "message": "Ukloni članove" }, "devices": { - "message": "Devices" + "message": "Uređaji" }, "deviceListDescription": { - "message": "Your account was logged in to each of the devices below. If you do not recognize a device, remove it now." + "message": "Tvoj račun je prijavljen na svakom od ovih uređaja. Ako ne prepoznaješ uređaj, odmah ga ukloni." }, "deviceListDescriptionTemp": { - "message": "Your account was logged in to each of the devices below." + "message": "Tvoj račun je prijavljen na svakom od ovih uređaja." }, "claimedDomains": { "message": "Potvrđene domene" @@ -10225,7 +10240,7 @@ "message": "Naziv organizacije ne može biti duži od 50 znakova." }, "resellerRenewalWarningMsg": { - "message": "Your subscription will renew soon. To ensure uninterrupted service, contact $RESELLER$ to confirm your renewal before $RENEWAL_DATE$.", + "message": "Tvoja će se pretplata uskoro obnoviti. Za neprekinutu uslugu, kontaktiraj $RESELLER$ za potvrdu obnove prije $RENEWAL_DATE$.", "placeholders": { "reseller": { "content": "$1", @@ -10238,7 +10253,7 @@ } }, "resellerOpenInvoiceWarningMgs": { - "message": "An invoice for your subscription was issued on $ISSUED_DATE$. To ensure uninterrupted service, contact $RESELLER$ to confirm your renewal before $DUE_DATE$.", + "message": "Za tvoju je pretplatu $ISSUED_DATE$ izdana faktura. Za neprekinutu uslugu, kontaktiraj $RESELLER$ za potvrdu obnove prije $DUE_DATE$.", "placeholders": { "reseller": { "content": "$1", @@ -10255,7 +10270,7 @@ } }, "resellerPastDueWarningMsg": { - "message": "The invoice for your subscription has not been paid. To ensure uninterrupted service, contact $RESELLER$ to confirm your renewal before $GRACE_PERIOD_END$.", + "message": "Faktura za tvoju pretplatu nije plaćena. Za neprekinutu uslugu, kontaktiraj $RESELLER$ za potvrdu obnovu prije $GRACE_PERIOD_END$.", "placeholders": { "reseller": { "content": "$1", @@ -10268,18 +10283,67 @@ } }, "restartOrganizationSubscription": { - "message": "Organization subscription restarted" + "message": "Organizacijska pretplata ponovno pokrenuta" }, "restartSubscription": { - "message": "Restart your subscription" + "message": "Ponovno pokreni pretplatu" }, "suspendedManagedOrgMessage": { - "message": "Contact $PROVIDER$ for assistance.", + "message": "Kontaktiraj $PROVIDER$ za pomoć.", "placeholders": { "provider": { "content": "$1", "example": "Acme c" } } + }, + "accountDeprovisioningNotification": { + "message": "Administratori sada imaju mogućnost obrisati članski račun koji pripada potvrđenoj domeni." + }, + "deleteManagedUserWarningDesc": { + "message": "Ovo će obrisati članski račun uključujući sve stavke u trezoru. Ovo zamjenjuje prethodnu radnju „Ukloni”." + }, + "deleteManagedUserWarning": { + "message": "Brisanje je nova radnja!" + }, + "seatsRemaining": { + "message": "Imaš još $REMAINING$ preostalih sjedišta od $TOTAL$ dodijeljenih ovog organizaciji. Kontaktiraj svog pružatelja usluge za upravljanje pretplatom.", + "placeholders": { + "remaining": { + "content": "$1", + "example": "5" + }, + "total": { + "content": "$2", + "example": "10" + } + } + }, + "existingOrganization": { + "message": "Postojeća organizacija" + }, + "selectOrganizationProviderPortal": { + "message": "Odaberi organizaciju koju želiš dodati na svoj portal pružatelja usluga." + }, + "noOrganizations": { + "message": "Nema organizaciji za prikaz" + }, + "yourProviderSubscriptionCredit": { + "message": "Tvoja pretplata davatelja usluga dobit će kredit za preostalo vrijeme u organizacijskoj pretplati." + }, + "doYouWantToAddThisOrg": { + "message": "IP Adresa", + "placeholders": { + "provider": { + "content": "$1", + "example": "Cool MSP" + } + } + }, + "addedExistingOrganization": { + "message": "Postojeća organizacija dodana" + }, + "assignedExceedsAvailable": { + "message": "Dodijeljene licence premašuju dostupne licence." } } diff --git a/apps/web/src/locales/hu/messages.json b/apps/web/src/locales/hu/messages.json index 64f5c158a9e..bdc55b96d3c 100644 --- a/apps/web/src/locales/hu/messages.json +++ b/apps/web/src/locales/hu/messages.json @@ -464,6 +464,18 @@ "editFolder": { "message": "Mappa szerkesztése" }, + "newFolder": { + "message": "Új mappa" + }, + "folderName": { + "message": "Mappanév" + }, + "folderHintText": { + "message": "Mappa beágyazása a szülőmappa nevének hozzáadásával, majd egy “/” karakterrel. Példa: Közösségi/Fórumok" + }, + "deleteFolderPermanently": { + "message": "Biztosan véglegesen törlésre kerüljön ez a mappa?" + }, "baseDomain": { "message": "Alap domain", "description": "Domain name. Example: website.com" @@ -728,15 +740,6 @@ "itemName": { "message": "Elem neve" }, - "cannotRemoveViewOnlyCollections": { - "message": "Nem távolíthatók el a csak megtekintési engedéllyel bíró gyűjtemények: $COLLECTIONS$", - "placeholders": { - "collections": { - "content": "$1", - "example": "Work, Personal" - } - } - }, "ex": { "message": "Példa:", "description": "Short abbreviation for 'example'." @@ -1182,6 +1185,9 @@ "logInInitiated": { "message": "A bejelentkezés elindításra került." }, + "logInRequestSent": { + "message": "A kérés elküldésre került." + }, "submit": { "message": "Elküldés" }, @@ -1371,12 +1377,39 @@ "notificationSentDevice": { "message": "A rendszer értesítést küldött az eszközre." }, + "notificationSentDevicePart1": { + "message": "A Bitwarden zárolás feloldása az eszközön vagy: " + }, + "areYouTryingToAccessYourAccount": { + "message": "A fiókhoz próbálunk hozzáférni?" + }, + "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" + }, + "notificationSentDeviceAnchor": { + "message": "webalkalmazás" + }, + "notificationSentDevicePart2": { + "message": "Jóváhagyás előtt győződjünk meg arról, hogy az ujjlenyomat kifejezés megegyezik az alábbi kifejezéssel." + }, + "notificationSentDeviceComplete": { + "message": "Oldjuk fel a Bitwarden zárolását az eszközön. Jóváhagyás előtt győződjünk meg arról, hogy az ujjlenyomat kifejezés megegyezik az alábbi kifejezéssel." + }, "aNotificationWasSentToYourDevice": { "message": "Egy értesítés lett elküldve az eszközre." }, - "makeSureYourAccountIsUnlockedAndTheFingerprintEtc": { - "message": "Ellenőrizzük, hogy a széf feloldásra került és az ujjlenyomat kifejezés egyezik a másik eszközön levővel." - }, "versionNumber": { "message": "Verzió: $VERSION_NUMBER$", "placeholders": { @@ -1664,9 +1697,6 @@ "message": "Félreérthető karakterek mellőzése", "description": "Label for the avoid ambiguous characters checkbox." }, - "regeneratePassword": { - "message": "Jelszó újragenerálása" - }, "length": { "message": "Hossz" }, @@ -2170,8 +2200,20 @@ "manage": { "message": "Kezelés" }, - "canManage": { - "message": "Kezelhet" + "manageCollection": { + "message": "Gyűjtemény kezelése" + }, + "viewItems": { + "message": "Elemek megtekintése" + }, + "viewItemsHidePass": { + "message": "Elemek megtekintése, rejtett jelszavak" + }, + "editItems": { + "message": "Elemek szerkesztése" + }, + "editItemsHidePass": { + "message": "Elemek szerkesztése, rejtett jelszavak" }, "disable": { "message": "Letiltás" @@ -2368,11 +2410,8 @@ "twoFactorU2fProblemReadingTryAgain": { "message": "Probléma lépett fel a biztonsági kulcs olvasásakor. Próbáljuk újra." }, - "twoFactorWebAuthnWarning": { - "message": "A platform korlátozások miatt nem lehetséges minden Bitwarden alkalmazásban YubiKey eszközt használni. Engedélyezzünk egy másik kétlépcsős bejelentkezés szolgáltatót, hogy hozzáférhessünk a fiókhoz akkor is, ha a YubiKey nem használható. Támogatott platformok:" - }, - "twoFactorWebAuthnSupportWeb": { - "message": "Web széf és böngésző kiegészítők asztali gépen / laptopon engedélyezett U2F böngészővel (Chrome, Opera, Vivaldi, vagy Firefox bekapcsolt FIDO U2F-fel)." + "twoFactorWebAuthnWarning1": { + "message": "A platform korlátozások miatt nem lehetséges minden Bitwarden alkalmazásban a WebAuthn használata. Be kell üzemelni egy másik kétlépcsős bejelentkezés szolgáltatót, hogy hozzáférhessünk a fiókhoz akkor is, ha a WebAuthn nem használható." }, "twoFactorRecoveryYourCode": { "message": "Bitwarden kétlépcsős bejelentkezés helyreállító kód" @@ -4710,9 +4749,6 @@ "passwordGeneratorPolicyDesc": { "message": "A minimális követelmények beállítása a jelszó generáló konfigurációhoz." }, - "passwordGeneratorPolicyInEffect": { - "message": "Egy vagy több szervezeti szabály érinti a generátor beállításokat." - }, "masterPasswordPolicyInEffect": { "message": "Egy vagy több szervezeti szabály előírja a mesterjelszóhoz a következő követelményeket:" }, @@ -6681,15 +6717,6 @@ "message": "Generátor", "description": "Short for 'credential generator'." }, - "whatWouldYouLikeToGenerate": { - "message": "Mit szeretnénk generálni?" - }, - "passwordType": { - "message": "Jelszótípus" - }, - "regenerateUsername": { - "message": "Felhasználónév ismételt generálása" - }, "generateUsername": { "message": "Felhasználónév generálása" }, @@ -6730,9 +6757,6 @@ } } }, - "usernameType": { - "message": "Felhasználónév típusa" - }, "plusAddressedEmail": { "message": "További címzési email cím", "description": "Username generator option that appends a random sub-address to the username. For example: address+subaddress@email.com" @@ -6952,9 +6976,6 @@ "message": "Kiszolglónév", "description": "Part of a URL." }, - "apiAccessToken": { - "message": "API hozzáférési vezérjel" - }, "deviceVerification": { "message": "Eszköz ellenőrzés" }, @@ -7666,18 +7687,6 @@ "noCollection": { "message": "Nincs gyűjtemény." }, - "canView": { - "message": "Megtekintheti" - }, - "canViewExceptPass": { - "message": "Megtekintheti, kivéve a jelszavakat" - }, - "canEdit": { - "message": "Szerkesztheti" - }, - "canEditExceptPass": { - "message": "Szerkesztheti, kivéve a jelszavakat" - }, "noCollectionsAdded": { "message": "Nem lett gyűjtemény hozzáadva." }, @@ -8626,7 +8635,7 @@ "message": "A gyűjtemény törlésének korlátozása tulajdonosokra és adminisztrátorokra" }, "limitItemDeletionDesc": { - "message": "Limit item deletion to members with the Can manage permission" + "message": "Az elemek törlésének korlátozása a Kezelheti jogosultsággal rendelkező tagokra" }, "allowAdminAccessToAllCollectionItemsDesc": { "message": "Owners and admins can manage all collections and items" @@ -8677,9 +8686,6 @@ "message": "Saját üzemeltetésű szerver webcím", "description": "Label for field requesting a self-hosted integration service URL" }, - "aliasDomain": { - "message": "Áldomain" - }, "alreadyHaveAccount": { "message": "Van már saját fiók?" }, @@ -8741,11 +8747,11 @@ "readOnlyCollectionAccess": { "message": "Nincs jogosultság ennek a gyűjteménynek a kezelésére." }, - "grantAddAccessCollectionWarningTitle": { - "message": "Missing Can Manage Permissions" + "grantManageCollectionWarningTitle": { + "message": "Hiányzó gyűjtemény kezelési engedélyek" }, - "grantAddAccessCollectionWarning": { - "message": "Grant Can manage permissions to allow full collection management including deletion of collection." + "grantManageCollectionWarning": { + "message": "Adjunk gyűjtemény kezelési engedélyeket, hogy lehetővé tegyük a teljes gyűjtemény kezelést, beleértve a gyűjtemény törlését is." }, "grantCollectionAccess": { "message": "Adjunk hozzáférést csoportoknak vagy személyeknek eennél a gyűjteménynél." @@ -10091,6 +10097,15 @@ "descriptorCode": { "message": "Leíró kód" }, + "cannotRemoveViewOnlyCollections": { + "message": "Nem távolíthatók el a csak megtekintési engedéllyel bíró gyűjtemények: $COLLECTIONS$", + "placeholders": { + "collections": { + "content": "$1", + "example": "Work, Personal" + } + } + }, "importantNotice": { "message": "Fontos megjegyzés" }, @@ -10281,5 +10296,54 @@ "example": "Acme c" } } + }, + "accountDeprovisioningNotification": { + "message": "Az adminisztrátorok mostantól törölhetik az igényelt tartományhoz tartozó tagi fiókokat." + }, + "deleteManagedUserWarningDesc": { + "message": "Ez a művelet törli a tagi fiókot, beleértve a tárolókban lévő összes elemet. Ez felváltja az előző Eltávolítás műveletet." + }, + "deleteManagedUserWarning": { + "message": "A törlés új művelet!" + }, + "seatsRemaining": { + "message": "$REMAINING$ hely maradt a szervezethez rendelt $TOTAL$ helyből. Az előfizetés kezeléséhez forduljunk a szolgáltatóhoz.", + "placeholders": { + "remaining": { + "content": "$1", + "example": "5" + }, + "total": { + "content": "$2", + "example": "10" + } + } + }, + "existingOrganization": { + "message": "Létező szervezet" + }, + "selectOrganizationProviderPortal": { + "message": "Válasszuk ki a szolgáltatói portálhoz hozzáadni kívánt szervezetet." + }, + "noOrganizations": { + "message": "Nincsenek listázható szervezetek." + }, + "yourProviderSubscriptionCredit": { + "message": "A szolgáltatói előfizetés jóváírást kap a szervezet előfizetésből hátralévő időre." + }, + "doYouWantToAddThisOrg": { + "message": "Hozzáadásra kerüljön ez a szervezet $PROVIDER$ szolgáltatáshoz?", + "placeholders": { + "provider": { + "content": "$1", + "example": "Cool MSP" + } + } + }, + "addedExistingOrganization": { + "message": "A létező szervezet hozzáadásra került." + }, + "assignedExceedsAvailable": { + "message": "A hozzárendelt helyek száma meghaladja a rendelkezésre álló helyek számát." } } diff --git a/apps/web/src/locales/id/messages.json b/apps/web/src/locales/id/messages.json index 1fd1632e306..565cb743eab 100644 --- a/apps/web/src/locales/id/messages.json +++ b/apps/web/src/locales/id/messages.json @@ -464,6 +464,18 @@ "editFolder": { "message": "Edit Folder" }, + "newFolder": { + "message": "New folder" + }, + "folderName": { + "message": "Folder name" + }, + "folderHintText": { + "message": "Nest a folder by adding the parent folder's name followed by a “/”. Example: Social/Forums" + }, + "deleteFolderPermanently": { + "message": "Are you sure you want to permanently delete this folder?" + }, "baseDomain": { "message": "Domain dasar", "description": "Domain name. Example: website.com" @@ -728,15 +740,6 @@ "itemName": { "message": "Item name" }, - "cannotRemoveViewOnlyCollections": { - "message": "You cannot remove collections with View only permissions: $COLLECTIONS$", - "placeholders": { - "collections": { - "content": "$1", - "example": "Work, Personal" - } - } - }, "ex": { "message": "cth.", "description": "Short abbreviation for 'example'." @@ -1182,6 +1185,9 @@ "logInInitiated": { "message": "Log in initiated" }, + "logInRequestSent": { + "message": "Request sent" + }, "submit": { "message": "Kirim" }, @@ -1371,12 +1377,39 @@ "notificationSentDevice": { "message": "A notification has been sent to your device." }, + "notificationSentDevicePart1": { + "message": "Unlock Bitwarden on your device or on the " + }, + "areYouTryingToAccessYourAccount": { + "message": "Are you trying to access your account?" + }, + "accessAttemptBy": { + "message": "Access attempt by $EMAIL$", + "placeholders": { + "email": { + "content": "$1", + "example": "name@example.com" + } + } + }, + "confirmAccess": { + "message": "Confirm access" + }, + "denyAccess": { + "message": "Deny access" + }, + "notificationSentDeviceAnchor": { + "message": "web app" + }, + "notificationSentDevicePart2": { + "message": "Make sure the Fingerprint phrase matches the one below before approving." + }, + "notificationSentDeviceComplete": { + "message": "Unlock Bitwarden on your device. Make sure the Fingerprint phrase matches the one below before approving." + }, "aNotificationWasSentToYourDevice": { "message": "A notification was sent to your device" }, - "makeSureYourAccountIsUnlockedAndTheFingerprintEtc": { - "message": "Make sure your account is unlocked and the fingerprint phrase matches on the other device" - }, "versionNumber": { "message": "Versi $VERSION_NUMBER$", "placeholders": { @@ -1664,9 +1697,6 @@ "message": "Avoid ambiguous characters", "description": "Label for the avoid ambiguous characters checkbox." }, - "regeneratePassword": { - "message": "Buat Ulang Sandi" - }, "length": { "message": "Panjang" }, @@ -2170,8 +2200,20 @@ "manage": { "message": "Kelola" }, - "canManage": { - "message": "Can manage" + "manageCollection": { + "message": "Manage collection" + }, + "viewItems": { + "message": "View items" + }, + "viewItemsHidePass": { + "message": "View items, hidden passwords" + }, + "editItems": { + "message": "Edit items" + }, + "editItemsHidePass": { + "message": "Edit items, hidden passwords" }, "disable": { "message": "Nonaktifkan" @@ -2368,11 +2410,8 @@ "twoFactorU2fProblemReadingTryAgain": { "message": "Ada masalah saat membaca kunci keamanan. Coba lagi." }, - "twoFactorWebAuthnWarning": { - "message": "Karena keterbatasan platform, WebAuthn tidak dapat digunakan di semua aplikasi Bitwarden. Anda harus mengaktifkan penyedia proses masuk dua langkah lainnya sehingga Anda dapat mengakses akun Anda saat WebAUthn tidak dapat digunakan. Platform yang didukung:" - }, - "twoFactorWebAuthnSupportWeb": { - "message": "Brankas web dan ekstensi browser di desktop / laptop dengan browser yang mendukung WebAuthn (Chrome, Opera, Vivaldi, atau Firefox dengan FIDO U2F diaktifkan)." + "twoFactorWebAuthnWarning1": { + "message": "Due to platform limitations, WebAuthn cannot be used on all Bitwarden applications. You should set up another two-step login provider so that you can access your account when WebAuthn cannot be used." }, "twoFactorRecoveryYourCode": { "message": "Kode pemulihan masuk dua langkah Bitwarden Anda" @@ -4710,9 +4749,6 @@ "passwordGeneratorPolicyDesc": { "message": "Tetapkan persyaratan minimum untuk konfigurasi pembuat kata sandi." }, - "passwordGeneratorPolicyInEffect": { - "message": "Satu atau beberapa kebijakan organisasi memengaruhi pengaturan generator Anda." - }, "masterPasswordPolicyInEffect": { "message": "Satu atau lebih kebijakan organisasi memerlukan kata sandi utama Anda untuk memenuhi persyaratan berikut:" }, @@ -6681,15 +6717,6 @@ "message": "Generator", "description": "Short for 'credential generator'." }, - "whatWouldYouLikeToGenerate": { - "message": "What would you like to generate?" - }, - "passwordType": { - "message": "Jenis kata sandi" - }, - "regenerateUsername": { - "message": "Regenerate username" - }, "generateUsername": { "message": "Generate username" }, @@ -6730,9 +6757,6 @@ } } }, - "usernameType": { - "message": "Jenis nama pengguna" - }, "plusAddressedEmail": { "message": "Plus addressed email", "description": "Username generator option that appends a random sub-address to the username. For example: address+subaddress@email.com" @@ -6952,9 +6976,6 @@ "message": "Hostname", "description": "Part of a URL." }, - "apiAccessToken": { - "message": "API access token" - }, "deviceVerification": { "message": "Verifikasi Perangkat" }, @@ -7666,18 +7687,6 @@ "noCollection": { "message": "No collection" }, - "canView": { - "message": "Can view" - }, - "canViewExceptPass": { - "message": "Can view, except passwords" - }, - "canEdit": { - "message": "Can edit" - }, - "canEditExceptPass": { - "message": "Can edit, except passwords" - }, "noCollectionsAdded": { "message": "No collections added" }, @@ -8677,9 +8686,6 @@ "message": "Self-host server URL", "description": "Label for field requesting a self-hosted integration service URL" }, - "aliasDomain": { - "message": "Alias domain" - }, "alreadyHaveAccount": { "message": "Already have an account?" }, @@ -8741,11 +8747,11 @@ "readOnlyCollectionAccess": { "message": "You do not have access to manage this collection." }, - "grantAddAccessCollectionWarningTitle": { - "message": "Missing Can Manage Permissions" + "grantManageCollectionWarningTitle": { + "message": "Missing Manage Collection Permissions" }, - "grantAddAccessCollectionWarning": { - "message": "Grant Can manage permissions to allow full collection management including deletion of collection." + "grantManageCollectionWarning": { + "message": "Grant Manage collection permissions to allow full collection management including deletion of collection." }, "grantCollectionAccess": { "message": "Grant groups or members access to this collection." @@ -10091,6 +10097,15 @@ "descriptorCode": { "message": "Descriptor code" }, + "cannotRemoveViewOnlyCollections": { + "message": "You cannot remove collections with View only permissions: $COLLECTIONS$", + "placeholders": { + "collections": { + "content": "$1", + "example": "Work, Personal" + } + } + }, "importantNotice": { "message": "Important notice" }, @@ -10281,5 +10296,54 @@ "example": "Acme c" } } + }, + "accountDeprovisioningNotification": { + "message": "Administrators now have the ability to delete member accounts that belong to a claimed domain." + }, + "deleteManagedUserWarningDesc": { + "message": "This action will delete the member account including all items in their vault. This replaces the previous Remove action." + }, + "deleteManagedUserWarning": { + "message": "Delete is a new action!" + }, + "seatsRemaining": { + "message": "You have $REMAINING$ seats remaining out of $TOTAL$ seats assigned to this organization. Contact your provider to manage your subscription.", + "placeholders": { + "remaining": { + "content": "$1", + "example": "5" + }, + "total": { + "content": "$2", + "example": "10" + } + } + }, + "existingOrganization": { + "message": "Existing organization" + }, + "selectOrganizationProviderPortal": { + "message": "Select an organization to add to your Provider Portal." + }, + "noOrganizations": { + "message": "There are no organizations to list" + }, + "yourProviderSubscriptionCredit": { + "message": "Your provider subscription will receive a credit for any remaining time in the organization's subscription." + }, + "doYouWantToAddThisOrg": { + "message": "Do you want to add this organization to $PROVIDER$?", + "placeholders": { + "provider": { + "content": "$1", + "example": "Cool MSP" + } + } + }, + "addedExistingOrganization": { + "message": "Added existing organization" + }, + "assignedExceedsAvailable": { + "message": "Assigned seats exceed available seats." } } diff --git a/apps/web/src/locales/it/messages.json b/apps/web/src/locales/it/messages.json index 082b087120c..d05dec8e603 100644 --- a/apps/web/src/locales/it/messages.json +++ b/apps/web/src/locales/it/messages.json @@ -464,6 +464,18 @@ "editFolder": { "message": "Modifica cartella" }, + "newFolder": { + "message": "Nuova cartella" + }, + "folderName": { + "message": "Nome cartella" + }, + "folderHintText": { + "message": "Annida una cartella aggiungendo il nome della cartella superiore seguito da un “/”. Esempio: Social/Forums" + }, + "deleteFolderPermanently": { + "message": "Sei sicuro di voler eliminare definitivamente questo cartella?" + }, "baseDomain": { "message": "Dominio di base", "description": "Domain name. Example: website.com" @@ -728,15 +740,6 @@ "itemName": { "message": "Nome elemento" }, - "cannotRemoveViewOnlyCollections": { - "message": "Non puoi rimuovere raccolte con i soli permessi di visualizzazione: $COLLECTIONS$", - "placeholders": { - "collections": { - "content": "$1", - "example": "Work, Personal" - } - } - }, "ex": { "message": "es.", "description": "Short abbreviation for 'example'." @@ -1182,6 +1185,9 @@ "logInInitiated": { "message": "Login avviato" }, + "logInRequestSent": { + "message": "Richiesta inviata" + }, "submit": { "message": "Invia" }, @@ -1371,12 +1377,39 @@ "notificationSentDevice": { "message": "Una notifica è stata inviata al tuo dispositivo." }, + "notificationSentDevicePart1": { + "message": "Sblocca Bitwarden sul tuo dispositivo o su " + }, + "areYouTryingToAccessYourAccount": { + "message": "Stai cercando di accedere al tuo account?" + }, + "accessAttemptBy": { + "message": "Tentativo di accesso di $EMAIL$", + "placeholders": { + "email": { + "content": "$1", + "example": "name@example.com" + } + } + }, + "confirmAccess": { + "message": "Conferma accesso" + }, + "denyAccess": { + "message": "Nega accesso" + }, + "notificationSentDeviceAnchor": { + "message": "app web" + }, + "notificationSentDevicePart2": { + "message": "Assicurarsi che la frase di impronta digitale corrisponda a quella sottostante prima dell'approvazione." + }, + "notificationSentDeviceComplete": { + "message": "Sblocca Bitwarden sul tuo dispositivo. Assicurati che la frase di impronta digitale corrisponda a quella sottostante prima di approvare." + }, "aNotificationWasSentToYourDevice": { "message": "A notification was sent to your device" }, - "makeSureYourAccountIsUnlockedAndTheFingerprintEtc": { - "message": "Make sure your account is unlocked and the fingerprint phrase matches on the other device" - }, "versionNumber": { "message": "Versione $VERSION_NUMBER$", "placeholders": { @@ -1664,9 +1697,6 @@ "message": "Avoid ambiguous characters", "description": "Label for the avoid ambiguous characters checkbox." }, - "regeneratePassword": { - "message": "Rigenera password" - }, "length": { "message": "Lunghezza" }, @@ -2170,8 +2200,20 @@ "manage": { "message": "Gestisci" }, - "canManage": { - "message": "Può gestire" + "manageCollection": { + "message": "Gestisci collezione" + }, + "viewItems": { + "message": "Vedi voci" + }, + "viewItemsHidePass": { + "message": "Vedi elementi, parole d'accesso nascoste" + }, + "editItems": { + "message": "Modifica voci" + }, + "editItemsHidePass": { + "message": "Modifica elementi, parole d'accesso nascoste" }, "disable": { "message": "Disattiva" @@ -2368,11 +2410,8 @@ "twoFactorU2fProblemReadingTryAgain": { "message": "Si è verificato un problema durante la lettura della chiave di sicurezza. Riprova." }, - "twoFactorWebAuthnWarning": { - "message": "A causa di limitazioni della piattaforma, WebAuthn non può essere utilizzato su tutte le app Bitwarden. Dovresti abilitare un altro metodo di verifica in due passaggi per accedere al tuo account anche quando WebAuthn non può essere usato. Piattaforme supportate:" - }, - "twoFactorWebAuthnSupportWeb": { - "message": "Cassaforte Web ed estensione per il browser desktop/laptop con un browser abilitato per WebAuthn (Chrome, Opera, Vivaldi o Firefox con FIDO U2F abilitato)." + "twoFactorWebAuthnWarning1": { + "message": "A causa delle limitazioni della piattaforma, WebAuthn non può essere usato in tutte le applicazioni Bitwarden. È necessario impostare un altro fornitore d'accesso in due passaggi in modo da poter accedere al tuo account quando WebAuthn non può essere usato." }, "twoFactorRecoveryYourCode": { "message": "Il tuo codice di recupero Bitwarden per la verifica in due passaggi" @@ -4710,9 +4749,6 @@ "passwordGeneratorPolicyDesc": { "message": "Imposta requisiti minimi di complessità per il generatore di password." }, - "passwordGeneratorPolicyInEffect": { - "message": "Una o più politiche dell'organizzazione stanno influenzando le impostazioni del tuo generatore." - }, "masterPasswordPolicyInEffect": { "message": "Una o più politiche dell'organizzazione richiedono che la tua password principale soddisfi questi requisiti:" }, @@ -6681,15 +6717,6 @@ "message": "Generatore", "description": "Short for 'credential generator'." }, - "whatWouldYouLikeToGenerate": { - "message": "Cosa vuoi generare?" - }, - "passwordType": { - "message": "Tipo di password" - }, - "regenerateUsername": { - "message": "Rigenera nome utente" - }, "generateUsername": { "message": "Genera nome utente" }, @@ -6730,9 +6757,6 @@ } } }, - "usernameType": { - "message": "Tipo di nome utente" - }, "plusAddressedEmail": { "message": "Indirizzo email alternativo", "description": "Username generator option that appends a random sub-address to the username. For example: address+subaddress@email.com" @@ -6952,9 +6976,6 @@ "message": "Nome host", "description": "Part of a URL." }, - "apiAccessToken": { - "message": "Token di accesso API" - }, "deviceVerification": { "message": "Verifica del dispositivo" }, @@ -7666,18 +7687,6 @@ "noCollection": { "message": "Nessuna raccolta" }, - "canView": { - "message": "Può visualizzare" - }, - "canViewExceptPass": { - "message": "Può visualizzare, eccetto le password" - }, - "canEdit": { - "message": "Può modificare" - }, - "canEditExceptPass": { - "message": "Può modificare, eccetto le password" - }, "noCollectionsAdded": { "message": "Nessuna raccolta aggiunta" }, @@ -8626,7 +8635,7 @@ "message": "Limit collection deletion to owners and admins" }, "limitItemDeletionDesc": { - "message": "Limit item deletion to members with the Can manage permission" + "message": "Limita l'eliminazione di elementi ai membri con il permesso di gestione" }, "allowAdminAccessToAllCollectionItemsDesc": { "message": "Proprietari e amministratori possono gestire tutte le raccolte e gli elementi" @@ -8677,9 +8686,6 @@ "message": "Self-host server URL", "description": "Label for field requesting a self-hosted integration service URL" }, - "aliasDomain": { - "message": "Dominio alias" - }, "alreadyHaveAccount": { "message": "Hai già un account?" }, @@ -8741,11 +8747,11 @@ "readOnlyCollectionAccess": { "message": "Non hai accesso alla gestione di questa raccolta." }, - "grantAddAccessCollectionWarningTitle": { - "message": "Autorizzazione Può gestire mancante" + "grantManageCollectionWarningTitle": { + "message": "Permessi di gestione raccolte mancanti" }, - "grantAddAccessCollectionWarning": { - "message": "Concedi l'autorizzazione Può gestire per consentire la gestione completa della raccolta, inclusa l'eliminazione della raccolta." + "grantManageCollectionWarning": { + "message": "Concedi i permessi di gestione della collezione per consentire la gestione completa della raccolta, inclusa l'eliminazione della raccolta." }, "grantCollectionAccess": { "message": "Consenti a gruppi o membri di accedere a questa raccolta." @@ -10091,6 +10097,15 @@ "descriptorCode": { "message": "Descriptor code" }, + "cannotRemoveViewOnlyCollections": { + "message": "Non puoi rimuovere raccolte con i soli permessi di visualizzazione: $COLLECTIONS$", + "placeholders": { + "collections": { + "content": "$1", + "example": "Work, Personal" + } + } + }, "importantNotice": { "message": "Important notice" }, @@ -10281,5 +10296,54 @@ "example": "Acme c" } } + }, + "accountDeprovisioningNotification": { + "message": "Gli amministratori ora hanno la possibilità di eliminare gli account membri che appartengono a un dominio rivendicato." + }, + "deleteManagedUserWarningDesc": { + "message": "Questa azione eliminerà l'account membro includendo tutti gli elementi nella sua cassaforte. Questo sostituisce l'azione precedente Rimuovi." + }, + "deleteManagedUserWarning": { + "message": "Eliminare è una nuova azione!" + }, + "seatsRemaining": { + "message": "Hai $REMAINING$ posti di $TOTAL$ posti assegnati a quest'organizzazione. Contatta il provider per gestire l'abbonamento.", + "placeholders": { + "remaining": { + "content": "$1", + "example": "5" + }, + "total": { + "content": "$2", + "example": "10" + } + } + }, + "existingOrganization": { + "message": "Organizzazione esistente" + }, + "selectOrganizationProviderPortal": { + "message": "Seleziona un'organizzazione da aggiungere al tuo portale fornitori." + }, + "noOrganizations": { + "message": "Non ci sono organizzazioni da elencare" + }, + "yourProviderSubscriptionCredit": { + "message": "Il tuo abbonamento fornitore riceverà un credito per qualsiasi tempo rimanente nell'abbonamento dell'organizzazione." + }, + "doYouWantToAddThisOrg": { + "message": "Vuoi aggiungere questa organizzazione a $PROVIDER$?", + "placeholders": { + "provider": { + "content": "$1", + "example": "Cool MSP" + } + } + }, + "addedExistingOrganization": { + "message": "Aggiunta organizzazione esistente" + }, + "assignedExceedsAvailable": { + "message": "I posti assegnati superano i posti disponibili." } } diff --git a/apps/web/src/locales/ja/messages.json b/apps/web/src/locales/ja/messages.json index b7ca1764125..dbe3ceb6eaf 100644 --- a/apps/web/src/locales/ja/messages.json +++ b/apps/web/src/locales/ja/messages.json @@ -464,6 +464,18 @@ "editFolder": { "message": "フォルダーを編集" }, + "newFolder": { + "message": "New folder" + }, + "folderName": { + "message": "Folder name" + }, + "folderHintText": { + "message": "Nest a folder by adding the parent folder's name followed by a “/”. Example: Social/Forums" + }, + "deleteFolderPermanently": { + "message": "Are you sure you want to permanently delete this folder?" + }, "baseDomain": { "message": "ベースドメイン", "description": "Domain name. Example: website.com" @@ -728,15 +740,6 @@ "itemName": { "message": "アイテム名" }, - "cannotRemoveViewOnlyCollections": { - "message": "表示のみの権限が与えられているコレクションを削除することはできません: $COLLECTIONS$", - "placeholders": { - "collections": { - "content": "$1", - "example": "Work, Personal" - } - } - }, "ex": { "message": "例:", "description": "Short abbreviation for 'example'." @@ -1182,6 +1185,9 @@ "logInInitiated": { "message": "ログイン開始" }, + "logInRequestSent": { + "message": "Request sent" + }, "submit": { "message": "送信" }, @@ -1371,12 +1377,39 @@ "notificationSentDevice": { "message": "デバイスに通知を送信しました。" }, + "notificationSentDevicePart1": { + "message": "Unlock Bitwarden on your device or on the " + }, + "areYouTryingToAccessYourAccount": { + "message": "Are you trying to access your account?" + }, + "accessAttemptBy": { + "message": "Access attempt by $EMAIL$", + "placeholders": { + "email": { + "content": "$1", + "example": "name@example.com" + } + } + }, + "confirmAccess": { + "message": "Confirm access" + }, + "denyAccess": { + "message": "Deny access" + }, + "notificationSentDeviceAnchor": { + "message": "web app" + }, + "notificationSentDevicePart2": { + "message": "Make sure the Fingerprint phrase matches the one below before approving." + }, + "notificationSentDeviceComplete": { + "message": "Unlock Bitwarden on your device. Make sure the Fingerprint phrase matches the one below before approving." + }, "aNotificationWasSentToYourDevice": { "message": "お使いのデバイスに通知が送信されました" }, - "makeSureYourAccountIsUnlockedAndTheFingerprintEtc": { - "message": "アカウントがロック解除されていることと、フィンガープリントフレーズが他の端末と一致していることを確認してください" - }, "versionNumber": { "message": "バージョン $VERSION_NUMBER$", "placeholders": { @@ -1664,9 +1697,6 @@ "message": "あいまいな文字を避ける", "description": "Label for the avoid ambiguous characters checkbox." }, - "regeneratePassword": { - "message": "パスワードの再生成" - }, "length": { "message": "長さ" }, @@ -2170,8 +2200,20 @@ "manage": { "message": "管理" }, - "canManage": { - "message": "管理可能" + "manageCollection": { + "message": "Manage collection" + }, + "viewItems": { + "message": "View items" + }, + "viewItemsHidePass": { + "message": "View items, hidden passwords" + }, + "editItems": { + "message": "Edit items" + }, + "editItemsHidePass": { + "message": "Edit items, hidden passwords" }, "disable": { "message": "無効化" @@ -2368,11 +2410,8 @@ "twoFactorU2fProblemReadingTryAgain": { "message": "セキュリティキーの読み取り中に問題が発生しました。もう一度やり直して下さい。" }, - "twoFactorWebAuthnWarning": { - "message": "プラットフォームの制限により、WebAuthnはBitwardenの全てのアプリケーションで使用できるわけではありません。WebAuthnが使用できない場合に備えて、他の二段階認証プロバイダを有効化しておくことをおすすめします。サポートされているプラットフォーム:" - }, - "twoFactorWebAuthnSupportWeb": { - "message": "WebAuthn対応ブラウザ(FIDO U2F が有効な Chrome、Opera、Vivaldi、Firefox)を搭載したデスクトップ/ノートパソコンで、WebVaultとブラウザ拡張機能を使用します。" + "twoFactorWebAuthnWarning1": { + "message": "Due to platform limitations, WebAuthn cannot be used on all Bitwarden applications. You should set up another two-step login provider so that you can access your account when WebAuthn cannot be used." }, "twoFactorRecoveryYourCode": { "message": "二段階認証のリカバリーコード" @@ -4710,9 +4749,6 @@ "passwordGeneratorPolicyDesc": { "message": "パスワード生成の最低要件を設定する。" }, - "passwordGeneratorPolicyInEffect": { - "message": "組織の要件がパスワード生成の設定に影響しています。" - }, "masterPasswordPolicyInEffect": { "message": "組織が求めるマスターパスワードの要件は:" }, @@ -6681,15 +6717,6 @@ "message": "ジェネレーター", "description": "Short for 'credential generator'." }, - "whatWouldYouLikeToGenerate": { - "message": "何を生成しますか?" - }, - "passwordType": { - "message": "パスワードの種類" - }, - "regenerateUsername": { - "message": "ユーザー名を再生成" - }, "generateUsername": { "message": "ユーザー名を生成" }, @@ -6730,9 +6757,6 @@ } } }, - "usernameType": { - "message": "ユーザー名の種類" - }, "plusAddressedEmail": { "message": "プラス付きのメールアドレス", "description": "Username generator option that appends a random sub-address to the username. For example: address+subaddress@email.com" @@ -6952,9 +6976,6 @@ "message": "ホスト名", "description": "Part of a URL." }, - "apiAccessToken": { - "message": "API アクセストークン" - }, "deviceVerification": { "message": "デバイス認証" }, @@ -7666,18 +7687,6 @@ "noCollection": { "message": "コレクションなし" }, - "canView": { - "message": "閲覧可能" - }, - "canViewExceptPass": { - "message": "パスワード以外は閲覧可能" - }, - "canEdit": { - "message": "編集可能" - }, - "canEditExceptPass": { - "message": "パスワード以外は編集可能" - }, "noCollectionsAdded": { "message": "コレクションが追加されていません" }, @@ -8677,9 +8686,6 @@ "message": "自己ホスト型サーバー URL", "description": "Label for field requesting a self-hosted integration service URL" }, - "aliasDomain": { - "message": "エイリアスドメイン" - }, "alreadyHaveAccount": { "message": "既にアカウントをお持ちですか?" }, @@ -8741,11 +8747,11 @@ "readOnlyCollectionAccess": { "message": "このコレクションを管理する権限がありません。" }, - "grantAddAccessCollectionWarningTitle": { - "message": "「管理可能」権限がありません" + "grantManageCollectionWarningTitle": { + "message": "Missing Manage Collection Permissions" }, - "grantAddAccessCollectionWarning": { - "message": "コレクションの削除を含む完全なコレクション管理を許可するには「管理可能」権限を許可してください。" + "grantManageCollectionWarning": { + "message": "Grant Manage collection permissions to allow full collection management including deletion of collection." }, "grantCollectionAccess": { "message": "グループまたはメンバーにこのコレクションへのアクセスを許可します。" @@ -10091,6 +10097,15 @@ "descriptorCode": { "message": "Descriptor code" }, + "cannotRemoveViewOnlyCollections": { + "message": "表示のみの権限が与えられているコレクションを削除することはできません: $COLLECTIONS$", + "placeholders": { + "collections": { + "content": "$1", + "example": "Work, Personal" + } + } + }, "importantNotice": { "message": "Important notice" }, @@ -10281,5 +10296,54 @@ "example": "Acme c" } } + }, + "accountDeprovisioningNotification": { + "message": "Administrators now have the ability to delete member accounts that belong to a claimed domain." + }, + "deleteManagedUserWarningDesc": { + "message": "This action will delete the member account including all items in their vault. This replaces the previous Remove action." + }, + "deleteManagedUserWarning": { + "message": "Delete is a new action!" + }, + "seatsRemaining": { + "message": "You have $REMAINING$ seats remaining out of $TOTAL$ seats assigned to this organization. Contact your provider to manage your subscription.", + "placeholders": { + "remaining": { + "content": "$1", + "example": "5" + }, + "total": { + "content": "$2", + "example": "10" + } + } + }, + "existingOrganization": { + "message": "Existing organization" + }, + "selectOrganizationProviderPortal": { + "message": "Select an organization to add to your Provider Portal." + }, + "noOrganizations": { + "message": "There are no organizations to list" + }, + "yourProviderSubscriptionCredit": { + "message": "Your provider subscription will receive a credit for any remaining time in the organization's subscription." + }, + "doYouWantToAddThisOrg": { + "message": "Do you want to add this organization to $PROVIDER$?", + "placeholders": { + "provider": { + "content": "$1", + "example": "Cool MSP" + } + } + }, + "addedExistingOrganization": { + "message": "Added existing organization" + }, + "assignedExceedsAvailable": { + "message": "Assigned seats exceed available seats." } } diff --git a/apps/web/src/locales/ka/messages.json b/apps/web/src/locales/ka/messages.json index 40b717edb69..92c64db7f56 100644 --- a/apps/web/src/locales/ka/messages.json +++ b/apps/web/src/locales/ka/messages.json @@ -464,6 +464,18 @@ "editFolder": { "message": "საქაღალდის ჩასწორება" }, + "newFolder": { + "message": "New folder" + }, + "folderName": { + "message": "Folder name" + }, + "folderHintText": { + "message": "Nest a folder by adding the parent folder's name followed by a “/”. Example: Social/Forums" + }, + "deleteFolderPermanently": { + "message": "Are you sure you want to permanently delete this folder?" + }, "baseDomain": { "message": "დომენის ბაზა", "description": "Domain name. Example: website.com" @@ -728,15 +740,6 @@ "itemName": { "message": "Item name" }, - "cannotRemoveViewOnlyCollections": { - "message": "You cannot remove collections with View only permissions: $COLLECTIONS$", - "placeholders": { - "collections": { - "content": "$1", - "example": "Work, Personal" - } - } - }, "ex": { "message": "მაგ.", "description": "Short abbreviation for 'example'." @@ -1182,6 +1185,9 @@ "logInInitiated": { "message": "ავტორიზაცია დაწყებულია" }, + "logInRequestSent": { + "message": "Request sent" + }, "submit": { "message": "გადაცემა" }, @@ -1371,12 +1377,39 @@ "notificationSentDevice": { "message": "შეტყობინება გამოიგზავნა თქვენი ტელეფონის მისამართით." }, + "notificationSentDevicePart1": { + "message": "Unlock Bitwarden on your device or on the " + }, + "areYouTryingToAccessYourAccount": { + "message": "Are you trying to access your account?" + }, + "accessAttemptBy": { + "message": "Access attempt by $EMAIL$", + "placeholders": { + "email": { + "content": "$1", + "example": "name@example.com" + } + } + }, + "confirmAccess": { + "message": "Confirm access" + }, + "denyAccess": { + "message": "Deny access" + }, + "notificationSentDeviceAnchor": { + "message": "web app" + }, + "notificationSentDevicePart2": { + "message": "Make sure the Fingerprint phrase matches the one below before approving." + }, + "notificationSentDeviceComplete": { + "message": "Unlock Bitwarden on your device. Make sure the Fingerprint phrase matches the one below before approving." + }, "aNotificationWasSentToYourDevice": { "message": "A notification was sent to your device" }, - "makeSureYourAccountIsUnlockedAndTheFingerprintEtc": { - "message": "Make sure your account is unlocked and the fingerprint phrase matches on the other device" - }, "versionNumber": { "message": "ვერსია $VERSION_NUMBER$", "placeholders": { @@ -1664,9 +1697,6 @@ "message": "Avoid ambiguous characters", "description": "Label for the avoid ambiguous characters checkbox." }, - "regeneratePassword": { - "message": "Regenerate password" - }, "length": { "message": "Length" }, @@ -2170,8 +2200,20 @@ "manage": { "message": "Manage" }, - "canManage": { - "message": "Can manage" + "manageCollection": { + "message": "Manage collection" + }, + "viewItems": { + "message": "View items" + }, + "viewItemsHidePass": { + "message": "View items, hidden passwords" + }, + "editItems": { + "message": "Edit items" + }, + "editItemsHidePass": { + "message": "Edit items, hidden passwords" }, "disable": { "message": "Turn off" @@ -2368,11 +2410,8 @@ "twoFactorU2fProblemReadingTryAgain": { "message": "There was a problem reading the security key. Try again." }, - "twoFactorWebAuthnWarning": { - "message": "Due to platform limitations, WebAuthn cannot be used on all Bitwarden applications. You should set up another two-step login provider so that you can access your account when WebAuthn cannot be used. Supported platforms:" - }, - "twoFactorWebAuthnSupportWeb": { - "message": "Web vault and browser extensions on a desktop/laptop with a WebAuthn supported browser (Chrome, Opera, Vivaldi, or Firefox with FIDO U2F turned on)." + "twoFactorWebAuthnWarning1": { + "message": "Due to platform limitations, WebAuthn cannot be used on all Bitwarden applications. You should set up another two-step login provider so that you can access your account when WebAuthn cannot be used." }, "twoFactorRecoveryYourCode": { "message": "Your Bitwarden two-step login recovery code" @@ -4710,9 +4749,6 @@ "passwordGeneratorPolicyDesc": { "message": "Set requirements for password generator." }, - "passwordGeneratorPolicyInEffect": { - "message": "One or more organization policies are affecting your generator settings." - }, "masterPasswordPolicyInEffect": { "message": "One or more organization policies require your master password to meet the following requirements:" }, @@ -6681,15 +6717,6 @@ "message": "Generator", "description": "Short for 'credential generator'." }, - "whatWouldYouLikeToGenerate": { - "message": "What would you like to generate?" - }, - "passwordType": { - "message": "Password type" - }, - "regenerateUsername": { - "message": "Regenerate username" - }, "generateUsername": { "message": "Generate username" }, @@ -6730,9 +6757,6 @@ } } }, - "usernameType": { - "message": "Username type" - }, "plusAddressedEmail": { "message": "Plus addressed email", "description": "Username generator option that appends a random sub-address to the username. For example: address+subaddress@email.com" @@ -6952,9 +6976,6 @@ "message": "Hostname", "description": "Part of a URL." }, - "apiAccessToken": { - "message": "API access token" - }, "deviceVerification": { "message": "Device verification" }, @@ -7666,18 +7687,6 @@ "noCollection": { "message": "No collection" }, - "canView": { - "message": "Can view" - }, - "canViewExceptPass": { - "message": "Can view, except passwords" - }, - "canEdit": { - "message": "Can edit" - }, - "canEditExceptPass": { - "message": "Can edit, except passwords" - }, "noCollectionsAdded": { "message": "No collections added" }, @@ -8677,9 +8686,6 @@ "message": "Self-host server URL", "description": "Label for field requesting a self-hosted integration service URL" }, - "aliasDomain": { - "message": "Alias domain" - }, "alreadyHaveAccount": { "message": "Already have an account?" }, @@ -8741,11 +8747,11 @@ "readOnlyCollectionAccess": { "message": "You do not have access to manage this collection." }, - "grantAddAccessCollectionWarningTitle": { - "message": "Missing Can Manage Permissions" + "grantManageCollectionWarningTitle": { + "message": "Missing Manage Collection Permissions" }, - "grantAddAccessCollectionWarning": { - "message": "Grant Can manage permissions to allow full collection management including deletion of collection." + "grantManageCollectionWarning": { + "message": "Grant Manage collection permissions to allow full collection management including deletion of collection." }, "grantCollectionAccess": { "message": "Grant groups or members access to this collection." @@ -10091,6 +10097,15 @@ "descriptorCode": { "message": "Descriptor code" }, + "cannotRemoveViewOnlyCollections": { + "message": "You cannot remove collections with View only permissions: $COLLECTIONS$", + "placeholders": { + "collections": { + "content": "$1", + "example": "Work, Personal" + } + } + }, "importantNotice": { "message": "Important notice" }, @@ -10281,5 +10296,54 @@ "example": "Acme c" } } + }, + "accountDeprovisioningNotification": { + "message": "Administrators now have the ability to delete member accounts that belong to a claimed domain." + }, + "deleteManagedUserWarningDesc": { + "message": "This action will delete the member account including all items in their vault. This replaces the previous Remove action." + }, + "deleteManagedUserWarning": { + "message": "Delete is a new action!" + }, + "seatsRemaining": { + "message": "You have $REMAINING$ seats remaining out of $TOTAL$ seats assigned to this organization. Contact your provider to manage your subscription.", + "placeholders": { + "remaining": { + "content": "$1", + "example": "5" + }, + "total": { + "content": "$2", + "example": "10" + } + } + }, + "existingOrganization": { + "message": "Existing organization" + }, + "selectOrganizationProviderPortal": { + "message": "Select an organization to add to your Provider Portal." + }, + "noOrganizations": { + "message": "There are no organizations to list" + }, + "yourProviderSubscriptionCredit": { + "message": "Your provider subscription will receive a credit for any remaining time in the organization's subscription." + }, + "doYouWantToAddThisOrg": { + "message": "Do you want to add this organization to $PROVIDER$?", + "placeholders": { + "provider": { + "content": "$1", + "example": "Cool MSP" + } + } + }, + "addedExistingOrganization": { + "message": "Added existing organization" + }, + "assignedExceedsAvailable": { + "message": "Assigned seats exceed available seats." } } diff --git a/apps/web/src/locales/km/messages.json b/apps/web/src/locales/km/messages.json index 3b8d147b95f..7e6f614b9c8 100644 --- a/apps/web/src/locales/km/messages.json +++ b/apps/web/src/locales/km/messages.json @@ -464,6 +464,18 @@ "editFolder": { "message": "Edit folder" }, + "newFolder": { + "message": "New folder" + }, + "folderName": { + "message": "Folder name" + }, + "folderHintText": { + "message": "Nest a folder by adding the parent folder's name followed by a “/”. Example: Social/Forums" + }, + "deleteFolderPermanently": { + "message": "Are you sure you want to permanently delete this folder?" + }, "baseDomain": { "message": "Base domain", "description": "Domain name. Example: website.com" @@ -728,15 +740,6 @@ "itemName": { "message": "Item name" }, - "cannotRemoveViewOnlyCollections": { - "message": "You cannot remove collections with View only permissions: $COLLECTIONS$", - "placeholders": { - "collections": { - "content": "$1", - "example": "Work, Personal" - } - } - }, "ex": { "message": "ex.", "description": "Short abbreviation for 'example'." @@ -1182,6 +1185,9 @@ "logInInitiated": { "message": "Log in initiated" }, + "logInRequestSent": { + "message": "Request sent" + }, "submit": { "message": "Submit" }, @@ -1371,12 +1377,39 @@ "notificationSentDevice": { "message": "A notification has been sent to your device." }, + "notificationSentDevicePart1": { + "message": "Unlock Bitwarden on your device or on the " + }, + "areYouTryingToAccessYourAccount": { + "message": "Are you trying to access your account?" + }, + "accessAttemptBy": { + "message": "Access attempt by $EMAIL$", + "placeholders": { + "email": { + "content": "$1", + "example": "name@example.com" + } + } + }, + "confirmAccess": { + "message": "Confirm access" + }, + "denyAccess": { + "message": "Deny access" + }, + "notificationSentDeviceAnchor": { + "message": "web app" + }, + "notificationSentDevicePart2": { + "message": "Make sure the Fingerprint phrase matches the one below before approving." + }, + "notificationSentDeviceComplete": { + "message": "Unlock Bitwarden on your device. Make sure the Fingerprint phrase matches the one below before approving." + }, "aNotificationWasSentToYourDevice": { "message": "A notification was sent to your device" }, - "makeSureYourAccountIsUnlockedAndTheFingerprintEtc": { - "message": "Make sure your account is unlocked and the fingerprint phrase matches on the other device" - }, "versionNumber": { "message": "Version $VERSION_NUMBER$", "placeholders": { @@ -1664,9 +1697,6 @@ "message": "Avoid ambiguous characters", "description": "Label for the avoid ambiguous characters checkbox." }, - "regeneratePassword": { - "message": "Regenerate password" - }, "length": { "message": "Length" }, @@ -2170,8 +2200,20 @@ "manage": { "message": "Manage" }, - "canManage": { - "message": "Can manage" + "manageCollection": { + "message": "Manage collection" + }, + "viewItems": { + "message": "View items" + }, + "viewItemsHidePass": { + "message": "View items, hidden passwords" + }, + "editItems": { + "message": "Edit items" + }, + "editItemsHidePass": { + "message": "Edit items, hidden passwords" }, "disable": { "message": "Turn off" @@ -2368,11 +2410,8 @@ "twoFactorU2fProblemReadingTryAgain": { "message": "There was a problem reading the security key. Try again." }, - "twoFactorWebAuthnWarning": { - "message": "Due to platform limitations, WebAuthn cannot be used on all Bitwarden applications. You should set up another two-step login provider so that you can access your account when WebAuthn cannot be used. Supported platforms:" - }, - "twoFactorWebAuthnSupportWeb": { - "message": "Web vault and browser extensions on a desktop/laptop with a WebAuthn supported browser (Chrome, Opera, Vivaldi, or Firefox with FIDO U2F turned on)." + "twoFactorWebAuthnWarning1": { + "message": "Due to platform limitations, WebAuthn cannot be used on all Bitwarden applications. You should set up another two-step login provider so that you can access your account when WebAuthn cannot be used." }, "twoFactorRecoveryYourCode": { "message": "Your Bitwarden two-step login recovery code" @@ -4710,9 +4749,6 @@ "passwordGeneratorPolicyDesc": { "message": "Set requirements for password generator." }, - "passwordGeneratorPolicyInEffect": { - "message": "One or more organization policies are affecting your generator settings." - }, "masterPasswordPolicyInEffect": { "message": "One or more organization policies require your master password to meet the following requirements:" }, @@ -6681,15 +6717,6 @@ "message": "Generator", "description": "Short for 'credential generator'." }, - "whatWouldYouLikeToGenerate": { - "message": "What would you like to generate?" - }, - "passwordType": { - "message": "Password type" - }, - "regenerateUsername": { - "message": "Regenerate username" - }, "generateUsername": { "message": "Generate username" }, @@ -6730,9 +6757,6 @@ } } }, - "usernameType": { - "message": "Username type" - }, "plusAddressedEmail": { "message": "Plus addressed email", "description": "Username generator option that appends a random sub-address to the username. For example: address+subaddress@email.com" @@ -6952,9 +6976,6 @@ "message": "Hostname", "description": "Part of a URL." }, - "apiAccessToken": { - "message": "API access token" - }, "deviceVerification": { "message": "Device verification" }, @@ -7666,18 +7687,6 @@ "noCollection": { "message": "No collection" }, - "canView": { - "message": "Can view" - }, - "canViewExceptPass": { - "message": "Can view, except passwords" - }, - "canEdit": { - "message": "Can edit" - }, - "canEditExceptPass": { - "message": "Can edit, except passwords" - }, "noCollectionsAdded": { "message": "No collections added" }, @@ -8677,9 +8686,6 @@ "message": "Self-host server URL", "description": "Label for field requesting a self-hosted integration service URL" }, - "aliasDomain": { - "message": "Alias domain" - }, "alreadyHaveAccount": { "message": "Already have an account?" }, @@ -8741,11 +8747,11 @@ "readOnlyCollectionAccess": { "message": "You do not have access to manage this collection." }, - "grantAddAccessCollectionWarningTitle": { - "message": "Missing Can Manage Permissions" + "grantManageCollectionWarningTitle": { + "message": "Missing Manage Collection Permissions" }, - "grantAddAccessCollectionWarning": { - "message": "Grant Can manage permissions to allow full collection management including deletion of collection." + "grantManageCollectionWarning": { + "message": "Grant Manage collection permissions to allow full collection management including deletion of collection." }, "grantCollectionAccess": { "message": "Grant groups or members access to this collection." @@ -10091,6 +10097,15 @@ "descriptorCode": { "message": "Descriptor code" }, + "cannotRemoveViewOnlyCollections": { + "message": "You cannot remove collections with View only permissions: $COLLECTIONS$", + "placeholders": { + "collections": { + "content": "$1", + "example": "Work, Personal" + } + } + }, "importantNotice": { "message": "Important notice" }, @@ -10281,5 +10296,54 @@ "example": "Acme c" } } + }, + "accountDeprovisioningNotification": { + "message": "Administrators now have the ability to delete member accounts that belong to a claimed domain." + }, + "deleteManagedUserWarningDesc": { + "message": "This action will delete the member account including all items in their vault. This replaces the previous Remove action." + }, + "deleteManagedUserWarning": { + "message": "Delete is a new action!" + }, + "seatsRemaining": { + "message": "You have $REMAINING$ seats remaining out of $TOTAL$ seats assigned to this organization. Contact your provider to manage your subscription.", + "placeholders": { + "remaining": { + "content": "$1", + "example": "5" + }, + "total": { + "content": "$2", + "example": "10" + } + } + }, + "existingOrganization": { + "message": "Existing organization" + }, + "selectOrganizationProviderPortal": { + "message": "Select an organization to add to your Provider Portal." + }, + "noOrganizations": { + "message": "There are no organizations to list" + }, + "yourProviderSubscriptionCredit": { + "message": "Your provider subscription will receive a credit for any remaining time in the organization's subscription." + }, + "doYouWantToAddThisOrg": { + "message": "Do you want to add this organization to $PROVIDER$?", + "placeholders": { + "provider": { + "content": "$1", + "example": "Cool MSP" + } + } + }, + "addedExistingOrganization": { + "message": "Added existing organization" + }, + "assignedExceedsAvailable": { + "message": "Assigned seats exceed available seats." } } diff --git a/apps/web/src/locales/kn/messages.json b/apps/web/src/locales/kn/messages.json index 18c40d79744..83d0f5f6b89 100644 --- a/apps/web/src/locales/kn/messages.json +++ b/apps/web/src/locales/kn/messages.json @@ -464,6 +464,18 @@ "editFolder": { "message": "ಫೋಲ್ಡರ್ ಸಂಪಾದಿಸಿ" }, + "newFolder": { + "message": "New folder" + }, + "folderName": { + "message": "Folder name" + }, + "folderHintText": { + "message": "Nest a folder by adding the parent folder's name followed by a “/”. Example: Social/Forums" + }, + "deleteFolderPermanently": { + "message": "Are you sure you want to permanently delete this folder?" + }, "baseDomain": { "message": "ಮೂಲ ಡೊಮೇನ್", "description": "Domain name. Example: website.com" @@ -728,15 +740,6 @@ "itemName": { "message": "Item name" }, - "cannotRemoveViewOnlyCollections": { - "message": "You cannot remove collections with View only permissions: $COLLECTIONS$", - "placeholders": { - "collections": { - "content": "$1", - "example": "Work, Personal" - } - } - }, "ex": { "message": "ಉದಾಹರಣೆ.", "description": "Short abbreviation for 'example'." @@ -1182,6 +1185,9 @@ "logInInitiated": { "message": "Log in initiated" }, + "logInRequestSent": { + "message": "Request sent" + }, "submit": { "message": "ಒಪ್ಪಿಸು" }, @@ -1371,12 +1377,39 @@ "notificationSentDevice": { "message": "A notification has been sent to your device." }, + "notificationSentDevicePart1": { + "message": "Unlock Bitwarden on your device or on the " + }, + "areYouTryingToAccessYourAccount": { + "message": "Are you trying to access your account?" + }, + "accessAttemptBy": { + "message": "Access attempt by $EMAIL$", + "placeholders": { + "email": { + "content": "$1", + "example": "name@example.com" + } + } + }, + "confirmAccess": { + "message": "Confirm access" + }, + "denyAccess": { + "message": "Deny access" + }, + "notificationSentDeviceAnchor": { + "message": "web app" + }, + "notificationSentDevicePart2": { + "message": "Make sure the Fingerprint phrase matches the one below before approving." + }, + "notificationSentDeviceComplete": { + "message": "Unlock Bitwarden on your device. Make sure the Fingerprint phrase matches the one below before approving." + }, "aNotificationWasSentToYourDevice": { "message": "A notification was sent to your device" }, - "makeSureYourAccountIsUnlockedAndTheFingerprintEtc": { - "message": "Make sure your account is unlocked and the fingerprint phrase matches on the other device" - }, "versionNumber": { "message": "ಆವೃತ್ತಿ $VERSION_NUMBER$", "placeholders": { @@ -1664,9 +1697,6 @@ "message": "Avoid ambiguous characters", "description": "Label for the avoid ambiguous characters checkbox." }, - "regeneratePassword": { - "message": "ಪಾಸ್ವರ್ಡ್ ಅನ್ನು ಪುನರುತ್ಪಾದಿಸಿ" - }, "length": { "message": "ಉದ್ದ" }, @@ -2170,8 +2200,20 @@ "manage": { "message": "ವ್ಯವಸ್ಥಾಪಕ" }, - "canManage": { - "message": "Can manage" + "manageCollection": { + "message": "Manage collection" + }, + "viewItems": { + "message": "View items" + }, + "viewItemsHidePass": { + "message": "View items, hidden passwords" + }, + "editItems": { + "message": "Edit items" + }, + "editItemsHidePass": { + "message": "Edit items, hidden passwords" }, "disable": { "message": "ನಿಷ್‌ಕ್ರಿಯೆಗೊಳಿಸಿ" @@ -2368,11 +2410,8 @@ "twoFactorU2fProblemReadingTryAgain": { "message": "ಭದ್ರತಾ ಕೀಲಿಯನ್ನು ಓದುವಲ್ಲಿ ಸಮಸ್ಯೆ ಇದೆ. ಮತ್ತೆ ಪ್ರಯತ್ನಿಸು." }, - "twoFactorWebAuthnWarning": { - "message": "ಪ್ಲಾಟ್‌ಫಾರ್ಮ್ ಮಿತಿಗಳ ಕಾರಣ, ಎಲ್ಲಾ ಬಿಟ್‌ವಾರ್ಡೆನ್ ಅಪ್ಲಿಕೇಶನ್‌ಗಳಲ್ಲಿ ವೆಬ್‌ಆಥ್ನ್ ಅನ್ನು ಬಳಸಲಾಗುವುದಿಲ್ಲ. ನೀವು ಇನ್ನೊಂದು ಎರಡು-ಹಂತದ ಲಾಗಿನ್ ಒದಗಿಸುವವರನ್ನು ಸಕ್ರಿಯಗೊಳಿಸಬೇಕು ಇದರಿಂದ ವೆಬ್‌ಆಥ್ನ್ ಅನ್ನು ಬಳಸಲಾಗದಿದ್ದಾಗ ನಿಮ್ಮ ಖಾತೆಯನ್ನು ಪ್ರವೇಶಿಸಬಹುದು. ಬೆಂಬಲಿತ ವೇದಿಕೆಗಳು:" - }, - "twoFactorWebAuthnSupportWeb": { - "message": "ವೆಬ್‌ಆಥ್ನ್ ಶಕ್ತಗೊಂಡ ಬ್ರೌಸರ್‌ನೊಂದಿಗೆ ಡೆಸ್ಕ್‌ಟಾಪ್ / ಲ್ಯಾಪ್‌ಟಾಪ್‌ನಲ್ಲಿ ವೆಬ್ ವಾಲ್ಟ್ ಮತ್ತು ಬ್ರೌಸರ್ ವಿಸ್ತರಣೆಗಳು (ಕ್ರೋಮ್, ಒಪೇರಾ, ವಿವಾಲ್ಡಿ, ಅಥವಾ ಎಫ್‌ಐಡಿಒ ಯು 2 ಎಫ್ ಸಕ್ರಿಯಗೊಳಿಸಿದ ಫೈರ್‌ಫಾಕ್ಸ್)." + "twoFactorWebAuthnWarning1": { + "message": "Due to platform limitations, WebAuthn cannot be used on all Bitwarden applications. You should set up another two-step login provider so that you can access your account when WebAuthn cannot be used." }, "twoFactorRecoveryYourCode": { "message": "ನಿಮ್ಮ ಬಿಟ್‌ವಾರ್ಡೆನ್ ಎರಡು-ಹಂತದ ಲಾಗಿನ್ ಮರುಪಡೆಯುವಿಕೆ ಕೋಡ್" @@ -4710,9 +4749,6 @@ "passwordGeneratorPolicyDesc": { "message": "ಪಾಸ್ವರ್ಡ್ ಜನರೇಟರ್ ಕಾನ್ಫಿಗರೇಶನ್ಗಾಗಿ ಕನಿಷ್ಠ ಅವಶ್ಯಕತೆಗಳನ್ನು ಹೊಂದಿಸಿ." }, - "passwordGeneratorPolicyInEffect": { - "message": "ಒಂದು ಅಥವಾ ಹೆಚ್ಚಿನ ಸಂಸ್ಥೆ ನೀತಿಗಳು ನಿಮ್ಮ ಜನರೇಟರ್ ಸೆಟ್ಟಿಂಗ್‌ಗಳ ಮೇಲೆ ಪರಿಣಾಮ ಬೀರುತ್ತವೆ." - }, "masterPasswordPolicyInEffect": { "message": "ಒಂದು ಅಥವಾ ಹೆಚ್ಚಿನ ಸಂಸ್ಥೆ ನೀತಿಗಳಿಗೆ ಈ ಕೆಳಗಿನ ಅವಶ್ಯಕತೆಗಳನ್ನು ಪೂರೈಸಲು ನಿಮ್ಮ ಮಾಸ್ಟರ್ ಪಾಸ್‌ವರ್ಡ್ ಅಗತ್ಯವಿದೆ:" }, @@ -6681,15 +6717,6 @@ "message": "Generator", "description": "Short for 'credential generator'." }, - "whatWouldYouLikeToGenerate": { - "message": "What would you like to generate?" - }, - "passwordType": { - "message": "Password type" - }, - "regenerateUsername": { - "message": "Regenerate username" - }, "generateUsername": { "message": "Generate username" }, @@ -6730,9 +6757,6 @@ } } }, - "usernameType": { - "message": "Username type" - }, "plusAddressedEmail": { "message": "Plus addressed email", "description": "Username generator option that appends a random sub-address to the username. For example: address+subaddress@email.com" @@ -6952,9 +6976,6 @@ "message": "Hostname", "description": "Part of a URL." }, - "apiAccessToken": { - "message": "API access token" - }, "deviceVerification": { "message": "Device verification" }, @@ -7666,18 +7687,6 @@ "noCollection": { "message": "No collection" }, - "canView": { - "message": "Can view" - }, - "canViewExceptPass": { - "message": "Can view, except passwords" - }, - "canEdit": { - "message": "Can edit" - }, - "canEditExceptPass": { - "message": "Can edit, except passwords" - }, "noCollectionsAdded": { "message": "No collections added" }, @@ -8677,9 +8686,6 @@ "message": "Self-host server URL", "description": "Label for field requesting a self-hosted integration service URL" }, - "aliasDomain": { - "message": "Alias domain" - }, "alreadyHaveAccount": { "message": "Already have an account?" }, @@ -8741,11 +8747,11 @@ "readOnlyCollectionAccess": { "message": "You do not have access to manage this collection." }, - "grantAddAccessCollectionWarningTitle": { - "message": "Missing Can Manage Permissions" + "grantManageCollectionWarningTitle": { + "message": "Missing Manage Collection Permissions" }, - "grantAddAccessCollectionWarning": { - "message": "Grant Can manage permissions to allow full collection management including deletion of collection." + "grantManageCollectionWarning": { + "message": "Grant Manage collection permissions to allow full collection management including deletion of collection." }, "grantCollectionAccess": { "message": "Grant groups or members access to this collection." @@ -10091,6 +10097,15 @@ "descriptorCode": { "message": "Descriptor code" }, + "cannotRemoveViewOnlyCollections": { + "message": "You cannot remove collections with View only permissions: $COLLECTIONS$", + "placeholders": { + "collections": { + "content": "$1", + "example": "Work, Personal" + } + } + }, "importantNotice": { "message": "Important notice" }, @@ -10281,5 +10296,54 @@ "example": "Acme c" } } + }, + "accountDeprovisioningNotification": { + "message": "Administrators now have the ability to delete member accounts that belong to a claimed domain." + }, + "deleteManagedUserWarningDesc": { + "message": "This action will delete the member account including all items in their vault. This replaces the previous Remove action." + }, + "deleteManagedUserWarning": { + "message": "Delete is a new action!" + }, + "seatsRemaining": { + "message": "You have $REMAINING$ seats remaining out of $TOTAL$ seats assigned to this organization. Contact your provider to manage your subscription.", + "placeholders": { + "remaining": { + "content": "$1", + "example": "5" + }, + "total": { + "content": "$2", + "example": "10" + } + } + }, + "existingOrganization": { + "message": "Existing organization" + }, + "selectOrganizationProviderPortal": { + "message": "Select an organization to add to your Provider Portal." + }, + "noOrganizations": { + "message": "There are no organizations to list" + }, + "yourProviderSubscriptionCredit": { + "message": "Your provider subscription will receive a credit for any remaining time in the organization's subscription." + }, + "doYouWantToAddThisOrg": { + "message": "Do you want to add this organization to $PROVIDER$?", + "placeholders": { + "provider": { + "content": "$1", + "example": "Cool MSP" + } + } + }, + "addedExistingOrganization": { + "message": "Added existing organization" + }, + "assignedExceedsAvailable": { + "message": "Assigned seats exceed available seats." } } diff --git a/apps/web/src/locales/ko/messages.json b/apps/web/src/locales/ko/messages.json index c7f80ff1cd1..7ff621bf3c1 100644 --- a/apps/web/src/locales/ko/messages.json +++ b/apps/web/src/locales/ko/messages.json @@ -464,6 +464,18 @@ "editFolder": { "message": "폴더 편집" }, + "newFolder": { + "message": "New folder" + }, + "folderName": { + "message": "Folder name" + }, + "folderHintText": { + "message": "Nest a folder by adding the parent folder's name followed by a “/”. Example: Social/Forums" + }, + "deleteFolderPermanently": { + "message": "Are you sure you want to permanently delete this folder?" + }, "baseDomain": { "message": "기본 도메인", "description": "Domain name. Example: website.com" @@ -728,15 +740,6 @@ "itemName": { "message": "Item name" }, - "cannotRemoveViewOnlyCollections": { - "message": "You cannot remove collections with View only permissions: $COLLECTIONS$", - "placeholders": { - "collections": { - "content": "$1", - "example": "Work, Personal" - } - } - }, "ex": { "message": "예)", "description": "Short abbreviation for 'example'." @@ -1182,6 +1185,9 @@ "logInInitiated": { "message": "Log in initiated" }, + "logInRequestSent": { + "message": "Request sent" + }, "submit": { "message": "보내기" }, @@ -1371,12 +1377,39 @@ "notificationSentDevice": { "message": "기기에 알림이 전송되었습니다." }, + "notificationSentDevicePart1": { + "message": "Unlock Bitwarden on your device or on the " + }, + "areYouTryingToAccessYourAccount": { + "message": "Are you trying to access your account?" + }, + "accessAttemptBy": { + "message": "Access attempt by $EMAIL$", + "placeholders": { + "email": { + "content": "$1", + "example": "name@example.com" + } + } + }, + "confirmAccess": { + "message": "Confirm access" + }, + "denyAccess": { + "message": "Deny access" + }, + "notificationSentDeviceAnchor": { + "message": "web app" + }, + "notificationSentDevicePart2": { + "message": "Make sure the Fingerprint phrase matches the one below before approving." + }, + "notificationSentDeviceComplete": { + "message": "Unlock Bitwarden on your device. Make sure the Fingerprint phrase matches the one below before approving." + }, "aNotificationWasSentToYourDevice": { "message": "A notification was sent to your device" }, - "makeSureYourAccountIsUnlockedAndTheFingerprintEtc": { - "message": "Make sure your account is unlocked and the fingerprint phrase matches on the other device" - }, "versionNumber": { "message": "버전 $VERSION_NUMBER$", "placeholders": { @@ -1664,9 +1697,6 @@ "message": "Avoid ambiguous characters", "description": "Label for the avoid ambiguous characters checkbox." }, - "regeneratePassword": { - "message": "비밀번호 재생성" - }, "length": { "message": "길이" }, @@ -2170,8 +2200,20 @@ "manage": { "message": "관리" }, - "canManage": { - "message": "Can manage" + "manageCollection": { + "message": "Manage collection" + }, + "viewItems": { + "message": "View items" + }, + "viewItemsHidePass": { + "message": "View items, hidden passwords" + }, + "editItems": { + "message": "Edit items" + }, + "editItemsHidePass": { + "message": "Edit items, hidden passwords" }, "disable": { "message": "비활성화" @@ -2368,11 +2410,8 @@ "twoFactorU2fProblemReadingTryAgain": { "message": "보안 키를 읽어오는데 문제가 발생했습니다. 다시 시도해보십시오." }, - "twoFactorWebAuthnWarning": { - "message": "플랫폼 제한으로 인해, 모든 Bitwarden 애플리케이션에서 WebAuthn을 사용할 수 없습니다. WebAuthn을 사용할 수 없을 때 계정에 접근할 수 있도록 다른 2단계 로그인 방법을 활성화하십시오. 지원하는 플랫폼:" - }, - "twoFactorWebAuthnSupportWeb": { - "message": "WebAuthn 지원 브라우저가 있는 데스크탑/랩탑의 웹 보관함 및 브라우저 확장 (WebAuthn이 활성화된 Chrome, Opera, Vivaldi 또는 Firefox 사용)" + "twoFactorWebAuthnWarning1": { + "message": "Due to platform limitations, WebAuthn cannot be used on all Bitwarden applications. You should set up another two-step login provider so that you can access your account when WebAuthn cannot be used." }, "twoFactorRecoveryYourCode": { "message": "Bitwarden 2단계 로그인 복구 코드" @@ -4710,9 +4749,6 @@ "passwordGeneratorPolicyDesc": { "message": "비밀번호 생성기 설정에 최소 요구 사항을 설정해주세요." }, - "passwordGeneratorPolicyInEffect": { - "message": "하나 이상의 단체 정책이 생성기 설정에 영항을 미치고 있습니다." - }, "masterPasswordPolicyInEffect": { "message": "하나 이상의 단체 정책이 마스터 비밀번호가 다음 사항을 따르도록 요구합니다:" }, @@ -6681,15 +6717,6 @@ "message": "Generator", "description": "Short for 'credential generator'." }, - "whatWouldYouLikeToGenerate": { - "message": "What would you like to generate?" - }, - "passwordType": { - "message": "Password type" - }, - "regenerateUsername": { - "message": "Regenerate username" - }, "generateUsername": { "message": "Generate username" }, @@ -6730,9 +6757,6 @@ } } }, - "usernameType": { - "message": "Username type" - }, "plusAddressedEmail": { "message": "Plus addressed email", "description": "Username generator option that appends a random sub-address to the username. For example: address+subaddress@email.com" @@ -6952,9 +6976,6 @@ "message": "Hostname", "description": "Part of a URL." }, - "apiAccessToken": { - "message": "API access token" - }, "deviceVerification": { "message": "Device verification" }, @@ -7666,18 +7687,6 @@ "noCollection": { "message": "No collection" }, - "canView": { - "message": "Can view" - }, - "canViewExceptPass": { - "message": "Can view, except passwords" - }, - "canEdit": { - "message": "Can edit" - }, - "canEditExceptPass": { - "message": "Can edit, except passwords" - }, "noCollectionsAdded": { "message": "No collections added" }, @@ -8677,9 +8686,6 @@ "message": "Self-host server URL", "description": "Label for field requesting a self-hosted integration service URL" }, - "aliasDomain": { - "message": "Alias domain" - }, "alreadyHaveAccount": { "message": "Already have an account?" }, @@ -8741,11 +8747,11 @@ "readOnlyCollectionAccess": { "message": "You do not have access to manage this collection." }, - "grantAddAccessCollectionWarningTitle": { - "message": "Missing Can Manage Permissions" + "grantManageCollectionWarningTitle": { + "message": "Missing Manage Collection Permissions" }, - "grantAddAccessCollectionWarning": { - "message": "Grant Can manage permissions to allow full collection management including deletion of collection." + "grantManageCollectionWarning": { + "message": "Grant Manage collection permissions to allow full collection management including deletion of collection." }, "grantCollectionAccess": { "message": "Grant groups or members access to this collection." @@ -10091,6 +10097,15 @@ "descriptorCode": { "message": "Descriptor code" }, + "cannotRemoveViewOnlyCollections": { + "message": "You cannot remove collections with View only permissions: $COLLECTIONS$", + "placeholders": { + "collections": { + "content": "$1", + "example": "Work, Personal" + } + } + }, "importantNotice": { "message": "Important notice" }, @@ -10281,5 +10296,54 @@ "example": "Acme c" } } + }, + "accountDeprovisioningNotification": { + "message": "Administrators now have the ability to delete member accounts that belong to a claimed domain." + }, + "deleteManagedUserWarningDesc": { + "message": "This action will delete the member account including all items in their vault. This replaces the previous Remove action." + }, + "deleteManagedUserWarning": { + "message": "Delete is a new action!" + }, + "seatsRemaining": { + "message": "You have $REMAINING$ seats remaining out of $TOTAL$ seats assigned to this organization. Contact your provider to manage your subscription.", + "placeholders": { + "remaining": { + "content": "$1", + "example": "5" + }, + "total": { + "content": "$2", + "example": "10" + } + } + }, + "existingOrganization": { + "message": "Existing organization" + }, + "selectOrganizationProviderPortal": { + "message": "Select an organization to add to your Provider Portal." + }, + "noOrganizations": { + "message": "There are no organizations to list" + }, + "yourProviderSubscriptionCredit": { + "message": "Your provider subscription will receive a credit for any remaining time in the organization's subscription." + }, + "doYouWantToAddThisOrg": { + "message": "Do you want to add this organization to $PROVIDER$?", + "placeholders": { + "provider": { + "content": "$1", + "example": "Cool MSP" + } + } + }, + "addedExistingOrganization": { + "message": "Added existing organization" + }, + "assignedExceedsAvailable": { + "message": "Assigned seats exceed available seats." } } diff --git a/apps/web/src/locales/lv/messages.json b/apps/web/src/locales/lv/messages.json index c29227d3db1..9f7ba055ed4 100644 --- a/apps/web/src/locales/lv/messages.json +++ b/apps/web/src/locales/lv/messages.json @@ -464,6 +464,18 @@ "editFolder": { "message": "Labot mapi" }, + "newFolder": { + "message": "Jauna mape" + }, + "folderName": { + "message": "Mapes nosaukums" + }, + "folderHintText": { + "message": "Apakšmapes var izveidot, ja pievieno iekļaujošās mapes nosaukumu, aiz kura ir \"/\". Piemēram: Tīklošanās/Forumi" + }, + "deleteFolderPermanently": { + "message": "Vai tiešām neatgriezeniski izdzēst šo mapi?" + }, "baseDomain": { "message": "Pamata domēns", "description": "Domain name. Example: website.com" @@ -728,15 +740,6 @@ "itemName": { "message": "Vienuma nosaukums" }, - "cannotRemoveViewOnlyCollections": { - "message": "Nevar noņemt krājumus ar tiesībām \"Tikai skatīt\": $COLLECTIONS$", - "placeholders": { - "collections": { - "content": "$1", - "example": "Work, Personal" - } - } - }, "ex": { "message": "piem.,", "description": "Short abbreviation for 'example'." @@ -1182,6 +1185,9 @@ "logInInitiated": { "message": "Uzsākta pieteikšanās" }, + "logInRequestSent": { + "message": "Pieprasījums nosūtīts" + }, "submit": { "message": "Iesniegt" }, @@ -1371,12 +1377,39 @@ "notificationSentDevice": { "message": "Uz ierīci ir nosūtīts paziņojums." }, + "notificationSentDevicePart1": { + "message": "Bitwarden jāatslēdz savā ierīcē vai " + }, + "areYouTryingToAccessYourAccount": { + "message": "Vai mēģini piekļūt savam kontam?" + }, + "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" + }, + "notificationSentDeviceAnchor": { + "message": "tīmekļa lietotnē" + }, + "notificationSentDevicePart2": { + "message": "Pirms apstiprināšanas jāpārliecinās, ka pirkstu nospieduma vārdkopa atbilst zemāk esošajai." + }, + "notificationSentDeviceComplete": { + "message": "Savā ierīcē jāatslēdz Bitwarden. Pirms apstiprināšanas jāpārliecinās, ka pirkstu nospieduma vārdkopa atbilst zemāk esošajai." + }, "aNotificationWasSentToYourDevice": { "message": "Uz ierīci tika nosūtīts paziņojums" }, - "makeSureYourAccountIsUnlockedAndTheFingerprintEtc": { - "message": "Lūgums pārliecināties, ka konts ir atslēgts un atpazīšanas vārdkopa ir tāda pati arī otrā ierīcē" - }, "versionNumber": { "message": "Laidiens $VERSION_NUMBER$", "placeholders": { @@ -1664,9 +1697,6 @@ "message": "Izvairīties no viegli sajaucamām rakstzīmēm", "description": "Label for the avoid ambiguous characters checkbox." }, - "regeneratePassword": { - "message": "Pārizveidot paroli" - }, "length": { "message": "Garums" }, @@ -1849,25 +1879,25 @@ "message": "Tiks veikta atteikšanās no pašreizējās sesijas, un pēc tam būs nepieciešams atkārtoti pieteikties. Būs nepieciešama arī divpakāpju pieteikšanās, ja tā ir iespējota. Citās ierīcēs darbojošās sesijas var būt spēkā līdz vienai stundai." }, "newDeviceLoginProtection": { - "message": "New device login" + "message": "Pieteikšanās jaunā ierīcē" }, "turnOffNewDeviceLoginProtection": { - "message": "Turn off new device login protection" + "message": "Izslēgt pieteikšanās jaunā ierīcē aizsardzību" }, "turnOnNewDeviceLoginProtection": { - "message": "Turn on new device login protection" + "message": "Ieslēgt pieteikšanās jaunā ierīcē aizsardzību" }, "turnOffNewDeviceLoginProtectionModalDesc": { - "message": "Proceed below to turn off the verification emails bitwarden sends when you login from a new device." + "message": "Turpināt zemāk, lai izslēgtu apliecināšanas e-pasta ziņojumus, ko Bitwarden sūta, kad notiek pieteikšanās jaunā ierīcē." }, "turnOnNewDeviceLoginProtectionModalDesc": { - "message": "Proceed below to have bitwarden send you verification emails when you login from a new device." + "message": "Turpināt zemāk, lai Bitwarden sūtītu apliecināšanas e-pasta ziņojumus, kad notiek pieteikšanās jaunā ierīcē." }, "turnOffNewDeviceLoginProtectionWarning": { - "message": "With new device login protection turned off, anyone with your master password can access your account from any device. To protect your account without verification emails, set up two-step login." + "message": "Ar izslēgtu pieteikšanās jaunā ierīcē aizsardzību ikviens ar Tavu galveno paroli var piekļūt kontam no jebkuras ierīces. Lai aizsargātu savu kontu bez apliecināšanas e-pasta ziņojumiem, jāiestata divpakāpju pieteikšanās." }, "accountNewDeviceLoginProtectionSaved": { - "message": "New device login protection changes saved" + "message": "Pieteikšanās jaunā ierīcē aizsardzības izmaiņas saglabātas" }, "sessionsDeauthorized": { "message": "Visu sesiju darbība ir atsaukta" @@ -2170,8 +2200,20 @@ "manage": { "message": "Pārvaldīt" }, - "canManage": { - "message": "Var pārvaldīt" + "manageCollection": { + "message": "Pārvaldīt krājumu" + }, + "viewItems": { + "message": "Apskatīt vienumus" + }, + "viewItemsHidePass": { + "message": "Apskatīt vienumus, paslēptās paroles" + }, + "editItems": { + "message": "Labot vienumus" + }, + "editItemsHidePass": { + "message": "Labot vienumus, paslēptās paroles" }, "disable": { "message": "Atspējot" @@ -2368,11 +2410,8 @@ "twoFactorU2fProblemReadingTryAgain": { "message": "Radās sarežģījumi, nolasot drošības atslēgu. Jāmēģina vēlreiz." }, - "twoFactorWebAuthnWarning": { - "message": "Platformas ierobežojumu dēļ WebAuth nevar izmantot visās Bitwarden lietotnēs. Ir ieteicams iespējot vēl kādu divpakāpju pieteikšanās nodrošinātāju, lai varētu piekļūt kontam, kad nav iespējams izmantot WebAuth. Atbalstītās platformas:" - }, - "twoFactorWebAuthnSupportWeb": { - "message": "Tīmekļa glabātava un pārlūku paplašinājums galddatorā/klēpjdatorā ar WebAuthn iespējotu pārlūku (Chrome, Opera, Vivaldi vai Firefox ar iespējotu FIDO U2F)." + "twoFactorWebAuthnWarning1": { + "message": "Platformas ierobežojumu dēļ WebAuth nevar izmantot visās Bitwarden lietotnēs. Ir ieteicams iespējot vēl kādu divpakāpju pieteikšanās nodrošinātāju, lai varētu piekļūt kontam, kad nav iespējams izmantot WebAuth." }, "twoFactorRecoveryYourCode": { "message": "Bitwarden divpakāpju pieteikšanās atkopšanas kods" @@ -4710,9 +4749,6 @@ "passwordGeneratorPolicyDesc": { "message": "Uzstādīt paroļu veidotāja uzstādījumu mazākās izpildāmās prasības." }, - "passwordGeneratorPolicyInEffect": { - "message": "Viens vai vairāki apvienības nosacījumi ietekmē veidotāja iestatījumus." - }, "masterPasswordPolicyInEffect": { "message": "Vienā vai vairākos apvienības nosacījumos ir norādīts, ka galvenajai parolei ir jāatbilst šādām prasībām:" }, @@ -6681,15 +6717,6 @@ "message": "Veidotājs", "description": "Short for 'credential generator'." }, - "whatWouldYouLikeToGenerate": { - "message": "Ko ir vēlme izveidot?" - }, - "passwordType": { - "message": "Paroles veids" - }, - "regenerateUsername": { - "message": "Pārizveidot lietotājvārdu" - }, "generateUsername": { "message": "Izveidot lietotājvārdu" }, @@ -6730,9 +6757,6 @@ } } }, - "usernameType": { - "message": "Lietotājvārda veids" - }, "plusAddressedEmail": { "message": "E-pasta adrese ar plusu", "description": "Username generator option that appends a random sub-address to the username. For example: address+subaddress@email.com" @@ -6747,7 +6771,7 @@ "message": "Izmantot uzstādīto domēna visu tverošo iesūtni." }, "useThisEmail": { - "message": "Use this email" + "message": "Izmantot šo e-pasta adresi" }, "random": { "message": "Nejauši", @@ -6952,9 +6976,6 @@ "message": "Resursdatora nosaukums", "description": "Part of a URL." }, - "apiAccessToken": { - "message": "API piekļuves pilnvara" - }, "deviceVerification": { "message": "Ierīces apstiprināšana" }, @@ -7666,18 +7687,6 @@ "noCollection": { "message": "Nav krājuma" }, - "canView": { - "message": "Var skatīt" - }, - "canViewExceptPass": { - "message": "Var skatīt, izņemot paroles" - }, - "canEdit": { - "message": "Var labot" - }, - "canEditExceptPass": { - "message": "Var labot, izņemot paroles" - }, "noCollectionsAdded": { "message": "Nav pievienotu krājumu" }, @@ -8626,7 +8635,7 @@ "message": "Ļaut krājumu izdzēšanu tikai īpašniekiem un pārvaldītājiem" }, "limitItemDeletionDesc": { - "message": "Limit item deletion to members with the Can manage permission" + "message": "Ierobežot lietotājiem vienumu izdzēšanu ar atļauju \"Var pārvaldīt\"" }, "allowAdminAccessToAllCollectionItemsDesc": { "message": "Īpašnieki un pārvaldnieki var pārvaldīt visus krājumus un vienumus" @@ -8677,9 +8686,6 @@ "message": "Pašmitināta servera URL", "description": "Label for field requesting a self-hosted integration service URL" }, - "aliasDomain": { - "message": "Aizstājdomēns" - }, "alreadyHaveAccount": { "message": "Jau ir konts?" }, @@ -8741,11 +8747,11 @@ "readOnlyCollectionAccess": { "message": "Nav piekļuves pārvaldīt šo krājumu." }, - "grantAddAccessCollectionWarningTitle": { - "message": "Trūkst atļaujas \"Var pārvaldīt\"" + "grantManageCollectionWarningTitle": { + "message": "Trūkst krājumu pārvaldīšanas atļaujas" }, - "grantAddAccessCollectionWarning": { - "message": "Jānodrošina atļauja \"Var pārvaldīt\", lai ļautu pilnu krājuma pārvaldību, tajā skaitā krājuma izdzēšanu." + "grantManageCollectionWarning": { + "message": "Jānodrošina atļauja \"Pārvaldīt kŗajumu\", lai ļautu pilnu krājuma pārvaldību, tajā skaitā krājuma izdzēšanu." }, "grantCollectionAccess": { "message": "Piešķirt kopām vai dalībniekiem piekļuvi šim krājumam." @@ -10091,6 +10097,15 @@ "descriptorCode": { "message": "Apraksta kods" }, + "cannotRemoveViewOnlyCollections": { + "message": "Nevar noņemt krājumus ar tiesībām \"Tikai skatīt\": $COLLECTIONS$", + "placeholders": { + "collections": { + "content": "$1", + "example": "Work, Personal" + } + } + }, "importantNotice": { "message": "Svarīgs paziņojums" }, @@ -10197,7 +10212,7 @@ } }, "updatedRevokeSponsorshipConfirmationForSentSponsorship": { - "message": "If you remove $EMAIL$, the sponsorship for this Family plan cannot be redeemed. Are you sure you want to continue?", + "message": "Ja tiks noņemta $EMAIL$, atbalstītājdarbība šim Ģimenes plānam nevarēs izmantot. Vai tiešām turpināt?", "placeholders": { "email": { "content": "$1", @@ -10206,7 +10221,7 @@ } }, "updatedRevokeSponsorshipConfirmationForAcceptedSponsorship": { - "message": "If you remove $EMAIL$, the sponsorship for this Family plan will end and the saved payment method will be charged $40 + applicable tax on $DATE$. You will not be able to redeem a new sponsorship until $DATE$. Are you sure you want to continue?", + "message": "Ja tiks noņemta $EMAIL$, šī Ģimenes plāna atbalstītājdarbība beigsies, un $DATE$ ar saglabāto maksājumu veidu tiks veikta $40 apmaksa + piemērojamais nodoklis. Nebūs iespējams izmantot jaunu atbalstītājdarbību līdz $DATE$. Vai tiešām turpināt?", "placeholders": { "email": { "content": "$1", @@ -10281,5 +10296,54 @@ "example": "Acme c" } } + }, + "accountDeprovisioningNotification": { + "message": "Pārvaldītājiem tagad ir iespēja izdzēst dalībnieku kontus, kas pieder pieteiktam domēnam." + }, + "deleteManagedUserWarningDesc": { + "message": "Šī darbība izdzēsīs dalībnieka kontu, tajā skaitā visus glabātavas vienumus. Tā aizstāj iepriekšējo darbību \"Noņemt\"." + }, + "deleteManagedUserWarning": { + "message": "\"Izdzēst\" ir jaunā darbība." + }, + "seatsRemaining": { + "message": "Ir atlikušas $REMAINING$ no apvienībai piesaistītajām $TOTAL$ vietām. Jāsazinās ar nodrošinātāju, lai pārvaldītu savu abonementu.", + "placeholders": { + "remaining": { + "content": "$1", + "example": "5" + }, + "total": { + "content": "$2", + "example": "10" + } + } + }, + "existingOrganization": { + "message": "Esoša apvienība" + }, + "selectOrganizationProviderPortal": { + "message": "Jāatlasa apvienība, kuru pievienot savam nodrošinātāju portālam." + }, + "noOrganizations": { + "message": "Nav apvienību, ko uzskaitīt" + }, + "yourProviderSubscriptionCredit": { + "message": "Nodrošinātāja abonements saņemts kredītu par jebkuru atlikušo laiku apvienības abonementā." + }, + "doYouWantToAddThisOrg": { + "message": "Vai šo apvienību pievienot $PROVIDER$?", + "placeholders": { + "provider": { + "content": "$1", + "example": "Cool MSP" + } + } + }, + "addedExistingOrganization": { + "message": "Pievienota esoša apvienība" + }, + "assignedExceedsAvailable": { + "message": "Piešķirtās vietas pārsniedz pieejamās vietas." } } diff --git a/apps/web/src/locales/ml/messages.json b/apps/web/src/locales/ml/messages.json index 34ef4b72023..617f3b2d8ac 100644 --- a/apps/web/src/locales/ml/messages.json +++ b/apps/web/src/locales/ml/messages.json @@ -464,6 +464,18 @@ "editFolder": { "message": "ഫോൾഡർ തിരുത്തുക" }, + "newFolder": { + "message": "New folder" + }, + "folderName": { + "message": "Folder name" + }, + "folderHintText": { + "message": "Nest a folder by adding the parent folder's name followed by a “/”. Example: Social/Forums" + }, + "deleteFolderPermanently": { + "message": "Are you sure you want to permanently delete this folder?" + }, "baseDomain": { "message": "അടിസ്ഥാന ഡൊമെയ്ൻ", "description": "Domain name. Example: website.com" @@ -728,15 +740,6 @@ "itemName": { "message": "Item name" }, - "cannotRemoveViewOnlyCollections": { - "message": "You cannot remove collections with View only permissions: $COLLECTIONS$", - "placeholders": { - "collections": { - "content": "$1", - "example": "Work, Personal" - } - } - }, "ex": { "message": "ഉദാഹരണം.", "description": "Short abbreviation for 'example'." @@ -1182,6 +1185,9 @@ "logInInitiated": { "message": "Log in initiated" }, + "logInRequestSent": { + "message": "Request sent" + }, "submit": { "message": "സമർപ്പിക്കുക" }, @@ -1371,12 +1377,39 @@ "notificationSentDevice": { "message": "A notification has been sent to your device." }, + "notificationSentDevicePart1": { + "message": "Unlock Bitwarden on your device or on the " + }, + "areYouTryingToAccessYourAccount": { + "message": "Are you trying to access your account?" + }, + "accessAttemptBy": { + "message": "Access attempt by $EMAIL$", + "placeholders": { + "email": { + "content": "$1", + "example": "name@example.com" + } + } + }, + "confirmAccess": { + "message": "Confirm access" + }, + "denyAccess": { + "message": "Deny access" + }, + "notificationSentDeviceAnchor": { + "message": "web app" + }, + "notificationSentDevicePart2": { + "message": "Make sure the Fingerprint phrase matches the one below before approving." + }, + "notificationSentDeviceComplete": { + "message": "Unlock Bitwarden on your device. Make sure the Fingerprint phrase matches the one below before approving." + }, "aNotificationWasSentToYourDevice": { "message": "A notification was sent to your device" }, - "makeSureYourAccountIsUnlockedAndTheFingerprintEtc": { - "message": "Make sure your account is unlocked and the fingerprint phrase matches on the other device" - }, "versionNumber": { "message": "വേർഷൻ $VERSION_NUMBER$", "placeholders": { @@ -1664,9 +1697,6 @@ "message": "Avoid ambiguous characters", "description": "Label for the avoid ambiguous characters checkbox." }, - "regeneratePassword": { - "message": "പാസ്സ്‌വേഡ് വീണ്ടും സൃഷ്ടിക്കുക" - }, "length": { "message": "ദൈര്‍ഘ്യം" }, @@ -2170,8 +2200,20 @@ "manage": { "message": "നിയന്ത്രിക്കുക" }, - "canManage": { - "message": "Can manage" + "manageCollection": { + "message": "Manage collection" + }, + "viewItems": { + "message": "View items" + }, + "viewItemsHidePass": { + "message": "View items, hidden passwords" + }, + "editItems": { + "message": "Edit items" + }, + "editItemsHidePass": { + "message": "Edit items, hidden passwords" }, "disable": { "message": "പ്രവര്‍ത്തന രഹിതമാക്കുക" @@ -2368,11 +2410,8 @@ "twoFactorU2fProblemReadingTryAgain": { "message": "There was a problem reading the security key. Try again." }, - "twoFactorWebAuthnWarning": { - "message": "Due to platform limitations, WebAuthn cannot be used on all Bitwarden applications. You should set up another two-step login provider so that you can access your account when WebAuthn cannot be used. Supported platforms:" - }, - "twoFactorWebAuthnSupportWeb": { - "message": "Web vault and browser extensions on a desktop/laptop with a WebAuthn supported browser (Chrome, Opera, Vivaldi, or Firefox with FIDO U2F turned on)." + "twoFactorWebAuthnWarning1": { + "message": "Due to platform limitations, WebAuthn cannot be used on all Bitwarden applications. You should set up another two-step login provider so that you can access your account when WebAuthn cannot be used." }, "twoFactorRecoveryYourCode": { "message": "Your Bitwarden two-step login recovery code" @@ -4710,9 +4749,6 @@ "passwordGeneratorPolicyDesc": { "message": "പാസ്‌വേഡ് ജനറേറ്റർ കോൺഫിഗറേഷനായി മിനിമം ആവശ്യകതകൾ സജ്ജമാക്കുക." }, - "passwordGeneratorPolicyInEffect": { - "message": "ഒന്നോ അതിലധികമോ സംഘടന നയങ്ങൾ നിങ്ങളുടെ പാസ്സ്‌വേഡ് സൃഷ്ടാവിൻ്റെ ക്രമീകരണങ്ങളെ ബാധിക്കുന്നു." - }, "masterPasswordPolicyInEffect": { "message": "ഒന്നോ അതിലധികമോ ഓർഗനൈസേഷൻ നയങ്ങൾക്ക് ഇനിപ്പറയുന്ന ആവശ്യകതകൾ നിറവേറ്റുന്നതിന് നിങ്ങളുടെ മാസ്റ്റർ പാസ്‌വേഡ് ആവശ്യമാണ്:" }, @@ -6681,15 +6717,6 @@ "message": "Generator", "description": "Short for 'credential generator'." }, - "whatWouldYouLikeToGenerate": { - "message": "What would you like to generate?" - }, - "passwordType": { - "message": "Password type" - }, - "regenerateUsername": { - "message": "Regenerate username" - }, "generateUsername": { "message": "Generate username" }, @@ -6730,9 +6757,6 @@ } } }, - "usernameType": { - "message": "Username type" - }, "plusAddressedEmail": { "message": "Plus addressed email", "description": "Username generator option that appends a random sub-address to the username. For example: address+subaddress@email.com" @@ -6952,9 +6976,6 @@ "message": "Hostname", "description": "Part of a URL." }, - "apiAccessToken": { - "message": "API access token" - }, "deviceVerification": { "message": "Device verification" }, @@ -7666,18 +7687,6 @@ "noCollection": { "message": "No collection" }, - "canView": { - "message": "Can view" - }, - "canViewExceptPass": { - "message": "Can view, except passwords" - }, - "canEdit": { - "message": "Can edit" - }, - "canEditExceptPass": { - "message": "Can edit, except passwords" - }, "noCollectionsAdded": { "message": "No collections added" }, @@ -8677,9 +8686,6 @@ "message": "Self-host server URL", "description": "Label for field requesting a self-hosted integration service URL" }, - "aliasDomain": { - "message": "Alias domain" - }, "alreadyHaveAccount": { "message": "Already have an account?" }, @@ -8741,11 +8747,11 @@ "readOnlyCollectionAccess": { "message": "You do not have access to manage this collection." }, - "grantAddAccessCollectionWarningTitle": { - "message": "Missing Can Manage Permissions" + "grantManageCollectionWarningTitle": { + "message": "Missing Manage Collection Permissions" }, - "grantAddAccessCollectionWarning": { - "message": "Grant Can manage permissions to allow full collection management including deletion of collection." + "grantManageCollectionWarning": { + "message": "Grant Manage collection permissions to allow full collection management including deletion of collection." }, "grantCollectionAccess": { "message": "Grant groups or members access to this collection." @@ -10091,6 +10097,15 @@ "descriptorCode": { "message": "Descriptor code" }, + "cannotRemoveViewOnlyCollections": { + "message": "You cannot remove collections with View only permissions: $COLLECTIONS$", + "placeholders": { + "collections": { + "content": "$1", + "example": "Work, Personal" + } + } + }, "importantNotice": { "message": "Important notice" }, @@ -10281,5 +10296,54 @@ "example": "Acme c" } } + }, + "accountDeprovisioningNotification": { + "message": "Administrators now have the ability to delete member accounts that belong to a claimed domain." + }, + "deleteManagedUserWarningDesc": { + "message": "This action will delete the member account including all items in their vault. This replaces the previous Remove action." + }, + "deleteManagedUserWarning": { + "message": "Delete is a new action!" + }, + "seatsRemaining": { + "message": "You have $REMAINING$ seats remaining out of $TOTAL$ seats assigned to this organization. Contact your provider to manage your subscription.", + "placeholders": { + "remaining": { + "content": "$1", + "example": "5" + }, + "total": { + "content": "$2", + "example": "10" + } + } + }, + "existingOrganization": { + "message": "Existing organization" + }, + "selectOrganizationProviderPortal": { + "message": "Select an organization to add to your Provider Portal." + }, + "noOrganizations": { + "message": "There are no organizations to list" + }, + "yourProviderSubscriptionCredit": { + "message": "Your provider subscription will receive a credit for any remaining time in the organization's subscription." + }, + "doYouWantToAddThisOrg": { + "message": "Do you want to add this organization to $PROVIDER$?", + "placeholders": { + "provider": { + "content": "$1", + "example": "Cool MSP" + } + } + }, + "addedExistingOrganization": { + "message": "Added existing organization" + }, + "assignedExceedsAvailable": { + "message": "Assigned seats exceed available seats." } } diff --git a/apps/web/src/locales/mr/messages.json b/apps/web/src/locales/mr/messages.json index 3b8d147b95f..7e6f614b9c8 100644 --- a/apps/web/src/locales/mr/messages.json +++ b/apps/web/src/locales/mr/messages.json @@ -464,6 +464,18 @@ "editFolder": { "message": "Edit folder" }, + "newFolder": { + "message": "New folder" + }, + "folderName": { + "message": "Folder name" + }, + "folderHintText": { + "message": "Nest a folder by adding the parent folder's name followed by a “/”. Example: Social/Forums" + }, + "deleteFolderPermanently": { + "message": "Are you sure you want to permanently delete this folder?" + }, "baseDomain": { "message": "Base domain", "description": "Domain name. Example: website.com" @@ -728,15 +740,6 @@ "itemName": { "message": "Item name" }, - "cannotRemoveViewOnlyCollections": { - "message": "You cannot remove collections with View only permissions: $COLLECTIONS$", - "placeholders": { - "collections": { - "content": "$1", - "example": "Work, Personal" - } - } - }, "ex": { "message": "ex.", "description": "Short abbreviation for 'example'." @@ -1182,6 +1185,9 @@ "logInInitiated": { "message": "Log in initiated" }, + "logInRequestSent": { + "message": "Request sent" + }, "submit": { "message": "Submit" }, @@ -1371,12 +1377,39 @@ "notificationSentDevice": { "message": "A notification has been sent to your device." }, + "notificationSentDevicePart1": { + "message": "Unlock Bitwarden on your device or on the " + }, + "areYouTryingToAccessYourAccount": { + "message": "Are you trying to access your account?" + }, + "accessAttemptBy": { + "message": "Access attempt by $EMAIL$", + "placeholders": { + "email": { + "content": "$1", + "example": "name@example.com" + } + } + }, + "confirmAccess": { + "message": "Confirm access" + }, + "denyAccess": { + "message": "Deny access" + }, + "notificationSentDeviceAnchor": { + "message": "web app" + }, + "notificationSentDevicePart2": { + "message": "Make sure the Fingerprint phrase matches the one below before approving." + }, + "notificationSentDeviceComplete": { + "message": "Unlock Bitwarden on your device. Make sure the Fingerprint phrase matches the one below before approving." + }, "aNotificationWasSentToYourDevice": { "message": "A notification was sent to your device" }, - "makeSureYourAccountIsUnlockedAndTheFingerprintEtc": { - "message": "Make sure your account is unlocked and the fingerprint phrase matches on the other device" - }, "versionNumber": { "message": "Version $VERSION_NUMBER$", "placeholders": { @@ -1664,9 +1697,6 @@ "message": "Avoid ambiguous characters", "description": "Label for the avoid ambiguous characters checkbox." }, - "regeneratePassword": { - "message": "Regenerate password" - }, "length": { "message": "Length" }, @@ -2170,8 +2200,20 @@ "manage": { "message": "Manage" }, - "canManage": { - "message": "Can manage" + "manageCollection": { + "message": "Manage collection" + }, + "viewItems": { + "message": "View items" + }, + "viewItemsHidePass": { + "message": "View items, hidden passwords" + }, + "editItems": { + "message": "Edit items" + }, + "editItemsHidePass": { + "message": "Edit items, hidden passwords" }, "disable": { "message": "Turn off" @@ -2368,11 +2410,8 @@ "twoFactorU2fProblemReadingTryAgain": { "message": "There was a problem reading the security key. Try again." }, - "twoFactorWebAuthnWarning": { - "message": "Due to platform limitations, WebAuthn cannot be used on all Bitwarden applications. You should set up another two-step login provider so that you can access your account when WebAuthn cannot be used. Supported platforms:" - }, - "twoFactorWebAuthnSupportWeb": { - "message": "Web vault and browser extensions on a desktop/laptop with a WebAuthn supported browser (Chrome, Opera, Vivaldi, or Firefox with FIDO U2F turned on)." + "twoFactorWebAuthnWarning1": { + "message": "Due to platform limitations, WebAuthn cannot be used on all Bitwarden applications. You should set up another two-step login provider so that you can access your account when WebAuthn cannot be used." }, "twoFactorRecoveryYourCode": { "message": "Your Bitwarden two-step login recovery code" @@ -4710,9 +4749,6 @@ "passwordGeneratorPolicyDesc": { "message": "Set requirements for password generator." }, - "passwordGeneratorPolicyInEffect": { - "message": "One or more organization policies are affecting your generator settings." - }, "masterPasswordPolicyInEffect": { "message": "One or more organization policies require your master password to meet the following requirements:" }, @@ -6681,15 +6717,6 @@ "message": "Generator", "description": "Short for 'credential generator'." }, - "whatWouldYouLikeToGenerate": { - "message": "What would you like to generate?" - }, - "passwordType": { - "message": "Password type" - }, - "regenerateUsername": { - "message": "Regenerate username" - }, "generateUsername": { "message": "Generate username" }, @@ -6730,9 +6757,6 @@ } } }, - "usernameType": { - "message": "Username type" - }, "plusAddressedEmail": { "message": "Plus addressed email", "description": "Username generator option that appends a random sub-address to the username. For example: address+subaddress@email.com" @@ -6952,9 +6976,6 @@ "message": "Hostname", "description": "Part of a URL." }, - "apiAccessToken": { - "message": "API access token" - }, "deviceVerification": { "message": "Device verification" }, @@ -7666,18 +7687,6 @@ "noCollection": { "message": "No collection" }, - "canView": { - "message": "Can view" - }, - "canViewExceptPass": { - "message": "Can view, except passwords" - }, - "canEdit": { - "message": "Can edit" - }, - "canEditExceptPass": { - "message": "Can edit, except passwords" - }, "noCollectionsAdded": { "message": "No collections added" }, @@ -8677,9 +8686,6 @@ "message": "Self-host server URL", "description": "Label for field requesting a self-hosted integration service URL" }, - "aliasDomain": { - "message": "Alias domain" - }, "alreadyHaveAccount": { "message": "Already have an account?" }, @@ -8741,11 +8747,11 @@ "readOnlyCollectionAccess": { "message": "You do not have access to manage this collection." }, - "grantAddAccessCollectionWarningTitle": { - "message": "Missing Can Manage Permissions" + "grantManageCollectionWarningTitle": { + "message": "Missing Manage Collection Permissions" }, - "grantAddAccessCollectionWarning": { - "message": "Grant Can manage permissions to allow full collection management including deletion of collection." + "grantManageCollectionWarning": { + "message": "Grant Manage collection permissions to allow full collection management including deletion of collection." }, "grantCollectionAccess": { "message": "Grant groups or members access to this collection." @@ -10091,6 +10097,15 @@ "descriptorCode": { "message": "Descriptor code" }, + "cannotRemoveViewOnlyCollections": { + "message": "You cannot remove collections with View only permissions: $COLLECTIONS$", + "placeholders": { + "collections": { + "content": "$1", + "example": "Work, Personal" + } + } + }, "importantNotice": { "message": "Important notice" }, @@ -10281,5 +10296,54 @@ "example": "Acme c" } } + }, + "accountDeprovisioningNotification": { + "message": "Administrators now have the ability to delete member accounts that belong to a claimed domain." + }, + "deleteManagedUserWarningDesc": { + "message": "This action will delete the member account including all items in their vault. This replaces the previous Remove action." + }, + "deleteManagedUserWarning": { + "message": "Delete is a new action!" + }, + "seatsRemaining": { + "message": "You have $REMAINING$ seats remaining out of $TOTAL$ seats assigned to this organization. Contact your provider to manage your subscription.", + "placeholders": { + "remaining": { + "content": "$1", + "example": "5" + }, + "total": { + "content": "$2", + "example": "10" + } + } + }, + "existingOrganization": { + "message": "Existing organization" + }, + "selectOrganizationProviderPortal": { + "message": "Select an organization to add to your Provider Portal." + }, + "noOrganizations": { + "message": "There are no organizations to list" + }, + "yourProviderSubscriptionCredit": { + "message": "Your provider subscription will receive a credit for any remaining time in the organization's subscription." + }, + "doYouWantToAddThisOrg": { + "message": "Do you want to add this organization to $PROVIDER$?", + "placeholders": { + "provider": { + "content": "$1", + "example": "Cool MSP" + } + } + }, + "addedExistingOrganization": { + "message": "Added existing organization" + }, + "assignedExceedsAvailable": { + "message": "Assigned seats exceed available seats." } } diff --git a/apps/web/src/locales/my/messages.json b/apps/web/src/locales/my/messages.json index 3b8d147b95f..7e6f614b9c8 100644 --- a/apps/web/src/locales/my/messages.json +++ b/apps/web/src/locales/my/messages.json @@ -464,6 +464,18 @@ "editFolder": { "message": "Edit folder" }, + "newFolder": { + "message": "New folder" + }, + "folderName": { + "message": "Folder name" + }, + "folderHintText": { + "message": "Nest a folder by adding the parent folder's name followed by a “/”. Example: Social/Forums" + }, + "deleteFolderPermanently": { + "message": "Are you sure you want to permanently delete this folder?" + }, "baseDomain": { "message": "Base domain", "description": "Domain name. Example: website.com" @@ -728,15 +740,6 @@ "itemName": { "message": "Item name" }, - "cannotRemoveViewOnlyCollections": { - "message": "You cannot remove collections with View only permissions: $COLLECTIONS$", - "placeholders": { - "collections": { - "content": "$1", - "example": "Work, Personal" - } - } - }, "ex": { "message": "ex.", "description": "Short abbreviation for 'example'." @@ -1182,6 +1185,9 @@ "logInInitiated": { "message": "Log in initiated" }, + "logInRequestSent": { + "message": "Request sent" + }, "submit": { "message": "Submit" }, @@ -1371,12 +1377,39 @@ "notificationSentDevice": { "message": "A notification has been sent to your device." }, + "notificationSentDevicePart1": { + "message": "Unlock Bitwarden on your device or on the " + }, + "areYouTryingToAccessYourAccount": { + "message": "Are you trying to access your account?" + }, + "accessAttemptBy": { + "message": "Access attempt by $EMAIL$", + "placeholders": { + "email": { + "content": "$1", + "example": "name@example.com" + } + } + }, + "confirmAccess": { + "message": "Confirm access" + }, + "denyAccess": { + "message": "Deny access" + }, + "notificationSentDeviceAnchor": { + "message": "web app" + }, + "notificationSentDevicePart2": { + "message": "Make sure the Fingerprint phrase matches the one below before approving." + }, + "notificationSentDeviceComplete": { + "message": "Unlock Bitwarden on your device. Make sure the Fingerprint phrase matches the one below before approving." + }, "aNotificationWasSentToYourDevice": { "message": "A notification was sent to your device" }, - "makeSureYourAccountIsUnlockedAndTheFingerprintEtc": { - "message": "Make sure your account is unlocked and the fingerprint phrase matches on the other device" - }, "versionNumber": { "message": "Version $VERSION_NUMBER$", "placeholders": { @@ -1664,9 +1697,6 @@ "message": "Avoid ambiguous characters", "description": "Label for the avoid ambiguous characters checkbox." }, - "regeneratePassword": { - "message": "Regenerate password" - }, "length": { "message": "Length" }, @@ -2170,8 +2200,20 @@ "manage": { "message": "Manage" }, - "canManage": { - "message": "Can manage" + "manageCollection": { + "message": "Manage collection" + }, + "viewItems": { + "message": "View items" + }, + "viewItemsHidePass": { + "message": "View items, hidden passwords" + }, + "editItems": { + "message": "Edit items" + }, + "editItemsHidePass": { + "message": "Edit items, hidden passwords" }, "disable": { "message": "Turn off" @@ -2368,11 +2410,8 @@ "twoFactorU2fProblemReadingTryAgain": { "message": "There was a problem reading the security key. Try again." }, - "twoFactorWebAuthnWarning": { - "message": "Due to platform limitations, WebAuthn cannot be used on all Bitwarden applications. You should set up another two-step login provider so that you can access your account when WebAuthn cannot be used. Supported platforms:" - }, - "twoFactorWebAuthnSupportWeb": { - "message": "Web vault and browser extensions on a desktop/laptop with a WebAuthn supported browser (Chrome, Opera, Vivaldi, or Firefox with FIDO U2F turned on)." + "twoFactorWebAuthnWarning1": { + "message": "Due to platform limitations, WebAuthn cannot be used on all Bitwarden applications. You should set up another two-step login provider so that you can access your account when WebAuthn cannot be used." }, "twoFactorRecoveryYourCode": { "message": "Your Bitwarden two-step login recovery code" @@ -4710,9 +4749,6 @@ "passwordGeneratorPolicyDesc": { "message": "Set requirements for password generator." }, - "passwordGeneratorPolicyInEffect": { - "message": "One or more organization policies are affecting your generator settings." - }, "masterPasswordPolicyInEffect": { "message": "One or more organization policies require your master password to meet the following requirements:" }, @@ -6681,15 +6717,6 @@ "message": "Generator", "description": "Short for 'credential generator'." }, - "whatWouldYouLikeToGenerate": { - "message": "What would you like to generate?" - }, - "passwordType": { - "message": "Password type" - }, - "regenerateUsername": { - "message": "Regenerate username" - }, "generateUsername": { "message": "Generate username" }, @@ -6730,9 +6757,6 @@ } } }, - "usernameType": { - "message": "Username type" - }, "plusAddressedEmail": { "message": "Plus addressed email", "description": "Username generator option that appends a random sub-address to the username. For example: address+subaddress@email.com" @@ -6952,9 +6976,6 @@ "message": "Hostname", "description": "Part of a URL." }, - "apiAccessToken": { - "message": "API access token" - }, "deviceVerification": { "message": "Device verification" }, @@ -7666,18 +7687,6 @@ "noCollection": { "message": "No collection" }, - "canView": { - "message": "Can view" - }, - "canViewExceptPass": { - "message": "Can view, except passwords" - }, - "canEdit": { - "message": "Can edit" - }, - "canEditExceptPass": { - "message": "Can edit, except passwords" - }, "noCollectionsAdded": { "message": "No collections added" }, @@ -8677,9 +8686,6 @@ "message": "Self-host server URL", "description": "Label for field requesting a self-hosted integration service URL" }, - "aliasDomain": { - "message": "Alias domain" - }, "alreadyHaveAccount": { "message": "Already have an account?" }, @@ -8741,11 +8747,11 @@ "readOnlyCollectionAccess": { "message": "You do not have access to manage this collection." }, - "grantAddAccessCollectionWarningTitle": { - "message": "Missing Can Manage Permissions" + "grantManageCollectionWarningTitle": { + "message": "Missing Manage Collection Permissions" }, - "grantAddAccessCollectionWarning": { - "message": "Grant Can manage permissions to allow full collection management including deletion of collection." + "grantManageCollectionWarning": { + "message": "Grant Manage collection permissions to allow full collection management including deletion of collection." }, "grantCollectionAccess": { "message": "Grant groups or members access to this collection." @@ -10091,6 +10097,15 @@ "descriptorCode": { "message": "Descriptor code" }, + "cannotRemoveViewOnlyCollections": { + "message": "You cannot remove collections with View only permissions: $COLLECTIONS$", + "placeholders": { + "collections": { + "content": "$1", + "example": "Work, Personal" + } + } + }, "importantNotice": { "message": "Important notice" }, @@ -10281,5 +10296,54 @@ "example": "Acme c" } } + }, + "accountDeprovisioningNotification": { + "message": "Administrators now have the ability to delete member accounts that belong to a claimed domain." + }, + "deleteManagedUserWarningDesc": { + "message": "This action will delete the member account including all items in their vault. This replaces the previous Remove action." + }, + "deleteManagedUserWarning": { + "message": "Delete is a new action!" + }, + "seatsRemaining": { + "message": "You have $REMAINING$ seats remaining out of $TOTAL$ seats assigned to this organization. Contact your provider to manage your subscription.", + "placeholders": { + "remaining": { + "content": "$1", + "example": "5" + }, + "total": { + "content": "$2", + "example": "10" + } + } + }, + "existingOrganization": { + "message": "Existing organization" + }, + "selectOrganizationProviderPortal": { + "message": "Select an organization to add to your Provider Portal." + }, + "noOrganizations": { + "message": "There are no organizations to list" + }, + "yourProviderSubscriptionCredit": { + "message": "Your provider subscription will receive a credit for any remaining time in the organization's subscription." + }, + "doYouWantToAddThisOrg": { + "message": "Do you want to add this organization to $PROVIDER$?", + "placeholders": { + "provider": { + "content": "$1", + "example": "Cool MSP" + } + } + }, + "addedExistingOrganization": { + "message": "Added existing organization" + }, + "assignedExceedsAvailable": { + "message": "Assigned seats exceed available seats." } } diff --git a/apps/web/src/locales/nb/messages.json b/apps/web/src/locales/nb/messages.json index 621f5de51a9..a804f5dfafb 100644 --- a/apps/web/src/locales/nb/messages.json +++ b/apps/web/src/locales/nb/messages.json @@ -96,7 +96,7 @@ "message": "Apps marked as critical" }, "application": { - "message": "Application" + "message": "Program" }, "atRiskPasswords": { "message": "At-risk passwords" @@ -208,22 +208,22 @@ "message": "Kortholderens navn" }, "loginCredentials": { - "message": "Login credentials" + "message": "Legitimasjoner for innlogging" }, "personalDetails": { - "message": "Personal details" + "message": "Personlige detaljer" }, "identification": { - "message": "Identification" + "message": "Identifikasjon" }, "contactInfo": { - "message": "Contact info" + "message": "Kontaktinfo" }, "cardDetails": { - "message": "Card details" + "message": "Kortdetaljer" }, "cardBrandDetails": { - "message": "$BRAND$ details", + "message": "$BRAND$-detaljer", "placeholders": { "brand": { "content": "$1", @@ -232,19 +232,19 @@ } }, "itemHistory": { - "message": "Item history" + "message": "Gjenstandshistorikk" }, "authenticatorKey": { - "message": "Authenticator key" + "message": "Autentiseringsnøkkel" }, "autofillOptions": { - "message": "Autofill options" + "message": "Autoutfyllings-innstillinger" }, "websiteUri": { - "message": "Website (URI)" + "message": "Nettsted (URİ)" }, "websiteUriCount": { - "message": "Website (URI) $COUNT$", + "message": "Nettsted (URİ) $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": { @@ -254,16 +254,16 @@ } }, "websiteAdded": { - "message": "Website added" + "message": "Nettsted lagt til" }, "addWebsite": { - "message": "Add website" + "message": "Legg til nettsted" }, "deleteWebsite": { - "message": "Delete website" + "message": "Slett nettsted" }, "defaultLabel": { - "message": "Default ($VALUE$)", + "message": "Standard ($VALUE$)", "description": "A label that indicates the default value for a field with the current default value in parentheses.", "placeholders": { "value": { @@ -384,7 +384,7 @@ "message": "Dr․" }, "cardExpiredTitle": { - "message": "Expired card" + "message": "Utløpt kort" }, "cardExpiredMessage": { "message": "If you've renewed it, update the card's information" @@ -408,7 +408,7 @@ "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." }, "learnMoreAboutAuthenticators": { - "message": "Learn more about authenticators" + "message": "Lær mer om autentisering" }, "folder": { "message": "Mappe" @@ -432,17 +432,17 @@ "message": "Boolsk verdi" }, "cfTypeCheckbox": { - "message": "Checkbox" + "message": "Avkryssingsboks" }, "cfTypeLinked": { "message": "Tilknyttet", "description": "This describes a field that is 'linked' (related) to another field." }, "fieldType": { - "message": "Field type" + "message": "Felttype" }, "fieldLabel": { - "message": "Field label" + "message": "Feltetikett" }, "remove": { "message": "Fjern" @@ -455,7 +455,7 @@ "description": "This is the folder for uncategorized items" }, "selfOwnershipLabel": { - "message": "You", + "message": "Du", "description": "Used as a label to indicate that the user is the owner of an item." }, "addFolder": { @@ -464,6 +464,18 @@ "editFolder": { "message": "Rediger mappen" }, + "newFolder": { + "message": "Ny mappe" + }, + "folderName": { + "message": "Mappenavn" + }, + "folderHintText": { + "message": "Nest a folder by adding the parent folder's name followed by a “/”. Example: Social/Forums" + }, + "deleteFolderPermanently": { + "message": "Are you sure you want to permanently delete this folder?" + }, "baseDomain": { "message": "Grunndomene", "description": "Domain name. Example: website.com" @@ -508,7 +520,7 @@ "message": "Generer et passord" }, "generatePassphrase": { - "message": "Generate passphrase" + "message": "Generér passordfrase" }, "checkPassword": { "message": "Sjekk om passordet har blitt utsatt." @@ -611,7 +623,7 @@ "message": "Sikkert notat" }, "typeSshKey": { - "message": "SSH key" + "message": "SSH-nøkkel" }, "typeLoginPlural": { "message": "Innlogginger" @@ -644,7 +656,7 @@ "message": "Fullt navn" }, "address": { - "message": "Address" + "message": "Adresse" }, "address1": { "message": "Adresse 1" @@ -689,7 +701,7 @@ "message": "Vis elementet" }, "newItemHeader": { - "message": "New $TYPE$", + "message": "Ny $TYPE$", "placeholders": { "type": { "content": "$1", @@ -698,7 +710,7 @@ } }, "editItemHeader": { - "message": "Edit $TYPE$", + "message": "Rediger $TYPE$", "placeholders": { "type": { "content": "$1", @@ -723,19 +735,10 @@ "message": "Element" }, "itemDetails": { - "message": "Item details" + "message": "Gjenstandens detaljer" }, "itemName": { - "message": "Item name" - }, - "cannotRemoveViewOnlyCollections": { - "message": "You cannot remove collections with View only permissions: $COLLECTIONS$", - "placeholders": { - "collections": { - "content": "$1", - "example": "Work, Personal" - } - } + "message": "Gjenstandens navn" }, "ex": { "message": "f.eks.", @@ -761,7 +764,7 @@ } }, "copySuccessful": { - "message": "Copy Successful" + "message": "Kopiering lyktes" }, "copyValue": { "message": "Kopier verdien", @@ -776,7 +779,7 @@ "description": "Copy passphrase to clipboard" }, "passwordCopied": { - "message": "Password copied" + "message": "Passordet er kopiert" }, "copyUsername": { "message": "Kopier brukernavnet", @@ -795,7 +798,7 @@ "description": "Copy URI to clipboard" }, "copyCustomField": { - "message": "Copy $FIELD$", + "message": "Kopiér $FIELD$", "placeholders": { "field": { "content": "$1", @@ -804,34 +807,34 @@ } }, "copyWebsite": { - "message": "Copy website" + "message": "Kopiér nettsted" }, "copyNotes": { - "message": "Copy notes" + "message": "Kopiér notater" }, "copyAddress": { - "message": "Copy address" + "message": "Kopiér adresse" }, "copyPhone": { - "message": "Copy phone" + "message": "Kopiér telefonnummer" }, "copyEmail": { "message": "Copy email" }, "copyCompany": { - "message": "Copy company" + "message": "Kopiér firma" }, "copySSN": { - "message": "Copy Social Security number" + "message": "Kopiér fødselsnummer" }, "copyPassportNumber": { - "message": "Copy passport number" + "message": "Kopiér passnummer" }, "copyLicenseNumber": { - "message": "Copy license number" + "message": "Kopiér lisensnummer" }, "copyName": { - "message": "Copy name" + "message": "Kopiér navn" }, "me": { "message": "Meg" @@ -922,7 +925,7 @@ } }, "itemsMovedToOrg": { - "message": "Items moved to $ORGNAME$", + "message": "Gjenstandene ble flyttet til $ORGNAME$", "placeholders": { "orgname": { "content": "$1", @@ -931,7 +934,7 @@ } }, "itemMovedToOrg": { - "message": "Item moved to $ORGNAME$", + "message": "Gjenstanden ble flyttet til $ORGNAME$", "placeholders": { "orgname": { "content": "$1", @@ -991,22 +994,22 @@ "message": "Logget av" }, "loggedOutDesc": { - "message": "You have been logged out of your account." + "message": "Du har blitt logget ut av kontoen din." }, "loginExpired": { "message": "Din innloggingsøkt har utløpt." }, "restartRegistration": { - "message": "Restart registration" + "message": "Start registreringen på nytt" }, "expiredLink": { - "message": "Expired link" + "message": "Utløpt lenke" }, "pleaseRestartRegistrationOrTryLoggingIn": { "message": "Please restart registration or try logging in." }, "youMayAlreadyHaveAnAccount": { - "message": "You may already have an account" + "message": "Du har kanskje allerede en konto" }, "logOutConfirmation": { "message": "Er du sikker på at du vil logge av?" @@ -1033,7 +1036,7 @@ "message": "Logg på med enhet må settes opp i Bitwarden-innstillingene. Trenger du et annet alternativ?" }, "needAnotherOptionV1": { - "message": "Need another option?" + "message": "Trenger du et annet alternativ?" }, "loginWithMasterPassword": { "message": "Logg på med hovedpassord" @@ -1048,13 +1051,13 @@ "message": "Bruk en annen innloggingsmetode" }, "logInWithPasskey": { - "message": "Log in with passkey" + "message": "Logg inn med passnøkkel" }, "useSingleSignOn": { "message": "Use single sign-on" }, "welcomeBack": { - "message": "Welcome back" + "message": "Velkommen tilbake" }, "invalidPasskeyPleaseTryAgain": { "message": "Ugyldig Passkey. Vennligst prøv igjen." @@ -1138,10 +1141,10 @@ "message": "Opprett en konto" }, "newToBitwarden": { - "message": "New to Bitwarden?" + "message": "Er du ny til Bitwarden?" }, "setAStrongPassword": { - "message": "Set a strong password" + "message": "Velg et sterkt passord" }, "finishCreatingYourAccountBySettingAPassword": { "message": "Finish creating your account by setting a password" @@ -1156,7 +1159,7 @@ "message": "Logg på" }, "logInToBitwarden": { - "message": "Log in to Bitwarden" + "message": "Logg inn på Bitwarden" }, "authenticationTimeout": { "message": "Authentication timeout" @@ -1171,7 +1174,7 @@ "message": "We don't recognize this device. Enter the code sent to your email to verify your identity." }, "continueLoggingIn": { - "message": "Continue logging in" + "message": "Fortsett innloggingen" }, "whatIsADevice": { "message": "What is a device?" @@ -1182,6 +1185,9 @@ "logInInitiated": { "message": "Pålogging startet" }, + "logInRequestSent": { + "message": "Forespørsel sendt" + }, "submit": { "message": "Send inn" }, @@ -1235,13 +1241,13 @@ "message": "Innstillinger" }, "accountEmail": { - "message": "Account email" + "message": "Kontoens E-postadresse" }, "requestHint": { - "message": "Request hint" + "message": "Be om et hint" }, "requestPasswordHint": { - "message": "Request password hint" + "message": "Be om passordhint" }, "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { "message": "Enter your account email address and your password hint will be sent to you" @@ -1284,10 +1290,10 @@ "message": "Din nye konto har blitt opprettet! Du kan nå logge på." }, "newAccountCreated2": { - "message": "Your new account has been created!" + "message": "Den nye kontoen din er opprettet!" }, "youHaveBeenLoggedIn": { - "message": "You have been logged in!" + "message": "Du har blitt logget inn!" }, "trialAccountCreated": { "message": "Kontoen ble opprettet." @@ -1305,10 +1311,10 @@ "message": "E-postadresse" }, "yourVaultIsLockedV2": { - "message": "Your vault is locked" + "message": "Hvelvet ditt er låst" }, "yourAccountIsLocked": { - "message": "Your account is locked" + "message": "Kontoen din er låst" }, "uuid": { "message": "UUID" @@ -1371,11 +1377,38 @@ "notificationSentDevice": { "message": "Et varsel har blitt sendt til enheten din." }, - "aNotificationWasSentToYourDevice": { - "message": "A notification was sent to your device" + "notificationSentDevicePart1": { + "message": "Unlock Bitwarden on your device or on the " }, - "makeSureYourAccountIsUnlockedAndTheFingerprintEtc": { - "message": "Make sure your account is unlocked and the fingerprint phrase matches on the other device" + "areYouTryingToAccessYourAccount": { + "message": "Are you trying to access your account?" + }, + "accessAttemptBy": { + "message": "Access attempt by $EMAIL$", + "placeholders": { + "email": { + "content": "$1", + "example": "name@example.com" + } + } + }, + "confirmAccess": { + "message": "Confirm access" + }, + "denyAccess": { + "message": "Deny access" + }, + "notificationSentDeviceAnchor": { + "message": "nett-app" + }, + "notificationSentDevicePart2": { + "message": "Make sure the Fingerprint phrase matches the one below before approving." + }, + "notificationSentDeviceComplete": { + "message": "Unlock Bitwarden on your device. Make sure the Fingerprint phrase matches the one below before approving." + }, + "aNotificationWasSentToYourDevice": { + "message": "Et varsel ble sendt til enheten din" }, "versionNumber": { "message": "Versjon $VERSION_NUMBER$", @@ -1480,7 +1513,7 @@ "message": "E-post" }, "emailDescV2": { - "message": "Enter a code sent to your email." + "message": "Skriv inn koden du har fått tilsendt på E-post." }, "continue": { "message": "Fortsett" @@ -1661,17 +1694,14 @@ "description": "deprecated. Use avoidAmbiguous instead." }, "avoidAmbiguous": { - "message": "Avoid ambiguous characters", + "message": "Unngå forvekslingsbare tegn", "description": "Label for the avoid ambiguous characters checkbox." }, - "regeneratePassword": { - "message": "Regenerer passord" - }, "length": { "message": "Lengde" }, "passwordMinLength": { - "message": "Minimum password length" + "message": "Minimum passordlengde" }, "uppercase": { "message": "Store bokstaver (A-Z)", @@ -1709,10 +1739,10 @@ "message": "Passordhistorikk" }, "generatorHistory": { - "message": "Generator history" + "message": "Generatorhistorikk" }, "clearGeneratorHistoryTitle": { - "message": "Clear generator history" + "message": "Tøm generatorhistorikk" }, "cleargGeneratorHistoryDescription": { "message": "If you continue, all entries will be permanently deleted from generator's history. Are you sure you want to continue?" @@ -1721,13 +1751,13 @@ "message": "Det er ingen passord å liste opp." }, "clearHistory": { - "message": "Clear history" + "message": "Tøm historikk" }, "nothingToShow": { - "message": "Nothing to show" + "message": "Ingenting å vise" }, "nothingGeneratedRecently": { - "message": "You haven't generated anything recently" + "message": "Du har ikke generert noe i det siste" }, "clear": { "message": "Tøm", @@ -1767,7 +1797,7 @@ "message": "Vennligst logg på igjen." }, "currentSession": { - "message": "Current session" + "message": "Gjeldende økt" }, "requestPending": { "message": "Request pending" @@ -1959,7 +1989,7 @@ "message": "Dataene har blitt vellykket importert inn i hvelvet ditt." }, "importSuccessNumberOfItems": { - "message": "A total of $AMOUNT$ items were imported.", + "message": "$AMOUNT$ gjenstander totalt ble importert.", "placeholders": { "amount": { "content": "$1", @@ -1989,16 +2019,16 @@ "message": "Feil under dekryptering av den eksporterte filen. Krypteringsnøkkelen samsvarte ikke med krypteringsnøkkelen som ble brukt eksport av data." }, "destination": { - "message": "Destination" + "message": "Destinasjon" }, "learnAboutImportOptions": { - "message": "Learn about your import options" + "message": "Lær mer om importalternativene dine" }, "selectImportFolder": { - "message": "Select a folder" + "message": "Velg en mappe" }, "selectImportCollection": { - "message": "Select a collection" + "message": "Velg en samling" }, "importTargetHint": { "message": "Select this option if you want the imported file contents moved to a $DESTINATION$", @@ -2011,7 +2041,7 @@ } }, "importUnassignedItemsError": { - "message": "File contains unassigned items." + "message": "Filen inneholder utildelte elementer." }, "selectFormat": { "message": "Velg formatet til importfilen" @@ -2170,8 +2200,20 @@ "manage": { "message": "Behandle" }, - "canManage": { - "message": "Can manage" + "manageCollection": { + "message": "Manage collection" + }, + "viewItems": { + "message": "View items" + }, + "viewItemsHidePass": { + "message": "View items, hidden passwords" + }, + "editItems": { + "message": "Edit items" + }, + "editItemsHidePass": { + "message": "Edit items, hidden passwords" }, "disable": { "message": "Deaktiver" @@ -2210,7 +2252,7 @@ "message": "You are leaving Bitwarden and launching an external website in a new window." }, "twoStepContinueToBitwardenUrlTitle": { - "message": "Continue to bitwarden.com?" + "message": "Vil du fortsette til bitwarden.com?" }, "twoStepContinueToBitwardenUrlDesc": { "message": "Bitwarden Authenticator allows you to store authenticator keys and generate TOTP codes for 2-step verification flows. Learn more on the bitwarden.com website." @@ -2225,7 +2267,7 @@ "message": "Nøkkel" }, "twoStepAuthenticatorEnterCodeV2": { - "message": "Verification code" + "message": "Verifiseringskode" }, "twoStepAuthenticatorReaddDesc": { "message": "Dersom du trenger å legge den til til en annen enhet, er QR-koden (eller -nøkkelen) som kreves av din autentiseringsapp nedenfor." @@ -2309,7 +2351,7 @@ "message": "Client Id" }, "twoFactorDuoClientSecret": { - "message": "Client Secret" + "message": "Klienthemmelighet" }, "twoFactorDuoApiHostname": { "message": "API-vertsnavn" @@ -2368,11 +2410,8 @@ "twoFactorU2fProblemReadingTryAgain": { "message": "Det oppsto et problem med å lese sikkerhetsnøkkelen. Prøv igjen." }, - "twoFactorWebAuthnWarning": { - "message": "På grunn av plattformbegrensninger, kan ikke WebAuthn brukes på alle Bitwarden-apper. Du bør aktivere en annen 2-trinnsinnloggingsleverandør, slik at du kan få tilgang til kontoen din når WebAuthn ikke kan brukes. Støttede plattformer:" - }, - "twoFactorWebAuthnSupportWeb": { - "message": "Netthvelv og nettleserutvidelser, på en datamaskin med en WebAuthn støttende nettleser (Chrome, Opera, Vivaldi, eller Firefox med FIDO U2F aktivert)." + "twoFactorWebAuthnWarning1": { + "message": "Due to platform limitations, WebAuthn cannot be used on all Bitwarden applications. You should set up another two-step login provider so that you can access your account when WebAuthn cannot be used." }, "twoFactorRecoveryYourCode": { "message": "Din 2-trinnsinnloggingsgjenopprettingskode for Bitwarden" @@ -2953,7 +2992,7 @@ "message": "Ta kontakt med kundestøtte" }, "contactSupportShort": { - "message": "Contact Support" + "message": "Kontakt kundestøtte" }, "updatedPaymentMethod": { "message": "Oppdaterte betalingsmetoden." @@ -3420,7 +3459,7 @@ "message": "Netthvelv" }, "cli": { - "message": "CLI" + "message": "Ledetekst" }, "bitWebVault": { "message": "Bitwarden Web vault" @@ -3450,13 +3489,13 @@ "message": "Innloggingsforsøket mislyktes grunnet feil 2-trinnsinnlogging." }, "incorrectPassword": { - "message": "Incorrect password" + "message": "Feil passord" }, "incorrectCode": { - "message": "Incorrect code" + "message": "Feil kode" }, "incorrectPin": { - "message": "Incorrect PIN" + "message": "Feil PIN-kode" }, "pin": { "message": "PIN", @@ -3508,7 +3547,7 @@ } }, "viewAllLogInOptions": { - "message": "View all log in options" + "message": "Vis alle påloggingsalternativer" }, "viewAllLoginOptions": { "message": "Vis alle påloggingsalternativer" @@ -3853,16 +3892,16 @@ "message": "First login" }, "trusted": { - "message": "Trusted" + "message": "Betrodd" }, "needsApproval": { "message": "Needs approval" }, "areYouTryingtoLogin": { - "message": "Are you trying to log in?" + "message": "Prøver du å logge på?" }, "logInAttemptBy": { - "message": "Login attempt by $EMAIL$", + "message": "Påloggingsforsøk av $EMAIL$", "placeholders": { "email": { "content": "$1", @@ -3874,7 +3913,7 @@ "message": "Device Type" }, "ipAddress": { - "message": "IP Address" + "message": "IP-adresse" }, "confirmLogIn": { "message": "Confirm login" @@ -3905,7 +3944,7 @@ "message": "Login request has already expired." }, "justNow": { - "message": "Just now" + "message": "Akkurat nå" }, "requestedXMinutesAgo": { "message": "Requested $MINUTES$ minutes ago", @@ -3917,25 +3956,25 @@ } }, "creatingAccountOn": { - "message": "Creating account on" + "message": "Oppretter en konto på" }, "checkYourEmail": { - "message": "Check your email" + "message": "Sjekk E-postinnboksen din" }, "followTheLinkInTheEmailSentTo": { - "message": "Follow the link in the email sent to" + "message": "Følg lenken i E-postadressen som ble sendt til" }, "andContinueCreatingYourAccount": { "message": "and continue creating your account." }, "noEmail": { - "message": "No email?" + "message": "Ingen E-post?" }, "goBack": { - "message": "Go back" + "message": "Gå tilbake" }, "toEditYourEmailAddress": { - "message": "to edit your email address." + "message": "for å redigere E-postadressen din." }, "view": { "message": "Vis" @@ -4019,7 +4058,7 @@ "message": "Din E-postadresse har blitt bekreftet." }, "emailVerifiedV2": { - "message": "Email verified" + "message": "E-post bekreftet" }, "emailVerifiedFailed": { "message": "Klarte ikke å bekrefte E-postadressen din. Prøv å sende en ny bekreftelses-E-post." @@ -4476,10 +4515,10 @@ "message": "Unsubscribe" }, "atAnyTime": { - "message": "at any time." + "message": "når som helst." }, "byContinuingYouAgreeToThe": { - "message": "By continuing, you agree to the" + "message": "Ved å fortsette, samtykker du til" }, "and": { "message": "and" @@ -4503,7 +4542,7 @@ "message": "Pause for hvelvet" }, "vaultTimeout1": { - "message": "Timeout" + "message": "Tidsavbrudd" }, "vaultTimeoutDesc": { "message": "Velg når hvelvet ditt skal ta pause og utføre den valgte handlingen." @@ -4572,7 +4611,7 @@ "message": "Valgt" }, "recommended": { - "message": "Recommended" + "message": "Anbefalt" }, "ownership": { "message": "Eierskap" @@ -4710,9 +4749,6 @@ "passwordGeneratorPolicyDesc": { "message": "Sett minimumskrav for konfigurasjon av passordgenerator." }, - "passwordGeneratorPolicyInEffect": { - "message": "En eller flere av organisasjonens vilkår påvirker generatorinnstillingene dine." - }, "masterPasswordPolicyInEffect": { "message": "En eller flere av organisasjonens vilkår krever hovedpassordet ditt for å oppfylle følgende krav:" }, @@ -4888,13 +4924,13 @@ "message": "Du kan nå lukke denne fanen og fortsette i utvidelsen." }, "youSuccessfullyLoggedIn": { - "message": "You successfully logged in" + "message": "Du har vellykket logget inn" }, "thisWindowWillCloseIn5Seconds": { "message": "This window will automatically close in 5 seconds" }, "youMayCloseThisWindow": { - "message": "You may close this window" + "message": "Du kan lukke dette vinduet" }, "includeAllTeamsFeatures": { "message": "Alle Lag funksjoner, plus:" @@ -5059,7 +5095,7 @@ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "copyLink": { - "message": "Copy link" + "message": "Kopier lenke" }, "copySendLink": { "message": "Kopier Send-lenke", @@ -5807,7 +5843,7 @@ "message": "Feil" }, "decryptionError": { - "message": "Decryption error" + "message": "Dekrypteringsfeil" }, "couldNotDecryptVaultItemsBelow": { "message": "Bitwarden could not decrypt the vault item(s) listed below." @@ -5817,7 +5853,7 @@ "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": "for å unngå ytterligere datatap.", "description": "This is part of a larger sentence. The full sentence will read 'Contact customer success to avoid additional data loss.'" }, "accountRecoveryManageUsers": { @@ -6484,7 +6520,7 @@ "message": "Rotasjon av faktureringssynkroniserings-token vil gjøre den forrige token ugyldig." }, "selfHostedServer": { - "message": "self-hosted" + "message": "selvbetjent" }, "customEnvironment": { "message": "Custom environment" @@ -6681,23 +6717,14 @@ "message": "Generator", "description": "Short for 'credential generator'." }, - "whatWouldYouLikeToGenerate": { - "message": "Hva vil du generere?" - }, - "passwordType": { - "message": "Passordtype" - }, - "regenerateUsername": { - "message": "Regenerer Brukernavn" - }, "generateUsername": { "message": "Generer brukernavn" }, "generateEmail": { - "message": "Generate email" + "message": "Generér E-post" }, "spinboxBoundariesHint": { - "message": "Value must be between $MIN$ and $MAX$.", + "message": "Verdien må være mellom $MIN$ og $MAX$.", "description": "Explains spin box minimum and maximum values to the user", "placeholders": { "min": { @@ -6711,7 +6738,7 @@ } }, "passwordLengthRecommendationHint": { - "message": " Use $RECOMMENDED$ characters or more to generate a strong password.", + "message": " Bruk minst $RECOMMENDED$ tegn for å generere et sterkt passord.", "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": { @@ -6730,9 +6757,6 @@ } } }, - "usernameType": { - "message": "Brukernavntype" - }, "plusAddressedEmail": { "message": "Pluss-adressert e-post", "description": "Username generator option that appends a random sub-address to the username. For example: address+subaddress@email.com" @@ -6747,7 +6771,7 @@ "message": "Bruk domenets konfigurerte catch-all innboks." }, "useThisEmail": { - "message": "Use this email" + "message": "Bruk denne E-postadressen" }, "random": { "message": "Vilkårlig", @@ -6757,23 +6781,23 @@ "message": "Vilkårlig ord" }, "usernameGenerator": { - "message": "Username generator" + "message": "Brukernavngenerator" }, "useThisPassword": { - "message": "Use this password" + "message": "Bruk dette passordet" }, "useThisUsername": { - "message": "Use this username" + "message": "Bruk dette brukernavnet" }, "securePasswordGenerated": { "message": "Secure password generated! Don't forget to also update your password on the website." }, "useGeneratorHelpTextPartOne": { - "message": "Use the generator", + "message": "Bruk denne generatoren", "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": "for å lage et sterkt og unikt passord", "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'" }, "service": { @@ -6839,11 +6863,11 @@ "message": "Generer et e-postalias med en ekstern videresendingstjeneste." }, "forwarderDomainName": { - "message": "Email domain", + "message": "E-postdomene", "description": "Labels the domain name email forwarder service option" }, "forwarderDomainNameHint": { - "message": "Choose a domain that is supported by the selected service", + "message": "Velg et domene som støttes av den valgte tjenesten", "description": "Guidance provided for email forwarding services that support multiple email domains." }, "forwarderError": { @@ -6861,11 +6885,11 @@ } }, "forwarderGeneratedBy": { - "message": "Generated by Bitwarden.", + "message": "Generert av Bitwarden.", "description": "Displayed with the address on the forwarding service's configuration screen." }, "forwarderGeneratedByWithWebsite": { - "message": "Website: $WEBSITE$. Generated by Bitwarden.", + "message": "Nettsted: $WEBSITE$. Generert av Bitwarden.", "description": "Displayed with the address on the forwarding service's configuration screen.", "placeholders": { "WEBSITE": { @@ -6875,7 +6899,7 @@ } }, "forwaderInvalidToken": { - "message": "Invalid $SERVICENAME$ API token", + "message": "Ugyldig $SERVICENAME$-API-sjetong", "description": "Displayed when the user's API token is empty or rejected by the forwarding service.", "placeholders": { "servicename": { @@ -6885,7 +6909,7 @@ } }, "forwaderInvalidTokenWithMessage": { - "message": "Invalid $SERVICENAME$ API token: $ERRORMESSAGE$", + "message": "Ugyldig $SERVICENAME$-API-sjetong: $ERRORMESSAGE$", "description": "Displayed when the user's API token is rejected by the forwarding service with an error message.", "placeholders": { "servicename": { @@ -6909,7 +6933,7 @@ } }, "forwarderNoDomain": { - "message": "Invalid $SERVICENAME$ domain.", + "message": "Ugyldig $SERVICENAME$-domene.", "description": "Displayed when the domain is empty or domain authorization failed at the forwarding service.", "placeholders": { "servicename": { @@ -6929,7 +6953,7 @@ } }, "forwarderUnknownError": { - "message": "Unknown $SERVICENAME$ error occurred.", + "message": "Ukjent $SERVICENAME$-feil oppstod.", "description": "Displayed when the forwarding service failed due to an unknown error.", "placeholders": { "servicename": { @@ -6952,9 +6976,6 @@ "message": "Vertsnavn", "description": "Part of a URL." }, - "apiAccessToken": { - "message": "API tilgangstoken" - }, "deviceVerification": { "message": "Enhetsverifisering" }, @@ -7071,7 +7092,7 @@ } }, "inputMinValue": { - "message": "Input value must be at least $MIN$.", + "message": "Inndataverdien må være minst $MIN$.", "placeholders": { "min": { "content": "$1", @@ -7080,7 +7101,7 @@ } }, "inputMaxValue": { - "message": "Input value must not exceed $MAX$.", + "message": "Inndataverdien kan ikke være mer enn $MAX$.", "placeholders": { "max": { "content": "$1", @@ -7110,10 +7131,10 @@ } }, "singleFieldNeedsAttention": { - "message": "1 field needs your attention." + "message": "1 felt trenger din oppmerksomhet." }, "multipleFieldsNeedAttention": { - "message": "$COUNT$ fields need your attention.", + "message": "$COUNT$ felter trenger din oppmerksomhet.", "placeholders": { "count": { "content": "$1", @@ -7131,7 +7152,7 @@ "message": "Duo two-step login is required for your account." }, "launchDuo": { - "message": "Launch Duo" + "message": "Start Duo" }, "turnOn": { "message": "Slå på" @@ -7140,7 +7161,7 @@ "message": "På" }, "off": { - "message": "Off" + "message": "Av" }, "members": { "message": "Medlemmer" @@ -7666,18 +7687,6 @@ "noCollection": { "message": "Ingen samling" }, - "canView": { - "message": "Kan vise" - }, - "canViewExceptPass": { - "message": "Kan vise, bortsett fra passord" - }, - "canEdit": { - "message": "Kan redigere" - }, - "canEditExceptPass": { - "message": "Kan redigere, bortsett fra passord" - }, "noCollectionsAdded": { "message": "Ingen samlinger lagt til" }, @@ -7826,37 +7835,37 @@ "message": "Verification required for this action. Set a PIN to continue." }, "setPin": { - "message": "Set PIN" + "message": "Velg PIN" }, "verifyWithBiometrics": { - "message": "Verify with biometrics" + "message": "Bekreft med biometri" }, "awaitingConfirmation": { - "message": "Awaiting confirmation" + "message": "Avventer bekreftelse" }, "couldNotCompleteBiometrics": { - "message": "Could not complete biometrics." + "message": "Kunne ikke fullføre biometri." }, "needADifferentMethod": { - "message": "Need a different method?" + "message": "Trenger du en annen metode?" }, "useMasterPassword": { - "message": "Use master password" + "message": "Bruk hovedpassord" }, "usePin": { - "message": "Use PIN" + "message": "Bruk PIN-kode" }, "useBiometrics": { - "message": "Use biometrics" + "message": "Bruk biometri" }, "enterVerificationCodeSentToEmail": { - "message": "Enter the verification code that was sent to your email." + "message": "Skriv inn bekreftelseskoden som ble sendt til e-postadressen din." }, "resendCode": { - "message": "Resend code" + "message": "Send koden på nytt" }, "memberColumnHeader": { - "message": "Member" + "message": "Medlem" }, "groupSlashMemberColumnHeader": { "message": "Group/Member" @@ -7970,7 +7979,7 @@ "message": "Filopplasting" }, "upload": { - "message": "Upload" + "message": "Last opp" }, "acceptedFormats": { "message": "Aksepterte formater:" @@ -7982,13 +7991,13 @@ "message": "eller" }, "unlockWithBiometrics": { - "message": "Unlock with biometrics" + "message": "Lås opp med biometri" }, "unlockWithPin": { - "message": "Unlock with PIN" + "message": "Lås opp med PIN-kode" }, "unlockWithMasterPassword": { - "message": "Unlock with master password" + "message": "Lås opp med hovedpassord" }, "licenseAndBillingManagement": { "message": "Håndtering av lisens og fakturering" @@ -8084,10 +8093,10 @@ "message": "This user can access Secrets Manager" }, "important": { - "message": "Important:" + "message": "Viktig:" }, "viewAll": { - "message": "View all" + "message": "Vis alle" }, "showingPortionOfTotal": { "message": "Showing $PORTION$ of $TOTAL$", @@ -8103,10 +8112,10 @@ } }, "resolveTheErrorsBelowAndTryAgain": { - "message": "Resolve the errors below and try again." + "message": "Fiks feilene nedenfor og prøv igjen." }, "description": { - "message": "Description" + "message": "Beskrivelse" }, "errorReadingImportFile": { "message": "An error occurred when trying to read the import file" @@ -8125,7 +8134,7 @@ "description": "Software Development Kit" }, "createAnAccount": { - "message": "Create an account" + "message": "Opprett en konto" }, "createSecret": { "message": "Create a secret" @@ -8147,7 +8156,7 @@ "message": "Import secrets" }, "getStarted": { - "message": "Get started" + "message": "Kom i gang" }, "complete": { "message": "$COMPLETED$/$TOTAL$ Complete", @@ -8266,7 +8275,7 @@ "message": "Update KDF settings" }, "loginInitiated": { - "message": "Login initiated" + "message": "Innlogging igangsatt" }, "rememberThisDeviceToMakeFutureLoginsSeamless": { "message": "Remember this device to make future logins seamless" @@ -8275,25 +8284,25 @@ "message": "Device approval required. Select an approval option below:" }, "deviceApprovalRequiredV2": { - "message": "Device approval required" + "message": "Enhetsgodkjennelse kreves" }, "selectAnApprovalOptionBelow": { "message": "Select an approval option below" }, "rememberThisDevice": { - "message": "Remember this device" + "message": "Husk denne enheten" }, "uncheckIfPublicDevice": { "message": "Uncheck if using a public device" }, "approveFromYourOtherDevice": { - "message": "Approve from your other device" + "message": "Godkjenn fra en av dine andre enheter" }, "requestAdminApproval": { - "message": "Request admin approval" + "message": "Be om administratorgodkjennelse" }, "approveWithMasterPassword": { - "message": "Approve with master password" + "message": "Godkjenn med hovedpassord" }, "trustedDeviceEncryption": { "message": "Trusted device encryption" @@ -8338,7 +8347,7 @@ "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": "av $TOTAL$", "placeholders": { "total": { "content": "$1", @@ -8356,7 +8365,7 @@ } }, "verificationRequired": { - "message": "Verification required", + "message": "Verifisering kreves", "description": "Default title for the user verification dialog." }, "recoverAccount": { @@ -8393,7 +8402,7 @@ "message": "Device info" }, "time": { - "message": "Time" + "message": "Tid" }, "denyAllRequests": { "message": "Deny all requests" @@ -8492,7 +8501,7 @@ } }, "next": { - "message": "Next" + "message": "Neste" }, "ssoLoginIsRequired": { "message": "SSO login is required" @@ -8507,16 +8516,16 @@ "message": "Admin approval requested" }, "adminApprovalRequestSentToAdmins": { - "message": "Your request has been sent to your admin." + "message": "Forespørselen din har blitt sendt til administratoren din." }, "youWillBeNotifiedOnceApproved": { - "message": "You will be notified once approved." + "message": "Du vil bli varslet når det er godkjent." }, "troubleLoggingIn": { - "message": "Trouble logging in?" + "message": "Har du problemer med å logge inn?" }, "loginApproved": { - "message": "Login approved" + "message": "Innlogging godkjent" }, "userEmailMissing": { "message": "User email missing" @@ -8525,18 +8534,18 @@ "message": "Active user email not found. Logging you out." }, "deviceTrusted": { - "message": "Device trusted" + "message": "Enheten er betrodd" }, "sendsNoItemsTitle": { - "message": "No active Sends", + "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": "Use Send to securely share encrypted information with anyone.", + "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." }, "inviteUsers": { - "message": "Invite Users" + "message": "Inviter brukere" }, "secretsManagerForPlan": { "message": "Secrets Manager for $PLAN$", @@ -8659,7 +8668,7 @@ "message": "Max potential service account cost" }, "loggedInExclamation": { - "message": "Logged in!" + "message": "Innlogget!" }, "beta": { "message": "Beta" @@ -8671,32 +8680,29 @@ "message": "Edited collections" }, "baseUrl": { - "message": "Server URL" + "message": "Tjener-URL" }, "selfHostBaseUrl": { "message": "Self-host server URL", "description": "Label for field requesting a self-hosted integration service URL" }, - "aliasDomain": { - "message": "Alias domain" - }, "alreadyHaveAccount": { - "message": "Already have an account?" + "message": "Har du allerede en konto?" }, "toggleSideNavigation": { "message": "Toggle side navigation" }, "skipToContent": { - "message": "Skip to content" + "message": "Hopp frem til innholdet" }, "managePermissionRequired": { "message": "At least one member or group must have can manage permission." }, "typePasskey": { - "message": "Passkey" + "message": "Passnøkkel" }, "passkeyNotCopied": { - "message": "Passkey will not be copied" + "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?" @@ -8711,7 +8717,7 @@ } }, "seeDetailedInstructions": { - "message": "See detailed instructions on our help site at", + "message": "Se detaljerte instruksjoner på hjelpesidene våre på", "description": "This is followed a by a hyperlink to the help website." }, "installBrowserExtension": { @@ -8741,11 +8747,11 @@ "readOnlyCollectionAccess": { "message": "You do not have access to manage this collection." }, - "grantAddAccessCollectionWarningTitle": { - "message": "Missing Can Manage Permissions" + "grantManageCollectionWarningTitle": { + "message": "Missing Manage Collection Permissions" }, - "grantAddAccessCollectionWarning": { - "message": "Grant Can manage permissions to allow full collection management including deletion of collection." + "grantManageCollectionWarning": { + "message": "Grant Manage collection permissions to allow full collection management including deletion of collection." }, "grantCollectionAccess": { "message": "Grant groups or members access to this collection." @@ -8760,7 +8766,7 @@ "message": "Service account access updated" }, "commonImportFormats": { - "message": "Common formats", + "message": "Vanlige formater", "description": "Label indicating the most common import formats" }, "maintainYourSubscription": { @@ -8837,7 +8843,7 @@ "message": "Provider Portal" }, "success": { - "message": "Success" + "message": "Suksess" }, "restrictedGroupAccess": { "message": "You cannot add yourself to groups." @@ -8846,10 +8852,10 @@ "message": "You cannot add yourself to collections." }, "assign": { - "message": "Assign" + "message": "Knytt" }, "assignToCollections": { - "message": "Assign to collections" + "message": "Legg til i samlinger" }, "assignToTheseCollections": { "message": "Assign to these collections" @@ -8861,7 +8867,7 @@ "message": "Only organization members with access to these collections will be able to see the items." }, "selectCollectionsToAssign": { - "message": "Select collections to assign" + "message": "Velg samlinger å tilordne" }, "noCollectionsAssigned": { "message": "No collections have been assigned" @@ -8883,25 +8889,25 @@ } }, "addField": { - "message": "Add field" + "message": "Legg til felt" }, "editField": { - "message": "Edit field" + "message": "Rediger felt" }, "items": { - "message": "Items" + "message": "Gjenstander" }, "assignedSeats": { "message": "Assigned seats" }, "assigned": { - "message": "Assigned" + "message": "Tildelt" }, "used": { - "message": "Used" + "message": "Brukt" }, "remaining": { - "message": "Remaining" + "message": "Gjenstår" }, "unlinkOrganization": { "message": "Unlink organization" @@ -8929,11 +8935,11 @@ "description": "A subscription status label." }, "pastDue": { - "message": "Past due", + "message": "Forbi måldatoen", "description": "A subscription status label" }, "subscriptionExpired": { - "message": "Subscription expired", + "message": "Abonnement har utløpt", "description": "The date header used when a subscription is past due." }, "pastDueWarningForChargeAutomatically": { @@ -9189,7 +9195,7 @@ "description": "The title for the section that deals with integrations and SDKs." }, "integrations": { - "message": "Integrations" + "message": "Integreringer" }, "integrationsDesc": { "message": "Automatically sync secrets from Bitwarden Secrets Manager to a third-party service." @@ -9201,7 +9207,7 @@ "message": "Use Bitwarden Secrets Manager SDK in the following programming languages to build your own applications." }, "ssoDescStart": { - "message": "Configure", + "message": "Sett opp", "description": "This represents the beginning of a sentence, broken up to include links. The full sentence will be 'Configure single sign-on for Bitwarden using the implementation guide for your Identity Provider." }, "ssoDescEnd": { @@ -9215,7 +9221,7 @@ "message": "SCIM" }, "scimIntegrationDescStart": { - "message": "Configure ", + "message": "Sett opp ", "description": "This represents the beginning of a sentence, broken up to include links. The full sentence will be 'Configure SCIM (System for Cross-domain Identity Management) to automatically provision users and groups to Bitwarden using the implementation guide for your Identity Provider" }, "scimIntegrationDescEnd": { @@ -9355,7 +9361,7 @@ "message": "Enter your Enterprise organization information" }, "viewItemsIn": { - "message": "View items in $NAME$", + "message": "Vis gjenstander i $NAME$", "description": "Button to view the contents of a folder or collection", "placeholders": { "name": { @@ -9365,7 +9371,7 @@ } }, "backTo": { - "message": "Back to $NAME$", + "message": "Tilbake til $NAME$", "description": "Navigate back to a previous folder or collection", "placeholders": { "name": { @@ -9375,11 +9381,11 @@ } }, "back": { - "message": "Back", + "message": "Tilbake", "description": "Button text to navigate back" }, "removeItem": { - "message": "Remove $NAME$", + "message": "Fjern $NAME$", "description": "Remove a selected option, such as a folder or collection", "placeholders": { "name": { @@ -9473,7 +9479,7 @@ "message": "Unverified" }, "verified": { - "message": "Verified" + "message": "Verifisert" }, "viewSecret": { "message": "View secret" @@ -9492,7 +9498,7 @@ "message": "Quickly view member access across the organization by upgrading to an Enterprise plan." }, "date": { - "message": "Date" + "message": "Dato" }, "exportClientReport": { "message": "Export client report" @@ -9519,13 +9525,13 @@ "message": "On" }, "memberAccessReportTwoFactorEnabledFalse": { - "message": "Off" + "message": "Av" }, "memberAccessReportAuthenticationEnabledTrue": { "message": "On" }, "memberAccessReportAuthenticationEnabledFalse": { - "message": "Off" + "message": "Av" }, "higherKDFIterations": { "message": "Higher KDF iterations can help protect your master password from being brute forced by an attacker." @@ -9570,7 +9576,7 @@ "message": "This action will remove your access to this secret." }, "invoice": { - "message": "Invoice" + "message": "Faktura" }, "unassignedSeatsAvailable": { "message": "You have $SEATS$ unassigned seats available.", @@ -9597,7 +9603,7 @@ "message": "Client details" }, "downloadCSV": { - "message": "Download CSV" + "message": "Last ned CSV" }, "monthlySubscriptionUserSeatsMessage": { "message": "Adjustments to your subscription will result in prorated charges to your billing totals on your next billing period. " @@ -9631,7 +9637,7 @@ "message": "Add to folder" }, "selectFolder": { - "message": "Select folder" + "message": "Velg mappe" }, "personalItemTransferWarningSingular": { "message": "1 item will be permanently transferred to the selected organization. You will no longer own this item." @@ -9683,13 +9689,13 @@ "message": "Project IDs" }, "projectId": { - "message": "Project ID" + "message": "Prosjekt-ID" }, "projectsAccessedByMachineAccount": { "message": "The following projects can be accessed by this machine account." }, "config": { - "message": "Config" + "message": "Oppsett" }, "learnMoreAboutEmergencyAccess": { "message": "Learn more about emergency access" @@ -9830,22 +9836,22 @@ "message": "Key algorithm" }, "sshPrivateKey": { - "message": "Private key" + "message": "Privat nøkkel" }, "sshPublicKey": { - "message": "Public key" + "message": "Offentlig nøkkel" }, "sshFingerprint": { - "message": "Fingerprint" + "message": "Fingeravtrykk" }, "sshKeyFingerprint": { - "message": "Fingerprint" + "message": "Fingeravtrykk" }, "sshKeyPrivateKey": { - "message": "Private key" + "message": "Privat nøkkel" }, "sshKeyPublicKey": { - "message": "Public key" + "message": "Offentlig nøkkel" }, "sshKeyAlgorithmED25519": { "message": "ED25519" @@ -9881,7 +9887,7 @@ "message": "Passwordless SSO" }, "accountRecovery": { - "message": "Account recovery" + "message": "Kontogjenoppretting" }, "customRoles": { "message": "Custom roles" @@ -9899,13 +9905,13 @@ "message": "Up to 20 machine accounts" }, "current": { - "message": "Current" + "message": "Nåværende" }, "secretsManagerSubscriptionInfo": { "message": "Your Secrets Manager subscription will upgrade based on the plan selected" }, "bitwardenPasswordManager": { - "message": "Bitwarden Password Manager" + "message": "Bitwarden passordbehandler" }, "secretsManagerComplimentaryPasswordManager": { "message": "Your complimentary one year Password Manager subscription will upgrade to the selected plan. You will not be charged until the complimentary period is over." @@ -9914,20 +9920,20 @@ "message": "File saved to device. Manage from your device downloads." }, "publicApi": { - "message": "Public API", + "message": "Offentlig API", "description": "The text, 'API', is an acronym and should not be translated." }, "showCharacterCount": { - "message": "Show character count" + "message": "Vis tegntelleren" }, "hideCharacterCount": { - "message": "Hide character count" + "message": "Skjul tegntelleren" }, "editAccess": { "message": "Edit access" }, "textHelpText": { - "message": "Use text fields for data like security questions" + "message": "Bruk tekstfelter for data som sikkerhetsspørsmål" }, "hiddenHelpText": { "message": "Use hidden fields for sensitive data like a password" @@ -9942,15 +9948,15 @@ "message": "Enter the the field's html id, name, aria-label, or placeholder." }, "uppercaseDescription": { - "message": "Include uppercase characters", + "message": "Inkluder store bokstaver", "description": "Tooltip for the password generator uppercase character checkbox" }, "uppercaseLabel": { - "message": "A-Z", + "message": "A-Å", "description": "Label for the password generator uppercase character checkbox" }, "lowercaseDescription": { - "message": "Include lowercase characters", + "message": "Inkluder små bokstaver", "description": "Full description for the password generator lowercase character checkbox" }, "lowercaseLabel": { @@ -9958,7 +9964,7 @@ "description": "Label for the password generator lowercase character checkbox" }, "numbersDescription": { - "message": "Include numbers", + "message": "Inkluder tall", "description": "Full description for the password generator numbers checkbox" }, "numbersLabel": { @@ -9966,7 +9972,7 @@ "description": "Label for the password generator numbers checkbox" }, "specialCharactersDescription": { - "message": "Include special characters", + "message": "Inkluder spesialtegn", "description": "Full description for the password generator special characters checkbox" }, "specialCharactersLabel": { @@ -9974,10 +9980,10 @@ "description": "Label for the password generator special characters checkbox" }, "addAttachment": { - "message": "Add attachment" + "message": "Legg til vedlegg" }, "maxFileSizeSansPunctuation": { - "message": "Maximum file size is 500 MB" + "message": "Maksimal filstørrelse er 500 MB" }, "permanentlyDeleteAttachmentConfirmation": { "message": "Are you sure you want to permanently delete this attachment?" @@ -10091,11 +10097,20 @@ "descriptorCode": { "message": "Descriptor code" }, + "cannotRemoveViewOnlyCollections": { + "message": "You cannot remove collections with View only permissions: $COLLECTIONS$", + "placeholders": { + "collections": { + "content": "$1", + "example": "Work, Personal" + } + } + }, "importantNotice": { - "message": "Important notice" + "message": "Viktig melding" }, "setupTwoStepLogin": { - "message": "Set up two-step login" + "message": "Sett opp 2-trinnspålogging" }, "newDeviceVerificationNoticeContentPage1": { "message": "Bitwarden will send a code to your account email to verify logins from new devices starting in February 2025." @@ -10104,7 +10119,7 @@ "message": "You can set up two-step login as an alternative way to protect your account or change your email to one you can access." }, "remindMeLater": { - "message": "Remind me later" + "message": "Minn meg på det senere" }, "newDeviceVerificationNoticePageOneFormContent": { "message": "Do you have reliable access to your email, $EMAIL$?", @@ -10122,16 +10137,16 @@ "message": "Yes, I can reliably access my email" }, "turnOnTwoStepLogin": { - "message": "Turn on two-step login" + "message": "Slå på 2-trinnsinnlogging" }, "changeAcctEmail": { - "message": "Change account email" + "message": "Endre kontoens E-postadresse" }, "removeMembers": { "message": "Remove members" }, "devices": { - "message": "Devices" + "message": "Enheter" }, "deviceListDescription": { "message": "Your account was logged in to each of the devices below. If you do not recognize a device, remove it now." @@ -10281,5 +10296,54 @@ "example": "Acme c" } } + }, + "accountDeprovisioningNotification": { + "message": "Administrators now have the ability to delete member accounts that belong to a claimed domain." + }, + "deleteManagedUserWarningDesc": { + "message": "This action will delete the member account including all items in their vault. This replaces the previous Remove action." + }, + "deleteManagedUserWarning": { + "message": "Delete is a new action!" + }, + "seatsRemaining": { + "message": "You have $REMAINING$ seats remaining out of $TOTAL$ seats assigned to this organization. Contact your provider to manage your subscription.", + "placeholders": { + "remaining": { + "content": "$1", + "example": "5" + }, + "total": { + "content": "$2", + "example": "10" + } + } + }, + "existingOrganization": { + "message": "Existing organization" + }, + "selectOrganizationProviderPortal": { + "message": "Select an organization to add to your Provider Portal." + }, + "noOrganizations": { + "message": "There are no organizations to list" + }, + "yourProviderSubscriptionCredit": { + "message": "Your provider subscription will receive a credit for any remaining time in the organization's subscription." + }, + "doYouWantToAddThisOrg": { + "message": "Do you want to add this organization to $PROVIDER$?", + "placeholders": { + "provider": { + "content": "$1", + "example": "Cool MSP" + } + } + }, + "addedExistingOrganization": { + "message": "Added existing organization" + }, + "assignedExceedsAvailable": { + "message": "Assigned seats exceed available seats." } } diff --git a/apps/web/src/locales/ne/messages.json b/apps/web/src/locales/ne/messages.json index 60c19be21fc..20ceae6f33b 100644 --- a/apps/web/src/locales/ne/messages.json +++ b/apps/web/src/locales/ne/messages.json @@ -464,6 +464,18 @@ "editFolder": { "message": "Edit folder" }, + "newFolder": { + "message": "New folder" + }, + "folderName": { + "message": "Folder name" + }, + "folderHintText": { + "message": "Nest a folder by adding the parent folder's name followed by a “/”. Example: Social/Forums" + }, + "deleteFolderPermanently": { + "message": "Are you sure you want to permanently delete this folder?" + }, "baseDomain": { "message": "Base domain", "description": "Domain name. Example: website.com" @@ -728,15 +740,6 @@ "itemName": { "message": "Item name" }, - "cannotRemoveViewOnlyCollections": { - "message": "You cannot remove collections with View only permissions: $COLLECTIONS$", - "placeholders": { - "collections": { - "content": "$1", - "example": "Work, Personal" - } - } - }, "ex": { "message": "ex.", "description": "Short abbreviation for 'example'." @@ -1182,6 +1185,9 @@ "logInInitiated": { "message": "Log in initiated" }, + "logInRequestSent": { + "message": "Request sent" + }, "submit": { "message": "Submit" }, @@ -1371,12 +1377,39 @@ "notificationSentDevice": { "message": "A notification has been sent to your device." }, + "notificationSentDevicePart1": { + "message": "Unlock Bitwarden on your device or on the " + }, + "areYouTryingToAccessYourAccount": { + "message": "Are you trying to access your account?" + }, + "accessAttemptBy": { + "message": "Access attempt by $EMAIL$", + "placeholders": { + "email": { + "content": "$1", + "example": "name@example.com" + } + } + }, + "confirmAccess": { + "message": "Confirm access" + }, + "denyAccess": { + "message": "Deny access" + }, + "notificationSentDeviceAnchor": { + "message": "web app" + }, + "notificationSentDevicePart2": { + "message": "Make sure the Fingerprint phrase matches the one below before approving." + }, + "notificationSentDeviceComplete": { + "message": "Unlock Bitwarden on your device. Make sure the Fingerprint phrase matches the one below before approving." + }, "aNotificationWasSentToYourDevice": { "message": "A notification was sent to your device" }, - "makeSureYourAccountIsUnlockedAndTheFingerprintEtc": { - "message": "Make sure your account is unlocked and the fingerprint phrase matches on the other device" - }, "versionNumber": { "message": "Version $VERSION_NUMBER$", "placeholders": { @@ -1664,9 +1697,6 @@ "message": "Avoid ambiguous characters", "description": "Label for the avoid ambiguous characters checkbox." }, - "regeneratePassword": { - "message": "Regenerate password" - }, "length": { "message": "Length" }, @@ -2170,8 +2200,20 @@ "manage": { "message": "Manage" }, - "canManage": { - "message": "Can manage" + "manageCollection": { + "message": "Manage collection" + }, + "viewItems": { + "message": "View items" + }, + "viewItemsHidePass": { + "message": "View items, hidden passwords" + }, + "editItems": { + "message": "Edit items" + }, + "editItemsHidePass": { + "message": "Edit items, hidden passwords" }, "disable": { "message": "Turn off" @@ -2368,11 +2410,8 @@ "twoFactorU2fProblemReadingTryAgain": { "message": "There was a problem reading the security key. Try again." }, - "twoFactorWebAuthnWarning": { - "message": "Due to platform limitations, WebAuthn cannot be used on all Bitwarden applications. You should set up another two-step login provider so that you can access your account when WebAuthn cannot be used. Supported platforms:" - }, - "twoFactorWebAuthnSupportWeb": { - "message": "Web vault and browser extensions on a desktop/laptop with a WebAuthn supported browser (Chrome, Opera, Vivaldi, or Firefox with FIDO U2F turned on)." + "twoFactorWebAuthnWarning1": { + "message": "Due to platform limitations, WebAuthn cannot be used on all Bitwarden applications. You should set up another two-step login provider so that you can access your account when WebAuthn cannot be used." }, "twoFactorRecoveryYourCode": { "message": "Your Bitwarden two-step login recovery code" @@ -4710,9 +4749,6 @@ "passwordGeneratorPolicyDesc": { "message": "Set requirements for password generator." }, - "passwordGeneratorPolicyInEffect": { - "message": "One or more organization policies are affecting your generator settings." - }, "masterPasswordPolicyInEffect": { "message": "One or more organization policies require your master password to meet the following requirements:" }, @@ -6681,15 +6717,6 @@ "message": "Generator", "description": "Short for 'credential generator'." }, - "whatWouldYouLikeToGenerate": { - "message": "What would you like to generate?" - }, - "passwordType": { - "message": "Password type" - }, - "regenerateUsername": { - "message": "Regenerate username" - }, "generateUsername": { "message": "Generate username" }, @@ -6730,9 +6757,6 @@ } } }, - "usernameType": { - "message": "Username type" - }, "plusAddressedEmail": { "message": "Plus addressed email", "description": "Username generator option that appends a random sub-address to the username. For example: address+subaddress@email.com" @@ -6952,9 +6976,6 @@ "message": "Hostname", "description": "Part of a URL." }, - "apiAccessToken": { - "message": "API access token" - }, "deviceVerification": { "message": "Device verification" }, @@ -7666,18 +7687,6 @@ "noCollection": { "message": "No collection" }, - "canView": { - "message": "Can view" - }, - "canViewExceptPass": { - "message": "Can view, except passwords" - }, - "canEdit": { - "message": "Can edit" - }, - "canEditExceptPass": { - "message": "Can edit, except passwords" - }, "noCollectionsAdded": { "message": "No collections added" }, @@ -8677,9 +8686,6 @@ "message": "Self-host server URL", "description": "Label for field requesting a self-hosted integration service URL" }, - "aliasDomain": { - "message": "Alias domain" - }, "alreadyHaveAccount": { "message": "Already have an account?" }, @@ -8741,11 +8747,11 @@ "readOnlyCollectionAccess": { "message": "You do not have access to manage this collection." }, - "grantAddAccessCollectionWarningTitle": { - "message": "Missing Can Manage Permissions" + "grantManageCollectionWarningTitle": { + "message": "Missing Manage Collection Permissions" }, - "grantAddAccessCollectionWarning": { - "message": "Grant Can manage permissions to allow full collection management including deletion of collection." + "grantManageCollectionWarning": { + "message": "Grant Manage collection permissions to allow full collection management including deletion of collection." }, "grantCollectionAccess": { "message": "Grant groups or members access to this collection." @@ -10091,6 +10097,15 @@ "descriptorCode": { "message": "Descriptor code" }, + "cannotRemoveViewOnlyCollections": { + "message": "You cannot remove collections with View only permissions: $COLLECTIONS$", + "placeholders": { + "collections": { + "content": "$1", + "example": "Work, Personal" + } + } + }, "importantNotice": { "message": "Important notice" }, @@ -10281,5 +10296,54 @@ "example": "Acme c" } } + }, + "accountDeprovisioningNotification": { + "message": "Administrators now have the ability to delete member accounts that belong to a claimed domain." + }, + "deleteManagedUserWarningDesc": { + "message": "This action will delete the member account including all items in their vault. This replaces the previous Remove action." + }, + "deleteManagedUserWarning": { + "message": "Delete is a new action!" + }, + "seatsRemaining": { + "message": "You have $REMAINING$ seats remaining out of $TOTAL$ seats assigned to this organization. Contact your provider to manage your subscription.", + "placeholders": { + "remaining": { + "content": "$1", + "example": "5" + }, + "total": { + "content": "$2", + "example": "10" + } + } + }, + "existingOrganization": { + "message": "Existing organization" + }, + "selectOrganizationProviderPortal": { + "message": "Select an organization to add to your Provider Portal." + }, + "noOrganizations": { + "message": "There are no organizations to list" + }, + "yourProviderSubscriptionCredit": { + "message": "Your provider subscription will receive a credit for any remaining time in the organization's subscription." + }, + "doYouWantToAddThisOrg": { + "message": "Do you want to add this organization to $PROVIDER$?", + "placeholders": { + "provider": { + "content": "$1", + "example": "Cool MSP" + } + } + }, + "addedExistingOrganization": { + "message": "Added existing organization" + }, + "assignedExceedsAvailable": { + "message": "Assigned seats exceed available seats." } } diff --git a/apps/web/src/locales/nl/messages.json b/apps/web/src/locales/nl/messages.json index fa40759c62a..6da0edc72c8 100644 --- a/apps/web/src/locales/nl/messages.json +++ b/apps/web/src/locales/nl/messages.json @@ -464,6 +464,18 @@ "editFolder": { "message": "Map bewerken" }, + "newFolder": { + "message": "Nieuwe map" + }, + "folderName": { + "message": "Mapnaam" + }, + "folderHintText": { + "message": "Je kunt een map onderbrengen door het toevoegen van de naam van de bovenliggende map gevolgd door een \"/\". Voorbeeld: Social/Forums" + }, + "deleteFolderPermanently": { + "message": "Weet je zeker dat je deze map definitief wilt verwijderen?" + }, "baseDomain": { "message": "Basisdomein", "description": "Domain name. Example: website.com" @@ -728,15 +740,6 @@ "itemName": { "message": "Itemnaam" }, - "cannotRemoveViewOnlyCollections": { - "message": "Je kunt verzamelingen niet verwijderen met alleen rechten voor weergeven: $COLLECTIONS$", - "placeholders": { - "collections": { - "content": "$1", - "example": "Work, Personal" - } - } - }, "ex": { "message": "bijv.", "description": "Short abbreviation for 'example'." @@ -1182,6 +1185,9 @@ "logInInitiated": { "message": "Inloggen gestart" }, + "logInRequestSent": { + "message": "Verzoek verzonden" + }, "submit": { "message": "Versturen" }, @@ -1371,12 +1377,39 @@ "notificationSentDevice": { "message": "Er is een bericht naar je apparaat verstuurd." }, + "notificationSentDevicePart1": { + "message": "Ontgrendel Bitwarden op je apparaat of op de " + }, + "areYouTryingToAccessYourAccount": { + "message": "Probeer je toegang te krijgen tot je account?" + }, + "accessAttemptBy": { + "message": "Inlogpoging door $EMAIL$", + "placeholders": { + "email": { + "content": "$1", + "example": "name@example.com" + } + } + }, + "confirmAccess": { + "message": "Toegang bevestigen" + }, + "denyAccess": { + "message": "Toegang weigeren" + }, + "notificationSentDeviceAnchor": { + "message": "webapp" + }, + "notificationSentDevicePart2": { + "message": "Zorg ervoor dat de vingerafdrukzin overeenkomt met de onderstaande voor je deze goedkeurt." + }, + "notificationSentDeviceComplete": { + "message": "Ontgrendel Bitwarden op je apparaat. Zorg ervoor dat de vingerafdrukzin overeenkomt met de onderstaande voor je deze goedkeurt." + }, "aNotificationWasSentToYourDevice": { "message": "Er is een melding naar je apparaat verzonden" }, - "makeSureYourAccountIsUnlockedAndTheFingerprintEtc": { - "message": "Zorg ervoor dat je kluis is ontgrendeld en de vingerafdrukzin hetzelfde is op het andere apparaat" - }, "versionNumber": { "message": "Versie $VERSION_NUMBER$", "placeholders": { @@ -1664,9 +1697,6 @@ "message": "Dubbelzinnige tekens vermijden", "description": "Label for the avoid ambiguous characters checkbox." }, - "regeneratePassword": { - "message": "Opnieuw genereren" - }, "length": { "message": "Lengte" }, @@ -1858,10 +1888,10 @@ "message": "Inlogbescherming nieuwe apparaten inschakelen" }, "turnOffNewDeviceLoginProtectionModalDesc": { - "message": "Ga hieronder verder voor het uitschakelen van de e-mailverificatieberichten die Bitwarden stuurt wanneer je inlogt vanaf een nieuw apparaat." + "message": "Ga hieronder verder voor het uitschakelen van de verificatie e-mails die Bitwarden stuurt wanneer je inlogt vanaf een nieuw apparaat." }, "turnOnNewDeviceLoginProtectionModalDesc": { - "message": "Ga hieronder verder om Bitwarden verificatie e-mails te sturen wanneer je inlogt vanaf een nieuw apparaat.\n\nGa hieronder verder om Bitwarden e-mailverificatieberichten te laten sturen wanneer je inlogt vanaf een nieuw apparaat." + "message": "Ga hieronder verder om Bitwarden verificatie e-mails te sturen wanneer je inlogt vanaf een nieuw apparaat." }, "turnOffNewDeviceLoginProtectionWarning": { "message": "Als je inlogbescherming voor nieuwe apparaten uitschakelt, kan iedereen op ieder apparaat met je hoofdwachtwoord inloggen. Stel tweestapsaanmelding in om je account te beschermen zonder e-mailverificatieberichten." @@ -2170,8 +2200,20 @@ "manage": { "message": "Beheren" }, - "canManage": { - "message": "Kan beheren" + "manageCollection": { + "message": "Collectie beheren" + }, + "viewItems": { + "message": "Items bekijken" + }, + "viewItemsHidePass": { + "message": "Items bekijken, verborgen wachtwoorden" + }, + "editItems": { + "message": "Items bewerken" + }, + "editItemsHidePass": { + "message": "Items bewerken, verborgen wachtwoorden" }, "disable": { "message": "Uitschakelen" @@ -2368,11 +2410,8 @@ "twoFactorU2fProblemReadingTryAgain": { "message": "Er was een probleem met het lezen van de beveiligingssleutel. Probeer het nogmaals." }, - "twoFactorWebAuthnWarning": { - "message": "Vanwege platformbeperkingen kan WebAuthn niet in alle Bitwarden applicaties gebruikt worden. Stel een andere tweestapsaanmeldingsaanbieder in zodat je je account kunt benaderen wanneer WebAuthn niet beschikbaar is. De volgende platformen worden ondersteund:" - }, - "twoFactorWebAuthnSupportWeb": { - "message": "Webkluis en browser-extensies op een desktop/laptop met een browser met ondersteuning voor WebAuthn (Chrome, Opera, Vivaldi of Firefox met FIDO U2F ingeschakeld)." + "twoFactorWebAuthnWarning1": { + "message": "Vanwege platformbeperkingen kan WebAuthn niet in alle Bitwarden-applicaties gebruikt worden. Stel een andere tweestapsaanmeldingsaanbieder in zodat je je account kunt benaderen wanneer WebAuthn niet beschikbaar is." }, "twoFactorRecoveryYourCode": { "message": "Je herstelcode voor Bitwarden-tweestapsaanmelding" @@ -4710,9 +4749,6 @@ "passwordGeneratorPolicyDesc": { "message": "Stel minimale vereisten in voor de configuratie van het wachtwoord generator." }, - "passwordGeneratorPolicyInEffect": { - "message": "Een of meer organisatiebeleidseisen heeft invloed op de instellingen van je generator." - }, "masterPasswordPolicyInEffect": { "message": "Een of meer organisatiebeleidseisen stelt de volgende eisen aan je hoofdwachtwoord:" }, @@ -6681,15 +6717,6 @@ "message": "Generator", "description": "Short for 'credential generator'." }, - "whatWouldYouLikeToGenerate": { - "message": "Wat wil je genereren?" - }, - "passwordType": { - "message": "Type wachtwoord" - }, - "regenerateUsername": { - "message": "Gebruikersnaam opnieuw genereren" - }, "generateUsername": { "message": "Gebruikersnaam genereren" }, @@ -6730,9 +6757,6 @@ } } }, - "usernameType": { - "message": "Type gebruikersnaam" - }, "plusAddressedEmail": { "message": "E-mailadres-met-plus", "description": "Username generator option that appends a random sub-address to the username. For example: address+subaddress@email.com" @@ -6952,9 +6976,6 @@ "message": "Hostnaam", "description": "Part of a URL." }, - "apiAccessToken": { - "message": "API-toegangstoken" - }, "deviceVerification": { "message": "Apparaatverificatie" }, @@ -7666,18 +7687,6 @@ "noCollection": { "message": "Geen collectie" }, - "canView": { - "message": "Kan bekijken" - }, - "canViewExceptPass": { - "message": "Kan bekijken, behalve wachtwoorden" - }, - "canEdit": { - "message": "Kan bewerken" - }, - "canEditExceptPass": { - "message": "Kan bewerken, behalve wachtwoorden" - }, "noCollectionsAdded": { "message": "Geen collecties toegevoegd" }, @@ -8677,9 +8686,6 @@ "message": "URL zelfgehoste server", "description": "Label for field requesting a self-hosted integration service URL" }, - "aliasDomain": { - "message": "Aliasdomein" - }, "alreadyHaveAccount": { "message": "Heb je al een account?" }, @@ -8741,11 +8747,11 @@ "readOnlyCollectionAccess": { "message": "Je hebt geen toegang om deze collectie te beheren." }, - "grantAddAccessCollectionWarningTitle": { - "message": "Ontbrekende Kan beheren machtigingen" + "grantManageCollectionWarningTitle": { + "message": "Recht voor het beheren van machtigingen ontbreekt" }, - "grantAddAccessCollectionWarning": { - "message": "Kan beheren machtigingen verlenen voor volledig verzamelingsbeheer, inclusief het verwijderen van verzamelingen." + "grantManageCollectionWarning": { + "message": "Beheren van machtigingen toekennen voor het toestaan van het volledig verzamelingenbeheer, inclusief het verwijderen van een verzameling." }, "grantCollectionAccess": { "message": "Groepen of mensen toegang tot deze collectie geven." @@ -10091,6 +10097,15 @@ "descriptorCode": { "message": "Code bankafschrift" }, + "cannotRemoveViewOnlyCollections": { + "message": "Je kunt verzamelingen niet verwijderen met alleen rechten voor weergeven: $COLLECTIONS$", + "placeholders": { + "collections": { + "content": "$1", + "example": "Work, Personal" + } + } + }, "importantNotice": { "message": "Belangrijke mededeling" }, @@ -10281,5 +10296,54 @@ "example": "Acme c" } } + }, + "accountDeprovisioningNotification": { + "message": "Beheerders hebben nu de mogelijkheid om leden van een geclaimd domein te verwijderen." + }, + "deleteManagedUserWarningDesc": { + "message": "Deze actie verwijdert het account van het lid, inclusief alle items in hun kluis. Dit vervangt de vorige verwijderactie." + }, + "deleteManagedUserWarning": { + "message": "Verwijderen is een nieuwe actie!" + }, + "seatsRemaining": { + "message": "Je hebt nog $REMAINING$ plaatsen van de $TOTAL$ plaatsen die aan deze organisatie zijn toegewezen. Neem contact op met je provider om je abonnement te beheren.", + "placeholders": { + "remaining": { + "content": "$1", + "example": "5" + }, + "total": { + "content": "$2", + "example": "10" + } + } + }, + "existingOrganization": { + "message": "Bestaande organisatie" + }, + "selectOrganizationProviderPortal": { + "message": "Kies een organisatie om aan je providerportaal toe te voegen." + }, + "noOrganizations": { + "message": "Er zijn geen organisaties om weer te geven" + }, + "yourProviderSubscriptionCredit": { + "message": "Je providerabonnement zal een credit ontvangen voor de resterende tijd van het abonnement van de organisatie." + }, + "doYouWantToAddThisOrg": { + "message": "Wilt je deze organisatie toevoegen aan $PROVIDER$?", + "placeholders": { + "provider": { + "content": "$1", + "example": "Cool MSP" + } + } + }, + "addedExistingOrganization": { + "message": "Bestaande organisatie toegevoegd" + }, + "assignedExceedsAvailable": { + "message": "Meer toegewezen dan beschikbare plaatsen." } } diff --git a/apps/web/src/locales/nn/messages.json b/apps/web/src/locales/nn/messages.json index 10547f94847..8b7682fa39c 100644 --- a/apps/web/src/locales/nn/messages.json +++ b/apps/web/src/locales/nn/messages.json @@ -464,6 +464,18 @@ "editFolder": { "message": "Rediger mappe" }, + "newFolder": { + "message": "New folder" + }, + "folderName": { + "message": "Folder name" + }, + "folderHintText": { + "message": "Nest a folder by adding the parent folder's name followed by a “/”. Example: Social/Forums" + }, + "deleteFolderPermanently": { + "message": "Are you sure you want to permanently delete this folder?" + }, "baseDomain": { "message": "Grunndomene", "description": "Domain name. Example: website.com" @@ -728,15 +740,6 @@ "itemName": { "message": "Item name" }, - "cannotRemoveViewOnlyCollections": { - "message": "You cannot remove collections with View only permissions: $COLLECTIONS$", - "placeholders": { - "collections": { - "content": "$1", - "example": "Work, Personal" - } - } - }, "ex": { "message": "t.d.", "description": "Short abbreviation for 'example'." @@ -1182,6 +1185,9 @@ "logInInitiated": { "message": "Log in initiated" }, + "logInRequestSent": { + "message": "Request sent" + }, "submit": { "message": "Submit" }, @@ -1371,12 +1377,39 @@ "notificationSentDevice": { "message": "A notification has been sent to your device." }, + "notificationSentDevicePart1": { + "message": "Unlock Bitwarden on your device or on the " + }, + "areYouTryingToAccessYourAccount": { + "message": "Are you trying to access your account?" + }, + "accessAttemptBy": { + "message": "Access attempt by $EMAIL$", + "placeholders": { + "email": { + "content": "$1", + "example": "name@example.com" + } + } + }, + "confirmAccess": { + "message": "Confirm access" + }, + "denyAccess": { + "message": "Deny access" + }, + "notificationSentDeviceAnchor": { + "message": "web app" + }, + "notificationSentDevicePart2": { + "message": "Make sure the Fingerprint phrase matches the one below before approving." + }, + "notificationSentDeviceComplete": { + "message": "Unlock Bitwarden on your device. Make sure the Fingerprint phrase matches the one below before approving." + }, "aNotificationWasSentToYourDevice": { "message": "A notification was sent to your device" }, - "makeSureYourAccountIsUnlockedAndTheFingerprintEtc": { - "message": "Make sure your account is unlocked and the fingerprint phrase matches on the other device" - }, "versionNumber": { "message": "Version $VERSION_NUMBER$", "placeholders": { @@ -1664,9 +1697,6 @@ "message": "Avoid ambiguous characters", "description": "Label for the avoid ambiguous characters checkbox." }, - "regeneratePassword": { - "message": "Regenerate password" - }, "length": { "message": "Length" }, @@ -2170,8 +2200,20 @@ "manage": { "message": "Manage" }, - "canManage": { - "message": "Can manage" + "manageCollection": { + "message": "Manage collection" + }, + "viewItems": { + "message": "View items" + }, + "viewItemsHidePass": { + "message": "View items, hidden passwords" + }, + "editItems": { + "message": "Edit items" + }, + "editItemsHidePass": { + "message": "Edit items, hidden passwords" }, "disable": { "message": "Slå av" @@ -2368,11 +2410,8 @@ "twoFactorU2fProblemReadingTryAgain": { "message": "There was a problem reading the security key. Try again." }, - "twoFactorWebAuthnWarning": { - "message": "Due to platform limitations, WebAuthn cannot be used on all Bitwarden applications. You should set up another two-step login provider so that you can access your account when WebAuthn cannot be used. Supported platforms:" - }, - "twoFactorWebAuthnSupportWeb": { - "message": "Web vault and browser extensions on a desktop/laptop with a WebAuthn supported browser (Chrome, Opera, Vivaldi, or Firefox with FIDO U2F turned on)." + "twoFactorWebAuthnWarning1": { + "message": "Due to platform limitations, WebAuthn cannot be used on all Bitwarden applications. You should set up another two-step login provider so that you can access your account when WebAuthn cannot be used." }, "twoFactorRecoveryYourCode": { "message": "Your Bitwarden two-step login recovery code" @@ -4710,9 +4749,6 @@ "passwordGeneratorPolicyDesc": { "message": "Set requirements for password generator." }, - "passwordGeneratorPolicyInEffect": { - "message": "One or more organization policies are affecting your generator settings." - }, "masterPasswordPolicyInEffect": { "message": "One or more organization policies require your master password to meet the following requirements:" }, @@ -6681,15 +6717,6 @@ "message": "Generator", "description": "Short for 'credential generator'." }, - "whatWouldYouLikeToGenerate": { - "message": "What would you like to generate?" - }, - "passwordType": { - "message": "Password type" - }, - "regenerateUsername": { - "message": "Regenerate username" - }, "generateUsername": { "message": "Generate username" }, @@ -6730,9 +6757,6 @@ } } }, - "usernameType": { - "message": "Username type" - }, "plusAddressedEmail": { "message": "Plus addressed email", "description": "Username generator option that appends a random sub-address to the username. For example: address+subaddress@email.com" @@ -6952,9 +6976,6 @@ "message": "Hostname", "description": "Part of a URL." }, - "apiAccessToken": { - "message": "API access token" - }, "deviceVerification": { "message": "Device verification" }, @@ -7666,18 +7687,6 @@ "noCollection": { "message": "No collection" }, - "canView": { - "message": "Can view" - }, - "canViewExceptPass": { - "message": "Can view, except passwords" - }, - "canEdit": { - "message": "Can edit" - }, - "canEditExceptPass": { - "message": "Can edit, except passwords" - }, "noCollectionsAdded": { "message": "No collections added" }, @@ -8677,9 +8686,6 @@ "message": "Self-host server URL", "description": "Label for field requesting a self-hosted integration service URL" }, - "aliasDomain": { - "message": "Alias domain" - }, "alreadyHaveAccount": { "message": "Already have an account?" }, @@ -8741,11 +8747,11 @@ "readOnlyCollectionAccess": { "message": "You do not have access to manage this collection." }, - "grantAddAccessCollectionWarningTitle": { - "message": "Missing Can Manage Permissions" + "grantManageCollectionWarningTitle": { + "message": "Missing Manage Collection Permissions" }, - "grantAddAccessCollectionWarning": { - "message": "Grant Can manage permissions to allow full collection management including deletion of collection." + "grantManageCollectionWarning": { + "message": "Grant Manage collection permissions to allow full collection management including deletion of collection." }, "grantCollectionAccess": { "message": "Grant groups or members access to this collection." @@ -10091,6 +10097,15 @@ "descriptorCode": { "message": "Descriptor code" }, + "cannotRemoveViewOnlyCollections": { + "message": "You cannot remove collections with View only permissions: $COLLECTIONS$", + "placeholders": { + "collections": { + "content": "$1", + "example": "Work, Personal" + } + } + }, "importantNotice": { "message": "Important notice" }, @@ -10281,5 +10296,54 @@ "example": "Acme c" } } + }, + "accountDeprovisioningNotification": { + "message": "Administrators now have the ability to delete member accounts that belong to a claimed domain." + }, + "deleteManagedUserWarningDesc": { + "message": "This action will delete the member account including all items in their vault. This replaces the previous Remove action." + }, + "deleteManagedUserWarning": { + "message": "Delete is a new action!" + }, + "seatsRemaining": { + "message": "You have $REMAINING$ seats remaining out of $TOTAL$ seats assigned to this organization. Contact your provider to manage your subscription.", + "placeholders": { + "remaining": { + "content": "$1", + "example": "5" + }, + "total": { + "content": "$2", + "example": "10" + } + } + }, + "existingOrganization": { + "message": "Existing organization" + }, + "selectOrganizationProviderPortal": { + "message": "Select an organization to add to your Provider Portal." + }, + "noOrganizations": { + "message": "There are no organizations to list" + }, + "yourProviderSubscriptionCredit": { + "message": "Your provider subscription will receive a credit for any remaining time in the organization's subscription." + }, + "doYouWantToAddThisOrg": { + "message": "Do you want to add this organization to $PROVIDER$?", + "placeholders": { + "provider": { + "content": "$1", + "example": "Cool MSP" + } + } + }, + "addedExistingOrganization": { + "message": "Added existing organization" + }, + "assignedExceedsAvailable": { + "message": "Assigned seats exceed available seats." } } diff --git a/apps/web/src/locales/or/messages.json b/apps/web/src/locales/or/messages.json index 3b8d147b95f..7e6f614b9c8 100644 --- a/apps/web/src/locales/or/messages.json +++ b/apps/web/src/locales/or/messages.json @@ -464,6 +464,18 @@ "editFolder": { "message": "Edit folder" }, + "newFolder": { + "message": "New folder" + }, + "folderName": { + "message": "Folder name" + }, + "folderHintText": { + "message": "Nest a folder by adding the parent folder's name followed by a “/”. Example: Social/Forums" + }, + "deleteFolderPermanently": { + "message": "Are you sure you want to permanently delete this folder?" + }, "baseDomain": { "message": "Base domain", "description": "Domain name. Example: website.com" @@ -728,15 +740,6 @@ "itemName": { "message": "Item name" }, - "cannotRemoveViewOnlyCollections": { - "message": "You cannot remove collections with View only permissions: $COLLECTIONS$", - "placeholders": { - "collections": { - "content": "$1", - "example": "Work, Personal" - } - } - }, "ex": { "message": "ex.", "description": "Short abbreviation for 'example'." @@ -1182,6 +1185,9 @@ "logInInitiated": { "message": "Log in initiated" }, + "logInRequestSent": { + "message": "Request sent" + }, "submit": { "message": "Submit" }, @@ -1371,12 +1377,39 @@ "notificationSentDevice": { "message": "A notification has been sent to your device." }, + "notificationSentDevicePart1": { + "message": "Unlock Bitwarden on your device or on the " + }, + "areYouTryingToAccessYourAccount": { + "message": "Are you trying to access your account?" + }, + "accessAttemptBy": { + "message": "Access attempt by $EMAIL$", + "placeholders": { + "email": { + "content": "$1", + "example": "name@example.com" + } + } + }, + "confirmAccess": { + "message": "Confirm access" + }, + "denyAccess": { + "message": "Deny access" + }, + "notificationSentDeviceAnchor": { + "message": "web app" + }, + "notificationSentDevicePart2": { + "message": "Make sure the Fingerprint phrase matches the one below before approving." + }, + "notificationSentDeviceComplete": { + "message": "Unlock Bitwarden on your device. Make sure the Fingerprint phrase matches the one below before approving." + }, "aNotificationWasSentToYourDevice": { "message": "A notification was sent to your device" }, - "makeSureYourAccountIsUnlockedAndTheFingerprintEtc": { - "message": "Make sure your account is unlocked and the fingerprint phrase matches on the other device" - }, "versionNumber": { "message": "Version $VERSION_NUMBER$", "placeholders": { @@ -1664,9 +1697,6 @@ "message": "Avoid ambiguous characters", "description": "Label for the avoid ambiguous characters checkbox." }, - "regeneratePassword": { - "message": "Regenerate password" - }, "length": { "message": "Length" }, @@ -2170,8 +2200,20 @@ "manage": { "message": "Manage" }, - "canManage": { - "message": "Can manage" + "manageCollection": { + "message": "Manage collection" + }, + "viewItems": { + "message": "View items" + }, + "viewItemsHidePass": { + "message": "View items, hidden passwords" + }, + "editItems": { + "message": "Edit items" + }, + "editItemsHidePass": { + "message": "Edit items, hidden passwords" }, "disable": { "message": "Turn off" @@ -2368,11 +2410,8 @@ "twoFactorU2fProblemReadingTryAgain": { "message": "There was a problem reading the security key. Try again." }, - "twoFactorWebAuthnWarning": { - "message": "Due to platform limitations, WebAuthn cannot be used on all Bitwarden applications. You should set up another two-step login provider so that you can access your account when WebAuthn cannot be used. Supported platforms:" - }, - "twoFactorWebAuthnSupportWeb": { - "message": "Web vault and browser extensions on a desktop/laptop with a WebAuthn supported browser (Chrome, Opera, Vivaldi, or Firefox with FIDO U2F turned on)." + "twoFactorWebAuthnWarning1": { + "message": "Due to platform limitations, WebAuthn cannot be used on all Bitwarden applications. You should set up another two-step login provider so that you can access your account when WebAuthn cannot be used." }, "twoFactorRecoveryYourCode": { "message": "Your Bitwarden two-step login recovery code" @@ -4710,9 +4749,6 @@ "passwordGeneratorPolicyDesc": { "message": "Set requirements for password generator." }, - "passwordGeneratorPolicyInEffect": { - "message": "One or more organization policies are affecting your generator settings." - }, "masterPasswordPolicyInEffect": { "message": "One or more organization policies require your master password to meet the following requirements:" }, @@ -6681,15 +6717,6 @@ "message": "Generator", "description": "Short for 'credential generator'." }, - "whatWouldYouLikeToGenerate": { - "message": "What would you like to generate?" - }, - "passwordType": { - "message": "Password type" - }, - "regenerateUsername": { - "message": "Regenerate username" - }, "generateUsername": { "message": "Generate username" }, @@ -6730,9 +6757,6 @@ } } }, - "usernameType": { - "message": "Username type" - }, "plusAddressedEmail": { "message": "Plus addressed email", "description": "Username generator option that appends a random sub-address to the username. For example: address+subaddress@email.com" @@ -6952,9 +6976,6 @@ "message": "Hostname", "description": "Part of a URL." }, - "apiAccessToken": { - "message": "API access token" - }, "deviceVerification": { "message": "Device verification" }, @@ -7666,18 +7687,6 @@ "noCollection": { "message": "No collection" }, - "canView": { - "message": "Can view" - }, - "canViewExceptPass": { - "message": "Can view, except passwords" - }, - "canEdit": { - "message": "Can edit" - }, - "canEditExceptPass": { - "message": "Can edit, except passwords" - }, "noCollectionsAdded": { "message": "No collections added" }, @@ -8677,9 +8686,6 @@ "message": "Self-host server URL", "description": "Label for field requesting a self-hosted integration service URL" }, - "aliasDomain": { - "message": "Alias domain" - }, "alreadyHaveAccount": { "message": "Already have an account?" }, @@ -8741,11 +8747,11 @@ "readOnlyCollectionAccess": { "message": "You do not have access to manage this collection." }, - "grantAddAccessCollectionWarningTitle": { - "message": "Missing Can Manage Permissions" + "grantManageCollectionWarningTitle": { + "message": "Missing Manage Collection Permissions" }, - "grantAddAccessCollectionWarning": { - "message": "Grant Can manage permissions to allow full collection management including deletion of collection." + "grantManageCollectionWarning": { + "message": "Grant Manage collection permissions to allow full collection management including deletion of collection." }, "grantCollectionAccess": { "message": "Grant groups or members access to this collection." @@ -10091,6 +10097,15 @@ "descriptorCode": { "message": "Descriptor code" }, + "cannotRemoveViewOnlyCollections": { + "message": "You cannot remove collections with View only permissions: $COLLECTIONS$", + "placeholders": { + "collections": { + "content": "$1", + "example": "Work, Personal" + } + } + }, "importantNotice": { "message": "Important notice" }, @@ -10281,5 +10296,54 @@ "example": "Acme c" } } + }, + "accountDeprovisioningNotification": { + "message": "Administrators now have the ability to delete member accounts that belong to a claimed domain." + }, + "deleteManagedUserWarningDesc": { + "message": "This action will delete the member account including all items in their vault. This replaces the previous Remove action." + }, + "deleteManagedUserWarning": { + "message": "Delete is a new action!" + }, + "seatsRemaining": { + "message": "You have $REMAINING$ seats remaining out of $TOTAL$ seats assigned to this organization. Contact your provider to manage your subscription.", + "placeholders": { + "remaining": { + "content": "$1", + "example": "5" + }, + "total": { + "content": "$2", + "example": "10" + } + } + }, + "existingOrganization": { + "message": "Existing organization" + }, + "selectOrganizationProviderPortal": { + "message": "Select an organization to add to your Provider Portal." + }, + "noOrganizations": { + "message": "There are no organizations to list" + }, + "yourProviderSubscriptionCredit": { + "message": "Your provider subscription will receive a credit for any remaining time in the organization's subscription." + }, + "doYouWantToAddThisOrg": { + "message": "Do you want to add this organization to $PROVIDER$?", + "placeholders": { + "provider": { + "content": "$1", + "example": "Cool MSP" + } + } + }, + "addedExistingOrganization": { + "message": "Added existing organization" + }, + "assignedExceedsAvailable": { + "message": "Assigned seats exceed available seats." } } diff --git a/apps/web/src/locales/pl/messages.json b/apps/web/src/locales/pl/messages.json index a299723f594..6935f334d62 100644 --- a/apps/web/src/locales/pl/messages.json +++ b/apps/web/src/locales/pl/messages.json @@ -3,22 +3,22 @@ "message": "Wszystkie aplikacje" }, "criticalApplications": { - "message": "Critical applications" + "message": "Krytyczne aplikacje" }, "accessIntelligence": { - "message": "Access Intelligence" + "message": "Dostęp do informacji" }, "riskInsights": { - "message": "Risk Insights" + "message": "Spostrzeżenia dotyczące ryzyka" }, "passwordRisk": { - "message": "Password Risk" + "message": "Ryzyko związne z hasłem" }, "reviewAtRiskPasswords": { - "message": "Review at-risk passwords (weak, exposed, or reused) across applications. Select your most critical applications to prioritize security actions for your users to address at-risk passwords." + "message": "Przejrzyj hasła zagrożone (słabe, ujawnione lub ponownie używane) we wszystkich aplikacjach. Wybierz swoje najbardziej krytyczne aplikacje, aby nadać priorytet działaniom bezpieczeństwa swoim użytkownikom, aby zająć się hasłami zagrożonymi." }, "dataLastUpdated": { - "message": "Data last updated: $DATE$", + "message": "Data ostatniej aktualizacji: $DATE$", "placeholders": { "date": { "content": "$1", @@ -30,16 +30,16 @@ "message": "Powiadomieni członkowie" }, "revokeMembers": { - "message": "Revoke members" + "message": "Unieważnij członk" }, "restoreMembers": { - "message": "Restore members" + "message": "Przywróć członków" }, "cannotRestoreAccessError": { - "message": "Cannot restore organization access" + "message": "Nie można przywrócić dostępu organizacji" }, "allApplicationsWithCount": { - "message": "All applications ($COUNT$)", + "message": "Wszystkie aplikacje ($COUNT$)", "placeholders": { "count": { "content": "$1", @@ -48,10 +48,10 @@ } }, "createNewLoginItem": { - "message": "Create new login item" + "message": "Utwórz nowy element logowania" }, "criticalApplicationsWithCount": { - "message": "Critical applications ($COUNT$)", + "message": "Aplikacje krytyczne ($COUNT$)", "placeholders": { "count": { "content": "$1", @@ -60,7 +60,7 @@ } }, "notifiedMembersWithCount": { - "message": "Notified members ($COUNT$)", + "message": "Powiadomieni członkowie ($COUNT$)", "placeholders": { "count": { "content": "$1", @@ -69,7 +69,7 @@ } }, "noAppsInOrgTitle": { - "message": "No applications found in $ORG NAME$", + "message": "Nie znaleziono aplikacji w $ORG NAME$", "placeholders": { "org name": { "content": "$1", @@ -78,43 +78,43 @@ } }, "noAppsInOrgDescription": { - "message": "As users save logins, applications appear here, showing any at-risk passwords. Mark critical apps and notify users to update passwords." + "message": "Jako użytkownicy zapisują logowania, pojawiają się tutaj aplikacje, pokazujące wszelkie hasła zagrożone. Zaznacz kluczowe aplikacje i powiadamiaj użytkowników o potrzebie aktualizacji haseł." }, "noCriticalAppsTitle": { - "message": "You haven't marked any applications as a Critical" + "message": "Nie oznaczyłeś żadnych aplikacji jako krytycznych" }, "noCriticalAppsDescription": { - "message": "Select your most critical applications to discover at-risk passwords, and notify users to change those passwords." + "message": "Wybierz najbardziej krytyczne aplikacje, aby odkryć hasła zagrożone i poinformuj użytkowników, by zmienili te hasła." }, "markCriticalApps": { - "message": "Mark critical apps" + "message": "Oznacz krytyczne aplikacje" }, "markAppAsCritical": { - "message": "Mark app as critical" + "message": "Oznacz aplikację jako krytyczną" }, "appsMarkedAsCritical": { - "message": "Apps marked as critical" + "message": "Aplikacje oznaczone jako krytyczne" }, "application": { "message": "Aplikacja" }, "atRiskPasswords": { - "message": "At-risk passwords" + "message": "Zagrożone hasła" }, "requestPasswordChange": { - "message": "Request password change" + "message": "Poproś o zmianę hasła" }, "totalPasswords": { - "message": "Total passwords" + "message": "Wszystkie hasła" }, "searchApps": { - "message": "Search applications" + "message": "Wyszukaj aplikacje" }, "atRiskMembers": { - "message": "At-risk members" + "message": "Zagrożeni użytkownicy" }, "atRiskMembersWithCount": { - "message": "At-risk members ($COUNT$)", + "message": "Zagrożeni członkowie ($COUNT$)", "placeholders": { "count": { "content": "$1", @@ -123,7 +123,7 @@ } }, "atRiskApplicationsWithCount": { - "message": "At-risk applications ($COUNT$)", + "message": "Zagrożone aplikacje ($COUNT$)", "placeholders": { "count": { "content": "$1", @@ -132,13 +132,13 @@ } }, "atRiskMembersDescription": { - "message": "These members are logging into applications with weak, exposed, or reused passwords." + "message": "Ci członkowie logują się do aplikacji ze słabymi, ujawnionymi lub ponownie używanymi hasłami." }, "atRiskApplicationsDescription": { - "message": "These applications have weak, exposed, or reused passwords." + "message": "Te aplikacje mają słabe, ujawnione lub ponownie użyte hasła." }, "atRiskMembersDescriptionWithApp": { - "message": "These members are logging into $APPNAME$ with weak, exposed, or reused passwords.", + "message": "Ci użytkownicy logują się do $APPNAME$ ze słabymi, ujawnionymi lub ponownie używanymi hasłami.", "placeholders": { "appname": { "content": "$1", @@ -147,19 +147,19 @@ } }, "totalMembers": { - "message": "Total members" + "message": "Wszyscy członkowie" }, "atRiskApplications": { - "message": "At-risk applications" + "message": "Zagrożone aplikacje" }, "totalApplications": { - "message": "Total applications" + "message": "Wszystkie aplikacje" }, "unmarkAsCriticalApp": { - "message": "Unmark as critical app" + "message": "Odznacz jako krytyczną aplikację" }, "criticalApplicationSuccessfullyUnmarked": { - "message": "Critical application successfully unmarked" + "message": "Krytyczna aplikacja została pomyślnie odznaczona" }, "whatTypeOfItem": { "message": "Jakiego rodzaju jest to element?" @@ -464,6 +464,18 @@ "editFolder": { "message": "Edytuj folder" }, + "newFolder": { + "message": "Nowy folder" + }, + "folderName": { + "message": "Nazwa folderu" + }, + "folderHintText": { + "message": "Zagnieżdżaj foldery dodając nazwę folderu nadrzędnego, a następnie “/”. Przykład: Społeczne/Fora" + }, + "deleteFolderPermanently": { + "message": "Czy na pewno chcesz trwale usunąć ten folder?" + }, "baseDomain": { "message": "Domena podstawowa", "description": "Domain name. Example: website.com" @@ -508,7 +520,7 @@ "message": "Wygeneruj hasło" }, "generatePassphrase": { - "message": "Generate passphrase" + "message": "Wygeneruj hasło wyrazowe" }, "checkPassword": { "message": "Sprawdź, czy hasło zostało ujawnione." @@ -611,7 +623,7 @@ "message": "Bezpieczna notatka" }, "typeSshKey": { - "message": "SSH key" + "message": "Klucz SSH" }, "typeLoginPlural": { "message": "Dane logowania" @@ -707,7 +719,7 @@ } }, "viewItemType": { - "message": "Zobacz $TYPE$", + "message": "Zobacz $ITEMTYPE$", "placeholders": { "itemtype": { "content": "$1", @@ -728,15 +740,6 @@ "itemName": { "message": "Nazwa elementu" }, - "cannotRemoveViewOnlyCollections": { - "message": "Nie można usunąć kolekcji z uprawnieniami tylko do przeglądania: $COLLECTIONS$", - "placeholders": { - "collections": { - "content": "$1", - "example": "Work, Personal" - } - } - }, "ex": { "message": "np.", "description": "Short abbreviation for 'example'." @@ -772,11 +775,11 @@ "description": "Copy password to clipboard" }, "copyPassphrase": { - "message": "Copy passphrase", + "message": "Skopiuj hasło wyrazowe", "description": "Copy passphrase to clipboard" }, "passwordCopied": { - "message": "Password copied" + "message": "Hasło zostało skopiowane" }, "copyUsername": { "message": "Kopiuj nazwę użytkownika", @@ -1033,7 +1036,7 @@ "message": "Logowanie za pomocą urządzenia musi być włączone w ustawieniach aplikacji Bitwarden. Potrzebujesz innej opcji?" }, "needAnotherOptionV1": { - "message": "Need another option?" + "message": "Potrzebujesz innego sposobu?" }, "loginWithMasterPassword": { "message": "Logowanie hasłem głównym" @@ -1048,13 +1051,13 @@ "message": "Użyj innej metody logowania" }, "logInWithPasskey": { - "message": "Log in with passkey" + "message": "Logowanie się za pomocą Passkey" }, "useSingleSignOn": { - "message": "Use single sign-on" + "message": "Użyj jednokrotnego logowania" }, "welcomeBack": { - "message": "Welcome back" + "message": "Witaj ponownie" }, "invalidPasskeyPleaseTryAgain": { "message": "Błędny passkey. Spróbuj ponownie." @@ -1138,7 +1141,7 @@ "message": "Utwórz konto" }, "newToBitwarden": { - "message": "New to Bitwarden?" + "message": "Nowy na Bitwarden?" }, "setAStrongPassword": { "message": "Ustaw silne hasło" @@ -1156,32 +1159,35 @@ "message": "Zaloguj się" }, "logInToBitwarden": { - "message": "Log in to Bitwarden" + "message": "Zaloguj do Bitwarden" }, "authenticationTimeout": { - "message": "Authentication timeout" + "message": "Limit czasu uwierzytelniania" }, "authenticationSessionTimedOut": { - "message": "The authentication session timed out. Please restart the login process." + "message": "Upłynął limit czasu uwierzytelniania. Uruchom ponownie proces logowania." }, "verifyIdentity": { "message": "Zweryfikuj swoją tożsamość" }, "weDontRecognizeThisDevice": { - "message": "We don't recognize this device. Enter the code sent to your email to verify your identity." + "message": "Nie rozpoznajemy tego urządzenia. Wpisz kod wysłany na Twój e-mail, aby zweryfikować tożsamość." }, "continueLoggingIn": { - "message": "Continue logging in" + "message": "Kontynuuj logowanie" }, "whatIsADevice": { - "message": "What is a device?" + "message": "Czym jest urządzenie?" }, "aDeviceIs": { - "message": "A device is a unique installation of the Bitwarden app where you have logged in. Reinstalling, clearing app data, or clearing your cookies could result in a device appearing multiple times." + "message": "Urządzenie to unikalna instalacja aplikacji Bitwarden, w której się zalogowano. Ponowna instalacja, wyczyszczenie danych aplikacji lub usunięcie plików cookie może spowodować, że urządzenie pojawi się wielokrotnie." }, "logInInitiated": { "message": "Logowanie rozpoczęte" }, + "logInRequestSent": { + "message": "Żądanie wysłane" + }, "submit": { "message": "Wyślij" }, @@ -1305,10 +1311,10 @@ "message": "Adres e-mail" }, "yourVaultIsLockedV2": { - "message": "Twój sejf jest zablokowany." + "message": "Twój sejf jest zablokowany" }, "yourAccountIsLocked": { - "message": "Your account is locked" + "message": "Twoje konto jest zablokowane" }, "uuid": { "message": "UUID" @@ -1345,7 +1351,7 @@ "message": "Nie masz uprawnień do przeglądania wszystkich elementów w tej kolekcji." }, "youDoNotHavePermissions": { - "message": "You do not have permissions to this collection" + "message": "Nie masz uprawnień do tej kolekcji" }, "noCollectionsInList": { "message": "Brak kolekcji do wyświetlenia." @@ -1371,11 +1377,38 @@ "notificationSentDevice": { "message": "Powiadomienie zostało wysłane na urządzenie." }, - "aNotificationWasSentToYourDevice": { - "message": "A notification was sent to your device" + "notificationSentDevicePart1": { + "message": "Odblokuj Bitwarden na swoim urządzeniu lub w" }, - "makeSureYourAccountIsUnlockedAndTheFingerprintEtc": { - "message": "Make sure your account is unlocked and the fingerprint phrase matches on the other device" + "areYouTryingToAccessYourAccount": { + "message": "Czy próbujesz uzyskać dostęp do swojego konta?" + }, + "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" + }, + "notificationSentDeviceAnchor": { + "message": "aplikacji internetowej" + }, + "notificationSentDevicePart2": { + "message": "Upewnij się, że fraza odcisku palca zgadza się z tą poniżej, zanim zatwierdzisz." + }, + "notificationSentDeviceComplete": { + "message": "Odblokuj Bitwarden na swoim urządzeniu. Przed zatwierdzeniem upewnij się, że fraza odcisku palca pasuje do tej poniżej." + }, + "aNotificationWasSentToYourDevice": { + "message": "Powiadomienie zostało wysłane na twoje urządzenie" }, "versionNumber": { "message": "Wersja $VERSION_NUMBER$", @@ -1468,7 +1501,7 @@ "message": "Klucz bezpieczeństwa FIDO U2F" }, "webAuthnTitle": { - "message": "FIDO2 WebAuthn" + "message": "Klucz dostępu" }, "webAuthnDesc": { "message": "Użyj dowolnego klucza bezpieczeństwa WebAuthn, aby uzyskać dostęp do swojego konta." @@ -1661,12 +1694,9 @@ "description": "deprecated. Use avoidAmbiguous instead." }, "avoidAmbiguous": { - "message": "Avoid ambiguous characters", + "message": "Unikaj niejednoznacznych znaków", "description": "Label for the avoid ambiguous characters checkbox." }, - "regeneratePassword": { - "message": "Wygeneruj ponownie hasło" - }, "length": { "message": "Długość" }, @@ -1709,25 +1739,25 @@ "message": "Historia hasła" }, "generatorHistory": { - "message": "Generator history" + "message": "Historia generatora" }, "clearGeneratorHistoryTitle": { - "message": "Clear generator history" + "message": "Wyczyść historię generatora" }, "cleargGeneratorHistoryDescription": { - "message": "If you continue, all entries will be permanently deleted from generator's history. Are you sure you want to continue?" + "message": "Jeśli zatwierdzisz, wszystkie wygenerowane hasła zostaną usunięte z historii generatora. Czy chcesz kontynuować mimo to?" }, "noPasswordsInList": { "message": "Brak haseł." }, "clearHistory": { - "message": "Clear history" + "message": "Wyczyść historię" }, "nothingToShow": { - "message": "Nothing to show" + "message": "Brak zawartości do pokazania" }, "nothingGeneratedRecently": { - "message": "You haven't generated anything recently" + "message": "Nic nie zostało wygenerowane przez ciebie w ostatnim czasie" }, "clear": { "message": "Wyczyść", @@ -1767,10 +1797,10 @@ "message": "Zaloguj się ponownie." }, "currentSession": { - "message": "Current session" + "message": "Aktualna sesja" }, "requestPending": { - "message": "Request pending" + "message": "Zapytanie oczekuje" }, "logBackInOthersToo": { "message": "Zaloguj się ponownie. Jeśli używasz innych aplikacji Bitwarden, wyloguj się i zaloguj ponownie również w nich." @@ -1849,31 +1879,31 @@ "message": "Ta czynność spowoduje wylogowanie z bieżącej sesji, przez co konieczne będzie ponowne zalogowanie się. Zostaniesz również poproszony o ponowne logowanie dwustopniowe, jeśli masz włączoną tę opcję. Aktywne sesje na innych urządzeniach mogą pozostać aktywne przez maksymalnie godzinę." }, "newDeviceLoginProtection": { - "message": "New device login" + "message": "Logowanie nowego urządzenia" }, "turnOffNewDeviceLoginProtection": { - "message": "Turn off new device login protection" + "message": "Wyłącz ochronę logowania na nowym urządzeniu" }, "turnOnNewDeviceLoginProtection": { - "message": "Turn on new device login protection" + "message": "Włącz ochronę logowania na nowym urządzeniu" }, "turnOffNewDeviceLoginProtectionModalDesc": { - "message": "Proceed below to turn off the verification emails bitwarden sends when you login from a new device." + "message": "Przejdź poniżej, aby wyłączyć e-maile weryfikacyjne wysyłane przez Bitwarden podczas logowania z nowego urządzenia." }, "turnOnNewDeviceLoginProtectionModalDesc": { - "message": "Proceed below to have bitwarden send you verification emails when you login from a new device." + "message": "Przejdź poniżej, aby Bitwarden wysyłał Ci e-maile weryfikacyjne podczas logowania z nowego urządzenia." }, "turnOffNewDeviceLoginProtectionWarning": { - "message": "With new device login protection turned off, anyone with your master password can access your account from any device. To protect your account without verification emails, set up two-step login." + "message": "Po wyłączeniu ochrony logowania na nowym urządzeniu, każdy, kto zna Twoje hasło główne, może uzyskać dostęp do Twojego konta z dowolnego urządzenia. Aby chronić swoje konto bez e-maili weryfikacyjnych, skonfiguruj dwuetapowe logowanie." }, "accountNewDeviceLoginProtectionSaved": { - "message": "New device login protection changes saved" + "message": "Zapisano nowe zmiany ochrony logowania" }, "sessionsDeauthorized": { "message": "Wszystkie sesje zostały zakończone" }, "accountIsOwnedMessage": { - "message": "This account is owned by $ORGANIZATIONNAME$", + "message": "To konto jest własnością $ORGANIZATIONNAME$", "placeholders": { "organizationName": { "content": "$1", @@ -1938,7 +1968,7 @@ "description": "This will be part of a larger sentence, that will read like this: If you don't have any data to import, you can create a new item instead. (Optional second half: You may need to wait until your administrator confirms your organization membership.)" }, "onboardingImportDataDetailsLoginLink": { - "message": "new login", + "message": "Nowe dane logowania", "description": "This will be part of a larger sentence, that will read like this: If you don't have any data to import, you can create a new login instead. (Optional second half: You may need to wait until your administrator confirms your organization membership.)" }, "onboardingImportDataDetailsPartTwoNoOrgs": { @@ -2170,8 +2200,20 @@ "manage": { "message": "Zarządzaj" }, - "canManage": { - "message": "Może zarządzać" + "manageCollection": { + "message": "Zarządzaj kolekcją" + }, + "viewItems": { + "message": "Zobacz elementy" + }, + "viewItemsHidePass": { + "message": "Zobacz elementy, ukryte hasła" + }, + "editItems": { + "message": "Edytuj elementy" + }, + "editItemsHidePass": { + "message": "Edytuj elementy, ukryte hasła" }, "disable": { "message": "Wyłącz" @@ -2368,11 +2410,8 @@ "twoFactorU2fProblemReadingTryAgain": { "message": "Wystąpił problem z odczytem klucza bezpieczeństwa. Spróbuj ponownie." }, - "twoFactorWebAuthnWarning": { - "message": "Z powodu ograniczeń platformy, klucze WebAuthn nie mogą być używane we wszystkich aplikacjach Bitwarden. Musisz włączyć inną metodę logowania dwustopniowego, aby zachować dostęp do konta w pozostałych sytuacjach. Wspierane platformy:" - }, - "twoFactorWebAuthnSupportWeb": { - "message": "Sejf internetowy i rozszerzenia przeglądarki na komputerze/laptopie z przeglądarką obsługującą WebAuthn (Chrome, Opera, Vivaldi lub Firefox z włączoną obsługą FIDO U2F)." + "twoFactorWebAuthnWarning1": { + "message": "Z powodu ograniczeń platformy, klucze WebAuthn nie mogą być używane we wszystkich aplikacjach Bitwarden. Musisz włączyć inną metodę logowania dwustopniowego, aby zachować dostęp do konta w pozostałych sytuacjach." }, "twoFactorRecoveryYourCode": { "message": "Kod odzyskiwania konta Bitwarden" @@ -2477,7 +2516,7 @@ "message": "Sprawdź ujawnione hasła" }, "timesExposed": { - "message": "Times exposed" + "message": "Ujawniono" }, "exposedXTimes": { "message": "Ujawnione $COUNT$ raz(y)", @@ -2514,7 +2553,7 @@ "message": "Brak elementów zawierających słabe hasła." }, "weakness": { - "message": "Weakness" + "message": "Słabe" }, "reusedPasswordsReport": { "message": "Identyczne hasła" @@ -2542,7 +2581,7 @@ "message": "Nie znaleźliśmy identycznych haseł w sejfie." }, "timesReused": { - "message": "Times reused" + "message": "Ponownie użyto" }, "reusedXTimes": { "message": "Wykorzystane $COUNT$ razy", @@ -2842,7 +2881,7 @@ "message": "Pobierz licencję" }, "viewBillingToken": { - "message": "View Billing Token" + "message": "Pokaż token płatności" }, "updateLicense": { "message": "Zaktualizuj licencję" @@ -2891,10 +2930,10 @@ "message": "Faktury" }, "noUnpaidInvoices": { - "message": "No unpaid invoices." + "message": "Brak nieopłaconych faktur." }, "noPaidInvoices": { - "message": "No paid invoices." + "message": "Brak opłaconych faktur." }, "paid": { "message": "Zapłacono", @@ -3339,10 +3378,10 @@ } }, "inviteSingleEmailDesc": { - "message": "You have 1 invite remaining." + "message": "Pozostało Ci 1 zaproszenie." }, "inviteZeroEmailDesc": { - "message": "You have 0 invites remaining." + "message": "Pozostało Ci 0 zaproszeń." }, "userUsingTwoStep": { "message": "Ten użytkownik korzysta z logowania dwustopniowego, aby chronić swoje konto." @@ -3378,7 +3417,7 @@ "message": "Użytkownik" }, "userDesc": { - "message": "Standardowy użytkownik, posiadający dostęp do kolekcji w Twojej organizacji." + "message": "Standardowy użytkownik, posiadający dostęp do kolekcji w Twojej organizacji" }, "all": { "message": "Wszyscy" @@ -3508,7 +3547,7 @@ } }, "viewAllLogInOptions": { - "message": "View all log in options" + "message": "Zobacz wszystkie sposoby logowania" }, "viewAllLoginOptions": { "message": "Zobacz wszystkie sposoby logowania" @@ -3796,7 +3835,7 @@ } }, "unlinkedSso": { - "message": "Unlinked SSO." + "message": "Odłączone SSO" }, "unlinkedSsoUser": { "message": "Odłącz logowanie jednokrotne SSO dla użytkownika %$ID$.", @@ -3847,22 +3886,22 @@ "message": "Urządzenie" }, "loginStatus": { - "message": "Login status" + "message": "Status zalogowania" }, "firstLogin": { - "message": "First login" + "message": "Pierwsze logowanie" }, "trusted": { - "message": "Trusted" + "message": "Zaufane" }, "needsApproval": { - "message": "Needs approval" + "message": "Wymaga zatwierdzenia" }, "areYouTryingtoLogin": { - "message": "Are you trying to log in?" + "message": "Próbujesz się zalogować?" }, "logInAttemptBy": { - "message": "Login attempt by $EMAIL$", + "message": "Próba logowania przez $EMAIL$", "placeholders": { "email": { "content": "$1", @@ -3871,22 +3910,22 @@ } }, "deviceType": { - "message": "Device Type" + "message": "Typ urządenia" }, "ipAddress": { - "message": "IP Address" + "message": "Adres IP" }, "confirmLogIn": { - "message": "Confirm login" + "message": "Potwierdź logowanie" }, "denyLogIn": { - "message": "Deny login" + "message": "Odrzuć logowanie" }, "thisRequestIsNoLongerValid": { - "message": "This request is no longer valid." + "message": "To żądanie jest już nieważne." }, "logInConfirmedForEmailOnDevice": { - "message": "Login confirmed for $EMAIL$ on $DEVICE$", + "message": "Logowanie potwierdzone dla $EMAIL$ na $DEVICE$", "placeholders": { "email": { "content": "$1", @@ -3899,16 +3938,16 @@ } }, "youDeniedALogInAttemptFromAnotherDevice": { - "message": "You denied a login attempt from another device. If this really was you, try to log in with the device again." + "message": "Odrzucono próby logowania z innego urządzenia. Jeśli to naprawdę Ty, spróbuj ponownie zalogować się za pomocą urządzenia." }, "loginRequestHasAlreadyExpired": { - "message": "Login request has already expired." + "message": "Prośba logowania wygasła." }, "justNow": { - "message": "Just now" + "message": "Teraz" }, "requestedXMinutesAgo": { - "message": "Requested $MINUTES$ minutes ago", + "message": "Poproszono $MINUTES$ minut temu", "placeholders": { "minutes": { "content": "$1", @@ -4034,13 +4073,13 @@ "message": "Aktualizuj przeglądarkę" }, "generatingRiskInsights": { - "message": "Generating your risk insights..." + "message": "Generowanie informacji o ryzyku..." }, "updateBrowserDesc": { "message": "Używasz nieobsługiwanej przeglądarki. Sejf internetowy może działać niewłaściwie." }, "freeTrialEndPromptCount": { - "message": "Your free trial ends in $COUNT$ days.", + "message": "Twój okres próbny kończy się za $COUNT$ dni.", "placeholders": { "count": { "content": "$1", @@ -4049,7 +4088,7 @@ } }, "freeTrialEndPromptMultipleDays": { - "message": "$ORGANIZATION$, your free trial ends in $COUNT$ days.", + "message": "$ORGANIZATION$, twoja darmowa wersja próbna kończy się za $COUNT$ dni.", "placeholders": { "count": { "content": "$2", @@ -4062,7 +4101,7 @@ } }, "freeTrialEndPromptTomorrow": { - "message": "$ORGANIZATION$, your free trial ends tomorrow.", + "message": "$ORGANIZATION$, twoja darmowa wersja próbna kończy się jutro", "placeholders": { "organization": { "content": "$1", @@ -4071,10 +4110,10 @@ } }, "freeTrialEndPromptTomorrowNoOrgName": { - "message": "Your free trial ends tomorrow." + "message": "Twój okres próbny kończy się jutro." }, "freeTrialEndPromptToday": { - "message": "$ORGANIZATION$, your free trial ends today.", + "message": "$ORGANIZATION$, twoja darmowa wersja próbna kończy się dzisiaj", "placeholders": { "organization": { "content": "$1", @@ -4083,10 +4122,10 @@ } }, "freeTrialEndingTodayWithoutOrgName": { - "message": "Your free trial ends today." + "message": "Twój okres próbny kończy się dzisiaj." }, "clickHereToAddPaymentMethod": { - "message": "Click here to add a payment method." + "message": "Kliknij tutaj, aby dodać metodę płatności." }, "joinOrganization": { "message": "Dołącz do organizacji" @@ -4643,7 +4682,7 @@ "description": "A 'fingerprint phrase' is a unique word phrase (similar to a passphrase) that a user can use to authenticate their public key with another user, for the purposes of sharing." }, "youWillBeNotifiedOnceTheRequestIsApproved": { - "message": "You will be notified once the request is approved" + "message": "Zostaniesz powiadomiony po zatwierdzeniu prośby" }, "free": { "message": "Darmowy", @@ -4710,9 +4749,6 @@ "passwordGeneratorPolicyDesc": { "message": "Ustaw minimalne wymagania dla generatora hasła." }, - "passwordGeneratorPolicyInEffect": { - "message": "Co najmniej jedna zasada organizacji wpływa na ustawienia generatora." - }, "masterPasswordPolicyInEffect": { "message": "Co najmniej jedna zasada organizacji wymaga, aby hasło główne spełniało następujące wymagania:" }, @@ -4876,10 +4912,10 @@ "message": "Zaloguj się za pomocą logowania jednokrotnego SSO swojej organizacji. Aby rozpocząć, wpisz swój identyfikator organizacji." }, "singleSignOnEnterOrgIdentifier": { - "message": "Enter your organization's SSO identifier to begin" + "message": "Wprowadź identyfikator SSO swojej organizacji, aby rozpocząć" }, "singleSignOnEnterOrgIdentifierText": { - "message": "To log in with your SSO provider, enter your organization's SSO identifier to begin. You may need to enter this SSO identifier when you log in from a new device." + "message": "Aby zalogować się za pomocą dostawcy SSO, wprowadź identyfikator SSO organizacji, aby rozpocząć. Może być konieczne wprowadzenie identyfikatora SSO podczas logowania z nowego urządzenia." }, "enterpriseSingleSignOn": { "message": "Logowanie jednokrotne" @@ -4949,7 +4985,7 @@ "message": "Zablokuj użytkownikom możliwość dołączania do innych organizacji." }, "singleOrgPolicyDesc": { - "message": "Restrict members from joining other organizations. This policy is required for organizations that have enabled domain verification." + "message": "Ogranicz członków do dołączania do innych organizacji. Ta polityka jest wymagana dla organizacji, które włączyły weryfikację domeny." }, "singleOrgBlockCreateMessage": { "message": "Twoja obecna organizacja posiada zasady, które nie pozwalają na dołączanie do więcej niż jednej organizacji. Skontaktuj się z administratorami swojej organizacji lub zarejestruj się z innego konta Bitwarden." @@ -4958,7 +4994,7 @@ "message": "Członkowie organizacji, którzy nie są właścicielami lub administratorami i są już członkami innej organizacji zostaną usunięci z Twojej organizacji." }, "singleOrgPolicyMemberWarning": { - "message": "Non-compliant members will be placed in revoked status until they leave all other organizations. Administrators are exempt and can restore members once compliance is met." + "message": "Niezgodni członkowie zostaną objęci cofniętym statusem do czasu opuszczenia przez nich wszystkich innych organizacji. Administratorzy są zwolnieni i mogą przywrócić członków po osiągnięciu zgodności." }, "requireSso": { "message": "Uwierzytelnianie logowaniem jednokrotnym" @@ -5338,7 +5374,7 @@ "message": "Niestandardowe" }, "customDesc": { - "message": "Umożliwia zaawansowaną kontrolę uprawnień użytkownika." + "message": "Umożliwia zaawansowaną kontrolę uprawnień użytkownika" }, "customDescNonEnterpriseStart": { "message": "Role niestandardowe to ", @@ -5684,7 +5720,7 @@ "message": "Hasło zostało zresetowane!" }, "resetPasswordEnrollmentWarning": { - "message": "Rejestracja zezwala administratorom organizacji na zmianę Twojego hasła głównego. Czy na pewno chcesz się zarejestrować?" + "message": "Rejestracja zezwala administratorom organizacji na zmianę Twojego hasła głównego" }, "accountRecoveryPolicy": { "message": "Administracja odzyskiwaniem konta" @@ -5783,13 +5819,13 @@ "message": "Przywrócono dostęp do organizacji" }, "bulkFilteredMessage": { - "message": "Wykluczono, nie dotyczy tej akcji." + "message": "Wykluczono, nie dotyczy tej akcji" }, "nonCompliantMembersTitle": { - "message": "Non-compliant members" + "message": "Niezgodni członkowie" }, "nonCompliantMembersError": { - "message": "Members that are non-compliant with the Single organization or Two-step login policy cannot be restored until they adhere to the policy requirements" + "message": "Niezgodni członkowie z jedną organizacją lub dwustopniową regułą logowania nie mogą zostać przywróceni, dopóki nie będą przestrzegali wymogów polityki" }, "fingerprint": { "message": "Unikalny identyfikator konta" @@ -5807,17 +5843,17 @@ "message": "Błąd" }, "decryptionError": { - "message": "Decryption error" + "message": "Błąd odszyfrowywania" }, "couldNotDecryptVaultItemsBelow": { - "message": "Bitwarden could not decrypt the vault item(s) listed below." + "message": "Bitwarden nie mógł odszyfrować elementów sejfu wymienionych poniżej." }, "contactCSToAvoidDataLossPart1": { - "message": "Contact customer success", + "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": "to avoid additional data loss.", + "message": "aby uniknąć dalszej utraty danych.", "description": "This is part of a larger sentence. The full sentence will read 'Contact customer success to avoid additional data loss.'" }, "accountRecoveryManageUsers": { @@ -5836,7 +5872,7 @@ "message": "Nazwa dostawcy" }, "providerSetup": { - "message": "Dostawca został skonfigurowany." + "message": "Dostawca został skonfigurowany" }, "clients": { "message": "Klienci" @@ -6391,11 +6427,11 @@ "message": "Key Connector" }, "memberDecryptionKeyConnectorDescStart": { - "message": "Połącz logowanie za pomocą SSO z Twoim serwerem kluczy odszyfrowania. Używając tej opcji, członkowie nie będą musieli używać swoich haseł głównych, aby odszyfrować dane sejfu.", + "message": "Połącz logowanie za pomocą SSO z Twoim serwerem kluczy odszyfrowania. Używając tej opcji, członkowie nie będą musieli używać swoich haseł głównych, aby odszyfrować dane sejfu", "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Connect login with SSO to your self-hosted decryption key server. Using this option, members won’t need to use their master passwords to decrypt vault data. The require SSO authentication and single organization policies are required to set up Key Connector decryption. Contact Bitwarden Support for set up assistance.'" }, "memberDecryptionKeyConnectorDescLink": { - "message": "Wymaga uwierzytelniania SSO i polityki jednej organizacji", + "message": "wymaga uwierzytelniania SSO i polityki jednej organizacji", "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Connect login with SSO to your self-hosted decryption key server. Using this option, members won’t need to use their master passwords to decrypt vault data. The require SSO authentication and single organization policies are required to set up Key Connector decryption. Contact Bitwarden Support for set up assistance.'" }, "memberDecryptionKeyConnectorDescEnd": { @@ -6457,7 +6493,7 @@ "message": "Pokaż token synchronizacji płatności" }, "generateBillingToken": { - "message": "Generate billing token" + "message": "Wygeneruj token płatności" }, "copyPasteBillingSync": { "message": "Skopiuj i wklej ten token do ustawień synchronizacji rozliczeniowej swojej organizacji." @@ -6466,7 +6502,7 @@ "message": "Twój token synchronizacji płatności może edytować ustawienia subskrypcji tej organizacji." }, "manageBillingTokenSync": { - "message": "Manage Billing Token" + "message": "Zarządzaj tokenami płatności" }, "setUpBillingSync": { "message": "Skonfiguruj synchronizację płatności" @@ -6532,7 +6568,7 @@ "message": "Token synchronizacji płatności" }, "automaticBillingSyncDesc": { - "message": "Automatic sync unlocks Families sponsorships and allows you to sync your license without uploading a file. After making updates in the Bitwarden cloud server, select Sync License to apply changes." + "message": "Automatyczna synchronizacja odblokowuje sponsorowanie rodzin i pozwala na synchronizację licencji bez przesyłania pliku. Po aktualizacjach w chmurze Bitwarden, wybierz licencję synchronizacji aby zastosować zmiany." }, "active": { "message": "Aktywny" @@ -6602,7 +6638,7 @@ "message": "Wymagane, jeśli identyfikatorem podmiotu nie jest adres URL." }, "offerNoLongerValid": { - "message": "This offer is no longer valid. Contact your organization administrators for more information." + "message": "Ta oferta nie jest już ważna. Aby uzyskać więcej informacji, skontaktuj się z administratorami organizacji." }, "openIdOptionalCustomizations": { "message": "Opcjonalne dostosowania" @@ -6681,23 +6717,14 @@ "message": "Generator", "description": "Short for 'credential generator'." }, - "whatWouldYouLikeToGenerate": { - "message": "Co chcesz wygenerować?" - }, - "passwordType": { - "message": "Rodzaj hasła" - }, - "regenerateUsername": { - "message": "Wygeneruj ponownie nazwę użytkownika" - }, "generateUsername": { "message": "Wygeneruj nazwę użytkownika" }, "generateEmail": { - "message": "Generate email" + "message": "Wygeneruj e-mail" }, "spinboxBoundariesHint": { - "message": "Value must be between $MIN$ and $MAX$.", + "message": "Wartość musi być pomiędzy $MIN$ a $MAX$.", "description": "Explains spin box minimum and maximum values to the user", "placeholders": { "min": { @@ -6711,7 +6738,7 @@ } }, "passwordLengthRecommendationHint": { - "message": " Use $RECOMMENDED$ characters or more to generate a strong password.", + "message": " Użyj $RECOMMENDED$ znaków lub więcej, aby wygenerować 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": { @@ -6721,7 +6748,7 @@ } }, "passphraseNumWordsRecommendationHint": { - "message": " Use $RECOMMENDED$ words or more to generate a strong passphrase.", + "message": " Użyj $RECOMMENDED$ słów lub więcej, aby wygenerować silne hasło.", "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": { @@ -6730,9 +6757,6 @@ } } }, - "usernameType": { - "message": "Rodzaj nazwy użytkownika" - }, "plusAddressedEmail": { "message": "Adres e-mail z plusem", "description": "Username generator option that appends a random sub-address to the username. For example: address+subaddress@email.com" @@ -6747,7 +6771,7 @@ "message": "Użyj skonfigurowanej skrzynki catch-all w swojej domenie." }, "useThisEmail": { - "message": "Use this email" + "message": "Użyj tego adresu e-mail" }, "random": { "message": "Losowa", @@ -6839,11 +6863,11 @@ "message": "Wygeneruj alias adresu e-mail z zewnętrznej usługi przekierowania." }, "forwarderDomainName": { - "message": "Email domain", + "message": "Domena e-mail", "description": "Labels the domain name email forwarder service option" }, "forwarderDomainNameHint": { - "message": "Choose a domain that is supported by the selected service", + "message": "Wybierz domenę, która jest obsługiwana przez wybraną usługę", "description": "Guidance provided for email forwarding services that support multiple email domains." }, "forwarderError": { @@ -6952,9 +6976,6 @@ "message": "Nazwa hosta", "description": "Part of a URL." }, - "apiAccessToken": { - "message": "Token dostępu API" - }, "deviceVerification": { "message": "Weryfikacja urządzenia" }, @@ -6988,7 +7009,7 @@ "description": "the text, 'SCIM', is an acronym and should not be translated." }, "scimIntegrationDescription": { - "message": "Automatically provision users and groups with your preferred identity provider via SCIM provisioning. Find supported integrations", + "message": "Automatycznie dostarczaj użytkownikom i grupom preferowanego dostawcy tożsamości za pomocą usługi SCIM. Znajdź obsługiwane integracje", "description": "the text, 'SCIM', is an acronym and should not be translated." }, "scimEnabledCheckboxDesc": { @@ -7666,18 +7687,6 @@ "noCollection": { "message": "Brak kolekcji" }, - "canView": { - "message": "Może wyświetlać" - }, - "canViewExceptPass": { - "message": "Może wyświetlać z wyjątkiem haseł" - }, - "canEdit": { - "message": "Można edytować" - }, - "canEditExceptPass": { - "message": "Może edytować z wyjątkiem haseł" - }, "noCollectionsAdded": { "message": "Nie dodano kolekcji" }, @@ -8000,7 +8009,7 @@ "message": "Przesyłanie ręczne" }, "manualBillingTokenUploadDesc": { - "message": "If you do not want to opt into billing sync, manually upload your license here. This will not automatically unlock Families sponsorships." + "message": "Jeśli nie chcesz zrezygnować z synchronizacji rozliczeniowej, ręcznie prześlij swoją licencję tutaj. Nie odblokuje to automatycznie sponsorowania dla rodziny." }, "syncLicense": { "message": "Synchronizuj licencję" @@ -8269,16 +8278,16 @@ "message": "Logowanie rozpoczęte" }, "rememberThisDeviceToMakeFutureLoginsSeamless": { - "message": "Remember this device to make future logins seamless" + "message": "Zapamiętaj to urządzenie, aby przyszłe logowania były bezproblemowe" }, "deviceApprovalRequired": { "message": "Wymagane zatwierdzenie urządzenia. Wybierz opcję zatwierdzenia poniżej:" }, "deviceApprovalRequiredV2": { - "message": "Device approval required" + "message": "Wymagane zatwierdzenie urządzenia" }, "selectAnApprovalOptionBelow": { - "message": "Select an approval option below" + "message": "Wybierz opcję zatwierdzenia poniżej" }, "rememberThisDevice": { "message": "Zapamiętaj to urządzenie" @@ -8302,31 +8311,31 @@ "message": "Zaufane urządzenia" }, "memberDecryptionOptionTdeDescPart1": { - "message": "Members will not need a master password when logging in with SSO. Master password is replaced with an encryption key stored on the device, making that device trusted. The first device a member creates their account and logs into will be trusted. New devices will need to be approved by an existing trusted device or by an administrator. The", + "message": "Członkowie nie będą potrzebowali hasła głównego podczas logowania się za pomocą SSO. Hasło główne jest zastąpione kluczem szyfrowania przechowywanym na urządzeniu, co sprawia, że urządzenie jest zaufane. Pierwsze urządzenie, do którego użytkownik tworzy swoje konto i logi, będą zaufane. Nowe urządzenia będą musiały zostać zatwierdzone przez istniejące zaufane urządzenie lub przez administratora.", "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Members will not need a master password when logging in with SSO. Master password is replaced with an encryption key stored on the device, making that device trusted. The first device a member creates their account and logs into will be trusted. New devices will need to be approved by an existing trusted device or by an administrator. The single organization policy, SSO required policy, and account recovery administration policy will turn on when this option is used.'" }, "memberDecryptionOptionTdeDescLink1": { - "message": "single organization", + "message": "pojedyncza organizacja", "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Members will not need a master password when logging in with SSO. Master password is replaced with an encryption key stored on the device, making that device trusted. The first device a member creates their account and logs into will be trusted. New devices will need to be approved by an existing trusted device or by an administrator. The single organization policy, SSO required policy, and account recovery administration policy will turn on when this option is used.'" }, "memberDecryptionOptionTdeDescPart2": { - "message": "policy,", + "message": "polityka,", "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Members will not need a master password when logging in with SSO. Master password is replaced with an encryption key stored on the device, making that device trusted. The first device a member creates their account and logs into will be trusted. New devices will need to be approved by an existing trusted device or by an administrator. The single organization policy, SSO required policy, and account recovery administration policy will turn on when this option is used.'" }, "memberDecryptionOptionTdeDescLink2": { - "message": "SSO required", + "message": "Wymagane SSO", "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Members will not need a master password when logging in with SSO. Master password is replaced with an encryption key stored on the device, making that device trusted. The first device a member creates their account and logs into will be trusted. New devices will need to be approved by an existing trusted device or by an administrator. The single organization policy, SSO required policy, and account recovery administration policy will turn on when this option is used.'" }, "memberDecryptionOptionTdeDescPart3": { - "message": "policy, and", + "message": "polityka i ", "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Members will not need a master password when logging in with SSO. Master password is replaced with an encryption key stored on the device, making that device trusted. The first device a member creates their account and logs into will be trusted. New devices will need to be approved by an existing trusted device or by an administrator. The single organization policy, SSO required policy, and account recovery administration policy will turn on when this option is used.'" }, "memberDecryptionOptionTdeDescLink3": { - "message": "account recovery administration", + "message": "Administracja odzyskiwaniem konta", "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Members will not need a master password when logging in with SSO. Master password is replaced with an encryption key stored on the device, making that device trusted. The first device a member creates their account and logs into will be trusted. New devices will need to be approved by an existing trusted device or by an administrator. The single organization policy, SSO required policy, and account recovery administration policy will turn on when this option is used.'" }, "memberDecryptionOptionTdeDescPart4": { - "message": "policy will turn on when this option is used.", + "message": "polityka włączy się, gdy ta opcja zostanie wykorzystana.", "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Members will not need a master password when logging in with SSO. Master password is replaced with an encryption key stored on the device, making that device trusted. The first device a member creates their account and logs into will be trusted. New devices will need to be approved by an existing trusted device or by an administrator. The single organization policy, SSO required policy, and account recovery administration policy will turn on when this option is used.'" }, "orgPermissionsUpdatedMustSetPassword": { @@ -8405,16 +8414,16 @@ "message": "Zatwierdź prośbę" }, "deviceApproved": { - "message": "Device approved" + "message": "Urządzenie zostało zatwierdzone" }, "deviceRemoved": { - "message": "Device removed" + "message": "Urządzenie zostało usunięte" }, "removeDevice": { - "message": "Remove device" + "message": "Usuń urządzenie" }, "removeDeviceConfirmation": { - "message": "Are you sure you want to remove this device?" + "message": "Czy na pewno chcesz usunąć to urządzenie?" }, "noDeviceRequests": { "message": "Brak urządzeń do zatwierdzenia" @@ -8471,7 +8480,7 @@ "message": "Poproszono o zatwierdzenie urządzenia." }, "tdeOffboardingPasswordSet": { - "message": "User set a master password during TDE offboarding." + "message": "Użytkownik ustawił hasło główne podczas wyłączania TDE." }, "startYour7DayFreeTrialOfBitwardenFor": { "message": "Rozpocznij 7-dniowy darmowy okres próbny Bitwarden dla $ORG$", @@ -8522,7 +8531,7 @@ "message": "Brak adresu e-mail użytkownika" }, "activeUserEmailNotFoundLoggingYouOut": { - "message": "Active user email not found. Logging you out." + "message": "Nie znaleziono aktywnego adresu e-mail. Trwa wylogowanie." }, "deviceTrusted": { "message": "Zaufano urządzeniu" @@ -8620,13 +8629,13 @@ "message": "Zarządzaj zachowaniami kolekcji w organizacji" }, "limitCollectionCreationDesc": { - "message": "Limit collection creation to owners and admins" + "message": "Ogranicz tworzenie kolekcji do właścicieli i administratorów" }, "limitCollectionDeletionDesc": { - "message": "Limit collection deletion to owners and admins" + "message": "Ogranicz usuwanie kolekcji do właścicieli i administratorów" }, "limitItemDeletionDesc": { - "message": "Limit item deletion to members with the Can manage permission" + "message": "Ogranicz usuwanie elementów do członków z uprawnieniami do zarządzania" }, "allowAdminAccessToAllCollectionItemsDesc": { "message": "Właściciele i administratorzy mogą zarządzać wszystkimi zbiorami i elementami" @@ -8674,12 +8683,9 @@ "message": "Adres URL serwera" }, "selfHostBaseUrl": { - "message": "Self-host server URL", + "message": "URL samodzielnie hostowanego serwera", "description": "Label for field requesting a self-hosted integration service URL" }, - "aliasDomain": { - "message": "Domena aliasu" - }, "alreadyHaveAccount": { "message": "Masz już konto?" }, @@ -8741,10 +8747,10 @@ "readOnlyCollectionAccess": { "message": "Nie masz dostępu do zarządzania tą kolekcją." }, - "grantAddAccessCollectionWarningTitle": { - "message": "Brak uprawnienia Zarządzaj Uprawnieniami" + "grantManageCollectionWarningTitle": { + "message": "Brak uprawnień do zarządzania kolekcją" }, - "grantAddAccessCollectionWarning": { + "grantManageCollectionWarning": { "message": "Przyznaj uprawnienie Zarządzaj Uprawnieniami w celu umożliwienia pełnego zarządzania kolekcją, w tym usuwania kolekcji." }, "grantCollectionAccess": { @@ -9201,47 +9207,47 @@ "message": "Użyj SDK Menedżera Sekretów Bitwarden w następujących językach programowania, aby zbudować własne aplikacje." }, "ssoDescStart": { - "message": "Configure", + "message": "Konfiguruj", "description": "This represents the beginning of a sentence, broken up to include links. The full sentence will be 'Configure single sign-on for Bitwarden using the implementation guide for your Identity Provider." }, "ssoDescEnd": { - "message": "for Bitwarden using the implementation guide for your Identity Provider.", + "message": "dla Bitwarden przy użyciu instrukcji implementacyjnych dla Twojego dostawcy tożsamości.", "description": "This represents the end of a sentence, broken up to include links. The full sentence will be 'Configure single sign-on for Bitwarden using the implementation guide for your Identity Provider." }, "userProvisioning": { - "message": "User provisioning" + "message": "Aprowizacja użytkowników" }, "scimIntegration": { "message": "SCIM" }, "scimIntegrationDescStart": { - "message": "Configure ", + "message": "Konfiguruj", "description": "This represents the beginning of a sentence, broken up to include links. The full sentence will be 'Configure SCIM (System for Cross-domain Identity Management) to automatically provision users and groups to Bitwarden using the implementation guide for your Identity Provider" }, "scimIntegrationDescEnd": { - "message": "(System for Cross-domain Identity Management) to automatically provision users and groups to Bitwarden using the implementation guide for your Identity Provider.", + "message": "(System do zarządzania tożsamością międzydomeną) w celu automatycznej aprowizacji użytkowników i grup do Bitwarden przy użyciu instrukcji implementacji dla Twojego dostawcy tożsamości.", "description": "This represents the end of a sentence, broken up to include links. The full sentence will be 'Configure SCIM (System for Cross-domain Identity Management) to automatically provision users and groups to Bitwarden using the implementation guide for your Identity Provider" }, "bwdc": { "message": "Bitwarden Directory Connector" }, "bwdcDesc": { - "message": "Configure Bitwarden Directory Connector to automatically provision users and groups using the implementation guide for your Identity Provider." + "message": "Skonfiguruj Bitwarden Directory Connector do automatycznej aprowizacji użytkowników i grup za pomocą przewodnika implementacyjnego dla dostawcy tożsamości." }, "eventManagement": { - "message": "Event management" + "message": "Zarządzanie zdarzeniami" }, "eventManagementDesc": { - "message": "Integrate Bitwarden event logs with your SIEM (system information and event management) system by using the implementation guide for your platform." + "message": "Zintegruj dzienniki zdarzeń Bitwarden ze swoim systemem SIEM (Security Information and Event Management), korzystając z poradnika implementacyjnego dla Twojej platformy." }, "deviceManagement": { - "message": "Device management" + "message": "Zarządzanie urządzeniem" }, "deviceManagementDesc": { - "message": "Configure device management for Bitwarden using the implementation guide for your platform." + "message": "Skonfiguruj zarządzanie urządzeniem Bitwarden za pomocą instrukcji implementacyjnych dla Twojej platformy." }, "integrationCardTooltip": { - "message": "Launch $INTEGRATION$ implementation guide.", + "message": "Uruchom przewodnik implementacyjny $INTEGRATION$.", "placeholders": { "integration": { "content": "$1", @@ -9250,7 +9256,7 @@ } }, "smIntegrationTooltip": { - "message": "Set up $INTEGRATION$.", + "message": "Skonfiguruj $INTEGRATION$.", "placeholders": { "integration": { "content": "$1", @@ -9259,7 +9265,7 @@ } }, "smSdkTooltip": { - "message": "View $SDK$ repository", + "message": "Zobacz repozytorium $SDK$", "placeholders": { "sdk": { "content": "$1", @@ -9268,7 +9274,7 @@ } }, "integrationCardAriaLabel": { - "message": "open $INTEGRATION$ implementation guide in a new tab.", + "message": "otwórz przewodnik implementacji $INTEGRATION$ w nowej karcie.", "placeholders": { "integration": { "content": "$1", @@ -9277,7 +9283,7 @@ } }, "smSdkAriaLabel": { - "message": "view $SDK$ repository in a new tab.", + "message": "wyświetl repozytorium $SDK$ w nowej karcie.", "placeholders": { "sdk": { "content": "$1", @@ -9286,7 +9292,7 @@ } }, "smIntegrationCardAriaLabel": { - "message": "set up $INTEGRATION$ implementation guide in a new tab.", + "message": "ustaw przewodnik implementacji $INTEGRATION$ w nowej karcie.", "placeholders": { "integration": { "content": "$1", @@ -9307,7 +9313,7 @@ "message": "miesięcznie za członka" }, "monthPerMemberBilledAnnually": { - "message": "month per member billed annually" + "message": "miesięcznie na członka, rozliczanie rocznie" }, "seats": { "message": "Miejsca" @@ -9346,13 +9352,13 @@ "message": "Kontynuuj konfigurację darmowego okresu próbnego Menedżera Sekretnych Bitwarden" }, "enterTeamsOrgInfo": { - "message": "Enter your Teams organization information" + "message": "Wprowadź informacje o organizacji Teams" }, "enterFamiliesOrgInfo": { "message": "Wprowadź informacje o swojej organizacji rodzinnej" }, "enterEnterpriseOrgInfo": { - "message": "Enter your Enterprise organization information" + "message": "Wprowadź informacje o organizacji Enterprise" }, "viewItemsIn": { "message": "Zobacz elementy w $NAME$", @@ -9407,10 +9413,10 @@ "message": "Dostawca usług zarządzanych" }, "managedServiceProvider": { - "message": "Managed service provider" + "message": "Zarządzany dostawca usług" }, "multiOrganizationEnterprise": { - "message": "Multi-organization enterprise" + "message": "Przedsiębiorstwo wielu organizacji" }, "orgSeats": { "message": "Miejsca w organizacji" @@ -9458,16 +9464,16 @@ "message": "Zaktualizowane informacje podatkowe" }, "billingInvalidTaxIdError": { - "message": "Invalid tax ID, if you believe this is an error please contact support." + "message": "Nieprawidłowy numer identyfikacji podatkowej, jeśli uważasz, że jest to błąd, skontaktuj się z pomocą techniczną." }, "billingTaxIdTypeInferenceError": { - "message": "We were unable to validate your tax ID, if you believe this is an error please contact support." + "message": "Nie mogliśmy zweryfikować Twojego identyfikatora podatkowego, jeśli uważasz, że jest to błąd, skontaktuj się z pomocą techniczną." }, "billingPreviewInvalidTaxIdError": { - "message": "Invalid tax ID, if you believe this is an error please contact support." + "message": "Nieprawidłowy numer identyfikacji podatkowej, jeśli uważasz, że jest to błąd, skontaktuj się z pomocą techniczną." }, "billingPreviewInvoiceError": { - "message": "An error occurred while previewing the invoice. Please try again later." + "message": "Wystąpił błąd podczas podglądu faktury. Spróbuj ponownie później." }, "unverified": { "message": "Niezweryfikowane" @@ -9734,13 +9740,13 @@ "message": "Dowiedz się więcej o API Bitwarden" }, "fileSends": { - "message": "File Sends" + "message": "Wysyłki plików" }, "textSends": { - "message": "Text Sends" + "message": "Wysyłki tekstów" }, "includesXMembers": { - "message": "for $COUNT$ member", + "message": "dla $COUNT$ członków", "placeholders": { "count": { "content": "$1", @@ -9827,37 +9833,37 @@ "message": "GB dodatkowej przestrzeni" }, "sshKeyAlgorithm": { - "message": "Key algorithm" + "message": "Algorytm klucza" }, "sshPrivateKey": { - "message": "Private key" + "message": "Klucz prywatny" }, "sshPublicKey": { - "message": "Public key" + "message": "Klucz publiczny" }, "sshFingerprint": { - "message": "Fingerprint" + "message": "Odcisk palca" }, "sshKeyFingerprint": { - "message": "Fingerprint" + "message": "Odcisk palca" }, "sshKeyPrivateKey": { - "message": "Private key" + "message": "Klucz prywatny" }, "sshKeyPublicKey": { - "message": "Public key" + "message": "Klucz publiczny" }, "sshKeyAlgorithmED25519": { "message": "ED25519" }, "sshKeyAlgorithmRSA2048": { - "message": "RSA 2048-Bit" + "message": "RSA 2048-bitowy" }, "sshKeyAlgorithmRSA3072": { - "message": "RSA 3072-Bit" + "message": "RSA 3072-bitowy" }, "sshKeyAlgorithmRSA4096": { - "message": "RSA 4096-Bit" + "message": "RSA 4096-bitowy" }, "premiumAccounts": { "message": "6 kont premium" @@ -9875,7 +9881,7 @@ "message": "Monitorowanie zdarzeń" }, "directoryIntegration": { - "message": "Directory integration" + "message": "Integracja katalogu" }, "passwordLessSso": { "message": "SSO bez hasła" @@ -9927,22 +9933,22 @@ "message": "Edytuj dostęp" }, "textHelpText": { - "message": "Use text fields for data like security questions" + "message": "Użyj pól tekstowych dla danych takich jak pytania bezpieczeństwa" }, "hiddenHelpText": { - "message": "Use hidden fields for sensitive data like a password" + "message": "Użyj ukrytych pól dla danych poufnych, takich jak hasło" }, "checkBoxHelpText": { - "message": "Use checkboxes if you'd like to autofill a form's checkbox, like a remember email" + "message": "Użyj pól wyboru, jeśli chcesz automatycznie wypełnić pole wyboru formularza, np. jak zapamiętywanie e-mail" }, "linkedHelpText": { - "message": "Use a linked field when you are experiencing autofill issues for a specific website." + "message": "Użyj powiązanego pola, gdy masz problemy z autouzupełnianiem na konkretnej stronie internetowej." }, "linkedLabelHelpText": { - "message": "Enter the the field's html id, name, aria-label, or placeholder." + "message": "Wprowadź atrybut z: html id, name, aria-label lub placeholder." }, "uppercaseDescription": { - "message": "Include uppercase characters", + "message": "Uwzględnij wielkie litery", "description": "Tooltip for the password generator uppercase character checkbox" }, "uppercaseLabel": { @@ -9983,23 +9989,23 @@ "message": "Czy na pewno chcesz trwale usunąć ten załącznik?" }, "manageSubscriptionFromThe": { - "message": "Manage subscription from the", + "message": "Zarządzaj subskrypcją z", "description": "This represents the beginning of a sentence. The full sentence will be 'Manage subscription from the Provider Portal', but 'Provider Portal' will be a link and thus cannot be included in the translation file." }, "toHostBitwardenOnYourOwnServer": { - "message": "To host Bitwarden on your own server, you will need to upload your license file. To support Free Families plans and advanced billing capabilities for your self-hosted organization, you will need to set up automatic sync in your self-hosted organization." + "message": "Aby hostować Bitwarden na własnym serwerze, musisz przesłać plik licencyjny. Aby wspierać darmowe plany rodzinne i zaawansowane możliwości rozliczeniowe dla Twojej własnej organizacji, musisz skonfigurować automatyczną synchronizację w swojej własnej organizacji." }, "selfHostingTitleProper": { - "message": "Self-Hosting" + "message": "Samodzielne hostowanie" }, "claim-domain-single-org-warning": { - "message": "Claiming a domain will turn on the single organization policy." + "message": "Rejestracja domeny włączy politykę jednej organizacji." }, "single-org-revoked-user-warning": { - "message": "Non-compliant members will be revoked. Administrators can restore members once they leave all other organizations." + "message": "Niezgodni członkowie zostaną odwołani. Administratorzy mogą przywrócić członków po opuszczeniu wszystkich innych organizacji." }, "deleteOrganizationUser": { - "message": "Delete $NAME$", + "message": "Usuń $NAME$", "placeholders": { "name": { "content": "$1", @@ -10009,7 +10015,7 @@ } }, "deleteOrganizationUserWarningDesc": { - "message": "This will permanently delete all items owned by $NAME$. Collection items are not impacted.", + "message": "Spowoduje to trwałe usunięcie wszystkich elementów należących do $NAME$. Nie ma to wpływu na elementy w kolekcji.", "description": "Warning description for the delete organization user dialog", "placeholders": { "name": { @@ -10019,11 +10025,11 @@ } }, "deleteManyOrganizationUsersWarningDesc": { - "message": "This will permanently delete all items owned by the following members. Collection items are not impacted.", + "message": "Spowoduje to trwałe usunięcie wszystkich elementów należących do następujących członków. Nie ma to wpływu na elementy w kolekcji.", "description": "Warning description for the bulk delete organization users dialog" }, "organizationUserDeleted": { - "message": "Deleted $NAME$", + "message": "Usunięto $NAME$", "placeholders": { "name": { "content": "$1", @@ -10032,10 +10038,10 @@ } }, "organizationUserDeletedDesc": { - "message": "The user was removed from the organization and all associated user data has been deleted." + "message": "Użytkownik został usunięty z organizacji i wszystkie powiązane dane z tym użytkownikiem zostały usunięte." }, "deletedUserId": { - "message": "Deleted user $ID$ - an owner / admin deleted the user account", + "message": "Usunięto użytkownika $ID$ - właściciel / administrator usunął te konto użytkownika", "placeholders": { "id": { "content": "$1", @@ -10044,7 +10050,7 @@ } }, "userLeftOrganization": { - "message": "User $ID$ left organization", + "message": "Użytkownik $ID$ opuścił organizację", "placeholders": { "id": { "content": "$1", @@ -10053,7 +10059,7 @@ } }, "suspendedOrganizationTitle": { - "message": "The $ORGANIZATION$ is suspended", + "message": "$ORGANIZATION$ jest zawieszona", "placeholders": { "organization": { "content": "$1", @@ -10062,52 +10068,61 @@ } }, "suspendedUserOrgMessage": { - "message": "Contact your organization owner for assistance." + "message": "Skontaktuj się z właścicielem organizacji, aby uzyskać pomoc." }, "suspendedOwnerOrgMessage": { - "message": "To regain access to your organization, add a payment method." + "message": "Aby odzyskać dostęp do swojej organizacji, dodaj metodę płatności." }, "deleteMembers": { - "message": "Delete members" + "message": "Usuń członków" }, "noSelectedMembersApplicable": { - "message": "This action is not applicable to any of the selected members." + "message": "Ta akcja nie ma zastosowania do żadnego z wybranych członków." }, "deletedSuccessfully": { - "message": "Deleted successfully" + "message": "Usunięto pomyślnie" }, "freeFamiliesSponsorship": { - "message": "Remove Free Bitwarden Families sponsorship" + "message": "Usuń darmowe sponsorowanie rodzin Bitwarden" }, "freeFamiliesSponsorshipPolicyDesc": { - "message": "Do not allow members to redeem a Families plan through this organization." + "message": "Nie zezwalaj członkom na wykupienie planu rodzin za pośrednictwem tej organizacji." }, "verifyBankAccountWithStatementDescriptorWarning": { - "message": "Payment with a bank account is only available to customers in the United States. You will be required to verify your bank account. We will make a micro-deposit within the next 1-2 business days. Enter the statement descriptor code from this deposit on the organization's billing page to verify the bank account. Failure to verify the bank account will result in a missed payment and your subscription being suspended." + "message": "Płatność na rachunku bankowym jest dostępna tylko dla klientów w Stanach Zjednoczonych. Będziesz musiał zweryfikować swoje konto bankowe. Dokonamy mikrowpłaty w ciągu następnych 1-2 dni roboczych. Wprowadź kod deskryptora instrukcji z tej wpłaty na stronie rozliczeniowej organizacji, aby zweryfikować konto bankowe. Niezweryfikowanie konta bankowego spowoduje nieodebraną płatność, a subskrypcja zostanie zawieszona." }, "verifyBankAccountWithStatementDescriptorInstructions": { - "message": "We have made a micro-deposit to your bank account (this may take 1-2 business days). Enter the six-digit code starting with 'SM' found on the deposit description. Failure to verify the bank account will result in a missed payment and your subscription being suspended." + "message": "Dokonaliśmy mikrowpłaty na Twoje konto bankowe (może to zająć 1-2 dni robocze). Wprowadź sześciocyfrowy kod zaczynający się od 'SM' znaleziony w opisie depozytu. Niezweryfikowanie konta bankowego spowoduje nieodebraną płatność, a subskrypcja zostanie zawieszona." }, "descriptorCode": { - "message": "Descriptor code" + "message": "Kod deskryptora" + }, + "cannotRemoveViewOnlyCollections": { + "message": "Nie można usunąć kolekcji z uprawnieniami tylko do przeglądania: $COLLECTIONS$", + "placeholders": { + "collections": { + "content": "$1", + "example": "Work, Personal" + } + } }, "importantNotice": { - "message": "Important notice" + "message": "Ważna informacja" }, "setupTwoStepLogin": { - "message": "Set up two-step login" + "message": "Skonfiguruj dwustopniowe logowanie" }, "newDeviceVerificationNoticeContentPage1": { - "message": "Bitwarden will send a code to your account email to verify logins from new devices starting in February 2025." + "message": "Bitwarden wyśle kod na Twój adres e-mail w celu zweryfikowania logowania z nowych urządzeń, począwszy od lutego 2025 r." }, "newDeviceVerificationNoticeContentPage2": { - "message": "You can set up two-step login as an alternative way to protect your account or change your email to one you can access." + "message": "Możesz skonfigurować dwustopniowe logowanie jako alternatywny sposób ochrony konta lub zmienić swój adres e-mail, do którego masz dostęp." }, "remindMeLater": { - "message": "Remind me later" + "message": "Przypomnij mi później" }, "newDeviceVerificationNoticePageOneFormContent": { - "message": "Do you have reliable access to your email, $EMAIL$?", + "message": "Czy masz pewny dostęp do swojego adresu e-mail, $EMAIL$?", "placeholders": { "email": { "content": "$1", @@ -10116,49 +10131,49 @@ } }, "newDeviceVerificationNoticePageOneEmailAccessNo": { - "message": "No, I do not" + "message": "Nie, nie mam" }, "newDeviceVerificationNoticePageOneEmailAccessYes": { - "message": "Yes, I can reliably access my email" + "message": "Tak, mam pewny dostęp do mojego adresu e-mail" }, "turnOnTwoStepLogin": { - "message": "Turn on two-step login" + "message": "Włącz dwustopniowe logowanie" }, "changeAcctEmail": { - "message": "Change account email" + "message": "Zmień adres e-mail konta" }, "removeMembers": { - "message": "Remove members" + "message": "Usuń użytkowników" }, "devices": { - "message": "Devices" + "message": "Urządzenia" }, "deviceListDescription": { - "message": "Your account was logged in to each of the devices below. If you do not recognize a device, remove it now." + "message": "Twoje konto zostało zalogowane na każdym z poniższych urządzeń. Jeśli nie rozpoznajesz urządzenia, usuń je teraz." }, "deviceListDescriptionTemp": { - "message": "Your account was logged in to each of the devices below." + "message": "Twoje konto zostało zalogowane na każdym z poniższych urządzeń." }, "claimedDomains": { - "message": "Claimed domains" + "message": "Zarejestrowane domeny" }, "claimDomain": { - "message": "Claim domain" + "message": "Zarejestruj domenę" }, "reclaimDomain": { - "message": "Reclaim domain" + "message": "Wyrejestruj domenę" }, "claimDomainNameInputHint": { - "message": "Example: mydomain.com. Subdomains require separate entries to be claimed." + "message": "Przykład: mydomain.com. Subdomeny wymagają osobnych wpisów celem weryfikacji." }, "automaticClaimedDomains": { - "message": "Automatic Claimed Domains" + "message": "Automatycznie zarejestrowane domeny" }, "automaticDomainClaimProcess": { - "message": "Bitwarden will attempt to claim the domain 3 times during the first 72 hours. If the domain can’t be claimed, check the DNS record in your host and manually claim. The domain will be removed from your organization in 7 days if it is not claimed." + "message": "Bitwarden spróbuje zweryfikować domenę 3 razy w ciągu pierwszych 72 godzin. Jeśli nie będzie można zweryfikować domeny, sprawdź rekord DNS na swoim serwerze i wprowadź go ręcznie. Domena zostanie usunięta z Twojej organizacji w ciągu 7 dni, jeśli nie zostanie zweryfikowana" }, "domainNotClaimed": { - "message": "$DOMAIN$ not claimed. Check your DNS records.", + "message": "$DOMAIN$ nie została zweryfikowana. Sprawdź swój rekord DNS.", "placeholders": { "DOMAIN": { "content": "$1", @@ -10167,19 +10182,19 @@ } }, "domainStatusClaimed": { - "message": "Claimed" + "message": "Zweryfikowano" }, "domainStatusUnderVerification": { - "message": "Under verification" + "message": "Podczas weryfikacji" }, "claimedDomainsDesc": { - "message": "Claim a domain to own all member accounts whose email address matches the domain. Members will be able to skip the SSO identifier when logging in. Administrators will also be able to delete member accounts." + "message": "Zweryfikuj domenę do posiadania wszystkich kont użytkowników, których adres e-mail pasuje do domeny. Członkowie będą mogli pominąć identyfikator SSO podczas logowania. Administratorzy będą również mogli usuwać konta członków." }, "invalidDomainNameClaimMessage": { - "message": "Input is not a valid format. Format: mydomain.com. Subdomains require separate entries to be claimed." + "message": "Wprowadzone dane są niepoprawne. Format: mydomain.com. Subdomeny wymagają osobnych wpisów celem weryfikacji." }, "domainClaimedEvent": { - "message": "$DOMAIN$ claimed", + "message": "Zweryfikowano $DOMAIN$", "placeholders": { "DOMAIN": { "content": "$1", @@ -10188,7 +10203,7 @@ } }, "domainNotClaimedEvent": { - "message": "$DOMAIN$ not claimed", + "message": "$DOMAIN$ nie została zweryfikowana", "placeholders": { "DOMAIN": { "content": "$1", @@ -10197,7 +10212,7 @@ } }, "updatedRevokeSponsorshipConfirmationForSentSponsorship": { - "message": "If you remove $EMAIL$, the sponsorship for this Family plan cannot be redeemed. Are you sure you want to continue?", + "message": "Jeśli usuniesz $EMAIL$, sponsorowanie tego planu rodziny nie może zostać zrealizowane. Czy na pewno chcesz kontynuować?", "placeholders": { "email": { "content": "$1", @@ -10206,7 +10221,7 @@ } }, "updatedRevokeSponsorshipConfirmationForAcceptedSponsorship": { - "message": "If you remove $EMAIL$, the sponsorship for this Family plan will end and the saved payment method will be charged $40 + applicable tax on $DATE$. You will not be able to redeem a new sponsorship until $DATE$. Are you sure you want to continue?", + "message": "Jeśli usuniesz $EMAIL$, sponsorowanie tego planu rodzinnego zakończy się, a zapisana metoda płatności zostanie naliczona 40 USD + obowiązujący podatek od $DATE$. Nie będziesz w stanie wykupić nowego sponsora do dnia $DATE$. Czy na pewno chcesz kontynuować?", "placeholders": { "email": { "content": "$1", @@ -10219,13 +10234,13 @@ } }, "domainClaimed": { - "message": "Domain claimed" + "message": "Domena zarejestrowana" }, "organizationNameMaxLength": { - "message": "Organization name cannot exceed 50 characters." + "message": "Nazwa organizacji nie może przekraczać 50 znaków." }, "resellerRenewalWarningMsg": { - "message": "Your subscription will renew soon. To ensure uninterrupted service, contact $RESELLER$ to confirm your renewal before $RENEWAL_DATE$.", + "message": "Twoja subskrypcja zostanie wkrótce odnowiona. Aby zapewnić nieprzerwaną usługę, skontaktuj się z $RESELLER$ , aby potwierdzić odnowienie przed $RENEWAL_DATE$.", "placeholders": { "reseller": { "content": "$1", @@ -10238,7 +10253,7 @@ } }, "resellerOpenInvoiceWarningMgs": { - "message": "An invoice for your subscription was issued on $ISSUED_DATE$. To ensure uninterrupted service, contact $RESELLER$ to confirm your renewal before $DUE_DATE$.", + "message": "Faktura za subskrypcję została wystawiona dnia $ISSUED_DATE$. Aby zapewnić nieprzerwaną usługę, skontaktuj się z $RESELLER$ , aby potwierdzić odnowienie przed dniem $DUE_DATE$.", "placeholders": { "reseller": { "content": "$1", @@ -10255,7 +10270,7 @@ } }, "resellerPastDueWarningMsg": { - "message": "The invoice for your subscription has not been paid. To ensure uninterrupted service, contact $RESELLER$ to confirm your renewal before $GRACE_PERIOD_END$.", + "message": "Faktura za subskrypcję nie została zapłacona. Aby zapewnić nieprzerwaną usługę, skontaktuj się z $RESELLER$ , aby potwierdzić odnowienie przed $GRACE_PERIOD_END$.", "placeholders": { "reseller": { "content": "$1", @@ -10268,18 +10283,67 @@ } }, "restartOrganizationSubscription": { - "message": "Organization subscription restarted" + "message": "Subskrypcja organizacji zrestartowana" }, "restartSubscription": { - "message": "Restart your subscription" + "message": "Zrestartuj swoją subskrypcję" }, "suspendedManagedOrgMessage": { - "message": "Contact $PROVIDER$ for assistance.", + "message": "Skontaktuj się z $PROVIDER$ w celu uzyskania pomocy.", "placeholders": { "provider": { "content": "$1", "example": "Acme c" } } + }, + "accountDeprovisioningNotification": { + "message": "Administratorzy mają teraz możliwość usunięcia kont członków, które należą do zarejestrowanej domeny." + }, + "deleteManagedUserWarningDesc": { + "message": "Ta akcja usunie konto członka, w tym wszystkie elementy w ich sejfie. To zastępuje poprzednią akcję Usunięcia." + }, + "deleteManagedUserWarning": { + "message": "Usuń jest nową akcją!" + }, + "seatsRemaining": { + "message": "Pozostało $REMAINING$ miejsc z $TOTAL$ miejsc przypisanych do tej organizacji. Skontaktuj się z dostawcą, aby zarządzać subskrypcją.", + "placeholders": { + "remaining": { + "content": "$1", + "example": "5" + }, + "total": { + "content": "$2", + "example": "10" + } + } + }, + "existingOrganization": { + "message": "Istniejąca organizacja" + }, + "selectOrganizationProviderPortal": { + "message": "Wybierz organizację, aby dodać do portalu dostawcy." + }, + "noOrganizations": { + "message": "Nie ma organizacji, którą można by wyświetlić" + }, + "yourProviderSubscriptionCredit": { + "message": "Subskrypcja twojego dostawcy otrzyma kredyt za pozostały czas w subskrypcji organizacji." + }, + "doYouWantToAddThisOrg": { + "message": "Czy chcesz dodać tę organizację do $PROVIDER$?", + "placeholders": { + "provider": { + "content": "$1", + "example": "Cool MSP" + } + } + }, + "addedExistingOrganization": { + "message": "Dodano istniejącą organizację" + }, + "assignedExceedsAvailable": { + "message": "Przypisane miejsca przekraczają dostępne miejsca." } } diff --git a/apps/web/src/locales/pt_BR/messages.json b/apps/web/src/locales/pt_BR/messages.json index 4b9e65535ce..85efb0c1027 100644 --- a/apps/web/src/locales/pt_BR/messages.json +++ b/apps/web/src/locales/pt_BR/messages.json @@ -464,6 +464,18 @@ "editFolder": { "message": "Editar Pasta" }, + "newFolder": { + "message": "New folder" + }, + "folderName": { + "message": "Folder name" + }, + "folderHintText": { + "message": "Nest a folder by adding the parent folder's name followed by a “/”. Example: Social/Forums" + }, + "deleteFolderPermanently": { + "message": "Are you sure you want to permanently delete this folder?" + }, "baseDomain": { "message": "Domínio de base", "description": "Domain name. Example: website.com" @@ -728,15 +740,6 @@ "itemName": { "message": "Nome do item" }, - "cannotRemoveViewOnlyCollections": { - "message": "Você não pode remover coleções com permissões de Somente leitura: $COLLECTIONS$", - "placeholders": { - "collections": { - "content": "$1", - "example": "Work, Personal" - } - } - }, "ex": { "message": "ex.", "description": "Short abbreviation for 'example'." @@ -1182,6 +1185,9 @@ "logInInitiated": { "message": "Login iniciado" }, + "logInRequestSent": { + "message": "Request sent" + }, "submit": { "message": "Enviar" }, @@ -1371,12 +1377,39 @@ "notificationSentDevice": { "message": "Uma notificação foi enviada para seu dispositivo." }, + "notificationSentDevicePart1": { + "message": "Unlock Bitwarden on your device or on the " + }, + "areYouTryingToAccessYourAccount": { + "message": "Are you trying to access your account?" + }, + "accessAttemptBy": { + "message": "Access attempt by $EMAIL$", + "placeholders": { + "email": { + "content": "$1", + "example": "name@example.com" + } + } + }, + "confirmAccess": { + "message": "Confirm access" + }, + "denyAccess": { + "message": "Deny access" + }, + "notificationSentDeviceAnchor": { + "message": "web app" + }, + "notificationSentDevicePart2": { + "message": "Make sure the Fingerprint phrase matches the one below before approving." + }, + "notificationSentDeviceComplete": { + "message": "Unlock Bitwarden on your device. Make sure the Fingerprint phrase matches the one below before approving." + }, "aNotificationWasSentToYourDevice": { "message": "Uma notificação foi enviada para seu dispositivo." }, - "makeSureYourAccountIsUnlockedAndTheFingerprintEtc": { - "message": "Certifique-se que sua conta esteja desbloqueado e que a frase de impressão digital corresponda à do outro dispositivo." - }, "versionNumber": { "message": "Versão $VERSION_NUMBER$", "placeholders": { @@ -1664,9 +1697,6 @@ "message": "Evitar caracteres ambíguos", "description": "Label for the avoid ambiguous characters checkbox." }, - "regeneratePassword": { - "message": "Gerar Nova Senha" - }, "length": { "message": "Comprimento" }, @@ -2170,8 +2200,20 @@ "manage": { "message": "Gerenciar" }, - "canManage": { - "message": "Pode gerenciar" + "manageCollection": { + "message": "Manage collection" + }, + "viewItems": { + "message": "View items" + }, + "viewItemsHidePass": { + "message": "View items, hidden passwords" + }, + "editItems": { + "message": "Edit items" + }, + "editItemsHidePass": { + "message": "Edit items, hidden passwords" }, "disable": { "message": "Desabilitar" @@ -2368,11 +2410,8 @@ "twoFactorU2fProblemReadingTryAgain": { "message": "Houve um problema ao ler a chave de segurança. Tente novamente." }, - "twoFactorWebAuthnWarning": { - "message": "Devido às limitações da plataforma, o WebAuthn não pode ser usado em todos os aplicativos do Bitwarden. Você deve habilitar outro provedor de login em duas etapas, para que você possa acessar a sua conta quando o WebAuthn não puder ser usado. Plataformas suportadas:" - }, - "twoFactorWebAuthnSupportWeb": { - "message": "Cofre web e extensões de navegador em um desktop/laptop com um navegador habilitado para WebAuthn (Chrome, Opera, Vivaldi ou Firefox com o FIDO U2F ativado)." + "twoFactorWebAuthnWarning1": { + "message": "Due to platform limitations, WebAuthn cannot be used on all Bitwarden applications. You should set up another two-step login provider so that you can access your account when WebAuthn cannot be used." }, "twoFactorRecoveryYourCode": { "message": "Seu código de recuperação de login em duas etapas do Bitwarden" @@ -4710,9 +4749,6 @@ "passwordGeneratorPolicyDesc": { "message": "Defina os requisitos mínimos para configuração do gerador de senhas." }, - "passwordGeneratorPolicyInEffect": { - "message": "Uma ou mais políticas da organização estão afetando as suas configurações do gerador." - }, "masterPasswordPolicyInEffect": { "message": "Uma ou mais políticas da organização exigem que a sua senha mestra cumpra aos seguintes requisitos:" }, @@ -6681,15 +6717,6 @@ "message": "Gerador", "description": "Short for 'credential generator'." }, - "whatWouldYouLikeToGenerate": { - "message": "O que você gostaria de gerar?" - }, - "passwordType": { - "message": "Tipo de Senha" - }, - "regenerateUsername": { - "message": "Recriar Usuário" - }, "generateUsername": { "message": "Gerar Usuário" }, @@ -6730,9 +6757,6 @@ } } }, - "usernameType": { - "message": "Tipo de Usuário" - }, "plusAddressedEmail": { "message": "E-mail alternativo (com um +)", "description": "Username generator option that appends a random sub-address to the username. For example: address+subaddress@email.com" @@ -6952,9 +6976,6 @@ "message": "Hostname", "description": "Part of a URL." }, - "apiAccessToken": { - "message": "Token de acesso API" - }, "deviceVerification": { "message": "Verificação do dispositivo" }, @@ -7666,18 +7687,6 @@ "noCollection": { "message": "Sem coleções" }, - "canView": { - "message": "Pode ver" - }, - "canViewExceptPass": { - "message": "Pode ver, exceto senhas" - }, - "canEdit": { - "message": "Pode editar" - }, - "canEditExceptPass": { - "message": "Pode editar, exceto senhas" - }, "noCollectionsAdded": { "message": "Nenhuma coleção adicionada" }, @@ -8677,9 +8686,6 @@ "message": "URL do servidor auto-host", "description": "Label for field requesting a self-hosted integration service URL" }, - "aliasDomain": { - "message": "Alias do domínio" - }, "alreadyHaveAccount": { "message": "Já tem uma conta?" }, @@ -8741,11 +8747,11 @@ "readOnlyCollectionAccess": { "message": "Você não tem acesso para gerenciar esta coleção." }, - "grantAddAccessCollectionWarningTitle": { - "message": "Falta conceder o Poder de Gerenciar Permissões" + "grantManageCollectionWarningTitle": { + "message": "Missing Manage Collection Permissions" }, - "grantAddAccessCollectionWarning": { - "message": "Conceda o poder de gerenciar permissões para habilitar o gerenciamento completo da coleção, incluindo a exclusão da coleção." + "grantManageCollectionWarning": { + "message": "Grant Manage collection permissions to allow full collection management including deletion of collection." }, "grantCollectionAccess": { "message": "Conceder acesso de grupos ou membros a esta coleção." @@ -10091,6 +10097,15 @@ "descriptorCode": { "message": "Código do descritor" }, + "cannotRemoveViewOnlyCollections": { + "message": "Você não pode remover coleções com permissões de Somente leitura: $COLLECTIONS$", + "placeholders": { + "collections": { + "content": "$1", + "example": "Work, Personal" + } + } + }, "importantNotice": { "message": "Important notice" }, @@ -10281,5 +10296,54 @@ "example": "Acme c" } } + }, + "accountDeprovisioningNotification": { + "message": "Administrators now have the ability to delete member accounts that belong to a claimed domain." + }, + "deleteManagedUserWarningDesc": { + "message": "This action will delete the member account including all items in their vault. This replaces the previous Remove action." + }, + "deleteManagedUserWarning": { + "message": "Delete is a new action!" + }, + "seatsRemaining": { + "message": "You have $REMAINING$ seats remaining out of $TOTAL$ seats assigned to this organization. Contact your provider to manage your subscription.", + "placeholders": { + "remaining": { + "content": "$1", + "example": "5" + }, + "total": { + "content": "$2", + "example": "10" + } + } + }, + "existingOrganization": { + "message": "Existing organization" + }, + "selectOrganizationProviderPortal": { + "message": "Select an organization to add to your Provider Portal." + }, + "noOrganizations": { + "message": "There are no organizations to list" + }, + "yourProviderSubscriptionCredit": { + "message": "Your provider subscription will receive a credit for any remaining time in the organization's subscription." + }, + "doYouWantToAddThisOrg": { + "message": "Do you want to add this organization to $PROVIDER$?", + "placeholders": { + "provider": { + "content": "$1", + "example": "Cool MSP" + } + } + }, + "addedExistingOrganization": { + "message": "Added existing organization" + }, + "assignedExceedsAvailable": { + "message": "Assigned seats exceed available seats." } } diff --git a/apps/web/src/locales/pt_PT/messages.json b/apps/web/src/locales/pt_PT/messages.json index 6d724302888..a9d5e461086 100644 --- a/apps/web/src/locales/pt_PT/messages.json +++ b/apps/web/src/locales/pt_PT/messages.json @@ -464,6 +464,18 @@ "editFolder": { "message": "Editar pasta" }, + "newFolder": { + "message": "Nova pasta" + }, + "folderName": { + "message": "Nome da pasta" + }, + "folderHintText": { + "message": "Crie uma subpasta adicionando o nome da pasta principal seguido de um \"/\". Exemplo: Redes Sociais/Fóruns" + }, + "deleteFolderPermanently": { + "message": "Tem a certeza de que pretende eliminar permanentemente esta pasta?" + }, "baseDomain": { "message": "Domínio de base", "description": "Domain name. Example: website.com" @@ -728,15 +740,6 @@ "itemName": { "message": "Nome do item" }, - "cannotRemoveViewOnlyCollections": { - "message": "Não é possível remover coleções com permissões de Apenas visualização: $COLLECTIONS$", - "placeholders": { - "collections": { - "content": "$1", - "example": "Work, Personal" - } - } - }, "ex": { "message": "ex.", "description": "Short abbreviation for 'example'." @@ -1182,6 +1185,9 @@ "logInInitiated": { "message": "A preparar o início de sessão" }, + "logInRequestSent": { + "message": "Pedido enviado" + }, "submit": { "message": "Submeter" }, @@ -1371,12 +1377,39 @@ "notificationSentDevice": { "message": "Foi enviada uma notificação para o seu dispositivo." }, + "notificationSentDevicePart1": { + "message": "Desbloqueie o Bitwarden no seu dispositivo ou no " + }, + "areYouTryingToAccessYourAccount": { + "message": "Está a tentar aceder à sua conta?" + }, + "accessAttemptBy": { + "message": "Tentativa de acesso por $EMAIL$", + "placeholders": { + "email": { + "content": "$1", + "example": "name@example.com" + } + } + }, + "confirmAccess": { + "message": "Confirmar acesso" + }, + "denyAccess": { + "message": "Recusar acesso" + }, + "notificationSentDeviceAnchor": { + "message": "aplicação web" + }, + "notificationSentDevicePart2": { + "message": "Certifique-se de que a frase da impressão digital corresponde à frase abaixo indicada antes de a aprovar." + }, + "notificationSentDeviceComplete": { + "message": "Desbloqueie o Bitwarden no seu dispositivo. Certifique-se de que a frase da impressão digital corresponde à frase abaixo antes de a aprovar." + }, "aNotificationWasSentToYourDevice": { "message": "Foi enviada uma notificação para o seu dispositivo" }, - "makeSureYourAccountIsUnlockedAndTheFingerprintEtc": { - "message": "Certifique-se de que a sua conta está desbloqueada e que a frase de impressão digital corresponde à do outro dispositivo" - }, "versionNumber": { "message": "Versão $VERSION_NUMBER$", "placeholders": { @@ -1664,9 +1697,6 @@ "message": "Evitar carateres ambíguos", "description": "Label for the avoid ambiguous characters checkbox." }, - "regeneratePassword": { - "message": "Regenerar palavra-passe" - }, "length": { "message": "Comprimento" }, @@ -1849,25 +1879,25 @@ "message": "Ao prosseguir, também terminará a sua sessão atual e terá de iniciar sessão novamente. Ser-lhe-á também pedido que volte efetuar a verificação de dois passos, se estiver configurada. As sessões ativas noutros dispositivos podem continuar ativas até uma hora." }, "newDeviceLoginProtection": { - "message": "New device login" + "message": "Início de sessão de um novo dispositivo" }, "turnOffNewDeviceLoginProtection": { - "message": "Turn off new device login protection" + "message": "Desativar a proteção de início de sessão de novos dispositivos" }, "turnOnNewDeviceLoginProtection": { - "message": "Turn on new device login protection" + "message": "Ativar a proteção de início de sessão de novos dispositivos" }, "turnOffNewDeviceLoginProtectionModalDesc": { - "message": "Proceed below to turn off the verification emails bitwarden sends when you login from a new device." + "message": "Proceda da seguinte forma para desativar os e-mails de verificação que o Bitwarden envia quando inicia sessão a partir de um novo dispositivo." }, "turnOnNewDeviceLoginProtectionModalDesc": { - "message": "Proceed below to have bitwarden send you verification emails when you login from a new device." + "message": "Proceda da seguinte forma para que o Bitwarden lhe envie e-mails de verificação quando iniciar sessão a partir de um novo dispositivo." }, "turnOffNewDeviceLoginProtectionWarning": { - "message": "With new device login protection turned off, anyone with your master password can access your account from any device. To protect your account without verification emails, set up two-step login." + "message": "Com a proteção de início de sessão de novos dispositivos desativada, qualquer pessoa com a sua palavra-passe mestra pode aceder à sua conta a partir de qualquer dispositivo. Para proteger a sua conta sem e-mails de verificação, configure a verificação de dois passos." }, "accountNewDeviceLoginProtectionSaved": { - "message": "New device login protection changes saved" + "message": "Alterações na proteção do início de sessão do novo dispositivo guardadas" }, "sessionsDeauthorized": { "message": "Todas as sessões desautorizadas" @@ -2170,8 +2200,20 @@ "manage": { "message": "Gerir" }, - "canManage": { - "message": "Pode gerir" + "manageCollection": { + "message": "Gerir coleção" + }, + "viewItems": { + "message": "Ver itens" + }, + "viewItemsHidePass": { + "message": "Ver itens, palavras-passe ocultas" + }, + "editItems": { + "message": "Editar itens" + }, + "editItemsHidePass": { + "message": "Editar itens, palavras-passe ocultas" }, "disable": { "message": "Desativar" @@ -2368,11 +2410,8 @@ "twoFactorU2fProblemReadingTryAgain": { "message": "Ocorreu um problema ao ler a chave de segurança. Tente novamente." }, - "twoFactorWebAuthnWarning": { - "message": "Devido a limitações da plataforma, o WebAuthn não pode ser utilizado em todas as aplicações Bitwarden. Deve configurar outro fornecedor de verificação de dois passos para que possa aceder à sua conta quando o WebAuthn não puder ser utilizado. Plataformas suportadas:" - }, - "twoFactorWebAuthnSupportWeb": { - "message": "Cofre web e extensões do navegador num computador de secretária/portátil com um navegador compatível com WebAuthn (Chrome, Opera, Vivaldi ou Firefox com FIDO U2F ativado)." + "twoFactorWebAuthnWarning1": { + "message": "Devido a limitações da plataforma, o WebAuthn não pode ser utilizado em todas as aplicações Bitwarden. Deve configurar outro fornecedor de verificação de dois passos para poder aceder à sua conta quando o WebAuthn não puder ser utilizado." }, "twoFactorRecoveryYourCode": { "message": "O seu código Bitwarden de recuperação da verificação de dois passos" @@ -4710,9 +4749,6 @@ "passwordGeneratorPolicyDesc": { "message": "Definir requisitos para o gerador de palavras-passe." }, - "passwordGeneratorPolicyInEffect": { - "message": "Uma ou mais políticas da organização estão a afetar as suas definições do gerador." - }, "masterPasswordPolicyInEffect": { "message": "Uma ou mais políticas da organização exigem que a sua palavra-passe mestra cumpra os seguintes requisitos:" }, @@ -6681,15 +6717,6 @@ "message": "Gerador", "description": "Short for 'credential generator'." }, - "whatWouldYouLikeToGenerate": { - "message": "O que é que gostaria de gerar?" - }, - "passwordType": { - "message": "Tipo de palavra-passe" - }, - "regenerateUsername": { - "message": "Regenerar nome de utilizador" - }, "generateUsername": { "message": "Gerar nome de utilizador" }, @@ -6730,9 +6757,6 @@ } } }, - "usernameType": { - "message": "Tipo de nome de utilizador" - }, "plusAddressedEmail": { "message": "E-mail com subendereço", "description": "Username generator option that appends a random sub-address to the username. For example: address+subaddress@email.com" @@ -6952,9 +6976,6 @@ "message": "Nome de domínio", "description": "Part of a URL." }, - "apiAccessToken": { - "message": "Token de acesso à API" - }, "deviceVerification": { "message": "Verificação do dispositivo" }, @@ -7666,18 +7687,6 @@ "noCollection": { "message": "Sem coleções" }, - "canView": { - "message": "Pode ver" - }, - "canViewExceptPass": { - "message": "Pode ver, excepto palavras-passe" - }, - "canEdit": { - "message": "Pode editar" - }, - "canEditExceptPass": { - "message": "Pode editar, excepto palavras-passe" - }, "noCollectionsAdded": { "message": "Não foram adicionadas coleções" }, @@ -8626,7 +8635,7 @@ "message": "Limitar a eliminação de coleções aos proprietários e administradores" }, "limitItemDeletionDesc": { - "message": "Limit item deletion to members with the Can manage permission" + "message": "Limitar a eliminação de itens a membros com a permissão Pode gerir" }, "allowAdminAccessToAllCollectionItemsDesc": { "message": "Os proprietários e administradores podem gerir todas as coleções e itens" @@ -8677,9 +8686,6 @@ "message": "URL do servidor auto-hospedado", "description": "Label for field requesting a self-hosted integration service URL" }, - "aliasDomain": { - "message": "Alias de domínio" - }, "alreadyHaveAccount": { "message": "Já tem uma conta?" }, @@ -8741,11 +8747,11 @@ "readOnlyCollectionAccess": { "message": "Não tem acesso para gerir esta coleção." }, - "grantAddAccessCollectionWarningTitle": { - "message": "Faltam permissões Pode gerir" + "grantManageCollectionWarningTitle": { + "message": "Permissões de gestão de coleções em falta" }, - "grantAddAccessCollectionWarning": { - "message": "Conceda permissões Pode gerir para permitir a gestão completa da coleção, incluindo a eliminação da coleção." + "grantManageCollectionWarning": { + "message": "Conceda permissões Gerir coleção para permitir a gestão completa da coleção, incluindo a eliminação da mesma." }, "grantCollectionAccess": { "message": "Conceder a grupos ou membros acesso a esta coleção." @@ -10091,6 +10097,15 @@ "descriptorCode": { "message": "Código descritor" }, + "cannotRemoveViewOnlyCollections": { + "message": "Não é possível remover coleções com permissões de Apenas visualização: $COLLECTIONS$", + "placeholders": { + "collections": { + "content": "$1", + "example": "Work, Personal" + } + } + }, "importantNotice": { "message": "Aviso importante" }, @@ -10281,5 +10296,54 @@ "example": "Acme c" } } + }, + "accountDeprovisioningNotification": { + "message": "Os administradores têm agora a capacidade de eliminar contas de membros que pertençam a um domínio reivindicado." + }, + "deleteManagedUserWarningDesc": { + "message": "Esta ação elimina a conta do membro, incluindo todos os itens no seu cofre. Esta ação substitui a anterior Remover." + }, + "deleteManagedUserWarning": { + "message": "Eliminar é uma nova ação!" + }, + "seatsRemaining": { + "message": "Tem $REMAINING$ lugares restantes dos $TOTAL$ lugares atribuídos a esta organização. Contacte o seu fornecedor para gerir a sua subscrição.", + "placeholders": { + "remaining": { + "content": "$1", + "example": "5" + }, + "total": { + "content": "$2", + "example": "10" + } + } + }, + "existingOrganization": { + "message": "Organização existente" + }, + "selectOrganizationProviderPortal": { + "message": "Selecione uma organização para adicionar ao seu Portal do fornecedor." + }, + "noOrganizations": { + "message": "Não existem organizações para listar" + }, + "yourProviderSubscriptionCredit": { + "message": "A subscrição do fornecedor receberá um crédito por qualquer tempo restante na subscrição da organização." + }, + "doYouWantToAddThisOrg": { + "message": "Pretende adicionar esta organização a $PROVIDER$?", + "placeholders": { + "provider": { + "content": "$1", + "example": "Cool MSP" + } + } + }, + "addedExistingOrganization": { + "message": "Organização existente adicionada" + }, + "assignedExceedsAvailable": { + "message": "Os lugares atribuídos excedem os lugares disponíveis." } } diff --git a/apps/web/src/locales/ro/messages.json b/apps/web/src/locales/ro/messages.json index 966ef8fdcb3..4db5a16a566 100644 --- a/apps/web/src/locales/ro/messages.json +++ b/apps/web/src/locales/ro/messages.json @@ -464,6 +464,18 @@ "editFolder": { "message": "Editare dosar" }, + "newFolder": { + "message": "New folder" + }, + "folderName": { + "message": "Folder name" + }, + "folderHintText": { + "message": "Nest a folder by adding the parent folder's name followed by a “/”. Example: Social/Forums" + }, + "deleteFolderPermanently": { + "message": "Are you sure you want to permanently delete this folder?" + }, "baseDomain": { "message": "Domeniu de bază", "description": "Domain name. Example: website.com" @@ -728,15 +740,6 @@ "itemName": { "message": "Item name" }, - "cannotRemoveViewOnlyCollections": { - "message": "You cannot remove collections with View only permissions: $COLLECTIONS$", - "placeholders": { - "collections": { - "content": "$1", - "example": "Work, Personal" - } - } - }, "ex": { "message": "ex.", "description": "Short abbreviation for 'example'." @@ -1182,6 +1185,9 @@ "logInInitiated": { "message": "Autentificare inițiată" }, + "logInRequestSent": { + "message": "Request sent" + }, "submit": { "message": "Trimitere" }, @@ -1371,12 +1377,39 @@ "notificationSentDevice": { "message": "O notificare a fost trimisă pe dispozitivul dvs." }, + "notificationSentDevicePart1": { + "message": "Unlock Bitwarden on your device or on the " + }, + "areYouTryingToAccessYourAccount": { + "message": "Are you trying to access your account?" + }, + "accessAttemptBy": { + "message": "Access attempt by $EMAIL$", + "placeholders": { + "email": { + "content": "$1", + "example": "name@example.com" + } + } + }, + "confirmAccess": { + "message": "Confirm access" + }, + "denyAccess": { + "message": "Deny access" + }, + "notificationSentDeviceAnchor": { + "message": "web app" + }, + "notificationSentDevicePart2": { + "message": "Make sure the Fingerprint phrase matches the one below before approving." + }, + "notificationSentDeviceComplete": { + "message": "Unlock Bitwarden on your device. Make sure the Fingerprint phrase matches the one below before approving." + }, "aNotificationWasSentToYourDevice": { "message": "A notification was sent to your device" }, - "makeSureYourAccountIsUnlockedAndTheFingerprintEtc": { - "message": "Make sure your account is unlocked and the fingerprint phrase matches on the other device" - }, "versionNumber": { "message": "Versiunea $VERSION_NUMBER$", "placeholders": { @@ -1664,9 +1697,6 @@ "message": "Avoid ambiguous characters", "description": "Label for the avoid ambiguous characters checkbox." }, - "regeneratePassword": { - "message": "Regenerare parolă" - }, "length": { "message": "Lungime" }, @@ -2170,8 +2200,20 @@ "manage": { "message": "Gestionare" }, - "canManage": { - "message": "Can manage" + "manageCollection": { + "message": "Manage collection" + }, + "viewItems": { + "message": "View items" + }, + "viewItemsHidePass": { + "message": "View items, hidden passwords" + }, + "editItems": { + "message": "Edit items" + }, + "editItemsHidePass": { + "message": "Edit items, hidden passwords" }, "disable": { "message": "Dezactivare" @@ -2368,11 +2410,8 @@ "twoFactorU2fProblemReadingTryAgain": { "message": "A apărut o problemă la citirea cheii de securitate. Încercați din nou." }, - "twoFactorWebAuthnWarning": { - "message": "Din cauza limitărilor de platformă, WebAuthn nu poate fi utilizat pe toate aplicațiile Bitwarden. Ar trebui să configurați un alt furnizor de autentificare în două etape, astfel încât să vă puteți accesa contul atunci când WebAuthn nu se poate utiliza. Platformele acceptate:" - }, - "twoFactorWebAuthnSupportWeb": { - "message": "Seif web și extensii de browser pe un desktop/laptop cu un browser compatibil cu WebAuthn (Chrome, Opera, Vivaldi sau Firefox cu FIDO U2F activat)." + "twoFactorWebAuthnWarning1": { + "message": "Due to platform limitations, WebAuthn cannot be used on all Bitwarden applications. You should set up another two-step login provider so that you can access your account when WebAuthn cannot be used." }, "twoFactorRecoveryYourCode": { "message": "Codul dvs. Bitwarden de recuperare a autentificării în două etape" @@ -4710,9 +4749,6 @@ "passwordGeneratorPolicyDesc": { "message": "Setați cerințele pentru generatorul de parole." }, - "passwordGeneratorPolicyInEffect": { - "message": "Una sau mai multe politici organizaționale vă afectează setările generatorului." - }, "masterPasswordPolicyInEffect": { "message": "Una sau mai multe politici organizaționale necesită ca parola principală să îndeplinească următoarele cerințe:" }, @@ -6681,15 +6717,6 @@ "message": "Generator", "description": "Short for 'credential generator'." }, - "whatWouldYouLikeToGenerate": { - "message": "Ce doriți să generați?" - }, - "passwordType": { - "message": "Tip de parolă" - }, - "regenerateUsername": { - "message": "Regenerare nume de utilizator" - }, "generateUsername": { "message": "Generare nume de utilizator" }, @@ -6730,9 +6757,6 @@ } } }, - "usernameType": { - "message": "Tip de nume de utilizator" - }, "plusAddressedEmail": { "message": "E-mail Plus adresat", "description": "Username generator option that appends a random sub-address to the username. For example: address+subaddress@email.com" @@ -6952,9 +6976,6 @@ "message": "Nume gazdă", "description": "Part of a URL." }, - "apiAccessToken": { - "message": "Token de acces API" - }, "deviceVerification": { "message": "Verificarea dispozitivului" }, @@ -7666,18 +7687,6 @@ "noCollection": { "message": "No collection" }, - "canView": { - "message": "Can view" - }, - "canViewExceptPass": { - "message": "Can view, except passwords" - }, - "canEdit": { - "message": "Can edit" - }, - "canEditExceptPass": { - "message": "Can edit, except passwords" - }, "noCollectionsAdded": { "message": "No collections added" }, @@ -8677,9 +8686,6 @@ "message": "Self-host server URL", "description": "Label for field requesting a self-hosted integration service URL" }, - "aliasDomain": { - "message": "Alias domain" - }, "alreadyHaveAccount": { "message": "Already have an account?" }, @@ -8741,11 +8747,11 @@ "readOnlyCollectionAccess": { "message": "You do not have access to manage this collection." }, - "grantAddAccessCollectionWarningTitle": { - "message": "Missing Can Manage Permissions" + "grantManageCollectionWarningTitle": { + "message": "Missing Manage Collection Permissions" }, - "grantAddAccessCollectionWarning": { - "message": "Grant Can manage permissions to allow full collection management including deletion of collection." + "grantManageCollectionWarning": { + "message": "Grant Manage collection permissions to allow full collection management including deletion of collection." }, "grantCollectionAccess": { "message": "Grant groups or members access to this collection." @@ -10091,6 +10097,15 @@ "descriptorCode": { "message": "Descriptor code" }, + "cannotRemoveViewOnlyCollections": { + "message": "You cannot remove collections with View only permissions: $COLLECTIONS$", + "placeholders": { + "collections": { + "content": "$1", + "example": "Work, Personal" + } + } + }, "importantNotice": { "message": "Important notice" }, @@ -10281,5 +10296,54 @@ "example": "Acme c" } } + }, + "accountDeprovisioningNotification": { + "message": "Administrators now have the ability to delete member accounts that belong to a claimed domain." + }, + "deleteManagedUserWarningDesc": { + "message": "This action will delete the member account including all items in their vault. This replaces the previous Remove action." + }, + "deleteManagedUserWarning": { + "message": "Delete is a new action!" + }, + "seatsRemaining": { + "message": "You have $REMAINING$ seats remaining out of $TOTAL$ seats assigned to this organization. Contact your provider to manage your subscription.", + "placeholders": { + "remaining": { + "content": "$1", + "example": "5" + }, + "total": { + "content": "$2", + "example": "10" + } + } + }, + "existingOrganization": { + "message": "Existing organization" + }, + "selectOrganizationProviderPortal": { + "message": "Select an organization to add to your Provider Portal." + }, + "noOrganizations": { + "message": "There are no organizations to list" + }, + "yourProviderSubscriptionCredit": { + "message": "Your provider subscription will receive a credit for any remaining time in the organization's subscription." + }, + "doYouWantToAddThisOrg": { + "message": "Do you want to add this organization to $PROVIDER$?", + "placeholders": { + "provider": { + "content": "$1", + "example": "Cool MSP" + } + } + }, + "addedExistingOrganization": { + "message": "Added existing organization" + }, + "assignedExceedsAvailable": { + "message": "Assigned seats exceed available seats." } } diff --git a/apps/web/src/locales/ru/messages.json b/apps/web/src/locales/ru/messages.json index 622fe2f2705..0c8ee796b4a 100644 --- a/apps/web/src/locales/ru/messages.json +++ b/apps/web/src/locales/ru/messages.json @@ -156,16 +156,16 @@ "message": "Всего приложений" }, "unmarkAsCriticalApp": { - "message": "Unmark as critical app" + "message": "Снять пометку критического приложения" }, "criticalApplicationSuccessfullyUnmarked": { - "message": "Critical application successfully unmarked" + "message": "Критическое приложение успешно снято" }, "whatTypeOfItem": { "message": "Выберите тип элемента" }, "name": { - "message": "Название" + "message": "Имя" }, "uri": { "message": "URI" @@ -464,6 +464,18 @@ "editFolder": { "message": "Изменить папку" }, + "newFolder": { + "message": "Новая папка" + }, + "folderName": { + "message": "Название папки" + }, + "folderHintText": { + "message": "Создайте вложенную папку, добавив название родительской папки и символ \"/\". Пример: Сообщества/Форумы" + }, + "deleteFolderPermanently": { + "message": "Вы действительно хотите безвозвратно удалить эту папку?" + }, "baseDomain": { "message": "Основной домен", "description": "Domain name. Example: website.com" @@ -728,15 +740,6 @@ "itemName": { "message": "Название элемента" }, - "cannotRemoveViewOnlyCollections": { - "message": "Вы не можете удалить коллекции с правами только на просмотр: $COLLECTIONS$", - "placeholders": { - "collections": { - "content": "$1", - "example": "Work, Personal" - } - } - }, "ex": { "message": "напр.", "description": "Short abbreviation for 'example'." @@ -1182,6 +1185,9 @@ "logInInitiated": { "message": "Вход инициирован" }, + "logInRequestSent": { + "message": "Запрос отправлен" + }, "submit": { "message": "Подтвердить" }, @@ -1371,12 +1377,39 @@ "notificationSentDevice": { "message": "На ваше устройство отправлено уведомление." }, + "notificationSentDevicePart1": { + "message": "Разблокируйте Bitwarden на своем устройстве или " + }, + "areYouTryingToAccessYourAccount": { + "message": "Вы пытаетесь получить доступ к своему аккаунту?" + }, + "accessAttemptBy": { + "message": "Попытка доступа $EMAIL$", + "placeholders": { + "email": { + "content": "$1", + "example": "name@example.com" + } + } + }, + "confirmAccess": { + "message": "Подтвердить доступ" + }, + "denyAccess": { + "message": "Отказать в доступе" + }, + "notificationSentDeviceAnchor": { + "message": "веб-приложении" + }, + "notificationSentDevicePart2": { + "message": "Перед одобрением убедитесь, что фраза отпечатка совпадает с приведенной ниже." + }, + "notificationSentDeviceComplete": { + "message": "Разблокируйте Bitwarden на своем устройстве. Перед одобрением убедитесь, что фраза отпечатка совпадает с приведенной ниже." + }, "aNotificationWasSentToYourDevice": { "message": "На ваше устройство было отправлено уведомление" }, - "makeSureYourAccountIsUnlockedAndTheFingerprintEtc": { - "message": "Убедитесь, что ваш аккаунт разблокирован и фраза отпечатка совпадает с фразой на другом устройстве" - }, "versionNumber": { "message": "Версия $VERSION_NUMBER$", "placeholders": { @@ -1664,9 +1697,6 @@ "message": "Избегать неоднозначных символов", "description": "Label for the avoid ambiguous characters checkbox." }, - "regeneratePassword": { - "message": "Создать новый пароль" - }, "length": { "message": "Длина" }, @@ -2170,8 +2200,20 @@ "manage": { "message": "Управление" }, - "canManage": { - "message": "Может управлять" + "manageCollection": { + "message": "Управление коллекцией" + }, + "viewItems": { + "message": "Просмотр элементов" + }, + "viewItemsHidePass": { + "message": "Просмотр элементов, скрытых паролей" + }, + "editItems": { + "message": "Изменить элементы" + }, + "editItemsHidePass": { + "message": "Изменить элементы, скрытые пароли" }, "disable": { "message": "Отключить" @@ -2368,11 +2410,8 @@ "twoFactorU2fProblemReadingTryAgain": { "message": "Не удалось прочитать ключ безопасности. Попробуйте снова." }, - "twoFactorWebAuthnWarning": { - "message": "Из-за ограничений платформы WebAuthn нельзя использовать во всех приложениях Bitwarden. Вы должны настроить другого провайдера двухэтапной аутентификации, чтобы иметь возможность получить доступ к своей учетной записи, когда WebAuthn не может быть использован. Поддерживаемые платформы:" - }, - "twoFactorWebAuthnSupportWeb": { - "message": "Веб-хранилище и расширения браузера на компьютере/ноутбуке с браузером с поддержкой WebAuthn (Chrome, Opera, Vivaldi или Firefox с включенным FIDO U2F)." + "twoFactorWebAuthnWarning1": { + "message": "Из-за ограничений платформы WebAuthn нельзя использовать во всех приложениях Bitwarden. Вы должны настроить другого провайдера двухэтапной аутентификации, чтобы иметь возможность получить доступ к своей учетной записи, когда WebAuthn не может быть использован." }, "twoFactorRecoveryYourCode": { "message": "Ваш код восстановления двухэтапной аутентификации Bitwarden" @@ -4710,9 +4749,6 @@ "passwordGeneratorPolicyDesc": { "message": "Установить требования к генератору паролей." }, - "passwordGeneratorPolicyInEffect": { - "message": "На настройки генератора влияют одна или несколько политик организации." - }, "masterPasswordPolicyInEffect": { "message": "Согласно одной или нескольким политикам организации необходимо, чтобы ваш мастер-пароль отвечал следующим требованиям:" }, @@ -6681,15 +6717,6 @@ "message": "Генератор", "description": "Short for 'credential generator'." }, - "whatWouldYouLikeToGenerate": { - "message": "Что вы хотите сгенерировать?" - }, - "passwordType": { - "message": "Тип пароля" - }, - "regenerateUsername": { - "message": "Пересоздать имя пользователя" - }, "generateUsername": { "message": "Создать имя пользователя" }, @@ -6730,9 +6757,6 @@ } } }, - "usernameType": { - "message": "Тип имени пользователя" - }, "plusAddressedEmail": { "message": "Субадресованные email", "description": "Username generator option that appends a random sub-address to the username. For example: address+subaddress@email.com" @@ -6952,9 +6976,6 @@ "message": "Имя хоста", "description": "Part of a URL." }, - "apiAccessToken": { - "message": "Токен доступа к API" - }, "deviceVerification": { "message": "Проверка устройства" }, @@ -7666,18 +7687,6 @@ "noCollection": { "message": "Нет коллекций" }, - "canView": { - "message": "Может просматривать" - }, - "canViewExceptPass": { - "message": "Может просматривать, кроме паролей" - }, - "canEdit": { - "message": "Может редактировать" - }, - "canEditExceptPass": { - "message": "Может редактировать, кроме паролей" - }, "noCollectionsAdded": { "message": "Нет добавленных коллекций" }, @@ -8306,19 +8315,19 @@ "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Members will not need a master password when logging in with SSO. Master password is replaced with an encryption key stored on the device, making that device trusted. The first device a member creates their account and logs into will be trusted. New devices will need to be approved by an existing trusted device or by an administrator. The single organization policy, SSO required policy, and account recovery administration policy will turn on when this option is used.'" }, "memberDecryptionOptionTdeDescLink1": { - "message": "single organization", + "message": "одна организация", "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Members will not need a master password when logging in with SSO. Master password is replaced with an encryption key stored on the device, making that device trusted. The first device a member creates their account and logs into will be trusted. New devices will need to be approved by an existing trusted device or by an administrator. The single organization policy, SSO required policy, and account recovery administration policy will turn on when this option is used.'" }, "memberDecryptionOptionTdeDescPart2": { - "message": "policy,", + "message": "политика,", "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Members will not need a master password when logging in with SSO. Master password is replaced with an encryption key stored on the device, making that device trusted. The first device a member creates their account and logs into will be trusted. New devices will need to be approved by an existing trusted device or by an administrator. The single organization policy, SSO required policy, and account recovery administration policy will turn on when this option is used.'" }, "memberDecryptionOptionTdeDescLink2": { - "message": "SSO required", + "message": "Требуется SSO", "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Members will not need a master password when logging in with SSO. Master password is replaced with an encryption key stored on the device, making that device trusted. The first device a member creates their account and logs into will be trusted. New devices will need to be approved by an existing trusted device or by an administrator. The single organization policy, SSO required policy, and account recovery administration policy will turn on when this option is used.'" }, "memberDecryptionOptionTdeDescPart3": { - "message": "policy, and", + "message": "политика, и", "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Members will not need a master password when logging in with SSO. Master password is replaced with an encryption key stored on the device, making that device trusted. The first device a member creates their account and logs into will be trusted. New devices will need to be approved by an existing trusted device or by an administrator. The single organization policy, SSO required policy, and account recovery administration policy will turn on when this option is used.'" }, "memberDecryptionOptionTdeDescLink3": { @@ -8626,7 +8635,7 @@ "message": "Ограничить удаление коллекций владельцам и администраторам" }, "limitItemDeletionDesc": { - "message": "Limit item deletion to members with the Can manage permission" + "message": "Ограничить удаление элементов для пользователей с разрешением «Может управлять»" }, "allowAdminAccessToAllCollectionItemsDesc": { "message": "Владельцы и администраторы могут управлять всеми коллекциями и элементами" @@ -8677,9 +8686,6 @@ "message": "URL собственного сервера", "description": "Label for field requesting a self-hosted integration service URL" }, - "aliasDomain": { - "message": "Псевдоним домена" - }, "alreadyHaveAccount": { "message": "Уже зарегистрированы?" }, @@ -8741,11 +8747,11 @@ "readOnlyCollectionAccess": { "message": "У вас нет доступа к управлению этой коллекцией." }, - "grantAddAccessCollectionWarningTitle": { - "message": "Недостаточно полномочий для управления" + "grantManageCollectionWarningTitle": { + "message": "Отсутствуют разрешения на управление коллекцией" }, - "grantAddAccessCollectionWarning": { - "message": "Предоставить возможность управлять разрешениями коллекций, включая их удаление." + "grantManageCollectionWarning": { + "message": "Представить разрешения на управление коллекцией, включая ее удаление." }, "grantCollectionAccess": { "message": "Предоставить группам или участникам доступ к этой коллекции." @@ -10091,6 +10097,15 @@ "descriptorCode": { "message": "Код дескриптора" }, + "cannotRemoveViewOnlyCollections": { + "message": "Вы не можете удалить коллекции с правами только на просмотр: $COLLECTIONS$", + "placeholders": { + "collections": { + "content": "$1", + "example": "Work, Personal" + } + } + }, "importantNotice": { "message": "Важное уведомление" }, @@ -10281,5 +10296,54 @@ "example": "Acme c" } } + }, + "accountDeprovisioningNotification": { + "message": "Администраторы теперь могут удалять аккаунты пользователей, принадлежащие заявленному домену." + }, + "deleteManagedUserWarningDesc": { + "message": "Это действие удалит аккаунт пользователя, включая все элементы в его хранилище. Это действие заменяет предыдущее действие Удалить." + }, + "deleteManagedUserWarning": { + "message": "Удалить - это новое действие!" + }, + "seatsRemaining": { + "message": "У вас осталось $REMAINING$ мест из $TOTAL$, закрепленных за этой организацией. Обратитесь к своему провайдеру для управления подпиской.", + "placeholders": { + "remaining": { + "content": "$1", + "example": "5" + }, + "total": { + "content": "$2", + "example": "10" + } + } + }, + "existingOrganization": { + "message": "Существующая организация" + }, + "selectOrganizationProviderPortal": { + "message": "Выберите организацию для добавления на ваш портал провайдеров." + }, + "noOrganizations": { + "message": "Нет организаций для отображения" + }, + "yourProviderSubscriptionCredit": { + "message": "Your provider subscription will receive a credit for any remaining time in the organization's subscription." + }, + "doYouWantToAddThisOrg": { + "message": "Вы хотите добавить эту организацию в $PROVIDER$?", + "placeholders": { + "provider": { + "content": "$1", + "example": "Cool MSP" + } + } + }, + "addedExistingOrganization": { + "message": "Добавлена ​​существующая организация" + }, + "assignedExceedsAvailable": { + "message": "Assigned seats exceed available seats." } } diff --git a/apps/web/src/locales/si/messages.json b/apps/web/src/locales/si/messages.json index e30b09f9329..058528cb18d 100644 --- a/apps/web/src/locales/si/messages.json +++ b/apps/web/src/locales/si/messages.json @@ -464,6 +464,18 @@ "editFolder": { "message": "බහාලුම සංස්කරණය" }, + "newFolder": { + "message": "New folder" + }, + "folderName": { + "message": "Folder name" + }, + "folderHintText": { + "message": "Nest a folder by adding the parent folder's name followed by a “/”. Example: Social/Forums" + }, + "deleteFolderPermanently": { + "message": "Are you sure you want to permanently delete this folder?" + }, "baseDomain": { "message": "Base domain", "description": "Domain name. Example: website.com" @@ -728,15 +740,6 @@ "itemName": { "message": "Item name" }, - "cannotRemoveViewOnlyCollections": { - "message": "You cannot remove collections with View only permissions: $COLLECTIONS$", - "placeholders": { - "collections": { - "content": "$1", - "example": "Work, Personal" - } - } - }, "ex": { "message": "උදා.", "description": "Short abbreviation for 'example'." @@ -1182,6 +1185,9 @@ "logInInitiated": { "message": "Log in initiated" }, + "logInRequestSent": { + "message": "Request sent" + }, "submit": { "message": "Submit" }, @@ -1371,12 +1377,39 @@ "notificationSentDevice": { "message": "A notification has been sent to your device." }, + "notificationSentDevicePart1": { + "message": "Unlock Bitwarden on your device or on the " + }, + "areYouTryingToAccessYourAccount": { + "message": "Are you trying to access your account?" + }, + "accessAttemptBy": { + "message": "Access attempt by $EMAIL$", + "placeholders": { + "email": { + "content": "$1", + "example": "name@example.com" + } + } + }, + "confirmAccess": { + "message": "Confirm access" + }, + "denyAccess": { + "message": "Deny access" + }, + "notificationSentDeviceAnchor": { + "message": "web app" + }, + "notificationSentDevicePart2": { + "message": "Make sure the Fingerprint phrase matches the one below before approving." + }, + "notificationSentDeviceComplete": { + "message": "Unlock Bitwarden on your device. Make sure the Fingerprint phrase matches the one below before approving." + }, "aNotificationWasSentToYourDevice": { "message": "A notification was sent to your device" }, - "makeSureYourAccountIsUnlockedAndTheFingerprintEtc": { - "message": "Make sure your account is unlocked and the fingerprint phrase matches on the other device" - }, "versionNumber": { "message": "Version $VERSION_NUMBER$", "placeholders": { @@ -1664,9 +1697,6 @@ "message": "Avoid ambiguous characters", "description": "Label for the avoid ambiguous characters checkbox." }, - "regeneratePassword": { - "message": "Regenerate password" - }, "length": { "message": "Length" }, @@ -2170,8 +2200,20 @@ "manage": { "message": "Manage" }, - "canManage": { - "message": "Can manage" + "manageCollection": { + "message": "Manage collection" + }, + "viewItems": { + "message": "View items" + }, + "viewItemsHidePass": { + "message": "View items, hidden passwords" + }, + "editItems": { + "message": "Edit items" + }, + "editItemsHidePass": { + "message": "Edit items, hidden passwords" }, "disable": { "message": "Turn off" @@ -2368,11 +2410,8 @@ "twoFactorU2fProblemReadingTryAgain": { "message": "There was a problem reading the security key. Try again." }, - "twoFactorWebAuthnWarning": { - "message": "Due to platform limitations, WebAuthn cannot be used on all Bitwarden applications. You should set up another two-step login provider so that you can access your account when WebAuthn cannot be used. Supported platforms:" - }, - "twoFactorWebAuthnSupportWeb": { - "message": "Web vault and browser extensions on a desktop/laptop with a WebAuthn supported browser (Chrome, Opera, Vivaldi, or Firefox with FIDO U2F turned on)." + "twoFactorWebAuthnWarning1": { + "message": "Due to platform limitations, WebAuthn cannot be used on all Bitwarden applications. You should set up another two-step login provider so that you can access your account when WebAuthn cannot be used." }, "twoFactorRecoveryYourCode": { "message": "Your Bitwarden two-step login recovery code" @@ -4710,9 +4749,6 @@ "passwordGeneratorPolicyDesc": { "message": "Set requirements for password generator." }, - "passwordGeneratorPolicyInEffect": { - "message": "One or more organization policies are affecting your generator settings." - }, "masterPasswordPolicyInEffect": { "message": "One or more organization policies require your master password to meet the following requirements:" }, @@ -6681,15 +6717,6 @@ "message": "Generator", "description": "Short for 'credential generator'." }, - "whatWouldYouLikeToGenerate": { - "message": "What would you like to generate?" - }, - "passwordType": { - "message": "Password type" - }, - "regenerateUsername": { - "message": "Regenerate username" - }, "generateUsername": { "message": "Generate username" }, @@ -6730,9 +6757,6 @@ } } }, - "usernameType": { - "message": "Username type" - }, "plusAddressedEmail": { "message": "Plus addressed email", "description": "Username generator option that appends a random sub-address to the username. For example: address+subaddress@email.com" @@ -6952,9 +6976,6 @@ "message": "Hostname", "description": "Part of a URL." }, - "apiAccessToken": { - "message": "API access token" - }, "deviceVerification": { "message": "Device verification" }, @@ -7666,18 +7687,6 @@ "noCollection": { "message": "No collection" }, - "canView": { - "message": "Can view" - }, - "canViewExceptPass": { - "message": "Can view, except passwords" - }, - "canEdit": { - "message": "Can edit" - }, - "canEditExceptPass": { - "message": "Can edit, except passwords" - }, "noCollectionsAdded": { "message": "No collections added" }, @@ -8677,9 +8686,6 @@ "message": "Self-host server URL", "description": "Label for field requesting a self-hosted integration service URL" }, - "aliasDomain": { - "message": "Alias domain" - }, "alreadyHaveAccount": { "message": "Already have an account?" }, @@ -8741,11 +8747,11 @@ "readOnlyCollectionAccess": { "message": "You do not have access to manage this collection." }, - "grantAddAccessCollectionWarningTitle": { - "message": "Missing Can Manage Permissions" + "grantManageCollectionWarningTitle": { + "message": "Missing Manage Collection Permissions" }, - "grantAddAccessCollectionWarning": { - "message": "Grant Can manage permissions to allow full collection management including deletion of collection." + "grantManageCollectionWarning": { + "message": "Grant Manage collection permissions to allow full collection management including deletion of collection." }, "grantCollectionAccess": { "message": "Grant groups or members access to this collection." @@ -10091,6 +10097,15 @@ "descriptorCode": { "message": "Descriptor code" }, + "cannotRemoveViewOnlyCollections": { + "message": "You cannot remove collections with View only permissions: $COLLECTIONS$", + "placeholders": { + "collections": { + "content": "$1", + "example": "Work, Personal" + } + } + }, "importantNotice": { "message": "Important notice" }, @@ -10281,5 +10296,54 @@ "example": "Acme c" } } + }, + "accountDeprovisioningNotification": { + "message": "Administrators now have the ability to delete member accounts that belong to a claimed domain." + }, + "deleteManagedUserWarningDesc": { + "message": "This action will delete the member account including all items in their vault. This replaces the previous Remove action." + }, + "deleteManagedUserWarning": { + "message": "Delete is a new action!" + }, + "seatsRemaining": { + "message": "You have $REMAINING$ seats remaining out of $TOTAL$ seats assigned to this organization. Contact your provider to manage your subscription.", + "placeholders": { + "remaining": { + "content": "$1", + "example": "5" + }, + "total": { + "content": "$2", + "example": "10" + } + } + }, + "existingOrganization": { + "message": "Existing organization" + }, + "selectOrganizationProviderPortal": { + "message": "Select an organization to add to your Provider Portal." + }, + "noOrganizations": { + "message": "There are no organizations to list" + }, + "yourProviderSubscriptionCredit": { + "message": "Your provider subscription will receive a credit for any remaining time in the organization's subscription." + }, + "doYouWantToAddThisOrg": { + "message": "Do you want to add this organization to $PROVIDER$?", + "placeholders": { + "provider": { + "content": "$1", + "example": "Cool MSP" + } + } + }, + "addedExistingOrganization": { + "message": "Added existing organization" + }, + "assignedExceedsAvailable": { + "message": "Assigned seats exceed available seats." } } diff --git a/apps/web/src/locales/sk/messages.json b/apps/web/src/locales/sk/messages.json index ffc9001562e..bee2d072f91 100644 --- a/apps/web/src/locales/sk/messages.json +++ b/apps/web/src/locales/sk/messages.json @@ -464,6 +464,18 @@ "editFolder": { "message": "Upraviť priečinok" }, + "newFolder": { + "message": "Nový priečinok" + }, + "folderName": { + "message": "Názov priečinka" + }, + "folderHintText": { + "message": "Vnorte priečinok pridaním názvu nadradeného priečinka a znaku \"/\". Príklad: Sociálne siete/Fóra" + }, + "deleteFolderPermanently": { + "message": "Naozaj chcete natrvalo odstrániť tento priečinok?" + }, "baseDomain": { "message": "Základná doména", "description": "Domain name. Example: website.com" @@ -728,15 +740,6 @@ "itemName": { "message": "Názov položky" }, - "cannotRemoveViewOnlyCollections": { - "message": "Zbierky, ktoré môžete len zobraziť nemôžete odstrániť: $COLLECTIONS$", - "placeholders": { - "collections": { - "content": "$1", - "example": "Work, Personal" - } - } - }, "ex": { "message": "napr.", "description": "Short abbreviation for 'example'." @@ -1182,6 +1185,9 @@ "logInInitiated": { "message": "Iniciované prihlásenie" }, + "logInRequestSent": { + "message": "Požiadavka bola odoslaná" + }, "submit": { "message": "Potvrdiť" }, @@ -1371,12 +1377,39 @@ "notificationSentDevice": { "message": "Do vášho zariadenia bolo odoslané upozornenie." }, + "notificationSentDevicePart1": { + "message": "Odomknúť Bitwarden vo svojom zariadení alebo vo " + }, + "areYouTryingToAccessYourAccount": { + "message": "Snažíte sa získať prístup k svojmu účtu?" + }, + "accessAttemptBy": { + "message": "Pokus o prístup z $EMAIL$", + "placeholders": { + "email": { + "content": "$1", + "example": "name@example.com" + } + } + }, + "confirmAccess": { + "message": "Potvrďte prístup" + }, + "denyAccess": { + "message": "Zamietnuť prístup" + }, + "notificationSentDeviceAnchor": { + "message": "webovej aplikácii" + }, + "notificationSentDevicePart2": { + "message": "Pred schválením sa uistite, že sa odtlačok prístupovej frázy zhoduje s tou uvedenou nižšie." + }, + "notificationSentDeviceComplete": { + "message": "Odomknite Bitwarden na vašom zariadení. Pred schválením sa uistite, že sa odtlačok prístupovej frázy zhoduje s tým uvedeným nižšie." + }, "aNotificationWasSentToYourDevice": { "message": "Do vášho zariadenia bolo odoslané upozornenie" }, - "makeSureYourAccountIsUnlockedAndTheFingerprintEtc": { - "message": "Uistite sa, že je váš účet odomknutý a fráza odtlačku prsta sa zhoduje s frázou na druhom zariadení" - }, "versionNumber": { "message": "Verzia $VERSION_NUMBER$", "placeholders": { @@ -1664,9 +1697,6 @@ "message": "Vyhnúť sa zameniteľným znakom", "description": "Label for the avoid ambiguous characters checkbox." }, - "regeneratePassword": { - "message": "Vygenerovať nové heslo" - }, "length": { "message": "Dĺžka" }, @@ -1849,25 +1879,25 @@ "message": "Ak budete pokračovať, budete tiež odhlásený z vášho súčasného sedenia a budete sa musieť opäť prihlásiť. Tiež budete opäť požiadaný o dvojstupňové prihlásenie ak ho máte zapnuté. Aktívne sedenia na iných zariadeniach môžu ostať aktívne až po dobu jednej hodiny." }, "newDeviceLoginProtection": { - "message": "New device login" + "message": "Prihlásenie z nového zariadenia" }, "turnOffNewDeviceLoginProtection": { - "message": "Turn off new device login protection" + "message": "Vypnúť ochranu pri prihlásení z nového zariadenia" }, "turnOnNewDeviceLoginProtection": { - "message": "Turn on new device login protection" + "message": "Zapnúť ochranu pri prihlásení z nového zariadenia" }, "turnOffNewDeviceLoginProtectionModalDesc": { - "message": "Proceed below to turn off the verification emails bitwarden sends when you login from a new device." + "message": "Ak chcete vypnúť overovacie emaily, ktoré Bitwarden posiela keď sa prihlasujete z nového zariadenia, pokračujte nižšie." }, "turnOnNewDeviceLoginProtectionModalDesc": { - "message": "Proceed below to have bitwarden send you verification emails when you login from a new device." + "message": "Ak chcete aby Bitwarden posielal overovacie emaily keď sa prihlasujete z nového zariadenia, pokračujte nižšie." }, "turnOffNewDeviceLoginProtectionWarning": { - "message": "With new device login protection turned off, anyone with your master password can access your account from any device. To protect your account without verification emails, set up two-step login." + "message": "S vypnutou ochranou pri prihlásení z nového zariadenia môže ktokoľvek, kto pozná vaše hlavne heslo, pristupovať k vášmu účtu z ľubovoľného zariadenia. Ak chcete ochrániť váš účet bez overovacích emailov, nastavte si dvojstupňové overovanie pri prihlasovaní." }, "accountNewDeviceLoginProtectionSaved": { - "message": "New device login protection changes saved" + "message": "Zmeny v nastavení ochrany prihlasovania z nového zariadenia boli uložené" }, "sessionsDeauthorized": { "message": "Všetky sedenia odhlásené" @@ -2170,8 +2200,20 @@ "manage": { "message": "Spravovať" }, - "canManage": { - "message": "Môže spravovať" + "manageCollection": { + "message": "Spravovať zbierku" + }, + "viewItems": { + "message": "Zobraziť položky" + }, + "viewItemsHidePass": { + "message": "Zobraziť položky, skryté heslá" + }, + "editItems": { + "message": "Upraviť položky" + }, + "editItemsHidePass": { + "message": "Upraviť položky, skryté heslá" }, "disable": { "message": "Vypnúť" @@ -2368,11 +2410,8 @@ "twoFactorU2fProblemReadingTryAgain": { "message": "Problém pri čítaní bezpečnostného kľúča. Skúste to znova." }, - "twoFactorWebAuthnWarning": { - "message": "Vzhľadom na obmedzenia platform, WebAuthn nemôže byť použitý vo všetkých Bitwarden aplikáciách. Mali by ste povoliť inú formu dvojitého overenia, aby ste sa mohli prihlásiť k svojmu účtu ak nie je možné použiť WebAuthn. Podporované platformy:" - }, - "twoFactorWebAuthnSupportWeb": { - "message": "Webový trezor a rozšírenia prehliadača na pracovnej stanici s prehliadačom podporujúcim WebAuthn (Chrome, Opera, Vivaldi, alebo Firefox so zapnutou podporou FIDO U2F)." + "twoFactorWebAuthnWarning1": { + "message": "Vzhľadom na obmedzenia platforiem, WebAuthn nemôže byť použitý vo všetkých Bitwarden aplikáciách. Mali by ste nastaviť inú formu dvojitého overenia, aby ste sa mohli prihlásiť k svojmu účtu ak nie je možné použiť WebAuthn." }, "twoFactorRecoveryYourCode": { "message": "Váš Bitwarden záchranný kód pre dvojstupňové overovanie" @@ -4710,9 +4749,6 @@ "passwordGeneratorPolicyDesc": { "message": "Zvoľte minimálne požiadavky pre nastavenie generátora hesiel." }, - "passwordGeneratorPolicyInEffect": { - "message": "Jedno alebo viac nastavení organizácie ovplyvňujú vaše nastavenia generátora." - }, "masterPasswordPolicyInEffect": { "message": "Jedno alebo viac pravidiel organizácie požadujú aby vaše hlavné heslo spĺňalo nasledujúce požiadavky:" }, @@ -6681,15 +6717,6 @@ "message": "Generátor", "description": "Short for 'credential generator'." }, - "whatWouldYouLikeToGenerate": { - "message": "Čo by ste chceli vygenerovať?" - }, - "passwordType": { - "message": "Typ hesla" - }, - "regenerateUsername": { - "message": "Vygenerovať nové používateľské meno" - }, "generateUsername": { "message": "Vygenerovať používateľské meno" }, @@ -6730,9 +6757,6 @@ } } }, - "usernameType": { - "message": "Typ používateľského mena" - }, "plusAddressedEmail": { "message": "E-mail s plusovým aliasom", "description": "Username generator option that appends a random sub-address to the username. For example: address+subaddress@email.com" @@ -6747,7 +6771,7 @@ "message": "Použiť doručenú poštu typu catch-all nastavenú na doméne." }, "useThisEmail": { - "message": "Use this email" + "message": "Použiť tento e-mail" }, "random": { "message": "Náhodné", @@ -6952,9 +6976,6 @@ "message": "Názov hostiteľa", "description": "Part of a URL." }, - "apiAccessToken": { - "message": "Prístupový token API" - }, "deviceVerification": { "message": "Overenie zariadenia" }, @@ -7666,18 +7687,6 @@ "noCollection": { "message": "Žiadna zbierka" }, - "canView": { - "message": "Môže zobraziť" - }, - "canViewExceptPass": { - "message": "Môže zobraziť okrem hesiel" - }, - "canEdit": { - "message": "Môže upraviť" - }, - "canEditExceptPass": { - "message": "Môže upravovať okrem hesiel" - }, "noCollectionsAdded": { "message": "Nebolí pridané žiadne zbierky" }, @@ -8626,7 +8635,7 @@ "message": "Obmedziť vymazávanie zbierky len pre vlastníkov a administrátorov" }, "limitItemDeletionDesc": { - "message": "Limit item deletion to members with the Can manage permission" + "message": "Obmedziť vymazávanie položiek na členov s oprávnením \"Môže spravovať\"" }, "allowAdminAccessToAllCollectionItemsDesc": { "message": "Vlastníci a správcovia môžu spravovať všetky zbierky a položky" @@ -8677,9 +8686,6 @@ "message": "Adresa URL vlastného hostingu", "description": "Label for field requesting a self-hosted integration service URL" }, - "aliasDomain": { - "message": "Alias doména" - }, "alreadyHaveAccount": { "message": "Už máte účet?" }, @@ -8741,11 +8747,11 @@ "readOnlyCollectionAccess": { "message": "Nemáte prístup k spravovaniu tejto zbierky." }, - "grantAddAccessCollectionWarningTitle": { - "message": "Missing Can Manage Permissions" + "grantManageCollectionWarningTitle": { + "message": "Chýbajúce oprávnenia pre správu zbierky" }, - "grantAddAccessCollectionWarning": { - "message": "Grant Can manage permissions to allow full collection management including deletion of collection." + "grantManageCollectionWarning": { + "message": "Pre povolenie kompletnej správy zbierky vrátane jej vymazania, udeľte oprávnenia na správu zbierky." }, "grantCollectionAccess": { "message": "Povoľte skupinám, alebo jednotlivcom prístup k tejto zbierke." @@ -10091,6 +10097,15 @@ "descriptorCode": { "message": "Kód výpisu" }, + "cannotRemoveViewOnlyCollections": { + "message": "Zbierky, ktoré môžete len zobraziť nemôžete odstrániť: $COLLECTIONS$", + "placeholders": { + "collections": { + "content": "$1", + "example": "Work, Personal" + } + } + }, "importantNotice": { "message": "Dôležité upozornenie" }, @@ -10281,5 +10296,54 @@ "example": "Acme c" } } + }, + "accountDeprovisioningNotification": { + "message": "Odteraz majú správcovia právomoc vymazať konta členov, ktorí prináležia do privlastnenej domény." + }, + "deleteManagedUserWarningDesc": { + "message": "Táto akcia vymaže člena vrátane všetkých ich položiek v trezore. Tato akcia nahrádza predchádzajúcu akciu Odstrániť." + }, + "deleteManagedUserWarning": { + "message": "\"Vymazať\" je nová akcia!" + }, + "seatsRemaining": { + "message": "Z celkovo $TOTAL$ sedení pridelených tejto organizácii vám zostava $REMAINING$ sedení. Pre správu predplatného kontaktujte vášho poskytovateľa.", + "placeholders": { + "remaining": { + "content": "$1", + "example": "5" + }, + "total": { + "content": "$2", + "example": "10" + } + } + }, + "existingOrganization": { + "message": "Existujúca organizácia" + }, + "selectOrganizationProviderPortal": { + "message": "Vyberte organizáciu ktorú chcete pridať do portálu poskytovateľa." + }, + "noOrganizations": { + "message": "Neexistujú žiadne organizácie na zobrazenie" + }, + "yourProviderSubscriptionCredit": { + "message": "Váš poskytovateľ predplatného obdrží kredit za zostávajúci čas predplatného vašej organizácie." + }, + "doYouWantToAddThisOrg": { + "message": "Chcete pridať tuto organizáciu k $PROVIDER$?", + "placeholders": { + "provider": { + "content": "$1", + "example": "Cool MSP" + } + } + }, + "addedExistingOrganization": { + "message": "Existujúca organizácia pridaná" + }, + "assignedExceedsAvailable": { + "message": "Počet pridelených sedení presahuje počet dostupných sedení." } } diff --git a/apps/web/src/locales/sl/messages.json b/apps/web/src/locales/sl/messages.json index aec4c8bf0f4..c440f0cfcf1 100644 --- a/apps/web/src/locales/sl/messages.json +++ b/apps/web/src/locales/sl/messages.json @@ -464,6 +464,18 @@ "editFolder": { "message": "Uredi mapo" }, + "newFolder": { + "message": "New folder" + }, + "folderName": { + "message": "Folder name" + }, + "folderHintText": { + "message": "Nest a folder by adding the parent folder's name followed by a “/”. Example: Social/Forums" + }, + "deleteFolderPermanently": { + "message": "Are you sure you want to permanently delete this folder?" + }, "baseDomain": { "message": "Bazna domena", "description": "Domain name. Example: website.com" @@ -728,15 +740,6 @@ "itemName": { "message": "Item name" }, - "cannotRemoveViewOnlyCollections": { - "message": "You cannot remove collections with View only permissions: $COLLECTIONS$", - "placeholders": { - "collections": { - "content": "$1", - "example": "Work, Personal" - } - } - }, "ex": { "message": "npr.", "description": "Short abbreviation for 'example'." @@ -1182,6 +1185,9 @@ "logInInitiated": { "message": "Prijava se je začela" }, + "logInRequestSent": { + "message": "Request sent" + }, "submit": { "message": "Potrdi" }, @@ -1371,12 +1377,39 @@ "notificationSentDevice": { "message": "Na vašo napravo smo poslali obvestilo." }, + "notificationSentDevicePart1": { + "message": "Unlock Bitwarden on your device or on the " + }, + "areYouTryingToAccessYourAccount": { + "message": "Are you trying to access your account?" + }, + "accessAttemptBy": { + "message": "Access attempt by $EMAIL$", + "placeholders": { + "email": { + "content": "$1", + "example": "name@example.com" + } + } + }, + "confirmAccess": { + "message": "Confirm access" + }, + "denyAccess": { + "message": "Deny access" + }, + "notificationSentDeviceAnchor": { + "message": "web app" + }, + "notificationSentDevicePart2": { + "message": "Make sure the Fingerprint phrase matches the one below before approving." + }, + "notificationSentDeviceComplete": { + "message": "Unlock Bitwarden on your device. Make sure the Fingerprint phrase matches the one below before approving." + }, "aNotificationWasSentToYourDevice": { "message": "A notification was sent to your device" }, - "makeSureYourAccountIsUnlockedAndTheFingerprintEtc": { - "message": "Make sure your account is unlocked and the fingerprint phrase matches on the other device" - }, "versionNumber": { "message": "Različica $VERSION_NUMBER$", "placeholders": { @@ -1664,9 +1697,6 @@ "message": "Avoid ambiguous characters", "description": "Label for the avoid ambiguous characters checkbox." }, - "regeneratePassword": { - "message": "Ponovno generiraj geslo" - }, "length": { "message": "Dolžina" }, @@ -2170,8 +2200,20 @@ "manage": { "message": "Upravljaj" }, - "canManage": { - "message": "Can manage" + "manageCollection": { + "message": "Manage collection" + }, + "viewItems": { + "message": "View items" + }, + "viewItemsHidePass": { + "message": "View items, hidden passwords" + }, + "editItems": { + "message": "Edit items" + }, + "editItemsHidePass": { + "message": "Edit items, hidden passwords" }, "disable": { "message": "Onemogočeno" @@ -2368,11 +2410,8 @@ "twoFactorU2fProblemReadingTryAgain": { "message": "There was a problem reading the security key. Try again." }, - "twoFactorWebAuthnWarning": { - "message": "Due to platform limitations, WebAuthn cannot be used on all Bitwarden applications. You should set up another two-step login provider so that you can access your account when WebAuthn cannot be used. Supported platforms:" - }, - "twoFactorWebAuthnSupportWeb": { - "message": "Web vault and browser extensions on a desktop/laptop with a WebAuthn supported browser (Chrome, Opera, Vivaldi, or Firefox with FIDO U2F turned on)." + "twoFactorWebAuthnWarning1": { + "message": "Due to platform limitations, WebAuthn cannot be used on all Bitwarden applications. You should set up another two-step login provider so that you can access your account when WebAuthn cannot be used." }, "twoFactorRecoveryYourCode": { "message": "Your Bitwarden two-step login recovery code" @@ -4710,9 +4749,6 @@ "passwordGeneratorPolicyDesc": { "message": "Set requirements for password generator." }, - "passwordGeneratorPolicyInEffect": { - "message": "One or more organization policies are affecting your generator settings." - }, "masterPasswordPolicyInEffect": { "message": "One or more organization policies require your master password to meet the following requirements:" }, @@ -6681,15 +6717,6 @@ "message": "Generator", "description": "Short for 'credential generator'." }, - "whatWouldYouLikeToGenerate": { - "message": "Kaj želite generirati?" - }, - "passwordType": { - "message": "Vrsta gesla" - }, - "regenerateUsername": { - "message": "Ponovno generiraj uporabniško ime" - }, "generateUsername": { "message": "Generate username" }, @@ -6730,9 +6757,6 @@ } } }, - "usernameType": { - "message": "Vrsta uporabniškega imena" - }, "plusAddressedEmail": { "message": "E-naslov s plusom", "description": "Username generator option that appends a random sub-address to the username. For example: address+subaddress@email.com" @@ -6952,9 +6976,6 @@ "message": "Hostname", "description": "Part of a URL." }, - "apiAccessToken": { - "message": "Dostopni žeto (\"access token\") za API" - }, "deviceVerification": { "message": "Device verification" }, @@ -7666,18 +7687,6 @@ "noCollection": { "message": "No collection" }, - "canView": { - "message": "Can view" - }, - "canViewExceptPass": { - "message": "Can view, except passwords" - }, - "canEdit": { - "message": "Can edit" - }, - "canEditExceptPass": { - "message": "Can edit, except passwords" - }, "noCollectionsAdded": { "message": "No collections added" }, @@ -8677,9 +8686,6 @@ "message": "Self-host server URL", "description": "Label for field requesting a self-hosted integration service URL" }, - "aliasDomain": { - "message": "Alias domain" - }, "alreadyHaveAccount": { "message": "Already have an account?" }, @@ -8741,11 +8747,11 @@ "readOnlyCollectionAccess": { "message": "You do not have access to manage this collection." }, - "grantAddAccessCollectionWarningTitle": { - "message": "Missing Can Manage Permissions" + "grantManageCollectionWarningTitle": { + "message": "Missing Manage Collection Permissions" }, - "grantAddAccessCollectionWarning": { - "message": "Grant Can manage permissions to allow full collection management including deletion of collection." + "grantManageCollectionWarning": { + "message": "Grant Manage collection permissions to allow full collection management including deletion of collection." }, "grantCollectionAccess": { "message": "Grant groups or members access to this collection." @@ -10091,6 +10097,15 @@ "descriptorCode": { "message": "Descriptor code" }, + "cannotRemoveViewOnlyCollections": { + "message": "You cannot remove collections with View only permissions: $COLLECTIONS$", + "placeholders": { + "collections": { + "content": "$1", + "example": "Work, Personal" + } + } + }, "importantNotice": { "message": "Important notice" }, @@ -10281,5 +10296,54 @@ "example": "Acme c" } } + }, + "accountDeprovisioningNotification": { + "message": "Administrators now have the ability to delete member accounts that belong to a claimed domain." + }, + "deleteManagedUserWarningDesc": { + "message": "This action will delete the member account including all items in their vault. This replaces the previous Remove action." + }, + "deleteManagedUserWarning": { + "message": "Delete is a new action!" + }, + "seatsRemaining": { + "message": "You have $REMAINING$ seats remaining out of $TOTAL$ seats assigned to this organization. Contact your provider to manage your subscription.", + "placeholders": { + "remaining": { + "content": "$1", + "example": "5" + }, + "total": { + "content": "$2", + "example": "10" + } + } + }, + "existingOrganization": { + "message": "Existing organization" + }, + "selectOrganizationProviderPortal": { + "message": "Select an organization to add to your Provider Portal." + }, + "noOrganizations": { + "message": "There are no organizations to list" + }, + "yourProviderSubscriptionCredit": { + "message": "Your provider subscription will receive a credit for any remaining time in the organization's subscription." + }, + "doYouWantToAddThisOrg": { + "message": "Do you want to add this organization to $PROVIDER$?", + "placeholders": { + "provider": { + "content": "$1", + "example": "Cool MSP" + } + } + }, + "addedExistingOrganization": { + "message": "Added existing organization" + }, + "assignedExceedsAvailable": { + "message": "Assigned seats exceed available seats." } } diff --git a/apps/web/src/locales/sr/messages.json b/apps/web/src/locales/sr/messages.json index 2822da7ddee..809fa21d852 100644 --- a/apps/web/src/locales/sr/messages.json +++ b/apps/web/src/locales/sr/messages.json @@ -464,6 +464,18 @@ "editFolder": { "message": "Уреди фасциклу" }, + "newFolder": { + "message": "New folder" + }, + "folderName": { + "message": "Folder name" + }, + "folderHintText": { + "message": "Nest a folder by adding the parent folder's name followed by a “/”. Example: Social/Forums" + }, + "deleteFolderPermanently": { + "message": "Are you sure you want to permanently delete this folder?" + }, "baseDomain": { "message": "Главни домен", "description": "Domain name. Example: website.com" @@ -728,15 +740,6 @@ "itemName": { "message": "Име ставке" }, - "cannotRemoveViewOnlyCollections": { - "message": "Не можете уклонити колекције са дозволама само за приказ: $COLLECTIONS$", - "placeholders": { - "collections": { - "content": "$1", - "example": "Work, Personal" - } - } - }, "ex": { "message": "нпр.", "description": "Short abbreviation for 'example'." @@ -1182,6 +1185,9 @@ "logInInitiated": { "message": "Пријава је покренута" }, + "logInRequestSent": { + "message": "Захтев је послат" + }, "submit": { "message": "Пошаљи" }, @@ -1371,12 +1377,39 @@ "notificationSentDevice": { "message": "Обавештење је послато на ваш уређај." }, + "notificationSentDevicePart1": { + "message": "Откључај Bitwarden на твом уређају или на " + }, + "areYouTryingToAccessYourAccount": { + "message": "Да ли покушавате да приступите вашем налогу?" + }, + "accessAttemptBy": { + "message": "Покушај приступа са $EMAIL$", + "placeholders": { + "email": { + "content": "$1", + "example": "name@example.com" + } + } + }, + "confirmAccess": { + "message": "Потврди приступ" + }, + "denyAccess": { + "message": "Одбиј приступ" + }, + "notificationSentDeviceAnchor": { + "message": "web app" + }, + "notificationSentDevicePart2": { + "message": "Потврдите да се фраза отиска прста поклапа са овом испод пре одобравања." + }, + "notificationSentDeviceComplete": { + "message": "Октључај Bitwarden на твом уређају. Потврдите да се фраза отиска прста поклапа са овом испод пре одобравања." + }, "aNotificationWasSentToYourDevice": { "message": "Обавештење је послато на ваш уређај" }, - "makeSureYourAccountIsUnlockedAndTheFingerprintEtc": { - "message": "Уверите се да је ваш налог откључан и да се фраза отиска подудара на другом уређају" - }, "versionNumber": { "message": "Верзија $VERSION_NUMBER$", "placeholders": { @@ -1664,9 +1697,6 @@ "message": "Избегавај двосмислене карактере", "description": "Label for the avoid ambiguous characters checkbox." }, - "regeneratePassword": { - "message": "Поново генериши лозинку" - }, "length": { "message": "Дужина" }, @@ -1849,13 +1879,13 @@ "message": "Наставак ће вас такође одјавити из тренутне сесије, што захтева поновно пријављивање. Од вас ће такође бити затражено да се поново пријавите у два корака, ако је омогућено. Активне сесије на другим уређајима могу да остану активне још један сат." }, "newDeviceLoginProtection": { - "message": "New device login" + "message": "Пријава на новом уређају" }, "turnOffNewDeviceLoginProtection": { - "message": "Turn off new device login protection" + "message": "Искључи заштиту пријаве на новом уређају" }, "turnOnNewDeviceLoginProtection": { - "message": "Turn on new device login protection" + "message": "Укључи заштиту пријаве на новом уређају" }, "turnOffNewDeviceLoginProtectionModalDesc": { "message": "Proceed below to turn off the verification emails bitwarden sends when you login from a new device." @@ -2170,8 +2200,20 @@ "manage": { "message": "Управљати" }, - "canManage": { - "message": "Може управљати" + "manageCollection": { + "message": "Управљај колекцијом" + }, + "viewItems": { + "message": "Прикажи ставке" + }, + "viewItemsHidePass": { + "message": "Прикажи ставке, сакривене лозинке" + }, + "editItems": { + "message": "Уреди ставке" + }, + "editItemsHidePass": { + "message": "Уреди ставке, сакривене лозинке" }, "disable": { "message": "Онемогући" @@ -2368,11 +2410,8 @@ "twoFactorU2fProblemReadingTryAgain": { "message": "Догодила се грешка приликом читања безбедносног кључа. Покушајте поново." }, - "twoFactorWebAuthnWarning": { - "message": "Због ограничења платформе, WebAuthn се не могу користити на свим Bitwarden апликацијама. Требали бисте омогућити другог добављача услуге пријављивања у два корака како бисте могли да приступите свом налогу када WebAuthn не могу да се користе. Подржане платформе:" - }, - "twoFactorWebAuthnSupportWeb": { - "message": "Веб сеф и додатке прегледача на рачунару са WebAuthn омогућен прегледач (Chrome, Opera, Vivaldi, или Firefox са FIDO U2F омогућено)." + "twoFactorWebAuthnWarning1": { + "message": "Due to platform limitations, WebAuthn cannot be used on all Bitwarden applications. You should set up another two-step login provider so that you can access your account when WebAuthn cannot be used." }, "twoFactorRecoveryYourCode": { "message": "Ваш Bitwarden код за опоравак пријаве у два корака" @@ -4710,9 +4749,6 @@ "passwordGeneratorPolicyDesc": { "message": "Поставите минималне захтеве за конфигурацију генератора лозинки." }, - "passwordGeneratorPolicyInEffect": { - "message": "Једна или више смерница организације утичу на поставке вашег генератора." - }, "masterPasswordPolicyInEffect": { "message": "Једна или више смерница организације захтевају да ваша главна лозинка да би испуњавали следеће захтеве:" }, @@ -6681,15 +6717,6 @@ "message": "Генератор", "description": "Short for 'credential generator'." }, - "whatWouldYouLikeToGenerate": { - "message": "Шта желите да генеришете?" - }, - "passwordType": { - "message": "Тип лозинке" - }, - "regenerateUsername": { - "message": "Поново генериши име" - }, "generateUsername": { "message": "Генериши име" }, @@ -6730,9 +6757,6 @@ } } }, - "usernameType": { - "message": "Тип имена" - }, "plusAddressedEmail": { "message": "Плус имејл адресе", "description": "Username generator option that appends a random sub-address to the username. For example: address+subaddress@email.com" @@ -6952,9 +6976,6 @@ "message": "Име домаћина", "description": "Part of a URL." }, - "apiAccessToken": { - "message": "Приступни АПИ токен" - }, "deviceVerification": { "message": "Провера уређаја" }, @@ -7666,18 +7687,6 @@ "noCollection": { "message": "Нема колекције" }, - "canView": { - "message": "Може прегледати" - }, - "canViewExceptPass": { - "message": "Може видетим осим лозинке" - }, - "canEdit": { - "message": "Може уређивати" - }, - "canEditExceptPass": { - "message": "Ноже уређивати осим лозинке" - }, "noCollectionsAdded": { "message": "Ниједна колекција додата" }, @@ -8677,9 +8686,6 @@ "message": "Self-host server URL", "description": "Label for field requesting a self-hosted integration service URL" }, - "aliasDomain": { - "message": "Домен алијаса" - }, "alreadyHaveAccount": { "message": "Већ имате налог?" }, @@ -8741,11 +8747,11 @@ "readOnlyCollectionAccess": { "message": "Немате приступ за управљање овом колекцијом." }, - "grantAddAccessCollectionWarningTitle": { - "message": "Фале дозволе „Може да управља“" + "grantManageCollectionWarningTitle": { + "message": "Missing Manage Collection Permissions" }, - "grantAddAccessCollectionWarning": { - "message": "Додатје дозволе „Може да управља“ да би се омогућило потпуно управљање наплатом укључујући брисање колекције." + "grantManageCollectionWarning": { + "message": "Grant Manage collection permissions to allow full collection management including deletion of collection." }, "grantCollectionAccess": { "message": "Одобрите групама или члановима приступ овој колекцији." @@ -10091,6 +10097,15 @@ "descriptorCode": { "message": "Кôд дескриптора" }, + "cannotRemoveViewOnlyCollections": { + "message": "Не можете уклонити колекције са дозволама само за приказ: $COLLECTIONS$", + "placeholders": { + "collections": { + "content": "$1", + "example": "Work, Personal" + } + } + }, "importantNotice": { "message": "Важно обавештење" }, @@ -10281,5 +10296,54 @@ "example": "Acme c" } } + }, + "accountDeprovisioningNotification": { + "message": "Administrators now have the ability to delete member accounts that belong to a claimed domain." + }, + "deleteManagedUserWarningDesc": { + "message": "This action will delete the member account including all items in their vault. This replaces the previous Remove action." + }, + "deleteManagedUserWarning": { + "message": "Delete is a new action!" + }, + "seatsRemaining": { + "message": "You have $REMAINING$ seats remaining out of $TOTAL$ seats assigned to this organization. Contact your provider to manage your subscription.", + "placeholders": { + "remaining": { + "content": "$1", + "example": "5" + }, + "total": { + "content": "$2", + "example": "10" + } + } + }, + "existingOrganization": { + "message": "Existing organization" + }, + "selectOrganizationProviderPortal": { + "message": "Select an organization to add to your Provider Portal." + }, + "noOrganizations": { + "message": "There are no organizations to list" + }, + "yourProviderSubscriptionCredit": { + "message": "Your provider subscription will receive a credit for any remaining time in the organization's subscription." + }, + "doYouWantToAddThisOrg": { + "message": "Do you want to add this organization to $PROVIDER$?", + "placeholders": { + "provider": { + "content": "$1", + "example": "Cool MSP" + } + } + }, + "addedExistingOrganization": { + "message": "Added existing organization" + }, + "assignedExceedsAvailable": { + "message": "Assigned seats exceed available seats." } } diff --git a/apps/web/src/locales/sr_CS/messages.json b/apps/web/src/locales/sr_CS/messages.json index bcac281eaeb..ac79efe57e0 100644 --- a/apps/web/src/locales/sr_CS/messages.json +++ b/apps/web/src/locales/sr_CS/messages.json @@ -1,24 +1,24 @@ { "allApplications": { - "message": "All applications" + "message": "Sve aplikacije" }, "criticalApplications": { - "message": "Critical applications" + "message": "Kritične aplikacije" }, "accessIntelligence": { - "message": "Access Intelligence" + "message": "Pristupi inteligenciji" }, "riskInsights": { - "message": "Risk Insights" + "message": "Uvid u rizik" }, "passwordRisk": { - "message": "Password Risk" + "message": "Rizik od lozinke" }, "reviewAtRiskPasswords": { - "message": "Review at-risk passwords (weak, exposed, or reused) across applications. Select your most critical applications to prioritize security actions for your users to address at-risk passwords." + "message": "Pregledaj rizične lozinke (slabe, izložene ili ponovo korišćene) u aplikacijama. Izaberi svoje najkritičnije aplikacije da bi dao prioritet bezbednosnim radnjama kako bi tvoji korisnici adresirali rizične lozinke." }, "dataLastUpdated": { - "message": "Data last updated: $DATE$", + "message": "Podaci su poslednji put ažurirani: $DATE$", "placeholders": { "date": { "content": "$1", @@ -27,19 +27,19 @@ } }, "notifiedMembers": { - "message": "Notified members" + "message": "Obavešteni članovi" }, "revokeMembers": { - "message": "Revoke members" + "message": "Ukloni članove" }, "restoreMembers": { - "message": "Restore members" + "message": "Vrati članove" }, "cannotRestoreAccessError": { - "message": "Cannot restore organization access" + "message": "Nije moguće povratiti pristup organizaciji" }, "allApplicationsWithCount": { - "message": "All applications ($COUNT$)", + "message": "Sve aplikacije ($COUNT$)", "placeholders": { "count": { "content": "$1", @@ -48,10 +48,10 @@ } }, "createNewLoginItem": { - "message": "Create new login item" + "message": "Kreirajte novu stavku za prijavu" }, "criticalApplicationsWithCount": { - "message": "Critical applications ($COUNT$)", + "message": "Kritične aplikacije ($COUNT$)", "placeholders": { "count": { "content": "$1", @@ -60,7 +60,7 @@ } }, "notifiedMembersWithCount": { - "message": "Notified members ($COUNT$)", + "message": "Obavešteni članovi ($COUNT$)", "placeholders": { "count": { "content": "$1", @@ -69,7 +69,7 @@ } }, "noAppsInOrgTitle": { - "message": "No applications found in $ORG NAME$", + "message": "Nije pronađena nijedna aplikacija u $ORG NAME$", "placeholders": { "org name": { "content": "$1", @@ -78,7 +78,7 @@ } }, "noAppsInOrgDescription": { - "message": "As users save logins, applications appear here, showing any at-risk passwords. Mark critical apps and notify users to update passwords." + "message": "Dok korisnici čuvaju prijave, aplikacije se pojavljuju ovde, prikazujući sve rizične lozinke. Označite kritične aplikacije i obavestite korisnike da ažuriraju lozinke." }, "noCriticalAppsTitle": { "message": "You haven't marked any applications as a Critical" @@ -464,6 +464,18 @@ "editFolder": { "message": "Urеdi fasciklu" }, + "newFolder": { + "message": "New folder" + }, + "folderName": { + "message": "Folder name" + }, + "folderHintText": { + "message": "Nest a folder by adding the parent folder's name followed by a “/”. Example: Social/Forums" + }, + "deleteFolderPermanently": { + "message": "Are you sure you want to permanently delete this folder?" + }, "baseDomain": { "message": "Osnovni domen", "description": "Domain name. Example: website.com" @@ -728,15 +740,6 @@ "itemName": { "message": "Item name" }, - "cannotRemoveViewOnlyCollections": { - "message": "You cannot remove collections with View only permissions: $COLLECTIONS$", - "placeholders": { - "collections": { - "content": "$1", - "example": "Work, Personal" - } - } - }, "ex": { "message": "npr.", "description": "Short abbreviation for 'example'." @@ -1182,6 +1185,9 @@ "logInInitiated": { "message": "Log in initiated" }, + "logInRequestSent": { + "message": "Request sent" + }, "submit": { "message": "Pošalji" }, @@ -1371,12 +1377,39 @@ "notificationSentDevice": { "message": "A notification has been sent to your device." }, + "notificationSentDevicePart1": { + "message": "Unlock Bitwarden on your device or on the " + }, + "areYouTryingToAccessYourAccount": { + "message": "Are you trying to access your account?" + }, + "accessAttemptBy": { + "message": "Access attempt by $EMAIL$", + "placeholders": { + "email": { + "content": "$1", + "example": "name@example.com" + } + } + }, + "confirmAccess": { + "message": "Confirm access" + }, + "denyAccess": { + "message": "Deny access" + }, + "notificationSentDeviceAnchor": { + "message": "web app" + }, + "notificationSentDevicePart2": { + "message": "Make sure the Fingerprint phrase matches the one below before approving." + }, + "notificationSentDeviceComplete": { + "message": "Unlock Bitwarden on your device. Make sure the Fingerprint phrase matches the one below before approving." + }, "aNotificationWasSentToYourDevice": { "message": "A notification was sent to your device" }, - "makeSureYourAccountIsUnlockedAndTheFingerprintEtc": { - "message": "Make sure your account is unlocked and the fingerprint phrase matches on the other device" - }, "versionNumber": { "message": "Version $VERSION_NUMBER$", "placeholders": { @@ -1664,9 +1697,6 @@ "message": "Avoid ambiguous characters", "description": "Label for the avoid ambiguous characters checkbox." }, - "regeneratePassword": { - "message": "Regeneriši lozinku" - }, "length": { "message": "Dužina" }, @@ -2170,8 +2200,20 @@ "manage": { "message": "Upravljaj" }, - "canManage": { - "message": "Can manage" + "manageCollection": { + "message": "Manage collection" + }, + "viewItems": { + "message": "View items" + }, + "viewItemsHidePass": { + "message": "View items, hidden passwords" + }, + "editItems": { + "message": "Edit items" + }, + "editItemsHidePass": { + "message": "Edit items, hidden passwords" }, "disable": { "message": "Turn off" @@ -2368,11 +2410,8 @@ "twoFactorU2fProblemReadingTryAgain": { "message": "There was a problem reading the security key. Try again." }, - "twoFactorWebAuthnWarning": { - "message": "Due to platform limitations, WebAuthn cannot be used on all Bitwarden applications. You should set up another two-step login provider so that you can access your account when WebAuthn cannot be used. Supported platforms:" - }, - "twoFactorWebAuthnSupportWeb": { - "message": "Web vault and browser extensions on a desktop/laptop with a WebAuthn supported browser (Chrome, Opera, Vivaldi, or Firefox with FIDO U2F turned on)." + "twoFactorWebAuthnWarning1": { + "message": "Due to platform limitations, WebAuthn cannot be used on all Bitwarden applications. You should set up another two-step login provider so that you can access your account when WebAuthn cannot be used." }, "twoFactorRecoveryYourCode": { "message": "Your Bitwarden two-step login recovery code" @@ -4710,9 +4749,6 @@ "passwordGeneratorPolicyDesc": { "message": "Set requirements for password generator." }, - "passwordGeneratorPolicyInEffect": { - "message": "One or more organization policies are affecting your generator settings." - }, "masterPasswordPolicyInEffect": { "message": "One or more organization policies require your master password to meet the following requirements:" }, @@ -6681,15 +6717,6 @@ "message": "Generator", "description": "Short for 'credential generator'." }, - "whatWouldYouLikeToGenerate": { - "message": "What would you like to generate?" - }, - "passwordType": { - "message": "Password type" - }, - "regenerateUsername": { - "message": "Regenerate username" - }, "generateUsername": { "message": "Generate username" }, @@ -6730,9 +6757,6 @@ } } }, - "usernameType": { - "message": "Username type" - }, "plusAddressedEmail": { "message": "Plus addressed email", "description": "Username generator option that appends a random sub-address to the username. For example: address+subaddress@email.com" @@ -6952,9 +6976,6 @@ "message": "Hostname", "description": "Part of a URL." }, - "apiAccessToken": { - "message": "API access token" - }, "deviceVerification": { "message": "Device verification" }, @@ -7666,18 +7687,6 @@ "noCollection": { "message": "No collection" }, - "canView": { - "message": "Can view" - }, - "canViewExceptPass": { - "message": "Can view, except passwords" - }, - "canEdit": { - "message": "Can edit" - }, - "canEditExceptPass": { - "message": "Can edit, except passwords" - }, "noCollectionsAdded": { "message": "No collections added" }, @@ -8677,9 +8686,6 @@ "message": "Self-host server URL", "description": "Label for field requesting a self-hosted integration service URL" }, - "aliasDomain": { - "message": "Alias domain" - }, "alreadyHaveAccount": { "message": "Already have an account?" }, @@ -8741,11 +8747,11 @@ "readOnlyCollectionAccess": { "message": "You do not have access to manage this collection." }, - "grantAddAccessCollectionWarningTitle": { - "message": "Missing Can Manage Permissions" + "grantManageCollectionWarningTitle": { + "message": "Missing Manage Collection Permissions" }, - "grantAddAccessCollectionWarning": { - "message": "Grant Can manage permissions to allow full collection management including deletion of collection." + "grantManageCollectionWarning": { + "message": "Grant Manage collection permissions to allow full collection management including deletion of collection." }, "grantCollectionAccess": { "message": "Grant groups or members access to this collection." @@ -10091,6 +10097,15 @@ "descriptorCode": { "message": "Descriptor code" }, + "cannotRemoveViewOnlyCollections": { + "message": "You cannot remove collections with View only permissions: $COLLECTIONS$", + "placeholders": { + "collections": { + "content": "$1", + "example": "Work, Personal" + } + } + }, "importantNotice": { "message": "Important notice" }, @@ -10281,5 +10296,54 @@ "example": "Acme c" } } + }, + "accountDeprovisioningNotification": { + "message": "Administrators now have the ability to delete member accounts that belong to a claimed domain." + }, + "deleteManagedUserWarningDesc": { + "message": "This action will delete the member account including all items in their vault. This replaces the previous Remove action." + }, + "deleteManagedUserWarning": { + "message": "Delete is a new action!" + }, + "seatsRemaining": { + "message": "You have $REMAINING$ seats remaining out of $TOTAL$ seats assigned to this organization. Contact your provider to manage your subscription.", + "placeholders": { + "remaining": { + "content": "$1", + "example": "5" + }, + "total": { + "content": "$2", + "example": "10" + } + } + }, + "existingOrganization": { + "message": "Existing organization" + }, + "selectOrganizationProviderPortal": { + "message": "Select an organization to add to your Provider Portal." + }, + "noOrganizations": { + "message": "There are no organizations to list" + }, + "yourProviderSubscriptionCredit": { + "message": "Your provider subscription will receive a credit for any remaining time in the organization's subscription." + }, + "doYouWantToAddThisOrg": { + "message": "Do you want to add this organization to $PROVIDER$?", + "placeholders": { + "provider": { + "content": "$1", + "example": "Cool MSP" + } + } + }, + "addedExistingOrganization": { + "message": "Added existing organization" + }, + "assignedExceedsAvailable": { + "message": "Assigned seats exceed available seats." } } diff --git a/apps/web/src/locales/sv/messages.json b/apps/web/src/locales/sv/messages.json index b33e455bb9c..b7762e4c4dc 100644 --- a/apps/web/src/locales/sv/messages.json +++ b/apps/web/src/locales/sv/messages.json @@ -464,6 +464,18 @@ "editFolder": { "message": "Redigera mapp" }, + "newFolder": { + "message": "New folder" + }, + "folderName": { + "message": "Folder name" + }, + "folderHintText": { + "message": "Nest a folder by adding the parent folder's name followed by a “/”. Example: Social/Forums" + }, + "deleteFolderPermanently": { + "message": "Are you sure you want to permanently delete this folder?" + }, "baseDomain": { "message": "Basdomän", "description": "Domain name. Example: website.com" @@ -728,15 +740,6 @@ "itemName": { "message": "Objektnamn" }, - "cannotRemoveViewOnlyCollections": { - "message": "You cannot remove collections with View only permissions: $COLLECTIONS$", - "placeholders": { - "collections": { - "content": "$1", - "example": "Work, Personal" - } - } - }, "ex": { "message": "t.ex.", "description": "Short abbreviation for 'example'." @@ -1182,6 +1185,9 @@ "logInInitiated": { "message": "Inloggning påbörjad" }, + "logInRequestSent": { + "message": "Request sent" + }, "submit": { "message": "Skicka" }, @@ -1371,12 +1377,39 @@ "notificationSentDevice": { "message": "En avisering har skickats till din enhet." }, + "notificationSentDevicePart1": { + "message": "Unlock Bitwarden on your device or on the " + }, + "areYouTryingToAccessYourAccount": { + "message": "Are you trying to access your account?" + }, + "accessAttemptBy": { + "message": "Access attempt by $EMAIL$", + "placeholders": { + "email": { + "content": "$1", + "example": "name@example.com" + } + } + }, + "confirmAccess": { + "message": "Confirm access" + }, + "denyAccess": { + "message": "Deny access" + }, + "notificationSentDeviceAnchor": { + "message": "web app" + }, + "notificationSentDevicePart2": { + "message": "Make sure the Fingerprint phrase matches the one below before approving." + }, + "notificationSentDeviceComplete": { + "message": "Unlock Bitwarden on your device. Make sure the Fingerprint phrase matches the one below before approving." + }, "aNotificationWasSentToYourDevice": { "message": "A notification was sent to your device" }, - "makeSureYourAccountIsUnlockedAndTheFingerprintEtc": { - "message": "Make sure your account is unlocked and the fingerprint phrase matches on the other device" - }, "versionNumber": { "message": "Version $VERSION_NUMBER$", "placeholders": { @@ -1664,9 +1697,6 @@ "message": "Undvik tvetydiga tecken", "description": "Label for the avoid ambiguous characters checkbox." }, - "regeneratePassword": { - "message": "Återskapa lösenord" - }, "length": { "message": "Längd" }, @@ -2170,8 +2200,20 @@ "manage": { "message": "Hantera" }, - "canManage": { - "message": "Kan hantera" + "manageCollection": { + "message": "Manage collection" + }, + "viewItems": { + "message": "View items" + }, + "viewItemsHidePass": { + "message": "View items, hidden passwords" + }, + "editItems": { + "message": "Edit items" + }, + "editItemsHidePass": { + "message": "Edit items, hidden passwords" }, "disable": { "message": "Stäng av" @@ -2368,11 +2410,8 @@ "twoFactorU2fProblemReadingTryAgain": { "message": "Det gick inte att läsa säkerhetsnyckeln. Försök igen." }, - "twoFactorWebAuthnWarning": { - "message": "På grund av plattformsbegränsningar kan WebAuthn inte användas i alla Bitwarden-applikationer. Du bör aktivera en annan metod för tvåstegsverifiering så att du kan komma åt ditt konto när WebAuthn inte kan användas. Plattformar som stöds:" - }, - "twoFactorWebAuthnSupportWeb": { - "message": "Webbvalvet och webbläsartillägg på en stationär eller bärbar dator med en WebAuthn-aktiverad webbläsare (Chrome, Opera, Vivaldi eller Firefox med FIDO U2F aktiverat)." + "twoFactorWebAuthnWarning1": { + "message": "Due to platform limitations, WebAuthn cannot be used on all Bitwarden applications. You should set up another two-step login provider so that you can access your account when WebAuthn cannot be used." }, "twoFactorRecoveryYourCode": { "message": "Din återställningskod för tvåstegsverifiering" @@ -4710,9 +4749,6 @@ "passwordGeneratorPolicyDesc": { "message": "Ange minimikrav för lösenordsgeneratorn." }, - "passwordGeneratorPolicyInEffect": { - "message": "En eller flera organisationspolicyer påverkar dina generatorinställningar." - }, "masterPasswordPolicyInEffect": { "message": "En eller flera organisationspolicyer kräver att ditt huvudlösenord uppfyller följande krav:" }, @@ -6681,15 +6717,6 @@ "message": "Generator", "description": "Short for 'credential generator'." }, - "whatWouldYouLikeToGenerate": { - "message": "Vad skulle du vilja generera?" - }, - "passwordType": { - "message": "Lösenordstyp" - }, - "regenerateUsername": { - "message": "Återskapa användarnamn" - }, "generateUsername": { "message": "Generera användarnamn" }, @@ -6730,9 +6757,6 @@ } } }, - "usernameType": { - "message": "Användarnamnstyp" - }, "plusAddressedEmail": { "message": "Plus addressed email", "description": "Username generator option that appends a random sub-address to the username. For example: address+subaddress@email.com" @@ -6952,9 +6976,6 @@ "message": "Värdnamn", "description": "Part of a URL." }, - "apiAccessToken": { - "message": "API-åtkomsttoken" - }, "deviceVerification": { "message": "Device verification" }, @@ -7666,18 +7687,6 @@ "noCollection": { "message": "Ingen samling" }, - "canView": { - "message": "Kan visa" - }, - "canViewExceptPass": { - "message": "Kan visa, utom lösenord" - }, - "canEdit": { - "message": "Kan redigera" - }, - "canEditExceptPass": { - "message": "Kan redigera, utom lösenord" - }, "noCollectionsAdded": { "message": "Ingen samlingar lades till" }, @@ -8677,9 +8686,6 @@ "message": "Self-host server URL", "description": "Label for field requesting a self-hosted integration service URL" }, - "aliasDomain": { - "message": "Aliasdomän" - }, "alreadyHaveAccount": { "message": "Har du redan ett konto?" }, @@ -8741,11 +8747,11 @@ "readOnlyCollectionAccess": { "message": "You do not have access to manage this collection." }, - "grantAddAccessCollectionWarningTitle": { - "message": "Missing Can Manage Permissions" + "grantManageCollectionWarningTitle": { + "message": "Missing Manage Collection Permissions" }, - "grantAddAccessCollectionWarning": { - "message": "Grant Can manage permissions to allow full collection management including deletion of collection." + "grantManageCollectionWarning": { + "message": "Grant Manage collection permissions to allow full collection management including deletion of collection." }, "grantCollectionAccess": { "message": "Ge grupper eller medlemmar tillgång till denna samling." @@ -10091,6 +10097,15 @@ "descriptorCode": { "message": "Descriptor code" }, + "cannotRemoveViewOnlyCollections": { + "message": "You cannot remove collections with View only permissions: $COLLECTIONS$", + "placeholders": { + "collections": { + "content": "$1", + "example": "Work, Personal" + } + } + }, "importantNotice": { "message": "Important notice" }, @@ -10281,5 +10296,54 @@ "example": "Acme c" } } + }, + "accountDeprovisioningNotification": { + "message": "Administrators now have the ability to delete member accounts that belong to a claimed domain." + }, + "deleteManagedUserWarningDesc": { + "message": "This action will delete the member account including all items in their vault. This replaces the previous Remove action." + }, + "deleteManagedUserWarning": { + "message": "Delete is a new action!" + }, + "seatsRemaining": { + "message": "You have $REMAINING$ seats remaining out of $TOTAL$ seats assigned to this organization. Contact your provider to manage your subscription.", + "placeholders": { + "remaining": { + "content": "$1", + "example": "5" + }, + "total": { + "content": "$2", + "example": "10" + } + } + }, + "existingOrganization": { + "message": "Existing organization" + }, + "selectOrganizationProviderPortal": { + "message": "Select an organization to add to your Provider Portal." + }, + "noOrganizations": { + "message": "There are no organizations to list" + }, + "yourProviderSubscriptionCredit": { + "message": "Your provider subscription will receive a credit for any remaining time in the organization's subscription." + }, + "doYouWantToAddThisOrg": { + "message": "Do you want to add this organization to $PROVIDER$?", + "placeholders": { + "provider": { + "content": "$1", + "example": "Cool MSP" + } + } + }, + "addedExistingOrganization": { + "message": "Added existing organization" + }, + "assignedExceedsAvailable": { + "message": "Assigned seats exceed available seats." } } diff --git a/apps/web/src/locales/te/messages.json b/apps/web/src/locales/te/messages.json index 3b8d147b95f..7e6f614b9c8 100644 --- a/apps/web/src/locales/te/messages.json +++ b/apps/web/src/locales/te/messages.json @@ -464,6 +464,18 @@ "editFolder": { "message": "Edit folder" }, + "newFolder": { + "message": "New folder" + }, + "folderName": { + "message": "Folder name" + }, + "folderHintText": { + "message": "Nest a folder by adding the parent folder's name followed by a “/”. Example: Social/Forums" + }, + "deleteFolderPermanently": { + "message": "Are you sure you want to permanently delete this folder?" + }, "baseDomain": { "message": "Base domain", "description": "Domain name. Example: website.com" @@ -728,15 +740,6 @@ "itemName": { "message": "Item name" }, - "cannotRemoveViewOnlyCollections": { - "message": "You cannot remove collections with View only permissions: $COLLECTIONS$", - "placeholders": { - "collections": { - "content": "$1", - "example": "Work, Personal" - } - } - }, "ex": { "message": "ex.", "description": "Short abbreviation for 'example'." @@ -1182,6 +1185,9 @@ "logInInitiated": { "message": "Log in initiated" }, + "logInRequestSent": { + "message": "Request sent" + }, "submit": { "message": "Submit" }, @@ -1371,12 +1377,39 @@ "notificationSentDevice": { "message": "A notification has been sent to your device." }, + "notificationSentDevicePart1": { + "message": "Unlock Bitwarden on your device or on the " + }, + "areYouTryingToAccessYourAccount": { + "message": "Are you trying to access your account?" + }, + "accessAttemptBy": { + "message": "Access attempt by $EMAIL$", + "placeholders": { + "email": { + "content": "$1", + "example": "name@example.com" + } + } + }, + "confirmAccess": { + "message": "Confirm access" + }, + "denyAccess": { + "message": "Deny access" + }, + "notificationSentDeviceAnchor": { + "message": "web app" + }, + "notificationSentDevicePart2": { + "message": "Make sure the Fingerprint phrase matches the one below before approving." + }, + "notificationSentDeviceComplete": { + "message": "Unlock Bitwarden on your device. Make sure the Fingerprint phrase matches the one below before approving." + }, "aNotificationWasSentToYourDevice": { "message": "A notification was sent to your device" }, - "makeSureYourAccountIsUnlockedAndTheFingerprintEtc": { - "message": "Make sure your account is unlocked and the fingerprint phrase matches on the other device" - }, "versionNumber": { "message": "Version $VERSION_NUMBER$", "placeholders": { @@ -1664,9 +1697,6 @@ "message": "Avoid ambiguous characters", "description": "Label for the avoid ambiguous characters checkbox." }, - "regeneratePassword": { - "message": "Regenerate password" - }, "length": { "message": "Length" }, @@ -2170,8 +2200,20 @@ "manage": { "message": "Manage" }, - "canManage": { - "message": "Can manage" + "manageCollection": { + "message": "Manage collection" + }, + "viewItems": { + "message": "View items" + }, + "viewItemsHidePass": { + "message": "View items, hidden passwords" + }, + "editItems": { + "message": "Edit items" + }, + "editItemsHidePass": { + "message": "Edit items, hidden passwords" }, "disable": { "message": "Turn off" @@ -2368,11 +2410,8 @@ "twoFactorU2fProblemReadingTryAgain": { "message": "There was a problem reading the security key. Try again." }, - "twoFactorWebAuthnWarning": { - "message": "Due to platform limitations, WebAuthn cannot be used on all Bitwarden applications. You should set up another two-step login provider so that you can access your account when WebAuthn cannot be used. Supported platforms:" - }, - "twoFactorWebAuthnSupportWeb": { - "message": "Web vault and browser extensions on a desktop/laptop with a WebAuthn supported browser (Chrome, Opera, Vivaldi, or Firefox with FIDO U2F turned on)." + "twoFactorWebAuthnWarning1": { + "message": "Due to platform limitations, WebAuthn cannot be used on all Bitwarden applications. You should set up another two-step login provider so that you can access your account when WebAuthn cannot be used." }, "twoFactorRecoveryYourCode": { "message": "Your Bitwarden two-step login recovery code" @@ -4710,9 +4749,6 @@ "passwordGeneratorPolicyDesc": { "message": "Set requirements for password generator." }, - "passwordGeneratorPolicyInEffect": { - "message": "One or more organization policies are affecting your generator settings." - }, "masterPasswordPolicyInEffect": { "message": "One or more organization policies require your master password to meet the following requirements:" }, @@ -6681,15 +6717,6 @@ "message": "Generator", "description": "Short for 'credential generator'." }, - "whatWouldYouLikeToGenerate": { - "message": "What would you like to generate?" - }, - "passwordType": { - "message": "Password type" - }, - "regenerateUsername": { - "message": "Regenerate username" - }, "generateUsername": { "message": "Generate username" }, @@ -6730,9 +6757,6 @@ } } }, - "usernameType": { - "message": "Username type" - }, "plusAddressedEmail": { "message": "Plus addressed email", "description": "Username generator option that appends a random sub-address to the username. For example: address+subaddress@email.com" @@ -6952,9 +6976,6 @@ "message": "Hostname", "description": "Part of a URL." }, - "apiAccessToken": { - "message": "API access token" - }, "deviceVerification": { "message": "Device verification" }, @@ -7666,18 +7687,6 @@ "noCollection": { "message": "No collection" }, - "canView": { - "message": "Can view" - }, - "canViewExceptPass": { - "message": "Can view, except passwords" - }, - "canEdit": { - "message": "Can edit" - }, - "canEditExceptPass": { - "message": "Can edit, except passwords" - }, "noCollectionsAdded": { "message": "No collections added" }, @@ -8677,9 +8686,6 @@ "message": "Self-host server URL", "description": "Label for field requesting a self-hosted integration service URL" }, - "aliasDomain": { - "message": "Alias domain" - }, "alreadyHaveAccount": { "message": "Already have an account?" }, @@ -8741,11 +8747,11 @@ "readOnlyCollectionAccess": { "message": "You do not have access to manage this collection." }, - "grantAddAccessCollectionWarningTitle": { - "message": "Missing Can Manage Permissions" + "grantManageCollectionWarningTitle": { + "message": "Missing Manage Collection Permissions" }, - "grantAddAccessCollectionWarning": { - "message": "Grant Can manage permissions to allow full collection management including deletion of collection." + "grantManageCollectionWarning": { + "message": "Grant Manage collection permissions to allow full collection management including deletion of collection." }, "grantCollectionAccess": { "message": "Grant groups or members access to this collection." @@ -10091,6 +10097,15 @@ "descriptorCode": { "message": "Descriptor code" }, + "cannotRemoveViewOnlyCollections": { + "message": "You cannot remove collections with View only permissions: $COLLECTIONS$", + "placeholders": { + "collections": { + "content": "$1", + "example": "Work, Personal" + } + } + }, "importantNotice": { "message": "Important notice" }, @@ -10281,5 +10296,54 @@ "example": "Acme c" } } + }, + "accountDeprovisioningNotification": { + "message": "Administrators now have the ability to delete member accounts that belong to a claimed domain." + }, + "deleteManagedUserWarningDesc": { + "message": "This action will delete the member account including all items in their vault. This replaces the previous Remove action." + }, + "deleteManagedUserWarning": { + "message": "Delete is a new action!" + }, + "seatsRemaining": { + "message": "You have $REMAINING$ seats remaining out of $TOTAL$ seats assigned to this organization. Contact your provider to manage your subscription.", + "placeholders": { + "remaining": { + "content": "$1", + "example": "5" + }, + "total": { + "content": "$2", + "example": "10" + } + } + }, + "existingOrganization": { + "message": "Existing organization" + }, + "selectOrganizationProviderPortal": { + "message": "Select an organization to add to your Provider Portal." + }, + "noOrganizations": { + "message": "There are no organizations to list" + }, + "yourProviderSubscriptionCredit": { + "message": "Your provider subscription will receive a credit for any remaining time in the organization's subscription." + }, + "doYouWantToAddThisOrg": { + "message": "Do you want to add this organization to $PROVIDER$?", + "placeholders": { + "provider": { + "content": "$1", + "example": "Cool MSP" + } + } + }, + "addedExistingOrganization": { + "message": "Added existing organization" + }, + "assignedExceedsAvailable": { + "message": "Assigned seats exceed available seats." } } diff --git a/apps/web/src/locales/th/messages.json b/apps/web/src/locales/th/messages.json index 8136d1f9cc9..e906b3abfd1 100644 --- a/apps/web/src/locales/th/messages.json +++ b/apps/web/src/locales/th/messages.json @@ -464,6 +464,18 @@ "editFolder": { "message": "แก้​ไข​โฟลเดอร์" }, + "newFolder": { + "message": "New folder" + }, + "folderName": { + "message": "Folder name" + }, + "folderHintText": { + "message": "Nest a folder by adding the parent folder's name followed by a “/”. Example: Social/Forums" + }, + "deleteFolderPermanently": { + "message": "Are you sure you want to permanently delete this folder?" + }, "baseDomain": { "message": "โดเมนพื้นฐาน", "description": "Domain name. Example: website.com" @@ -728,15 +740,6 @@ "itemName": { "message": "Item name" }, - "cannotRemoveViewOnlyCollections": { - "message": "You cannot remove collections with View only permissions: $COLLECTIONS$", - "placeholders": { - "collections": { - "content": "$1", - "example": "Work, Personal" - } - } - }, "ex": { "message": "เช่น", "description": "Short abbreviation for 'example'." @@ -1182,6 +1185,9 @@ "logInInitiated": { "message": "Log in initiated" }, + "logInRequestSent": { + "message": "Request sent" + }, "submit": { "message": "ส่ง" }, @@ -1371,12 +1377,39 @@ "notificationSentDevice": { "message": "A notification has been sent to your device." }, + "notificationSentDevicePart1": { + "message": "Unlock Bitwarden on your device or on the " + }, + "areYouTryingToAccessYourAccount": { + "message": "Are you trying to access your account?" + }, + "accessAttemptBy": { + "message": "Access attempt by $EMAIL$", + "placeholders": { + "email": { + "content": "$1", + "example": "name@example.com" + } + } + }, + "confirmAccess": { + "message": "Confirm access" + }, + "denyAccess": { + "message": "Deny access" + }, + "notificationSentDeviceAnchor": { + "message": "web app" + }, + "notificationSentDevicePart2": { + "message": "Make sure the Fingerprint phrase matches the one below before approving." + }, + "notificationSentDeviceComplete": { + "message": "Unlock Bitwarden on your device. Make sure the Fingerprint phrase matches the one below before approving." + }, "aNotificationWasSentToYourDevice": { "message": "A notification was sent to your device" }, - "makeSureYourAccountIsUnlockedAndTheFingerprintEtc": { - "message": "Make sure your account is unlocked and the fingerprint phrase matches on the other device" - }, "versionNumber": { "message": "Version $VERSION_NUMBER$", "placeholders": { @@ -1664,9 +1697,6 @@ "message": "Avoid ambiguous characters", "description": "Label for the avoid ambiguous characters checkbox." }, - "regeneratePassword": { - "message": "Regenerate password" - }, "length": { "message": "Length" }, @@ -2170,8 +2200,20 @@ "manage": { "message": "Manage" }, - "canManage": { - "message": "Can manage" + "manageCollection": { + "message": "Manage collection" + }, + "viewItems": { + "message": "View items" + }, + "viewItemsHidePass": { + "message": "View items, hidden passwords" + }, + "editItems": { + "message": "Edit items" + }, + "editItemsHidePass": { + "message": "Edit items, hidden passwords" }, "disable": { "message": "Turn off" @@ -2368,11 +2410,8 @@ "twoFactorU2fProblemReadingTryAgain": { "message": "There was a problem reading the security key. Try again." }, - "twoFactorWebAuthnWarning": { - "message": "Due to platform limitations, WebAuthn cannot be used on all Bitwarden applications. You should set up another two-step login provider so that you can access your account when WebAuthn cannot be used. Supported platforms:" - }, - "twoFactorWebAuthnSupportWeb": { - "message": "Web vault and browser extensions on a desktop/laptop with a WebAuthn supported browser (Chrome, Opera, Vivaldi, or Firefox with FIDO U2F turned on)." + "twoFactorWebAuthnWarning1": { + "message": "Due to platform limitations, WebAuthn cannot be used on all Bitwarden applications. You should set up another two-step login provider so that you can access your account when WebAuthn cannot be used." }, "twoFactorRecoveryYourCode": { "message": "Your Bitwarden two-step login recovery code" @@ -4710,9 +4749,6 @@ "passwordGeneratorPolicyDesc": { "message": "Set requirements for password generator." }, - "passwordGeneratorPolicyInEffect": { - "message": "One or more organization policies are affecting your generator settings." - }, "masterPasswordPolicyInEffect": { "message": "One or more organization policies require your master password to meet the following requirements:" }, @@ -6681,15 +6717,6 @@ "message": "Generator", "description": "Short for 'credential generator'." }, - "whatWouldYouLikeToGenerate": { - "message": "What would you like to generate?" - }, - "passwordType": { - "message": "Password type" - }, - "regenerateUsername": { - "message": "Regenerate username" - }, "generateUsername": { "message": "Generate username" }, @@ -6730,9 +6757,6 @@ } } }, - "usernameType": { - "message": "Username type" - }, "plusAddressedEmail": { "message": "Plus addressed email", "description": "Username generator option that appends a random sub-address to the username. For example: address+subaddress@email.com" @@ -6952,9 +6976,6 @@ "message": "Hostname", "description": "Part of a URL." }, - "apiAccessToken": { - "message": "API access token" - }, "deviceVerification": { "message": "Device verification" }, @@ -7666,18 +7687,6 @@ "noCollection": { "message": "No collection" }, - "canView": { - "message": "Can view" - }, - "canViewExceptPass": { - "message": "Can view, except passwords" - }, - "canEdit": { - "message": "Can edit" - }, - "canEditExceptPass": { - "message": "Can edit, except passwords" - }, "noCollectionsAdded": { "message": "No collections added" }, @@ -8677,9 +8686,6 @@ "message": "Self-host server URL", "description": "Label for field requesting a self-hosted integration service URL" }, - "aliasDomain": { - "message": "Alias domain" - }, "alreadyHaveAccount": { "message": "Already have an account?" }, @@ -8741,11 +8747,11 @@ "readOnlyCollectionAccess": { "message": "You do not have access to manage this collection." }, - "grantAddAccessCollectionWarningTitle": { - "message": "Missing Can Manage Permissions" + "grantManageCollectionWarningTitle": { + "message": "Missing Manage Collection Permissions" }, - "grantAddAccessCollectionWarning": { - "message": "Grant Can manage permissions to allow full collection management including deletion of collection." + "grantManageCollectionWarning": { + "message": "Grant Manage collection permissions to allow full collection management including deletion of collection." }, "grantCollectionAccess": { "message": "Grant groups or members access to this collection." @@ -10091,6 +10097,15 @@ "descriptorCode": { "message": "Descriptor code" }, + "cannotRemoveViewOnlyCollections": { + "message": "You cannot remove collections with View only permissions: $COLLECTIONS$", + "placeholders": { + "collections": { + "content": "$1", + "example": "Work, Personal" + } + } + }, "importantNotice": { "message": "Important notice" }, @@ -10281,5 +10296,54 @@ "example": "Acme c" } } + }, + "accountDeprovisioningNotification": { + "message": "Administrators now have the ability to delete member accounts that belong to a claimed domain." + }, + "deleteManagedUserWarningDesc": { + "message": "This action will delete the member account including all items in their vault. This replaces the previous Remove action." + }, + "deleteManagedUserWarning": { + "message": "Delete is a new action!" + }, + "seatsRemaining": { + "message": "You have $REMAINING$ seats remaining out of $TOTAL$ seats assigned to this organization. Contact your provider to manage your subscription.", + "placeholders": { + "remaining": { + "content": "$1", + "example": "5" + }, + "total": { + "content": "$2", + "example": "10" + } + } + }, + "existingOrganization": { + "message": "Existing organization" + }, + "selectOrganizationProviderPortal": { + "message": "Select an organization to add to your Provider Portal." + }, + "noOrganizations": { + "message": "There are no organizations to list" + }, + "yourProviderSubscriptionCredit": { + "message": "Your provider subscription will receive a credit for any remaining time in the organization's subscription." + }, + "doYouWantToAddThisOrg": { + "message": "Do you want to add this organization to $PROVIDER$?", + "placeholders": { + "provider": { + "content": "$1", + "example": "Cool MSP" + } + } + }, + "addedExistingOrganization": { + "message": "Added existing organization" + }, + "assignedExceedsAvailable": { + "message": "Assigned seats exceed available seats." } } diff --git a/apps/web/src/locales/tr/messages.json b/apps/web/src/locales/tr/messages.json index 0ea5e52fd3d..b9db895499f 100644 --- a/apps/web/src/locales/tr/messages.json +++ b/apps/web/src/locales/tr/messages.json @@ -464,6 +464,18 @@ "editFolder": { "message": "Klasörü düzenle" }, + "newFolder": { + "message": "Yeni klasör" + }, + "folderName": { + "message": "Klasör adı" + }, + "folderHintText": { + "message": "Nest a folder by adding the parent folder's name followed by a “/”. Example: Social/Forums" + }, + "deleteFolderPermanently": { + "message": "Bu klasörü kalıcı olarak silmek istediğinizden emin misiniz?" + }, "baseDomain": { "message": "Ana alan adı", "description": "Domain name. Example: website.com" @@ -728,15 +740,6 @@ "itemName": { "message": "Kayıt adı" }, - "cannotRemoveViewOnlyCollections": { - "message": "You cannot remove collections with View only permissions: $COLLECTIONS$", - "placeholders": { - "collections": { - "content": "$1", - "example": "Work, Personal" - } - } - }, "ex": { "message": "örn.", "description": "Short abbreviation for 'example'." @@ -1182,6 +1185,9 @@ "logInInitiated": { "message": "Giriş başlatıldı" }, + "logInRequestSent": { + "message": "İstek gönderildi" + }, "submit": { "message": "Gönder" }, @@ -1371,12 +1377,39 @@ "notificationSentDevice": { "message": "Cihazınıza bir bildirim gönderildi." }, + "notificationSentDevicePart1": { + "message": "Unlock Bitwarden on your device or on the " + }, + "areYouTryingToAccessYourAccount": { + "message": "Hesabınıza erişmeye mi çalışıyorsunuz?" + }, + "accessAttemptBy": { + "message": "$EMAIL$ erişim denemesi", + "placeholders": { + "email": { + "content": "$1", + "example": "name@example.com" + } + } + }, + "confirmAccess": { + "message": "Erişimi onayla" + }, + "denyAccess": { + "message": "Erişimi reddet" + }, + "notificationSentDeviceAnchor": { + "message": "web app" + }, + "notificationSentDevicePart2": { + "message": "Make sure the Fingerprint phrase matches the one below before approving." + }, + "notificationSentDeviceComplete": { + "message": "Unlock Bitwarden on your device. Make sure the Fingerprint phrase matches the one below before approving." + }, "aNotificationWasSentToYourDevice": { "message": "Cihazınıza bir bildirim gönderildi" }, - "makeSureYourAccountIsUnlockedAndTheFingerprintEtc": { - "message": "Lütfen hesabınızın kilidinin açık olduğundan ve parmak izi ifadesinin diğer cihazla eşleştiğinden emin olun" - }, "versionNumber": { "message": "Sürüm $VERSION_NUMBER$", "placeholders": { @@ -1664,9 +1697,6 @@ "message": "Okurken karışabilecek karakterleri kullanma", "description": "Label for the avoid ambiguous characters checkbox." }, - "regeneratePassword": { - "message": "Yeni parola oluştur" - }, "length": { "message": "Uzunluk" }, @@ -2170,8 +2200,20 @@ "manage": { "message": "Yönet" }, - "canManage": { - "message": "Yönetebilir" + "manageCollection": { + "message": "Manage collection" + }, + "viewItems": { + "message": "View items" + }, + "viewItemsHidePass": { + "message": "View items, hidden passwords" + }, + "editItems": { + "message": "Edit items" + }, + "editItemsHidePass": { + "message": "Edit items, hidden passwords" }, "disable": { "message": "Devre dışı bırak" @@ -2368,11 +2410,8 @@ "twoFactorU2fProblemReadingTryAgain": { "message": "Güvenlik anahtarını okurken bir sorun oluştu. Tekrar deneyin." }, - "twoFactorWebAuthnWarning": { - "message": "Platform sınırlamaları nedeniyle WebAuthn tüm Bitwarden uygulamalarında kullanılamaz. WebAuthn kullanılamadığında hesabınıza erişebilmek için başka bir iki aşamalı doğrulama yöntemi ayarlamanız gerekir. Desteklenen platformlar:" - }, - "twoFactorWebAuthnSupportWeb": { - "message": "WebAuthn uyumlu bir tarayıcıya (FIDO U2F uyumlu Chrome, Opera, Vivaldi veya Firefox) sahip bir bilgisayardaki tarayıcı uzantıları." + "twoFactorWebAuthnWarning1": { + "message": "Platform sınırlamaları nedeniyle WebAuthn tüm Bitwarden uygulamalarında kullanılamaz. WebAuthn kullanılamadığında hesabınıza erişebilmek için başka bir iki aşamalı doğrulama yöntemi ayarlamanız gerekir." }, "twoFactorRecoveryYourCode": { "message": "Bitwarden iki aşamalı giriş kurtarma kodunuz" @@ -4710,9 +4749,6 @@ "passwordGeneratorPolicyDesc": { "message": "Parola üreticisi gereksinimleri ayarlayın." }, - "passwordGeneratorPolicyInEffect": { - "message": "Bir ya da daha fazla kuruluş ilkesi, oluşturucu ayarlarınızı etkiliyor." - }, "masterPasswordPolicyInEffect": { "message": "Bir veya daha fazla kuruluş ilkesi gereğince ana parolanız aşağıdaki gereksinimleri karşılamalıdır:" }, @@ -6681,15 +6717,6 @@ "message": "Oluşturucu", "description": "Short for 'credential generator'." }, - "whatWouldYouLikeToGenerate": { - "message": "Ne oluşturmak istersiniz?" - }, - "passwordType": { - "message": "Parola türü" - }, - "regenerateUsername": { - "message": "Kullanıcı adını yeniden oluştur" - }, "generateUsername": { "message": "Kullanıcı adı oluştur" }, @@ -6730,9 +6757,6 @@ } } }, - "usernameType": { - "message": "Kullanıcı adı türü" - }, "plusAddressedEmail": { "message": "Artı adresli e-posta", "description": "Username generator option that appends a random sub-address to the username. For example: address+subaddress@email.com" @@ -6952,9 +6976,6 @@ "message": "Sunucu", "description": "Part of a URL." }, - "apiAccessToken": { - "message": "API erişim token'ı" - }, "deviceVerification": { "message": "Cihaz doğrulama" }, @@ -7666,18 +7687,6 @@ "noCollection": { "message": "Koleksiyon yok" }, - "canView": { - "message": "Görüntüleyebilir" - }, - "canViewExceptPass": { - "message": "Parolalar hariç görüntüleyebilir" - }, - "canEdit": { - "message": "Düzenleyebilir" - }, - "canEditExceptPass": { - "message": "Parolalar hariç düzenleyebilir" - }, "noCollectionsAdded": { "message": "Hiç koleksiyon eklenmedi" }, @@ -8677,9 +8686,6 @@ "message": "Self-host server URL", "description": "Label for field requesting a self-hosted integration service URL" }, - "aliasDomain": { - "message": "Alias alan adı" - }, "alreadyHaveAccount": { "message": "Zaten hesabınız var mı?" }, @@ -8741,11 +8747,11 @@ "readOnlyCollectionAccess": { "message": "You do not have access to manage this collection." }, - "grantAddAccessCollectionWarningTitle": { - "message": "Missing Can Manage Permissions" + "grantManageCollectionWarningTitle": { + "message": "Missing Manage Collection Permissions" }, - "grantAddAccessCollectionWarning": { - "message": "Grant Can manage permissions to allow full collection management including deletion of collection." + "grantManageCollectionWarning": { + "message": "Grant Manage collection permissions to allow full collection management including deletion of collection." }, "grantCollectionAccess": { "message": "Gruplara veya üyelere bu koleksiyona erişim izni verin." @@ -10091,6 +10097,15 @@ "descriptorCode": { "message": "Descriptor code" }, + "cannotRemoveViewOnlyCollections": { + "message": "You cannot remove collections with View only permissions: $COLLECTIONS$", + "placeholders": { + "collections": { + "content": "$1", + "example": "Work, Personal" + } + } + }, "importantNotice": { "message": "Önemli uyarı" }, @@ -10281,5 +10296,54 @@ "example": "Acme c" } } + }, + "accountDeprovisioningNotification": { + "message": "Administrators now have the ability to delete member accounts that belong to a claimed domain." + }, + "deleteManagedUserWarningDesc": { + "message": "This action will delete the member account including all items in their vault. This replaces the previous Remove action." + }, + "deleteManagedUserWarning": { + "message": "Delete is a new action!" + }, + "seatsRemaining": { + "message": "You have $REMAINING$ seats remaining out of $TOTAL$ seats assigned to this organization. Contact your provider to manage your subscription.", + "placeholders": { + "remaining": { + "content": "$1", + "example": "5" + }, + "total": { + "content": "$2", + "example": "10" + } + } + }, + "existingOrganization": { + "message": "Existing organization" + }, + "selectOrganizationProviderPortal": { + "message": "Select an organization to add to your Provider Portal." + }, + "noOrganizations": { + "message": "There are no organizations to list" + }, + "yourProviderSubscriptionCredit": { + "message": "Your provider subscription will receive a credit for any remaining time in the organization's subscription." + }, + "doYouWantToAddThisOrg": { + "message": "Do you want to add this organization to $PROVIDER$?", + "placeholders": { + "provider": { + "content": "$1", + "example": "Cool MSP" + } + } + }, + "addedExistingOrganization": { + "message": "Added existing organization" + }, + "assignedExceedsAvailable": { + "message": "Assigned seats exceed available seats." } } diff --git a/apps/web/src/locales/uk/messages.json b/apps/web/src/locales/uk/messages.json index 07a8f8893cd..4b9b33182b7 100644 --- a/apps/web/src/locales/uk/messages.json +++ b/apps/web/src/locales/uk/messages.json @@ -464,6 +464,18 @@ "editFolder": { "message": "Редагування" }, + "newFolder": { + "message": "New folder" + }, + "folderName": { + "message": "Folder name" + }, + "folderHintText": { + "message": "Nest a folder by adding the parent folder's name followed by a “/”. Example: Social/Forums" + }, + "deleteFolderPermanently": { + "message": "Are you sure you want to permanently delete this folder?" + }, "baseDomain": { "message": "Основний домен", "description": "Domain name. Example: website.com" @@ -728,15 +740,6 @@ "itemName": { "message": "Назва запису" }, - "cannotRemoveViewOnlyCollections": { - "message": "Ви не можете вилучати збірки, маючи дозвіл лише на перегляд: $COLLECTIONS$", - "placeholders": { - "collections": { - "content": "$1", - "example": "Work, Personal" - } - } - }, "ex": { "message": "зразок", "description": "Short abbreviation for 'example'." @@ -1182,6 +1185,9 @@ "logInInitiated": { "message": "Ініційовано вхід" }, + "logInRequestSent": { + "message": "Request sent" + }, "submit": { "message": "Відправити" }, @@ -1371,12 +1377,39 @@ "notificationSentDevice": { "message": "Сповіщення було надіслано на ваш пристрій." }, + "notificationSentDevicePart1": { + "message": "Unlock Bitwarden on your device or on the " + }, + "areYouTryingToAccessYourAccount": { + "message": "Are you trying to access your account?" + }, + "accessAttemptBy": { + "message": "Access attempt by $EMAIL$", + "placeholders": { + "email": { + "content": "$1", + "example": "name@example.com" + } + } + }, + "confirmAccess": { + "message": "Confirm access" + }, + "denyAccess": { + "message": "Deny access" + }, + "notificationSentDeviceAnchor": { + "message": "web app" + }, + "notificationSentDevicePart2": { + "message": "Make sure the Fingerprint phrase matches the one below before approving." + }, + "notificationSentDeviceComplete": { + "message": "Unlock Bitwarden on your device. Make sure the Fingerprint phrase matches the one below before approving." + }, "aNotificationWasSentToYourDevice": { "message": "Сповіщення надіслано на ваш пристрій" }, - "makeSureYourAccountIsUnlockedAndTheFingerprintEtc": { - "message": "Переконайтеся, що ваш обліковий запис розблоковано і фраза відбитка на іншому пристрої збігається" - }, "versionNumber": { "message": "Версія $VERSION_NUMBER$", "placeholders": { @@ -1664,9 +1697,6 @@ "message": "Уникати неоднозначних символів", "description": "Label for the avoid ambiguous characters checkbox." }, - "regeneratePassword": { - "message": "Генерувати новий" - }, "length": { "message": "Довжина" }, @@ -2060,7 +2090,7 @@ "message": "Показувати піктограми вебсайтів" }, "faviconDesc": { - "message": "Показувати впізнаване зображення біля кожного запису." + "message": "Показувати зображення біля кожного запису." }, "default": { "message": "Типово" @@ -2170,8 +2200,20 @@ "manage": { "message": "Керувати" }, - "canManage": { - "message": "Може керувати" + "manageCollection": { + "message": "Manage collection" + }, + "viewItems": { + "message": "View items" + }, + "viewItemsHidePass": { + "message": "View items, hidden passwords" + }, + "editItems": { + "message": "Edit items" + }, + "editItemsHidePass": { + "message": "Edit items, hidden passwords" }, "disable": { "message": "Вимкнути" @@ -2368,11 +2410,8 @@ "twoFactorU2fProblemReadingTryAgain": { "message": "Сталася проблема при читанні ключа безпеки. Спробуйте знову." }, - "twoFactorWebAuthnWarning": { - "message": "У зв'язку з обмеженнями платформи, WebAuthn не можна використовувати в усіх програмах Bitwarden. Вам слід активувати іншого провайдера двоетапної перевірки, щоб мати змогу отримати доступ до свого облікового запису, коли неможливо скористатися WebAuthn. Підтримувані платформи:" - }, - "twoFactorWebAuthnSupportWeb": { - "message": "Вебсховище і розширення браузера на комп'ютерах і ноутбуках з браузерами, що мають підтримку WebAuthn (Chrome, Opera, Vivaldi, або Firefox з увімкненим FIDO U2F)." + "twoFactorWebAuthnWarning1": { + "message": "Due to platform limitations, WebAuthn cannot be used on all Bitwarden applications. You should set up another two-step login provider so that you can access your account when WebAuthn cannot be used." }, "twoFactorRecoveryYourCode": { "message": "Ваш код відновлення двоетапної перевірки Bitwarden" @@ -4710,9 +4749,6 @@ "passwordGeneratorPolicyDesc": { "message": "Встановити вимоги для генерування пароля." }, - "passwordGeneratorPolicyInEffect": { - "message": "На параметри генератора впливають одна чи декілька політик організації." - }, "masterPasswordPolicyInEffect": { "message": "Політика однієї або декількох організацій зобов'язує дотримання таких вимог для головного пароля:" }, @@ -6681,15 +6717,6 @@ "message": "Генератор", "description": "Short for 'credential generator'." }, - "whatWouldYouLikeToGenerate": { - "message": "Що ви бажаєте згенерувати?" - }, - "passwordType": { - "message": "Тип пароля" - }, - "regenerateUsername": { - "message": "Повторно генерувати ім'я користувача" - }, "generateUsername": { "message": "Генерувати ім'я користувача" }, @@ -6730,9 +6757,6 @@ } } }, - "usernameType": { - "message": "Тип імені користувача" - }, "plusAddressedEmail": { "message": "Адреса е-пошти з плюсом", "description": "Username generator option that appends a random sub-address to the username. For example: address+subaddress@email.com" @@ -6952,9 +6976,6 @@ "message": "Ім'я вузла", "description": "Part of a URL." }, - "apiAccessToken": { - "message": "Токен доступу до API" - }, "deviceVerification": { "message": "Перевірка пристрою" }, @@ -7666,18 +7687,6 @@ "noCollection": { "message": "Немає збірки" }, - "canView": { - "message": "Може переглядати" - }, - "canViewExceptPass": { - "message": "Може переглядати, крім паролів" - }, - "canEdit": { - "message": "Може редагувати" - }, - "canEditExceptPass": { - "message": "Може редагувати, крім паролів" - }, "noCollectionsAdded": { "message": "Не додано жодної збірки" }, @@ -8677,9 +8686,6 @@ "message": "URL-адреса власного сервера", "description": "Label for field requesting a self-hosted integration service URL" }, - "aliasDomain": { - "message": "Псевдонім домену" - }, "alreadyHaveAccount": { "message": "Вже маєте обліковий запис?" }, @@ -8741,11 +8747,11 @@ "readOnlyCollectionAccess": { "message": "У вас немає доступу до керування цією збіркою." }, - "grantAddAccessCollectionWarningTitle": { - "message": "Немає дозволу \"Може керувати\"" + "grantManageCollectionWarningTitle": { + "message": "Missing Manage Collection Permissions" }, - "grantAddAccessCollectionWarning": { - "message": "Надайте дозвіл \"Може керувати\" для можливості повноцінного керування збірками, включно з видаленням." + "grantManageCollectionWarning": { + "message": "Grant Manage collection permissions to allow full collection management including deletion of collection." }, "grantCollectionAccess": { "message": "Надайте групам або учасникам доступ до цієї збірки." @@ -10091,6 +10097,15 @@ "descriptorCode": { "message": "Код дескриптора" }, + "cannotRemoveViewOnlyCollections": { + "message": "Ви не можете вилучати збірки, маючи дозвіл лише на перегляд: $COLLECTIONS$", + "placeholders": { + "collections": { + "content": "$1", + "example": "Work, Personal" + } + } + }, "importantNotice": { "message": "Важлива інформація" }, @@ -10281,5 +10296,54 @@ "example": "Acme c" } } + }, + "accountDeprovisioningNotification": { + "message": "Administrators now have the ability to delete member accounts that belong to a claimed domain." + }, + "deleteManagedUserWarningDesc": { + "message": "This action will delete the member account including all items in their vault. This replaces the previous Remove action." + }, + "deleteManagedUserWarning": { + "message": "Delete is a new action!" + }, + "seatsRemaining": { + "message": "You have $REMAINING$ seats remaining out of $TOTAL$ seats assigned to this organization. Contact your provider to manage your subscription.", + "placeholders": { + "remaining": { + "content": "$1", + "example": "5" + }, + "total": { + "content": "$2", + "example": "10" + } + } + }, + "existingOrganization": { + "message": "Existing organization" + }, + "selectOrganizationProviderPortal": { + "message": "Select an organization to add to your Provider Portal." + }, + "noOrganizations": { + "message": "There are no organizations to list" + }, + "yourProviderSubscriptionCredit": { + "message": "Your provider subscription will receive a credit for any remaining time in the organization's subscription." + }, + "doYouWantToAddThisOrg": { + "message": "Do you want to add this organization to $PROVIDER$?", + "placeholders": { + "provider": { + "content": "$1", + "example": "Cool MSP" + } + } + }, + "addedExistingOrganization": { + "message": "Added existing organization" + }, + "assignedExceedsAvailable": { + "message": "Assigned seats exceed available seats." } } diff --git a/apps/web/src/locales/vi/messages.json b/apps/web/src/locales/vi/messages.json index 834a8db5e7a..4b7ce90344a 100644 --- a/apps/web/src/locales/vi/messages.json +++ b/apps/web/src/locales/vi/messages.json @@ -464,6 +464,18 @@ "editFolder": { "message": "Chỉnh sửa thư mục" }, + "newFolder": { + "message": "New folder" + }, + "folderName": { + "message": "Folder name" + }, + "folderHintText": { + "message": "Nest a folder by adding the parent folder's name followed by a “/”. Example: Social/Forums" + }, + "deleteFolderPermanently": { + "message": "Are you sure you want to permanently delete this folder?" + }, "baseDomain": { "message": "Tên miền cơ sở", "description": "Domain name. Example: website.com" @@ -728,15 +740,6 @@ "itemName": { "message": "Tên mục" }, - "cannotRemoveViewOnlyCollections": { - "message": "You cannot remove collections with View only permissions: $COLLECTIONS$", - "placeholders": { - "collections": { - "content": "$1", - "example": "Work, Personal" - } - } - }, "ex": { "message": "vd.", "description": "Short abbreviation for 'example'." @@ -1182,6 +1185,9 @@ "logInInitiated": { "message": "Log in initiated" }, + "logInRequestSent": { + "message": "Request sent" + }, "submit": { "message": "Gửi" }, @@ -1371,12 +1377,39 @@ "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 " + }, + "areYouTryingToAccessYourAccount": { + "message": "Are you trying to access your account?" + }, + "accessAttemptBy": { + "message": "Access attempt by $EMAIL$", + "placeholders": { + "email": { + "content": "$1", + "example": "name@example.com" + } + } + }, + "confirmAccess": { + "message": "Confirm access" + }, + "denyAccess": { + "message": "Deny access" + }, + "notificationSentDeviceAnchor": { + "message": "web app" + }, + "notificationSentDevicePart2": { + "message": "Make sure the Fingerprint phrase matches the one below before approving." + }, + "notificationSentDeviceComplete": { + "message": "Unlock Bitwarden on your device. Make sure the Fingerprint phrase matches the one below before approving." + }, "aNotificationWasSentToYourDevice": { "message": "A notification was sent to your device" }, - "makeSureYourAccountIsUnlockedAndTheFingerprintEtc": { - "message": "Make sure your account is unlocked and the fingerprint phrase matches on the other device" - }, "versionNumber": { "message": "Phiên bản $VERSION_NUMBER$", "placeholders": { @@ -1664,9 +1697,6 @@ "message": "Avoid ambiguous characters", "description": "Label for the avoid ambiguous characters checkbox." }, - "regeneratePassword": { - "message": "Tạo lại mật khẩu" - }, "length": { "message": "Độ dài" }, @@ -2170,8 +2200,20 @@ "manage": { "message": "Quản lý" }, - "canManage": { - "message": "Can manage" + "manageCollection": { + "message": "Manage collection" + }, + "viewItems": { + "message": "View items" + }, + "viewItemsHidePass": { + "message": "View items, hidden passwords" + }, + "editItems": { + "message": "Edit items" + }, + "editItemsHidePass": { + "message": "Edit items, hidden passwords" }, "disable": { "message": "Vô hiệu hoá" @@ -2368,11 +2410,8 @@ "twoFactorU2fProblemReadingTryAgain": { "message": "There was a problem reading the security key. Try again." }, - "twoFactorWebAuthnWarning": { - "message": "Due to platform limitations, WebAuthn cannot be used on all Bitwarden applications. You should set up another two-step login provider so that you can access your account when WebAuthn cannot be used. Supported platforms:" - }, - "twoFactorWebAuthnSupportWeb": { - "message": "Web vault and browser extensions on a desktop/laptop with a WebAuthn supported browser (Chrome, Opera, Vivaldi, or Firefox with FIDO U2F turned on)." + "twoFactorWebAuthnWarning1": { + "message": "Due to platform limitations, WebAuthn cannot be used on all Bitwarden applications. You should set up another two-step login provider so that you can access your account when WebAuthn cannot be used." }, "twoFactorRecoveryYourCode": { "message": "Your Bitwarden two-step login recovery code" @@ -4710,9 +4749,6 @@ "passwordGeneratorPolicyDesc": { "message": "Set requirements for password generator." }, - "passwordGeneratorPolicyInEffect": { - "message": "Các chính sách của tổ chức đang ảnh hưởng đến cài đặt tạo mật khẩu của bạn." - }, "masterPasswordPolicyInEffect": { "message": "One or more organization policies require your master password to meet the following requirements:" }, @@ -6681,15 +6717,6 @@ "message": "Trình tạo", "description": "Short for 'credential generator'." }, - "whatWouldYouLikeToGenerate": { - "message": "What would you like to generate?" - }, - "passwordType": { - "message": "Password type" - }, - "regenerateUsername": { - "message": "Regenerate username" - }, "generateUsername": { "message": "Generate username" }, @@ -6730,9 +6757,6 @@ } } }, - "usernameType": { - "message": "Username type" - }, "plusAddressedEmail": { "message": "Địa chỉ email có hậu tố", "description": "Username generator option that appends a random sub-address to the username. For example: address+subaddress@email.com" @@ -6952,9 +6976,6 @@ "message": "Hostname", "description": "Part of a URL." }, - "apiAccessToken": { - "message": "API access token" - }, "deviceVerification": { "message": "Device verification" }, @@ -7666,18 +7687,6 @@ "noCollection": { "message": "No collection" }, - "canView": { - "message": "Can view" - }, - "canViewExceptPass": { - "message": "Can view, except passwords" - }, - "canEdit": { - "message": "Can edit" - }, - "canEditExceptPass": { - "message": "Can edit, except passwords" - }, "noCollectionsAdded": { "message": "No collections added" }, @@ -8677,9 +8686,6 @@ "message": "Self-host server URL", "description": "Label for field requesting a self-hosted integration service URL" }, - "aliasDomain": { - "message": "Tên miền thay thế" - }, "alreadyHaveAccount": { "message": "Bạn đã có tài khoản?" }, @@ -8741,11 +8747,11 @@ "readOnlyCollectionAccess": { "message": "You do not have access to manage this collection." }, - "grantAddAccessCollectionWarningTitle": { - "message": "Missing Can Manage Permissions" + "grantManageCollectionWarningTitle": { + "message": "Missing Manage Collection Permissions" }, - "grantAddAccessCollectionWarning": { - "message": "Grant Can manage permissions to allow full collection management including deletion of collection." + "grantManageCollectionWarning": { + "message": "Grant Manage collection permissions to allow full collection management including deletion of collection." }, "grantCollectionAccess": { "message": "Grant groups or members access to this collection." @@ -10091,6 +10097,15 @@ "descriptorCode": { "message": "Descriptor code" }, + "cannotRemoveViewOnlyCollections": { + "message": "You cannot remove collections with View only permissions: $COLLECTIONS$", + "placeholders": { + "collections": { + "content": "$1", + "example": "Work, Personal" + } + } + }, "importantNotice": { "message": "Important notice" }, @@ -10281,5 +10296,54 @@ "example": "Acme c" } } + }, + "accountDeprovisioningNotification": { + "message": "Administrators now have the ability to delete member accounts that belong to a claimed domain." + }, + "deleteManagedUserWarningDesc": { + "message": "This action will delete the member account including all items in their vault. This replaces the previous Remove action." + }, + "deleteManagedUserWarning": { + "message": "Delete is a new action!" + }, + "seatsRemaining": { + "message": "You have $REMAINING$ seats remaining out of $TOTAL$ seats assigned to this organization. Contact your provider to manage your subscription.", + "placeholders": { + "remaining": { + "content": "$1", + "example": "5" + }, + "total": { + "content": "$2", + "example": "10" + } + } + }, + "existingOrganization": { + "message": "Existing organization" + }, + "selectOrganizationProviderPortal": { + "message": "Select an organization to add to your Provider Portal." + }, + "noOrganizations": { + "message": "There are no organizations to list" + }, + "yourProviderSubscriptionCredit": { + "message": "Your provider subscription will receive a credit for any remaining time in the organization's subscription." + }, + "doYouWantToAddThisOrg": { + "message": "Do you want to add this organization to $PROVIDER$?", + "placeholders": { + "provider": { + "content": "$1", + "example": "Cool MSP" + } + } + }, + "addedExistingOrganization": { + "message": "Added existing organization" + }, + "assignedExceedsAvailable": { + "message": "Assigned seats exceed available seats." } } diff --git a/apps/web/src/locales/zh_CN/messages.json b/apps/web/src/locales/zh_CN/messages.json index 8167d2063b7..72b3b470031 100644 --- a/apps/web/src/locales/zh_CN/messages.json +++ b/apps/web/src/locales/zh_CN/messages.json @@ -199,7 +199,7 @@ "message": "备注" }, "note": { - "message": "备注" + "message": "笔记" }, "customFields": { "message": "自定义字段" @@ -254,7 +254,7 @@ } }, "websiteAdded": { - "message": "网址已添加" + "message": "网站已添加" }, "addWebsite": { "message": "添加网站" @@ -464,6 +464,18 @@ "editFolder": { "message": "编辑文件夹" }, + "newFolder": { + "message": "新增文件夹" + }, + "folderName": { + "message": "文件夹名称" + }, + "folderHintText": { + "message": "通过在父文件夹名后面添加「/」来嵌套文件夹。示例:Social/Forums" + }, + "deleteFolderPermanently": { + "message": "您确定要永久删除这个文件夹吗?" + }, "baseDomain": { "message": "基础域", "description": "Domain name. Example: website.com" @@ -728,15 +740,6 @@ "itemName": { "message": "项目名称" }, - "cannotRemoveViewOnlyCollections": { - "message": "您无法删除仅具有「查看」权限的集合:$COLLECTIONS$", - "placeholders": { - "collections": { - "content": "$1", - "example": "Work, Personal" - } - } - }, "ex": { "message": "例如", "description": "Short abbreviation for 'example'." @@ -1182,6 +1185,9 @@ "logInInitiated": { "message": "登录已发起" }, + "logInRequestSent": { + "message": "请求已发送" + }, "submit": { "message": "提交" }, @@ -1213,7 +1219,7 @@ "message": "主密码提示(可选)" }, "newMasterPassHint": { - "message": "新的主密码提示(可选)" + "message": "新主密码提示(可选)" }, "masterPassHintLabel": { "message": "主密码提示" @@ -1371,12 +1377,39 @@ "notificationSentDevice": { "message": "通知已发送到您的设备。" }, + "notificationSentDevicePart1": { + "message": "Unlock Bitwarden on your device or on the " + }, + "areYouTryingToAccessYourAccount": { + "message": "您正在尝试访问您的账户吗?" + }, + "accessAttemptBy": { + "message": "$EMAIL$ 的访问尝试", + "placeholders": { + "email": { + "content": "$1", + "example": "name@example.com" + } + } + }, + "confirmAccess": { + "message": "确认访问" + }, + "denyAccess": { + "message": "拒绝访问" + }, + "notificationSentDeviceAnchor": { + "message": "网页 App" + }, + "notificationSentDevicePart2": { + "message": "在批准前,请确保指纹短语与下面的相匹配。" + }, + "notificationSentDeviceComplete": { + "message": "在您的设备上解锁 Bitwarden。在批准前,请确保指纹短语与下面的相匹配。" + }, "aNotificationWasSentToYourDevice": { "message": "通知已发送到您的设备" }, - "makeSureYourAccountIsUnlockedAndTheFingerprintEtc": { - "message": "确保您的账户已解锁,并且指纹短语与其他设备上的相匹配。" - }, "versionNumber": { "message": "版本: $VERSION_NUMBER$", "placeholders": { @@ -1664,9 +1697,6 @@ "message": "避免易混淆的字符", "description": "Label for the avoid ambiguous characters checkbox." }, - "regeneratePassword": { - "message": "重新生成密码" - }, "length": { "message": "长度" }, @@ -1743,7 +1773,7 @@ "message": "继续操作将更改您的账户电子邮箱地址。这不会更改用于双重身份验证的电子邮箱地址。您可以在两步登录设置中更改它。" }, "newEmail": { - "message": "新的电子邮箱" + "message": "新电子邮箱" }, "code": { "message": "代码" @@ -1849,25 +1879,25 @@ "message": "继续操作还将使您退出当前会话,并要求您重新登录。如果有设置两步登录,也需要重新验证。其他设备上的活动会话可能会继续保持活动状态长达一小时。" }, "newDeviceLoginProtection": { - "message": "New device login" + "message": "新设备登录" }, "turnOffNewDeviceLoginProtection": { - "message": "Turn off new device login protection" + "message": "关闭新设备登录保护" }, "turnOnNewDeviceLoginProtection": { - "message": "Turn on new device login protection" + "message": "开启新设备登录保护" }, "turnOffNewDeviceLoginProtectionModalDesc": { - "message": "Proceed below to turn off the verification emails bitwarden sends when you login from a new device." + "message": "按照以下步骤关闭 Bitwarden 在您从新设备登录时发送验证电子邮件的功能。" }, "turnOnNewDeviceLoginProtectionModalDesc": { - "message": "Proceed below to have bitwarden send you verification emails when you login from a new device." + "message": "按照以下步骤开启 Bitwarden 在您从新设备登录时发送验证电子邮件的功能。" }, "turnOffNewDeviceLoginProtectionWarning": { - "message": "With new device login protection turned off, anyone with your master password can access your account from any device. To protect your account without verification emails, set up two-step login." + "message": "关闭新设备登录保护后,任何拥有您的主密码的人都可以从任何设备访问您的账户。要在没有验证电子邮件的情况下保护您的账户,请设置两步登录。" }, "accountNewDeviceLoginProtectionSaved": { - "message": "New device login protection changes saved" + "message": "新设备登录保护更改已保存" }, "sessionsDeauthorized": { "message": "已取消所有会话授权" @@ -2170,8 +2200,20 @@ "manage": { "message": "管理" }, - "canManage": { - "message": "可以管理" + "manageCollection": { + "message": "管理集合" + }, + "viewItems": { + "message": "查看项目" + }, + "viewItemsHidePass": { + "message": "查看项目,隐藏密码" + }, + "editItems": { + "message": "编辑项目" + }, + "editItemsHidePass": { + "message": "编辑项目,隐藏密码" }, "disable": { "message": "停用" @@ -2279,7 +2321,7 @@ } }, "webAuthnkeyX": { - "message": "WebAuthn 密钥 $INDEX$", + "message": "WebAuthn 钥匙 $INDEX$", "placeholders": { "index": { "content": "$1", @@ -2368,11 +2410,8 @@ "twoFactorU2fProblemReadingTryAgain": { "message": "读取安全钥匙时出现问题,请重试。" }, - "twoFactorWebAuthnWarning": { - "message": "由于平台限制,WebAuthn 不能在所有 Bitwarden 应用程序上使用。您应该启用另一个两步登录提供程序,以便在 WebAuthn 无法使用时可以访问您的账户。支持的平台有:" - }, - "twoFactorWebAuthnSupportWeb": { - "message": "桌面/笔记本电脑上支持 WebAuthn 的浏览器(启用了 FIDO U2F 的 Chrome、Opera、Vivaldi 或 Firefox)中的网页密码库和浏览器扩展。" + "twoFactorWebAuthnWarning1": { + "message": "由于平台限制,WebAuthn 不能在所有 Bitwarden 应用程序上使用。您应该启用另一个两步登录提供程序,以便在无法使用 WebAuthn 时可以访问您的账户。" }, "twoFactorRecoveryYourCode": { "message": "您的 Bitwarden 两步登录恢复代码" @@ -2644,7 +2683,7 @@ "message": "请确保您的账户有足够的信用额度来用于此购买。如果您的账户信用额度不足,您的默认付款方式将用于补足差额。您可以从「计费」页面向您的账户添加信用额度。" }, "creditAppliedDesc": { - "message": "您账户的信用额度可用于进行消费。任何可用的信用额度将用于自动支付此账户的账单。" + "message": "您账户的信用额度可用于进行消费。任何可用的信用额度将用于自动抵扣此账户的账单。" }, "goPremium": { "message": "升级高级会员", @@ -2920,7 +2959,7 @@ "description": "Noun. A refunded payment that was charged." }, "chargesStatement": { - "message": "任何费用将在您的对账单上以 $STATEMENT_NAME$ 显示。", + "message": "任何费用将以 $STATEMENT_NAME$ 出现在您的对账单上。", "placeholders": { "statement_name": { "content": "$1", @@ -2938,7 +2977,7 @@ "message": "添加存储空间将会调整计费总金额,并立即通过您的付款方式进行扣款。第一笔费用将按当前计费周期的剩余时间按比例分配。" }, "storageRemoveNote": { - "message": "移除存储空间将会调整计费总金额,这笔费用将按比例返回下一笔账单费用中。" + "message": "移除存储空间将会调整计费总金额,这笔调整费用将按比例作为信用额度抵扣您的下一笔账单费用。" }, "adjustedStorage": { "message": "已调整 $AMOUNT$ GB 的存储空间。", @@ -3435,7 +3474,7 @@ "message": "更改了帐户密码" }, "enabledUpdated2fa": { - "message": "保存了两步登录" + "message": "两步登录已保存" }, "disabled2fa": { "message": "停用了两步登录" @@ -3796,7 +3835,7 @@ } }, "unlinkedSso": { - "message": "未链接 SSO。" + "message": "取消链接 SSO。" }, "unlinkedSsoUser": { "message": "为用户 $ID$ 取消链接 SSO。", @@ -4410,7 +4449,7 @@ "message": "添加用户席位将会调整计费总金额,并立即通过您的付款方式进行扣款。第一笔费用将按当前计费周期的剩余时间按比例分配。" }, "seatsRemoveNote": { - "message": "移除用户席位将会调整计费总金额,这笔费用将按比例返回下一笔账单费用中。" + "message": "移除用户席位将会调整计费总金额,这笔调整费用将按比例作为信用额度抵扣您的下一笔账单费用。" }, "adjustedSeats": { "message": "调整了 $AMOUNT$ 个用户席位。", @@ -4710,9 +4749,6 @@ "passwordGeneratorPolicyDesc": { "message": "设置密码生成器要求。" }, - "passwordGeneratorPolicyInEffect": { - "message": "一个或多个组织策略正在影响您的生成器设置。" - }, "masterPasswordPolicyInEffect": { "message": "一个或多个组织策略要求您的主密码满足以下要求:" }, @@ -5089,7 +5125,7 @@ "description": "This text will be displayed after a Send has been accessed the maximum amount of times." }, "pendingDeletion": { - "message": "等待删除" + "message": "待删除" }, "expired": { "message": "已过期" @@ -5144,7 +5180,7 @@ "message": "添加紧急联系人" }, "designatedEmergencyContacts": { - "message": "已指定为紧急联系人" + "message": "指定为紧急联系人" }, "noGrantedAccess": { "message": "您尚未被任何人指定为紧急联系人。" @@ -5504,7 +5540,7 @@ "message": "发送请求" }, "addANote": { - "message": "添加备注" + "message": "添加笔记" }, "bitwardenSecretsManager": { "message": "Bitwarden 机密管理器" @@ -6226,7 +6262,7 @@ "message": "链接已失效。请让赞助方重新发送邀请。" }, "reclaimedFreePlan": { - "message": "重新认领免费计划" + "message": "重新申领免费计划" }, "redeem": { "message": "兑换" @@ -6681,15 +6717,6 @@ "message": "生成器", "description": "Short for 'credential generator'." }, - "whatWouldYouLikeToGenerate": { - "message": "您想要生成什么?" - }, - "passwordType": { - "message": "密码类型" - }, - "regenerateUsername": { - "message": "重新生成用户名" - }, "generateUsername": { "message": "生成用户名" }, @@ -6730,9 +6757,6 @@ } } }, - "usernameType": { - "message": "用户名类型" - }, "plusAddressedEmail": { "message": "附加地址电子邮箱", "description": "Username generator option that appends a random sub-address to the username. For example: address+subaddress@email.com" @@ -6747,7 +6771,7 @@ "message": "使用您的域名配置的 Catch-all 收件箱。" }, "useThisEmail": { - "message": "Use this email" + "message": "使用此电子邮箱" }, "random": { "message": "随机", @@ -6952,9 +6976,6 @@ "message": "主机名", "description": "Part of a URL." }, - "apiAccessToken": { - "message": "API 访问令牌" - }, "deviceVerification": { "message": "设备验证" }, @@ -7344,7 +7365,7 @@ "description": "Message to encourage the user to start creating service accounts." }, "serviceAccountsNoItemsTitle": { - "message": "还没有要显示的内容", + "message": "还没有可显示的内容", "description": "Title to indicate that there are no service accounts to display." }, "searchSecrets": { @@ -7666,18 +7687,6 @@ "noCollection": { "message": "没有集合" }, - "canView": { - "message": "可以查看" - }, - "canViewExceptPass": { - "message": "除密码外,可以查看" - }, - "canEdit": { - "message": "可以编辑" - }, - "canEditExceptPass": { - "message": "除密码外,可以编辑" - }, "noCollectionsAdded": { "message": "未添加任何集合" }, @@ -8338,7 +8347,7 @@ "description": "Used as a card title description on the set password page to explain why the user is there" }, "cardMetrics": { - "message": "$TOTAL$ 不足", + "message": "总计 $TOTAL$", "placeholders": { "total": { "content": "$1", @@ -8620,13 +8629,13 @@ "message": "管理组织的集合行为" }, "limitCollectionCreationDesc": { - "message": "限制为仅所有者和管理员可以创建集合" + "message": "限制为所有者和管理员可以创建集合" }, "limitCollectionDeletionDesc": { - "message": "限制为仅所有者和管理员可以删除集合" + "message": "限制为所有者和管理员可以删除集合" }, "limitItemDeletionDesc": { - "message": "Limit item deletion to members with the Can manage permission" + "message": "限制为拥有「可以管理」权限的成员可以删除项目" }, "allowAdminAccessToAllCollectionItemsDesc": { "message": "所有者和管理员可以管理所有集合和项目" @@ -8677,9 +8686,6 @@ "message": "自托管服务器 URL", "description": "Label for field requesting a self-hosted integration service URL" }, - "aliasDomain": { - "message": "别名域" - }, "alreadyHaveAccount": { "message": "已经拥有账户了吗?" }, @@ -8690,7 +8696,7 @@ "message": "跳转到内容" }, "managePermissionRequired": { - "message": "必须至少有一个成员或群组拥有「可以管理」的权限。" + "message": "必须至少有一个成员或群组拥有「可以管理」权限。" }, "typePasskey": { "message": "通行密钥" @@ -8741,11 +8747,11 @@ "readOnlyCollectionAccess": { "message": "您没有管理此集合的权限。" }, - "grantAddAccessCollectionWarningTitle": { - "message": "缺少「可以管理」权限" + "grantManageCollectionWarningTitle": { + "message": "缺少「管理集合」权限" }, - "grantAddAccessCollectionWarning": { - "message": "授予「可以管理」权限以允许完整的集合管理,包括删除集合。" + "grantManageCollectionWarning": { + "message": "授予「管理集合」权限以允许完整的集合管理,包括删除集合。" }, "grantCollectionAccess": { "message": "授予群组或成员对此集合的访问权限。" @@ -8996,7 +9002,7 @@ "description": "Message to encourage the user to start creating machine accounts." }, "machineAccountsNoItemsTitle": { - "message": "暂无要显示的内容", + "message": "还没有可显示的内容", "description": "Title to indicate that there are no machine accounts to display." }, "deleteMachineAccounts": { @@ -10083,14 +10089,23 @@ "message": "不允许成员通过此组织兑换家庭计划。" }, "verifyBankAccountWithStatementDescriptorWarning": { - "message": "使用银行账户付款仅对美国用户开放。您将被要求验证您的银行账户。我们将在 1-2 个工作日内进行一笔小额转账,请在组织的计费页面输入该转账的语句描述符代码以验证银行账户。验证银行账户失败将会错过支付,您的订阅将失效。" + "message": "使用银行账户付款仅对美国用户开放。您将被要求验证您的银行账户。我们将在 1-2 个工作日内进行一笔小额转账,请在组织的计费页面输入该转账的对账单描述符代码以验证银行账户。验证银行账户失败将会错过支付,您的订阅将失效。" }, "verifyBankAccountWithStatementDescriptorInstructions": { - "message": "我们已向您的银行账户存入了一笔小额转账(可能需要 1-2 个工作日到账)。请输入转账说明中以 \"SM\" 开头的六位数代码。验证银行账户失败将会错过支付,您的订阅将失效。" + "message": "我们已向您的银行账户存入了一笔小额转账(可能需要 1-2 个工作日到账)。请输入转账描述中以「SM」开头的六位数代码。验证银行账户失败将会错过支付,您的订阅将失效。" }, "descriptorCode": { "message": "描述符代码" }, + "cannotRemoveViewOnlyCollections": { + "message": "您无法删除仅具有「查看」权限的集合:$COLLECTIONS$", + "placeholders": { + "collections": { + "content": "$1", + "example": "Work, Personal" + } + } + }, "importantNotice": { "message": "重要通知" }, @@ -10281,5 +10296,54 @@ "example": "Acme c" } } + }, + "accountDeprovisioningNotification": { + "message": "管理员现在可以删除已声明域名下的成员账户。" + }, + "deleteManagedUserWarningDesc": { + "message": "此操作将删除成员账户及其密码库中的所有项目。其取代了之前的「移除」操作。" + }, + "deleteManagedUserWarning": { + "message": "「删除」是一个新的操作!" + }, + "seatsRemaining": { + "message": "该组织已分配 $TOTAL$ 个席位,您还剩余 $REMAINING$ 个席位。请联系提供商管理您的订阅。", + "placeholders": { + "remaining": { + "content": "$1", + "example": "5" + }, + "total": { + "content": "$2", + "example": "10" + } + } + }, + "existingOrganization": { + "message": "现有组织" + }, + "selectOrganizationProviderPortal": { + "message": "选择一个要添加到您的提供商门户的组织。" + }, + "noOrganizations": { + "message": "没有可列出的组织" + }, + "yourProviderSubscriptionCredit": { + "message": "您的提供商订阅将获得此组织订阅剩余时间内的信用额度。" + }, + "doYouWantToAddThisOrg": { + "message": "您想将该组织添加到 $PROVIDER$ 吗?", + "placeholders": { + "provider": { + "content": "$1", + "example": "Cool MSP" + } + } + }, + "addedExistingOrganization": { + "message": "添加了现有组织" + }, + "assignedExceedsAvailable": { + "message": "分配的席位超过可用席位。" } } diff --git a/apps/web/src/locales/zh_TW/messages.json b/apps/web/src/locales/zh_TW/messages.json index 9087f640fcf..fc1bf0b63f1 100644 --- a/apps/web/src/locales/zh_TW/messages.json +++ b/apps/web/src/locales/zh_TW/messages.json @@ -464,6 +464,18 @@ "editFolder": { "message": "編輯資料夾" }, + "newFolder": { + "message": "New folder" + }, + "folderName": { + "message": "Folder name" + }, + "folderHintText": { + "message": "Nest a folder by adding the parent folder's name followed by a “/”. Example: Social/Forums" + }, + "deleteFolderPermanently": { + "message": "Are you sure you want to permanently delete this folder?" + }, "baseDomain": { "message": "基底網域", "description": "Domain name. Example: website.com" @@ -728,15 +740,6 @@ "itemName": { "message": "項目名" }, - "cannotRemoveViewOnlyCollections": { - "message": "You cannot remove collections with View only permissions: $COLLECTIONS$", - "placeholders": { - "collections": { - "content": "$1", - "example": "Work, Personal" - } - } - }, "ex": { "message": "例如", "description": "Short abbreviation for 'example'." @@ -1182,6 +1185,9 @@ "logInInitiated": { "message": "登入已發起" }, + "logInRequestSent": { + "message": "Request sent" + }, "submit": { "message": "送出" }, @@ -1371,12 +1377,39 @@ "notificationSentDevice": { "message": "通知已傳送至您的裝置。" }, + "notificationSentDevicePart1": { + "message": "Unlock Bitwarden on your device or on the " + }, + "areYouTryingToAccessYourAccount": { + "message": "Are you trying to access your account?" + }, + "accessAttemptBy": { + "message": "Access attempt by $EMAIL$", + "placeholders": { + "email": { + "content": "$1", + "example": "name@example.com" + } + } + }, + "confirmAccess": { + "message": "Confirm access" + }, + "denyAccess": { + "message": "Deny access" + }, + "notificationSentDeviceAnchor": { + "message": "web app" + }, + "notificationSentDevicePart2": { + "message": "Make sure the Fingerprint phrase matches the one below before approving." + }, + "notificationSentDeviceComplete": { + "message": "Unlock Bitwarden on your device. Make sure the Fingerprint phrase matches the one below before approving." + }, "aNotificationWasSentToYourDevice": { "message": "已傳送通知至您的裝置" }, - "makeSureYourAccountIsUnlockedAndTheFingerprintEtc": { - "message": "Make sure your account is unlocked and the fingerprint phrase matches on the other device" - }, "versionNumber": { "message": "版本 $VERSION_NUMBER$", "placeholders": { @@ -1664,9 +1697,6 @@ "message": "Avoid ambiguous characters", "description": "Label for the avoid ambiguous characters checkbox." }, - "regeneratePassword": { - "message": "重新產生密碼" - }, "length": { "message": "長度" }, @@ -2170,8 +2200,20 @@ "manage": { "message": "管理" }, - "canManage": { - "message": "可以管理" + "manageCollection": { + "message": "Manage collection" + }, + "viewItems": { + "message": "View items" + }, + "viewItemsHidePass": { + "message": "View items, hidden passwords" + }, + "editItems": { + "message": "Edit items" + }, + "editItemsHidePass": { + "message": "Edit items, hidden passwords" }, "disable": { "message": "停用" @@ -2368,11 +2410,8 @@ "twoFactorU2fProblemReadingTryAgain": { "message": "讀取安全鑰匙時發生問題。請再試一次。" }, - "twoFactorWebAuthnWarning": { - "message": "由於平台限制,無法於所有 Bitwarden 應用程式中使用 WebAuthn。請設定另一套兩步驟登入方式,以確保在 WebAuthn 無法使用時還能存取您的帳戶。支援的平台有:" - }, - "twoFactorWebAuthnSupportWeb": { - "message": "桌上型電腦/筆記型電腦上支援 WebAuthn 功能的瀏覽器(啟用了 FIDO U2F 的 Chrome、Opera、Vivaldi 或 Firefox)上的網頁版密碼庫和瀏覽器擴充套件。" + "twoFactorWebAuthnWarning1": { + "message": "Due to platform limitations, WebAuthn cannot be used on all Bitwarden applications. You should set up another two-step login provider so that you can access your account when WebAuthn cannot be used." }, "twoFactorRecoveryYourCode": { "message": "您的 Bitwarden 兩步驟登入復原碼" @@ -4710,9 +4749,6 @@ "passwordGeneratorPolicyDesc": { "message": "設定密碼產生器要求。" }, - "passwordGeneratorPolicyInEffect": { - "message": "一個或多個組織原則正影響密碼產生器設定。" - }, "masterPasswordPolicyInEffect": { "message": "一個或多個組織原則要求您的主密碼須符合下列條件:" }, @@ -6681,15 +6717,6 @@ "message": "產生器", "description": "Short for 'credential generator'." }, - "whatWouldYouLikeToGenerate": { - "message": "您想要產生什麼?" - }, - "passwordType": { - "message": "密碼類型" - }, - "regenerateUsername": { - "message": "重新產生使用者名稱" - }, "generateUsername": { "message": "產生使用者名稱" }, @@ -6730,9 +6757,6 @@ } } }, - "usernameType": { - "message": "使用者名稱類型" - }, "plusAddressedEmail": { "message": "加號地址電子郵件", "description": "Username generator option that appends a random sub-address to the username. For example: address+subaddress@email.com" @@ -6952,9 +6976,6 @@ "message": "主機名稱", "description": "Part of a URL." }, - "apiAccessToken": { - "message": "API 存取權杖" - }, "deviceVerification": { "message": "裝置驗證" }, @@ -7666,18 +7687,6 @@ "noCollection": { "message": "沒有分類" }, - "canView": { - "message": "可以檢視" - }, - "canViewExceptPass": { - "message": "可以檢視(除了密碼)" - }, - "canEdit": { - "message": "可以編輯" - }, - "canEditExceptPass": { - "message": "可以編輯(除了密碼)" - }, "noCollectionsAdded": { "message": "未新增任何分類" }, @@ -8677,9 +8686,6 @@ "message": "Self-host server URL", "description": "Label for field requesting a self-hosted integration service URL" }, - "aliasDomain": { - "message": "別名網域" - }, "alreadyHaveAccount": { "message": "已經有一個帳戶了嗎?" }, @@ -8741,11 +8747,11 @@ "readOnlyCollectionAccess": { "message": "You do not have access to manage this collection." }, - "grantAddAccessCollectionWarningTitle": { - "message": "Missing Can Manage Permissions" + "grantManageCollectionWarningTitle": { + "message": "Missing Manage Collection Permissions" }, - "grantAddAccessCollectionWarning": { - "message": "Grant Can manage permissions to allow full collection management including deletion of collection." + "grantManageCollectionWarning": { + "message": "Grant Manage collection permissions to allow full collection management including deletion of collection." }, "grantCollectionAccess": { "message": "Grant groups or members access to this collection." @@ -10091,6 +10097,15 @@ "descriptorCode": { "message": "Descriptor code" }, + "cannotRemoveViewOnlyCollections": { + "message": "You cannot remove collections with View only permissions: $COLLECTIONS$", + "placeholders": { + "collections": { + "content": "$1", + "example": "Work, Personal" + } + } + }, "importantNotice": { "message": "Important notice" }, @@ -10281,5 +10296,54 @@ "example": "Acme c" } } + }, + "accountDeprovisioningNotification": { + "message": "Administrators now have the ability to delete member accounts that belong to a claimed domain." + }, + "deleteManagedUserWarningDesc": { + "message": "This action will delete the member account including all items in their vault. This replaces the previous Remove action." + }, + "deleteManagedUserWarning": { + "message": "Delete is a new action!" + }, + "seatsRemaining": { + "message": "You have $REMAINING$ seats remaining out of $TOTAL$ seats assigned to this organization. Contact your provider to manage your subscription.", + "placeholders": { + "remaining": { + "content": "$1", + "example": "5" + }, + "total": { + "content": "$2", + "example": "10" + } + } + }, + "existingOrganization": { + "message": "Existing organization" + }, + "selectOrganizationProviderPortal": { + "message": "Select an organization to add to your Provider Portal." + }, + "noOrganizations": { + "message": "There are no organizations to list" + }, + "yourProviderSubscriptionCredit": { + "message": "Your provider subscription will receive a credit for any remaining time in the organization's subscription." + }, + "doYouWantToAddThisOrg": { + "message": "Do you want to add this organization to $PROVIDER$?", + "placeholders": { + "provider": { + "content": "$1", + "example": "Cool MSP" + } + } + }, + "addedExistingOrganization": { + "message": "Added existing organization" + }, + "assignedExceedsAvailable": { + "message": "Assigned seats exceed available seats." } } diff --git a/apps/web/src/main.ts b/apps/web/src/main.ts index 1d1519c8b50..b202a170d26 100644 --- a/apps/web/src/main.ts +++ b/apps/web/src/main.ts @@ -11,6 +11,4 @@ if (process.env.NODE_ENV === "production") { enableProdMode(); } -// 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 -platformBrowserDynamic().bootstrapModule(AppModule, { preserveWhitespaces: true }); +void platformBrowserDynamic().bootstrapModule(AppModule); diff --git a/apps/web/tsconfig.json b/apps/web/tsconfig.json index 19a94e829aa..b4608a3dfae 100644 --- a/apps/web/tsconfig.json +++ b/apps/web/tsconfig.json @@ -36,8 +36,7 @@ } }, "angularCompilerOptions": { - "strictTemplates": true, - "preserveWhitespaces": true + "strictTemplates": true }, "files": ["src/polyfills.ts", "src/main.ts", "src/theme.ts"], "include": [ diff --git a/bitwarden_license/bit-web/src/app/admin-console/providers/providers.module.ts b/bitwarden_license/bit-web/src/app/admin-console/providers/providers.module.ts index 3310be7ba36..c720a94d5ec 100644 --- a/bitwarden_license/bit-web/src/app/admin-console/providers/providers.module.ts +++ b/bitwarden_license/bit-web/src/app/admin-console/providers/providers.module.ts @@ -6,7 +6,7 @@ import { FormsModule } from "@angular/forms"; import { JslibModule } from "@bitwarden/angular/jslib.module"; import { SearchModule } from "@bitwarden/components"; import { DangerZoneComponent } from "@bitwarden/web-vault/app/auth/settings/account/danger-zone.component"; -import { OrganizationPlansComponent, TaxInfoComponent } from "@bitwarden/web-vault/app/billing"; +import { OrganizationPlansComponent } from "@bitwarden/web-vault/app/billing"; import { OssModule } from "@bitwarden/web-vault/app/oss.module"; import { @@ -47,7 +47,6 @@ import { VerifyRecoverDeleteProviderComponent } from "./verify-recover-delete-pr OrganizationPlansComponent, SearchModule, ProvidersLayoutComponent, - TaxInfoComponent, DangerZoneComponent, ScrollingModule, ], diff --git a/bitwarden_license/bit-web/src/app/tools/access-intelligence/all-applications.component.html b/bitwarden_license/bit-web/src/app/tools/access-intelligence/all-applications.component.html index c0eb8080070..4ef5453478e 100644 --- a/bitwarden_license/bit-web/src/app/tools/access-intelligence/all-applications.component.html +++ b/bitwarden_license/bit-web/src/app/tools/access-intelligence/all-applications.component.html @@ -4,7 +4,7 @@
-

+

{{ "noAppsInOrgTitle" | i18n: organization?.name }}

@@ -13,7 +13,7 @@ {{ "noAppsInOrgDescription" | i18n }} - {{ "learnMore" | i18n }} + {{ "learnMore" | i18n }}
diff --git a/bitwarden_license/bit-web/src/app/tools/access-intelligence/critical-applications.component.html b/bitwarden_license/bit-web/src/app/tools/access-intelligence/critical-applications.component.html index 4dc4b7ffb1a..3eb7831c7f8 100644 --- a/bitwarden_license/bit-web/src/app/tools/access-intelligence/critical-applications.component.html +++ b/bitwarden_license/bit-web/src/app/tools/access-intelligence/critical-applications.component.html @@ -9,7 +9,7 @@
-

+

{{ "noCriticalAppsTitle" | i18n }}

@@ -28,7 +28,14 @@

{{ "criticalApplications" | i18n }}

- diff --git a/bitwarden_license/bit-web/src/app/tools/access-intelligence/critical-applications.component.ts b/bitwarden_license/bit-web/src/app/tools/access-intelligence/critical-applications.component.ts index f1fa38dd28f..42c1c62a437 100644 --- a/bitwarden_license/bit-web/src/app/tools/access-intelligence/critical-applications.component.ts +++ b/bitwarden_license/bit-web/src/app/tools/access-intelligence/critical-applications.component.ts @@ -18,7 +18,7 @@ import { import { FeatureFlag } from "@bitwarden/common/enums/feature-flag.enum"; import { ConfigService } from "@bitwarden/common/platform/abstractions/config/config.service"; import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; -import { OrganizationId } from "@bitwarden/common/types/guid"; +import { CipherId, OrganizationId } from "@bitwarden/common/types/guid"; import { Icons, NoItemsModule, @@ -27,10 +27,14 @@ import { ToastService, } from "@bitwarden/components"; import { CardComponent } from "@bitwarden/tools-card"; +import { SecurityTaskType } from "@bitwarden/vault"; import { HeaderModule } from "@bitwarden/web-vault/app/layouts/header/header.module"; import { SharedModule } from "@bitwarden/web-vault/app/shared"; import { PipesModule } from "@bitwarden/web-vault/app/vault/individual-vault/pipes/pipes.module"; +import { CreateTasksRequest } from "../../vault/services/abstractions/admin-task.abstraction"; +import { DefaultAdminTaskService } from "../../vault/services/default-admin-task.service"; + import { RiskInsightsTabType } from "./risk-insights.component"; @Component({ @@ -38,7 +42,7 @@ import { RiskInsightsTabType } from "./risk-insights.component"; selector: "tools-critical-applications", templateUrl: "./critical-applications.component.html", imports: [CardComponent, HeaderModule, SearchModule, NoItemsModule, PipesModule, SharedModule], - providers: [], + providers: [DefaultAdminTaskService], }) export class CriticalApplicationsComponent implements OnInit { protected dataSource = new TableDataSource(); @@ -50,6 +54,7 @@ export class CriticalApplicationsComponent implements OnInit { protected applicationSummary = {} as ApplicationHealthReportSummary; noItemsIcon = Icons.Security; isNotificationsFeatureEnabled: boolean = false; + enableRequestPasswordChange = false; async ngOnInit() { this.isNotificationsFeatureEnabled = await this.configService.getFeatureFlag( @@ -75,6 +80,7 @@ export class CriticalApplicationsComponent implements OnInit { if (applications) { this.dataSource.data = applications; this.applicationSummary = this.reportService.generateApplicationsSummary(applications); + this.enableRequestPasswordChange = this.applicationSummary.totalAtRiskMemberCount > 0; } }); } @@ -109,6 +115,33 @@ export class CriticalApplicationsComponent implements OnInit { this.dataSource.data = this.dataSource.data.filter((app) => app.applicationName !== hostname); }; + async requestPasswordChange() { + const apps = this.dataSource.data; + const cipherIds = apps + .filter((_) => _.atRiskPasswordCount > 0) + .flatMap((app) => app.atRiskMemberDetails.map((member) => member.cipherId)); + const distinctCipherIds = Array.from(new Set(cipherIds)); + const tasks: CreateTasksRequest[] = distinctCipherIds.map((cipherId) => ({ + cipherId: cipherId as CipherId, + type: SecurityTaskType.UpdateAtRiskCredential, + })); + + try { + await this.adminTaskService.bulkCreateTasks(this.organizationId as OrganizationId, tasks); + this.toastService.showToast({ + message: this.i18nService.t("notifiedMembers"), + variant: "success", + title: this.i18nService.t("success"), + }); + } catch { + this.toastService.showToast({ + message: this.i18nService.t("unexpectedError"), + variant: "error", + title: this.i18nService.t("error"), + }); + } + } + constructor( protected activatedRoute: ActivatedRoute, protected router: Router, @@ -118,6 +151,7 @@ export class CriticalApplicationsComponent implements OnInit { protected reportService: RiskInsightsReportService, protected i18nService: I18nService, private configService: ConfigService, + private adminTaskService: DefaultAdminTaskService, ) { this.searchControl.valueChanges .pipe(debounceTime(200), takeUntilDestroyed()) diff --git a/bitwarden_license/bit-web/src/app/tools/access-intelligence/risk-insights-loading.component.html b/bitwarden_license/bit-web/src/app/tools/access-intelligence/risk-insights-loading.component.html index d6f945bfb92..4e77838229e 100644 --- a/bitwarden_license/bit-web/src/app/tools/access-intelligence/risk-insights-loading.component.html +++ b/bitwarden_license/bit-web/src/app/tools/access-intelligence/risk-insights-loading.component.html @@ -1,6 +1,6 @@
diff --git a/bitwarden_license/bit-web/src/app/tools/access-intelligence/risk-insights.component.html b/bitwarden_license/bit-web/src/app/tools/access-intelligence/risk-insights.component.html index 12082e888b0..397e2a630de 100644 --- a/bitwarden_license/bit-web/src/app/tools/access-intelligence/risk-insights.component.html +++ b/bitwarden_license/bit-web/src/app/tools/access-intelligence/risk-insights.component.html @@ -1,6 +1,8 @@ -
{{ "accessIntelligence" | i18n }}
+
+ {{ "accessIntelligence" | i18n }} +

{{ "riskInsights" | i18n }}

{{ "reviewAtRiskPasswords" | i18n }} @@ -9,7 +11,7 @@ class="tw-bg-primary-100 tw-rounded-lg tw-w-full tw-px-8 tw-py-4 tw-my-4 tw-flex tw-items-center" > {{ diff --git a/bitwarden_license/bit-web/src/main.ts b/bitwarden_license/bit-web/src/main.ts index 1d1519c8b50..b202a170d26 100644 --- a/bitwarden_license/bit-web/src/main.ts +++ b/bitwarden_license/bit-web/src/main.ts @@ -11,6 +11,4 @@ if (process.env.NODE_ENV === "production") { enableProdMode(); } -// 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 -platformBrowserDynamic().bootstrapModule(AppModule, { preserveWhitespaces: true }); +void platformBrowserDynamic().bootstrapModule(AppModule); diff --git a/libs/angular/src/admin-console/components/collections.component.ts b/libs/angular/src/admin-console/components/collections.component.ts index 52a22ac2946..5f39966468f 100644 --- a/libs/angular/src/admin-console/components/collections.component.ts +++ b/libs/angular/src/admin-console/components/collections.component.ts @@ -7,9 +7,11 @@ import { CollectionService, CollectionView } from "@bitwarden/admin-console/comm import { OrganizationService } from "@bitwarden/common/admin-console/abstractions/organization/organization.service.abstraction"; import { Organization } from "@bitwarden/common/admin-console/models/domain/organization"; import { AccountService } from "@bitwarden/common/auth/abstractions/account.service"; +import { getUserId } from "@bitwarden/common/auth/services/account.service"; import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; import { LogService } from "@bitwarden/common/platform/abstractions/log.service"; import { PlatformUtilsService } from "@bitwarden/common/platform/abstractions/platform-utils.service"; +import { UserId } from "@bitwarden/common/types/guid"; import { CipherService } from "@bitwarden/common/vault/abstractions/cipher.service"; import { Cipher } from "@bitwarden/common/vault/models/domain/cipher"; import { CipherView } from "@bitwarden/common/vault/models/view/cipher.view"; @@ -45,11 +47,9 @@ export class CollectionsComponent implements OnInit { } async load() { - this.cipherDomain = await this.loadCipher(); + const activeUserId = await firstValueFrom(this.accountService.activeAccount$.pipe(getUserId)); + this.cipherDomain = await this.loadCipher(activeUserId); this.collectionIds = this.loadCipherCollections(); - const activeUserId = await firstValueFrom( - this.accountService.activeAccount$.pipe(map((a) => a?.id)), - ); this.cipher = await this.cipherDomain.decrypt( await this.cipherService.getKeyForCipherKeyDecryption(this.cipherDomain, activeUserId), ); @@ -95,7 +95,8 @@ export class CollectionsComponent implements OnInit { } this.cipherDomain.collectionIds = selectedCollectionIds; try { - this.formPromise = this.saveCollections(); + const activeUserId = await firstValueFrom(this.accountService.activeAccount$.pipe(getUserId)); + this.formPromise = this.saveCollections(activeUserId); await this.formPromise; this.onSavedCollections.emit(); this.toastService.showToast({ @@ -114,8 +115,8 @@ export class CollectionsComponent implements OnInit { } } - protected loadCipher() { - return this.cipherService.get(this.cipherId); + protected loadCipher(userId: UserId) { + return this.cipherService.get(this.cipherId, userId); } protected loadCipherCollections() { @@ -129,7 +130,7 @@ export class CollectionsComponent implements OnInit { ); } - protected saveCollections() { - return this.cipherService.saveCollectionsWithServer(this.cipherDomain); + protected saveCollections(userId: UserId) { + return this.cipherService.saveCollectionsWithServer(this.cipherDomain, userId); } } diff --git a/libs/angular/src/auth/components/environment-selector.component.html b/libs/angular/src/auth/components/environment-selector.component.html index 786afe40371..19f49f73dd2 100644 --- a/libs/angular/src/auth/components/environment-selector.component.html +++ b/libs/angular/src/auth/components/environment-selector.component.html @@ -3,7 +3,7 @@ selectedRegion: selectedRegion$ | async, } as data" > -
+
{{ "accessing" | i18n }}: ``` - + Note that if the user resizes the page and the Popover no longer fits in the viewport, the Popover component will fall back to the list of default positions to find the best position. diff --git a/libs/components/src/progress/progress.mdx b/libs/components/src/progress/progress.mdx index 185d6214f1f..9a75f8ae1fa 100644 --- a/libs/components/src/progress/progress.mdx +++ b/libs/components/src/progress/progress.mdx @@ -1,4 +1,4 @@ -import { Meta, Story, Primary, Controls } from "@storybook/addon-docs"; +import { Meta, Canvas, Primary, Controls } from "@storybook/addon-docs"; import * as stories from "./progress.stories"; @@ -19,14 +19,14 @@ allows those who may not be familiar with the pattern to be able to read and dig It also allows assistive technology to accurately describe the indicator to those who may be unable to see part or all of the indicator. - + ## Text label When measuring something other than progress, such as password strength, update the label to fit the context of the implementation. - + ### Strength indicator styles diff --git a/libs/components/src/section/section.mdx b/libs/components/src/section/section.mdx index 52672ad59fb..92798420479 100644 --- a/libs/components/src/section/section.mdx +++ b/libs/components/src/section/section.mdx @@ -1,4 +1,4 @@ -import { Meta, Story, Primary, Controls, Canvas } from "@storybook/addon-docs"; +import { Meta, Primary, Controls, Canvas } from "@storybook/addon-docs"; import * as stories from "./section.stories"; @@ -26,9 +26,7 @@ the `disableMargin` input. ``` - - - + ## Section Header @@ -61,16 +59,12 @@ padding to align the header with the border radius of the card/item. ``` - - - + If placed inside of a section without a `bit-card` or `bit-item`, or with a `bit-card`/`bit-item` that is not a descendant of the immediate next sibling, the padding is not applied. - - - + ### Section Header Content Slots @@ -89,14 +83,10 @@ Anything passed to the default slot will display as part of the title. The title Title suffixes (typically an icon or icon button) can be added as well. A gap is automatically applied between the children of the default slot. - - - + #### End slot The `end` slot will typically be used for text or an icon button. - - - + diff --git a/libs/components/src/stories/colors.mdx b/libs/components/src/stories/colors.mdx index 22079dfcbf7..3a4a4f0fe3a 100644 --- a/libs/components/src/stories/colors.mdx +++ b/libs/components/src/stories/colors.mdx @@ -13,7 +13,7 @@ export const Table = (args) => ( - + @@ -119,6 +119,4 @@ Below are all the permited colors. Please consult design before considering addi
General usageGeneral usage
-
-
diff --git a/libs/components/src/stories/compact-mode.mdx b/libs/components/src/stories/compact-mode.mdx index 800bc34cf6a..3cffd45847a 100644 --- a/libs/components/src/stories/compact-mode.mdx +++ b/libs/components/src/stories/compact-mode.mdx @@ -1,4 +1,4 @@ -import { Meta, Story } from "@storybook/addon-docs"; +import { Meta, Story, Canvas } from "@storybook/addon-docs"; import * as itemStories from "../item/item.stories"; import * as popupLayoutStories from "../../../../apps/browser/src/platform/popup/layout/popup-layout.stories"; @@ -42,4 +42,4 @@ However, styling with the Tailwind variant should be used when possible as it is ### [Item](?path=/story/component-library-item--compact-mode) - + diff --git a/libs/components/src/stories/kitchen-sink/components/kitchen-sink-main.component.ts b/libs/components/src/stories/kitchen-sink/components/kitchen-sink-main.component.ts index 9c609300ed1..fd682bd1515 100644 --- a/libs/components/src/stories/kitchen-sink/components/kitchen-sink-main.component.ts +++ b/libs/components/src/stories/kitchen-sink/components/kitchen-sink-main.component.ts @@ -56,12 +56,6 @@ class KitchenSinkDialog { isolated stories. The stories for the Kitchen Sink exist to be tested by the Chromatic UI tests.

- -

- NOTE: These stories will treat "Light & Dark" mode as "Light" mode. This is done to avoid a - bug with the way that we render the same component twice in the same iframe and how that - interacts with the router-outlet. -

diff --git a/libs/components/src/stories/kitchen-sink/kitchen-sink.mdx b/libs/components/src/stories/kitchen-sink/kitchen-sink.mdx index 49493f749ee..34e80081887 100644 --- a/libs/components/src/stories/kitchen-sink/kitchen-sink.mdx +++ b/libs/components/src/stories/kitchen-sink/kitchen-sink.mdx @@ -9,7 +9,3 @@ import * as stories from "./kitchen-sink.stories"; The purpose of this story is to compose together all of our components. When snapshot tests run, we'll be able to spot-check visual changes in a more app-like environment than just the isolated stories. The stories for the Kitchen Sink exist to be tested by the Chromatic UI tests. - -NOTE: These stories will treat "Light & Dark" mode as "Light" mode. This is done to avoid a bug with -the way that we render the same component twice in the same iframe and how that interacts with the -`router-outlet`. diff --git a/libs/components/src/stories/kitchen-sink/kitchen-sink.stories.ts b/libs/components/src/stories/kitchen-sink/kitchen-sink.stories.ts index 62b93984384..af3b082d1c6 100644 --- a/libs/components/src/stories/kitchen-sink/kitchen-sink.stories.ts +++ b/libs/components/src/stories/kitchen-sink/kitchen-sink.stories.ts @@ -17,7 +17,7 @@ import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.servic import { DialogService } from "../../dialog"; import { LayoutComponent } from "../../layout"; import { I18nMockService } from "../../utils/i18n-mock.service"; -import { disableBothThemeDecorator, positionFixedWrapperDecorator } from "../storybook-decorators"; +import { positionFixedWrapperDecorator } from "../storybook-decorators"; import { DialogVirtualScrollBlockComponent } from "./components/dialog-virtual-scroll-block.component"; import { KitchenSinkForm } from "./components/kitchen-sink-form.component"; @@ -31,7 +31,6 @@ export default { component: LayoutComponent, decorators: [ positionFixedWrapperDecorator(), - disableBothThemeDecorator, moduleMetadata({ imports: [ KitchenSinkSharedModule, diff --git a/libs/components/src/stories/storybook-decorators.ts b/libs/components/src/stories/storybook-decorators.ts index d59f2dd1f3e..d1146a7cd96 100644 --- a/libs/components/src/stories/storybook-decorators.ts +++ b/libs/components/src/stories/storybook-decorators.ts @@ -12,20 +12,8 @@ export const positionFixedWrapperDecorator = (wrapper?: (story: string) => strin */ (story) => /* HTML */ `
${wrapper ? wrapper(story) : story}
`, ); - -export const disableBothThemeDecorator = componentWrapperDecorator( - (story) => story, - ({ globals }) => { - /** - * avoid a bug with the way that we render the same component twice in the same iframe and how - * that interacts with the router-outlet - */ - const themeOverride = globals["theme"] === "both" ? "light" : globals["theme"]; - return { theme: themeOverride }; - }, -); diff --git a/libs/components/src/tabs/tabs.mdx b/libs/components/src/tabs/tabs.mdx index 3be98e34257..bab5fbb52c4 100644 --- a/libs/components/src/tabs/tabs.mdx +++ b/libs/components/src/tabs/tabs.mdx @@ -1,6 +1,7 @@ -import { Meta, Story, Primary, Controls } from "@storybook/addon-docs"; +import { Meta, Canvas, Primary, Controls } from "@storybook/addon-docs"; import * as stories from "./tabs.stories"; +import * as dialogStories from "../dialog/dialog/dialog.stories"; @@ -17,17 +18,17 @@ and 1rem of padding on the left and right. ## Content Tabs - + ## Navigation Tabs - + ## Content tabs in dialogs Tabs can be used in dialogs to separate related content. - + ## Accessibility diff --git a/libs/components/src/toast/toast-container.component.html b/libs/components/src/toast/toast-container.component.html new file mode 100644 index 00000000000..8896f7e953d --- /dev/null +++ b/libs/components/src/toast/toast-container.component.html @@ -0,0 +1 @@ +
diff --git a/libs/components/src/toast/toast-container.component.ts b/libs/components/src/toast/toast-container.component.ts new file mode 100644 index 00000000000..1cd33f67ac7 --- /dev/null +++ b/libs/components/src/toast/toast-container.component.ts @@ -0,0 +1,19 @@ +import { Component, OnInit, ViewChild } from "@angular/core"; +import { ToastContainerDirective, ToastrService } from "ngx-toastr"; + +@Component({ + selector: "bit-toast-container", + templateUrl: "toast-container.component.html", + standalone: true, + imports: [ToastContainerDirective], +}) +export class ToastContainerComponent implements OnInit { + @ViewChild(ToastContainerDirective, { static: true }) + toastContainer?: ToastContainerDirective; + + constructor(private toastrService: ToastrService) {} + + ngOnInit(): void { + this.toastrService.overlayContainer = this.toastContainer; + } +} diff --git a/libs/components/src/toast/toast.component.html b/libs/components/src/toast/toast.component.html index d78cc7783aa..bdbc9674184 100644 --- a/libs/components/src/toast/toast.component.html +++ b/libs/components/src/toast/toast.component.html @@ -2,6 +2,7 @@ class="tw-mb-1 tw-min-w-[--bit-toast-width] tw-text-main tw-flex tw-flex-col tw-justify-between tw-rounded-md tw-pointer-events-auto tw-cursor-default tw-overflow-hidden tw-shadow-lg {{ bgColor }}" + [attr.role]="variant === 'error' ? 'alert' : null" >
diff --git a/libs/components/src/toast/toast.mdx b/libs/components/src/toast/toast.mdx index 69b0ddf6a08..d27109b4772 100644 --- a/libs/components/src/toast/toast.mdx +++ b/libs/components/src/toast/toast.mdx @@ -10,21 +10,45 @@ import { ToastService } from "@bitwarden/components"; # Toast - - - -## Stories - -### Default +Toasts are ephemeral notifications. They most often communicate the result of a user action. Due to +their ephemeral nature, long messages and critical alerts should not utilize toasts. -### Long Content - -Avoid using long messages in toasts. - -### Service +## Displaying a toast + +Toasts are triggered via the `ToastService`, which must be called from a frontend Angular context. + +``` +toastService.showToast({ + variant: 'success', + message: 'Hi I'm a toast, +}); +``` + +The following options are accepted: + +| Option | Description | +| --------- | --------------------------------------------- | +| `variant` | `"success" \| "error" \| "info" \| "warning"` | +| `title` | Optional title `string` | +| `message` | Main toast content. Required `string` | + +## Toast container + +`bit-toast-container` should be added to the app root of consuming clients to ensure toasts are +properly announced to screenreaders. + +``` + + +``` + +## Accessibility + +In addition to the accessibility provided by the `bit-toast-container` component, the toast itself +will apply `aria-alert="true"` if the toast is of type `error`. diff --git a/libs/components/src/toast/toast.module.ts b/libs/components/src/toast/toast.module.ts index bf17fde223f..647ccadc4fe 100644 --- a/libs/components/src/toast/toast.module.ts +++ b/libs/components/src/toast/toast.module.ts @@ -1,11 +1,12 @@ import { ModuleWithProviders, NgModule } from "@angular/core"; import { DefaultNoComponentGlobalConfig, GlobalConfig, TOAST_CONFIG } from "ngx-toastr"; +import { ToastContainerComponent } from "./toast-container.component"; import { BitwardenToastrComponent } from "./toastr.component"; @NgModule({ - imports: [BitwardenToastrComponent], - exports: [BitwardenToastrComponent], + imports: [BitwardenToastrComponent, ToastContainerComponent], + exports: [BitwardenToastrComponent, ToastContainerComponent], }) export class ToastModule { static forRoot(config: Partial = {}): ModuleWithProviders { diff --git a/libs/components/src/toast/toast.stories.ts b/libs/components/src/toast/toast.stories.ts index abb737f5c23..0af4974eead 100644 --- a/libs/components/src/toast/toast.stories.ts +++ b/libs/components/src/toast/toast.stories.ts @@ -33,7 +33,7 @@ export default { decorators: [ moduleMetadata({ - imports: [CommonModule, BrowserAnimationsModule, ButtonModule], + imports: [CommonModule, BrowserAnimationsModule, ButtonModule, ToastModule], declarations: [ToastServiceExampleComponent], }), applicationConfig({ @@ -47,6 +47,7 @@ export default { success: "Success", error: "Error", warning: "Warning", + info: "Info", }); }, }, @@ -103,7 +104,9 @@ export const Service: Story = { props: { toastOptions: args, }, - template: ` + template: /*html*/ ` + + `, }), diff --git a/libs/components/src/toast/toastr.component.ts b/libs/components/src/toast/toastr.component.ts index 24209054948..75124ceb4b3 100644 --- a/libs/components/src/toast/toastr.component.ts +++ b/libs/components/src/toast/toastr.component.ts @@ -1,6 +1,6 @@ import { animate, state, style, transition, trigger } from "@angular/animations"; import { Component } from "@angular/core"; -import { Toast as BaseToastrComponent } from "ngx-toastr"; +import { Toast as BaseToastrComponent, ToastPackage, ToastrService } from "ngx-toastr"; import { ToastComponent } from "./toast.component"; @@ -23,8 +23,11 @@ import { ToastComponent } from "./toast.component"; transition("active => removed", animate("{{ easeTime }}ms {{ easing }}")), ]), ], - preserveWhitespaces: false, standalone: true, imports: [ToastComponent], }) -export class BitwardenToastrComponent extends BaseToastrComponent {} +export class BitwardenToastrComponent extends BaseToastrComponent { + constructor(toastrService: ToastrService, toastPackage: ToastPackage) { + super(toastrService, toastPackage); + } +} diff --git a/libs/components/src/toggle-group/toggle-group.component.ts b/libs/components/src/toggle-group/toggle-group.component.ts index 5033a27ed6d..057a594654a 100644 --- a/libs/components/src/toggle-group/toggle-group.component.ts +++ b/libs/components/src/toggle-group/toggle-group.component.ts @@ -12,7 +12,6 @@ let nextId = 0; @Component({ selector: "bit-toggle-group", templateUrl: "./toggle-group.component.html", - preserveWhitespaces: false, standalone: true, }) export class ToggleGroupComponent { diff --git a/libs/components/src/toggle-group/toggle.component.ts b/libs/components/src/toggle-group/toggle.component.ts index 7bd62056763..bb48b7e103e 100644 --- a/libs/components/src/toggle-group/toggle.component.ts +++ b/libs/components/src/toggle-group/toggle.component.ts @@ -19,7 +19,6 @@ let nextId = 0; @Component({ selector: "bit-toggle", templateUrl: "./toggle.component.html", - preserveWhitespaces: false, standalone: true, imports: [NgClass], }) diff --git a/libs/components/src/tw-theme.css b/libs/components/src/tw-theme.css index 0a5a66337ac..90d424d1285 100644 --- a/libs/components/src/tw-theme.css +++ b/libs/components/src/tw-theme.css @@ -194,6 +194,9 @@ --tw-ring-offset-color: #002b36; } +/** Used by CDK a11y services */ +@import "@angular/cdk/a11y-prebuilt.css"; + @import "./popover/popover.component.css"; @import "./search/search.component.css"; diff --git a/libs/components/src/typography/typography.mdx b/libs/components/src/typography/typography.mdx index 11b37bb53b4..d8439481dbc 100644 --- a/libs/components/src/typography/typography.mdx +++ b/libs/components/src/typography/typography.mdx @@ -22,4 +22,4 @@ For headings, note that the semantic element and the text style may not always b

Semantically, I am an h2, but I use h5 styles.

``` - + diff --git a/libs/importer/src/components/import.component.ts b/libs/importer/src/components/import.component.ts index 5b59055bc4e..6ea58545352 100644 --- a/libs/importer/src/components/import.component.ts +++ b/libs/importer/src/components/import.component.ts @@ -15,8 +15,8 @@ import { } from "@angular/core"; import { FormBuilder, ReactiveFormsModule, Validators } from "@angular/forms"; import * as JSZip from "jszip"; -import { concat, Observable, Subject, lastValueFrom, combineLatest, firstValueFrom } from "rxjs"; -import { filter, map, switchMap, takeUntil } from "rxjs/operators"; +import { Observable, Subject, lastValueFrom, combineLatest, firstValueFrom } from "rxjs"; +import { combineLatestWith, filter, map, switchMap, takeUntil } from "rxjs/operators"; import { CollectionService, CollectionView } from "@bitwarden/admin-console/common"; import { JslibModule } from "@bitwarden/angular/jslib.module"; @@ -239,11 +239,10 @@ export class ImportComponent implements OnInit, OnDestroy, AfterViewInit { async ngOnInit() { this.setImportOptions(); - await this.initializeOrganizations(); - if (this.organizationId && (await this.canAccessImport(this.organizationId))) { - this.handleOrganizationImportInit(); + if (this.organizationId) { + await this.handleOrganizationImportInit(); } else { - this.handleImportInit(); + await this.handleImportInit(); } this.formGroup.controls.format.valueChanges @@ -255,7 +254,19 @@ export class ImportComponent implements OnInit, OnDestroy, AfterViewInit { await this.handlePolicies(); } - private handleOrganizationImportInit() { + private async handleOrganizationImportInit() { + const userId = await firstValueFrom(getUserId(this.accountService.activeAccount$)); + this.organizations$ = this.organizationService + .memberOrganizations$(userId) + .pipe( + map((orgs) => + orgs.filter( + (org) => + org.id == this.organizationId && (org.canAccessImport || org.canCreateNewCollections), + ), + ), + ); + this.formGroup.controls.vaultSelector.patchValue(this.organizationId); this.formGroup.controls.vaultSelector.disable(); @@ -268,7 +279,7 @@ export class ImportComponent implements OnInit, OnDestroy, AfterViewInit { this.isFromAC = true; } - private handleImportInit() { + private async handleImportInit() { // Filter out the no folder-item from folderViews$ this.folders$ = this.activeUserId$.pipe( switchMap((userId) => { @@ -279,6 +290,17 @@ export class ImportComponent implements OnInit, OnDestroy, AfterViewInit { this.formGroup.controls.targetSelector.disable(); + // Retrieve all organizations a user is a member of and has collections they can manage + const userId = await firstValueFrom(getUserId(this.accountService.activeAccount$)); + this.organizations$ = this.organizationService.memberOrganizations$(userId).pipe( + combineLatestWith(this.collectionService.decryptedCollections$), + map(([organizations, collections]) => + organizations + .filter((org) => collections.some((c) => c.organizationId === org.id && c.manage)) + .sort(Utils.getSortFunction(this.i18nService, "name")), + ), + ); + combineLatest([this.formGroup.controls.vaultSelector.valueChanges, this.organizations$]) .pipe(takeUntil(this.destroy$)) .subscribe(([value, organizations]) => { @@ -303,18 +325,6 @@ export class ImportComponent implements OnInit, OnDestroy, AfterViewInit { this.formGroup.controls.vaultSelector.setValue("myVault"); } - private async initializeOrganizations() { - const userId = await firstValueFrom(getUserId(this.accountService.activeAccount$)); - this.organizations$ = concat( - this.organizationService.memberOrganizations$(userId).pipe( - // Import is an alternative way to create collections during onboarding, so import from Password Manager - // is available to any user who can create collections in the organization. - map((orgs) => orgs.filter((org) => org.canAccessImport || org.canCreateNewCollections)), - map((orgs) => orgs.sort(Utils.getSortFunction(this.i18nService, "name"))), - ), - ); - } - private async handlePolicies() { combineLatest([ this.policyService.policyAppliesToActiveUser$(PolicyType.PersonalOwnership), diff --git a/libs/importer/spec/base-importer.spec.ts b/libs/importer/src/importers/base-importer.spec.ts similarity index 98% rename from libs/importer/spec/base-importer.spec.ts rename to libs/importer/src/importers/base-importer.spec.ts index f72ceccb538..309bb7ca8c4 100644 --- a/libs/importer/spec/base-importer.spec.ts +++ b/libs/importer/src/importers/base-importer.spec.ts @@ -2,7 +2,7 @@ import { CipherType } from "@bitwarden/common/vault/enums"; import { CardView } from "@bitwarden/common/vault/models/view/card.view"; import { CipherView } from "@bitwarden/common/vault/models/view/cipher.view"; -import { BaseImporter } from "../src/importers/base-importer"; +import { BaseImporter } from "./base-importer"; class FakeBaseImporter extends BaseImporter { initLoginCipher(): CipherView { diff --git a/libs/importer/spec/bitwarden-password-protected-importer.spec.ts b/libs/importer/src/importers/bitwarden/bitwarden-password-protected-importer.spec.ts similarity index 93% rename from libs/importer/spec/bitwarden-password-protected-importer.spec.ts rename to libs/importer/src/importers/bitwarden/bitwarden-password-protected-importer.spec.ts index b355cf9a5d3..66deabf0634 100644 --- a/libs/importer/spec/bitwarden-password-protected-importer.spec.ts +++ b/libs/importer/src/importers/bitwarden/bitwarden-password-protected-importer.spec.ts @@ -8,13 +8,11 @@ import { Utils } from "@bitwarden/common/platform/misc/utils"; import { CipherService } from "@bitwarden/common/vault/abstractions/cipher.service"; import { KdfType, KeyService } from "@bitwarden/key-management"; -import { - BitwardenPasswordProtectedImporter, - BitwardenJsonImporter, -} from "../src/importers/bitwarden"; +import { emptyAccountEncrypted } from "../spec-data/bitwarden-json/account-encrypted.json"; +import { emptyUnencryptedExport } from "../spec-data/bitwarden-json/unencrypted.json"; -import { emptyAccountEncrypted } from "./test-data/bitwarden-json/account-encrypted.json"; -import { emptyUnencryptedExport } from "./test-data/bitwarden-json/unencrypted.json"; +import { BitwardenJsonImporter } from "./bitwarden-json-importer"; +import { BitwardenPasswordProtectedImporter } from "./bitwarden-password-protected-importer"; describe("BitwardenPasswordProtectedImporter", () => { let importer: BitwardenPasswordProtectedImporter; diff --git a/libs/importer/spec/chrome-csv-importer.spec.ts b/libs/importer/src/importers/chrome-csv-importer.spec.ts similarity index 92% rename from libs/importer/spec/chrome-csv-importer.spec.ts rename to libs/importer/src/importers/chrome-csv-importer.spec.ts index dcb39b657d5..d0e82cf44ac 100644 --- a/libs/importer/spec/chrome-csv-importer.spec.ts +++ b/libs/importer/src/importers/chrome-csv-importer.spec.ts @@ -2,10 +2,9 @@ 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 { ChromeCsvImporter } from "../src/importers"; - -import { data as androidData } from "./test-data/chrome-csv/android-data.csv"; -import { data as simplePasswordData } from "./test-data/chrome-csv/simple-password-data.csv"; +import { ChromeCsvImporter } from "./chrome-csv-importer"; +import { data as androidData } from "./spec-data/chrome-csv/android-data.csv"; +import { data as simplePasswordData } from "./spec-data/chrome-csv/simple-password-data.csv"; const CipherData = [ { diff --git a/libs/importer/spec/dashlane-csv-importer.spec.ts b/libs/importer/src/importers/dashlane/dashlane-csv-importer.spec.ts similarity index 96% rename from libs/importer/spec/dashlane-csv-importer.spec.ts rename to libs/importer/src/importers/dashlane/dashlane-csv-importer.spec.ts index 1d76396022c..b8d84a9378a 100644 --- a/libs/importer/spec/dashlane-csv-importer.spec.ts +++ b/libs/importer/src/importers/dashlane/dashlane-csv-importer.spec.ts @@ -1,14 +1,13 @@ import { CipherType } from "@bitwarden/common/vault/enums"; -import { DashlaneCsvImporter } from "../src/importers"; - -import { credentialsData_otpUrl } from "./test-data/dashlane-csv/credentials-otpurl.csv"; -import { credentialsData } from "./test-data/dashlane-csv/credentials.csv"; -import { identityData } from "./test-data/dashlane-csv/id.csv"; -import { multiplePersonalInfoData } from "./test-data/dashlane-csv/multiple-personal-info.csv"; -import { paymentsData } from "./test-data/dashlane-csv/payments.csv"; -import { personalInfoData } from "./test-data/dashlane-csv/personal-info.csv"; -import { secureNoteData } from "./test-data/dashlane-csv/securenotes.csv"; +import { DashlaneCsvImporter } from ".."; +import { credentialsData_otpUrl } from "../spec-data/dashlane-csv/credentials-otpurl.csv"; +import { credentialsData } from "../spec-data/dashlane-csv/credentials.csv"; +import { identityData } from "../spec-data/dashlane-csv/id.csv"; +import { multiplePersonalInfoData } from "../spec-data/dashlane-csv/multiple-personal-info.csv"; +import { paymentsData } from "../spec-data/dashlane-csv/payments.csv"; +import { personalInfoData } from "../spec-data/dashlane-csv/personal-info.csv"; +import { secureNoteData } from "../spec-data/dashlane-csv/securenotes.csv"; describe("Dashlane CSV Importer", () => { let importer: DashlaneCsvImporter; diff --git a/libs/importer/spec/enpass-json-importer.spec.ts b/libs/importer/src/importers/enpass/enpass-json-importer.spec.ts similarity index 93% rename from libs/importer/spec/enpass-json-importer.spec.ts rename to libs/importer/src/importers/enpass/enpass-json-importer.spec.ts index 75e668f28be..b0cb5f71524 100644 --- a/libs/importer/spec/enpass-json-importer.spec.ts +++ b/libs/importer/src/importers/enpass/enpass-json-importer.spec.ts @@ -1,13 +1,13 @@ import { CipherType } from "@bitwarden/common/vault/enums"; import { FieldView } from "@bitwarden/common/vault/models/view/field.view"; -import { EnpassJsonImporter } from "../src/importers"; +import { creditCard } from "../spec-data/enpass-json/credit-card"; +import { folders } from "../spec-data/enpass-json/folders"; +import { login } from "../spec-data/enpass-json/login"; +import { loginAndroidUrl } from "../spec-data/enpass-json/login-android-url"; +import { note } from "../spec-data/enpass-json/note"; -import { creditCard } from "./test-data/enpass-json/credit-card"; -import { folders } from "./test-data/enpass-json/folders"; -import { login } from "./test-data/enpass-json/login"; -import { loginAndroidUrl } from "./test-data/enpass-json/login-android-url"; -import { note } from "./test-data/enpass-json/note"; +import { EnpassJsonImporter } from "./enpass-json-importer"; function validateCustomField(fields: FieldView[], fieldName: string, expectedValue: any) { expect(fields).toBeDefined(); diff --git a/libs/importer/spec/firefox-csv-importer.spec.ts b/libs/importer/src/importers/firefox-csv-importer.spec.ts similarity index 91% rename from libs/importer/spec/firefox-csv-importer.spec.ts rename to libs/importer/src/importers/firefox-csv-importer.spec.ts index 0add655a684..78bca0599b5 100644 --- a/libs/importer/spec/firefox-csv-importer.spec.ts +++ b/libs/importer/src/importers/firefox-csv-importer.spec.ts @@ -2,10 +2,9 @@ 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 { FirefoxCsvImporter } from "../src/importers"; - -import { data as firefoxAccountsData } from "./test-data/firefox-csv/firefox-accounts-data.csv"; -import { data as simplePasswordData } from "./test-data/firefox-csv/simple-password-data.csv"; +import { FirefoxCsvImporter } from "./firefox-csv-importer"; +import { data as firefoxAccountsData } from "./spec-data/firefox-csv/firefox-accounts-data.csv"; +import { data as simplePasswordData } from "./spec-data/firefox-csv/simple-password-data.csv"; const CipherData = [ { diff --git a/libs/importer/src/importers/index.ts b/libs/importer/src/importers/index.ts index 1ba3a0d9eb8..c9b4c4c9c19 100644 --- a/libs/importer/src/importers/index.ts +++ b/libs/importer/src/importers/index.ts @@ -22,7 +22,7 @@ export { KasperskyTxtImporter } from "./kaspersky-txt-importer"; export { KeePass2XmlImporter } from "./keepass2-xml-importer"; export { KeePassXCsvImporter } from "./keepassx-csv-importer"; export { KeeperCsvImporter, KeeperJsonImporter } from "./keeper"; -export { LastPassCsvImporter } from "./lastpass-csv-importer"; +export { LastPassCsvImporter } from "./lastpass"; export { LogMeOnceCsvImporter } from "./logmeonce-csv-importer"; export { MeldiumCsvImporter } from "./meldium-csv-importer"; export { MSecureCsvImporter } from "./msecure-csv-importer"; diff --git a/libs/importer/spec/keepass2-xml-importer.spec.ts b/libs/importer/src/importers/keepass2-xml-importer.spec.ts similarity index 92% rename from libs/importer/spec/keepass2-xml-importer.spec.ts rename to libs/importer/src/importers/keepass2-xml-importer.spec.ts index 4f02bf9260b..8fbb021883c 100644 --- a/libs/importer/spec/keepass2-xml-importer.spec.ts +++ b/libs/importer/src/importers/keepass2-xml-importer.spec.ts @@ -1,12 +1,11 @@ import { FolderView } from "@bitwarden/common/vault/models/view/folder.view"; -import { KeePass2XmlImporter } from "../src/importers"; - +import { KeePass2XmlImporter } from "./keepass2-xml-importer"; import { TestData, TestData1, TestData2, -} from "./test-data/keepass2-xml/keepass2-xml-importer-testdata"; +} from "./spec-data/keepass2-xml/keepass2-xml-importer-testdata"; describe("KeePass2 Xml Importer", () => { it("should parse XML data", async () => { diff --git a/libs/importer/spec/keepassx-csv-importer.spec.ts b/libs/importer/src/importers/keepassx-csv-importer.spec.ts similarity index 92% rename from libs/importer/spec/keepassx-csv-importer.spec.ts rename to libs/importer/src/importers/keepassx-csv-importer.spec.ts index 0b3d729d9de..e0b8a6cff5d 100644 --- a/libs/importer/spec/keepassx-csv-importer.spec.ts +++ b/libs/importer/src/importers/keepassx-csv-importer.spec.ts @@ -1,6 +1,5 @@ -import { KeePassXCsvImporter } from "../src/importers"; - -import { keepassxTestData } from "./test-data/keepassx-csv/testdata.csv"; +import { KeePassXCsvImporter } from "./keepassx-csv-importer"; +import { keepassxTestData } from "./spec-data/keepassx-csv/testdata.csv"; describe("KeePassX CSV Importer", () => { let importer: KeePassXCsvImporter; diff --git a/libs/importer/spec/keeper-csv-importer.spec.ts b/libs/importer/src/importers/keeper/keeper-csv-importer.spec.ts similarity index 97% rename from libs/importer/spec/keeper-csv-importer.spec.ts rename to libs/importer/src/importers/keeper/keeper-csv-importer.spec.ts index f466a766ccb..69655eb9177 100644 --- a/libs/importer/spec/keeper-csv-importer.spec.ts +++ b/libs/importer/src/importers/keeper/keeper-csv-importer.spec.ts @@ -1,8 +1,8 @@ import { Utils } from "@bitwarden/common/platform/misc/utils"; -import { KeeperCsvImporter } from "../src/importers"; +import { testData as TestData } from "../spec-data/keeper-csv/testdata.csv"; -import { testData as TestData } from "./test-data/keeper-csv/testdata.csv"; +import { KeeperCsvImporter } from "./keeper-csv-importer"; describe("Keeper CSV Importer", () => { let importer: KeeperCsvImporter; diff --git a/libs/importer/spec/keeper-json-importer.spec.ts b/libs/importer/src/importers/keeper/keeper-json-importer.spec.ts similarity index 96% rename from libs/importer/spec/keeper-json-importer.spec.ts rename to libs/importer/src/importers/keeper/keeper-json-importer.spec.ts index 37dfadc304b..31169021e0c 100644 --- a/libs/importer/spec/keeper-json-importer.spec.ts +++ b/libs/importer/src/importers/keeper/keeper-json-importer.spec.ts @@ -1,8 +1,8 @@ import { Utils } from "@bitwarden/common/platform/misc/utils"; -import { KeeperJsonImporter } from "../src/importers"; +import { testData as TestData } from "../spec-data/keeper-json/testdata.json"; -import { testData as TestData } from "./test-data/keeper-json/testdata.json"; +import { KeeperJsonImporter } from "./keeper-json-importer"; describe("Keeper Json Importer", () => { const testDataJson = JSON.stringify(TestData); diff --git a/libs/importer/src/importers/lastpass/index.ts b/libs/importer/src/importers/lastpass/index.ts new file mode 100644 index 00000000000..0949fdea1b6 --- /dev/null +++ b/libs/importer/src/importers/lastpass/index.ts @@ -0,0 +1 @@ +export { LastPassCsvImporter } from "./lastpass-csv-importer"; diff --git a/libs/importer/spec/lastpass-csv-importer.spec.ts b/libs/importer/src/importers/lastpass/lastpass-csv-importer.spec.ts similarity index 97% rename from libs/importer/spec/lastpass-csv-importer.spec.ts rename to libs/importer/src/importers/lastpass/lastpass-csv-importer.spec.ts index de43c4aa473..cabd246fa7e 100644 --- a/libs/importer/spec/lastpass-csv-importer.spec.ts +++ b/libs/importer/src/importers/lastpass/lastpass-csv-importer.spec.ts @@ -2,8 +2,9 @@ import { FieldType, CipherType } from "@bitwarden/common/vault/enums"; import { CipherView } from "@bitwarden/common/vault/models/view/cipher.view"; import { FieldView } from "@bitwarden/common/vault/models/view/field.view"; -import { LastPassCsvImporter } from "../src/importers"; -import { ImportResult } from "../src/models/import-result"; +import { ImportResult } from "../../models/import-result"; + +import { LastPassCsvImporter } from "./lastpass-csv-importer"; function baseExcept(result: ImportResult) { expect(result).not.toBeNull(); diff --git a/libs/importer/src/importers/lastpass-csv-importer.ts b/libs/importer/src/importers/lastpass/lastpass-csv-importer.ts similarity index 98% rename from libs/importer/src/importers/lastpass-csv-importer.ts rename to libs/importer/src/importers/lastpass/lastpass-csv-importer.ts index 50a5b46239d..8f239ec6830 100644 --- a/libs/importer/src/importers/lastpass-csv-importer.ts +++ b/libs/importer/src/importers/lastpass/lastpass-csv-importer.ts @@ -8,10 +8,9 @@ import { IdentityView } from "@bitwarden/common/vault/models/view/identity.view" import { LoginView } from "@bitwarden/common/vault/models/view/login.view"; import { SecureNoteView } from "@bitwarden/common/vault/models/view/secure-note.view"; -import { ImportResult } from "../models/import-result"; - -import { BaseImporter } from "./base-importer"; -import { Importer } from "./importer"; +import { ImportResult } from "../../models/import-result"; +import { BaseImporter } from "../base-importer"; +import { Importer } from "../importer"; export class LastPassCsvImporter extends BaseImporter implements Importer { parse(data: string): Promise { diff --git a/libs/importer/spec/msecure-csv-importer.spec.ts b/libs/importer/src/importers/msecure-csv-importer.spec.ts similarity index 98% rename from libs/importer/spec/msecure-csv-importer.spec.ts rename to libs/importer/src/importers/msecure-csv-importer.spec.ts index 903be3bcb18..83e35802fac 100644 --- a/libs/importer/spec/msecure-csv-importer.spec.ts +++ b/libs/importer/src/importers/msecure-csv-importer.spec.ts @@ -1,6 +1,6 @@ import { CipherType } from "@bitwarden/common/vault/enums"; -import { MSecureCsvImporter } from "../src/importers/msecure-csv-importer"; +import { MSecureCsvImporter } from "./msecure-csv-importer"; describe("MSecureCsvImporter.parse", () => { let importer: MSecureCsvImporter; diff --git a/libs/importer/spec/myki-csv-importer.spec.ts b/libs/importer/src/importers/myki-csv-importer.spec.ts similarity index 98% rename from libs/importer/spec/myki-csv-importer.spec.ts rename to libs/importer/src/importers/myki-csv-importer.spec.ts index e1e36478a6a..6f804523ef0 100644 --- a/libs/importer/spec/myki-csv-importer.spec.ts +++ b/libs/importer/src/importers/myki-csv-importer.spec.ts @@ -1,14 +1,13 @@ import { CipherType } from "@bitwarden/common/vault/enums"; import { CipherView } from "@bitwarden/common/vault/models/view/cipher.view"; -import { MykiCsvImporter } from "../src/importers"; - -import { userAccountData } from "./test-data/myki-csv/user-account.csv"; -import { userCreditCardData } from "./test-data/myki-csv/user-credit-card.csv"; -import { userIdCardData } from "./test-data/myki-csv/user-id-card.csv"; -import { userIdentityData } from "./test-data/myki-csv/user-identity.csv"; -import { userNoteData } from "./test-data/myki-csv/user-note.csv"; -import { userTwoFaData } from "./test-data/myki-csv/user-twofa.csv"; +import { MykiCsvImporter } from "./myki-csv-importer"; +import { userAccountData } from "./spec-data/myki-csv/user-account.csv"; +import { userCreditCardData } from "./spec-data/myki-csv/user-credit-card.csv"; +import { userIdCardData } from "./spec-data/myki-csv/user-id-card.csv"; +import { userIdentityData } from "./spec-data/myki-csv/user-identity.csv"; +import { userNoteData } from "./spec-data/myki-csv/user-note.csv"; +import { userTwoFaData } from "./spec-data/myki-csv/user-twofa.csv"; function expectDriversLicense(cipher: CipherView) { expect(cipher.type).toBe(CipherType.Identity); diff --git a/libs/importer/spec/netwrix-passwordsecure-csv-importer.spec.ts b/libs/importer/src/importers/netwrix/netwrix-passwordsecure-csv-importer.spec.ts similarity index 95% rename from libs/importer/spec/netwrix-passwordsecure-csv-importer.spec.ts rename to libs/importer/src/importers/netwrix/netwrix-passwordsecure-csv-importer.spec.ts index ab893dbc56c..ff327daf04d 100644 --- a/libs/importer/spec/netwrix-passwordsecure-csv-importer.spec.ts +++ b/libs/importer/src/importers/netwrix/netwrix-passwordsecure-csv-importer.spec.ts @@ -1,8 +1,8 @@ import { Utils } from "@bitwarden/common/platform/misc/utils"; -import { NetwrixPasswordSecureCsvImporter } from "../src/importers"; +import { credentialsData } from "../spec-data/netwrix-csv/login-export.csv"; -import { credentialsData } from "./test-data/netwrix-csv/login-export.csv"; +import { NetwrixPasswordSecureCsvImporter } from "./netwrix-passwordsecure-csv-importer"; describe("Netwrix Password Secure CSV Importer", () => { let importer: NetwrixPasswordSecureCsvImporter; diff --git a/libs/importer/spec/nordpass-csv-importer.spec.ts b/libs/importer/src/importers/nordpass-csv-importer.spec.ts similarity index 95% rename from libs/importer/spec/nordpass-csv-importer.spec.ts rename to libs/importer/src/importers/nordpass-csv-importer.spec.ts index a7bbf0fc79c..cadc7bca28c 100644 --- a/libs/importer/spec/nordpass-csv-importer.spec.ts +++ b/libs/importer/src/importers/nordpass-csv-importer.spec.ts @@ -3,13 +3,12 @@ import { SecureNoteType, CipherType, FieldType } from "@bitwarden/common/vault/e import { CipherView } from "@bitwarden/common/vault/models/view/cipher.view"; import { IdentityView } from "@bitwarden/common/vault/models/view/identity.view"; -import { NordPassCsvImporter } from "../src/importers"; - -import { data as creditCardData } from "./test-data/nordpass-csv/nordpass.card.csv"; -import { data as identityData } from "./test-data/nordpass-csv/nordpass.identity.csv"; -import { data as loginDataWithAdditionalUrls } from "./test-data/nordpass-csv/nordpass.login-with-additinal-urls.csv"; -import { data as loginData } from "./test-data/nordpass-csv/nordpass.login.csv"; -import { data as secureNoteData } from "./test-data/nordpass-csv/nordpass.secure-note.csv"; +import { NordPassCsvImporter } from "./nordpass-csv-importer"; +import { data as creditCardData } from "./spec-data/nordpass-csv/nordpass.card.csv"; +import { data as identityData } from "./spec-data/nordpass-csv/nordpass.identity.csv"; +import { data as loginDataWithAdditionalUrls } from "./spec-data/nordpass-csv/nordpass.login-with-additinal-urls.csv"; +import { data as loginData } from "./spec-data/nordpass-csv/nordpass.login.csv"; +import { data as secureNoteData } from "./spec-data/nordpass-csv/nordpass.secure-note.csv"; const namesTestData = [ { diff --git a/libs/importer/spec/onepassword-1pif-importer.spec.ts b/libs/importer/src/importers/onepassword/onepassword-1pif-importer.spec.ts similarity index 99% rename from libs/importer/spec/onepassword-1pif-importer.spec.ts rename to libs/importer/src/importers/onepassword/onepassword-1pif-importer.spec.ts index fbf79ec8e0b..deaf2c904b2 100644 --- a/libs/importer/spec/onepassword-1pif-importer.spec.ts +++ b/libs/importer/src/importers/onepassword/onepassword-1pif-importer.spec.ts @@ -1,6 +1,6 @@ import { FieldType } from "@bitwarden/common/vault/enums"; -import { OnePassword1PifImporter } from "../src/importers"; +import { OnePassword1PifImporter } from "./onepassword-1pif-importer"; const TestData: string = "***aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee***\n" + diff --git a/libs/importer/spec/onepassword-1pux-importer.spec.ts b/libs/importer/src/importers/onepassword/onepassword-1pux-importer.spec.ts similarity index 93% rename from libs/importer/spec/onepassword-1pux-importer.spec.ts rename to libs/importer/src/importers/onepassword/onepassword-1pux-importer.spec.ts index 93de4be606b..d4976f7a198 100644 --- a/libs/importer/spec/onepassword-1pux-importer.spec.ts +++ b/libs/importer/src/importers/onepassword/onepassword-1pux-importer.spec.ts @@ -2,32 +2,32 @@ import { Utils } from "@bitwarden/common/platform/misc/utils"; import { FieldType, SecureNoteType, CipherType } from "@bitwarden/common/vault/enums"; import { FieldView } from "@bitwarden/common/vault/models/view/field.view"; -import { OnePassword1PuxImporter } from "../src/importers"; +import { APICredentialsData } from "../spec-data/onepassword-1pux/api-credentials"; +import { BankAccountData } from "../spec-data/onepassword-1pux/bank-account"; +import { CreditCardData } from "../spec-data/onepassword-1pux/credit-card"; +import { DatabaseData } from "../spec-data/onepassword-1pux/database"; +import { DriversLicenseData } from "../spec-data/onepassword-1pux/drivers-license"; +import { EmailAccountData } from "../spec-data/onepassword-1pux/email-account"; +import { EmailFieldData } from "../spec-data/onepassword-1pux/email-field"; +import { EmailFieldOnIdentityData } from "../spec-data/onepassword-1pux/email-field-on-identity"; +import { EmailFieldOnIdentityPrefilledData } from "../spec-data/onepassword-1pux/email-field-on-identity_prefilled"; +import { IdentityData } from "../spec-data/onepassword-1pux/identity-data"; +import { LoginData } from "../spec-data/onepassword-1pux/login-data"; +import { MedicalRecordData } from "../spec-data/onepassword-1pux/medical-record"; +import { MembershipData } from "../spec-data/onepassword-1pux/membership"; +import { OnePuxExampleFile } from "../spec-data/onepassword-1pux/onepux_example"; +import { OutdoorLicenseData } from "../spec-data/onepassword-1pux/outdoor-license"; +import { PassportData } from "../spec-data/onepassword-1pux/passport"; +import { PasswordData } from "../spec-data/onepassword-1pux/password"; +import { RewardsProgramData } from "../spec-data/onepassword-1pux/rewards-program"; +import { SanitizedExport } from "../spec-data/onepassword-1pux/sanitized-export"; +import { SecureNoteData } from "../spec-data/onepassword-1pux/secure-note"; +import { ServerData } from "../spec-data/onepassword-1pux/server"; +import { SoftwareLicenseData } from "../spec-data/onepassword-1pux/software-license"; +import { SSNData } from "../spec-data/onepassword-1pux/ssn"; +import { WirelessRouterData } from "../spec-data/onepassword-1pux/wireless-router"; -import { APICredentialsData } from "./test-data/onepassword-1pux/api-credentials"; -import { BankAccountData } from "./test-data/onepassword-1pux/bank-account"; -import { CreditCardData } from "./test-data/onepassword-1pux/credit-card"; -import { DatabaseData } from "./test-data/onepassword-1pux/database"; -import { DriversLicenseData } from "./test-data/onepassword-1pux/drivers-license"; -import { EmailAccountData } from "./test-data/onepassword-1pux/email-account"; -import { EmailFieldData } from "./test-data/onepassword-1pux/email-field"; -import { EmailFieldOnIdentityData } from "./test-data/onepassword-1pux/email-field-on-identity"; -import { EmailFieldOnIdentityPrefilledData } from "./test-data/onepassword-1pux/email-field-on-identity_prefilled"; -import { IdentityData } from "./test-data/onepassword-1pux/identity-data"; -import { LoginData } from "./test-data/onepassword-1pux/login-data"; -import { MedicalRecordData } from "./test-data/onepassword-1pux/medical-record"; -import { MembershipData } from "./test-data/onepassword-1pux/membership"; -import { OnePuxExampleFile } from "./test-data/onepassword-1pux/onepux_example"; -import { OutdoorLicenseData } from "./test-data/onepassword-1pux/outdoor-license"; -import { PassportData } from "./test-data/onepassword-1pux/passport"; -import { PasswordData } from "./test-data/onepassword-1pux/password"; -import { RewardsProgramData } from "./test-data/onepassword-1pux/rewards-program"; -import { SanitizedExport } from "./test-data/onepassword-1pux/sanitized-export"; -import { SecureNoteData } from "./test-data/onepassword-1pux/secure-note"; -import { ServerData } from "./test-data/onepassword-1pux/server"; -import { SoftwareLicenseData } from "./test-data/onepassword-1pux/software-license"; -import { SSNData } from "./test-data/onepassword-1pux/ssn"; -import { WirelessRouterData } from "./test-data/onepassword-1pux/wireless-router"; +import { OnePassword1PuxImporter } from "./onepassword-1pux-importer"; function validateCustomField(fields: FieldView[], fieldName: string, expectedValue: any) { expect(fields).toBeDefined(); diff --git a/libs/importer/spec/onepassword-mac-csv-importer.spec.ts b/libs/importer/src/importers/onepassword/onepassword-mac-csv-importer.spec.ts similarity index 85% rename from libs/importer/spec/onepassword-mac-csv-importer.spec.ts rename to libs/importer/src/importers/onepassword/onepassword-mac-csv-importer.spec.ts index f96d254f4b9..8a4eeae158a 100644 --- a/libs/importer/spec/onepassword-mac-csv-importer.spec.ts +++ b/libs/importer/src/importers/onepassword/onepassword-mac-csv-importer.spec.ts @@ -1,11 +1,11 @@ import { CipherType } from "@bitwarden/common/vault/enums"; import { CipherView } from "@bitwarden/common/vault/models/view/cipher.view"; -import { OnePasswordMacCsvImporter } from "../src/importers"; +import { data as creditCardData } from "../spec-data/onepassword-csv/credit-card.mac.csv"; +import { data as identityData } from "../spec-data/onepassword-csv/identity.mac.csv"; +import { data as multiTypeData } from "../spec-data/onepassword-csv/multiple-items.mac.csv"; -import { data as creditCardData } from "./test-data/onepassword-csv/credit-card.mac.csv"; -import { data as identityData } from "./test-data/onepassword-csv/identity.mac.csv"; -import { data as multiTypeData } from "./test-data/onepassword-csv/multiple-items.mac.csv"; +import { OnePasswordMacCsvImporter } from "./onepassword-mac-csv-importer"; function expectIdentity(cipher: CipherView) { expect(cipher.type).toBe(CipherType.Identity); diff --git a/libs/importer/spec/onepassword-win-csv-importer.spec.ts b/libs/importer/src/importers/onepassword/onepassword-win-csv-importer.spec.ts similarity index 86% rename from libs/importer/spec/onepassword-win-csv-importer.spec.ts rename to libs/importer/src/importers/onepassword/onepassword-win-csv-importer.spec.ts index 0e7fac351e7..0e63fe69831 100644 --- a/libs/importer/spec/onepassword-win-csv-importer.spec.ts +++ b/libs/importer/src/importers/onepassword/onepassword-win-csv-importer.spec.ts @@ -2,11 +2,11 @@ import { FieldType, CipherType } from "@bitwarden/common/vault/enums"; import { CipherView } from "@bitwarden/common/vault/models/view/cipher.view"; import { FieldView } from "@bitwarden/common/vault/models/view/field.view"; -import { OnePasswordWinCsvImporter } from "../src/importers"; +import { data as creditCardData } from "../spec-data/onepassword-csv/credit-card.windows.csv"; +import { data as identityData } from "../spec-data/onepassword-csv/identity.windows.csv"; +import { data as multiTypeData } from "../spec-data/onepassword-csv/multiple-items.windows.csv"; -import { data as creditCardData } from "./test-data/onepassword-csv/credit-card.windows.csv"; -import { data as identityData } from "./test-data/onepassword-csv/identity.windows.csv"; -import { data as multiTypeData } from "./test-data/onepassword-csv/multiple-items.windows.csv"; +import { OnePasswordWinCsvImporter } from "./onepassword-win-csv-importer"; function expectIdentity(cipher: CipherView) { expect(cipher.type).toBe(CipherType.Identity); diff --git a/libs/importer/src/importers/onepassword/types/onepassword-1pux-importer-types.ts b/libs/importer/src/importers/onepassword/types/onepassword-1pux-importer-types.ts index 353fcf1337e..63a0427b2c7 100644 --- a/libs/importer/src/importers/onepassword/types/onepassword-1pux-importer-types.ts +++ b/libs/importer/src/importers/onepassword/types/onepassword-1pux-importer-types.ts @@ -120,7 +120,7 @@ export interface Value { export interface Email { email_address: string; - provider: string; + provider: string | null; } export interface Address { diff --git a/libs/importer/spec/passky-json-importer.spec.ts b/libs/importer/src/importers/passky/passky-json-importer.spec.ts similarity index 81% rename from libs/importer/spec/passky-json-importer.spec.ts rename to libs/importer/src/importers/passky/passky-json-importer.spec.ts index ddec76876d8..33be2dfac87 100644 --- a/libs/importer/spec/passky-json-importer.spec.ts +++ b/libs/importer/src/importers/passky/passky-json-importer.spec.ts @@ -1,7 +1,7 @@ -import { PasskyJsonImporter } from "../src/importers"; +import { testData as EncryptedData } from "../spec-data/passky-json/passky-encrypted.json"; +import { testData as UnencryptedData } from "../spec-data/passky-json/passky-unencrypted.json"; -import { testData as EncryptedData } from "./test-data/passky-json/passky-encrypted.json"; -import { testData as UnencryptedData } from "./test-data/passky-json/passky-unencrypted.json"; +import { PasskyJsonImporter } from "./passky-json-importer"; describe("Passky Json Importer", () => { let importer: PasskyJsonImporter; diff --git a/libs/importer/spec/passwordxp-csv-importer.spec.ts b/libs/importer/src/importers/passsordxp/passwordxp-csv-importer.spec.ts similarity index 92% rename from libs/importer/spec/passwordxp-csv-importer.spec.ts rename to libs/importer/src/importers/passsordxp/passwordxp-csv-importer.spec.ts index fda323450c6..1bcc79723ab 100644 --- a/libs/importer/spec/passwordxp-csv-importer.spec.ts +++ b/libs/importer/src/importers/passsordxp/passwordxp-csv-importer.spec.ts @@ -1,13 +1,13 @@ import { CipherType } from "@bitwarden/common/vault/enums"; -import { PasswordXPCsvImporter } from "../src/importers"; -import { ImportResult } from "../src/models/import-result"; +import { ImportResult } from "../../models/import-result"; +import { dutchHeaders } from "../spec-data/passwordxp-csv/dutch-headers"; +import { germanHeaders } from "../spec-data/passwordxp-csv/german-headers"; +import { noFolder } from "../spec-data/passwordxp-csv/no-folder.csv"; +import { withFolders } from "../spec-data/passwordxp-csv/passwordxp-with-folders.csv"; +import { withoutFolders } from "../spec-data/passwordxp-csv/passwordxp-without-folders.csv"; -import { dutchHeaders } from "./test-data/passwordxp-csv/dutch-headers"; -import { germanHeaders } from "./test-data/passwordxp-csv/german-headers"; -import { noFolder } from "./test-data/passwordxp-csv/no-folder.csv"; -import { withFolders } from "./test-data/passwordxp-csv/passwordxp-with-folders.csv"; -import { withoutFolders } from "./test-data/passwordxp-csv/passwordxp-without-folders.csv"; +import { PasswordXPCsvImporter } from "./passwordxp-csv-importer"; async function importLoginWithCustomFields(importer: PasswordXPCsvImporter, csvData: string) { const result: ImportResult = await importer.parse(csvData); diff --git a/libs/importer/spec/protonpass-json-importer.spec.ts b/libs/importer/src/importers/protonpass/protonpass-json-importer.spec.ts similarity index 98% rename from libs/importer/spec/protonpass-json-importer.spec.ts rename to libs/importer/src/importers/protonpass/protonpass-json-importer.spec.ts index 39a09127c27..b8550bcb191 100644 --- a/libs/importer/spec/protonpass-json-importer.spec.ts +++ b/libs/importer/src/importers/protonpass/protonpass-json-importer.spec.ts @@ -4,9 +4,9 @@ import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.servic import { Utils } from "@bitwarden/common/platform/misc/utils"; import { FieldType, CipherType } from "@bitwarden/common/vault/enums"; -import { ProtonPassJsonImporter } from "../src/importers"; +import { testData } from "../spec-data/protonpass-json/protonpass.json"; -import { testData } from "./test-data/protonpass-json/protonpass.json"; +import { ProtonPassJsonImporter } from "./protonpass-json-importer"; describe("Protonpass Json Importer", () => { let importer: ProtonPassJsonImporter; diff --git a/libs/importer/spec/psono-json-importer.spec.ts b/libs/importer/src/importers/psono/psono-json-importer.spec.ts similarity index 96% rename from libs/importer/spec/psono-json-importer.spec.ts rename to libs/importer/src/importers/psono/psono-json-importer.spec.ts index 82795e5ea5d..3b4fcf67a30 100644 --- a/libs/importer/spec/psono-json-importer.spec.ts +++ b/libs/importer/src/importers/psono/psono-json-importer.spec.ts @@ -1,19 +1,19 @@ import { FieldType, CipherType } from "@bitwarden/common/vault/enums"; import { FieldView } from "@bitwarden/common/vault/models/view/field.view"; -import { PsonoJsonImporter } from "../src/importers"; +import { ApplicationPasswordsData } from "../spec-data/psono-json/application-passwords"; +import { BookmarkData } from "../spec-data/psono-json/bookmark.json"; +import { EmptyTestFolderData } from "../spec-data/psono-json/empty-folders"; +import { EnvVariablesData } from "../spec-data/psono-json/environment-variables"; +import { FoldersTestData } from "../spec-data/psono-json/folders"; +import { GPGData } from "../spec-data/psono-json/gpg"; +import { NotesData } from "../spec-data/psono-json/notes"; +import { ReducedWebsiteLoginsData } from "../spec-data/psono-json/reduced-website-logins"; +import { SubFoldersTestData } from "../spec-data/psono-json/subfolders"; +import { TOTPData } from "../spec-data/psono-json/totp"; +import { WebsiteLoginsData } from "../spec-data/psono-json/website-logins"; -import { ApplicationPasswordsData } from "./test-data/psono-json/application-passwords"; -import { BookmarkData } from "./test-data/psono-json/bookmark.json"; -import { EmptyTestFolderData } from "./test-data/psono-json/empty-folders"; -import { EnvVariablesData } from "./test-data/psono-json/environment-variables"; -import { FoldersTestData } from "./test-data/psono-json/folders"; -import { GPGData } from "./test-data/psono-json/gpg"; -import { NotesData } from "./test-data/psono-json/notes"; -import { ReducedWebsiteLoginsData } from "./test-data/psono-json/reduced-website-logins"; -import { SubFoldersTestData } from "./test-data/psono-json/subfolders"; -import { TOTPData } from "./test-data/psono-json/totp"; -import { WebsiteLoginsData } from "./test-data/psono-json/website-logins"; +import { PsonoJsonImporter } from "./psono-json-importer"; function validateCustomField( fields: FieldView[], diff --git a/libs/importer/spec/roboform-csv-importer.spec.ts b/libs/importer/src/importers/roboform-csv-importer.spec.ts similarity index 82% rename from libs/importer/spec/roboform-csv-importer.spec.ts rename to libs/importer/src/importers/roboform-csv-importer.spec.ts index 9ec63aadfbc..2779a9ddb64 100644 --- a/libs/importer/spec/roboform-csv-importer.spec.ts +++ b/libs/importer/src/importers/roboform-csv-importer.spec.ts @@ -1,8 +1,8 @@ -import { CipherType } from "../../common/src/vault/enums/cipher-type"; -import { RoboFormCsvImporter } from "../src/importers"; +import { CipherType } from "@bitwarden/common/vault/enums"; -import { data as dataNoFolder } from "./test-data/roboform-csv/empty-folders"; -import { data as dataFolder } from "./test-data/roboform-csv/with-folders"; +import { RoboFormCsvImporter } from "./roboform-csv-importer"; +import { data as dataNoFolder } from "./spec-data/roboform-csv/empty-folders"; +import { data as dataFolder } from "./spec-data/roboform-csv/with-folders"; describe("Roboform CSV Importer", () => { it("should parse CSV data", async () => { diff --git a/libs/importer/spec/safari-csv-importer.spec.ts b/libs/importer/src/importers/safari-csv-importer.spec.ts similarity index 92% rename from libs/importer/spec/safari-csv-importer.spec.ts rename to libs/importer/src/importers/safari-csv-importer.spec.ts index 4a22eb0bdc4..4ca8df23f34 100644 --- a/libs/importer/spec/safari-csv-importer.spec.ts +++ b/libs/importer/src/importers/safari-csv-importer.spec.ts @@ -2,10 +2,9 @@ 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 { SafariCsvImporter } from "../src/importers"; - -import { data as oldSimplePasswordData } from "./test-data/safari-csv/old-simple-password-data.csv"; -import { data as simplePasswordData } from "./test-data/safari-csv/simple-password-data.csv"; +import { SafariCsvImporter } from "./safari-csv-importer"; +import { data as oldSimplePasswordData } from "./spec-data/safari-csv/old-simple-password-data.csv"; +import { data as simplePasswordData } from "./spec-data/safari-csv/simple-password-data.csv"; const CipherData = [ { diff --git a/libs/importer/spec/securesafe-csv-importer.spec.ts b/libs/importer/src/importers/securesafe-csv-importer.spec.ts similarity index 93% rename from libs/importer/spec/securesafe-csv-importer.spec.ts rename to libs/importer/src/importers/securesafe-csv-importer.spec.ts index 8d12ae12d94..799c3c6e9d5 100644 --- a/libs/importer/spec/securesafe-csv-importer.spec.ts +++ b/libs/importer/src/importers/securesafe-csv-importer.spec.ts @@ -2,9 +2,8 @@ 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 { SecureSafeCsvImporter } from "../src/importers"; - -import { data_upperUrl, data_lowerUrl } from "./test-data/securesafe-csv/securesafe-example.csv"; +import { SecureSafeCsvImporter } from "./securesafe-csv-importer"; +import { data_upperUrl, data_lowerUrl } from "./spec-data/securesafe-csv/securesafe-example.csv"; const CipherData = [ { diff --git a/libs/importer/spec/test-data/bitwarden-json/account-encrypted.json.ts b/libs/importer/src/importers/spec-data/bitwarden-json/account-encrypted.json.ts similarity index 100% rename from libs/importer/spec/test-data/bitwarden-json/account-encrypted.json.ts rename to libs/importer/src/importers/spec-data/bitwarden-json/account-encrypted.json.ts diff --git a/libs/importer/spec/test-data/bitwarden-json/cipher-with-collections.json.ts b/libs/importer/src/importers/spec-data/bitwarden-json/cipher-with-collections.json.ts similarity index 100% rename from libs/importer/spec/test-data/bitwarden-json/cipher-with-collections.json.ts rename to libs/importer/src/importers/spec-data/bitwarden-json/cipher-with-collections.json.ts diff --git a/libs/importer/spec/test-data/bitwarden-json/password-protected.json.ts b/libs/importer/src/importers/spec-data/bitwarden-json/password-protected.json.ts similarity index 100% rename from libs/importer/spec/test-data/bitwarden-json/password-protected.json.ts rename to libs/importer/src/importers/spec-data/bitwarden-json/password-protected.json.ts diff --git a/libs/importer/spec/test-data/bitwarden-json/unencrypted.json.ts b/libs/importer/src/importers/spec-data/bitwarden-json/unencrypted.json.ts similarity index 100% rename from libs/importer/spec/test-data/bitwarden-json/unencrypted.json.ts rename to libs/importer/src/importers/spec-data/bitwarden-json/unencrypted.json.ts diff --git a/libs/importer/spec/test-data/chrome-csv/android-data.csv.ts b/libs/importer/src/importers/spec-data/chrome-csv/android-data.csv.ts similarity index 100% rename from libs/importer/spec/test-data/chrome-csv/android-data.csv.ts rename to libs/importer/src/importers/spec-data/chrome-csv/android-data.csv.ts diff --git a/libs/importer/spec/test-data/chrome-csv/simple-password-data.csv.ts b/libs/importer/src/importers/spec-data/chrome-csv/simple-password-data.csv.ts similarity index 100% rename from libs/importer/spec/test-data/chrome-csv/simple-password-data.csv.ts rename to libs/importer/src/importers/spec-data/chrome-csv/simple-password-data.csv.ts diff --git a/libs/importer/spec/test-data/dashlane-csv/credentials-otpurl.csv.ts b/libs/importer/src/importers/spec-data/dashlane-csv/credentials-otpurl.csv.ts similarity index 100% rename from libs/importer/spec/test-data/dashlane-csv/credentials-otpurl.csv.ts rename to libs/importer/src/importers/spec-data/dashlane-csv/credentials-otpurl.csv.ts diff --git a/libs/importer/spec/test-data/dashlane-csv/credentials.csv.ts b/libs/importer/src/importers/spec-data/dashlane-csv/credentials.csv.ts similarity index 100% rename from libs/importer/spec/test-data/dashlane-csv/credentials.csv.ts rename to libs/importer/src/importers/spec-data/dashlane-csv/credentials.csv.ts diff --git a/libs/importer/spec/test-data/dashlane-csv/id.csv.ts b/libs/importer/src/importers/spec-data/dashlane-csv/id.csv.ts similarity index 100% rename from libs/importer/spec/test-data/dashlane-csv/id.csv.ts rename to libs/importer/src/importers/spec-data/dashlane-csv/id.csv.ts diff --git a/libs/importer/spec/test-data/dashlane-csv/multiple-personal-info.csv.ts b/libs/importer/src/importers/spec-data/dashlane-csv/multiple-personal-info.csv.ts similarity index 100% rename from libs/importer/spec/test-data/dashlane-csv/multiple-personal-info.csv.ts rename to libs/importer/src/importers/spec-data/dashlane-csv/multiple-personal-info.csv.ts diff --git a/libs/importer/spec/test-data/dashlane-csv/payments.csv.ts b/libs/importer/src/importers/spec-data/dashlane-csv/payments.csv.ts similarity index 100% rename from libs/importer/spec/test-data/dashlane-csv/payments.csv.ts rename to libs/importer/src/importers/spec-data/dashlane-csv/payments.csv.ts diff --git a/libs/importer/spec/test-data/dashlane-csv/personal-info.csv.ts b/libs/importer/src/importers/spec-data/dashlane-csv/personal-info.csv.ts similarity index 100% rename from libs/importer/spec/test-data/dashlane-csv/personal-info.csv.ts rename to libs/importer/src/importers/spec-data/dashlane-csv/personal-info.csv.ts diff --git a/libs/importer/spec/test-data/dashlane-csv/securenotes.csv.ts b/libs/importer/src/importers/spec-data/dashlane-csv/securenotes.csv.ts similarity index 100% rename from libs/importer/spec/test-data/dashlane-csv/securenotes.csv.ts rename to libs/importer/src/importers/spec-data/dashlane-csv/securenotes.csv.ts diff --git a/libs/importer/spec/test-data/enpass-json/credit-card.ts b/libs/importer/src/importers/spec-data/enpass-json/credit-card.ts similarity index 98% rename from libs/importer/spec/test-data/enpass-json/credit-card.ts rename to libs/importer/src/importers/spec-data/enpass-json/credit-card.ts index 621190a735f..207e934903f 100644 --- a/libs/importer/spec/test-data/enpass-json/credit-card.ts +++ b/libs/importer/src/importers/spec-data/enpass-json/credit-card.ts @@ -1,4 +1,4 @@ -import { EnpassJsonFile } from "../../../src/importers/enpass/types/enpass-json-type"; +import { EnpassJsonFile } from "../../enpass/types/enpass-json-type"; export const creditCard: EnpassJsonFile = { folders: [], diff --git a/libs/importer/spec/test-data/enpass-json/folders.ts b/libs/importer/src/importers/spec-data/enpass-json/folders.ts similarity index 91% rename from libs/importer/spec/test-data/enpass-json/folders.ts rename to libs/importer/src/importers/spec-data/enpass-json/folders.ts index 22ab26524b0..9af44f057bf 100644 --- a/libs/importer/spec/test-data/enpass-json/folders.ts +++ b/libs/importer/src/importers/spec-data/enpass-json/folders.ts @@ -1,4 +1,4 @@ -import { EnpassJsonFile } from "../../../src/importers/enpass/types/enpass-json-type"; +import { EnpassJsonFile } from "../../enpass/types/enpass-json-type"; export const folders: EnpassJsonFile = { folders: [ diff --git a/libs/importer/spec/test-data/enpass-json/login-android-url.ts b/libs/importer/src/importers/spec-data/enpass-json/login-android-url.ts similarity index 95% rename from libs/importer/spec/test-data/enpass-json/login-android-url.ts rename to libs/importer/src/importers/spec-data/enpass-json/login-android-url.ts index 6b0ac41ccde..91dca5fe99a 100644 --- a/libs/importer/spec/test-data/enpass-json/login-android-url.ts +++ b/libs/importer/src/importers/spec-data/enpass-json/login-android-url.ts @@ -1,4 +1,5 @@ -import { EnpassJsonFile } from "../../../src/importers/enpass/types/enpass-json-type"; +// @ts-strict-ignore +import { EnpassJsonFile } from "../../enpass/types/enpass-json-type"; import { login } from "./login"; diff --git a/libs/importer/spec/test-data/enpass-json/login.ts b/libs/importer/src/importers/spec-data/enpass-json/login.ts similarity index 97% rename from libs/importer/spec/test-data/enpass-json/login.ts rename to libs/importer/src/importers/spec-data/enpass-json/login.ts index 07707f2ca3e..6626b8c9e4b 100644 --- a/libs/importer/spec/test-data/enpass-json/login.ts +++ b/libs/importer/src/importers/spec-data/enpass-json/login.ts @@ -1,4 +1,4 @@ -import { EnpassJsonFile } from "../../../src/importers/enpass/types/enpass-json-type"; +import { EnpassJsonFile } from "../../enpass/types/enpass-json-type"; export const login: EnpassJsonFile = { folders: [], diff --git a/libs/importer/spec/test-data/enpass-json/note.ts b/libs/importer/src/importers/spec-data/enpass-json/note.ts similarity index 86% rename from libs/importer/spec/test-data/enpass-json/note.ts rename to libs/importer/src/importers/spec-data/enpass-json/note.ts index 58f54371ad0..37c1658b517 100644 --- a/libs/importer/spec/test-data/enpass-json/note.ts +++ b/libs/importer/src/importers/spec-data/enpass-json/note.ts @@ -1,4 +1,4 @@ -import { EnpassJsonFile } from "../../../src/importers/enpass/types/enpass-json-type"; +import { EnpassJsonFile } from "../../enpass/types/enpass-json-type"; export const note: EnpassJsonFile = { folders: [], diff --git a/libs/importer/spec/test-data/firefox-csv/firefox-accounts-data.csv.ts b/libs/importer/src/importers/spec-data/firefox-csv/firefox-accounts-data.csv.ts similarity index 100% rename from libs/importer/spec/test-data/firefox-csv/firefox-accounts-data.csv.ts rename to libs/importer/src/importers/spec-data/firefox-csv/firefox-accounts-data.csv.ts diff --git a/libs/importer/spec/test-data/firefox-csv/simple-password-data.csv.ts b/libs/importer/src/importers/spec-data/firefox-csv/simple-password-data.csv.ts similarity index 100% rename from libs/importer/spec/test-data/firefox-csv/simple-password-data.csv.ts rename to libs/importer/src/importers/spec-data/firefox-csv/simple-password-data.csv.ts diff --git a/libs/importer/spec/test-data/keepass2-xml/keepass2-xml-importer-testdata.ts b/libs/importer/src/importers/spec-data/keepass2-xml/keepass2-xml-importer-testdata.ts similarity index 100% rename from libs/importer/spec/test-data/keepass2-xml/keepass2-xml-importer-testdata.ts rename to libs/importer/src/importers/spec-data/keepass2-xml/keepass2-xml-importer-testdata.ts diff --git a/libs/importer/spec/test-data/keepassx-csv/testdata.csv.ts b/libs/importer/src/importers/spec-data/keepassx-csv/testdata.csv.ts similarity index 100% rename from libs/importer/spec/test-data/keepassx-csv/testdata.csv.ts rename to libs/importer/src/importers/spec-data/keepassx-csv/testdata.csv.ts diff --git a/libs/importer/spec/test-data/keeper-csv/testdata.csv.ts b/libs/importer/src/importers/spec-data/keeper-csv/testdata.csv.ts similarity index 100% rename from libs/importer/spec/test-data/keeper-csv/testdata.csv.ts rename to libs/importer/src/importers/spec-data/keeper-csv/testdata.csv.ts diff --git a/libs/importer/spec/test-data/keeper-json/testdata.json.ts b/libs/importer/src/importers/spec-data/keeper-json/testdata.json.ts similarity index 95% rename from libs/importer/spec/test-data/keeper-json/testdata.json.ts rename to libs/importer/src/importers/spec-data/keeper-json/testdata.json.ts index 952ced5027f..e18789adcb5 100644 --- a/libs/importer/spec/test-data/keeper-json/testdata.json.ts +++ b/libs/importer/src/importers/spec-data/keeper-json/testdata.json.ts @@ -1,4 +1,4 @@ -import { KeeperJsonExport } from "../../../src/importers/keeper/types/keeper-json-types"; +import { KeeperJsonExport } from "../../keeper/types/keeper-json-types"; export const testData: KeeperJsonExport = { shared_folders: [ diff --git a/libs/importer/spec/test-data/myki-csv/user-account.csv.ts b/libs/importer/src/importers/spec-data/myki-csv/user-account.csv.ts similarity index 100% rename from libs/importer/spec/test-data/myki-csv/user-account.csv.ts rename to libs/importer/src/importers/spec-data/myki-csv/user-account.csv.ts diff --git a/libs/importer/spec/test-data/myki-csv/user-credit-card.csv.ts b/libs/importer/src/importers/spec-data/myki-csv/user-credit-card.csv.ts similarity index 100% rename from libs/importer/spec/test-data/myki-csv/user-credit-card.csv.ts rename to libs/importer/src/importers/spec-data/myki-csv/user-credit-card.csv.ts diff --git a/libs/importer/spec/test-data/myki-csv/user-id-card.csv.ts b/libs/importer/src/importers/spec-data/myki-csv/user-id-card.csv.ts similarity index 100% rename from libs/importer/spec/test-data/myki-csv/user-id-card.csv.ts rename to libs/importer/src/importers/spec-data/myki-csv/user-id-card.csv.ts diff --git a/libs/importer/spec/test-data/myki-csv/user-identity.csv.ts b/libs/importer/src/importers/spec-data/myki-csv/user-identity.csv.ts similarity index 100% rename from libs/importer/spec/test-data/myki-csv/user-identity.csv.ts rename to libs/importer/src/importers/spec-data/myki-csv/user-identity.csv.ts diff --git a/libs/importer/spec/test-data/myki-csv/user-note.csv.ts b/libs/importer/src/importers/spec-data/myki-csv/user-note.csv.ts similarity index 100% rename from libs/importer/spec/test-data/myki-csv/user-note.csv.ts rename to libs/importer/src/importers/spec-data/myki-csv/user-note.csv.ts diff --git a/libs/importer/spec/test-data/myki-csv/user-twofa.csv.ts b/libs/importer/src/importers/spec-data/myki-csv/user-twofa.csv.ts similarity index 100% rename from libs/importer/spec/test-data/myki-csv/user-twofa.csv.ts rename to libs/importer/src/importers/spec-data/myki-csv/user-twofa.csv.ts diff --git a/libs/importer/spec/test-data/netwrix-csv/login-export.csv.ts b/libs/importer/src/importers/spec-data/netwrix-csv/login-export.csv.ts similarity index 100% rename from libs/importer/spec/test-data/netwrix-csv/login-export.csv.ts rename to libs/importer/src/importers/spec-data/netwrix-csv/login-export.csv.ts diff --git a/libs/importer/spec/test-data/nordpass-csv/nordpass.card.csv.ts b/libs/importer/src/importers/spec-data/nordpass-csv/nordpass.card.csv.ts similarity index 100% rename from libs/importer/spec/test-data/nordpass-csv/nordpass.card.csv.ts rename to libs/importer/src/importers/spec-data/nordpass-csv/nordpass.card.csv.ts diff --git a/libs/importer/spec/test-data/nordpass-csv/nordpass.identity.csv.ts b/libs/importer/src/importers/spec-data/nordpass-csv/nordpass.identity.csv.ts similarity index 100% rename from libs/importer/spec/test-data/nordpass-csv/nordpass.identity.csv.ts rename to libs/importer/src/importers/spec-data/nordpass-csv/nordpass.identity.csv.ts diff --git a/libs/importer/spec/test-data/nordpass-csv/nordpass.login-with-additinal-urls.csv.ts b/libs/importer/src/importers/spec-data/nordpass-csv/nordpass.login-with-additinal-urls.csv.ts similarity index 100% rename from libs/importer/spec/test-data/nordpass-csv/nordpass.login-with-additinal-urls.csv.ts rename to libs/importer/src/importers/spec-data/nordpass-csv/nordpass.login-with-additinal-urls.csv.ts diff --git a/libs/importer/spec/test-data/nordpass-csv/nordpass.login.csv.ts b/libs/importer/src/importers/spec-data/nordpass-csv/nordpass.login.csv.ts similarity index 100% rename from libs/importer/spec/test-data/nordpass-csv/nordpass.login.csv.ts rename to libs/importer/src/importers/spec-data/nordpass-csv/nordpass.login.csv.ts diff --git a/libs/importer/spec/test-data/nordpass-csv/nordpass.secure-note.csv.ts b/libs/importer/src/importers/spec-data/nordpass-csv/nordpass.secure-note.csv.ts similarity index 100% rename from libs/importer/spec/test-data/nordpass-csv/nordpass.secure-note.csv.ts rename to libs/importer/src/importers/spec-data/nordpass-csv/nordpass.secure-note.csv.ts diff --git a/libs/importer/spec/test-data/onepassword-1pux/api-credentials.ts b/libs/importer/src/importers/spec-data/onepassword-1pux/api-credentials.ts similarity index 98% rename from libs/importer/spec/test-data/onepassword-1pux/api-credentials.ts rename to libs/importer/src/importers/spec-data/onepassword-1pux/api-credentials.ts index 7a830194b8c..f8047ad8d84 100644 --- a/libs/importer/spec/test-data/onepassword-1pux/api-credentials.ts +++ b/libs/importer/src/importers/spec-data/onepassword-1pux/api-credentials.ts @@ -1,4 +1,4 @@ -import { ExportData } from "../../../src/importers/onepassword/types/onepassword-1pux-importer-types"; +import { ExportData } from "../../onepassword/types/onepassword-1pux-importer-types"; export const APICredentialsData: ExportData = { accounts: [ diff --git a/libs/importer/spec/test-data/onepassword-1pux/bank-account.ts b/libs/importer/src/importers/spec-data/onepassword-1pux/bank-account.ts similarity index 98% rename from libs/importer/spec/test-data/onepassword-1pux/bank-account.ts rename to libs/importer/src/importers/spec-data/onepassword-1pux/bank-account.ts index 6ffccafe514..f98e205624b 100644 --- a/libs/importer/spec/test-data/onepassword-1pux/bank-account.ts +++ b/libs/importer/src/importers/spec-data/onepassword-1pux/bank-account.ts @@ -1,4 +1,4 @@ -import { ExportData } from "../../../src/importers/onepassword/types/onepassword-1pux-importer-types"; +import { ExportData } from "../../onepassword/types/onepassword-1pux-importer-types"; export const BankAccountData: ExportData = { accounts: [ diff --git a/libs/importer/spec/test-data/onepassword-1pux/credit-card.ts b/libs/importer/src/importers/spec-data/onepassword-1pux/credit-card.ts similarity index 99% rename from libs/importer/spec/test-data/onepassword-1pux/credit-card.ts rename to libs/importer/src/importers/spec-data/onepassword-1pux/credit-card.ts index 74af97a4c2b..5ed4cd8ef1b 100644 --- a/libs/importer/spec/test-data/onepassword-1pux/credit-card.ts +++ b/libs/importer/src/importers/spec-data/onepassword-1pux/credit-card.ts @@ -1,4 +1,4 @@ -import { ExportData } from "../../../src/importers/onepassword/types/onepassword-1pux-importer-types"; +import { ExportData } from "../../onepassword/types/onepassword-1pux-importer-types"; export const CreditCardData: ExportData = { accounts: [ diff --git a/libs/importer/spec/test-data/onepassword-1pux/database.ts b/libs/importer/src/importers/spec-data/onepassword-1pux/database.ts similarity index 98% rename from libs/importer/spec/test-data/onepassword-1pux/database.ts rename to libs/importer/src/importers/spec-data/onepassword-1pux/database.ts index 58631a2f98b..316107e54fc 100644 --- a/libs/importer/spec/test-data/onepassword-1pux/database.ts +++ b/libs/importer/src/importers/spec-data/onepassword-1pux/database.ts @@ -1,4 +1,4 @@ -import { ExportData } from "../../../src/importers/onepassword/types/onepassword-1pux-importer-types"; +import { ExportData } from "../../onepassword/types/onepassword-1pux-importer-types"; export const DatabaseData: ExportData = { accounts: [ diff --git a/libs/importer/spec/test-data/onepassword-1pux/drivers-license.ts b/libs/importer/src/importers/spec-data/onepassword-1pux/drivers-license.ts similarity index 98% rename from libs/importer/spec/test-data/onepassword-1pux/drivers-license.ts rename to libs/importer/src/importers/spec-data/onepassword-1pux/drivers-license.ts index 54a52f36999..2c50cd2c42e 100644 --- a/libs/importer/spec/test-data/onepassword-1pux/drivers-license.ts +++ b/libs/importer/src/importers/spec-data/onepassword-1pux/drivers-license.ts @@ -1,4 +1,4 @@ -import { ExportData } from "../../../src/importers/onepassword/types/onepassword-1pux-importer-types"; +import { ExportData } from "../../onepassword/types/onepassword-1pux-importer-types"; export const DriversLicenseData: ExportData = { accounts: [ diff --git a/libs/importer/spec/test-data/onepassword-1pux/email-account.ts b/libs/importer/src/importers/spec-data/onepassword-1pux/email-account.ts similarity index 99% rename from libs/importer/spec/test-data/onepassword-1pux/email-account.ts rename to libs/importer/src/importers/spec-data/onepassword-1pux/email-account.ts index 0d94973ec29..a164f4bc504 100644 --- a/libs/importer/spec/test-data/onepassword-1pux/email-account.ts +++ b/libs/importer/src/importers/spec-data/onepassword-1pux/email-account.ts @@ -1,4 +1,4 @@ -import { ExportData } from "../../../src/importers/onepassword/types/onepassword-1pux-importer-types"; +import { ExportData } from "../../onepassword/types/onepassword-1pux-importer-types"; export const EmailAccountData: ExportData = { accounts: [ diff --git a/libs/importer/spec/test-data/onepassword-1pux/email-field-on-identity.ts b/libs/importer/src/importers/spec-data/onepassword-1pux/email-field-on-identity.ts similarity index 96% rename from libs/importer/spec/test-data/onepassword-1pux/email-field-on-identity.ts rename to libs/importer/src/importers/spec-data/onepassword-1pux/email-field-on-identity.ts index 009743dfd08..8e72088e170 100644 --- a/libs/importer/spec/test-data/onepassword-1pux/email-field-on-identity.ts +++ b/libs/importer/src/importers/spec-data/onepassword-1pux/email-field-on-identity.ts @@ -1,4 +1,4 @@ -import { ExportData } from "../../../src/importers/onepassword/types/onepassword-1pux-importer-types"; +import { ExportData } from "../../onepassword/types/onepassword-1pux-importer-types"; export const EmailFieldOnIdentityData: ExportData = { accounts: [ diff --git a/libs/importer/spec/test-data/onepassword-1pux/email-field-on-identity_prefilled.ts b/libs/importer/src/importers/spec-data/onepassword-1pux/email-field-on-identity_prefilled.ts similarity index 96% rename from libs/importer/spec/test-data/onepassword-1pux/email-field-on-identity_prefilled.ts rename to libs/importer/src/importers/spec-data/onepassword-1pux/email-field-on-identity_prefilled.ts index 591d27bd227..79a306faf2c 100644 --- a/libs/importer/spec/test-data/onepassword-1pux/email-field-on-identity_prefilled.ts +++ b/libs/importer/src/importers/spec-data/onepassword-1pux/email-field-on-identity_prefilled.ts @@ -1,4 +1,4 @@ -import { ExportData } from "../../../src/importers/onepassword/types/onepassword-1pux-importer-types"; +import { ExportData } from "../../onepassword/types/onepassword-1pux-importer-types"; export const EmailFieldOnIdentityPrefilledData: ExportData = { accounts: [ diff --git a/libs/importer/spec/test-data/onepassword-1pux/email-field.ts b/libs/importer/src/importers/spec-data/onepassword-1pux/email-field.ts similarity index 96% rename from libs/importer/spec/test-data/onepassword-1pux/email-field.ts rename to libs/importer/src/importers/spec-data/onepassword-1pux/email-field.ts index f6258bda7fa..5360c9484ee 100644 --- a/libs/importer/spec/test-data/onepassword-1pux/email-field.ts +++ b/libs/importer/src/importers/spec-data/onepassword-1pux/email-field.ts @@ -1,4 +1,4 @@ -import { ExportData } from "../../../src/importers/onepassword/types/onepassword-1pux-importer-types"; +import { ExportData } from "../../onepassword/types/onepassword-1pux-importer-types"; export const EmailFieldData: ExportData = { accounts: [ diff --git a/libs/importer/spec/test-data/onepassword-1pux/identity-data.ts b/libs/importer/src/importers/spec-data/onepassword-1pux/identity-data.ts similarity index 99% rename from libs/importer/spec/test-data/onepassword-1pux/identity-data.ts rename to libs/importer/src/importers/spec-data/onepassword-1pux/identity-data.ts index c97a2bbaf45..eb0a5555201 100644 --- a/libs/importer/spec/test-data/onepassword-1pux/identity-data.ts +++ b/libs/importer/src/importers/spec-data/onepassword-1pux/identity-data.ts @@ -1,4 +1,4 @@ -import { ExportData } from "../../../src/importers/onepassword/types/onepassword-1pux-importer-types"; +import { ExportData } from "../../onepassword/types/onepassword-1pux-importer-types"; export const IdentityData: ExportData = { accounts: [ diff --git a/libs/importer/spec/test-data/onepassword-1pux/login-data.ts b/libs/importer/src/importers/spec-data/onepassword-1pux/login-data.ts similarity index 97% rename from libs/importer/spec/test-data/onepassword-1pux/login-data.ts rename to libs/importer/src/importers/spec-data/onepassword-1pux/login-data.ts index dc6a026d835..6d0515cb8cb 100644 --- a/libs/importer/spec/test-data/onepassword-1pux/login-data.ts +++ b/libs/importer/src/importers/spec-data/onepassword-1pux/login-data.ts @@ -1,4 +1,4 @@ -import { ExportData } from "../../../src/importers/onepassword/types/onepassword-1pux-importer-types"; +import { ExportData } from "../../onepassword/types/onepassword-1pux-importer-types"; export const LoginData: ExportData = { accounts: [ diff --git a/libs/importer/spec/test-data/onepassword-1pux/medical-record.ts b/libs/importer/src/importers/spec-data/onepassword-1pux/medical-record.ts similarity index 98% rename from libs/importer/spec/test-data/onepassword-1pux/medical-record.ts rename to libs/importer/src/importers/spec-data/onepassword-1pux/medical-record.ts index 67a929b13b1..5746ca99956 100644 --- a/libs/importer/spec/test-data/onepassword-1pux/medical-record.ts +++ b/libs/importer/src/importers/spec-data/onepassword-1pux/medical-record.ts @@ -1,4 +1,4 @@ -import { ExportData } from "../../../src/importers/onepassword/types/onepassword-1pux-importer-types"; +import { ExportData } from "../../onepassword/types/onepassword-1pux-importer-types"; export const MedicalRecordData: ExportData = { accounts: [ diff --git a/libs/importer/spec/test-data/onepassword-1pux/membership.ts b/libs/importer/src/importers/spec-data/onepassword-1pux/membership.ts similarity index 98% rename from libs/importer/spec/test-data/onepassword-1pux/membership.ts rename to libs/importer/src/importers/spec-data/onepassword-1pux/membership.ts index 5e36e8e6c9f..1801f0a4f92 100644 --- a/libs/importer/spec/test-data/onepassword-1pux/membership.ts +++ b/libs/importer/src/importers/spec-data/onepassword-1pux/membership.ts @@ -1,4 +1,4 @@ -import { ExportData } from "../../../src/importers/onepassword/types/onepassword-1pux-importer-types"; +import { ExportData } from "../../onepassword/types/onepassword-1pux-importer-types"; export const MembershipData: ExportData = { accounts: [ diff --git a/libs/importer/spec/test-data/onepassword-1pux/onepux_example.ts b/libs/importer/src/importers/spec-data/onepassword-1pux/onepux_example.ts similarity index 96% rename from libs/importer/spec/test-data/onepassword-1pux/onepux_example.ts rename to libs/importer/src/importers/spec-data/onepassword-1pux/onepux_example.ts index 38f81783671..dc7c59c589b 100644 --- a/libs/importer/spec/test-data/onepassword-1pux/onepux_example.ts +++ b/libs/importer/src/importers/spec-data/onepassword-1pux/onepux_example.ts @@ -1,4 +1,4 @@ -import { ExportData } from "../../../src/importers/onepassword/types/onepassword-1pux-importer-types"; +import { ExportData } from "../../onepassword/types/onepassword-1pux-importer-types"; export const OnePuxExampleFile: ExportData = { accounts: [ diff --git a/libs/importer/spec/test-data/onepassword-1pux/outdoor-license.ts b/libs/importer/src/importers/spec-data/onepassword-1pux/outdoor-license.ts similarity index 98% rename from libs/importer/spec/test-data/onepassword-1pux/outdoor-license.ts rename to libs/importer/src/importers/spec-data/onepassword-1pux/outdoor-license.ts index aa8df12948e..b31bc0300a1 100644 --- a/libs/importer/spec/test-data/onepassword-1pux/outdoor-license.ts +++ b/libs/importer/src/importers/spec-data/onepassword-1pux/outdoor-license.ts @@ -1,4 +1,4 @@ -import { ExportData } from "../../../src/importers/onepassword/types/onepassword-1pux-importer-types"; +import { ExportData } from "../../onepassword/types/onepassword-1pux-importer-types"; export const OutdoorLicenseData: ExportData = { accounts: [ diff --git a/libs/importer/spec/test-data/onepassword-1pux/passport.ts b/libs/importer/src/importers/spec-data/onepassword-1pux/passport.ts similarity index 98% rename from libs/importer/spec/test-data/onepassword-1pux/passport.ts rename to libs/importer/src/importers/spec-data/onepassword-1pux/passport.ts index 00336aa70cd..1a22601a3c2 100644 --- a/libs/importer/spec/test-data/onepassword-1pux/passport.ts +++ b/libs/importer/src/importers/spec-data/onepassword-1pux/passport.ts @@ -1,4 +1,4 @@ -import { ExportData } from "../../../src/importers/onepassword/types/onepassword-1pux-importer-types"; +import { ExportData } from "../../onepassword/types/onepassword-1pux-importer-types"; export const PassportData: ExportData = { accounts: [ diff --git a/libs/importer/spec/test-data/onepassword-1pux/password.ts b/libs/importer/src/importers/spec-data/onepassword-1pux/password.ts similarity index 93% rename from libs/importer/spec/test-data/onepassword-1pux/password.ts rename to libs/importer/src/importers/spec-data/onepassword-1pux/password.ts index e416ab9c715..d9169ab3cab 100644 --- a/libs/importer/spec/test-data/onepassword-1pux/password.ts +++ b/libs/importer/src/importers/spec-data/onepassword-1pux/password.ts @@ -1,4 +1,4 @@ -import { ExportData } from "../../../src/importers/onepassword/types/onepassword-1pux-importer-types"; +import { ExportData } from "../../onepassword/types/onepassword-1pux-importer-types"; export const PasswordData: ExportData = { accounts: [ diff --git a/libs/importer/spec/test-data/onepassword-1pux/rewards-program.ts b/libs/importer/src/importers/spec-data/onepassword-1pux/rewards-program.ts similarity index 98% rename from libs/importer/spec/test-data/onepassword-1pux/rewards-program.ts rename to libs/importer/src/importers/spec-data/onepassword-1pux/rewards-program.ts index 75333086435..223bae6f39d 100644 --- a/libs/importer/spec/test-data/onepassword-1pux/rewards-program.ts +++ b/libs/importer/src/importers/spec-data/onepassword-1pux/rewards-program.ts @@ -1,4 +1,4 @@ -import { ExportData } from "../../../src/importers/onepassword/types/onepassword-1pux-importer-types"; +import { ExportData } from "../../onepassword/types/onepassword-1pux-importer-types"; export const RewardsProgramData: ExportData = { accounts: [ diff --git a/libs/importer/spec/test-data/onepassword-1pux/sanitized-export.ts b/libs/importer/src/importers/spec-data/onepassword-1pux/sanitized-export.ts similarity index 99% rename from libs/importer/spec/test-data/onepassword-1pux/sanitized-export.ts rename to libs/importer/src/importers/spec-data/onepassword-1pux/sanitized-export.ts index 284921eb80e..bf1e87c9c1d 100644 --- a/libs/importer/spec/test-data/onepassword-1pux/sanitized-export.ts +++ b/libs/importer/src/importers/spec-data/onepassword-1pux/sanitized-export.ts @@ -1,4 +1,4 @@ -import { ExportData } from "../../../src/importers/onepassword/types/onepassword-1pux-importer-types"; +import { ExportData } from "../../onepassword/types/onepassword-1pux-importer-types"; export const SanitizedExport: ExportData = { accounts: [ diff --git a/libs/importer/spec/test-data/onepassword-1pux/secure-note.ts b/libs/importer/src/importers/spec-data/onepassword-1pux/secure-note.ts similarity index 93% rename from libs/importer/spec/test-data/onepassword-1pux/secure-note.ts rename to libs/importer/src/importers/spec-data/onepassword-1pux/secure-note.ts index d7f93c9895c..0e02b2533be 100644 --- a/libs/importer/spec/test-data/onepassword-1pux/secure-note.ts +++ b/libs/importer/src/importers/spec-data/onepassword-1pux/secure-note.ts @@ -1,4 +1,4 @@ -import { ExportData } from "../../../src/importers/onepassword/types/onepassword-1pux-importer-types"; +import { ExportData } from "../../onepassword/types/onepassword-1pux-importer-types"; export const SecureNoteData: ExportData = { accounts: [ diff --git a/libs/importer/spec/test-data/onepassword-1pux/server.ts b/libs/importer/src/importers/spec-data/onepassword-1pux/server.ts similarity index 98% rename from libs/importer/spec/test-data/onepassword-1pux/server.ts rename to libs/importer/src/importers/spec-data/onepassword-1pux/server.ts index 59e7a841f9c..c74deceb6f9 100644 --- a/libs/importer/spec/test-data/onepassword-1pux/server.ts +++ b/libs/importer/src/importers/spec-data/onepassword-1pux/server.ts @@ -1,4 +1,4 @@ -import { ExportData } from "../../../src/importers/onepassword/types/onepassword-1pux-importer-types"; +import { ExportData } from "../../onepassword/types/onepassword-1pux-importer-types"; export const ServerData: ExportData = { accounts: [ diff --git a/libs/importer/spec/test-data/onepassword-1pux/software-license.ts b/libs/importer/src/importers/spec-data/onepassword-1pux/software-license.ts similarity index 98% rename from libs/importer/spec/test-data/onepassword-1pux/software-license.ts rename to libs/importer/src/importers/spec-data/onepassword-1pux/software-license.ts index a6ccea53059..0fdf683a426 100644 --- a/libs/importer/spec/test-data/onepassword-1pux/software-license.ts +++ b/libs/importer/src/importers/spec-data/onepassword-1pux/software-license.ts @@ -1,4 +1,4 @@ -import { ExportData } from "../../../src/importers/onepassword/types/onepassword-1pux-importer-types"; +import { ExportData } from "../../onepassword/types/onepassword-1pux-importer-types"; export const SoftwareLicenseData: ExportData = { accounts: [ diff --git a/libs/importer/spec/test-data/onepassword-1pux/ssn.ts b/libs/importer/src/importers/spec-data/onepassword-1pux/ssn.ts similarity index 96% rename from libs/importer/spec/test-data/onepassword-1pux/ssn.ts rename to libs/importer/src/importers/spec-data/onepassword-1pux/ssn.ts index 4b1c5e13739..1514094e095 100644 --- a/libs/importer/spec/test-data/onepassword-1pux/ssn.ts +++ b/libs/importer/src/importers/spec-data/onepassword-1pux/ssn.ts @@ -1,4 +1,4 @@ -import { ExportData } from "../../../src/importers/onepassword/types/onepassword-1pux-importer-types"; +import { ExportData } from "../../onepassword/types/onepassword-1pux-importer-types"; export const SSNData: ExportData = { accounts: [ diff --git a/libs/importer/spec/test-data/onepassword-1pux/wireless-router.ts b/libs/importer/src/importers/spec-data/onepassword-1pux/wireless-router.ts similarity index 98% rename from libs/importer/spec/test-data/onepassword-1pux/wireless-router.ts rename to libs/importer/src/importers/spec-data/onepassword-1pux/wireless-router.ts index cef06abe612..b3193484363 100644 --- a/libs/importer/spec/test-data/onepassword-1pux/wireless-router.ts +++ b/libs/importer/src/importers/spec-data/onepassword-1pux/wireless-router.ts @@ -1,4 +1,4 @@ -import { ExportData } from "../../../src/importers/onepassword/types/onepassword-1pux-importer-types"; +import { ExportData } from "../../onepassword/types/onepassword-1pux-importer-types"; export const WirelessRouterData: ExportData = { accounts: [ diff --git a/libs/importer/spec/test-data/onepassword-csv/credit-card.mac.csv.ts b/libs/importer/src/importers/spec-data/onepassword-csv/credit-card.mac.csv.ts similarity index 100% rename from libs/importer/spec/test-data/onepassword-csv/credit-card.mac.csv.ts rename to libs/importer/src/importers/spec-data/onepassword-csv/credit-card.mac.csv.ts diff --git a/libs/importer/spec/test-data/onepassword-csv/credit-card.windows.csv.ts b/libs/importer/src/importers/spec-data/onepassword-csv/credit-card.windows.csv.ts similarity index 100% rename from libs/importer/spec/test-data/onepassword-csv/credit-card.windows.csv.ts rename to libs/importer/src/importers/spec-data/onepassword-csv/credit-card.windows.csv.ts diff --git a/libs/importer/spec/test-data/onepassword-csv/identity.mac.csv.ts b/libs/importer/src/importers/spec-data/onepassword-csv/identity.mac.csv.ts similarity index 100% rename from libs/importer/spec/test-data/onepassword-csv/identity.mac.csv.ts rename to libs/importer/src/importers/spec-data/onepassword-csv/identity.mac.csv.ts diff --git a/libs/importer/spec/test-data/onepassword-csv/identity.windows.csv.ts b/libs/importer/src/importers/spec-data/onepassword-csv/identity.windows.csv.ts similarity index 100% rename from libs/importer/spec/test-data/onepassword-csv/identity.windows.csv.ts rename to libs/importer/src/importers/spec-data/onepassword-csv/identity.windows.csv.ts diff --git a/libs/importer/spec/test-data/onepassword-csv/multiple-items.mac.csv.ts b/libs/importer/src/importers/spec-data/onepassword-csv/multiple-items.mac.csv.ts similarity index 100% rename from libs/importer/spec/test-data/onepassword-csv/multiple-items.mac.csv.ts rename to libs/importer/src/importers/spec-data/onepassword-csv/multiple-items.mac.csv.ts diff --git a/libs/importer/spec/test-data/onepassword-csv/multiple-items.windows.csv.ts b/libs/importer/src/importers/spec-data/onepassword-csv/multiple-items.windows.csv.ts similarity index 100% rename from libs/importer/spec/test-data/onepassword-csv/multiple-items.windows.csv.ts rename to libs/importer/src/importers/spec-data/onepassword-csv/multiple-items.windows.csv.ts diff --git a/libs/importer/spec/test-data/passky-json/passky-encrypted.json.ts b/libs/importer/src/importers/spec-data/passky-json/passky-encrypted.json.ts similarity index 85% rename from libs/importer/spec/test-data/passky-json/passky-encrypted.json.ts rename to libs/importer/src/importers/spec-data/passky-json/passky-encrypted.json.ts index 6b9743be343..a73894ce0c2 100644 --- a/libs/importer/spec/test-data/passky-json/passky-encrypted.json.ts +++ b/libs/importer/src/importers/spec-data/passky-json/passky-encrypted.json.ts @@ -1,4 +1,4 @@ -import { PasskyJsonExport } from "../../../src/importers/passky/passky-json-types"; +import { PasskyJsonExport } from "../../passky/passky-json-types"; export const testData: PasskyJsonExport = { encrypted: true, diff --git a/libs/importer/spec/test-data/passky-json/passky-unencrypted.json.ts b/libs/importer/src/importers/spec-data/passky-json/passky-unencrypted.json.ts similarity index 73% rename from libs/importer/spec/test-data/passky-json/passky-unencrypted.json.ts rename to libs/importer/src/importers/spec-data/passky-json/passky-unencrypted.json.ts index c382136648a..738595a6d25 100644 --- a/libs/importer/spec/test-data/passky-json/passky-unencrypted.json.ts +++ b/libs/importer/src/importers/spec-data/passky-json/passky-unencrypted.json.ts @@ -1,4 +1,4 @@ -import { PasskyJsonExport } from "../../../src/importers/passky/passky-json-types"; +import { PasskyJsonExport } from "../../passky/passky-json-types"; export const testData: PasskyJsonExport = { encrypted: false, diff --git a/libs/importer/spec/test-data/passwordxp-csv/dutch-headers.ts b/libs/importer/src/importers/spec-data/passwordxp-csv/dutch-headers.ts similarity index 100% rename from libs/importer/spec/test-data/passwordxp-csv/dutch-headers.ts rename to libs/importer/src/importers/spec-data/passwordxp-csv/dutch-headers.ts diff --git a/libs/importer/spec/test-data/passwordxp-csv/german-headers.ts b/libs/importer/src/importers/spec-data/passwordxp-csv/german-headers.ts similarity index 100% rename from libs/importer/spec/test-data/passwordxp-csv/german-headers.ts rename to libs/importer/src/importers/spec-data/passwordxp-csv/german-headers.ts diff --git a/libs/importer/spec/test-data/passwordxp-csv/no-folder.csv.ts b/libs/importer/src/importers/spec-data/passwordxp-csv/no-folder.csv.ts similarity index 100% rename from libs/importer/spec/test-data/passwordxp-csv/no-folder.csv.ts rename to libs/importer/src/importers/spec-data/passwordxp-csv/no-folder.csv.ts diff --git a/libs/importer/spec/test-data/passwordxp-csv/passwordxp-with-folders.csv.ts b/libs/importer/src/importers/spec-data/passwordxp-csv/passwordxp-with-folders.csv.ts similarity index 100% rename from libs/importer/spec/test-data/passwordxp-csv/passwordxp-with-folders.csv.ts rename to libs/importer/src/importers/spec-data/passwordxp-csv/passwordxp-with-folders.csv.ts diff --git a/libs/importer/spec/test-data/passwordxp-csv/passwordxp-without-folders.csv.ts b/libs/importer/src/importers/spec-data/passwordxp-csv/passwordxp-without-folders.csv.ts similarity index 100% rename from libs/importer/spec/test-data/passwordxp-csv/passwordxp-without-folders.csv.ts rename to libs/importer/src/importers/spec-data/passwordxp-csv/passwordxp-without-folders.csv.ts diff --git a/libs/importer/spec/test-data/protonpass-json/protonpass.json.ts b/libs/importer/src/importers/spec-data/protonpass-json/protonpass.json.ts similarity index 99% rename from libs/importer/spec/test-data/protonpass-json/protonpass.json.ts rename to libs/importer/src/importers/spec-data/protonpass-json/protonpass.json.ts index 367c2b37e14..d01cfa0d8f8 100644 --- a/libs/importer/spec/test-data/protonpass-json/protonpass.json.ts +++ b/libs/importer/src/importers/spec-data/protonpass-json/protonpass.json.ts @@ -1,4 +1,4 @@ -import { ProtonPassJsonFile } from "../../../src/importers/protonpass/types/protonpass-json-type"; +import { ProtonPassJsonFile } from "../../protonpass/types/protonpass-json-type"; export const testData: ProtonPassJsonFile = { version: "1.21.2", diff --git a/libs/importer/spec/test-data/psono-json/application-passwords.ts b/libs/importer/src/importers/spec-data/psono-json/application-passwords.ts similarity index 87% rename from libs/importer/spec/test-data/psono-json/application-passwords.ts rename to libs/importer/src/importers/spec-data/psono-json/application-passwords.ts index 29c4a44e0c9..c224c593d97 100644 --- a/libs/importer/spec/test-data/psono-json/application-passwords.ts +++ b/libs/importer/src/importers/spec-data/psono-json/application-passwords.ts @@ -1,4 +1,4 @@ -import { PsonoJsonExport } from "../../../src/importers/psono/psono-json-types"; +import { PsonoJsonExport } from "../../psono/psono-json-types"; export const ApplicationPasswordsData: PsonoJsonExport = { folders: [], diff --git a/libs/importer/spec/test-data/psono-json/bookmark.json.ts b/libs/importer/src/importers/spec-data/psono-json/bookmark.json.ts similarity index 86% rename from libs/importer/spec/test-data/psono-json/bookmark.json.ts rename to libs/importer/src/importers/spec-data/psono-json/bookmark.json.ts index fe0726fbe40..b50928cfe7b 100644 --- a/libs/importer/spec/test-data/psono-json/bookmark.json.ts +++ b/libs/importer/src/importers/spec-data/psono-json/bookmark.json.ts @@ -1,4 +1,4 @@ -import { PsonoJsonExport } from "../../../src/importers/psono/psono-json-types"; +import { PsonoJsonExport } from "../../psono/psono-json-types"; export const BookmarkData: PsonoJsonExport = { folders: [], diff --git a/libs/importer/spec/test-data/psono-json/empty-folders.ts b/libs/importer/src/importers/spec-data/psono-json/empty-folders.ts similarity index 62% rename from libs/importer/spec/test-data/psono-json/empty-folders.ts rename to libs/importer/src/importers/spec-data/psono-json/empty-folders.ts index 914cba585fe..28e1d697094 100644 --- a/libs/importer/spec/test-data/psono-json/empty-folders.ts +++ b/libs/importer/src/importers/spec-data/psono-json/empty-folders.ts @@ -1,4 +1,4 @@ -import { PsonoJsonExport } from "../../../src/importers/psono/psono-json-types"; +import { PsonoJsonExport } from "../../psono/psono-json-types"; export const EmptyTestFolderData: PsonoJsonExport = { folders: [ diff --git a/libs/importer/spec/test-data/psono-json/environment-variables.ts b/libs/importer/src/importers/spec-data/psono-json/environment-variables.ts similarity index 88% rename from libs/importer/spec/test-data/psono-json/environment-variables.ts rename to libs/importer/src/importers/spec-data/psono-json/environment-variables.ts index 9a26776ebc8..7ab411d2216 100644 --- a/libs/importer/spec/test-data/psono-json/environment-variables.ts +++ b/libs/importer/src/importers/spec-data/psono-json/environment-variables.ts @@ -1,4 +1,4 @@ -import { PsonoJsonExport } from "../../../src/importers/psono/psono-json-types"; +import { PsonoJsonExport } from "../../psono/psono-json-types"; export const EnvVariablesData: PsonoJsonExport = { folders: [], diff --git a/libs/importer/spec/test-data/psono-json/folders.ts b/libs/importer/src/importers/spec-data/psono-json/folders.ts similarity index 96% rename from libs/importer/spec/test-data/psono-json/folders.ts rename to libs/importer/src/importers/spec-data/psono-json/folders.ts index d6e64b7cddb..5e2c9481515 100644 --- a/libs/importer/spec/test-data/psono-json/folders.ts +++ b/libs/importer/src/importers/spec-data/psono-json/folders.ts @@ -1,4 +1,4 @@ -import { PsonoJsonExport } from "../../../src/importers/psono/psono-json-types"; +import { PsonoJsonExport } from "../../psono/psono-json-types"; export const FoldersTestData: PsonoJsonExport = { folders: [ diff --git a/libs/importer/spec/test-data/psono-json/gpg.ts b/libs/importer/src/importers/spec-data/psono-json/gpg.ts similarity index 99% rename from libs/importer/spec/test-data/psono-json/gpg.ts rename to libs/importer/src/importers/spec-data/psono-json/gpg.ts index 4015b53aa4e..57494f4d761 100644 --- a/libs/importer/spec/test-data/psono-json/gpg.ts +++ b/libs/importer/src/importers/spec-data/psono-json/gpg.ts @@ -1,4 +1,4 @@ -import { PsonoJsonExport } from "../../../src/importers/psono/psono-json-types"; +import { PsonoJsonExport } from "../../psono/psono-json-types"; export const GPGData: PsonoJsonExport = { folders: [], diff --git a/libs/importer/spec/test-data/psono-json/notes.ts b/libs/importer/src/importers/spec-data/psono-json/notes.ts similarity index 82% rename from libs/importer/spec/test-data/psono-json/notes.ts rename to libs/importer/src/importers/spec-data/psono-json/notes.ts index 0317371456d..0e9859ee1ed 100644 --- a/libs/importer/spec/test-data/psono-json/notes.ts +++ b/libs/importer/src/importers/spec-data/psono-json/notes.ts @@ -1,4 +1,4 @@ -import { PsonoJsonExport } from "../../../src/importers/psono/psono-json-types"; +import { PsonoJsonExport } from "../../psono/psono-json-types"; export const NotesData: PsonoJsonExport = { folders: [], diff --git a/libs/importer/spec/test-data/psono-json/reduced-website-logins.ts b/libs/importer/src/importers/spec-data/psono-json/reduced-website-logins.ts similarity index 87% rename from libs/importer/spec/test-data/psono-json/reduced-website-logins.ts rename to libs/importer/src/importers/spec-data/psono-json/reduced-website-logins.ts index 4477c9d5240..9c286f59b52 100644 --- a/libs/importer/spec/test-data/psono-json/reduced-website-logins.ts +++ b/libs/importer/src/importers/spec-data/psono-json/reduced-website-logins.ts @@ -1,4 +1,4 @@ -import { PsonoJsonExport } from "../../../src/importers/psono/psono-json-types"; +import { PsonoJsonExport } from "../../psono/psono-json-types"; export const ReducedWebsiteLoginsData: PsonoJsonExport = { folders: [], diff --git a/libs/importer/spec/test-data/psono-json/subfolders.ts b/libs/importer/src/importers/spec-data/psono-json/subfolders.ts similarity index 97% rename from libs/importer/spec/test-data/psono-json/subfolders.ts rename to libs/importer/src/importers/spec-data/psono-json/subfolders.ts index eff55581da7..2aff686aa17 100644 --- a/libs/importer/spec/test-data/psono-json/subfolders.ts +++ b/libs/importer/src/importers/spec-data/psono-json/subfolders.ts @@ -1,4 +1,4 @@ -import { PsonoJsonExport } from "../../../src/importers/psono/psono-json-types"; +import { PsonoJsonExport } from "../../psono/psono-json-types"; export const SubFoldersTestData: PsonoJsonExport = { folders: [ diff --git a/libs/importer/spec/test-data/psono-json/totp.ts b/libs/importer/src/importers/spec-data/psono-json/totp.ts similarity index 85% rename from libs/importer/spec/test-data/psono-json/totp.ts rename to libs/importer/src/importers/spec-data/psono-json/totp.ts index 62d3c43431c..ec7cabf7ec9 100644 --- a/libs/importer/spec/test-data/psono-json/totp.ts +++ b/libs/importer/src/importers/spec-data/psono-json/totp.ts @@ -1,4 +1,4 @@ -import { PsonoJsonExport } from "../../../src/importers/psono/psono-json-types"; +import { PsonoJsonExport } from "../../psono/psono-json-types"; export const TOTPData: PsonoJsonExport = { folders: [], diff --git a/libs/importer/spec/test-data/psono-json/website-logins.ts b/libs/importer/src/importers/spec-data/psono-json/website-logins.ts similarity index 90% rename from libs/importer/spec/test-data/psono-json/website-logins.ts rename to libs/importer/src/importers/spec-data/psono-json/website-logins.ts index 85154090492..28a2f35328e 100644 --- a/libs/importer/spec/test-data/psono-json/website-logins.ts +++ b/libs/importer/src/importers/spec-data/psono-json/website-logins.ts @@ -1,4 +1,4 @@ -import { PsonoJsonExport } from "../../../src/importers/psono/psono-json-types"; +import { PsonoJsonExport } from "../../psono/psono-json-types"; export const WebsiteLoginsData: PsonoJsonExport = { folders: [], diff --git a/libs/importer/spec/test-data/roboform-csv/empty-folders.ts b/libs/importer/src/importers/spec-data/roboform-csv/empty-folders.ts similarity index 100% rename from libs/importer/spec/test-data/roboform-csv/empty-folders.ts rename to libs/importer/src/importers/spec-data/roboform-csv/empty-folders.ts diff --git a/libs/importer/spec/test-data/roboform-csv/with-folders.ts b/libs/importer/src/importers/spec-data/roboform-csv/with-folders.ts similarity index 100% rename from libs/importer/spec/test-data/roboform-csv/with-folders.ts rename to libs/importer/src/importers/spec-data/roboform-csv/with-folders.ts diff --git a/libs/importer/spec/test-data/safari-csv/old-simple-password-data.csv.ts b/libs/importer/src/importers/spec-data/safari-csv/old-simple-password-data.csv.ts similarity index 100% rename from libs/importer/spec/test-data/safari-csv/old-simple-password-data.csv.ts rename to libs/importer/src/importers/spec-data/safari-csv/old-simple-password-data.csv.ts diff --git a/libs/importer/spec/test-data/safari-csv/simple-password-data.csv.ts b/libs/importer/src/importers/spec-data/safari-csv/simple-password-data.csv.ts similarity index 100% rename from libs/importer/spec/test-data/safari-csv/simple-password-data.csv.ts rename to libs/importer/src/importers/spec-data/safari-csv/simple-password-data.csv.ts diff --git a/libs/importer/spec/test-data/safeincloud/test-data.xml.ts b/libs/importer/src/importers/spec-data/safeincloud/test-data.xml.ts similarity index 100% rename from libs/importer/spec/test-data/safeincloud/test-data.xml.ts rename to libs/importer/src/importers/spec-data/safeincloud/test-data.xml.ts diff --git a/libs/importer/spec/test-data/securesafe-csv/securesafe-example.csv.ts b/libs/importer/src/importers/spec-data/securesafe-csv/securesafe-example.csv.ts similarity index 100% rename from libs/importer/spec/test-data/securesafe-csv/securesafe-example.csv.ts rename to libs/importer/src/importers/spec-data/securesafe-csv/securesafe-example.csv.ts diff --git a/libs/importer/spec/test-data/zohovault/sample-zohovault-data.csv.ts b/libs/importer/src/importers/spec-data/zohovault/sample-zohovault-data.csv.ts similarity index 100% rename from libs/importer/spec/test-data/zohovault/sample-zohovault-data.csv.ts rename to libs/importer/src/importers/spec-data/zohovault/sample-zohovault-data.csv.ts diff --git a/libs/importer/spec/zohovault-csv-importer.spec.ts b/libs/importer/src/importers/zohovault-csv-importer.spec.ts similarity index 95% rename from libs/importer/spec/zohovault-csv-importer.spec.ts rename to libs/importer/src/importers/zohovault-csv-importer.spec.ts index 28318945291..e49b527cbbf 100644 --- a/libs/importer/spec/zohovault-csv-importer.spec.ts +++ b/libs/importer/src/importers/zohovault-csv-importer.spec.ts @@ -2,9 +2,8 @@ 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 { ZohoVaultCsvImporter } from "../src/importers"; - -import { data as samplezohovaultcsvdata } from "./test-data/zohovault/sample-zohovault-data.csv"; +import { data as samplezohovaultcsvdata } from "./spec-data/zohovault/sample-zohovault-data.csv"; +import { ZohoVaultCsvImporter } from "./zohovault-csv-importer"; const CipherData = [ { diff --git a/libs/importer/tsconfig.json b/libs/importer/tsconfig.json index 09eb33e2884..e16a16a0337 100644 --- a/libs/importer/tsconfig.json +++ b/libs/importer/tsconfig.json @@ -17,6 +17,6 @@ "@bitwarden/vault-export-core": ["../tools/export/vault-export/vault-export-core/src"] } }, - "include": ["src", "spec"], + "include": ["src"], "exclude": ["node_modules", "dist"] } diff --git a/libs/key-management/src/abstractions/key.service.ts b/libs/key-management/src/abstractions/key.service.ts index da59c2986b2..3cd9a0dbb21 100644 --- a/libs/key-management/src/abstractions/key.service.ts +++ b/libs/key-management/src/abstractions/key.service.ts @@ -3,31 +3,13 @@ import { Observable } from "rxjs"; import { EncryptedOrganizationKeyData } from "@bitwarden/common/admin-console/models/data/encrypted-organization-key.data"; -import { KdfConfig } from "@bitwarden/key-management"; - -// FIXME: remove `src` and fix import -// eslint-disable-next-line no-restricted-imports -import { ProfileOrganizationResponse } from "../../../common/src/admin-console/models/response/profile-organization.response"; -// FIXME: remove `src` and fix import -// eslint-disable-next-line no-restricted-imports -import { ProfileProviderOrganizationResponse } from "../../../common/src/admin-console/models/response/profile-provider-organization.response"; -// FIXME: remove `src` and fix import -// eslint-disable-next-line no-restricted-imports -import { ProfileProviderResponse } from "../../../common/src/admin-console/models/response/profile-provider.response"; -// FIXME: remove `src` and fix import -// eslint-disable-next-line no-restricted-imports -import { KeySuffixOptions, HashPurpose } from "../../../common/src/platform/enums"; -// FIXME: remove `src` and fix import -// eslint-disable-next-line no-restricted-imports -import { EncryptedString, EncString } from "../../../common/src/platform/models/domain/enc-string"; -// FIXME: remove `src` and fix import -// eslint-disable-next-line no-restricted-imports -import { SymmetricCryptoKey } from "../../../common/src/platform/models/domain/symmetric-crypto-key"; -// FIXME: remove `src` and fix import -// eslint-disable-next-line no-restricted-imports -import { OrganizationId, UserId } from "../../../common/src/types/guid"; -// FIXME: remove `src` and fix import -// eslint-disable-next-line no-restricted-imports +import { ProfileOrganizationResponse } from "@bitwarden/common/admin-console/models/response/profile-organization.response"; +import { ProfileProviderOrganizationResponse } from "@bitwarden/common/admin-console/models/response/profile-provider-organization.response"; +import { ProfileProviderResponse } from "@bitwarden/common/admin-console/models/response/profile-provider.response"; +import { KeySuffixOptions, HashPurpose } from "@bitwarden/common/platform/enums"; +import { EncryptedString, EncString } from "@bitwarden/common/platform/models/domain/enc-string"; +import { SymmetricCryptoKey } from "@bitwarden/common/platform/models/domain/symmetric-crypto-key"; +import { OrganizationId, UserId } from "@bitwarden/common/types/guid"; import { UserKey, MasterKey, @@ -36,7 +18,9 @@ import { CipherKey, UserPrivateKey, UserPublicKey, -} from "../../../common/src/types/key"; +} from "@bitwarden/common/types/key"; + +import { KdfConfig } from "../models/kdf-config"; export class UserPrivateKeyDecryptionFailedError extends Error { constructor() { diff --git a/libs/key-management/src/biometrics/biometric-state.service.spec.ts b/libs/key-management/src/biometrics/biometric-state.service.spec.ts index 2f11537127b..338826dfcba 100644 --- a/libs/key-management/src/biometrics/biometric-state.service.spec.ts +++ b/libs/key-management/src/biometrics/biometric-state.service.spec.ts @@ -1,15 +1,16 @@ import { firstValueFrom } from "rxjs"; import { EncryptedString } from "@bitwarden/common/platform/models/domain/enc-string"; -import { UserId } from "@bitwarden/common/types/guid"; - -import { makeEncString, trackEmissions } from "../../../common/spec"; import { + makeEncString, + trackEmissions, + FakeStateProvider, + FakeGlobalState, + FakeSingleUserState, FakeAccountService, mockAccountServiceWith, -} from "../../../common/spec/fake-account-service"; -import { FakeGlobalState, FakeSingleUserState } from "../../../common/spec/fake-state"; -import { FakeStateProvider } from "../../../common/spec/fake-state-provider"; +} from "@bitwarden/common/spec"; +import { UserId } from "@bitwarden/common/types/guid"; import { BiometricStateService, DefaultBiometricStateService } from "./biometric-state.service"; import { @@ -51,7 +52,7 @@ describe("BiometricStateService", () => { it("emits false when the require password on start state is undefined", async () => { const state = stateProvider.activeUser.getFake(REQUIRE_PASSWORD_ON_START); - state.nextState(undefined); + state.nextState(undefined as unknown as boolean); expect(await firstValueFrom(sut.requirePasswordOnStart$)).toBe(false); }); @@ -60,14 +61,14 @@ describe("BiometricStateService", () => { describe("encryptedClientKeyHalf$", () => { it("emits when the encryptedClientKeyHalf state changes", async () => { const state = stateProvider.activeUser.getFake(ENCRYPTED_CLIENT_KEY_HALF); - state.nextState(encryptedClientKeyHalf); + state.nextState(encryptedClientKeyHalf as unknown as EncryptedString); expect(await firstValueFrom(sut.encryptedClientKeyHalf$)).toEqual(encClientKeyHalf); }); it("emits false when the encryptedClientKeyHalf state is undefined", async () => { const state = stateProvider.activeUser.getFake(ENCRYPTED_CLIENT_KEY_HALF); - state.nextState(undefined); + state.nextState(undefined as unknown as EncryptedString); expect(await firstValueFrom(sut.encryptedClientKeyHalf$)).toBe(null); }); @@ -76,7 +77,7 @@ describe("BiometricStateService", () => { describe("fingerprintValidated$", () => { it("emits when the fingerprint validated state changes", async () => { const state = stateProvider.global.getFake(FINGERPRINT_VALIDATED); - state.stateSubject.next(undefined); + state.stateSubject.next(undefined as unknown as boolean); expect(await firstValueFrom(sut.fingerprintValidated$)).toBe(false); @@ -172,7 +173,7 @@ describe("BiometricStateService", () => { }); it("throws when called with no active user", async () => { - await accountService.switchAccount(null); + await accountService.switchAccount(null as unknown as UserId); await expect(sut.setUserPromptCancelled()).rejects.toThrow( "Cannot update biometric prompt cancelled state without an active user", ); @@ -261,7 +262,7 @@ describe("BiometricStateService", () => { it("emits false when biometricUnlockEnabled state is undefined", async () => { const state = stateProvider.activeUser.getFake(BIOMETRIC_UNLOCK_ENABLED); - state.nextState(undefined); + state.nextState(undefined as unknown as boolean); expect(await firstValueFrom(sut.biometricUnlockEnabled$)).toBe(false); }); @@ -291,7 +292,9 @@ describe("BiometricStateService", () => { }); it("returns false when the state is not set", async () => { - stateProvider.singleUser.getFake(userId, BIOMETRIC_UNLOCK_ENABLED).nextState(undefined); + stateProvider.singleUser + .getFake(userId, BIOMETRIC_UNLOCK_ENABLED) + .nextState(undefined as unknown as boolean); expect(await sut.getBiometricUnlockEnabled(userId)).toBe(false); }); diff --git a/libs/key-management/src/biometrics/biometric-state.service.ts b/libs/key-management/src/biometrics/biometric-state.service.ts index ae6e52ce632..837c266bee5 100644 --- a/libs/key-management/src/biometrics/biometric-state.service.ts +++ b/libs/key-management/src/biometrics/biometric-state.service.ts @@ -1,16 +1,8 @@ -// FIXME: Update this file to be type safe and remove this and next line -// @ts-strict-ignore import { Observable, firstValueFrom, map, combineLatest } from "rxjs"; -// FIXME: remove `src` and fix import -// eslint-disable-next-line no-restricted-imports -import { EncryptedString, EncString } from "../../../common/src/platform/models/domain/enc-string"; -// FIXME: remove `src` and fix import -// eslint-disable-next-line no-restricted-imports -import { ActiveUserState, GlobalState, StateProvider } from "../../../common/src/platform/state"; -// FIXME: remove `src` and fix import -// eslint-disable-next-line no-restricted-imports -import { UserId } from "../../../common/src/types/guid"; +import { EncryptedString, EncString } from "@bitwarden/common/platform/models/domain/enc-string"; +import { ActiveUserState, GlobalState, StateProvider } from "@bitwarden/common/platform/state"; +import { UserId } from "@bitwarden/common/types/guid"; import { BIOMETRIC_UNLOCK_ENABLED, @@ -34,7 +26,7 @@ export abstract class BiometricStateService { * * Tracks the currently active user */ - abstract encryptedClientKeyHalf$: Observable; + abstract encryptedClientKeyHalf$: Observable; /** * whether or not a password is required on first unlock after opening the application * @@ -71,42 +63,54 @@ export abstract class BiometricStateService { * @param value whether or not a password is required on first unlock after opening the application */ abstract setRequirePasswordOnStart(value: boolean): Promise; + /** * Updates the biometric unlock enabled state for the currently active user. * @param enabled whether or not to store a biometric key to unlock the vault */ abstract setBiometricUnlockEnabled(enabled: boolean): Promise; + /** * Gets the biometric unlock enabled state for the given user. * @param userId user Id to check */ abstract getBiometricUnlockEnabled(userId: UserId): Promise; + abstract setEncryptedClientKeyHalf(encryptedKeyHalf: EncString, userId?: UserId): Promise; - abstract getEncryptedClientKeyHalf(userId: UserId): Promise; + + abstract getEncryptedClientKeyHalf(userId: UserId): Promise; + abstract getRequirePasswordOnStart(userId: UserId): Promise; + abstract removeEncryptedClientKeyHalf(userId: UserId): Promise; + /** * Updates the active user's state to reflect that they've been warned about requiring password on start. */ abstract setDismissedRequirePasswordOnStartCallout(): Promise; + /** * Updates the active user's state to reflect that they've cancelled the biometric prompt. */ abstract setUserPromptCancelled(): Promise; + /** * Resets the given user's state to reflect that they haven't cancelled the biometric prompt. * @param userId the user to reset the prompt cancelled state for. If not provided, the currently active user will be used. */ abstract resetUserPromptCancelled(userId?: UserId): Promise; + /** * Resets all user's state to reflect that they haven't cancelled the biometric prompt. */ abstract resetAllPromptCancelled(): Promise; + /** * Updates the currently active user's setting for auto prompting for biometrics on application start and lock * @param prompt Whether or not to prompt for biometrics on application start. */ abstract setPromptAutomatically(prompt: boolean): Promise; + /** * Updates whether or not IPC has been validated by the user this session * @param validated the value to save @@ -115,7 +119,7 @@ export abstract class BiometricStateService { abstract updateLastProcessReload(): Promise; - abstract getLastProcessReload(): Promise; + abstract getLastProcessReload(): Promise; abstract logout(userId: UserId): Promise; } @@ -123,20 +127,20 @@ export abstract class BiometricStateService { export class DefaultBiometricStateService implements BiometricStateService { private biometricUnlockEnabledState: ActiveUserState; private requirePasswordOnStartState: ActiveUserState; - private encryptedClientKeyHalfState: ActiveUserState; + private encryptedClientKeyHalfState: ActiveUserState; private dismissedRequirePasswordOnStartCalloutState: ActiveUserState; private promptCancelledState: GlobalState>; private promptAutomaticallyState: ActiveUserState; private fingerprintValidatedState: GlobalState; private lastProcessReloadState: GlobalState; biometricUnlockEnabled$: Observable; - encryptedClientKeyHalf$: Observable; + encryptedClientKeyHalf$: Observable; requirePasswordOnStart$: Observable; dismissedRequirePasswordOnStartCallout$: Observable; promptCancelled$: Observable; promptAutomatically$: Observable; fingerprintValidated$: Observable; - lastProcessReload$: Observable; + lastProcessReload$: Observable; constructor(private stateProvider: StateProvider) { this.biometricUnlockEnabledState = this.stateProvider.getActive(BIOMETRIC_UNLOCK_ENABLED); @@ -164,7 +168,7 @@ export class DefaultBiometricStateService implements BiometricStateService { this.promptCancelledState.state$, ]).pipe( map(([userId, record]) => { - return record?.[userId] ?? false; + return userId != null ? (record?.[userId] ?? false) : false; }), ); this.promptAutomaticallyState = this.stateProvider.getActive(PROMPT_AUTOMATICALLY); @@ -188,7 +192,7 @@ export class DefaultBiometricStateService implements BiometricStateService { } async setRequirePasswordOnStart(value: boolean): Promise { - let currentActiveId: UserId; + let currentActiveId: UserId | undefined = undefined; await this.requirePasswordOnStartState.update( (_, [userId]) => { currentActiveId = userId; @@ -198,7 +202,7 @@ export class DefaultBiometricStateService implements BiometricStateService { combineLatestWith: this.requirePasswordOnStartState.combinedState$, }, ); - if (!value) { + if (!value && currentActiveId) { await this.removeEncryptedClientKeyHalf(currentActiveId); } } @@ -222,7 +226,7 @@ export class DefaultBiometricStateService implements BiometricStateService { )); } - async getEncryptedClientKeyHalf(userId: UserId): Promise { + async getEncryptedClientKeyHalf(userId: UserId): Promise { return await firstValueFrom( this.stateProvider .getUser(userId, ENCRYPTED_CLIENT_KEY_HALF) @@ -244,7 +248,9 @@ export class DefaultBiometricStateService implements BiometricStateService { async resetUserPromptCancelled(userId: UserId): Promise { await this.stateProvider.getGlobal(PROMPT_CANCELLED).update( (data, activeUserId) => { - delete data[userId ?? activeUserId]; + if (data != null) { + delete data[userId ?? activeUserId]; + } return data; }, { @@ -257,8 +263,10 @@ export class DefaultBiometricStateService implements BiometricStateService { async setUserPromptCancelled(): Promise { await this.promptCancelledState.update( (record, userId) => { - record ??= {}; - record[userId] = true; + if (userId != null) { + record ??= {}; + record[userId] = true; + } return record; }, { @@ -291,13 +299,13 @@ export class DefaultBiometricStateService implements BiometricStateService { await this.lastProcessReloadState.update(() => new Date()); } - async getLastProcessReload(): Promise { + async getLastProcessReload(): Promise { return await firstValueFrom(this.lastProcessReload$); } } function encryptedClientKeyHalfToEncString( - encryptedKeyHalf: EncryptedString | undefined, -): EncString { + encryptedKeyHalf: EncryptedString | null | undefined, +): EncString | null { return encryptedKeyHalf == null ? null : new EncString(encryptedKeyHalf); } diff --git a/libs/key-management/src/biometrics/biometric.state.spec.ts b/libs/key-management/src/biometrics/biometric.state.spec.ts index 94ae5217f47..b961808cea7 100644 --- a/libs/key-management/src/biometrics/biometric.state.spec.ts +++ b/libs/key-management/src/biometrics/biometric.state.spec.ts @@ -1,4 +1,3 @@ -import { EncryptedString } from "@bitwarden/common/platform/models/domain/enc-string"; import { KeyDefinition, UserKeyDefinition } from "@bitwarden/common/platform/state"; import { @@ -21,12 +20,7 @@ describe.each([ [FINGERPRINT_VALIDATED, true], ])( "deserializes state %s", - ( - ...args: - | [UserKeyDefinition, EncryptedString] - | [UserKeyDefinition, boolean] - | [KeyDefinition, boolean] - ) => { + (...args: [UserKeyDefinition | KeyDefinition, unknown]) => { function testDeserialization( keyDefinition: UserKeyDefinition | KeyDefinition, state: T, diff --git a/libs/key-management/src/biometrics/biometric.state.ts b/libs/key-management/src/biometrics/biometric.state.ts index e5ea4fbae3b..277d35c176e 100644 --- a/libs/key-management/src/biometrics/biometric.state.ts +++ b/libs/key-management/src/biometrics/biometric.state.ts @@ -1,16 +1,10 @@ -// FIXME: remove `src` and fix import -// eslint-disable-next-line no-restricted-imports -import { EncryptedString } from "../../../common/src/platform/models/domain/enc-string"; -// FIXME: remove `src` and fix import -// eslint-disable-next-line no-restricted-imports +import { EncryptedString } from "@bitwarden/common/platform/models/domain/enc-string"; import { KeyDefinition, BIOMETRIC_SETTINGS_DISK, UserKeyDefinition, -} from "../../../common/src/platform/state"; -// FIXME: remove `src` and fix import -// eslint-disable-next-line no-restricted-imports -import { UserId } from "../../../common/src/types/guid"; +} from "@bitwarden/common/platform/state"; +import { UserId } from "@bitwarden/common/types/guid"; /** * Indicates whether the user elected to store a biometric key to unlock their vault. diff --git a/libs/key-management/src/key.service.spec.ts b/libs/key-management/src/key.service.spec.ts index 97ef878a446..a2cc69f2b21 100644 --- a/libs/key-management/src/key.service.spec.ts +++ b/libs/key-management/src/key.service.spec.ts @@ -1,82 +1,43 @@ import { mock } from "jest-mock-extended"; import { bufferCount, firstValueFrom, lastValueFrom, of, take, tap } from "rxjs"; +import { PinServiceAbstraction } from "@bitwarden/auth/common"; import { EncryptedOrganizationKeyData } from "@bitwarden/common/admin-console/models/data/encrypted-organization-key.data"; +import { FakeMasterPasswordService } from "@bitwarden/common/auth/services/master-password/fake-master-password.service"; import { EncryptService } from "@bitwarden/common/key-management/crypto/abstractions/encrypt.service"; - -// FIXME: remove `src` and fix import -// eslint-disable-next-line no-restricted-imports -import { PinServiceAbstraction } from "../../auth/src/common/abstractions"; +import { CryptoFunctionService } from "@bitwarden/common/platform/abstractions/crypto-function.service"; +import { KeyGenerationService } from "@bitwarden/common/platform/abstractions/key-generation.service"; +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 { Encrypted } from "@bitwarden/common/platform/interfaces/encrypted"; +import { Utils } from "@bitwarden/common/platform/misc/utils"; +import { EncString, EncryptedString } from "@bitwarden/common/platform/models/domain/enc-string"; +import { SymmetricCryptoKey } from "@bitwarden/common/platform/models/domain/symmetric-crypto-key"; +import { USER_ENCRYPTED_ORGANIZATION_KEYS } from "@bitwarden/common/platform/services/key-state/org-keys.state"; +import { USER_ENCRYPTED_PROVIDER_KEYS } from "@bitwarden/common/platform/services/key-state/provider-keys.state"; +import { + USER_ENCRYPTED_PRIVATE_KEY, + USER_EVER_HAD_USER_KEY, + USER_KEY, +} from "@bitwarden/common/platform/services/key-state/user-key.state"; +import { UserKeyDefinition } from "@bitwarden/common/platform/state"; +import { VAULT_TIMEOUT } from "@bitwarden/common/services/vault-timeout/vault-timeout-settings.state"; import { awaitAsync, makeEncString, makeStaticByteArray, makeSymmetricCryptoKey, -} from "../../common/spec"; -import { FakeAccountService, mockAccountServiceWith } from "../../common/spec/fake-account-service"; -import { FakeActiveUserState, FakeSingleUserState } from "../../common/spec/fake-state"; -import { FakeStateProvider } from "../../common/spec/fake-state-provider"; -// FIXME: remove `src` and fix import -// eslint-disable-next-line no-restricted-imports -import { FakeMasterPasswordService } from "../../common/src/auth/services/master-password/fake-master-password.service"; -// FIXME: remove `src` and fix import -// eslint-disable-next-line no-restricted-imports -import { CryptoFunctionService } from "../../common/src/platform/abstractions/crypto-function.service"; -// FIXME: remove `src` and fix import -// eslint-disable-next-line no-restricted-imports -import { KeyGenerationService } from "../../common/src/platform/abstractions/key-generation.service"; -// FIXME: remove `src` and fix import -// eslint-disable-next-line no-restricted-imports -import { LogService } from "../../common/src/platform/abstractions/log.service"; -// FIXME: remove `src` and fix import -// eslint-disable-next-line no-restricted-imports -import { PlatformUtilsService } from "../../common/src/platform/abstractions/platform-utils.service"; -// FIXME: remove `src` and fix import -// eslint-disable-next-line no-restricted-imports -import { StateService } from "../../common/src/platform/abstractions/state.service"; -// FIXME: remove `src` and fix import -// eslint-disable-next-line no-restricted-imports -import { Encrypted } from "../../common/src/platform/interfaces/encrypted"; -// FIXME: remove `src` and fix import -// eslint-disable-next-line no-restricted-imports -import { Utils } from "../../common/src/platform/misc/utils"; -// FIXME: remove `src` and fix import -// eslint-disable-next-line no-restricted-imports -import { EncString, EncryptedString } from "../../common/src/platform/models/domain/enc-string"; -// FIXME: remove `src` and fix import -// eslint-disable-next-line no-restricted-imports -import { SymmetricCryptoKey } from "../../common/src/platform/models/domain/symmetric-crypto-key"; -// FIXME: remove `src` and fix import -// eslint-disable-next-line no-restricted-imports -import { USER_ENCRYPTED_ORGANIZATION_KEYS } from "../../common/src/platform/services/key-state/org-keys.state"; -// FIXME: remove `src` and fix import -// eslint-disable-next-line no-restricted-imports -import { USER_ENCRYPTED_PROVIDER_KEYS } from "../../common/src/platform/services/key-state/provider-keys.state"; -// FIXME: remove `src` and fix import -// eslint-disable-next-line no-restricted-imports -import { - USER_ENCRYPTED_PRIVATE_KEY, - USER_EVER_HAD_USER_KEY, - USER_KEY, -} from "../../common/src/platform/services/key-state/user-key.state"; -// FIXME: remove `src` and fix import -// eslint-disable-next-line no-restricted-imports -import { UserKeyDefinition } from "../../common/src/platform/state"; -// FIXME: remove `src` and fix import -// eslint-disable-next-line no-restricted-imports -import { VAULT_TIMEOUT } from "../../common/src/services/vault-timeout/vault-timeout-settings.state"; -// FIXME: remove `src` and fix import -// eslint-disable-next-line no-restricted-imports -import { CsprngArray } from "../../common/src/types/csprng"; -// FIXME: remove `src` and fix import -// eslint-disable-next-line no-restricted-imports -import { OrganizationId, UserId } from "../../common/src/types/guid"; -// FIXME: remove `src` and fix import -// eslint-disable-next-line no-restricted-imports -import { UserKey, MasterKey } from "../../common/src/types/key"; -// FIXME: remove `src` and fix import -// eslint-disable-next-line no-restricted-imports -import { VaultTimeoutStringType } from "../../common/src/types/vault-timeout.type"; + FakeAccountService, + mockAccountServiceWith, + FakeStateProvider, + FakeActiveUserState, + FakeSingleUserState, +} from "@bitwarden/common/spec"; +import { CsprngArray } from "@bitwarden/common/types/csprng"; +import { OrganizationId, UserId } from "@bitwarden/common/types/guid"; +import { UserKey, MasterKey } from "@bitwarden/common/types/key"; +import { VaultTimeoutStringType } from "@bitwarden/common/types/vault-timeout.type"; import { KdfConfigService } from "./abstractions/kdf-config.service"; import { UserPrivateKeyDecryptionFailedError } from "./abstractions/key.service"; diff --git a/libs/key-management/src/key.service.ts b/libs/key-management/src/key.service.ts index a6656c81f2d..a9d63eb17d4 100644 --- a/libs/key-management/src/key.service.ts +++ b/libs/key-management/src/key.service.ts @@ -12,94 +12,37 @@ import { switchMap, } from "rxjs"; +import { PinServiceAbstraction } from "@bitwarden/auth/common"; +import { EncryptedOrganizationKeyData } from "@bitwarden/common/admin-console/models/data/encrypted-organization-key.data"; +import { BaseEncryptedOrganizationKey } from "@bitwarden/common/admin-console/models/domain/encrypted-organization-key"; +import { ProfileOrganizationResponse } from "@bitwarden/common/admin-console/models/response/profile-organization.response"; +import { ProfileProviderOrganizationResponse } from "@bitwarden/common/admin-console/models/response/profile-provider-organization.response"; +import { ProfileProviderResponse } from "@bitwarden/common/admin-console/models/response/profile-provider.response"; +import { AccountService } from "@bitwarden/common/auth/abstractions/account.service"; +import { InternalMasterPasswordServiceAbstraction } from "@bitwarden/common/auth/abstractions/master-password.service.abstraction"; import { EncryptService } from "@bitwarden/common/key-management/crypto/abstractions/encrypt.service"; - -// FIXME: remove `src` and fix import -// eslint-disable-next-line no-restricted-imports -import { PinServiceAbstraction } from "../../auth/src/common/abstractions"; -// FIXME: remove `src` and fix import -// eslint-disable-next-line no-restricted-imports -import { EncryptedOrganizationKeyData } from "../../common/src/admin-console/models/data/encrypted-organization-key.data"; -// FIXME: remove `src` and fix import -// eslint-disable-next-line no-restricted-imports -import { BaseEncryptedOrganizationKey } from "../../common/src/admin-console/models/domain/encrypted-organization-key"; -// FIXME: remove `src` and fix import -// eslint-disable-next-line no-restricted-imports -import { ProfileOrganizationResponse } from "../../common/src/admin-console/models/response/profile-organization.response"; -// FIXME: remove `src` and fix import -// eslint-disable-next-line no-restricted-imports -import { ProfileProviderOrganizationResponse } from "../../common/src/admin-console/models/response/profile-provider-organization.response"; -// FIXME: remove `src` and fix import -// eslint-disable-next-line no-restricted-imports -import { ProfileProviderResponse } from "../../common/src/admin-console/models/response/profile-provider.response"; -// FIXME: remove `src` and fix import -// eslint-disable-next-line no-restricted-imports -import { AccountService } from "../../common/src/auth/abstractions/account.service"; -// FIXME: remove `src` and fix import -// eslint-disable-next-line no-restricted-imports -import { InternalMasterPasswordServiceAbstraction } from "../../common/src/auth/abstractions/master-password.service.abstraction"; -// FIXME: remove `src` and fix import -// eslint-disable-next-line no-restricted-imports -import { CryptoFunctionService } from "../../common/src/platform/abstractions/crypto-function.service"; -// FIXME: remove `src` and fix import -// eslint-disable-next-line no-restricted-imports -// FIXME: remove `src` and fix import -// eslint-disable-next-line no-restricted-imports -import { KeyGenerationService } from "../../common/src/platform/abstractions/key-generation.service"; -// FIXME: remove `src` and fix import -// eslint-disable-next-line no-restricted-imports -import { LogService } from "../../common/src/platform/abstractions/log.service"; -// FIXME: remove `src` and fix import -// eslint-disable-next-line no-restricted-imports -import { PlatformUtilsService } from "../../common/src/platform/abstractions/platform-utils.service"; -// FIXME: remove `src` and fix import -// eslint-disable-next-line no-restricted-imports -import { StateService } from "../../common/src/platform/abstractions/state.service"; -// FIXME: remove `src` and fix import -// eslint-disable-next-line no-restricted-imports -import { KeySuffixOptions, HashPurpose } from "../../common/src/platform/enums"; -// FIXME: remove `src` and fix import -// eslint-disable-next-line no-restricted-imports -import { convertValues } from "../../common/src/platform/misc/convert-values"; -// FIXME: remove `src` and fix import -// eslint-disable-next-line no-restricted-imports -import { Utils } from "../../common/src/platform/misc/utils"; -// FIXME: remove `src` and fix import -// eslint-disable-next-line no-restricted-imports -import { EFFLongWordList } from "../../common/src/platform/misc/wordlist"; -// FIXME: remove `src` and fix import -// eslint-disable-next-line no-restricted-imports -import { EncString, EncryptedString } from "../../common/src/platform/models/domain/enc-string"; -// FIXME: remove `src` and fix import -// eslint-disable-next-line no-restricted-imports -import { SymmetricCryptoKey } from "../../common/src/platform/models/domain/symmetric-crypto-key"; -// FIXME: remove `src` and fix import -// eslint-disable-next-line no-restricted-imports -import { USER_ENCRYPTED_ORGANIZATION_KEYS } from "../../common/src/platform/services/key-state/org-keys.state"; -// FIXME: remove `src` and fix import -// eslint-disable-next-line no-restricted-imports -import { USER_ENCRYPTED_PROVIDER_KEYS } from "../../common/src/platform/services/key-state/provider-keys.state"; -// FIXME: remove `src` and fix import -// eslint-disable-next-line no-restricted-imports +import { CryptoFunctionService } from "@bitwarden/common/platform/abstractions/crypto-function.service"; +import { KeyGenerationService } from "@bitwarden/common/platform/abstractions/key-generation.service"; +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 { KeySuffixOptions, HashPurpose } from "@bitwarden/common/platform/enums"; +import { convertValues } from "@bitwarden/common/platform/misc/convert-values"; +import { Utils } from "@bitwarden/common/platform/misc/utils"; +import { EFFLongWordList } from "@bitwarden/common/platform/misc/wordlist"; +import { EncString, EncryptedString } from "@bitwarden/common/platform/models/domain/enc-string"; +import { SymmetricCryptoKey } from "@bitwarden/common/platform/models/domain/symmetric-crypto-key"; +import { USER_ENCRYPTED_ORGANIZATION_KEYS } from "@bitwarden/common/platform/services/key-state/org-keys.state"; +import { USER_ENCRYPTED_PROVIDER_KEYS } from "@bitwarden/common/platform/services/key-state/provider-keys.state"; import { USER_ENCRYPTED_PRIVATE_KEY, USER_EVER_HAD_USER_KEY, USER_KEY, -} from "../../common/src/platform/services/key-state/user-key.state"; -// FIXME: remove `src` and fix import -// eslint-disable-next-line no-restricted-imports -import { ActiveUserState, StateProvider } from "../../common/src/platform/state"; -// FIXME: remove `src` and fix import -// eslint-disable-next-line no-restricted-imports -import { VAULT_TIMEOUT } from "../../common/src/services/vault-timeout/vault-timeout-settings.state"; -// FIXME: remove `src` and fix import -// eslint-disable-next-line no-restricted-imports -import { CsprngArray } from "../../common/src/types/csprng"; -// FIXME: remove `src` and fix import -// eslint-disable-next-line no-restricted-imports -import { OrganizationId, ProviderId, UserId } from "../../common/src/types/guid"; -// FIXME: remove `src` and fix import -// eslint-disable-next-line no-restricted-imports +} from "@bitwarden/common/platform/services/key-state/user-key.state"; +import { ActiveUserState, StateProvider } from "@bitwarden/common/platform/state"; +import { VAULT_TIMEOUT } from "@bitwarden/common/services/vault-timeout/vault-timeout-settings.state"; +import { CsprngArray } from "@bitwarden/common/types/csprng"; +import { OrganizationId, ProviderId, UserId } from "@bitwarden/common/types/guid"; import { OrgKey, UserKey, @@ -108,10 +51,8 @@ import { CipherKey, UserPrivateKey, UserPublicKey, -} from "../../common/src/types/key"; -// FIXME: remove `src` and fix import -// eslint-disable-next-line no-restricted-imports -import { VaultTimeoutStringType } from "../../common/src/types/vault-timeout.type"; +} from "@bitwarden/common/types/key"; +import { VaultTimeoutStringType } from "@bitwarden/common/types/vault-timeout.type"; import { KdfConfigService } from "./abstractions/kdf-config.service"; import { @@ -427,20 +368,20 @@ export class DefaultKeyService implements KeyServiceAbstraction { await this.stateProvider.getUser(userId, USER_ENCRYPTED_ORGANIZATION_KEYS).update(() => { const encOrgKeyData: { [orgId: string]: EncryptedOrganizationKeyData } = {}; - orgs.forEach((org) => { + for (const org of orgs) { encOrgKeyData[org.id] = { type: "organization", key: org.key, }; - }); + } - providerOrgs.forEach((org) => { + for (const org of providerOrgs) { encOrgKeyData[org.id] = { type: "provider", providerId: org.providerId, key: org.key, }; - }); + } return encOrgKeyData; }); } diff --git a/libs/key-management/src/user-asymmetric-key-regeneration/services/default-user-asymmetric-key-regeneration.service.ts b/libs/key-management/src/user-asymmetric-key-regeneration/services/default-user-asymmetric-key-regeneration.service.ts index 3110ebad637..2686e950974 100644 --- a/libs/key-management/src/user-asymmetric-key-regeneration/services/default-user-asymmetric-key-regeneration.service.ts +++ b/libs/key-management/src/user-asymmetric-key-regeneration/services/default-user-asymmetric-key-regeneration.service.ts @@ -103,7 +103,7 @@ export class DefaultUserAsymmetricKeysRegenerationService } // The private isn't decryptable, check to see if we can decrypt something with the userKey. - const userKeyCanDecrypt = await this.userKeyCanDecrypt(userKey); + const userKeyCanDecrypt = await this.userKeyCanDecrypt(userKey, userId); if (userKeyCanDecrypt) { this.logService.info( "[UserAsymmetricKeyRegeneration] User Asymmetric Key decryption failure detected, attempting regeneration.", @@ -155,8 +155,8 @@ export class DefaultUserAsymmetricKeysRegenerationService ); } - private async userKeyCanDecrypt(userKey: UserKey): Promise { - const ciphers = await this.cipherService.getAll(); + private async userKeyCanDecrypt(userKey: UserKey, userId: UserId): Promise { + const ciphers = await this.cipherService.getAll(userId); const cipher = ciphers.find((cipher) => cipher.organizationId == null); if (cipher != null) { diff --git a/libs/tools/export/vault-export/vault-export-core/src/services/individual-vault-export.service.ts b/libs/tools/export/vault-export/vault-export-core/src/services/individual-vault-export.service.ts index d45c39eebbd..1718bd54234 100644 --- a/libs/tools/export/vault-export/vault-export-core/src/services/individual-vault-export.service.ts +++ b/libs/tools/export/vault-export/vault-export-core/src/services/individual-vault-export.service.ts @@ -1,10 +1,11 @@ // FIXME: Update this file to be type safe and remove this and next line // @ts-strict-ignore import * as papa from "papaparse"; -import { firstValueFrom, map } from "rxjs"; +import { firstValueFrom } from "rxjs"; import { PinServiceAbstraction } from "@bitwarden/auth/common"; import { AccountService } from "@bitwarden/common/auth/abstractions/account.service"; +import { getUserId } from "@bitwarden/common/auth/services/account.service"; import { EncryptService } from "@bitwarden/common/key-management/crypto/abstractions/encrypt.service"; import { CipherWithIdExport, FolderWithIdExport } from "@bitwarden/common/models/export"; import { CryptoFunctionService } from "@bitwarden/common/platform/abstractions/crypto-function.service"; @@ -32,8 +33,6 @@ export class IndividualVaultExportService extends BaseVaultExportService implements IndividualVaultExportServiceAbstraction { - private activeUserId$ = this.accountService.activeAccount$.pipe(map((a) => a?.id)); - constructor( private folderService: FolderService, private cipherService: CipherService, @@ -63,7 +62,7 @@ export class IndividualVaultExportService let decFolders: FolderView[] = []; let decCiphers: CipherView[] = []; const promises = []; - const activeUserId = await firstValueFrom(this.activeUserId$); + const activeUserId = await firstValueFrom(this.accountService.activeAccount$.pipe(getUserId)); promises.push( firstValueFrom(this.folderService.folderViews$(activeUserId)).then((folders) => { @@ -72,7 +71,7 @@ export class IndividualVaultExportService ); promises.push( - this.cipherService.getAllDecrypted().then((ciphers) => { + this.cipherService.getAllDecrypted(activeUserId).then((ciphers) => { decCiphers = ciphers.filter((f) => f.deletedDate == null); }), ); @@ -90,7 +89,7 @@ export class IndividualVaultExportService let folders: Folder[] = []; let ciphers: Cipher[] = []; const promises = []; - const activeUserId = await firstValueFrom(this.activeUserId$); + const activeUserId = await firstValueFrom(this.accountService.activeAccount$.pipe(getUserId)); promises.push( firstValueFrom(this.folderService.folders$(activeUserId)).then((f) => { @@ -99,7 +98,7 @@ export class IndividualVaultExportService ); promises.push( - this.cipherService.getAll().then((c) => { + this.cipherService.getAll(activeUserId).then((c) => { ciphers = c.filter((f) => f.deletedDate == null); }), ); @@ -107,7 +106,7 @@ export class IndividualVaultExportService await Promise.all(promises); const userKey = await this.keyService.getUserKeyWithLegacySupport( - await firstValueFrom(this.activeUserId$), + await firstValueFrom(this.accountService.activeAccount$.pipe(getUserId)), ); const encKeyValidation = await this.encryptService.encrypt(Utils.newGuid(), userKey); diff --git a/libs/tools/export/vault-export/vault-export-core/src/services/org-vault-export.service.ts b/libs/tools/export/vault-export/vault-export-core/src/services/org-vault-export.service.ts index 86c19950b7c..0961347664d 100644 --- a/libs/tools/export/vault-export/vault-export-core/src/services/org-vault-export.service.ts +++ b/libs/tools/export/vault-export/vault-export-core/src/services/org-vault-export.service.ts @@ -1,7 +1,7 @@ // FIXME: Update this file to be type safe and remove this and next line // @ts-strict-ignore import * as papa from "papaparse"; -import { firstValueFrom, map } from "rxjs"; +import { firstValueFrom } from "rxjs"; import { CollectionService, @@ -13,6 +13,7 @@ import { import { PinServiceAbstraction } from "@bitwarden/auth/common"; import { ApiService } from "@bitwarden/common/abstractions/api.service"; import { AccountService } from "@bitwarden/common/auth/abstractions/account.service"; +import { getUserId } from "@bitwarden/common/auth/services/account.service"; import { EncryptService } from "@bitwarden/common/key-management/crypto/abstractions/encrypt.service"; import { CipherWithIdExport, CollectionWithIdExport } from "@bitwarden/common/models/export"; import { CryptoFunctionService } from "@bitwarden/common/platform/abstractions/crypto-function.service"; @@ -94,9 +95,7 @@ export class OrganizationVaultExportService const decCollections: CollectionView[] = []; const decCiphers: CipherView[] = []; const promises = []; - const activeUserId = await firstValueFrom( - this.accountService.activeAccount$.pipe(map((a) => a?.id)), - ); + const activeUserId = await firstValueFrom(this.accountService.activeAccount$.pipe(getUserId)); promises.push( this.apiService.getOrganizationExport(organizationId).then((exportData) => { @@ -184,6 +183,7 @@ export class OrganizationVaultExportService let allDecCiphers: CipherView[] = []; let decCollections: CollectionView[] = []; const promises = []; + const activeUserId = await firstValueFrom(this.accountService.activeAccount$.pipe(getUserId)); promises.push( this.collectionService.getAllDecrypted().then(async (collections) => { @@ -192,7 +192,7 @@ export class OrganizationVaultExportService ); promises.push( - this.cipherService.getAllDecrypted().then((ciphers) => { + this.cipherService.getAllDecrypted(activeUserId).then((ciphers) => { allDecCiphers = ciphers; }), ); @@ -216,6 +216,7 @@ export class OrganizationVaultExportService let allCiphers: Cipher[] = []; let encCollections: Collection[] = []; const promises = []; + const activeUserId = await firstValueFrom(this.accountService.activeAccount$.pipe(getUserId)); promises.push( this.collectionService.getAll().then((collections) => { @@ -224,7 +225,7 @@ export class OrganizationVaultExportService ); promises.push( - this.cipherService.getAll().then((ciphers) => { + this.cipherService.getAll(activeUserId).then((ciphers) => { allCiphers = ciphers; }), ); diff --git a/libs/tools/export/vault-export/vault-export-ui/src/components/export.component.ts b/libs/tools/export/vault-export/vault-export-ui/src/components/export.component.ts index 934c35f8060..c992ecd78cf 100644 --- a/libs/tools/export/vault-export/vault-export-ui/src/components/export.component.ts +++ b/libs/tools/export/vault-export/vault-export-ui/src/components/export.component.ts @@ -42,7 +42,6 @@ import { EventType } from "@bitwarden/common/enums"; import { FileDownloadService } from "@bitwarden/common/platform/abstractions/file-download/file-download.service"; import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; import { LogService } from "@bitwarden/common/platform/abstractions/log.service"; -import { PlatformUtilsService } from "@bitwarden/common/platform/abstractions/platform-utils.service"; import { Utils } from "@bitwarden/common/platform/misc/utils"; import { AsyncActionsModule, @@ -56,7 +55,8 @@ import { SelectModule, ToastService, } from "@bitwarden/components"; -import { PasswordGenerationServiceAbstraction } from "@bitwarden/generator-legacy"; +import { GeneratorServicesModule } from "@bitwarden/generator-components"; +import { CredentialGeneratorService, GenerateRequest, Generators } from "@bitwarden/generator-core"; import { VaultExportServiceAbstraction } from "@bitwarden/vault-export-core"; import { EncryptedExportType } from "../enums/encrypted-export-type.enum"; @@ -81,6 +81,7 @@ import { ExportScopeCalloutComponent } from "./export-scope-callout.component"; ExportScopeCalloutComponent, UserVerificationDialogComponent, PasswordStrengthV2Component, + GeneratorServicesModule, ], }) export class ExportComponent implements OnInit, OnDestroy, AfterViewInit { @@ -175,14 +176,14 @@ export class ExportComponent implements OnInit, OnDestroy, AfterViewInit { private destroy$ = new Subject(); private onlyManagedCollections = true; + private onGenerate$ = new Subject(); constructor( protected i18nService: I18nService, protected toastService: ToastService, protected exportService: VaultExportServiceAbstraction, protected eventCollectionService: EventCollectionService, - protected passwordGenerationService: PasswordGenerationServiceAbstraction, - private platformUtilsService: PlatformUtilsService, + protected generatorService: CredentialGeneratorService, private policyService: PolicyService, private logService: LogService, private formBuilder: UntypedFormBuilder, @@ -218,6 +219,17 @@ export class ExportComponent implements OnInit, OnDestroy, AfterViewInit { const userId = await firstValueFrom(getUserId(this.accountService.activeAccount$)); + // Wire up the password generation for the password-protected export + this.generatorService + .generate$(Generators.password, { on$: this.onGenerate$ }) + .pipe(takeUntil(this.destroy$)) + .subscribe((generated) => { + this.exportForm.patchValue({ + filePassword: generated.credential, + confirmFilePassword: generated.credential, + }); + }); + if (this.organizationId) { this.organizations$ = this.organizationService .memberOrganizations$(userId) @@ -302,10 +314,7 @@ export class ExportComponent implements OnInit, OnDestroy, AfterViewInit { } generatePassword = async () => { - const [options] = await this.passwordGenerationService.getOptions(); - const generatedPassword = await this.passwordGenerationService.generatePassword(options); - this.exportForm.get("filePassword").setValue(generatedPassword); - this.exportForm.get("confirmFilePassword").setValue(generatedPassword); + this.onGenerate$.next({ source: "export" }); }; submit = async () => { diff --git a/libs/tools/export/vault-export/vault-export-ui/tsconfig.json b/libs/tools/export/vault-export/vault-export-ui/tsconfig.json index 1732817986e..6f2a0242dac 100644 --- a/libs/tools/export/vault-export/vault-export-ui/tsconfig.json +++ b/libs/tools/export/vault-export/vault-export-ui/tsconfig.json @@ -9,6 +9,7 @@ "@bitwarden/common/*": ["../../../../common/src/*"], "@bitwarden/components": ["../../../../components/src"], "@bitwarden/generator-core": ["../../../../tools/generator/core/src"], + "@bitwarden/generator-components": ["../../../../tools/generator/components/src"], "@bitwarden/generator-history": ["../../../../tools/generator/extensions/history/src"], "@bitwarden/generator-legacy": ["../../../../tools/generator/extensions/legacy/src"], "@bitwarden/generator-navigation": ["../../../../tools/generator/extensions/navigation/src"], diff --git a/libs/vault/src/abstractions/change-login-password.service.ts b/libs/vault/src/abstractions/change-login-password.service.ts new file mode 100644 index 00000000000..c89162d42be --- /dev/null +++ b/libs/vault/src/abstractions/change-login-password.service.ts @@ -0,0 +1,10 @@ +import { CipherView } from "@bitwarden/common/vault/models/view/cipher.view"; + +export abstract class ChangeLoginPasswordService { + /** + * Attempts to find a well-known change password URL for the given cipher. Only works for Login ciphers with at + * least one http/https URL. If no well-known change password URL is found, the first URL is returned. + * Non-Login ciphers and Logins with no valid http/https URLs return null. + */ + abstract getChangePasswordUrl(cipher: CipherView): Promise; +} diff --git a/libs/vault/src/cipher-form/components/attachments/cipher-attachments.component.spec.ts b/libs/vault/src/cipher-form/components/attachments/cipher-attachments.component.spec.ts index 1ee9a985f5a..ce12ca95e1e 100644 --- a/libs/vault/src/cipher-form/components/attachments/cipher-attachments.component.spec.ts +++ b/libs/vault/src/cipher-form/components/attachments/cipher-attachments.component.spec.ts @@ -110,7 +110,7 @@ describe("CipherAttachmentsComponent", () => { it("fetches cipherView using `cipherId`", async () => { await component.ngOnInit(); - expect(cipherServiceGet).toHaveBeenCalledWith("5555-444-3333"); + expect(cipherServiceGet).toHaveBeenCalledWith("5555-444-3333", mockUserId); expect(component.cipher).toEqual(cipherView); }); diff --git a/libs/vault/src/cipher-form/components/attachments/cipher-attachments.component.ts b/libs/vault/src/cipher-form/components/attachments/cipher-attachments.component.ts index e366cdab3fe..7e26e8afae9 100644 --- a/libs/vault/src/cipher-form/components/attachments/cipher-attachments.component.ts +++ b/libs/vault/src/cipher-form/components/attachments/cipher-attachments.component.ts @@ -21,10 +21,11 @@ import { ReactiveFormsModule, Validators, } from "@angular/forms"; -import { firstValueFrom, map } from "rxjs"; +import { firstValueFrom } from "rxjs"; import { JslibModule } from "@bitwarden/angular/jslib.module"; import { AccountService } from "@bitwarden/common/auth/abstractions/account.service"; +import { getUserId } from "@bitwarden/common/auth/services/account.service"; import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; import { LogService } from "@bitwarden/common/platform/abstractions/log.service"; import { CipherId, UserId } from "@bitwarden/common/types/guid"; @@ -118,10 +119,8 @@ export class CipherAttachmentsComponent implements OnInit, AfterViewInit { } async ngOnInit(): Promise { - this.cipherDomain = await this.cipherService.get(this.cipherId); - this.activeUserId = await firstValueFrom( - this.accountService.activeAccount$.pipe(map((a) => a?.id)), - ); + this.activeUserId = await firstValueFrom(this.accountService.activeAccount$.pipe(getUserId)); + this.cipherDomain = await this.cipherService.get(this.cipherId, this.activeUserId); this.cipher = await this.cipherDomain.decrypt( await this.cipherService.getKeyForCipherKeyDecryption(this.cipherDomain, this.activeUserId), ); diff --git a/libs/vault/src/cipher-form/components/attachments/delete-attachment/delete-attachment.component.spec.ts b/libs/vault/src/cipher-form/components/attachments/delete-attachment/delete-attachment.component.spec.ts index 8e0d4f7a665..4442fa6e75d 100644 --- a/libs/vault/src/cipher-form/components/attachments/delete-attachment/delete-attachment.component.spec.ts +++ b/libs/vault/src/cipher-form/components/attachments/delete-attachment/delete-attachment.component.spec.ts @@ -2,12 +2,16 @@ import { ComponentFixture, TestBed } from "@angular/core/testing"; import { By } from "@angular/platform-browser"; import { mock } from "jest-mock-extended"; +import { AccountService } from "@bitwarden/common/auth/abstractions/account.service"; import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; import { LogService } from "@bitwarden/common/platform/abstractions/log.service"; +import { UserId } from "@bitwarden/common/types/guid"; import { CipherService } from "@bitwarden/common/vault/abstractions/cipher.service"; import { AttachmentView } from "@bitwarden/common/vault/models/view/attachment.view"; import { DialogService, ToastService } from "@bitwarden/components"; +import { mockAccountServiceWith } from "../../../../../../common/spec"; + import { DeleteAttachmentComponent } from "./delete-attachment.component"; describe("DeleteAttachmentComponent", () => { @@ -42,6 +46,7 @@ describe("DeleteAttachmentComponent", () => { }, { provide: I18nService, useValue: { t: (key: string) => key } }, { provide: LogService, useValue: mock() }, + { provide: AccountService, useValue: mockAccountServiceWith("UserId" as UserId) }, ], }) .overrideProvider(DialogService, { @@ -90,7 +95,11 @@ describe("DeleteAttachmentComponent", () => { }); // Called with cipher id and attachment id - expect(deleteAttachmentWithServer).toHaveBeenCalledWith("5555-444-3333", "222-3333-4444"); + expect(deleteAttachmentWithServer).toHaveBeenCalledWith( + "5555-444-3333", + "222-3333-4444", + "UserId", + ); }); it("shows toast message on successful deletion", async () => { diff --git a/libs/vault/src/cipher-form/components/attachments/delete-attachment/delete-attachment.component.ts b/libs/vault/src/cipher-form/components/attachments/delete-attachment/delete-attachment.component.ts index b1ada907b1d..d7d6b550665 100644 --- a/libs/vault/src/cipher-form/components/attachments/delete-attachment/delete-attachment.component.ts +++ b/libs/vault/src/cipher-form/components/attachments/delete-attachment/delete-attachment.component.ts @@ -1,7 +1,10 @@ import { CommonModule } from "@angular/common"; import { Component, EventEmitter, Input, Output } from "@angular/core"; +import { firstValueFrom } from "rxjs"; import { JslibModule } from "@bitwarden/angular/jslib.module"; +import { AccountService } from "@bitwarden/common/auth/abstractions/account.service"; +import { getOptionalUserId } from "@bitwarden/common/auth/services/account.service"; import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; import { LogService } from "@bitwarden/common/platform/abstractions/log.service"; import { CipherService } from "@bitwarden/common/vault/abstractions/cipher.service"; @@ -36,6 +39,7 @@ export class DeleteAttachmentComponent { private cipherService: CipherService, private logService: LogService, private dialogService: DialogService, + private accountService: AccountService, ) {} delete = async () => { @@ -50,7 +54,19 @@ export class DeleteAttachmentComponent { } try { - await this.cipherService.deleteAttachmentWithServer(this.cipherId, this.attachment.id); + const activeUserId = await firstValueFrom( + this.accountService.activeAccount$.pipe(getOptionalUserId), + ); + + if (activeUserId == null) { + throw new Error("An active user is expected while deleting an attachment."); + } + + await this.cipherService.deleteAttachmentWithServer( + this.cipherId, + this.attachment.id, + activeUserId, + ); this.toastService.showToast({ variant: "success", diff --git a/libs/vault/src/cipher-form/components/item-details/item-details-section.component.ts b/libs/vault/src/cipher-form/components/item-details/item-details-section.component.ts index 85cd85bbf03..50bafd48b41 100644 --- a/libs/vault/src/cipher-form/components/item-details/item-details-section.component.ts +++ b/libs/vault/src/cipher-form/components/item-details/item-details-section.component.ts @@ -275,9 +275,9 @@ export class ItemDetailsSectionComponent implements OnInit { // Disable Collections Options if Owner/Admin does not have Edit/Manage permissions on item // Disable Collections Options if Custom user does not have Edit/Manage permissions on item if ( - (organization.allowAdminAccessToAllCollectionItems && + (organization?.allowAdminAccessToAllCollectionItems && (!this.originalCipherView.viewPassword || !this.originalCipherView.edit)) || - (organization.type === OrganizationUserType.Custom && + (organization?.type === OrganizationUserType.Custom && !this.originalCipherView.viewPassword) ) { this.itemDetailsForm.controls.collectionIds.disable(); diff --git a/libs/vault/src/cipher-form/components/sshkey-section/sshkey-section.component.ts b/libs/vault/src/cipher-form/components/sshkey-section/sshkey-section.component.ts index 134897c9356..773ddd4ad66 100644 --- a/libs/vault/src/cipher-form/components/sshkey-section/sshkey-section.component.ts +++ b/libs/vault/src/cipher-form/components/sshkey-section/sshkey-section.component.ts @@ -104,9 +104,9 @@ export class SshKeySectionComponent implements OnInit { await firstValueFrom(this.sdkService.client$); const sshKey = generate_ssh_key("Ed25519"); this.sshKeyForm.setValue({ - privateKey: sshKey.private_key, - publicKey: sshKey.public_key, - keyFingerprint: sshKey.key_fingerprint, + privateKey: sshKey.privateKey, + publicKey: sshKey.publicKey, + keyFingerprint: sshKey.fingerprint, }); } } diff --git a/libs/vault/src/cipher-form/services/default-cipher-form-config.service.ts b/libs/vault/src/cipher-form/services/default-cipher-form-config.service.ts index 28b13b51c61..b9add41c222 100644 --- a/libs/vault/src/cipher-form/services/default-cipher-form-config.service.ts +++ b/libs/vault/src/cipher-form/services/default-cipher-form-config.service.ts @@ -8,6 +8,7 @@ import { OrganizationService } from "@bitwarden/common/admin-console/abstraction import { PolicyService } from "@bitwarden/common/admin-console/abstractions/policy/policy.service.abstraction"; import { OrganizationUserStatusType, PolicyType } from "@bitwarden/common/admin-console/enums"; import { AccountService } from "@bitwarden/common/auth/abstractions/account.service"; +import { getUserId } from "@bitwarden/common/auth/services/account.service"; import { CipherId, UserId } from "@bitwarden/common/types/guid"; import { CipherService } from "@bitwarden/common/vault/abstractions/cipher.service"; import { FolderService } from "@bitwarden/common/vault/abstractions/folder/folder.service.abstraction"; @@ -34,14 +35,12 @@ export class DefaultCipherFormConfigService implements CipherFormConfigService { private collectionService: CollectionService = inject(CollectionService); private accountService = inject(AccountService); - private activeUserId$ = this.accountService.activeAccount$.pipe(map((a) => a?.id)); - async buildConfig( mode: CipherFormMode, cipherId?: CipherId, cipherType?: CipherType, ): Promise { - const activeUserId = await firstValueFrom(this.activeUserId$); + const activeUserId = await firstValueFrom(this.accountService.activeAccount$.pipe(getUserId)); const [organizations, collections, allowPersonalOwnership, folders, cipher] = await firstValueFrom( @@ -62,7 +61,7 @@ export class DefaultCipherFormConfigService implements CipherFormConfigService { ), ), ), - this.getCipher(cipherId), + this.getCipher(activeUserId, cipherId), ]), ); @@ -94,10 +93,10 @@ export class DefaultCipherFormConfigService implements CipherFormConfigService { .policyAppliesToActiveUser$(PolicyType.PersonalOwnership) .pipe(map((p) => !p)); - private getCipher(id?: CipherId): Promise { + private getCipher(userId: UserId, id?: CipherId): Promise { if (id == null) { return Promise.resolve(null); } - return this.cipherService.get(id); + return this.cipherService.get(id, userId); } } diff --git a/libs/vault/src/cipher-form/services/default-cipher-form.service.ts b/libs/vault/src/cipher-form/services/default-cipher-form.service.ts index 059214cc185..98286e4bbb2 100644 --- a/libs/vault/src/cipher-form/services/default-cipher-form.service.ts +++ b/libs/vault/src/cipher-form/services/default-cipher-form.service.ts @@ -1,10 +1,11 @@ // FIXME: Update this file to be type safe and remove this and next line // @ts-strict-ignore import { inject, Injectable } from "@angular/core"; -import { firstValueFrom, map } from "rxjs"; +import { firstValueFrom } from "rxjs"; import { ApiService } from "@bitwarden/common/abstractions/api.service"; import { AccountService } from "@bitwarden/common/auth/abstractions/account.service"; +import { getUserId } from "@bitwarden/common/auth/services/account.service"; import { CipherService } from "@bitwarden/common/vault/abstractions/cipher.service"; import { Cipher } from "@bitwarden/common/vault/models/domain/cipher"; import { CipherView } from "@bitwarden/common/vault/models/view/cipher.view"; @@ -23,9 +24,7 @@ export class DefaultCipherFormService implements CipherFormService { private apiService: ApiService = inject(ApiService); async decryptCipher(cipher: Cipher): Promise { - const activeUserId = await firstValueFrom( - this.accountService.activeAccount$.pipe(map((a) => a?.id)), - ); + const activeUserId = await firstValueFrom(this.accountService.activeAccount$.pipe(getUserId)); return await cipher.decrypt( await this.cipherService.getKeyForCipherKeyDecryption(cipher, activeUserId), ); @@ -33,9 +32,7 @@ export class DefaultCipherFormService implements CipherFormService { async saveCipher(cipher: CipherView, config: CipherFormConfig): Promise { // Passing the original cipher is important here as it is responsible for appending to password history - const activeUserId = await firstValueFrom( - this.accountService.activeAccount$.pipe(map((a) => a?.id)), - ); + const activeUserId = await firstValueFrom(this.accountService.activeAccount$.pipe(getUserId)); const encryptedCipher = await this.cipherService.encrypt( cipher, activeUserId, @@ -90,7 +87,10 @@ export class DefaultCipherFormService implements CipherFormService { // When using an admin config or the cipher was unassigned, update collections as an admin savedCipher = await this.cipherService.saveCollectionsWithServerAdmin(encryptedCipher); } else { - savedCipher = await this.cipherService.saveCollectionsWithServer(encryptedCipher); + savedCipher = await this.cipherService.saveCollectionsWithServer( + encryptedCipher, + activeUserId, + ); } } diff --git a/libs/vault/src/cipher-view/autofill-options/autofill-options-view.component.ts b/libs/vault/src/cipher-view/autofill-options/autofill-options-view.component.ts index e7deb78c868..9b12139b00e 100644 --- a/libs/vault/src/cipher-view/autofill-options/autofill-options-view.component.ts +++ b/libs/vault/src/cipher-view/autofill-options/autofill-options-view.component.ts @@ -2,8 +2,11 @@ // @ts-strict-ignore import { CommonModule } from "@angular/common"; import { Component, Input } from "@angular/core"; +import { firstValueFrom } from "rxjs"; import { JslibModule } from "@bitwarden/angular/jslib.module"; +import { AccountService } from "@bitwarden/common/auth/abstractions/account.service"; +import { getUserId } from "@bitwarden/common/auth/services/account.service"; import { PlatformUtilsService } from "@bitwarden/common/platform/abstractions/platform-utils.service"; import { CipherService } from "@bitwarden/common/vault/abstractions/cipher.service"; import { LoginUriView } from "@bitwarden/common/vault/models/view/login-uri.view"; @@ -38,10 +41,12 @@ export class AutofillOptionsViewComponent { constructor( private platformUtilsService: PlatformUtilsService, private cipherService: CipherService, + private accountService: AccountService, ) {} async openWebsite(selectedUri: string) { - await this.cipherService.updateLastLaunchedDate(this.cipherId); + const activeUserId = await firstValueFrom(this.accountService.activeAccount$.pipe(getUserId)); + await this.cipherService.updateLastLaunchedDate(this.cipherId, activeUserId); this.platformUtilsService.launchUri(selectedUri); } } diff --git a/libs/vault/src/cipher-view/item-history/item-history-v2.component.html b/libs/vault/src/cipher-view/item-history/item-history-v2.component.html index a207b8fa1ca..19d1cfe1744 100644 --- a/libs/vault/src/cipher-view/item-history/item-history-v2.component.html +++ b/libs/vault/src/cipher-view/item-history/item-history-v2.component.html @@ -10,15 +10,15 @@

{{ "dateCreated" | i18n }}: {{ cipher.creationDate | date: "medium" }}

@@ -26,7 +26,7 @@ {{ cipher.passwordRevisionDisplayDate | date: "medium" }}

diff --git a/libs/vault/src/cipher-view/login-credentials/login-credentials-view.component.ts b/libs/vault/src/cipher-view/login-credentials/login-credentials-view.component.ts index 41a4828f645..c95b2040fd2 100644 --- a/libs/vault/src/cipher-view/login-credentials/login-credentials-view.component.ts +++ b/libs/vault/src/cipher-view/login-credentials/login-credentials-view.component.ts @@ -2,15 +2,7 @@ // @ts-strict-ignore import { CommonModule, DatePipe } from "@angular/common"; import { Component, inject, Input } from "@angular/core"; -import { - BehaviorSubject, - combineLatest, - filter, - map, - Observable, - shareReplay, - switchMap, -} from "rxjs"; +import { Observable, switchMap } from "rxjs"; import { JslibModule } from "@bitwarden/angular/jslib.module"; import { EventCollectionService } from "@bitwarden/common/abstractions/event/event-collection.service"; @@ -21,13 +13,13 @@ import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.servic import { PremiumUpgradePromptService } from "@bitwarden/common/vault/abstractions/premium-upgrade-prompt.service"; import { CipherView } from "@bitwarden/common/vault/models/view/cipher.view"; import { - BadgeModule, - ColorPasswordModule, FormFieldModule, - IconButtonModule, SectionComponent, SectionHeaderComponent, TypographyModule, + IconButtonModule, + BadgeModule, + ColorPasswordModule, } from "@bitwarden/components"; import { BitTotpCountdownComponent } from "../../components/totp-countdown/totp-countdown.component"; @@ -57,31 +49,13 @@ type TotpCodeValues = { ], }) export class LoginCredentialsViewComponent { - @Input() - get cipher(): CipherView { - return this._cipher$.value; - } - set cipher(value: CipherView) { - this._cipher$.next(value); - } - private _cipher$ = new BehaviorSubject(null); + @Input() cipher: CipherView; - private _userHasPremium$: Observable = this.accountService.activeAccount$.pipe( + isPremium$: Observable = this.accountService.activeAccount$.pipe( switchMap((account) => this.billingAccountProfileStateService.hasPremiumFromAnySource$(account.id), ), ); - - allowTotpGeneration$: Observable = combineLatest([ - this._userHasPremium$, - this._cipher$.pipe(filter((c) => c != null)), - ]).pipe( - map(([userHasPremium, cipher]) => { - // User premium status only applies to personal ciphers, organizationUseTotp applies to organization ciphers - return (userHasPremium && cipher.organizationId == null) || cipher.organizationUseTotp; - }), - shareReplay({ refCount: true, bufferSize: 1 }), - ); showPasswordCount: boolean = false; passwordRevealed: boolean = false; totpCodeCopyObj: TotpCodeValues; diff --git a/libs/vault/src/components/assign-collections.component.ts b/libs/vault/src/components/assign-collections.component.ts index a8ef3557385..76a6a1b10a6 100644 --- a/libs/vault/src/components/assign-collections.component.ts +++ b/libs/vault/src/components/assign-collections.component.ts @@ -179,7 +179,6 @@ export class AssignCollectionsComponent implements OnInit, OnDestroy, AfterViewI private get selectedOrgId(): OrganizationId { return this.formGroup.getRawValue().selectedOrg || this.params.organizationId; } - private activeUserId: UserId; private destroy$ = new Subject(); constructor( @@ -193,10 +192,6 @@ export class AssignCollectionsComponent implements OnInit, OnDestroy, AfterViewI ) {} async ngOnInit() { - this.activeUserId = await firstValueFrom( - this.accountService.activeAccount$.pipe(map((a) => a?.id)), - ); - const onlyPersonalItems = this.params.ciphers.every((c) => c.organizationId == null); if (this.selectedOrgId === MY_VAULT_ID || onlyPersonalItems) { @@ -253,12 +248,15 @@ export class AssignCollectionsComponent implements OnInit, OnDestroy, AfterViewI .filter((i) => i.organizationId) .map((i) => i.id as CipherId); + const activeUserId = await firstValueFrom(this.accountService.activeAccount$.pipe(getUserId)); + // Move personal items to the organization if (this.personalItemsCount > 0) { await this.moveToOrganization( this.selectedOrgId, this.params.ciphers.filter((c) => c.organizationId == null), this.formGroup.controls.collections.value.map((i) => i.id as CollectionId), + activeUserId, ); } @@ -267,8 +265,8 @@ export class AssignCollectionsComponent implements OnInit, OnDestroy, AfterViewI // Update assigned collections for single org cipher or bulk update collections for multiple org ciphers await (isSingleOrgCipher - ? this.updateAssignedCollections(this.editableItems[0]) - : this.bulkUpdateCollections(cipherIds)); + ? this.updateAssignedCollections(this.editableItems[0], activeUserId) + : this.bulkUpdateCollections(cipherIds, activeUserId)); this.toastService.showToast({ variant: "success", @@ -447,12 +445,13 @@ export class AssignCollectionsComponent implements OnInit, OnDestroy, AfterViewI organizationId: OrganizationId, shareableCiphers: CipherView[], selectedCollectionIds: CollectionId[], + userId: UserId, ) { await this.cipherService.shareManyWithServer( shareableCiphers, organizationId, selectedCollectionIds, - this.activeUserId, + userId, ); this.toastService.showToast({ @@ -465,10 +464,11 @@ export class AssignCollectionsComponent implements OnInit, OnDestroy, AfterViewI }); } - private async bulkUpdateCollections(cipherIds: CipherId[]) { + private async bulkUpdateCollections(cipherIds: CipherId[], userId: UserId) { if (this.formGroup.controls.collections.value.length > 0) { await this.cipherService.bulkUpdateCollectionsWithServer( this.selectedOrgId, + userId, cipherIds, this.formGroup.controls.collections.value.map((i) => i.id as CollectionId), false, @@ -483,6 +483,7 @@ export class AssignCollectionsComponent implements OnInit, OnDestroy, AfterViewI ) { await this.cipherService.bulkUpdateCollectionsWithServer( this.selectedOrgId, + userId, cipherIds, [this.params.activeCollection.id as CollectionId], true, @@ -490,14 +491,14 @@ export class AssignCollectionsComponent implements OnInit, OnDestroy, AfterViewI } } - private async updateAssignedCollections(cipherView: CipherView) { + private async updateAssignedCollections(cipherView: CipherView, userId: UserId) { const { collections } = this.formGroup.getRawValue(); cipherView.collectionIds = collections.map((i) => i.id as CollectionId); - const cipher = await this.cipherService.encrypt(cipherView, this.activeUserId); + const cipher = await this.cipherService.encrypt(cipherView, userId); if (this.params.isSingleCipherAdmin) { await this.cipherService.saveCollectionsWithServerAdmin(cipher); } else { - await this.cipherService.saveCollectionsWithServer(cipher); + await this.cipherService.saveCollectionsWithServer(cipher, userId); } } } diff --git a/libs/vault/src/icons/bitwarden-icon.ts b/libs/vault/src/icons/bitwarden-icon.ts new file mode 100644 index 00000000000..73e4304d5c7 --- /dev/null +++ b/libs/vault/src/icons/bitwarden-icon.ts @@ -0,0 +1,20 @@ +import { svgIcon } from "@bitwarden/components"; + +export const BitwardenIcon = svgIcon` + + + + + + + + + + + + + + + + +`; diff --git a/libs/vault/src/icons/browser-extension.ts b/libs/vault/src/icons/browser-extension.ts new file mode 100644 index 00000000000..f0f9b781491 --- /dev/null +++ b/libs/vault/src/icons/browser-extension.ts @@ -0,0 +1,17 @@ +import { svgIcon } from "@bitwarden/components"; + +export const BrowserExtensionIcon = svgIcon` + + + + + + + + + + + + + +`; diff --git a/libs/vault/src/icons/index.ts b/libs/vault/src/icons/index.ts index 2e106782f53..e0be5e637f0 100644 --- a/libs/vault/src/icons/index.ts +++ b/libs/vault/src/icons/index.ts @@ -4,3 +4,5 @@ export * from "./vault"; export * from "./empty-trash"; export * from "./exclamation-triangle"; export * from "./user-lock"; +export * from "./browser-extension"; +export * from "./bitwarden-icon"; diff --git a/libs/vault/src/index.ts b/libs/vault/src/index.ts index ad9a2a75d01..ac905c1f5ef 100644 --- a/libs/vault/src/index.ts +++ b/libs/vault/src/index.ts @@ -5,6 +5,8 @@ export { CopyCipherFieldDirective } from "./components/copy-cipher-field.directi export { OrgIconDirective } from "./components/org-icon.directive"; export { CanDeleteCipherDirective } from "./components/can-delete-cipher.directive"; +export * from "./utils/observable-utilities"; + export * from "./cipher-view"; export * from "./cipher-form"; export { @@ -23,3 +25,6 @@ export * from "./components/add-edit-folder-dialog/add-edit-folder-dialog.compon export * as VaultIcons from "./icons"; export * from "./tasks"; + +export * from "./abstractions/change-login-password.service"; +export * from "./services/default-change-login-password.service"; diff --git a/libs/vault/src/services/default-change-login-password.service.spec.ts b/libs/vault/src/services/default-change-login-password.service.spec.ts new file mode 100644 index 00000000000..4805f298797 --- /dev/null +++ b/libs/vault/src/services/default-change-login-password.service.spec.ts @@ -0,0 +1,157 @@ +/** + * Jest needs to run in custom environment to mock Request/Response objects + * @jest-environment ../../libs/shared/test.environment.ts + */ + +import { mock } from "jest-mock-extended"; + +import { ApiService } from "@bitwarden/common/abstractions/api.service"; +import { CipherType } from "@bitwarden/common/vault/enums"; +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 { DefaultChangeLoginPasswordService } from "./default-change-login-password.service"; + +describe("DefaultChangeLoginPasswordService", () => { + let service: DefaultChangeLoginPasswordService; + + let mockShouldNotExistResponse: Response; + let mockWellKnownResponse: Response; + + const mockApiService = mock(); + + beforeEach(() => { + mockApiService.nativeFetch.mockClear(); + + // Default responses to success state + mockShouldNotExistResponse = new Response("Not Found", { status: 404 }); + mockWellKnownResponse = new Response("OK", { status: 200 }); + + mockApiService.nativeFetch.mockImplementation((request) => { + if ( + request.url.endsWith("resource-that-should-not-exist-whose-status-code-should-not-be-200") + ) { + return Promise.resolve(mockShouldNotExistResponse); + } + + if (request.url.endsWith(".well-known/change-password")) { + return Promise.resolve(mockWellKnownResponse); + } + + throw new Error("Unexpected request"); + }); + service = new DefaultChangeLoginPasswordService(mockApiService); + }); + + it("should return null for non-login ciphers", async () => { + const cipher = { + type: CipherType.Card, + } as CipherView; + + const url = await service.getChangePasswordUrl(cipher); + + expect(url).toBeNull(); + }); + + it("should return null for logins with no URIs", async () => { + const cipher = { + type: CipherType.Login, + login: Object.assign(new LoginView(), { uris: [] as LoginUriView[] }), + } as CipherView; + + const url = await service.getChangePasswordUrl(cipher); + + expect(url).toBeNull(); + }); + + it("should return null for logins with no valid HTTP/HTTPS URIs", async () => { + const cipher = { + type: CipherType.Login, + login: Object.assign(new LoginView(), { + uris: [{ uri: "ftp://example.com" }], + }), + } as CipherView; + + const url = await service.getChangePasswordUrl(cipher); + + expect(url).toBeNull(); + }); + + it("should check the origin for a reliable status code", async () => { + const cipher = { + type: CipherType.Login, + login: Object.assign(new LoginView(), { + uris: [{ uri: "https://example.com" }], + }), + } as CipherView; + + await service.getChangePasswordUrl(cipher); + + expect(mockApiService.nativeFetch).toHaveBeenCalledWith( + expect.objectContaining({ + url: "https://example.com/.well-known/resource-that-should-not-exist-whose-status-code-should-not-be-200", + }), + ); + }); + + it("should attempt to fetch the well-known change password URL", async () => { + const cipher = { + type: CipherType.Login, + login: Object.assign(new LoginView(), { + uris: [{ uri: "https://example.com" }], + }), + } as CipherView; + + await service.getChangePasswordUrl(cipher); + + expect(mockApiService.nativeFetch).toHaveBeenCalledWith( + expect.objectContaining({ + url: "https://example.com/.well-known/change-password", + }), + ); + }); + + it("should return the well-known change password URL when successful at verifying the response", async () => { + const cipher = { + type: CipherType.Login, + login: Object.assign(new LoginView(), { + uris: [{ uri: "https://example.com" }], + }), + } as CipherView; + + const url = await service.getChangePasswordUrl(cipher); + + expect(url).toBe("https://example.com/.well-known/change-password"); + }); + + it("should return the original URI when unable to verify the response", async () => { + mockShouldNotExistResponse = new Response("Ok", { status: 200 }); + + const cipher = { + type: CipherType.Login, + login: Object.assign(new LoginView(), { + uris: [{ uri: "https://example.com" }], + }), + } as CipherView; + + const url = await service.getChangePasswordUrl(cipher); + + expect(url).toBe("https://example.com"); + }); + + it("should return the original URI when the well-known URL is not found", async () => { + mockWellKnownResponse = new Response("Not Found", { status: 404 }); + + const cipher = { + type: CipherType.Login, + login: Object.assign(new LoginView(), { + uris: [{ uri: "https://example.com" }], + }), + } as CipherView; + + const url = await service.getChangePasswordUrl(cipher); + + expect(url).toBe("https://example.com"); + }); +}); diff --git a/libs/vault/src/services/default-change-login-password.service.ts b/libs/vault/src/services/default-change-login-password.service.ts new file mode 100644 index 00000000000..25648318c14 --- /dev/null +++ b/libs/vault/src/services/default-change-login-password.service.ts @@ -0,0 +1,96 @@ +import { Injectable } from "@angular/core"; + +import { ApiService } from "@bitwarden/common/abstractions/api.service"; +import { Utils } from "@bitwarden/common/platform/misc/utils"; +import { CipherType } from "@bitwarden/common/vault/enums"; +import { CipherView } from "@bitwarden/common/vault/models/view/cipher.view"; + +import { ChangeLoginPasswordService } from "../abstractions/change-login-password.service"; + +@Injectable() +export class DefaultChangeLoginPasswordService implements ChangeLoginPasswordService { + constructor(private apiService: ApiService) {} + + /** + * @inheritDoc + */ + async getChangePasswordUrl(cipher: CipherView): Promise { + // Ensure we have a cipher with at least one URI + if (cipher.type !== CipherType.Login || cipher.login == null || !cipher.login.hasUris) { + return null; + } + + // Find the first valid URL that is an HTTP or HTTPS URL + const url = cipher.login.uris + .map((m) => Utils.getUrl(m.uri)) + .find((m) => m != null && (m.protocol === "http:" || m.protocol === "https:")); + + if (url == null) { + return null; + } + + const [reliable, wellKnownChangeUrl] = await Promise.all([ + this.hasReliableHttpStatusCode(url.origin), + this.getWellKnownChangePasswordUrl(url.origin), + ]); + + if (!reliable || wellKnownChangeUrl == null) { + return cipher.login.uri; + } + + return wellKnownChangeUrl; + } + + /** + * Checks if the server returns a non-200 status code for a resource that should not exist. + * See https://w3c.github.io/webappsec-change-password-url/response-code-reliability.html#semantics + * @param urlOrigin The origin of the URL to check + */ + private async hasReliableHttpStatusCode(urlOrigin: string): Promise { + try { + const url = new URL( + "./.well-known/resource-that-should-not-exist-whose-status-code-should-not-be-200", + urlOrigin, + ); + + const request = new Request(url, { + method: "GET", + mode: "same-origin", + credentials: "omit", + cache: "no-store", + redirect: "follow", + }); + + const response = await this.apiService.nativeFetch(request); + return !response.ok; + } catch { + return false; + } + } + + /** + * Builds a well-known change password URL for the given origin. Attempts to fetch the URL to ensure a valid response + * is returned. Returns null if the request throws or the response is not 200 OK. + * See https://w3c.github.io/webappsec-change-password-url/ + * @param urlOrigin The origin of the URL to check + */ + private async getWellKnownChangePasswordUrl(urlOrigin: string): Promise { + try { + const url = new URL("./.well-known/change-password", urlOrigin); + + const request = new Request(url, { + method: "GET", + mode: "same-origin", + credentials: "omit", + cache: "no-store", + redirect: "follow", + }); + + const response = await this.apiService.nativeFetch(request); + + return response.ok ? url.toString() : null; + } catch { + return null; + } + } +} diff --git a/libs/vault/src/tasks/services/default-task.service.spec.ts b/libs/vault/src/tasks/services/default-task.service.spec.ts index 26b1a79ca2e..c6b74f82909 100644 --- a/libs/vault/src/tasks/services/default-task.service.spec.ts +++ b/libs/vault/src/tasks/services/default-task.service.spec.ts @@ -4,6 +4,7 @@ import { BehaviorSubject, firstValueFrom } from "rxjs"; import { ApiService } from "@bitwarden/common/abstractions/api.service"; import { OrganizationService } from "@bitwarden/common/admin-console/abstractions/organization/organization.service.abstraction"; import { Organization } from "@bitwarden/common/admin-console/models/domain/organization"; +import { ConfigService } from "@bitwarden/common/platform/abstractions/config/config.service"; import { StateProvider } from "@bitwarden/common/platform/state"; import { SecurityTaskId, UserId } from "@bitwarden/common/types/guid"; import { DefaultTaskService, SecurityTaskStatus } from "@bitwarden/vault"; @@ -18,18 +19,26 @@ describe("Default task service", () => { const mockApiSend = jest.fn(); const mockGetAllOrgs$ = jest.fn(); + const mockGetFeatureFlag$ = jest.fn(); let testBed: TestBed; beforeEach(async () => { mockApiSend.mockClear(); mockGetAllOrgs$.mockClear(); + mockGetFeatureFlag$.mockClear(); fakeStateProvider = new FakeStateProvider(mockAccountServiceWith("user-id" as UserId)); testBed = TestBed.configureTestingModule({ imports: [], providers: [ DefaultTaskService, + { + provide: ConfigService, + useValue: { + getFeatureFlag$: mockGetFeatureFlag$, + }, + }, { provide: StateProvider, useValue: fakeStateProvider, @@ -52,6 +61,7 @@ describe("Default task service", () => { describe("tasksEnabled$", () => { it("should emit true if any organization uses risk insights", async () => { + mockGetFeatureFlag$.mockReturnValue(new BehaviorSubject(true)); mockGetAllOrgs$.mockReturnValue( new BehaviorSubject([ { @@ -71,6 +81,7 @@ describe("Default task service", () => { }); it("should emit false if no organization uses risk insights", async () => { + mockGetFeatureFlag$.mockReturnValue(new BehaviorSubject(true)); mockGetAllOrgs$.mockReturnValue( new BehaviorSubject([ { @@ -88,6 +99,23 @@ describe("Default task service", () => { expect(result).toBe(false); }); + + it("should emit false if the feature flag is off", async () => { + mockGetFeatureFlag$.mockReturnValue(new BehaviorSubject(false)); + mockGetAllOrgs$.mockReturnValue( + new BehaviorSubject([ + { + useRiskInsights: true, + }, + ] as Organization[]), + ); + + const { tasksEnabled$ } = testBed.inject(DefaultTaskService); + + const result = await firstValueFrom(tasksEnabled$("user-id" as UserId)); + + expect(result).toBe(false); + }); }); describe("tasks$", () => { @@ -100,7 +128,7 @@ describe("Default task service", () => { ] as SecurityTaskResponse[], }); - fakeStateProvider.singleUser.mockFor("user-id" as UserId, SECURITY_TASKS, null); + fakeStateProvider.singleUser.mockFor("user-id" as UserId, SECURITY_TASKS, null as any); const { tasks$ } = testBed.inject(DefaultTaskService); @@ -183,7 +211,11 @@ describe("Default task service", () => { ] as SecurityTaskResponse[], }); - const mock = fakeStateProvider.singleUser.mockFor("user-id" as UserId, SECURITY_TASKS, null); + const mock = fakeStateProvider.singleUser.mockFor( + "user-id" as UserId, + SECURITY_TASKS, + null as any, + ); const service = testBed.inject(DefaultTaskService); diff --git a/libs/vault/src/tasks/services/default-task.service.ts b/libs/vault/src/tasks/services/default-task.service.ts index f5c1d95af08..b6d0ff77e9d 100644 --- a/libs/vault/src/tasks/services/default-task.service.ts +++ b/libs/vault/src/tasks/services/default-task.service.ts @@ -1,9 +1,11 @@ import { Injectable } from "@angular/core"; -import { map, switchMap } from "rxjs"; +import { combineLatest, map, switchMap } from "rxjs"; import { ApiService } from "@bitwarden/common/abstractions/api.service"; import { OrganizationService } from "@bitwarden/common/admin-console/abstractions/organization/organization.service.abstraction"; +import { FeatureFlag } from "@bitwarden/common/enums/feature-flag.enum"; import { ListResponse } from "@bitwarden/common/models/response/list.response"; +import { ConfigService } from "@bitwarden/common/platform/abstractions/config/config.service"; import { StateProvider } from "@bitwarden/common/platform/state"; import { SecurityTaskId, UserId } from "@bitwarden/common/types/guid"; import { SecurityTask, SecurityTaskStatus, TaskService } from "@bitwarden/vault"; @@ -19,12 +21,16 @@ export class DefaultTaskService implements TaskService { private stateProvider: StateProvider, private apiService: ApiService, private organizationService: OrganizationService, + private configService: ConfigService, ) {} tasksEnabled$ = perUserCache$((userId) => { - return this.organizationService - .organizations$(userId) - .pipe(map((orgs) => orgs.some((o) => o.useRiskInsights))); + return combineLatest([ + this.organizationService + .organizations$(userId) + .pipe(map((orgs) => orgs.some((o) => o.useRiskInsights))), + this.configService.getFeatureFlag$(FeatureFlag.SecurityTasks), + ]).pipe(map(([atLeastOneOrgEnabled, flagEnabled]) => atLeastOneOrgEnabled && flagEnabled)); }); tasks$ = perUserCache$((userId) => { @@ -87,7 +93,10 @@ export class DefaultTaskService implements TaskService { * @param tasks * @private */ - private updateTaskState(userId: UserId, tasks: SecurityTaskData[]): Promise { + private updateTaskState( + userId: UserId, + tasks: SecurityTaskData[], + ): Promise { return this.taskState(userId).update(() => tasks); } } diff --git a/package-lock.json b/package-lock.json index 6c28405b226..08047dbf619 100644 --- a/package-lock.json +++ b/package-lock.json @@ -24,7 +24,7 @@ "@angular/platform-browser": "18.2.13", "@angular/platform-browser-dynamic": "18.2.13", "@angular/router": "18.2.13", - "@bitwarden/sdk-internal": "0.2.0-main.38", + "@bitwarden/sdk-internal": "0.2.0-main.105", "@electron/fuses": "1.8.0", "@emotion/css": "11.13.5", "@koa/multer": "3.0.2", @@ -46,7 +46,7 @@ "https-proxy-agent": "7.0.5", "inquirer": "8.2.6", "jquery": "3.7.1", - "jsdom": "25.0.1", + "jsdom": "26.0.0", "jszip": "3.10.1", "koa": "2.15.3", "koa-bodyparser": "4.4.1", @@ -61,7 +61,7 @@ "nord": "0.2.1", "oidc-client-ts": "2.4.1", "open": "8.4.2", - "papaparse": "5.4.1", + "papaparse": "5.5.2", "patch-package": "8.0.0", "popper.js": "1.16.1", "proper-lockfile": "4.1.2", @@ -91,6 +91,7 @@ "@storybook/addon-essentials": "8.5.2", "@storybook/addon-interactions": "8.5.2", "@storybook/addon-links": "8.5.2", + "@storybook/addon-themes": "^8.5.2", "@storybook/angular": "8.5.2", "@storybook/manager-api": "8.5.2", "@storybook/theming": "8.5.2", @@ -153,6 +154,7 @@ "jest-junit": "16.0.0", "jest-mock-extended": "3.0.7", "jest-preset-angular": "14.1.1", + "json5": "2.2.3", "lint-staged": "15.4.1", "mini-css-extract-plugin": "2.9.2", "node-ipc": "9.2.1", @@ -190,11 +192,11 @@ }, "apps/browser": { "name": "@bitwarden/browser", - "version": "2025.1.3" + "version": "2025.2.1" }, "apps/cli": { "name": "@bitwarden/cli", - "version": "2025.1.3", + "version": "2025.2.0", "license": "SEE LICENSE IN LICENSE.txt", "dependencies": { "@koa/multer": "3.0.2", @@ -207,7 +209,7 @@ "form-data": "4.0.1", "https-proxy-agent": "7.0.5", "inquirer": "8.2.6", - "jsdom": "25.0.1", + "jsdom": "26.0.0", "jszip": "3.10.1", "koa": "2.15.3", "koa-bodyparser": "4.4.1", @@ -218,7 +220,7 @@ "node-fetch": "2.6.12", "node-forge": "1.3.1", "open": "8.4.2", - "papaparse": "5.4.1", + "papaparse": "5.5.2", "proper-lockfile": "4.1.2", "rxjs": "7.8.1", "tldts": "6.1.74", @@ -230,7 +232,7 @@ }, "apps/desktop": { "name": "@bitwarden/desktop", - "version": "2025.2.0", + "version": "2025.2.2", "hasInstallScript": true, "license": "GPL-3.0" }, @@ -244,7 +246,7 @@ }, "apps/web": { "name": "@bitwarden/web-vault", - "version": "2025.1.2" + "version": "2025.2.1" }, "libs/admin-console": { "name": "@bitwarden/admin-console", @@ -2328,6 +2330,28 @@ "rxjs": "^6.5.3 || ^7.4.0" } }, + "node_modules/@asamuzakjp/css-color": { + "version": "2.8.2", + "resolved": "https://registry.npmjs.org/@asamuzakjp/css-color/-/css-color-2.8.2.tgz", + "integrity": "sha512-RtWv9jFN2/bLExuZgFFZ0I3pWWeezAHGgrmjqGGWclATl1aDe3yhCUaI0Ilkp6OCk9zX7+FjvDasEX8Q9Rxc5w==", + "license": "MIT", + "dependencies": { + "@csstools/css-calc": "^2.1.1", + "@csstools/css-color-parser": "^3.0.7", + "@csstools/css-parser-algorithms": "^3.0.4", + "@csstools/css-tokenizer": "^3.0.3", + "lru-cache": "^11.0.2" + } + }, + "node_modules/@asamuzakjp/css-color/node_modules/lru-cache": { + "version": "11.0.2", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.0.2.tgz", + "integrity": "sha512-123qHRfJBmo2jXDbo/a5YOQrJoHF/GNQTLzQ5+IdK5pWpceK17yRc6ozlWd25FxvGKQbIUs91fDFkXmDHTKcyA==", + "license": "ISC", + "engines": { + "node": "20 || >=22" + } + }, "node_modules/@babel/code-frame": { "version": "7.26.2", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.26.2.tgz", @@ -4452,9 +4476,9 @@ "link": true }, "node_modules/@bitwarden/sdk-internal": { - "version": "0.2.0-main.38", - "resolved": "https://registry.npmjs.org/@bitwarden/sdk-internal/-/sdk-internal-0.2.0-main.38.tgz", - "integrity": "sha512-bkN+BZC0YA4k0To8QiT33UTZX8peKDXud8Gzq3UHNPlU/vMSkP3Wn8q0GezzmYN3UNNIWXfreNCS0mJ+S51j/Q==", + "version": "0.2.0-main.105", + "resolved": "https://registry.npmjs.org/@bitwarden/sdk-internal/-/sdk-internal-0.2.0-main.105.tgz", + "integrity": "sha512-MaQFJbuKTCbN9oZC/+opYVeegaNNJpiUv9/zx+gu8KxWmX0hyEkNPtHKxBjDt3kLLz69CudDtUxEgqOfcDsYAw==", "license": "GPL-3.0" }, "node_modules/@bitwarden/test-helpers": { @@ -5111,6 +5135,116 @@ "node": ">= 10.0.0" } }, + "node_modules/@csstools/color-helpers": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@csstools/color-helpers/-/color-helpers-5.0.1.tgz", + "integrity": "sha512-MKtmkA0BX87PKaO1NFRTFH+UnkgnmySQOvNxJubsadusqPEC2aJ9MOQiMceZJJ6oitUl/i0L6u0M1IrmAOmgBA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "engines": { + "node": ">=18" + } + }, + "node_modules/@csstools/css-calc": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@csstools/css-calc/-/css-calc-2.1.1.tgz", + "integrity": "sha512-rL7kaUnTkL9K+Cvo2pnCieqNpTKgQzy5f+N+5Iuko9HAoasP+xgprVh7KN/MaJVvVL1l0EzQq2MoqBHKSrDrag==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@csstools/css-parser-algorithms": "^3.0.4", + "@csstools/css-tokenizer": "^3.0.3" + } + }, + "node_modules/@csstools/css-color-parser": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/@csstools/css-color-parser/-/css-color-parser-3.0.7.tgz", + "integrity": "sha512-nkMp2mTICw32uE5NN+EsJ4f5N+IGFeCFu4bGpiKgb2Pq/7J/MpyLBeQ5ry4KKtRFZaYs6sTmcMYrSRIyj5DFKA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "dependencies": { + "@csstools/color-helpers": "^5.0.1", + "@csstools/css-calc": "^2.1.1" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@csstools/css-parser-algorithms": "^3.0.4", + "@csstools/css-tokenizer": "^3.0.3" + } + }, + "node_modules/@csstools/css-parser-algorithms": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-3.0.4.tgz", + "integrity": "sha512-Up7rBoV77rv29d3uKHUIVubz1BTcgyUK72IvCQAbfbMv584xHcGKCKbWh7i8hPrRJ7qU4Y8IO3IY9m+iTB7P3A==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@csstools/css-tokenizer": "^3.0.3" + } + }, + "node_modules/@csstools/css-tokenizer": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-3.0.3.tgz", + "integrity": "sha512-UJnjoFsmxfKUdNYdWgOB0mWUypuLvAfQPH1+pyvRJs6euowbFkFC6P13w1l8mJyi3vxYMxc9kld5jZEGRQs6bw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "engines": { + "node": ">=18" + } + }, "node_modules/@develar/schema-utils": { "version": "2.6.5", "resolved": "https://registry.npmjs.org/@develar/schema-utils/-/schema-utils-2.6.5.tgz", @@ -8589,6 +8723,22 @@ "storybook": "^8.5.2" } }, + "node_modules/@storybook/addon-themes": { + "version": "8.5.2", + "resolved": "https://registry.npmjs.org/@storybook/addon-themes/-/addon-themes-8.5.2.tgz", + "integrity": "sha512-MTJkPwXqLK2Co186EUw2wr+1CpVRMbuWsOmQvhMHeU704kQtSYKkhu/xmaExuDYMupn5xiKG0p8Pt5Ck3fEObQ==", + "dev": true, + "dependencies": { + "ts-dedent": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "storybook": "^8.5.2" + } + }, "node_modules/@storybook/addon-toolbars": { "version": "8.5.2", "resolved": "https://registry.npmjs.org/@storybook/addon-toolbars/-/addon-toolbars-8.5.2.tgz", @@ -14859,12 +15009,13 @@ "license": "MIT" }, "node_modules/cssstyle": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-4.1.0.tgz", - "integrity": "sha512-h66W1URKpBS5YMI/V8PyXvTMFT8SupJ1IzoIV8IeBC/ji8WVmrO8dGlTi+2dh6whmdk6BiKJLD/ZBkhWbcg6nA==", + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-4.2.1.tgz", + "integrity": "sha512-9+vem03dMXG7gDmZ62uqmRiMRNtinIZ9ZyuF6BdxzfOD+FdN5hretzynkn0ReS2DO2GSw76RWHs0UmJPI2zUjw==", "license": "MIT", "dependencies": { - "rrweb-cssom": "^0.7.1" + "@asamuzakjp/css-color": "^2.8.2", + "rrweb-cssom": "^0.8.0" }, "engines": { "node": ">=18" @@ -21825,22 +21976,22 @@ } }, "node_modules/jsdom": { - "version": "25.0.1", - "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-25.0.1.tgz", - "integrity": "sha512-8i7LzZj7BF8uplX+ZyOlIz86V6TAsSs+np6m1kpW9u0JWi4z/1t+FzcK1aek+ybTnAC4KhBL4uXCNT0wcUIeCw==", + "version": "26.0.0", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-26.0.0.tgz", + "integrity": "sha512-BZYDGVAIriBWTpIxYzrXjv3E/4u8+/pSG5bQdIYCbNCGOvsPkDQfTVLAIXAf9ETdCpduCVTkDe2NNZ8NIwUVzw==", "license": "MIT", "dependencies": { - "cssstyle": "^4.1.0", + "cssstyle": "^4.2.1", "data-urls": "^5.0.0", "decimal.js": "^10.4.3", - "form-data": "^4.0.0", + "form-data": "^4.0.1", "html-encoding-sniffer": "^4.0.0", "http-proxy-agent": "^7.0.2", - "https-proxy-agent": "^7.0.5", + "https-proxy-agent": "^7.0.6", "is-potential-custom-element-name": "^1.0.1", - "nwsapi": "^2.2.12", - "parse5": "^7.1.2", - "rrweb-cssom": "^0.7.1", + "nwsapi": "^2.2.16", + "parse5": "^7.2.1", + "rrweb-cssom": "^0.8.0", "saxes": "^6.0.0", "symbol-tree": "^3.2.4", "tough-cookie": "^5.0.0", @@ -21848,7 +21999,7 @@ "webidl-conversions": "^7.0.0", "whatwg-encoding": "^3.1.1", "whatwg-mimetype": "^4.0.0", - "whatwg-url": "^14.0.0", + "whatwg-url": "^14.1.0", "ws": "^8.18.0", "xml-name-validator": "^5.0.0" }, @@ -21856,7 +22007,7 @@ "node": ">=18" }, "peerDependencies": { - "canvas": "^2.11.2" + "canvas": "^3.0.0" }, "peerDependenciesMeta": { "canvas": { @@ -21865,17 +22016,28 @@ } }, "node_modules/jsdom/node_modules/agent-base": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.1.tgz", - "integrity": "sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA==", + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.3.tgz", + "integrity": "sha512-jRR5wdylq8CkOe6hei19GGZnxM6rBGwFl3Bg0YItGDimvjGtAvdZk4Pu6Cl4u4Igsws4a1fd1Vq3ezrhn4KmFw==", "license": "MIT", - "dependencies": { - "debug": "^4.3.4" - }, "engines": { "node": ">= 14" } }, + "node_modules/jsdom/node_modules/form-data": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.1.tgz", + "integrity": "sha512-tzN8e4TX8+kkxGPK8D5u0FNmjPUjw3lwC9lSLxxoB/+GtsJG91CO8bSWy73APlgAZzZbXEYZJuxjkHH2w+Ezhw==", + "license": "MIT", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/jsdom/node_modules/http-proxy-agent": { "version": "7.0.2", "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", @@ -21889,6 +22051,19 @@ "node": ">= 14" } }, + "node_modules/jsdom/node_modules/https-proxy-agent": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz", + "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==", + "license": "MIT", + "dependencies": { + "agent-base": "^7.1.2", + "debug": "4" + }, + "engines": { + "node": ">= 14" + } + }, "node_modules/jsdom/node_modules/tough-cookie": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-5.0.0.tgz", @@ -21979,7 +22154,6 @@ "version": "2.2.3", "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", - "license": "MIT", "bin": { "json5": "lib/cli.js" }, @@ -25892,9 +26066,9 @@ } }, "node_modules/nwsapi": { - "version": "2.2.13", - "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.13.tgz", - "integrity": "sha512-cTGB9ptp9dY9A5VbMSe7fQBcl/tt22Vcqdq8+eN93rblOuE0aCFu4aZ2vMwct/2t+lFnosm8RkQW1I0Omb1UtQ==", + "version": "2.2.16", + "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.16.tgz", + "integrity": "sha512-F1I/bimDpj3ncaNDhfyMWuFqmQDBwDB0Fogc2qpL3BWvkQteFD/8BzWuIRl83rq0DXfm8SGt/HFhLXZyljTXcQ==", "license": "MIT" }, "node_modules/object-assign": { @@ -26456,9 +26630,9 @@ "license": "(MIT AND Zlib)" }, "node_modules/papaparse": { - "version": "5.4.1", - "resolved": "https://registry.npmjs.org/papaparse/-/papaparse-5.4.1.tgz", - "integrity": "sha512-HipMsgJkZu8br23pW15uvo6sib6wne/4woLZPlFf3rpDyMe9ywEXUsuD7+6K9PRkJlVT51j/sCOYDKGGS3ZJrw==", + "version": "5.5.2", + "resolved": "https://registry.npmjs.org/papaparse/-/papaparse-5.5.2.tgz", + "integrity": "sha512-PZXg8UuAc4PcVwLosEEDYjPyfWnTEhOrUfdv+3Bx+NuAb+5NhDmXzg5fHWmdCh1mP5p7JAZfFr3IMQfcntNAdA==", "license": "MIT" }, "node_modules/param-case": { @@ -28810,9 +28984,9 @@ } }, "node_modules/rrweb-cssom": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/rrweb-cssom/-/rrweb-cssom-0.7.1.tgz", - "integrity": "sha512-TrEMa7JGdVm0UThDJSx7ddw5nVm3UJS9o9CCIZ72B1vSyEZoziDqBYP3XIoi/12lKrJR8rE3jeFHMok2F/Mnsg==", + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/rrweb-cssom/-/rrweb-cssom-0.8.0.tgz", + "integrity": "sha512-guoltQEx+9aMf2gDZ0s62EcV8lsXR+0w8915TC3ITdn2YueuNjdAYh/levpU9nFaoChh9RUS5ZdQMrKfVEN9tw==", "license": "MIT" }, "node_modules/run-applescript": { @@ -33350,9 +33524,9 @@ } }, "node_modules/whatwg-url": { - "version": "14.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-14.0.0.tgz", - "integrity": "sha512-1lfMEm2IEr7RIV+f4lUNPOqfFL+pO+Xw3fJSqmjX9AbXcXcYOkCe1P6+9VBZB6n94af16NfZf+sSk0JCBZC9aw==", + "version": "14.1.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-14.1.0.tgz", + "integrity": "sha512-jlf/foYIKywAt3x/XWKZ/3rz8OSJPiWktjmk891alJUEjiVxKX9LEO92qH3hv4aJ0mN3MWPvGMCy8jQi95xK4w==", "license": "MIT", "dependencies": { "tr46": "^5.0.0", diff --git a/package.json b/package.json index 5145b058f6f..831e99089a4 100644 --- a/package.json +++ b/package.json @@ -52,6 +52,7 @@ "@storybook/addon-essentials": "8.5.2", "@storybook/addon-interactions": "8.5.2", "@storybook/addon-links": "8.5.2", + "@storybook/addon-themes": "8.5.2", "@storybook/angular": "8.5.2", "@storybook/manager-api": "8.5.2", "@storybook/theming": "8.5.2", @@ -114,6 +115,7 @@ "jest-junit": "16.0.0", "jest-mock-extended": "3.0.7", "jest-preset-angular": "14.1.1", + "json5": "2.2.3", "lint-staged": "15.4.1", "mini-css-extract-plugin": "2.9.2", "node-ipc": "9.2.1", @@ -154,7 +156,7 @@ "@angular/platform-browser": "18.2.13", "@angular/platform-browser-dynamic": "18.2.13", "@angular/router": "18.2.13", - "@bitwarden/sdk-internal": "0.2.0-main.38", + "@bitwarden/sdk-internal": "0.2.0-main.105", "@electron/fuses": "1.8.0", "@emotion/css": "11.13.5", "@koa/multer": "3.0.2", @@ -176,7 +178,7 @@ "https-proxy-agent": "7.0.5", "inquirer": "8.2.6", "jquery": "3.7.1", - "jsdom": "25.0.1", + "jsdom": "26.0.0", "jszip": "3.10.1", "koa": "2.15.3", "koa-bodyparser": "4.4.1", @@ -191,7 +193,7 @@ "nord": "0.2.1", "oidc-client-ts": "2.4.1", "open": "8.4.2", - "papaparse": "5.4.1", + "papaparse": "5.5.2", "patch-package": "8.0.0", "popper.js": "1.16.1", "proper-lockfile": "4.1.2", diff --git a/scripts/dep-ownership.ts b/scripts/dep-ownership.ts index e574a3e9e96..f0bcb1f7dd8 100644 --- a/scripts/dep-ownership.ts +++ b/scripts/dep-ownership.ts @@ -5,8 +5,10 @@ import fs from "fs"; import path from "path"; -const renovateConfig = JSON.parse( - fs.readFileSync(path.join(__dirname, "..", "..", ".github", "renovate.json"), "utf8"), +import JSON5 from "json5"; + +const renovateConfig = JSON5.parse( + fs.readFileSync(path.join(__dirname, "..", "..", ".github", "renovate.json5"), "utf8"), ); const packagesWithOwners = renovateConfig.packageRules diff --git a/tsconfig.eslint.json b/tsconfig.eslint.json index 611b30a3bdb..7ffa34df58c 100644 --- a/tsconfig.eslint.json +++ b/tsconfig.eslint.json @@ -40,12 +40,7 @@ "@bitwarden/vault-export-core": [".libs/tools/export/vault-export/vault-export-core/src"], "@bitwarden/vault-export-ui": [".libs/tools/export/vault-export/vault-export-ui/src"], "@bitwarden/vault": ["./libs/vault/src"] - }, - "plugins": [ - { - "transform": "typescript-transform-paths" - } - ] + } }, "files": [ ".storybook/main.ts", diff --git a/tsconfig.json b/tsconfig.json index e6e4c47096b..cfc33f572e8 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -44,9 +44,6 @@ "@bitwarden/web-vault/*": ["./apps/web/src/*"] }, "plugins": [ - { - "transform": "typescript-transform-paths" - }, { "name": "typescript-strict-plugin" }