diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index 2550f0fddbe..de28b210887 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -8,7 +8,8 @@ apps/desktop/desktop_native @bitwarden/team-platform-dev apps/desktop/desktop_native/objc/src/native/autofill @bitwarden/team-autofill-dev apps/desktop/desktop_native/core/src/autofill @bitwarden/team-autofill-dev -## No ownership for Cargo.toml to allow dependency updates +## No ownership fo Cargo.lock and Cargo.toml to allow dependency updates +apps/desktop/desktop_native/Cargo.lock apps/desktop/desktop_native/Cargo.toml ## Auth team files ## @@ -83,8 +84,6 @@ libs/common/src/platform @bitwarden/team-platform-dev libs/common/spec @bitwarden/team-platform-dev libs/common/src/state-migrations @bitwarden/team-platform-dev libs/platform @bitwarden/team-platform-dev -# Node-specifc platform files -libs/node @bitwarden/team-platform-dev # Web utils used across app and connectors apps/web/src/utils/ @bitwarden/team-platform-dev # Web core and shared files @@ -122,7 +121,7 @@ apps/desktop/src/autofill @bitwarden/team-autofill-dev libs/common/src/autofill @bitwarden/team-autofill-dev apps/desktop/macos/autofill-extension @bitwarden/team-autofill-dev apps/desktop/src/app/components/fido2placeholder.component.ts @bitwarden/team-autofill-dev -apps/desktop/desktop_native/windows-plugin-authenticator @bitwarden/team-autofill-dev +apps/desktop/desktop_native/windows_plugin_authenticator @bitwarden/team-autofill-dev # DuckDuckGo integration apps/desktop/native-messaging-test-runner @bitwarden/team-autofill-dev apps/desktop/src/services/duckduckgo-message-handler.service.ts @bitwarden/team-autofill-dev @@ -146,6 +145,8 @@ apps/cli/src/key-management @bitwarden/team-key-management-dev libs/key-management @bitwarden/team-key-management-dev libs/key-management-ui @bitwarden/team-key-management-dev libs/common/src/key-management @bitwarden/team-key-management-dev +# Node-cryptofunction service +libs/node @bitwarden/team-key-management-dev apps/desktop/desktop_native/core/src/biometric/ @bitwarden/team-key-management-dev apps/desktop/src/services/native-messaging.service.ts @bitwarden/team-key-management-dev diff --git a/.github/DISCUSSION_TEMPLATE/password-manager.yml b/.github/DISCUSSION_TEMPLATE/password-manager.yml index bf2d0900db9..1d464ca9504 100644 --- a/.github/DISCUSSION_TEMPLATE/password-manager.yml +++ b/.github/DISCUSSION_TEMPLATE/password-manager.yml @@ -1,8 +1,19 @@ +labels: ["discussions-new"] body: - type: markdown attributes: value: | - If you would like to contribute code to the Bitwarden codebase for consideration, please review [https://contributing.bitwarden.com/](https://contributing.bitwarden.com/) before posting. To keep discussion on topic, posts that do not include a proposal for a code contribution you wish to develop will be removed. For feature requests and community discussion, please visit https://community.bitwarden.com/ + If you would like to contribute code to the Bitwarden codebase for consideration, please review [https://contributing.bitwarden.com/](https://contributing.bitwarden.com/) before posting. To keep discussion on topic, posts that do not include a proposal for a code contribution you wish to develop will be removed. + - type: dropdown + attributes: + label: Select Topic Area + description: "What would you like to discuss? :warning: For feature requests and product feedback, please visit https://community.bitwarden.com/" + options: + - "✅ Code Contribution Proposal" + - "🚫 Product Feedback" + - "🚫 Feature Request" + validations: + required: true - type: textarea attributes: label: Code Contribution Proposal diff --git a/.github/DISCUSSION_TEMPLATE/secrets-manager.yml b/.github/DISCUSSION_TEMPLATE/secrets-manager.yml index bf2d0900db9..1d464ca9504 100644 --- a/.github/DISCUSSION_TEMPLATE/secrets-manager.yml +++ b/.github/DISCUSSION_TEMPLATE/secrets-manager.yml @@ -1,8 +1,19 @@ +labels: ["discussions-new"] body: - type: markdown attributes: value: | - If you would like to contribute code to the Bitwarden codebase for consideration, please review [https://contributing.bitwarden.com/](https://contributing.bitwarden.com/) before posting. To keep discussion on topic, posts that do not include a proposal for a code contribution you wish to develop will be removed. For feature requests and community discussion, please visit https://community.bitwarden.com/ + If you would like to contribute code to the Bitwarden codebase for consideration, please review [https://contributing.bitwarden.com/](https://contributing.bitwarden.com/) before posting. To keep discussion on topic, posts that do not include a proposal for a code contribution you wish to develop will be removed. + - type: dropdown + attributes: + label: Select Topic Area + description: "What would you like to discuss? :warning: For feature requests and product feedback, please visit https://community.bitwarden.com/" + options: + - "✅ Code Contribution Proposal" + - "🚫 Product Feedback" + - "🚫 Feature Request" + validations: + required: true - type: textarea attributes: label: Code Contribution Proposal diff --git a/.github/renovate.json5 b/.github/renovate.json5 index 01361a97404..ee97f16b0a9 100644 --- a/.github/renovate.json5 +++ b/.github/renovate.json5 @@ -4,10 +4,10 @@ enabledManagers: ["cargo", "github-actions", "npm"], packageRules: [ { - // Group all build/test/lint workflows for GitHub Actions together for Platform - // Since they are code owners we don't need to assign a review team in Renovate - // Any changes here should also be reflected in CODEOWNERS - groupName: "github-action minor", + // Group all build/test/lint workflows for GitHub Actions together for Platform. + // Since they are code owners we don't need to assign a review team in Renovate. + // Any changes here should also be reflected in CODEOWNERS. + groupName: "github-action", matchManagers: ["github-actions"], matchFileNames: [ "./github/workflows/automatic-issue-responses.yml", @@ -30,10 +30,10 @@ commitMessagePrefix: "[deps] Platform:", }, { - // Group all release-related workflows for GitHub Actions together for BRE - // Since they are code owners we don't need to assign a review team in Renovate - // Any changes here should also be reflected in CODEOWNERS - groupName: "github-action minor", + // Group all release-related workflows for GitHub Actions together for BRE. + // Since they are code owners we don't need to assign a review team in Renovate. + // Any changes here should also be reflected in CODEOWNERS. + groupName: "github-action", matchManagers: ["github-actions"], matchFileNames: [ "./github/workflows/brew-bump-desktop.yml", @@ -49,9 +49,10 @@ "./github/workflows/release-web.yml", ], commitMessagePrefix: "[deps] BRE:", + addLabels: ["hold"], }, { - // Disable major and minor updates for TypeScript and Zone.js because they are managed by Angular + // Disable major and minor updates for TypeScript and Zone.js because they are managed by Angular. matchPackageNames: ["typescript", "zone.js"], matchUpdateTypes: ["major", "minor"], description: "Determined by Angular", @@ -72,27 +73,27 @@ enabled: false, }, { - // Renovate should manage patch updates for TypeScript and Zone.js, despite ignoring major and minor + // Renovate should manage patch updates for TypeScript and Zone.js, despite ignoring major and minor. matchPackageNames: ["typescript", "zone.js"], matchUpdateTypes: "patch", }, { - // We want to update all the Jest-related packages together, to reduce PR noise + // We want to update all the Jest-related packages together, to reduce PR noise. groupName: "jest", matchPackageNames: ["@types/jest", "jest", "ts-jest", "jest-preset-angular"], }, { - // We need to group all napi-related packages together to avoid build errors caused by version incompatibilities + // We need to group all napi-related packages together to avoid build errors caused by version incompatibilities. groupName: "napi", matchPackageNames: ["napi", "napi-build", "napi-derive"], }, { - // We need to group all macOS/iOS binding-related packages together to avoid build errors caused by version incompatibilities + // We need to group all macOS/iOS binding-related packages together to avoid build errors caused by version incompatibilities. groupName: "macOS/iOS bindings", matchPackageNames: ["core-foundation", "security-framework", "security-framework-sys"], }, { - // We need to group all zbus-related packages together to avoid build errors caused by version incompatibilities + // We need to group all zbus-related packages together to avoid build errors caused by version incompatibilities. groupName: "zbus", matchPackageNames: ["zbus", "zbus_polkit"], }, @@ -175,6 +176,7 @@ "del", "ed25519", "lit", + "@lit-labs/signals", "patch-package", "pkcs8", "prettier", @@ -249,6 +251,7 @@ "napi-derive", "node-forge", "node-ipc", + "nx", "oo7", "oslog", "pin-project", @@ -274,6 +277,7 @@ "webpack-node-externals", "widestring", "windows", + "windows-future", "windows-registry", "zbus", "zbus_polkit", diff --git a/.github/workflows/auto-reply-discussions.yml b/.github/workflows/auto-reply-discussions.yml new file mode 100644 index 00000000000..8becc7471c5 --- /dev/null +++ b/.github/workflows/auto-reply-discussions.yml @@ -0,0 +1,112 @@ +name: Auto-reply to Discussions + +on: + discussion: + types: created + +jobs: + reply: + name: Auto-reply + runs-on: ubuntu-22.04 + + steps: + - name: Get discussion label and template name + id: discussion-label + uses: actions/github-script@60a0d83039c74a4aee543508d2ffcb1c3799cdea # v7.0.1 + with: + script: | + const discussion = context.payload.discussion; + const template_name = discussion.category.slug; + const label = discussion.labels?.[0]?.name ?? ''; + console.log('Discussion label:', label); + console.log('Discussion category slug:', template_name); + + core.setOutput('label', label); + core.setOutput('template_name', template_name); + + - name: Get selected topic + id: get_selected_topic + uses: actions/github-script@60a0d83039c74a4aee543508d2ffcb1c3799cdea # v7.0.1 + with: + result-encoding: string + script: | + try { + const body = context.payload.discussion.body; + const match = body.match(/### Select Topic Area\n\n(.*?)\n\n/); + console.log('Match:', match); + console.log('Match1:', match[1]); + return match ? match[1].trim() : ""; + } catch (error) { + console.error('Error getting selected topic:', error); + return ""; + } + + - name: Reply or close Discussion + uses: actions/github-script@60a0d83039c74a4aee543508d2ffcb1c3799cdea # v7.0.1 + env: + TEMPLATE_NAME: ${{ steps.discussion-label.outputs.template_name }} + TOPIC: ${{ steps.get_selected_topic.outputs.result }} + with: + script: | + async function addComment(discussionId, body) { + await github.graphql(` + mutation AddDiscussionComment($discussionId: ID!, $body: String!) { + addDiscussionComment(input: {discussionId: $discussionId, body: $body}) { + comment { + id + } + } + } + `, { + discussionId, + body + }); + } + + async function closeDiscussion(discussionId) { + await github.graphql(` + mutation { + closeDiscussion(input: {discussionId: "${discussionId}"}) { + discussion { + id + } + } + } + `); + console.log('♻️ Closing discussion'); + } + + const discussion = context.payload.discussion; + const isFeatureRequest = process.env.TEMPLATE_NAME === 'feature-request'; + const isTopicEmpty = !process.env.TOPIC || process.env.TOPIC.trim() === ''; // topic step may have failed + const isCodeTopic = process.env.TOPIC.includes('Code Contribution Proposal'); + const shouldClose = isFeatureRequest || (!isTopicEmpty && !isCodeTopic); + + console.log('Template name:', process.env.TEMPLATE_NAME); + console.log('Topic:', process.env.TOPIC); + console.log('isTopicEmpty:', isTopicEmpty); + console.log('isCodeTopic:', isCodeTopic); + console.log('shouldClose:', shouldClose); + + if (shouldClose) { + const closeMessage = + "Thank you for your contribution! GitHub Discussions is specifically for [proposing code](https://contributing.bitwarden.com/) that you would like to write for the Bitwarden codebase. Since this post does not appear to include a proposal, it will be closed. If you believe this was done in error or have any questions, please feel free to reach out to us!\n\n" + + "- :bulb: For feature requests and general discussions, please visit the [Bitwarden Community Forums](https://community.bitwarden.com/).\n" + + "- :information_source: For questions and support, visit the [Bitwarden Help Center](https://bitwarden.com/help/).\n" + + "- :bug: To report a potential bug, please visit the appropriate repository: [Server](https://github.com/bitwarden/server/issues) | [Clients](https://github.com/bitwarden/clients/issues) | [iOS](https://github.com/bitwarden/ios/issues) | [Android](https://github.com/bitwarden/android/issues)."; + + await addComment(discussion.node_id, closeMessage); + await closeDiscussion(discussion.node_id); + return; + } + + const replyMessage = + ":sparkles: Thank you for your code contribution proposal! While the Bitwarden team reviews your submission, we encourage you to check out our [contribution guidelines](https://contributing.bitwarden.com/).\n\n" + + "Please ensure that your code contribution includes a detailed description of what you would like to contribute, along with any relevant screenshots and links to existing feature requests. This information helps us gather feedback from the community and Bitwarden team members before you start writing code.\n\n" + + "To keep discussions focused, posts that do not include a proposal for a code contribution will be removed.\n\n" + + "- :bulb: For feature requests and general discussion, please visit the [Bitwarden Community Forums](https://community.bitwarden.com/).\n" + + "- :information_source: For questions and support, visit the [Bitwarden Help Center](https://bitwarden.com/help/).\n" + + "- :bug: To report a potential bug, please visit the corresponding repo. [Server](https://github.com/bitwarden/server/issues) | [Clients](https://github.com/bitwarden/clients/issues) | [iOS](https://github.com/bitwarden/ios/issues) | [Android](https://github.com/bitwarden/android/issues)\n\n" + + "Thank you for contributing to Bitwarden!"; + + await addComment(discussion.node_id, replyMessage); diff --git a/.github/workflows/build-browser-target.yml b/.github/workflows/build-browser-target.yml index 3334326920c..6f05cb71934 100644 --- a/.github/workflows/build-browser-target.yml +++ b/.github/workflows/build-browser-target.yml @@ -1,7 +1,13 @@ +# This workflow is intended to be run when we need to build the client and produce artifacts that require secrets +# when the PR source branch does not have access to secrets (e.g. a fork). +# This workflow will run in the context of the target of the PR and have access to secrets. +# This should only be done after reviewing the PR to ensure that no malicious code has been introduced, +# as it could allow the code on the forked branch to have access to workflow secrets. + name: Build Browser on PR Target on: - pull_request: + pull_request_target: types: [opened, synchronize] branches-ignore: - 'l10n_master' @@ -25,7 +31,7 @@ jobs: uses: bitwarden/gh-actions/.github/workflows/check-run.yml@main run-workflow: - name: Run Build Browser on PR Target + name: Build Browser needs: check-run if: ${{ github.event.pull_request.head.repo.full_name != github.repository }} uses: ./.github/workflows/build-browser.yml diff --git a/.github/workflows/build-browser.yml b/.github/workflows/build-browser.yml index 4748a6a9f15..f7b8eeabefe 100644 --- a/.github/workflows/build-browser.yml +++ b/.github/workflows/build-browser.yml @@ -1,3 +1,7 @@ +# This workflow will run in the context of the source of the PR. +# On a PR from a fork, the workflow will not have access to secrets, and so any parts of the build that require secrets will not run. +# If additional artifacts are needed, the failed "build-browser-target.yml" workflow held up by the check-run should be re-run. + name: Build Browser on: diff --git a/.github/workflows/build-cli-target.yml b/.github/workflows/build-cli-target.yml index 81ec4178681..f817046ff30 100644 --- a/.github/workflows/build-cli-target.yml +++ b/.github/workflows/build-cli-target.yml @@ -1,7 +1,13 @@ +# This workflow is intended to be run when we need to build the client and produce artifacts that require secrets +# when the PR source branch does not have access to secrets (e.g. a fork). +# This workflow will run in the context of the target of the PR and have access to secrets. +# This should only be done after reviewing the PR to ensure that no malicious code has been introduced, +# as it could allow the code on the forked branch to have access to workflow secrets. + name: Build CLI on PR Target on: - pull_request: + pull_request_target: types: [opened, synchronize] branches-ignore: - 'l10n_master' @@ -25,7 +31,7 @@ jobs: uses: bitwarden/gh-actions/.github/workflows/check-run.yml@main run-workflow: - name: Run Build CLI on PR Target + name: Build CLI needs: check-run if: ${{ github.event.pull_request.head.repo.full_name != github.repository }} uses: ./.github/workflows/build-cli.yml diff --git a/.github/workflows/build-cli.yml b/.github/workflows/build-cli.yml index 8599a699d9d..e89ca59a297 100644 --- a/.github/workflows/build-cli.yml +++ b/.github/workflows/build-cli.yml @@ -1,3 +1,7 @@ +# This workflow will run in the context of the source of the PR. +# On a PR from a fork, the workflow will not have access to secrets, and so any parts of the build that require secrets will not run. +# If additional artifacts are needed, the failed "build-cli-target.yml" workflow held up by the check-run should be re-run. + name: Build CLI on: @@ -8,12 +12,13 @@ on: - 'cf-pages' paths: - 'apps/cli/**' + - 'bitwarden_license/bit-cli/**' + - 'bitwarden_license/bit-common/**' - 'libs/**' - '*' - '!*.md' - '!*.txt' - '.github/workflows/build-cli.yml' - - 'bitwarden_license/bit-cli/**' push: branches: - 'main' @@ -21,12 +26,13 @@ on: - 'hotfix-rc-cli' paths: - 'apps/cli/**' + - 'bitwarden_license/bit-cli/**' + - 'bitwarden_license/bit-common/**' - 'libs/**' - '*' - '!*.md' - '!*.txt' - '.github/workflows/build-cli.yml' - - 'bitwarden_license/bit-cli/**' workflow_call: inputs: {} workflow_dispatch: @@ -83,6 +89,7 @@ jobs: os: [ { base: "linux", distro: "ubuntu-22.04", target_suffix: "" }, + { base: "linux", distro: "ubuntu-22.04-arm", target_suffix: "-arm64" }, { base: "mac", distro: "macos-13", target_suffix: "" }, { base: "mac", distro: "macos-14", target_suffix: "-arm64" } ] @@ -126,7 +133,7 @@ jobs: if: ${{ inputs.sdk_branch != '' && needs.setup.outputs.has_secrets == 'true' }} uses: bitwarden/gh-actions/download-artifacts@main with: - github_token: ${{secrets.GITHUB_TOKEN}} + github_token: ${{ secrets.GITHUB_TOKEN }} workflow: build-wasm-internal.yml workflow_conclusion: success branch: ${{ inputs.sdk_branch }} @@ -302,7 +309,7 @@ jobs: if: ${{ inputs.sdk_branch != '' && needs.setup.outputs.has_secrets == 'true' }} uses: bitwarden/gh-actions/download-artifacts@main with: - github_token: ${{secrets.GITHUB_TOKEN}} + github_token: ${{ secrets.GITHUB_TOKEN }} workflow: build-wasm-internal.yml workflow_conclusion: success branch: ${{ inputs.sdk_branch }} diff --git a/.github/workflows/build-desktop-target.yml b/.github/workflows/build-desktop-target.yml index 8c26f991174..65772223722 100644 --- a/.github/workflows/build-desktop-target.yml +++ b/.github/workflows/build-desktop-target.yml @@ -1,7 +1,14 @@ + +# This workflow is intended to be run when we need to build the client and produce artifacts that require secrets +# when the PR source branch does not have access to secrets (e.g. a fork). +# This workflow will run in the context of the target of the PR and have access to secrets. +# This should only be done after reviewing the PR to ensure that no malicious code has been introduced, +# as it could allow the code on the forked branch to have access to workflow secrets. + name: Build Desktop on PR Target on: - pull_request: + pull_request_target: types: [opened, synchronize] branches-ignore: - 'l10n_master' @@ -24,7 +31,7 @@ jobs: uses: bitwarden/gh-actions/.github/workflows/check-run.yml@main run-workflow: - name: Run Build Desktop on PR Target + name: Build Desktop needs: check-run if: ${{ github.event.pull_request.head.repo.full_name != github.repository }} uses: ./.github/workflows/build-desktop.yml diff --git a/.github/workflows/build-desktop.yml b/.github/workflows/build-desktop.yml index 48ecca540e8..86dc74f7351 100644 --- a/.github/workflows/build-desktop.yml +++ b/.github/workflows/build-desktop.yml @@ -1,3 +1,7 @@ +# This workflow will run in the context of the source of the PR. +# On a PR from a fork, the workflow will not have access to secrets, and so any parts of the build that require secrets will not run. +# If additional artifacts are needed, the failed "build-desktop-target.yml" workflow held up by the check-run should be re-run. + name: Build Desktop on: @@ -33,6 +37,10 @@ on: description: "Custom SDK branch" required: false type: string + testflight_distribute: + description: "Force distribute to TestFlight regardless of branch (useful for QA testing on feature branches)" + type: boolean + default: true defaults: run: @@ -84,6 +92,7 @@ jobs: id: retrieve-version run: | PKG_VERSION=$(jq -r .version src/package.json) + echo "Setting version number to $PKG_VERSION" echo "package_version=$PKG_VERSION" >> $GITHUB_OUTPUT - name: Increment Version @@ -193,7 +202,7 @@ jobs: if: ${{ inputs.sdk_branch != '' }} uses: bitwarden/gh-actions/download-artifacts@main with: - github_token: ${{secrets.GITHUB_TOKEN}} + github_token: ${{ secrets.GITHUB_TOKEN }} workflow: build-wasm-internal.yml workflow_conclusion: success branch: ${{ inputs.sdk_branch }} @@ -229,7 +238,7 @@ jobs: TARGET: musl run: | rustup target add x86_64-unknown-linux-musl - node build.js cross-platform + node build.js --target=x86_64-unknown-linux-musl --release - name: Build application run: npm run dist:lin @@ -290,6 +299,103 @@ jobs: if-no-files-found: error + linux-arm64: + name: Linux ARM64 Build + # Note, before updating the ubuntu version of the workflow, ensure the snap base image + # is equal or greater than the new version. Otherwise there might be GLIBC version issues. + # The snap base for desktop is defined in `apps/desktop/electron-builder.json` + # We intentionally keep this runner on the oldest supported OS in GitHub Actions + # for maximum compatibility across GLIBC versions + runs-on: ubuntu-22.04-arm + needs: setup + env: + _PACKAGE_VERSION: ${{ needs.setup.outputs.package_version }} + _NODE_VERSION: ${{ needs.setup.outputs.node_version }} + NODE_OPTIONS: --max_old_space_size=4096 + defaults: + run: + working-directory: apps/desktop + steps: + - name: Check out repo + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + with: + ref: ${{ github.event.pull_request.head.sha }} + + - name: Set up Node + uses: actions/setup-node@39370e3970a6d050c480ffad4ff0ed4d3fdee5af # v4.1.0 + with: + cache: 'npm' + cache-dependency-path: '**/package-lock.json' + node-version: ${{ env._NODE_VERSION }} + + - name: Set up environment + run: | + sudo apt-get update + sudo apt-get -y install pkg-config libxss-dev rpm musl-dev musl-tools flatpak flatpak-builder + + - name: Print environment + run: | + node --version + npm --version + snap --version + snapcraft --version || echo 'snapcraft unavailable' + + - name: Install Node dependencies + run: npm ci + working-directory: ./ + + - name: Download SDK Artifacts + if: ${{ inputs.sdk_branch != '' }} + uses: bitwarden/gh-actions/download-artifacts@main + with: + github_token: ${{ secrets.GITHUB_TOKEN }} + workflow: build-wasm-internal.yml + workflow_conclusion: success + branch: ${{ inputs.sdk_branch }} + artifacts: sdk-internal + repo: bitwarden/sdk-internal + path: ../sdk-internal + if_no_artifact_found: fail + + - name: Override SDK + if: ${{ inputs.sdk_branch != '' }} + working-directory: ./ + run: | + ls -l ../ + npm link ../sdk-internal + + - name: Cache Native Module + uses: actions/cache@1bd1e32a3bdc45362d1e726936510720a7c30a57 # v4.2.0 + id: cache + with: + path: | + apps/desktop/desktop_native/napi/*.node + apps/desktop/desktop_native/dist/* + ${{ env.RUNNER_TEMP }}/.cargo/registry + ${{ env.RUNNER_TEMP }}/.cargo/git + key: rust-${{ runner.os }}-${{ runner.arch }}-${{ hashFiles('apps/desktop/desktop_native/**/*') }} + + - name: Build Native Module + if: steps.cache.outputs.cache-hit != 'true' + working-directory: apps/desktop/desktop_native + env: + PKG_CONFIG_ALLOW_CROSS: true + PKG_CONFIG_ALL_STATIC: true + TARGET: musl + run: | + rustup target add aarch64-unknown-linux-musl + node build.js --target=aarch64-unknown-linux-musl --release + + - name: Build application + run: npm run dist:lin:arm64 + + - name: Upload tar.gz artifact + uses: actions/upload-artifact@6f51ac03b9356f520e9adb1b1b7802705f340c2b # v4.5.0 + with: + name: bitwarden_${{ env._PACKAGE_VERSION }}_arm64.tar.gz + path: apps/desktop/dist/bitwarden_desktop_arm64.tar.gz + if-no-files-found: error + windows: name: Windows Build runs-on: windows-2022 @@ -361,7 +467,7 @@ jobs: if: ${{ inputs.sdk_branch != '' && needs.setup.outputs.has_secrets == 'true' }} uses: bitwarden/gh-actions/download-artifacts@main with: - github_token: ${{secrets.GITHUB_TOKEN}} + github_token: ${{ secrets.GITHUB_TOKEN }} workflow: build-wasm-internal.yml workflow_conclusion: success branch: ${{ inputs.sdk_branch }} @@ -620,6 +726,11 @@ jobs: --file $HOME/secrets/bitwarden_desktop_appstore.provisionprofile \ --output none + az storage blob download --account-name $ACCOUNT_NAME --container-name $CONTAINER_NAME \ + --name bitwarden_desktop_autofill_app_store_2024.provisionprofile \ + --file $HOME/secrets/bitwarden_desktop_autofill_app_store_2024.provisionprofile \ + --output none + - name: Get certificates if: ${{ needs.setup.outputs.has_secrets == 'true' }} run: | @@ -679,6 +790,15 @@ jobs: cp $HOME/secrets/bitwarden_desktop_appstore.provisionprofile \ $GITHUB_WORKSPACE/apps/desktop/bitwarden_desktop_appstore.provisionprofile + mkdir -p $HOME/Library/MobileDevice/Provisioning\ Profiles + export APP_UUID=`grep UUID -A1 -a $HOME/secrets/bitwarden_desktop_appstore.provisionprofile | grep -io "[-A-Z0-9]\{36\}"` + export AUTOFILL_UUID=`grep UUID -A1 -a $HOME/secrets/bitwarden_desktop_autofill_app_store_2024.provisionprofile | grep -io "[-A-Z0-9]\{36\}"` + + cp $HOME/secrets/bitwarden_desktop_appstore.provisionprofile \ + $HOME/Library/MobileDevice/Provisioning\ Profiles/$APP_UUID.provisionprofile + cp $HOME/secrets/bitwarden_desktop_autofill_app_store_2024.provisionprofile \ + $HOME/Library/MobileDevice/Provisioning\ Profiles/$AUTOFILL_UUID.provisionprofile + - name: Increment version shell: pwsh env: @@ -697,7 +817,7 @@ jobs: if: ${{ inputs.sdk_branch != '' && needs.setup.outputs.has_secrets == 'true' }} uses: bitwarden/gh-actions/download-artifacts@main with: - github_token: ${{secrets.GITHUB_TOKEN}} + github_token: ${{ secrets.GITHUB_TOKEN }} workflow: build-wasm-internal.yml workflow_conclusion: success branch: ${{ inputs.sdk_branch }} @@ -809,8 +929,13 @@ jobs: mkdir -p $HOME/secrets az storage blob download --account-name $ACCOUNT_NAME --container-name $CONTAINER_NAME \ - --name bitwarden_desktop_appstore.provisionprofile \ - --file $HOME/secrets/bitwarden_desktop_appstore.provisionprofile \ + --name bitwarden_desktop_developer_id.provisionprofile \ + --file $HOME/secrets/bitwarden_desktop_developer_id.provisionprofile \ + --output none + + az storage blob download --account-name $ACCOUNT_NAME --container-name $CONTAINER_NAME \ + --name bitwarden_desktop_autofill_developer_id.provisionprofile \ + --file $HOME/secrets/bitwarden_desktop_autofill_developer_id.provisionprofile \ --output none - name: Get certificates @@ -853,21 +978,21 @@ jobs: security import "$HOME/certificates/devid-installer-cert.p12" -k build.keychain -P "" \ -T /usr/bin/codesign -T /usr/bin/security -T /usr/bin/productbuild - security import "$HOME/certificates/appstore-app-cert.p12" -k build.keychain -P "" \ - -T /usr/bin/codesign -T /usr/bin/security -T /usr/bin/productbuild - - security import "$HOME/certificates/appstore-installer-cert.p12" -k build.keychain -P "" \ - -T /usr/bin/codesign -T /usr/bin/security -T /usr/bin/productbuild - - security import "$HOME/certificates/macdev-cert.p12" -k build.keychain -P "" \ - -T /usr/bin/codesign -T /usr/bin/security -T /usr/bin/productbuild - security set-key-partition-list -S apple-tool:,apple:,codesign: -s -k $KEYCHAIN_PASSWORD build.keychain - name: Set up provisioning profiles run: | - cp $HOME/secrets/bitwarden_desktop_appstore.provisionprofile \ - $GITHUB_WORKSPACE/apps/desktop/bitwarden_desktop_appstore.provisionprofile + cp $HOME/secrets/bitwarden_desktop_developer_id.provisionprofile \ + $GITHUB_WORKSPACE/apps/desktop/bitwarden_desktop_developer_id.provisionprofile + + mkdir -p $HOME/Library/MobileDevice/Provisioning\ Profiles + export APP_UUID=`grep UUID -A1 -a $HOME/secrets/bitwarden_desktop_developer_id.provisionprofile | grep -io "[-A-Z0-9]\{36\}"` + export AUTOFILL_UUID=`grep UUID -A1 -a $HOME/secrets/bitwarden_desktop_autofill_developer_id.provisionprofile | grep -io "[-A-Z0-9]\{36\}"` + + cp $HOME/secrets/bitwarden_desktop_developer_id.provisionprofile \ + $HOME/Library/MobileDevice/Provisioning\ Profiles/$APP_UUID.provisionprofile + cp $HOME/secrets/bitwarden_desktop_autofill_developer_id.provisionprofile \ + $HOME/Library/MobileDevice/Provisioning\ Profiles/$AUTOFILL_UUID.provisionprofile - name: Increment version shell: pwsh @@ -887,7 +1012,7 @@ jobs: if: ${{ inputs.sdk_branch != '' }} uses: bitwarden/gh-actions/download-artifacts@main with: - github_token: ${{secrets.GITHUB_TOKEN}} + github_token: ${{ secrets.GITHUB_TOKEN }} workflow: build-wasm-internal.yml workflow_conclusion: success branch: ${{ inputs.sdk_branch }} @@ -915,7 +1040,9 @@ jobs: - name: Build Native Module if: steps.cache.outputs.cache-hit != 'true' working-directory: apps/desktop/desktop_native - run: node build.js cross-platform + run: | + rustup target add aarch64-apple-darwin + node build.js cross-platform - name: Build if: steps.build-cache.outputs.cache-hit != 'true' @@ -1062,6 +1189,11 @@ jobs: --file $HOME/secrets/bitwarden_desktop_appstore.provisionprofile \ --output none + az storage blob download --account-name $ACCOUNT_NAME --container-name $CONTAINER_NAME \ + --name bitwarden_desktop_autofill_app_store_2024.provisionprofile \ + --file $HOME/secrets/bitwarden_desktop_autofill_app_store_2024.provisionprofile \ + --output none + - name: Get certificates run: | mkdir -p $HOME/certificates @@ -1096,21 +1228,12 @@ jobs: security import "$HOME/certificates/bitwarden-desktop-key.p12" -k build.keychain -P "" \ -T /usr/bin/codesign -T /usr/bin/security -T /usr/bin/productbuild - security import "$HOME/certificates/devid-app-cert.p12" -k build.keychain -P "" \ - -T /usr/bin/codesign -T /usr/bin/security -T /usr/bin/productbuild - - security import "$HOME/certificates/devid-installer-cert.p12" -k build.keychain -P "" \ - -T /usr/bin/codesign -T /usr/bin/security -T /usr/bin/productbuild - security import "$HOME/certificates/appstore-app-cert.p12" -k build.keychain -P "" \ -T /usr/bin/codesign -T /usr/bin/security -T /usr/bin/productbuild security import "$HOME/certificates/appstore-installer-cert.p12" -k build.keychain -P "" \ -T /usr/bin/codesign -T /usr/bin/security -T /usr/bin/productbuild - security import "$HOME/certificates/macdev-cert.p12" -k build.keychain -P "" \ - -T /usr/bin/codesign -T /usr/bin/security -T /usr/bin/productbuild - security set-key-partition-list -S apple-tool:,apple:,codesign: -s -k $KEYCHAIN_PASSWORD build.keychain - name: Set up provisioning profiles @@ -1118,6 +1241,15 @@ jobs: cp $HOME/secrets/bitwarden_desktop_appstore.provisionprofile \ $GITHUB_WORKSPACE/apps/desktop/bitwarden_desktop_appstore.provisionprofile + mkdir -p $HOME/Library/MobileDevice/Provisioning\ Profiles + export APP_UUID=`grep UUID -A1 -a $HOME/secrets/bitwarden_desktop_appstore.provisionprofile | grep -io "[-A-Z0-9]\{36\}"` + export AUTOFILL_UUID=`grep UUID -A1 -a $HOME/secrets/bitwarden_desktop_autofill_app_store_2024.provisionprofile | grep -io "[-A-Z0-9]\{36\}"` + + cp $HOME/secrets/bitwarden_desktop_appstore.provisionprofile \ + $HOME/Library/MobileDevice/Provisioning\ Profiles/$APP_UUID.provisionprofile + cp $HOME/secrets/bitwarden_desktop_autofill_app_store_2024.provisionprofile \ + $HOME/Library/MobileDevice/Provisioning\ Profiles/$AUTOFILL_UUID.provisionprofile + - name: Increment version shell: pwsh env: @@ -1136,7 +1268,7 @@ jobs: if: ${{ inputs.sdk_branch != '' }} uses: bitwarden/gh-actions/download-artifacts@main with: - github_token: ${{secrets.GITHUB_TOKEN}} + github_token: ${{ secrets.GITHUB_TOKEN }} workflow: build-wasm-internal.yml workflow_conclusion: success branch: ${{ inputs.sdk_branch }} @@ -1164,7 +1296,9 @@ jobs: - name: Build Native Module if: steps.cache.outputs.cache-hit != 'true' working-directory: apps/desktop/desktop_native - run: node build.js cross-platform + run: | + rustup target add aarch64-apple-darwin + node build.js cross-platform - name: Build if: steps.build-cache.outputs.cache-hit != 'true' @@ -1208,21 +1342,45 @@ jobs: path: apps/desktop/dist/mas-universal/Bitwarden-${{ env._PACKAGE_VERSION }}-universal.pkg if-no-files-found: error + - name: Create secrets for Fastlane + if: | + github.event_name != 'pull_request_target' + && (inputs.testflight_distribute || github.ref == 'refs/heads/main' || github.ref == 'refs/heads/rc' || github.ref == 'refs/heads/hotfix-rc-desktop') + run: | + brew install gsed + + KEY_WITHOUT_NEWLINES=$(gsed -E ':a;N;$!ba;s/\r{0,1}\n/\\n/g' ~/private_keys/AuthKey_6TV9MKN3GP.p8) + + cat << EOF > ~/secrets/appstoreconnect-fastlane.json + { + "issuer_id": "${{ secrets.APP_STORE_CONNECT_TEAM_ISSUER }}", + "key_id": "6TV9MKN3GP", + "key": "$KEY_WITHOUT_NEWLINES" + } + EOF + - name: Deploy to TestFlight id: testflight-deploy if: | github.event_name != 'pull_request_target' - && (github.ref == 'refs/heads/main' || github.ref == 'refs/heads/rc' || github.ref == 'refs/heads/hotfix-rc-desktop') + && (inputs.testflight_distribute || github.ref == 'refs/heads/main' || github.ref == 'refs/heads/rc' || github.ref == 'refs/heads/hotfix-rc-desktop') env: APP_STORE_CONNECT_TEAM_ISSUER: ${{ secrets.APP_STORE_CONNECT_TEAM_ISSUER }} APP_STORE_CONNECT_AUTH_KEY: 6TV9MKN3GP + BRANCH: ${{ github.ref }} run: | - xcrun altool \ - --upload-app \ - --type macos \ - --file "$(find ./dist/mas-universal/Bitwarden*.pkg)" \ - --apiKey $APP_STORE_CONNECT_AUTH_KEY \ - --apiIssuer $APP_STORE_CONNECT_TEAM_ISSUER + + GIT_CHANGE="$(git show -s --format=%s)" + + BRANCH=$(echo $BRANCH | sed 's/refs\/heads\///') + + CHANGELOG="$BRANCH: $GIT_CHANGE" + + fastlane pilot upload \ + --app_identifier "com.bitwarden.desktop" \ + --changelog "$CHANGELOG" \ + --api_key_path $HOME/secrets/appstoreconnect-fastlane.json \ + --pkg "$(find ./dist/mas-universal/Bitwarden*.pkg)" - name: Post message to a Slack channel id: slack-message @@ -1249,226 +1407,6 @@ jobs: env: BUILD_NUMBER: ${{ needs.setup.outputs.build_number }} - - 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 - - setup - env: - _PACKAGE_VERSION: ${{ needs.setup.outputs.package_version }} - _NODE_VERSION: ${{ needs.setup.outputs.node_version }} - NODE_OPTIONS: --max_old_space_size=4096 - defaults: - run: - working-directory: apps/desktop - steps: - - name: Check out repo - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 - with: - ref: ${{ github.event.pull_request.head.sha }} - - - name: Set up Node - uses: actions/setup-node@39370e3970a6d050c480ffad4ff0ed4d3fdee5af # v4.1.0 - with: - cache: 'npm' - cache-dependency-path: '**/package-lock.json' - node-version: ${{ env._NODE_VERSION }} - - - name: Set up Node-gyp - run: python3 -m pip install setuptools - - - name: Print environment - run: | - node --version - npm --version - echo "GitHub ref: $GITHUB_REF" - echo "GitHub event: $GITHUB_EVENT" - - - name: Get Build Cache - id: build-cache - uses: actions/cache@1bd1e32a3bdc45362d1e726936510720a7c30a57 # v4.2.0 - with: - path: apps/desktop/build - key: ${{ runner.os }}-${{ github.run_id }}-build - - - name: Setup Safari Cache - id: safari-cache - uses: actions/cache@1bd1e32a3bdc45362d1e726936510720a7c30a57 # v4.2.0 - with: - path: apps/browser/dist/Safari - key: ${{ runner.os }}-${{ github.run_id }}-safari-extension - - - name: Login to Azure - uses: Azure/login@e15b166166a8746d1a47596803bd8c1b595455cf # v1.6.0 - with: - creds: ${{ secrets.AZURE_KV_CI_SERVICE_PRINCIPAL }} - - - name: Download Provisioning Profiles secrets - env: - ACCOUNT_NAME: bitwardenci - CONTAINER_NAME: profiles - run: | - mkdir -p $HOME/secrets - - az storage blob download --account-name $ACCOUNT_NAME --container-name $CONTAINER_NAME \ - --name bitwarden_desktop_appstore.provisionprofile \ - --file $HOME/secrets/bitwarden_desktop_appstore.provisionprofile \ - --output none - - - name: Get certificates - run: | - mkdir -p $HOME/certificates - - az keyvault secret show --id https://bitwarden-ci.vault.azure.net/certificates/bitwarden-desktop-key | - jq -r .value | base64 -d > $HOME/certificates/bitwarden-desktop-key.p12 - - az keyvault secret show --id https://bitwarden-ci.vault.azure.net/certificates/appstore-app-cert | - jq -r .value | base64 -d > $HOME/certificates/appstore-app-cert.p12 - - az keyvault secret show --id https://bitwarden-ci.vault.azure.net/certificates/appstore-installer-cert | - jq -r .value | base64 -d > $HOME/certificates/appstore-installer-cert.p12 - - az keyvault secret show --id https://bitwarden-ci.vault.azure.net/certificates/devid-app-cert | - jq -r .value | base64 -d > $HOME/certificates/devid-app-cert.p12 - - az keyvault secret show --id https://bitwarden-ci.vault.azure.net/certificates/devid-installer-cert | - jq -r .value | base64 -d > $HOME/certificates/devid-installer-cert.p12 - - az keyvault secret show --id https://bitwarden-ci.vault.azure.net/certificates/macdev-cert | - jq -r .value | base64 -d > $HOME/certificates/macdev-cert.p12 - - - name: Set up keychain - env: - KEYCHAIN_PASSWORD: ${{ secrets.KEYCHAIN_PASSWORD }} - run: | - security create-keychain -p $KEYCHAIN_PASSWORD build.keychain - security default-keychain -s build.keychain - security unlock-keychain -p $KEYCHAIN_PASSWORD build.keychain - security set-keychain-settings -lut 1200 build.keychain - - security import "$HOME/certificates/bitwarden-desktop-key.p12" -k build.keychain -P "" \ - -T /usr/bin/codesign -T /usr/bin/security -T /usr/bin/productbuild - - security import "$HOME/certificates/devid-app-cert.p12" -k build.keychain -P "" \ - -T /usr/bin/codesign -T /usr/bin/security -T /usr/bin/productbuild - - security import "$HOME/certificates/devid-installer-cert.p12" -k build.keychain -P "" \ - -T /usr/bin/codesign -T /usr/bin/security -T /usr/bin/productbuild - - security import "$HOME/certificates/appstore-app-cert.p12" -k build.keychain -P "" \ - -T /usr/bin/codesign -T /usr/bin/security -T /usr/bin/productbuild - - security import "$HOME/certificates/appstore-installer-cert.p12" -k build.keychain -P "" \ - -T /usr/bin/codesign -T /usr/bin/security -T /usr/bin/productbuild - - security import "$HOME/certificates/macdev-cert.p12" -k build.keychain -P "" \ - -T /usr/bin/codesign -T /usr/bin/security -T /usr/bin/productbuild - - security set-key-partition-list -S apple-tool:,apple:,codesign: -s -k $KEYCHAIN_PASSWORD build.keychain - - - name: Set up provisioning profiles - run: | - cp $HOME/secrets/bitwarden_desktop_appstore.provisionprofile \ - $GITHUB_WORKSPACE/apps/desktop/bitwarden_desktop_appstore.provisionprofile - - - name: Increment version - shell: pwsh - env: - BUILD_NUMBER: ${{ needs.setup.outputs.build_number }} - run: | - $package = Get-Content -Raw -Path electron-builder.json | ConvertFrom-Json - $package | Add-Member -MemberType NoteProperty -Name buildVersion -Value "$env:BUILD_NUMBER" - $package | ConvertTo-Json -Depth 32 | Set-Content -Path electron-builder.json - Write-Output "### MacOS Dev build number: $env:BUILD_NUMBER" - - - name: Install Node dependencies - run: npm ci - working-directory: ./ - - - name: Download SDK Artifacts - if: ${{ inputs.sdk_branch != '' }} - uses: bitwarden/gh-actions/download-artifacts@main - with: - github_token: ${{secrets.GITHUB_TOKEN}} - workflow: build-wasm-internal.yml - workflow_conclusion: success - branch: ${{ inputs.sdk_branch }} - artifacts: sdk-internal - repo: bitwarden/sdk-internal - path: ../sdk-internal - if_no_artifact_found: fail - - - name: Override SDK - if: ${{ inputs.sdk_branch != '' }} - working-directory: ./ - run: | - ls -l ../ - npm link ../sdk-internal - - - name: Cache Native Module - uses: actions/cache@1bd1e32a3bdc45362d1e726936510720a7c30a57 # v4.2.0 - id: cache - with: - path: | - apps/desktop/desktop_native/napi/*.node - apps/desktop/desktop_native/dist/* - key: rust-${{ runner.os }}-${{ hashFiles('apps/desktop/desktop_native/**/*') }} - - - name: Build Native Module - if: steps.cache.outputs.cache-hit != 'true' - working-directory: apps/desktop/desktop_native - run: node build.js cross-platform - - - name: Build - if: steps.build-cache.outputs.cache-hit != 'true' - run: npm run build - - - name: Download Browser artifact - uses: actions/download-artifact@fa0a91b85d4f404e444e00e005971372dc801d16 # v4.1.8 - with: - path: ${{ github.workspace }}/browser-build-artifacts - - - name: Unzip Safari artifact - run: | - SAFARI_DIR=$(find $GITHUB_WORKSPACE/browser-build-artifacts -name 'dist-safari-*.zip') - echo $SAFARI_DIR - unzip $SAFARI_DIR/dist-safari.zip -d $GITHUB_WORKSPACE/browser-build-artifacts - - - name: Load Safari extension for App Store - run: | - mkdir PlugIns - cp -r $GITHUB_WORKSPACE/browser-build-artifacts/Safari/masdev/build/Release/safari.appex PlugIns/safari.appex - - - name: Set up private auth key - run: | - mkdir ~/private_keys - cat << EOF > ~/private_keys/AuthKey_6TV9MKN3GP.p8 - ${{ secrets.APP_STORE_CONNECT_AUTH_KEY }} - EOF - - - name: Build dev application for App Store - env: - APP_STORE_CONNECT_TEAM_ISSUER: ${{ secrets.APP_STORE_CONNECT_TEAM_ISSUER }} - APP_STORE_CONNECT_AUTH_KEY_PATH: ~/private_keys/AuthKey_6TV9MKN3GP.p8 - run: npm run pack:mac:masdev - - - name: Zip masdev asset - run: | - cd dist/mas-dev-universal - zip -r Bitwarden-${{ env._PACKAGE_VERSION }}-masdev-universal.zip Bitwarden.app - - - name: Upload masdev artifact - uses: actions/upload-artifact@65c4c4a1ddee5b72f698fdd19549f0f0fb45cf08 # v4.6.0 - with: - name: Bitwarden-${{ env._PACKAGE_VERSION }}-masdev-universal.zip - path: apps/desktop/dist/mas-dev-universal/Bitwarden-${{ env._PACKAGE_VERSION }}-masdev-universal.zip - if-no-files-found: error - - crowdin-push: name: Crowdin Push if: github.event_name != 'pull_request_target' && github.ref == 'refs/heads/main' diff --git a/.github/workflows/build-web-target.yml b/.github/workflows/build-web-target.yml index fb7074292b5..8f06d066d34 100644 --- a/.github/workflows/build-web-target.yml +++ b/.github/workflows/build-web-target.yml @@ -1,7 +1,13 @@ +# This workflow is intended to be run when we need to build the client and produce artifacts that require secrets +# when the PR source branch does not have access to secrets (e.g. a fork). +# This workflow will run in the context of the target of the PR and have access to secrets. +# This should only be done after reviewing the PR to ensure that no malicious code has been introduced, +# as it could allow the code on the forked branch to have access to workflow secrets. + name: Build Web on PR Target on: - pull_request: + pull_request_target: types: [opened, synchronize] branches-ignore: - 'l10n_master' @@ -24,7 +30,7 @@ jobs: uses: bitwarden/gh-actions/.github/workflows/check-run.yml@main run-workflow: - name: Run Build Web on PR Target + name: Build Web needs: check-run if: ${{ github.event.pull_request.head.repo.full_name != github.repository }} uses: ./.github/workflows/build-web.yml diff --git a/.github/workflows/build-web.yml b/.github/workflows/build-web.yml index e91fba2e87a..fb429468134 100644 --- a/.github/workflows/build-web.yml +++ b/.github/workflows/build-web.yml @@ -1,3 +1,7 @@ +# This workflow will run in the context of the source of the PR. +# On a PR from a fork, the workflow will not have access to secrets, and so any parts of the build that require secrets will not run. +# If additional artifacts are needed, the failed "build-web-target.yml" workflow held up by the check-run should be re-run. + name: Build Web on: @@ -8,6 +12,8 @@ on: - 'cf-pages' paths: - 'apps/web/**' + - 'bitwarden_license/bit-common/**' + - 'bitwarden_license/bit-web/**' - 'libs/**' - '*' - '!*.md' @@ -20,6 +26,8 @@ on: - 'hotfix-rc-web' paths: - 'apps/web/**' + - 'bitwarden_license/bit-common/**' + - 'bitwarden_license/bit-web/**' - 'libs/**' - '*' - '!*.md' @@ -41,11 +49,12 @@ on: env: _AZ_REGISTRY: bitwardenprod.azurecr.io + _GITHUB_PR_REPO_NAME: ${{ github.event.pull_request.head.repo.full_name }} jobs: setup: name: Setup - runs-on: ubuntu-22.04 + runs-on: ubuntu-24.04 outputs: version: ${{ steps.version.outputs.value }} node_version: ${{ steps.retrieve-node-version.outputs.node_version }} @@ -54,7 +63,7 @@ jobs: - name: Check out repo uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 with: - ref: ${{ github.event.pull_request.head.sha }} + ref: ${{ github.event.pull_request.head.sha }} - name: Get GitHub sha as version id: version @@ -75,133 +84,61 @@ jobs: 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 - needs: - - setup - env: - _VERSION: ${{ needs.setup.outputs.version }} - _NODE_VERSION: ${{ needs.setup.outputs.node_version }} - strategy: - matrix: - include: - - name: "selfhosted-open-source" - npm_command: "dist:oss:selfhost" - - name: "cloud-COMMERCIAL" - npm_command: "dist:bit:cloud" - - name: "selfhosted-COMMERCIAL" - npm_command: "dist:bit:selfhost" - - name: "cloud-QA" - npm_command: "build:bit:qa" - git_metadata: true - - name: "ee" - npm_command: "build:bit:ee" - git_metadata: true - - name: "cloud-euprd" - npm_command: "build:bit:euprd" - - name: "cloud-euqa" - npm_command: "build:bit:euqa" - git_metadata: true - - name: "cloud-usdev" - npm_command: "build:bit:usdev" - git_metadata: true - - steps: - - name: Check out repo - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 - with: - ref: ${{ github.event.pull_request.head.sha }} - - - name: Set up Node - uses: actions/setup-node@39370e3970a6d050c480ffad4ff0ed4d3fdee5af # v4.1.0 - with: - cache: 'npm' - cache-dependency-path: '**/package-lock.json' - node-version: ${{ env._NODE_VERSION }} - - - name: Print environment - run: | - whoami - node --version - npm --version - docker --version - echo "GitHub ref: $GITHUB_REF" - echo "GitHub event: $GITHUB_EVENT" - - - name: Install dependencies - run: npm ci - - - name: Download SDK Artifacts - if: ${{ inputs.sdk_branch != '' && needs.setup.outputs.has_secrets == 'true' }} - uses: bitwarden/gh-actions/download-artifacts@main - with: - github_token: ${{secrets.GITHUB_TOKEN}} - workflow: build-wasm-internal.yml - workflow_conclusion: success - branch: ${{ inputs.sdk_branch }} - artifacts: sdk-internal - repo: bitwarden/sdk-internal - path: ../sdk-internal - if_no_artifact_found: fail - - - name: Override SDK - if: ${{ inputs.sdk_branch != '' && needs.setup.outputs.has_secrets == 'true' }} - working-directory: ./ - run: | - ls -l ../ - npm link ../sdk-internal - - - name: Add Git metadata to build version - working-directory: apps/web - if: matrix.git_metadata - run: | - VERSION=$( jq -r ".version" package.json) - jq --arg version "$VERSION+${GITHUB_SHA:0:7}" '.version = $version' package.json > package.json.tmp - mv package.json.tmp package.json - - - name: Build ${{ matrix.name }} - working-directory: apps/web - run: npm run ${{ matrix.npm_command }} - - - name: Package artifact - working-directory: apps/web - run: zip -r web-${{ env._VERSION }}-${{ matrix.name }}.zip build - - - name: Upload ${{ matrix.name }} artifact - uses: actions/upload-artifact@65c4c4a1ddee5b72f698fdd19549f0f0fb45cf08 # v4.6.0 - with: - name: web-${{ env._VERSION }}-${{ matrix.name }}.zip - path: apps/web/web-${{ env._VERSION }}-${{ matrix.name }}.zip - if-no-files-found: error - build-containers: - name: Build Docker images - runs-on: ubuntu-22.04 + name: "Build [${{matrix.artifact_name}}], image tag: [${{matrix.image_name}}]" + runs-on: ubuntu-24.04 permissions: security-events: write id-token: write - needs: - - setup - - build-artifacts + needs: setup strategy: fail-fast: false matrix: include: - - artifact_name: cloud-QA - image_name: web-qa-cloud - - artifact_name: ee - image_name: web-ee + - artifact_name: selfhosted-open-source + image_name: web-oss + npm_command: dist:oss:selfhost + - artifact_name: cloud-COMMERCIAL + image_name: web-cloud + npm_command: dist:bit:cloud - artifact_name: selfhosted-COMMERCIAL image_name: web + npm_command: dist:bit:selfhost + - artifact_name: cloud-QA + image_name: web-qa-cloud + npm_command: build:bit:qa + git_metadata: true + - artifact_name: ee + image_name: web-ee + npm_command: build:bit:ee + git_metadata: true + - artifact_name: cloud-euprd + image_name: web-euprd + npm_command: build:bit:euprd + - artifact_name: cloud-euqa + image_name: web-euqa + npm_command: build:bit:euqa + git_metadata: true + - artifact_name: cloud-usdev + image_name: web-usdev + npm_command: build:bit:usdev + git_metadata: true env: + _NODE_VERSION: ${{ needs.setup.outputs.node_version }} _VERSION: ${{ needs.setup.outputs.version }} steps: - name: Check out repo uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 with: - ref: ${{ github.event.pull_request.head.sha }} + ref: ${{ github.event.pull_request.head.sha }} + + - name: Check out Server repo + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + with: + path: server + repository: bitwarden/server + ref: ${{ github.event.pull_request.head.sha && 'main' || github.ref }} - name: Check Branch to Publish env: @@ -216,6 +153,32 @@ jobs: echo "is_publish_branch=false" >> $GITHUB_ENV fi + - name: Add Git metadata to build version + working-directory: apps/web + if: matrix.git_metadata + run: | + VERSION=$( jq -r ".version" package.json) + jq --arg version "$VERSION+${GITHUB_SHA:0:7}" '.version = $version' package.json > package.json.tmp + mv package.json.tmp package.json + + ########## Set up Docker ########## + - name: Set up Docker + uses: docker/setup-docker-action@b60f85385d03ac8acfca6d9996982511d8620a19 # v4.3.0 + with: + daemon-config: | + { + "debug": true, + "features": { + "containerd-snapshotter": true + } + } + + - name: Set up QEMU emulators + uses: docker/setup-qemu-action@68827325e0b33c7199eb31dd4e31fbe9023e06e3 # v3.0.0 + + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@f95db51fddba0c2d1ec667646a06c2ce06100226 # v3.0.0 + ########## ACRs ########## - name: Login to Prod Azure if: ${{ needs.setup.outputs.has_secrets == 'true' }} @@ -225,38 +188,24 @@ jobs: - 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: - keyvault: "bitwarden-ci" - secrets: "github-pat-bitwarden-devops-bot-repo-scope" - - - name: Download ${{ matrix.artifact_name }} artifact - uses: actions/download-artifact@fa0a91b85d4f404e444e00e005971372dc801d16 # v4.1.8 - with: - name: web-${{ env._VERSION }}-${{ matrix.artifact_name }}.zip - path: apps/web + run: az acr login -n ${_AZ_REGISTRY%.azurecr.io} ########## Generate image tag and build Docker image ########## - - name: Generate Docker image tag + - name: Generate container image tag id: tag run: | - if [[ "${GITHUB_EVENT_NAME}" == "pull_request" ]]; then - IMAGE_TAG=$(echo "${GITHUB_HEAD_REF}" | sed "s#/#-#g") + if [[ "${GITHUB_EVENT_NAME}" == "pull_request" || "${GITHUB_EVENT_NAME}" == "pull_request_target" ]]; then + IMAGE_TAG=$(echo "${GITHUB_HEAD_REF}" | sed "s/[^a-zA-Z0-9]/-/g") # Sanitize branch name to alphanumeric only else IMAGE_TAG=$(echo "${GITHUB_REF_NAME}" | sed "s#/#-#g") fi + if [[ "${{ github.event.pull_request.head.repo.fork }}" == "true" ]]; then + SANITIZED_REPO_NAME=$(echo "$_GITHUB_PR_REPO_NAME" | sed "s/[^a-zA-Z0-9]/-/g") # Sanitize repo name to alphanumeric only + IMAGE_TAG=$SANITIZED_REPO_NAME-$IMAGE_TAG # Add repo name to the tag + IMAGE_TAG=${IMAGE_TAG:0:128} # Limit to 128 characters, as that's the max length for Docker image tags + fi + if [[ "$IMAGE_TAG" == "main" ]]; then IMAGE_TAG=dev fi @@ -270,10 +219,6 @@ jobs: echo "image_tag=$IMAGE_TAG" >> $GITHUB_OUTPUT ########## Build Image ########## - - name: Extract artifact - working-directory: apps/web - run: unzip web-${{ env._VERSION }}-${{ matrix.artifact_name }}.zip - - name: Generate image full name id: image-name env: @@ -282,17 +227,45 @@ 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 + id: build-container uses: docker/build-push-action@67a2d409c0a876cbe6b11854e3e25193efe4e62d # v6.12.0 with: - context: apps/web + build-args: | + NODE_VERSION=${{ env._NODE_VERSION }} + NPM_COMMAND=${{ matrix.npm_command }} + context: . file: apps/web/Dockerfile - platforms: linux/amd64 - push: true + load: true + platforms: | + linux/amd64, + linux/arm/v7, + linux/arm64 + push: false tags: ${{ steps.image-name.outputs.name }} - secrets: | - "GH_PAT=${{ steps.retrieve-secret-pat.outputs.github-pat-bitwarden-devops-bot-repo-scope }}" + + - name: Push images + if: ${{ needs.setup.outputs.has_secrets == 'true' }} + env: + IMAGE_NAME: ${{ steps.image-name.outputs.name }} + run: docker push $IMAGE_NAME + + - name: Zip project + working-directory: apps/web + env: + IMAGE_NAME: ${{ steps.image-name.outputs.name }} + run: | + mkdir build + docker run --rm --volume $(pwd)/build:/temp --entrypoint bash \ + $IMAGE_NAME -c "cp -r ./ /temp" + + zip -r web-${{ env._VERSION }}-${{ matrix.artifact_name }}.zip build + + - name: Upload ${{ matrix.artifact_name }} artifact + uses: actions/upload-artifact@65c4c4a1ddee5b72f698fdd19549f0f0fb45cf08 # v4.6.0 + with: + name: web-${{ env._VERSION }}-${{ matrix.artifact_name }}.zip + path: apps/web/web-${{ env._VERSION }}-${{ matrix.artifact_name }}.zip + if-no-files-found: error - name: Install Cosign if: github.event_name != 'pull_request_target' && github.ref == 'refs/heads/main' @@ -301,7 +274,7 @@ jobs: - name: Sign image with Cosign if: github.event_name != 'pull_request_target' && github.ref == 'refs/heads/main' env: - DIGEST: ${{ steps.build-docker.outputs.digest }} + DIGEST: ${{ steps.build-container.outputs.digest }} TAGS: ${{ steps.image-name.outputs.name }} run: | IFS="," read -a tags <<< "${TAGS}" @@ -329,19 +302,19 @@ jobs: ref: ${{ contains(github.event_name, 'pull_request') && format('refs/pull/{0}/head', github.event.pull_request.number) || github.ref }} - name: Log out of Docker - run: docker logout + run: docker logout $_AZ_REGISTRY + crowdin-push: name: Crowdin Push if: github.event_name != 'pull_request_target' && github.ref == 'refs/heads/main' - needs: - - build-artifacts - runs-on: ubuntu-22.04 + needs: build-containers + runs-on: ubuntu-24.04 steps: - name: Check out repo uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 with: - ref: ${{ github.event.pull_request.head.sha }} + ref: ${{ github.event.pull_request.head.sha }} - name: Login to Azure uses: Azure/login@e15b166166a8746d1a47596803bd8c1b595455cf # v1.6.0 @@ -367,12 +340,12 @@ jobs: upload_sources: true upload_translations: false + trigger-web-vault-deploy: name: Trigger web vault deploy if: github.event_name != 'pull_request_target' && github.ref == 'refs/heads/main' - runs-on: ubuntu-22.04 - needs: - - build-artifacts + runs-on: ubuntu-24.04 + needs: build-containers steps: - name: Login to Azure - CI Subscription uses: Azure/login@e15b166166a8746d1a47596803bd8c1b595455cf # v1.6.0 @@ -402,13 +375,13 @@ jobs: } }) + check-failures: name: Check for failures if: always() - runs-on: ubuntu-22.04 + runs-on: ubuntu-24.04 needs: - setup - - build-artifacts - build-containers - crowdin-push - trigger-web-vault-deploy diff --git a/.github/workflows/chromatic.yml b/.github/workflows/chromatic.yml index 75a07431942..f436f1b3760 100644 --- a/.github/workflows/chromatic.yml +++ b/.github/workflows/chromatic.yml @@ -28,9 +28,22 @@ jobs: with: ref: ${{ github.event.pull_request.head.sha }} fetch-depth: 0 + + - name: Get changed files + id: get-changed-files-for-chromatic + uses: dorny/paths-filter@de90cc6fb38fc0963ad72b210f1f284cd68cea36 # v3.0.2 + with: + filters: | + storyFiles: + - "apps/!(cli)/**" + - "bitwarden_license/bit-web/src/app/**" + - "libs/!(eslint)/**" + - "package.json" + - ".storybook/**" - name: Get Node version id: retrieve-node-version + if: steps.get-changed-files-for-chromatic.outputs.storyFiles == 'true' run: | NODE_NVMRC=$(cat .nvmrc) NODE_VERSION=${NODE_NVMRC/v/''} @@ -40,6 +53,7 @@ jobs: uses: actions/setup-node@39370e3970a6d050c480ffad4ff0ed4d3fdee5af # v4.1.0 with: node-version: ${{ steps.retrieve-node-version.outputs.node_version }} + if: steps.get-changed-files-for-chromatic.outputs.storyFiles == 'true' - name: Cache NPM id: npm-cache @@ -47,12 +61,15 @@ jobs: with: path: "~/.npm" key: ${{ runner.os }}-npm-chromatic-${{ hashFiles('**/package-lock.json') }} + if: steps.get-changed-files-for-chromatic.outputs.storyFiles == 'true' - name: Install Node dependencies + if: steps.get-changed-files-for-chromatic.outputs.storyFiles == 'true' run: npm ci # Manually build the Storybook to resolve a bug related to TurboSnap - name: Build Storybook + if: steps.get-changed-files-for-chromatic.outputs.storyFiles == 'true' run: npm run build-storybook:ci - name: Publish to Chromatic @@ -64,3 +81,5 @@ jobs: exitOnceUploaded: true onlyChanged: true externals: "[\"libs/components/**/*.scss\", \"libs/components/**/*.css\", \"libs/components/tailwind.config*.js\"]" + # Rather than use an `if` check on the whole publish step, we need to tell Chromatic to skip so that any Chromatic-spawned actions are properly skipped + skip: ${{ steps.get-changed-files-for-chromatic.outputs.storyFiles == 'false' }} diff --git a/.github/workflows/crowdin-pull.yml b/.github/workflows/crowdin-pull.yml index 027a2f11e55..32907699747 100644 --- a/.github/workflows/crowdin-pull.yml +++ b/.github/workflows/crowdin-pull.yml @@ -22,7 +22,7 @@ jobs: crowdin_project_id: "308189" steps: - name: Generate GH App token - uses: actions/create-github-app-token@c1a285145b9d317df6ced56c09f525b5c2b6f755 # v1.11.1 + uses: actions/create-github-app-token@d72941d797fd3113feb6b93fd0dec494b13a2547 # v1.12.0 id: app-token with: app-id: ${{ secrets.BW_GHAPP_ID }} diff --git a/.github/workflows/deploy-web.yml b/.github/workflows/deploy-web.yml index 9b890491282..1cde8dd636a 100644 --- a/.github/workflows/deploy-web.yml +++ b/.github/workflows/deploy-web.yml @@ -242,7 +242,7 @@ jobs: run: | # If run-id was used, get the commit from the download-latest-artifacts-run-id step if [ "${{ inputs.build-web-run-id }}" ]; then - echo "commit=${{ steps.download-latest-artifacts-run-id.outputs.artifact_build_commit }}" >> $GITHUB_OUTPUT + echo "commit=${{ steps.download-latest-artifacts-run-id.outputs.artifact-build-commit }}" >> $GITHUB_OUTPUT elif [ "${{ steps.download-latest-artifacts.outcome }}" == "failure" ]; then # If the download-latest-artifacts step failed, query the GH API to get the commit SHA of the artifact that was just built with trigger-build-web. @@ -251,7 +251,7 @@ jobs: else # Set the commit to the output of step download-latest-artifacts. - echo "commit=${{ steps.download-latest-artifacts.outputs.artifact_build_commit }}" >> $GITHUB_OUTPUT + echo "commit=${{ steps.download-latest-artifacts.outputs.artifact-build-commit }}" >> $GITHUB_OUTPUT fi notify-start: diff --git a/.github/workflows/publish-web.yml b/.github/workflows/publish-web.yml index 09f5ddc6318..69b29086d36 100644 --- a/.github/workflows/publish-web.yml +++ b/.github/workflows/publish-web.yml @@ -141,3 +141,36 @@ jobs: - name: Log out of Docker run: docker logout + + self-host-unified-build: + name: Trigger self-host unified build + runs-on: ubuntu-22.04 + needs: + - setup + steps: + - name: Log in to Azure - CI subscription + uses: Azure/login@e15b166166a8746d1a47596803bd8c1b595455cf # v1.6.0 + with: + creds: ${{ secrets.AZURE_KV_CI_SERVICE_PRINCIPAL }} + + - name: Retrieve GitHub PAT secrets + id: retrieve-secret-pat + uses: bitwarden/gh-actions/get-keyvault-secrets@main + with: + keyvault: "bitwarden-ci" + secrets: "github-pat-bitwarden-devops-bot-repo-scope" + + - name: Trigger self-host build + uses: actions/github-script@60a0d83039c74a4aee543508d2ffcb1c3799cdea # v7.0.1 + with: + github-token: ${{ steps.retrieve-secret-pat.outputs.github-pat-bitwarden-devops-bot-repo-scope }} + script: | + await github.rest.actions.createWorkflowDispatch({ + owner: 'bitwarden', + repo: 'self-host', + workflow_id: 'build-unified.yml', + ref: 'main', + inputs: { + use_latest_core_version: true + } + }); diff --git a/.github/workflows/repository-management.yml b/.github/workflows/repository-management.yml index ac2733e765b..06daf70d7c9 100644 --- a/.github/workflows/repository-management.yml +++ b/.github/workflows/repository-management.yml @@ -66,7 +66,7 @@ jobs: runs-on: ubuntu-24.04 steps: - name: Generate GH App token - uses: actions/create-github-app-token@c1a285145b9d317df6ced56c09f525b5c2b6f755 # v1.11.1 + uses: actions/create-github-app-token@d72941d797fd3113feb6b93fd0dec494b13a2547 # v1.12.0 id: app-token with: app-id: ${{ secrets.BW_GHAPP_ID }} @@ -115,7 +115,7 @@ jobs: version: ${{ inputs.version_number_override }} - name: Generate GH App token - uses: actions/create-github-app-token@c1a285145b9d317df6ced56c09f525b5c2b6f755 # v1.11.1 + uses: actions/create-github-app-token@d72941d797fd3113feb6b93fd0dec494b13a2547 # v1.12.0 id: app-token with: app-id: ${{ secrets.BW_GHAPP_ID }} @@ -452,7 +452,7 @@ jobs: - setup steps: - name: Generate GH App token - uses: actions/create-github-app-token@c1a285145b9d317df6ced56c09f525b5c2b6f755 # v1.11.1 + uses: actions/create-github-app-token@d72941d797fd3113feb6b93fd0dec494b13a2547 # v1.12.0 id: app-token with: app-id: ${{ secrets.BW_GHAPP_ID }} diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 0b039315b30..6411337f6e9 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -71,8 +71,6 @@ jobs: - name: Upload results to codecov.io uses: codecov/test-results-action@4e79e65778be1cecd5df25e14af1eafb6df80ea9 # v1.0.2 - env: - CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }} rust: name: Run Rust tests on ${{ matrix.os }} diff --git a/.github/workflows/version-auto-bump.yml b/.github/workflows/version-auto-bump.yml index ef46dbc867d..9431eab37c5 100644 --- a/.github/workflows/version-auto-bump.yml +++ b/.github/workflows/version-auto-bump.yml @@ -11,7 +11,7 @@ jobs: runs-on: ubuntu-24.04 steps: - name: Generate GH App token - uses: actions/create-github-app-token@c1a285145b9d317df6ced56c09f525b5c2b6f755 # v1.11.1 + uses: actions/create-github-app-token@d72941d797fd3113feb6b93fd0dec494b13a2547 # v1.12.0 id: app-token with: app-id: ${{ secrets.BW_GHAPP_ID }} diff --git a/.gitignore b/.gitignore index d0d8edd596c..e865fa6a8fb 100644 --- a/.gitignore +++ b/.gitignore @@ -48,3 +48,6 @@ storybook-static # Local app configuration apps/**/config/local.json + +# Nx +.nx diff --git a/.npmrc b/.npmrc new file mode 100644 index 00000000000..cffe8cdef13 --- /dev/null +++ b/.npmrc @@ -0,0 +1 @@ +save-exact=true diff --git a/.vscode/settings.json b/.vscode/settings.json index 295c290a37a..8f89bc03b8c 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -1,5 +1,5 @@ { - "cSpell.words": ["Csprng", "decryptable", "Popout", "Reprompt", "takeuntil"], + "cSpell.words": ["Csprng", "Decapsulation", "decryptable", "Popout", "Reprompt", "takeuntil"], "search.exclude": { "**/locales/[^e]*/messages.json": true, "**/locales/*[^n]/messages.json": true, diff --git a/README.md b/README.md index 22c8d329f1c..cdeaa4c8cf7 100644 --- a/README.md +++ b/README.md @@ -13,15 +13,15 @@ # Bitwarden Client Applications -This repository houses all Bitwarden client applications except the [Mobile application](https://github.com/bitwarden/mobile). +This repository houses all Bitwarden client applications except the mobile applications ([iOS](https://github.com/bitwarden/ios) | [android](https://github.com/bitwarden/android)). Please refer to the [Clients section](https://contributing.bitwarden.com/getting-started/clients/) of the [Contributing Documentation](https://contributing.bitwarden.com/) for build instructions, recommended tooling, code style tips, and lots of other great information to get you started. ## Related projects: - [bitwarden/server](https://github.com/bitwarden/server): The core infrastructure backend (API, database, Docker, etc). -- [bitwarden/ios](https://github.com/bitwarden/ios): Bitwarden mobile app for iOS. -- [bitwarden/android](https://github.com/bitwarden/android): Bitwarden mobile app for Android. +- [bitwarden/ios](https://github.com/bitwarden/ios): Bitwarden iOS Password Manager & Authenticator apps. +- [bitwarden/android](https://github.com/bitwarden/android): Bitwarden Android Password Manager & Authenticator apps. - [bitwarden/directory-connector](https://github.com/bitwarden/directory-connector): A tool for syncing a directory (AD, LDAP, Azure, G Suite, Okta) to an organization. # We're Hiring! diff --git a/apps/browser/package.json b/apps/browser/package.json index 5a8ddd03b41..9ed3c807c11 100644 --- a/apps/browser/package.json +++ b/apps/browser/package.json @@ -1,6 +1,6 @@ { "name": "@bitwarden/browser", - "version": "2025.3.1", + "version": "2025.4.0", "scripts": { "build": "npm run build:chrome", "build:chrome": "cross-env BROWSER=chrome MANIFEST_VERSION=3 NODE_OPTIONS=\"--max-old-space-size=8192\" webpack", @@ -19,10 +19,10 @@ "build:prod:firefox": "cross-env NODE_ENV=production npm run build:firefox", "build:prod:opera": "cross-env NODE_ENV=production npm run build:opera", "build:prod:safari": "cross-env NODE_ENV=production npm run build:safari", - "dist:chrome": "npm run build:prod:chrome && mkdir -p dist && ./scripts/compress.ps1 dist-chrome.zip", - "dist:edge": "npm run build:prod:edge && mkdir -p dist && ./scripts/compress.ps1 dist-edge.zip", - "dist:firefox": "npm run build:prod:firefox && mkdir -p dist && ./scripts/compress.ps1 dist-firefox.zip", - "dist:opera": "npm run build:prod:opera && mkdir -p dist && ./scripts/compress.ps1 dist-opera.zip", + "dist:chrome": "npm run build:prod:chrome && mkdir -p dist && ./scripts/compress.sh dist-chrome.zip", + "dist:edge": "npm run build:prod:edge && mkdir -p dist && ./scripts/compress.sh dist-edge.zip", + "dist:firefox": "npm run build:prod:firefox && mkdir -p dist && ./scripts/compress.sh dist-firefox.zip", + "dist:opera": "npm run build:prod:opera && mkdir -p dist && ./scripts/compress.sh dist-opera.zip", "dist:safari": "npm run build:prod:safari && ./scripts/package-safari.ps1", "dist:firefox:mv3": "cross-env MANIFEST_VERSION=3 npm run dist:firefox", "dist:opera:mv3": "cross-env MANIFEST_VERSION=3 npm run dist:opera", diff --git a/apps/browser/scripts/compress.sh b/apps/browser/scripts/compress.sh new file mode 100755 index 00000000000..319ab08fbec --- /dev/null +++ b/apps/browser/scripts/compress.sh @@ -0,0 +1,32 @@ +#!/usr/bin/env bash + +#### +# Compress the build directory into a zip file. +#### + +set -e +set -u +set -x +set -o pipefail + +FILENAME=$1 + +SCRIPT_ROOT="$(dirname "$0")" +BUILD_DIR="$SCRIPT_ROOT/../build" + +# Check if build directory exists +if [ -d "$BUILD_DIR" ]; then + cd $BUILD_DIR + + # Create dist directory if it doesn't exist + DIST_DIR="../dist" + mkdir -p $DIST_DIR + + # Remove existing dist zip file + DIST_PATH="$DIST_DIR/$FILENAME" + rm -f $DIST_PATH + + # Compress build directory + zip -r $DIST_PATH ./ + echo "Zipped $BUILD_DIR into $DIST_PATH" +fi diff --git a/apps/browser/scripts/package-safari.ps1 b/apps/browser/scripts/package-safari.ps1 index ce208478098..1df40c68b37 100755 --- a/apps/browser/scripts/package-safari.ps1 +++ b/apps/browser/scripts/package-safari.ps1 @@ -52,7 +52,7 @@ foreach ($subBuildPath in $subBuildPaths) { "--verbose", "--force", "--sign", - "4B9662CAB74E8E4F4ECBDD9EDEF2543659D95E3C", + "588E3F1724AE018EBA762E42279DAE85B313E3ED", "--entitlements", $entitlementsPath ) diff --git a/apps/browser/src/_locales/ar/messages.json b/apps/browser/src/_locales/ar/messages.json index 4c051d455ac..c6d51ff3f87 100644 --- a/apps/browser/src/_locales/ar/messages.json +++ b/apps/browser/src/_locales/ar/messages.json @@ -81,7 +81,7 @@ "message": "تلميح كلمة المرور الرئيسية (إختياري)" }, "passwordStrengthScore": { - "message": "Password strength score $SCORE$", + "message": "درجة قوة كلمة المرور $SCORE$", "placeholders": { "score": { "content": "$1", @@ -186,7 +186,7 @@ "message": "نسخ الملاحظات" }, "copy": { - "message": "Copy", + "message": "نسخ", "description": "Copy to clipboard" }, "fill": { @@ -380,7 +380,7 @@ "message": "تحرير المجلّد" }, "editFolderWithName": { - "message": "Edit folder: $FOLDERNAME$", + "message": "تحرير المجلد: $FOLDERNAME$", "placeholders": { "foldername": { "content": "$1", @@ -395,7 +395,7 @@ "message": "أسم المجلد" }, "folderHintText": { - "message": "Nest a folder by adding the parent folder's name followed by a “/”. Example: Social/Forums" + "message": "قم بدمج مجلد بإضافة اسم المجلد الرئيسي متبوعًا بعلامة \"/\". مثال: اجتماعي/منتديات" }, "noFoldersAdded": { "message": "لا توجد مجلدات مضافة" @@ -462,16 +462,16 @@ "message": "توليد عبارة المرور" }, "passwordGenerated": { - "message": "Password generated" + "message": "مولد كلمة المرور" }, "passphraseGenerated": { - "message": "Passphrase generated" + "message": "تم إنشاء عبارة المرور" }, "usernameGenerated": { - "message": "Username generated" + "message": "تم إنشاء اسم المستخدم" }, "emailGenerated": { - "message": "Email generated" + "message": "تم إنشاء البريد الإلكتروني" }, "regeneratePassword": { "message": "إعادة توليد كلمة المرور" @@ -653,13 +653,13 @@ "message": "متصفح الويب الخاص بك لا يدعم خاصية النسخ السهل. يرجى استخدام النسخ اليدوي." }, "verifyYourIdentity": { - "message": "Verify your identity" + "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": "خزانتك مقفلة. قم بتأكيد هويتك للمتابعة." @@ -869,19 +869,19 @@ "message": "تسجيل الدخول إلى Bitwarden" }, "enterTheCodeSentToYourEmail": { - "message": "Enter the code sent to your email" + "message": "أدخل الرمز المرسل إلى بريدك الإلكتروني" }, "enterTheCodeFromYourAuthenticatorApp": { - "message": "Enter the code from your authenticator app" + "message": "أدخل الرمز من تطبيق المصادقة الخاص بك" }, "pressYourYubiKeyToAuthenticate": { - "message": "Press your YubiKey to authenticate" + "message": "اضغط على YubiKey الخاص بك للمصادقة" }, "duoTwoFactorRequiredPageSubtitle": { - "message": "Duo two-step login is required for your account. Follow the steps below to finish logging in." + "message": "تسجيل الدخول من خطوتين مطلوب لحسابك. اتبع الخطوات أدناه لإنهاء تسجيل الدخول." }, "followTheStepsBelowToFinishLoggingIn": { - "message": "Follow the steps below to finish logging in." + "message": "اتبع الخطوات أدناه لإنهاء تسجيل الدخول." }, "restartRegistration": { "message": "إعادة التسجيل" @@ -905,7 +905,7 @@ "message": "لا" }, "location": { - "message": "Location" + "message": "الموقع" }, "unexpectedError": { "message": "حدث خطأ غير متوقع." @@ -1010,7 +1010,7 @@ "message": "اطلب إضافة تسجيل الدخول" }, "vaultSaveOptionsTitle": { - "message": "Save to vault options" + "message": "حفظ في خيارات المخزن" }, "addLoginNotificationDesc": { "message": "اطلب إضافة عنصر إذا لم يُعثر عليه في خزانتك." @@ -1019,7 +1019,7 @@ "message": "اطلب إضافة عنصر إذا لم يتم العثور على عنصر في المخزن الخاص بك. ينطبق على جميع حسابات تسجيل الدخول." }, "showCardsInVaultViewV2": { - "message": "Always show cards as Autofill suggestions on Vault view" + "message": "إظهار البطاقات دائمًا كاقتراحات التعبئة التلقائية في عرض المخزن" }, "showCardsCurrentTab": { "message": "أظهر البطاقات في صفحة التبويبات" @@ -1028,7 +1028,7 @@ "message": "قائمة عناصر البطاقة في صفحة التبويب لسهولة التعبئة التلقائية." }, "showIdentitiesInVaultViewV2": { - "message": "Always show identities as Autofill suggestions on Vault view" + "message": "إظهار الهويات دائمًا كاقتراحات التعبئة التلقائية في عرض المخزن" }, "showIdentitiesCurrentTab": { "message": "إظهار الهويات على صفحة التبويب" @@ -1037,10 +1037,10 @@ "message": "قائمة عناصر الهوية في صفحة التبويب لسهولة الملء التلقائي." }, "clickToAutofillOnVault": { - "message": "Click items to autofill on Vault view" + "message": "انقر فوق العناصر للملء التلقائي على عرض المخزن" }, "clickToAutofill": { - "message": "Click items in autofill suggestion to fill" + "message": "انقر فوق العناصر في اقتراح التعبئة التلقائية لملء" }, "clearClipboard": { "message": "مسح الحافظة", @@ -1057,7 +1057,7 @@ "message": "حفظ" }, "loginSaveSuccessDetails": { - "message": "$USERNAME$ saved to Bitwarden.", + "message": "حفظت في بيتواردن $USERNAME$.", "placeholders": { "username": { "content": "$1" @@ -1066,7 +1066,7 @@ "description": "Shown to user after login is saved." }, "loginUpdatedSuccessDetails": { - "message": "$USERNAME$ updated in Bitwarden.", + "message": "جددت في بيتواردن $USERNAME$.", "placeholders": { "username": { "content": "$1" @@ -1075,35 +1075,60 @@ "description": "Shown to user after login is updated." }, "saveAsNewLoginAction": { - "message": "Save as new login", + "message": "حفظ كتسجيل دخول جديد", "description": "Button text for saving login details as a new entry." }, "updateLoginAction": { - "message": "Update login", + "message": "تحديث تسجيل الدخول", "description": "Button text for updating an existing login entry." }, "saveLoginPrompt": { - "message": "Save login?", + "message": "حفظ تسجيل الدخول؟", "description": "Prompt asking the user if they want to save their login details." }, "updateLoginPrompt": { - "message": "Update existing login?", + "message": "تحديث تسجيل الدخول الحالي؟", "description": "Prompt asking the user if they want to update an existing login entry." }, "loginSaveSuccess": { - "message": "Login saved", + "message": "تم حفظ تسجيل الدخول", "description": "Message displayed when login details are successfully saved." }, "loginUpdateSuccess": { - "message": "Login updated", + "message": "تم تحديث تسجيل الدخول", "description": "Message displayed when login details are successfully updated." }, + "loginUpdateTaskSuccess": { + "message": "عمل رائع! لقد اتخذت الخطوات لجعلك و $ORGANIZATION$ أكثر أمنا.", + "placeholders": { + "organization": { + "content": "$1" + } + }, + "description": "Shown to user after login is updated." + }, + "loginUpdateTaskSuccessAdditional": { + "message": "شكرا لك على جعل $ORGANIZATION$ أكثر أمنا. لديك $TASK_COUNT$ المزيد من كلمات المرور للتحديث.", + "placeholders": { + "organization": { + "content": "$1" + }, + "task_count": { + "content": "$2" + } + }, + "description": "Shown to user after login is updated." + }, + "nextSecurityTaskAction": { + "message": "تغيير كلمة المرور التالية", + "description": "Message prompting user to undertake completion of another security task." + }, "saveFailure": { - "message": "Error saving", + "message": "خطأ في الحفظ", "description": "Error message shown when the system fails to save login details." }, "saveFailureDetails": { - "message": "Oh no! We couldn't save this. Try entering the details manually.", + "message": "أوه لا! لم نتمكن من حفظ هذا. حاول إدخال التفاصيل يدويا.", "description": "Detailed error message shown when saving login details fails." }, "enableChangedPasswordNotification": { @@ -1188,26 +1213,26 @@ "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": "استخدم مفتاح تشفير حسابك، مشتقة من اسم المستخدم في حسابك وكلمة المرور الرئيسية، لتشفير التصدير وتقييد الاستيراد إلى حساب بيتواردن الحالي فقط." }, "passwordProtectedOptionDescription": { - "message": "Set a file password to encrypt the export and import it to any Bitwarden account using the password for decryption." + "message": "تعيين كلمة مرور للملف لتشفير التصدير واستيراده إلى أي حساب بيتواردن باستخدام كلمة المرور لفك التشفير." }, "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": { @@ -1229,7 +1254,7 @@ "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.com على شبكة الإنترنت." }, "moveToOrganization": { "message": "الانتقال إلى مؤسسة" @@ -1287,7 +1312,7 @@ "message": "الملف" }, "fileToShare": { - "message": "File to share" + "message": "ملف للمشاركة" }, "selectFile": { "message": "حدد ملفًا" @@ -1323,7 +1348,7 @@ "message": "1 جيغابايت وحدة تخزين مشفرة لمرفقات الملفات." }, "premiumSignUpEmergency": { - "message": "Emergency access." + "message": "الوصول الطارئ." }, "premiumSignUpTwoStepOptions": { "message": "خيارات تسجيل الدخول بخطوتين المملوكة لجهات اخرى مثل YubiKey و Duo." @@ -1344,7 +1369,7 @@ "message": "شراء العضوية المميزة" }, "premiumPurchaseAlertV2": { - "message": "You can purchase Premium from your account settings on the Bitwarden web app." + "message": "يمكنك شراء العضوية المميزة من إعدادات حسابك على تطبيق بيتواردن على شبكة الإنترنت." }, "premiumCurrentMember": { "message": "أنت عضو مميز!" @@ -1353,7 +1378,7 @@ "message": "شكرا لك على دعم Bitwarden." }, "premiumFeatures": { - "message": "Upgrade to Premium and receive:" + "message": "الترقية إلى النسخة الممتازة و استلام:" }, "premiumPrice": { "message": "الكل فقط بـ $PRICE$ /سنة!", @@ -1365,7 +1390,7 @@ } }, "premiumPriceV2": { - "message": "All for just $PRICE$ per year!", + "message": "كل شيء فقط $PRICE$ في السنة!", "placeholders": { "price": { "content": "$1", @@ -1391,23 +1416,11 @@ "premiumRequiredDesc": { "message": "هذه المِيزة متاحة فقط للعضوية المميزة." }, - "enterVerificationCodeApp": { - "message": "أدخل رمز التحقق من 6 أرقام من تطبيق المصادقة الخاص بك." - }, "authenticationTimeout": { - "message": "Authentication timeout" + "message": "مهلة المصادقة" }, "authenticationSessionTimedOut": { - "message": "The authentication session timed out. Please restart the login process." - }, - "enterVerificationCodeEmail": { - "message": "أدخل رمز التحقق المكون من 6 أرقام الذي تم إرساله إلى $EMAIL$.", - "placeholders": { - "email": { - "content": "$1", - "example": "example@gmail.com" - } - } + "message": "انتهت مهلة جلسة المصادقة. الرجاء إعادة تشغيل عملية تسجيل الدخول." }, "verificationCodeEmailSent": { "message": "تم إرسال رسالة التحقق إلى $EMAIL$.", @@ -1418,48 +1431,30 @@ } } }, - "rememberMe": { - "message": "تذكرني" - }, "dontAskAgainOnThisDeviceFor30Days": { - "message": "Don't ask again on this device for 30 days" - }, - "sendVerificationCodeEmailAgain": { - "message": "إرسال رمز التحقق إلى البريد الإلكتروني مرة أخرى" - }, - "useAnotherTwoStepMethod": { - "message": "استخدام طريقة أخرى لتسجيل الدخول بخطوتين" + "message": "لا تسأل مرة أخرى على هذا الجهاز لمدة 30 يوماً" }, "selectAnotherMethod": { - "message": "Select another method", + "message": "اختر طريقة أخرى", "description": "Select another two-step login method" }, "useYourRecoveryCode": { - "message": "Use your recovery code" - }, - "insertYubiKey": { - "message": "أدخل YubiKey الخاص بك في منفذ USB في كمبيوترك، ثم المس الزر." + "message": "استخدم رمز الاسترداد الخاص بك" }, "insertU2f": { "message": "أدخل مفتاح الأمان الخاص بك في منفذ USB كمبيوترك، إذا كان يحتوي على زر، إلمسه." }, - "webAuthnNewTab": { - "message": "لبدء التحقق من WebAuthn 2FA. انقر على الزر أدناه لفتح علامة تبويب جديدة واتبع التعليمات المقدمة في علامة التبويب الجديدة." - }, - "webAuthnNewTabOpen": { - "message": "فتح علامة تبويب جديدة" - }, "openInNewTab": { - "message": "Open in new tab" + "message": "فتح في علامة تبويب جديدة" }, "webAuthnAuthenticate": { "message": "مصادقة WebAuthn" }, "readSecurityKey": { - "message": "Read security key" + "message": "قراءة مفتاح الأمان" }, "awaitingSecurityKeyInteraction": { - "message": "Awaiting security key interaction..." + "message": "في انتظار التفاعل مع مفتاح الأمن..." }, "loginUnavailable": { "message": "تسجيل الدخول غير متاح" @@ -1474,7 +1469,7 @@ "message": "خيارات تسجيل الدخول بخطوتين" }, "selectTwoStepLoginMethod": { - "message": "Select two-step login method" + "message": "حدد طريقة تسجيل الدخول بخطوتين" }, "recoveryCodeDesc": { "message": "هل تفقد الوصول إلى جميع مزودي التحقق بعاملين؟ استخدم رمز الاسترداد الخاص بك لتعطيل جميع مزودي التحقق بعاملين من حسابك." @@ -1486,17 +1481,17 @@ "message": "تطبيق المصادقة" }, "authenticatorAppDescV2": { - "message": "Enter a code generated by an authenticator app like Bitwarden Authenticator.", + "message": "أدخل رمز تم إنشاؤه بواسطة تطبيق مصادقة مثل Bitwarden Authenticator.", "description": "'Bitwarden Authenticator' is a product name and should not be translated." }, "yubiKeyTitleV2": { - "message": "Yubico OTP Security Key" + "message": "مفتاح أمان OTP Yubico" }, "yubiKeyDesc": { "message": "استخدم YubiKey للوصول إلى حسابك. يعمل مع YubiKey 4 ،4 Nano ،4C، وأجهزة NEO." }, "duoDescV2": { - "message": "Enter a code generated by Duo Security.", + "message": "أدخل الرمز الذي تم إنشاؤه بواسطة نظام حماية الثنائي.", "description": "'Duo Security' and 'Duo Mobile' are product names and should not be translated." }, "duoOrganizationDesc": { @@ -1513,19 +1508,19 @@ "message": "البريد الإلكتروني" }, "emailDescV2": { - "message": "Enter a code sent to your email." + "message": "أدخل رمز مرسل إلى بريدك الإلكتروني." }, "selfHostedEnvironment": { "message": "البيئة المستضافة ذاتيا" }, "selfHostedBaseUrlHint": { - "message": "Specify the base URL of your on-premises hosted Bitwarden installation. Example: https://bitwarden.company.com" + "message": "حدد عنوان URL الأساسي لمبانيك التي استضافت تثبيت بتواردن على سبيل المثال: 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": "يجب عليك إضافة رابط الخادم الأساسي أو على الأقل بيئة مخصصة." }, "customEnvironment": { "message": "بيئة مخصصة" @@ -1534,7 +1529,7 @@ "message": "رابط الخادم" }, "selfHostBaseUrl": { - "message": "Self-host server URL", + "message": "رابط خادم الاستضافة الذاتية", "description": "Label for field requesting a self-hosted integration service URL" }, "apiUrl": { @@ -1560,22 +1555,22 @@ "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": "إيقاف تشغيل إعدادات مدير كلمات المرور الافتراضي في متصفحك لتجنب التضارب." @@ -1596,7 +1591,7 @@ "description": "Overlay appearance select option for showing the field on click of the overlay icon" }, "enableAutoFillOnPageLoadSectionTitle": { - "message": "Autofill on page load" + "message": "التعبئة التلقائية عند تحميل الصفحة" }, "enableAutoFillOnPageLoad": { "message": "ملء تلقائي عند تحميل الصفحة" @@ -1608,7 +1603,7 @@ "message": "مواقع المساومة أو غير الموثوق بها يمكن أن تستغل الملء التلقائي في تحميل الصفحة." }, "learnMoreAboutAutofillOnPageLoadLinkText": { - "message": "Learn more about risks" + "message": "معرفة المزيد عن المخاطر" }, "learnMoreAboutAutofill": { "message": "تعرف على المزيد حول الملء التلقائي" @@ -1638,13 +1633,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": "إنشاء واستنساخ كلمة مرور عشوائية جديدة إلى الحافظة" @@ -1668,7 +1663,7 @@ "message": "اسحب للفرز" }, "dragToReorder": { - "message": "Drag to reorder" + "message": "اسحب لإعادة الترتيب" }, "cfTypeText": { "message": "نص" @@ -1680,7 +1675,7 @@ "message": "قيمة منطقية" }, "cfTypeCheckbox": { - "message": "Checkbox" + "message": "خانة" }, "cfTypeLinked": { "message": "مرتبط", @@ -1865,10 +1860,10 @@ "message": "الهوية" }, "typeSshKey": { - "message": "SSH key" + "message": "مفتاح SSH" }, "newItemHeader": { - "message": "New $TYPE$", + "message": "جديد $TYPE$", "placeholders": { "type": { "content": "$1", @@ -1877,7 +1872,7 @@ } }, "editItemHeader": { - "message": "Edit $TYPE$", + "message": "تحرير $TYPE$", "placeholders": { "type": { "content": "$1", @@ -1886,7 +1881,7 @@ } }, "viewItemHeader": { - "message": "View $TYPE$", + "message": "عرض $TYPE$", "placeholders": { "type": { "content": "$1", @@ -1898,13 +1893,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": "رجوع" @@ -1913,7 +1908,7 @@ "message": "المجموعات" }, "nCollections": { - "message": "$COUNT$ collections", + "message": "مجموعات $COUNT$", "placeholders": { "count": { "content": "$1", @@ -1943,7 +1938,7 @@ "message": "ملاحظات آمنة" }, "sshKeys": { - "message": "SSH Keys" + "message": "مفاتيح SSH" }, "clear": { "message": "مسح", @@ -1969,7 +1964,7 @@ "description": "Domain name. Ex. website.com" }, "baseDomainOptionRecommended": { - "message": "Base domain (recommended)", + "message": "النطاق الأساسي (مستحسن)", "description": "Domain name. Ex. website.com" }, "domainName": { @@ -2023,7 +2018,7 @@ "message": "لا توجد كلمات مرور للعرض." }, "clearHistory": { - "message": "Clear history" + "message": "مسح المحفوظات" }, "nothingToShow": { "message": "لا يوجد شيء لعرضه" @@ -2144,7 +2139,7 @@ "message": "مولد اسم المستخدم" }, "useThisEmail": { - "message": "Use this email" + "message": "استخدم هذا البريد الإلكتروني" }, "useThisPassword": { "message": "استخدم كلمة المرور هذه" @@ -2164,22 +2159,22 @@ "description": "This will be used as part of a larger sentence, broken up to include the generator icon. The full sentence will read 'Use the generator [GENERATOR_ICON] to create a strong unique password'" }, "vaultCustomization": { - "message": "Vault customization" + "message": "تخصيص المخزن" }, "vaultTimeoutAction": { "message": "إجراء مهلة المخزن" }, "vaultTimeoutAction1": { - "message": "Timeout action" + "message": "إجراء المهلة" }, "newCustomizationOptionsCalloutTitle": { - "message": "New customization options" + "message": "خيارات التخصيص الجديدة" }, "newCustomizationOptionsCalloutContent": { - "message": "Customize your vault experience with quick copy actions, compact mode, and more!" + "message": "تخصيص تجربة المخزن الخاص بك مع إجراءات النسخ السريعة، والوضع المدمج، والمزيد!" }, "newCustomizationOptionsCalloutLink": { - "message": "View all Appearance settings" + "message": "عرض جميع إعدادات المظهر" }, "lock": { "message": "قفل", @@ -2327,6 +2322,9 @@ "privacyPolicy": { "message": "سياسة الخصوصية" }, + "yourNewPasswordCannotBeTheSameAsYourCurrentPassword": { + "message": "كلمة المرور الجديدة لا يمكن أن تكون نفس كلمة المرور الحالية." + }, "hintEqualsPassword": { "message": "لا يمكن أن يكون تلميح كلمة المرور نفس كلمة المرور الخاصة بك." }, @@ -2334,10 +2332,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": "التحقق من مزامنة سطح المكتب" @@ -2379,7 +2377,7 @@ "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": "لم يتم إعداد القياسات الحيوية" @@ -2394,16 +2392,16 @@ "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": "فشل القياسات الحيوية" @@ -2427,20 +2425,20 @@ "message": "بسبب سياسة المؤسسة، يمنع عليك حفظ العناصر في خزانتك الشخصية. غيّر خيار الملكية إلى مؤسسة واختر من المجموعات المتاحة." }, "personalOwnershipPolicyInEffect": { - "message": "An organization policy is affecting your ownership options." + "message": "تؤثر سياسة مؤسسة على خيارات الملكية الخاصة بك." }, "personalOwnershipPolicyInEffectImports": { - "message": "An organization policy has blocked importing items into your individual vault." + "message": "لقد حالت سياسة المؤسسة دون استيراد العناصر إلى خزانتك الشخصية." }, "domainsTitle": { "message": "النطاقات", "description": "A category title describing the concept of web domains" }, "blockedDomains": { - "message": "Blocked domains" + "message": "النطاقات المحظورة" }, "learnMoreAboutBlockedDomains": { - "message": "Learn more about blocked domains" + "message": "معرفة المزيد حول النطاقات المحظورة" }, "excludedDomains": { "message": "النطاقات المستبعدة" @@ -2452,19 +2450,19 @@ "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": "Change" + "message": "تغيير" }, "changeButtonTitle": { - "message": "Change password - $ITEMNAME$", + "message": "تغيير كلمة المرور - $ITEMNAME$", "placeholders": { "itemname": { "content": "$1", @@ -2534,15 +2532,15 @@ "message": "Your organization passwords are at-risk because they are weak, reused, and/or exposed.", "description": "Description of the review at-risk login slide on the at-risk password page carousel" }, - "reviewAtRiskLoginSlideImgAlt": { - "message": "Illustration of a list of logins that are at-risk" + "reviewAtRiskLoginSlideImgAltPeriod": { + "message": "Illustration of a list of logins that are at-risk." }, "generatePasswordSlideDesc": { "message": "Quickly generate a strong, unique password with the Bitwarden autofill menu on the at-risk site.", "description": "Description of the generate password slide on the at-risk password page carousel" }, - "generatePasswordSlideImgAlt": { - "message": "Illustration of the Bitwarden autofill menu displaying a generated password" + "generatePasswordSlideImgAltPeriod": { + "message": "Illustration of the Bitwarden autofill menu displaying a generated password." }, "updateInBitwarden": { "message": "Update in Bitwarden" @@ -2551,8 +2549,8 @@ "message": "Bitwarden will then prompt you to update the password in the password manager.", "description": "Description of the update in Bitwarden slide on the at-risk password page carousel" }, - "updateInBitwardenSlideImgAlt": { - "message": "Illustration of a Bitwarden’s notification prompting the user to update the login" + "updateInBitwardenSlideImgAltPeriod": { + "message": "Illustration of a Bitwarden’s notification prompting the user to update the login." }, "turnOnAutofill": { "message": "Turn on autofill" @@ -2717,27 +2715,27 @@ "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": { @@ -2747,11 +2745,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": { @@ -2761,32 +2759,32 @@ } }, "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": "من أجل اختيار ملف باستخدام فايرفوكس، افتح الملحق في الشريط الجانبي أو اخرج إلى نافذة جديدة من خلال النقر على هذا الشعار." }, "sendSafariFileWarning": { - "message": "In order to choose a file using Safari, pop out to a new window by clicking this banner." + "message": "من أجل اختيار ملف باستخدام سافاري، انتقل إلى نافذة جديدة بالنقر على هذا الشعار." }, "popOut": { - "message": "Pop out" + "message": "انبثق" }, "sendFileCalloutHeader": { "message": "قبل أن تبدأ" @@ -2798,19 +2796,19 @@ "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": "تأكيد كلمة المرور الرئيسية" @@ -2822,13 +2820,13 @@ "message": "تأكيد البريد الإلكتروني مطلوب" }, "emailVerifiedV2": { - "message": "Email verified" + "message": "تم التحقق من البريد الإلكتروني" }, "emailVerificationRequiredDesc": { "message": "يجب عليك تأكيد بريدك الإلكتروني لاستخدام هذه الميزة. يمكنك تأكيد بريدك الإلكتروني في خزانة الويب." }, "updatedMasterPassword": { - "message": "Updated master password" + "message": "تحديث كلمة المرور الرئيسية" }, "updateMasterPassword": { "message": "تحديث كلمة المرور الرئيسية" @@ -2837,10 +2835,10 @@ "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": "التسجيل التلقائي" @@ -2849,22 +2847,22 @@ "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": { - "message": "Your organization permissions were updated, requiring you to set a master password.", + "message": "تم تحديث أذونات مؤسستك، مما يتطلب عليك تعيين كلمة مرور رئيسية.", "description": "Used as a card title description on the set password page to explain why the user is there" }, "orgRequiresYouToSetPassword": { - "message": "Your organization requires you to set a master password.", + "message": "تتطلب مؤسستك تعيين كلمة مرور رئيسية.", "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", @@ -2883,7 +2881,7 @@ "message": "دقائق" }, "vaultTimeoutPolicyAffectingOptions": { - "message": "Enterprise policy requirements have been applied to your timeout options" + "message": "تم تطبيق متطلبات سياسة المؤسسة على خيارات المهلة الخاصة بك" }, "vaultTimeoutPolicyInEffect": { "message": "سياسات مؤسستك تؤثر على مهلة الخزانة الخاص بك. الحد الأقصى المسموح به لمهلة الخزانة هو $HOURS$ ساعة/ساعات و $MINUTES$ دقيقة/دقائق.", @@ -2899,7 +2897,7 @@ } }, "vaultTimeoutPolicyInEffect1": { - "message": "$HOURS$ hour(s) and $MINUTES$ minute(s) maximum.", + "message": "$HOURS$ ساعة(ساعات) و $MINUTES$ دقيقة(دقائق) كحد أقصى.", "placeholders": { "hours": { "content": "$1", @@ -2912,7 +2910,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", @@ -2925,7 +2923,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", @@ -2942,7 +2940,7 @@ } }, "vaultTimeoutActionPolicyInEffect": { - "message": "Your organization policies have set your vault timeout action to $ACTION$.", + "message": "لقد حددت سياسات مؤسستك إجراء مهلة المخزن الخاص بك إلى $ACTION$.", "placeholders": { "action": { "content": "$1", @@ -2966,7 +2964,7 @@ "message": "لم يتم العثور على معرف فريد." }, "convertOrganizationEncryptionDesc": { - "message": "$ORGANIZATION$ is using SSO with a self-hosted key server. A master password is no longer required to log in for members of this organization.", + "message": "يستخدم $ORGANIZATION$ SSO مع خادم مفتاح الاستضافة الذاتية. لم تعد هناك حاجة إلى كلمة مرور رئيسية لتسجيل الدخول لأعضاء هذه المنظمة.", "placeholders": { "organization": { "content": "$1", @@ -2990,7 +2988,7 @@ "message": "لقد غادرت المؤسسة." }, "toggleCharacterCount": { - "message": "Toggle character count" + "message": "تبديل عدد الأحرف" }, "sessionTimeout": { "message": "انتهت مدة جلستك. يرجى العودة ومحاولة تسجيل الدخول مرة أخرى." @@ -2999,7 +2997,16 @@ "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", + "example": "name@example.com" + } + } + }, + "exportingIndividualVaultWithAttachmentsDescription": { + "message": "فقط عناصر المخزن الفردية بما في ذلك المرفقات المرتبطة بـ $EMAIL$ سيتم تصديرها. لن يتم تضمين عناصر مخزن المنظمة", "placeholders": { "email": { "content": "$1", @@ -3008,10 +3015,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", @@ -3023,27 +3030,27 @@ "message": "خطأ" }, "decryptionError": { - "message": "Decryption error" + "message": "خطأ فك التشفير" }, "couldNotDecryptVaultItemsBelow": { - "message": "Bitwarden could not decrypt the vault item(s) listed below." + "message": "تعذر على بتواردن فك تشفير العنصر (العناصر) المدرجة أدناه." }, "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": "إنشاء اسم المستخدم" }, "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": { @@ -3057,7 +3064,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": { @@ -3067,7 +3074,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": { @@ -3077,7 +3084,7 @@ } }, "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": { @@ -3839,15 +3846,9 @@ "duoHealthCheckResultsInNullAuthUrlError": { "message": "Error connecting with the Duo service. Use a different two-step login method or contact Duo for assistance." }, - "launchDuoAndFollowStepsToFinishLoggingIn": { - "message": "قم بتشغيل Duo واتبع الخطوات لإنهاء تسجيل الدخول." - }, "duoRequiredForAccount": { "message": "تسجيل الدخول لـ Duo من خطوتين مطلوب لحسابك." }, - "popoutTheExtensionToCompleteLogin": { - "message": "انبثق الامتداد لإكمال تسجيل الدخول." - }, "popoutExtension": { "message": "تمديد منبثق" }, @@ -4010,7 +4011,7 @@ "message": "رمز غير صحيح" }, "incorrectPin": { - "message": "رمز PIN غير صحيح" + "message": "رمز المرور غير صحيح" }, "multifactorAuthenticationFailed": { "message": "Multifactor authentication failed" @@ -4270,6 +4271,20 @@ } } }, + "viewItemTitleWithField": { + "message": "View item - $ITEMNAME$ - $FIELD$", + "description": "Title for a link that opens a view for an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + }, + "field": { + "content": "$2", + "example": "Username" + } + } + }, "autofillTitle": { "message": "Autofill - $ITEMNAME$", "description": "Title for a button that autofills a login item.", @@ -4280,6 +4295,20 @@ } } }, + "autofillTitleWithField": { + "message": "Autofill - $ITEMNAME$ - $FIELD$", + "description": "Title for a button that autofills a login item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + }, + "field": { + "content": "$2", + "example": "Username" + } + } + }, "copyFieldValue": { "message": "Copy $FIELD$, $VALUE$", "description": "Title for a button that copies a field value to the clipboard.", @@ -4899,8 +4928,8 @@ "message": "Password regenerated", "description": "Notification message for when a password has been regenerated" }, - "saveLoginToBitwarden": { - "message": "Save login to Bitwarden?", + "saveToBitwarden": { + "message": "Save to Bitwarden", "description": "Confirmation message for saving a login to Bitwarden" }, "spaceCharacterDescriptor": { @@ -5139,5 +5168,32 @@ }, "changeAtRiskPassword": { "message": "Change at-risk password" + }, + "introCarouselLabel": { + "message": "Welcome to Bitwarden" + }, + "securityPrioritized": { + "message": "Security, prioritized" + }, + "securityPrioritizedBody": { + "message": "Save logins, cards, and identities to your secure vault. Bitwarden uses zero-knowledge, end-to-end encryption to protect what’s important to you." + }, + "quickLogin": { + "message": "Quick and easy login" + }, + "quickLoginBody": { + "message": "Set up biometric unlock and autofill to log into your accounts without typing a single letter." + }, + "secureUser": { + "message": "Level up your logins" + }, + "secureUserBody": { + "message": "Use the generator to create and save strong, unique passwords for all your accounts." + }, + "secureDevices": { + "message": "Your data, when and where you need it" + }, + "secureDevicesBody": { + "message": "Save unlimited passwords across unlimited devices with Bitwarden mobile, browser, and desktop apps." } } diff --git a/apps/browser/src/_locales/az/messages.json b/apps/browser/src/_locales/az/messages.json index 6f3ace453ae..ee32999daca 100644 --- a/apps/browser/src/_locales/az/messages.json +++ b/apps/browser/src/_locales/az/messages.json @@ -1098,6 +1098,31 @@ "message": "Giriş məlumatları güncəlləndi", "description": "Message displayed when login details are successfully updated." }, + "loginUpdateTaskSuccess": { + "message": "Əhsən sizə! Özünüzü və $ORGANIZATION$ təşkilatını daha güvənli etmək üçün addımlar atdınız.", + "placeholders": { + "organization": { + "content": "$1" + } + }, + "description": "Shown to user after login is updated." + }, + "loginUpdateTaskSuccessAdditional": { + "message": "$ORGANIZATION$ təşkilatını daha güvənli hala gətirdiyiniz üçün təşəkkürlər. Daha $TASK_COUNT$ parolunuz güncəllənməlidir.", + "placeholders": { + "organization": { + "content": "$1" + }, + "task_count": { + "content": "$2" + } + }, + "description": "Shown to user after login is updated." + }, + "nextSecurityTaskAction": { + "message": "Növbəti parolu dəyişdir", + "description": "Message prompting user to undertake completion of another security task." + }, "saveFailure": { "message": "Saxlama xətası", "description": "Error message shown when the system fails to save login details." @@ -1391,24 +1416,12 @@ "premiumRequiredDesc": { "message": "Bu özəlliyi istifadə etmək üçün premium üzvlük lazımdır." }, - "enterVerificationCodeApp": { - "message": "Kimlik doğrulayıcı tətbiqindən 6 rəqəmli doğrulama kodunu daxil edin." - }, "authenticationTimeout": { "message": "Kimlik doğrulama vaxtı bitdi" }, "authenticationSessionTimedOut": { "message": "Kimlik doğrulama seansının vaxtı bitdi. Lütfən giriş prosesini yenidən başladın." }, - "enterVerificationCodeEmail": { - "message": "$EMAIL$ ünvanına göndərilən e-poçtdakı 6 rəqəmli doğrulama kodunu daxil edin.", - "placeholders": { - "email": { - "content": "$1", - "example": "example@gmail.com" - } - } - }, "verificationCodeEmailSent": { "message": "Doğrulama poçtu $EMAIL$ ünvanına göndərildi.", "placeholders": { @@ -1418,18 +1431,9 @@ } } }, - "rememberMe": { - "message": "Məni xatırla" - }, "dontAskAgainOnThisDeviceFor30Days": { "message": "Bu cihazda 30 gün ərzində soruşulmasın" }, - "sendVerificationCodeEmailAgain": { - "message": "Doğrulama kodu olan e-poçtu yenidən göndər" - }, - "useAnotherTwoStepMethod": { - "message": "Başqa bir iki addımlı giriş üsulu istifadə edin" - }, "selectAnotherMethod": { "message": "Başqa üsul seçin", "description": "Select another two-step login method" @@ -1437,18 +1441,9 @@ "useYourRecoveryCode": { "message": "Geri qaytarma kodunuzu istifadə edin" }, - "insertYubiKey": { - "message": "\"YubiKey\"i kompüterinizin USB portuna taxın, daha sonra düyməsinə toxunun." - }, "insertU2f": { "message": "Güvənlik açarını kompüterinizin USB portuna taxın. Düyməsi varsa toxunun." }, - "webAuthnNewTab": { - "message": "WebAuthn 2FA doğrulamasını başladın. Yeni bir vərəq açmaq üçün aşağıdakı düyməyə klikləyin və yeni vərəqdəki təlimatları izləyin." - }, - "webAuthnNewTabOpen": { - "message": "Yeni vərəq aç" - }, "openInNewTab": { "message": "Yeni vərəqdə aç" }, @@ -2327,6 +2322,9 @@ "privacyPolicy": { "message": "Gizlilik Siyasəti" }, + "yourNewPasswordCannotBeTheSameAsYourCurrentPassword": { + "message": "Yeni parolunuz hazırkı parolunuzla eyni ola bilməz." + }, "hintEqualsPassword": { "message": "Parol ipucusu, parolunuzla eyni ola bilməz." }, @@ -2534,15 +2532,15 @@ "message": "Təşkilatınız parolları zəif, təkrar istifadə olunduğu və/və ya ifşa olunduğu üçün risk altındadır.", "description": "Description of the review at-risk login slide on the at-risk password page carousel" }, - "reviewAtRiskLoginSlideImgAlt": { - "message": "Risk altındakı girişlərin olduğu siyahının təsviri" + "reviewAtRiskLoginSlideImgAltPeriod": { + "message": "Risk altındakı girişlərin olduğu siyahının təsviri." }, "generatePasswordSlideDesc": { "message": "Risk altında olan saytda Bitwarden avto-doldurma menyusu ilə güclü, unikal parolları cəld yaradın.", "description": "Description of the generate password slide on the at-risk password page carousel" }, - "generatePasswordSlideImgAlt": { - "message": "Yaradılan parolları göstərən Bitwarden avto-doldurma menyusunun təsviri" + "generatePasswordSlideImgAltPeriod": { + "message": "Yaradılan parolları göstərən Bitwarden avto-doldurma menyusunun təsviri." }, "updateInBitwarden": { "message": "Bitwarden-də güncəllə" @@ -2551,8 +2549,8 @@ "message": "Bitwarden, daha sonra parol menecerində parolu güncəlləməyinizi istəyəcək.", "description": "Description of the update in Bitwarden slide on the at-risk password page carousel" }, - "updateInBitwardenSlideImgAlt": { - "message": "İstifadəçidən giriş məlumatlarını güncəlləməsini istəyən Bitwarden bildirişinin təsviri" + "updateInBitwardenSlideImgAltPeriod": { + "message": "İstifadəçidən giriş məlumatlarını güncəlləməsini istəyən Bitwarden bildirişinin təsviri." }, "turnOnAutofill": { "message": "Avto-doldurmanı işə sal" @@ -3007,6 +3005,15 @@ } } }, + "exportingIndividualVaultWithAttachmentsDescription": { + "message": "Yalnız $EMAIL$ ilə əlaqələndirilmiş qoşmalar daxil olmaqla fərdi anbar elementləri xaricə köçürüləcək. Təşkilat anbar elementləri daxil edilməyəcək", + "placeholders": { + "email": { + "content": "$1", + "example": "name@example.com" + } + } + }, "exportingOrganizationVaultTitle": { "message": "Təşkilat seyfini xaricə köçürmə" }, @@ -3839,15 +3846,9 @@ "duoHealthCheckResultsInNullAuthUrlError": { "message": "Duo xidmətinə bağlanarkən xəta baş verdi. Fərqli iki addımlı giriş üsulu istifadə edin və ya kömək üçün Duo ilə əlaqə saxlayın." }, - "launchDuoAndFollowStepsToFinishLoggingIn": { - "message": "Duo-nu başladın və giriş prosesini tamamlamaq üçün addımları izləyin." - }, "duoRequiredForAccount": { "message": "Hesabınız üçün Duo iki addımlı giriş tələb olunur." }, - "popoutTheExtensionToCompleteLogin": { - "message": "Girişi tamamlamaq üçün uzantını aç." - }, "popoutExtension": { "message": "Popout uzantısı" }, @@ -4270,6 +4271,20 @@ } } }, + "viewItemTitleWithField": { + "message": "Elementə bax - $ITEMNAME$ - $FIELD$", + "description": "Title for a link that opens a view for an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + }, + "field": { + "content": "$2", + "example": "Username" + } + } + }, "autofillTitle": { "message": "Avto-doldur - $ITEMNAME$", "description": "Title for a button that autofills a login item.", @@ -4280,6 +4295,20 @@ } } }, + "autofillTitleWithField": { + "message": "Avto-doldurma - $ITEMNAME$ - $FIELD$", + "description": "Title for a button that autofills a login item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + }, + "field": { + "content": "$2", + "example": "Username" + } + } + }, "copyFieldValue": { "message": "Kopyala: $FIELD$, $VALUE$", "description": "Title for a button that copies a field value to the clipboard.", @@ -4899,8 +4928,8 @@ "message": "Parol yenidən yaradıldı", "description": "Notification message for when a password has been regenerated" }, - "saveLoginToBitwarden": { - "message": "Giriş Bitwarden-də saxlanılsın?", + "saveToBitwarden": { + "message": "\"Bitwarden\"də saxla", "description": "Confirmation message for saving a login to Bitwarden" }, "spaceCharacterDescriptor": { @@ -5139,5 +5168,32 @@ }, "changeAtRiskPassword": { "message": "Riskli parolları dəyişdir" + }, + "introCarouselLabel": { + "message": "Bitwarden-ə xoş gəlmisiniz" + }, + "securityPrioritized": { + "message": "Təhlükəsizlik, prioritetdir" + }, + "securityPrioritizedBody": { + "message": "Girişləri, kart və kimlik məlumatlarınızı güvənli seyfinizdə saxlayın. Bitwarden, sizin üçün mühüm olanları qorumaq üçün zero-knowledge və ucdan-uca şifrələmə istifadə edir." + }, + "quickLogin": { + "message": "Cəld və asan giriş" + }, + "quickLoginBody": { + "message": "Tək bir hərf yazmadan hesablarınıza giriş etmək üçün biometrik kilid açma və avto-doldurma seçimlərini qurun." + }, + "secureUser": { + "message": "Giriş məlumatlarınızı yüksəldin" + }, + "secureUserBody": { + "message": "Bütün hesablarınız üçün güclü, unikal parollar yaratmaq və saxlamaq üçün yaradıcını istifadə edin." + }, + "secureDevices": { + "message": "Datanız, ehtiyacınız olan vaxt yanınızdadır" + }, + "secureDevicesBody": { + "message": "Bitwarden mobil, brauzer və masaüstü tətbiqləri ilə limitsiz cihaz arasında limitsiz parol saxlayın." } } diff --git a/apps/browser/src/_locales/be/messages.json b/apps/browser/src/_locales/be/messages.json index 905f6b6ac1d..9310d8830f4 100644 --- a/apps/browser/src/_locales/be/messages.json +++ b/apps/browser/src/_locales/be/messages.json @@ -23,7 +23,7 @@ "message": "Упершыню ў Bitwarden?" }, "logInWithPasskey": { - "message": "Log in with passkey" + "message": "Увайсці з ключом доступу" }, "useSingleSignOn": { "message": "Выкарыстаць аднаразовы ўваход" @@ -35,7 +35,7 @@ "message": "Прызначыць надзейны пароль" }, "finishCreatingYourAccountBySettingAPassword": { - "message": "Finish creating your account by setting a password" + "message": "Завяршыць стварэнне вашага ўліковага запісу нарадзіўшы пароль" }, "enterpriseSingleSignOn": { "message": "Адзіны ўваход прадпрыемства (SSO)" @@ -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", @@ -81,7 +81,7 @@ "message": "Падказка да асноўнага пароля (неабавязкова)" }, "passwordStrengthScore": { - "message": "Password strength score $SCORE$", + "message": "Ацэнка надзейнасці пароля $SCORE$", "placeholders": { "score": { "content": "$1", @@ -206,10 +206,10 @@ "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": { @@ -261,7 +261,7 @@ "message": "Запытаць падказку да асноўнага пароля" }, "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { - "message": "Enter your account email address and your password hint will be sent to you" + "message": "Увядзіце адрас электроннай пошты ўліковага запісу і падказка пароля будзе адпраўлена вам" }, "getMasterPasswordHint": { "message": "Атрымаць падказку да асноўнага пароля" @@ -291,7 +291,7 @@ "message": "Працягнуць у вэб-праграме?" }, "continueToWebAppDesc": { - "message": "Explore more features of your Bitwarden account on the web app." + "message": "Даследуйце больш функцый вашага уліковага запісу Bitwarden у вэб-праграме." }, "continueToHelpCenter": { "message": "Працягнуць працу ў Даведачным цэнтры?" @@ -1098,6 +1098,31 @@ "message": "Login updated", "description": "Message displayed when login details are successfully updated." }, + "loginUpdateTaskSuccess": { + "message": "Great job! You took the steps to make you and $ORGANIZATION$ more secure.", + "placeholders": { + "organization": { + "content": "$1" + } + }, + "description": "Shown to user after login is updated." + }, + "loginUpdateTaskSuccessAdditional": { + "message": "Thank you for making $ORGANIZATION$ more secure. You have $TASK_COUNT$ more passwords to update.", + "placeholders": { + "organization": { + "content": "$1" + }, + "task_count": { + "content": "$2" + } + }, + "description": "Shown to user after login is updated." + }, + "nextSecurityTaskAction": { + "message": "Change next password", + "description": "Message prompting user to undertake completion of another security task." + }, "saveFailure": { "message": "Error saving", "description": "Error message shown when the system fails to save login details." @@ -1391,24 +1416,12 @@ "premiumRequiredDesc": { "message": "Для выкарыстання гэтай функцыі патрабуецца прэміяльны статус." }, - "enterVerificationCodeApp": { - "message": "Увядзіце 6 лічбаў праверачнага кода з вашай праграмы аўтэнтыфікацыі." - }, "authenticationTimeout": { "message": "Authentication timeout" }, "authenticationSessionTimedOut": { "message": "The authentication session timed out. Please restart the login process." }, - "enterVerificationCodeEmail": { - "message": "Увядзіце 6 лічбаў праверачнага кода, які быў адпраўлены на $EMAIL$.", - "placeholders": { - "email": { - "content": "$1", - "example": "example@gmail.com" - } - } - }, "verificationCodeEmailSent": { "message": "Праверачны ліст адпраўлены на $EMAIL$.", "placeholders": { @@ -1418,18 +1431,9 @@ } } }, - "rememberMe": { - "message": "Запомніць мяне" - }, "dontAskAgainOnThisDeviceFor30Days": { "message": "Don't ask again on this device for 30 days" }, - "sendVerificationCodeEmailAgain": { - "message": "Адправіць праверачны код яшчэ раз" - }, - "useAnotherTwoStepMethod": { - "message": "Выкарыстоўваць іншы метад двухэтапнага ўваходу" - }, "selectAnotherMethod": { "message": "Select another method", "description": "Select another two-step login method" @@ -1437,18 +1441,9 @@ "useYourRecoveryCode": { "message": "Use your recovery code" }, - "insertYubiKey": { - "message": "Устаўце свой YubiKey у порт USB камп'ютара, а потым націсніце на кнопку." - }, "insertU2f": { "message": "Устаўце ваш ключ бяспекі ў порт USB камп'ютара. Калі на ім ёсць кнопка, націсніце на яе." }, - "webAuthnNewTab": { - "message": "Каб пачаць праверку WebAuthn 2FA, націсніце кнопку знізу для адкрыцця новай укладкі і прытрымлівайцеся інструкцый, якія паказаны ў новай укладцы." - }, - "webAuthnNewTabOpen": { - "message": "Адкрыць новую ўкладку" - }, "openInNewTab": { "message": "Open in new tab" }, @@ -2327,6 +2322,9 @@ "privacyPolicy": { "message": "Палітыка прыватнасці" }, + "yourNewPasswordCannotBeTheSameAsYourCurrentPassword": { + "message": "Your new password cannot be the same as your current password." + }, "hintEqualsPassword": { "message": "Падказка для пароля не можа супадаць з паролем." }, @@ -2534,15 +2532,15 @@ "message": "Your organization passwords are at-risk because they are weak, reused, and/or exposed.", "description": "Description of the review at-risk login slide on the at-risk password page carousel" }, - "reviewAtRiskLoginSlideImgAlt": { - "message": "Illustration of a list of logins that are at-risk" + "reviewAtRiskLoginSlideImgAltPeriod": { + "message": "Illustration of a list of logins that are at-risk." }, "generatePasswordSlideDesc": { "message": "Quickly generate a strong, unique password with the Bitwarden autofill menu on the at-risk site.", "description": "Description of the generate password slide on the at-risk password page carousel" }, - "generatePasswordSlideImgAlt": { - "message": "Illustration of the Bitwarden autofill menu displaying a generated password" + "generatePasswordSlideImgAltPeriod": { + "message": "Illustration of the Bitwarden autofill menu displaying a generated password." }, "updateInBitwarden": { "message": "Update in Bitwarden" @@ -2551,8 +2549,8 @@ "message": "Bitwarden will then prompt you to update the password in the password manager.", "description": "Description of the update in Bitwarden slide on the at-risk password page carousel" }, - "updateInBitwardenSlideImgAlt": { - "message": "Illustration of a Bitwarden’s notification prompting the user to update the login" + "updateInBitwardenSlideImgAltPeriod": { + "message": "Illustration of a Bitwarden’s notification prompting the user to update the login." }, "turnOnAutofill": { "message": "Turn on autofill" @@ -3007,6 +3005,15 @@ } } }, + "exportingIndividualVaultWithAttachmentsDescription": { + "message": "Only the individual vault items including attachments associated with $EMAIL$ will be exported. Organization vault items will not be included", + "placeholders": { + "email": { + "content": "$1", + "example": "name@example.com" + } + } + }, "exportingOrganizationVaultTitle": { "message": "Экспартаванне сховішча арганізацыі" }, @@ -3839,15 +3846,9 @@ "duoHealthCheckResultsInNullAuthUrlError": { "message": "Error connecting with the Duo service. Use a different two-step login method or contact Duo for assistance." }, - "launchDuoAndFollowStepsToFinishLoggingIn": { - "message": "Launch Duo and follow the steps to finish logging in." - }, "duoRequiredForAccount": { "message": "Duo two-step login is required for your account." }, - "popoutTheExtensionToCompleteLogin": { - "message": "Popout the extension to complete login." - }, "popoutExtension": { "message": "Popout extension" }, @@ -4270,6 +4271,20 @@ } } }, + "viewItemTitleWithField": { + "message": "View item - $ITEMNAME$ - $FIELD$", + "description": "Title for a link that opens a view for an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + }, + "field": { + "content": "$2", + "example": "Username" + } + } + }, "autofillTitle": { "message": "Autofill - $ITEMNAME$", "description": "Title for a button that autofills a login item.", @@ -4280,6 +4295,20 @@ } } }, + "autofillTitleWithField": { + "message": "Autofill - $ITEMNAME$ - $FIELD$", + "description": "Title for a button that autofills a login item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + }, + "field": { + "content": "$2", + "example": "Username" + } + } + }, "copyFieldValue": { "message": "Copy $FIELD$, $VALUE$", "description": "Title for a button that copies a field value to the clipboard.", @@ -4899,8 +4928,8 @@ "message": "Password regenerated", "description": "Notification message for when a password has been regenerated" }, - "saveLoginToBitwarden": { - "message": "Save login to Bitwarden?", + "saveToBitwarden": { + "message": "Save to Bitwarden", "description": "Confirmation message for saving a login to Bitwarden" }, "spaceCharacterDescriptor": { @@ -5139,5 +5168,32 @@ }, "changeAtRiskPassword": { "message": "Change at-risk password" + }, + "introCarouselLabel": { + "message": "Welcome to Bitwarden" + }, + "securityPrioritized": { + "message": "Security, prioritized" + }, + "securityPrioritizedBody": { + "message": "Save logins, cards, and identities to your secure vault. Bitwarden uses zero-knowledge, end-to-end encryption to protect what’s important to you." + }, + "quickLogin": { + "message": "Quick and easy login" + }, + "quickLoginBody": { + "message": "Set up biometric unlock and autofill to log into your accounts without typing a single letter." + }, + "secureUser": { + "message": "Level up your logins" + }, + "secureUserBody": { + "message": "Use the generator to create and save strong, unique passwords for all your accounts." + }, + "secureDevices": { + "message": "Your data, when and where you need it" + }, + "secureDevicesBody": { + "message": "Save unlimited passwords across unlimited devices with Bitwarden mobile, browser, and desktop apps." } } diff --git a/apps/browser/src/_locales/bg/messages.json b/apps/browser/src/_locales/bg/messages.json index 226e63e32cb..6908ee7564e 100644 --- a/apps/browser/src/_locales/bg/messages.json +++ b/apps/browser/src/_locales/bg/messages.json @@ -1098,6 +1098,31 @@ "message": "Данните за вписване са обновени", "description": "Message displayed when login details are successfully updated." }, + "loginUpdateTaskSuccess": { + "message": "Чудесна работа! Направихте правилните стъпки за Вашата защита и тази на $ORGANIZATION$.", + "placeholders": { + "organization": { + "content": "$1" + } + }, + "description": "Shown to user after login is updated." + }, + "loginUpdateTaskSuccessAdditional": { + "message": "Благодарим Ви, че подобрихте защитата на $ORGANIZATION$. Имате още $TASK_COUNT$ пароли за обновяване.", + "placeholders": { + "organization": { + "content": "$1" + }, + "task_count": { + "content": "$2" + } + }, + "description": "Shown to user after login is updated." + }, + "nextSecurityTaskAction": { + "message": "Промяна на следващата парола", + "description": "Message prompting user to undertake completion of another security task." + }, "saveFailure": { "message": "Грешка при запазването", "description": "Error message shown when the system fails to save login details." @@ -1391,24 +1416,12 @@ "premiumRequiredDesc": { "message": "За да се възползвате от тази възможност, трябва да ползвате платен абонамент." }, - "enterVerificationCodeApp": { - "message": "Въведете шестцифрения код за потвърждение от приложението за удостоверяване." - }, "authenticationTimeout": { "message": "Време на давност за удостоверяването" }, "authenticationSessionTimedOut": { "message": "Сесията за удостоверяване е изтекла. Моля, започнете отначало процеса по вписване." }, - "enterVerificationCodeEmail": { - "message": "Въведете шестцифрения код за потвърждение, който е бил изпратен на $EMAIL$.", - "placeholders": { - "email": { - "content": "$1", - "example": "example@gmail.com" - } - } - }, "verificationCodeEmailSent": { "message": "Писмото за потвърждение е изпратено на $EMAIL$.", "placeholders": { @@ -1418,18 +1431,9 @@ } } }, - "rememberMe": { - "message": "Запомняне" - }, "dontAskAgainOnThisDeviceFor30Days": { "message": "Не ме питайте отново на това устройство за 30 дни" }, - "sendVerificationCodeEmailAgain": { - "message": "Повторно изпращане на писмото за потвърждение" - }, - "useAnotherTwoStepMethod": { - "message": "Използвайте друг начин на двустепенно удостоверяване" - }, "selectAnotherMethod": { "message": "Изберете друг метод", "description": "Select another two-step login method" @@ -1437,18 +1441,9 @@ "useYourRecoveryCode": { "message": "Използване на код за възстановяване" }, - "insertYubiKey": { - "message": "Поставете устройството на YubiKey в USB порт на компютъра и натиснете бутона на устройството." - }, "insertU2f": { "message": "Поставете устройството за удостоверяване в USB порт на компютъра. Ако на устройството има бутон, натиснете го." }, - "webAuthnNewTab": { - "message": "Продължаване на двустепенното удостоверяване чрез WebAuthn в новия раздел." - }, - "webAuthnNewTabOpen": { - "message": "Отваряне на нов раздел" - }, "openInNewTab": { "message": "Отваряне в нов раздел" }, @@ -2327,6 +2322,9 @@ "privacyPolicy": { "message": "Политика за поверителност" }, + "yourNewPasswordCannotBeTheSameAsYourCurrentPassword": { + "message": "Новата парола не може да бъде същата като текущата." + }, "hintEqualsPassword": { "message": "Подсказването за паролата не може да съвпада с нея." }, @@ -2534,15 +2532,15 @@ "message": "Паролите в организацията Ви са в риск, защото са слаби, преизползвани и/или разкрити.", "description": "Description of the review at-risk login slide on the at-risk password page carousel" }, - "reviewAtRiskLoginSlideImgAlt": { - "message": "Илюстрация на списък с елементи за вписване, които са в риск" + "reviewAtRiskLoginSlideImgAltPeriod": { + "message": "Илюстрация на списък с елементи за вписване, които са в риск." }, "generatePasswordSlideDesc": { "message": "Генерирайте бързо сложна и уникална парола от менюто за автоматично попълване на Битуорден, на уеб сайта, който е в риск.", "description": "Description of the generate password slide on the at-risk password page carousel" }, - "generatePasswordSlideImgAlt": { - "message": "Илюстрация на автоматичното попълване на Битуорден, показващо генерирана парола" + "generatePasswordSlideImgAltPeriod": { + "message": "Илюстрация на автоматичното попълване на Битуорден, показващо генерирана парола." }, "updateInBitwarden": { "message": "Обновяване в Битуорден" @@ -2551,8 +2549,8 @@ "message": "След това Битуорден ще попита дали искате да обновите паролата в управителя на пароли.", "description": "Description of the update in Bitwarden slide on the at-risk password page carousel" }, - "updateInBitwardenSlideImgAlt": { - "message": "Илюстрация на известието на Битуорден, чрез което пита потребителя дали да се обновят данните за вписване" + "updateInBitwardenSlideImgAltPeriod": { + "message": "Илюстрация на известието на Битуорден, чрез което пита потребителя дали да се обновят данните за вписване." }, "turnOnAutofill": { "message": "Включване на автоматичното попълване" @@ -3007,6 +3005,15 @@ } } }, + "exportingIndividualVaultWithAttachmentsDescription": { + "message": "Ще бъдат изнесени само записите и прикачените файлове от личния трезор свързан с $EMAIL$. Записите в трезора на организацията няма да бъдат включени.", + "placeholders": { + "email": { + "content": "$1", + "example": "name@example.com" + } + } + }, "exportingOrganizationVaultTitle": { "message": "Изнасяне на трезора на организацията" }, @@ -3839,15 +3846,9 @@ "duoHealthCheckResultsInNullAuthUrlError": { "message": "Грешка при свързването с услугата на Duo. Използвайте друг метод за двустепенно удостоверяване или се свържете с Duo за съдействие." }, - "launchDuoAndFollowStepsToFinishLoggingIn": { - "message": "Стартирайте DUO и следвайте инструкциите, за да завършите вписването." - }, "duoRequiredForAccount": { "message": "Вашата регистрация изисква двустепенно удостоверяване чрез Duo." }, - "popoutTheExtensionToCompleteLogin": { - "message": "Отворете разширението в изскачащ прозорец, за да завършите вписването." - }, "popoutExtension": { "message": "Отваряне на разширението в нов прозорец" }, @@ -4270,6 +4271,20 @@ } } }, + "viewItemTitleWithField": { + "message": "Преглед на елемента – $ITEMNAME$ – $FIELD$", + "description": "Title for a link that opens a view for an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + }, + "field": { + "content": "$2", + "example": "Username" + } + } + }, "autofillTitle": { "message": "Авт. попълване – $ITEMNAME$", "description": "Title for a button that autofills a login item.", @@ -4280,6 +4295,20 @@ } } }, + "autofillTitleWithField": { + "message": "Авт. попълване – $ITEMNAME$ – $FIELD$", + "description": "Title for a button that autofills a login item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + }, + "field": { + "content": "$2", + "example": "Username" + } + } + }, "copyFieldValue": { "message": "Копиране на $FIELD$, $VALUE$", "description": "Title for a button that copies a field value to the clipboard.", @@ -4899,8 +4928,8 @@ "message": "Паролата е прегенерирана", "description": "Notification message for when a password has been regenerated" }, - "saveLoginToBitwarden": { - "message": "Запазване на данните за вписване в Битуорден?", + "saveToBitwarden": { + "message": "Запазване в Битуорден", "description": "Confirmation message for saving a login to Bitwarden" }, "spaceCharacterDescriptor": { @@ -5139,5 +5168,32 @@ }, "changeAtRiskPassword": { "message": "Промяна на парола в риск" + }, + "introCarouselLabel": { + "message": "Добре дошли в Битуорден" + }, + "securityPrioritized": { + "message": "Защитата е от първостепенна важност" + }, + "securityPrioritizedBody": { + "message": "Съхранявайте данни за вписване, карти и самоличности в своя защитен трезор. Битуорден използва шифроване от край до край за да пази това, което е важно за Вас." + }, + "quickLogin": { + "message": "Бързо и лесно вписване" + }, + "quickLoginBody": { + "message": "Настройте отключването чрез биометрични данни и автоматичното попълване, за да се вписвате в регистрациите си без да натискате и един клавиш." + }, + "secureUser": { + "message": "Подобрете данните си за вписване" + }, + "secureUserBody": { + "message": "Използвайте генератора, за да създавате и запазвате сложни, уникални пароли за всичките си регистрации." + }, + "secureDevices": { + "message": "Вашите данни – когато и където Ви потрябват" + }, + "secureDevicesBody": { + "message": "Съхранявайте неограничен брой пароли на множество устройства – с приложенията на Битуорден за мобилни телефони, браузър и компютър." } } diff --git a/apps/browser/src/_locales/bn/messages.json b/apps/browser/src/_locales/bn/messages.json index 983b9fadde4..f4bf9cb9e27 100644 --- a/apps/browser/src/_locales/bn/messages.json +++ b/apps/browser/src/_locales/bn/messages.json @@ -1098,6 +1098,31 @@ "message": "Login updated", "description": "Message displayed when login details are successfully updated." }, + "loginUpdateTaskSuccess": { + "message": "Great job! You took the steps to make you and $ORGANIZATION$ more secure.", + "placeholders": { + "organization": { + "content": "$1" + } + }, + "description": "Shown to user after login is updated." + }, + "loginUpdateTaskSuccessAdditional": { + "message": "Thank you for making $ORGANIZATION$ more secure. You have $TASK_COUNT$ more passwords to update.", + "placeholders": { + "organization": { + "content": "$1" + }, + "task_count": { + "content": "$2" + } + }, + "description": "Shown to user after login is updated." + }, + "nextSecurityTaskAction": { + "message": "Change next password", + "description": "Message prompting user to undertake completion of another security task." + }, "saveFailure": { "message": "Error saving", "description": "Error message shown when the system fails to save login details." @@ -1391,24 +1416,12 @@ "premiumRequiredDesc": { "message": "এই বৈশিষ্ট্যটি ব্যবহার করতে একটি প্রিমিয়াম সদস্যতার প্রয়োজন।" }, - "enterVerificationCodeApp": { - "message": "আপনার প্রমাণীকরণকারী অ্যাপ থেকে ৬ সংখ্যার যাচাইকরণ কোডটি প্রবেশ করুন।" - }, "authenticationTimeout": { "message": "Authentication timeout" }, "authenticationSessionTimedOut": { "message": "The authentication session timed out. Please restart the login process." }, - "enterVerificationCodeEmail": { - "message": "$EMAIL$ এ ইমেইল করা ৬ সংখ্যার যাচাই কোডটি প্রবেশ করুন।", - "placeholders": { - "email": { - "content": "$1", - "example": "example@gmail.com" - } - } - }, "verificationCodeEmailSent": { "message": "$EMAIL$ এ যাচাইকরণ ইমেইল প্রেরণ করা হয়েছে।", "placeholders": { @@ -1418,18 +1431,9 @@ } } }, - "rememberMe": { - "message": "আমাকে মনে রাখবেন" - }, "dontAskAgainOnThisDeviceFor30Days": { "message": "Don't ask again on this device for 30 days" }, - "sendVerificationCodeEmailAgain": { - "message": "আবার যাচাইকরণ কোড ইমেইলে প্রেরণ করুন" - }, - "useAnotherTwoStepMethod": { - "message": "অন্য দ্বি-পদক্ষেপ প্রবেশ পদ্ধতি ব্যবহার করুন" - }, "selectAnotherMethod": { "message": "Select another method", "description": "Select another two-step login method" @@ -1437,18 +1441,9 @@ "useYourRecoveryCode": { "message": "Use your recovery code" }, - "insertYubiKey": { - "message": "আপনার কম্পিউটারের ইউএসবি পোর্টে আপনার YubiKey ঢোকান, তারপরে তার বোতামটি স্পর্শ করুন।" - }, "insertU2f": { "message": "আপনার কম্পিউটারের ইউএসবি পোর্টে আপনার সুরক্ষা কী ঢোকান। এটিতে যদি একটি বোতাম থাকে তবে তা স্পর্শ করুন।" }, - "webAuthnNewTab": { - "message": "To start the WebAuthn 2FA verification. Click the button below to open a new tab and follow the instructions provided in the new tab." - }, - "webAuthnNewTabOpen": { - "message": "Open new tab" - }, "openInNewTab": { "message": "Open in new tab" }, @@ -2327,6 +2322,9 @@ "privacyPolicy": { "message": "গোপনীয়তা নীতি" }, + "yourNewPasswordCannotBeTheSameAsYourCurrentPassword": { + "message": "Your new password cannot be the same as your current password." + }, "hintEqualsPassword": { "message": "আপনার পাসওয়ার্ডের ইঙ্গিতটি আপনার পাসওয়ার্ড হতে পারবে না।" }, @@ -2534,15 +2532,15 @@ "message": "Your organization passwords are at-risk because they are weak, reused, and/or exposed.", "description": "Description of the review at-risk login slide on the at-risk password page carousel" }, - "reviewAtRiskLoginSlideImgAlt": { - "message": "Illustration of a list of logins that are at-risk" + "reviewAtRiskLoginSlideImgAltPeriod": { + "message": "Illustration of a list of logins that are at-risk." }, "generatePasswordSlideDesc": { "message": "Quickly generate a strong, unique password with the Bitwarden autofill menu on the at-risk site.", "description": "Description of the generate password slide on the at-risk password page carousel" }, - "generatePasswordSlideImgAlt": { - "message": "Illustration of the Bitwarden autofill menu displaying a generated password" + "generatePasswordSlideImgAltPeriod": { + "message": "Illustration of the Bitwarden autofill menu displaying a generated password." }, "updateInBitwarden": { "message": "Update in Bitwarden" @@ -2551,8 +2549,8 @@ "message": "Bitwarden will then prompt you to update the password in the password manager.", "description": "Description of the update in Bitwarden slide on the at-risk password page carousel" }, - "updateInBitwardenSlideImgAlt": { - "message": "Illustration of a Bitwarden’s notification prompting the user to update the login" + "updateInBitwardenSlideImgAltPeriod": { + "message": "Illustration of a Bitwarden’s notification prompting the user to update the login." }, "turnOnAutofill": { "message": "Turn on autofill" @@ -3007,6 +3005,15 @@ } } }, + "exportingIndividualVaultWithAttachmentsDescription": { + "message": "Only the individual vault items including attachments associated with $EMAIL$ will be exported. Organization vault items will not be included", + "placeholders": { + "email": { + "content": "$1", + "example": "name@example.com" + } + } + }, "exportingOrganizationVaultTitle": { "message": "Exporting organization vault" }, @@ -3839,15 +3846,9 @@ "duoHealthCheckResultsInNullAuthUrlError": { "message": "Error connecting with the Duo service. Use a different two-step login method or contact Duo for assistance." }, - "launchDuoAndFollowStepsToFinishLoggingIn": { - "message": "Launch Duo and follow the steps to finish logging in." - }, "duoRequiredForAccount": { "message": "Duo two-step login is required for your account." }, - "popoutTheExtensionToCompleteLogin": { - "message": "Popout the extension to complete login." - }, "popoutExtension": { "message": "Popout extension" }, @@ -4270,6 +4271,20 @@ } } }, + "viewItemTitleWithField": { + "message": "View item - $ITEMNAME$ - $FIELD$", + "description": "Title for a link that opens a view for an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + }, + "field": { + "content": "$2", + "example": "Username" + } + } + }, "autofillTitle": { "message": "Autofill - $ITEMNAME$", "description": "Title for a button that autofills a login item.", @@ -4280,6 +4295,20 @@ } } }, + "autofillTitleWithField": { + "message": "Autofill - $ITEMNAME$ - $FIELD$", + "description": "Title for a button that autofills a login item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + }, + "field": { + "content": "$2", + "example": "Username" + } + } + }, "copyFieldValue": { "message": "Copy $FIELD$, $VALUE$", "description": "Title for a button that copies a field value to the clipboard.", @@ -4899,8 +4928,8 @@ "message": "Password regenerated", "description": "Notification message for when a password has been regenerated" }, - "saveLoginToBitwarden": { - "message": "Save login to Bitwarden?", + "saveToBitwarden": { + "message": "Save to Bitwarden", "description": "Confirmation message for saving a login to Bitwarden" }, "spaceCharacterDescriptor": { @@ -5139,5 +5168,32 @@ }, "changeAtRiskPassword": { "message": "Change at-risk password" + }, + "introCarouselLabel": { + "message": "Welcome to Bitwarden" + }, + "securityPrioritized": { + "message": "Security, prioritized" + }, + "securityPrioritizedBody": { + "message": "Save logins, cards, and identities to your secure vault. Bitwarden uses zero-knowledge, end-to-end encryption to protect what’s important to you." + }, + "quickLogin": { + "message": "Quick and easy login" + }, + "quickLoginBody": { + "message": "Set up biometric unlock and autofill to log into your accounts without typing a single letter." + }, + "secureUser": { + "message": "Level up your logins" + }, + "secureUserBody": { + "message": "Use the generator to create and save strong, unique passwords for all your accounts." + }, + "secureDevices": { + "message": "Your data, when and where you need it" + }, + "secureDevicesBody": { + "message": "Save unlimited passwords across unlimited devices with Bitwarden mobile, browser, and desktop apps." } } diff --git a/apps/browser/src/_locales/bs/messages.json b/apps/browser/src/_locales/bs/messages.json index 08fedb6f10a..6b6f86cda37 100644 --- a/apps/browser/src/_locales/bs/messages.json +++ b/apps/browser/src/_locales/bs/messages.json @@ -1098,6 +1098,31 @@ "message": "Login updated", "description": "Message displayed when login details are successfully updated." }, + "loginUpdateTaskSuccess": { + "message": "Great job! You took the steps to make you and $ORGANIZATION$ more secure.", + "placeholders": { + "organization": { + "content": "$1" + } + }, + "description": "Shown to user after login is updated." + }, + "loginUpdateTaskSuccessAdditional": { + "message": "Thank you for making $ORGANIZATION$ more secure. You have $TASK_COUNT$ more passwords to update.", + "placeholders": { + "organization": { + "content": "$1" + }, + "task_count": { + "content": "$2" + } + }, + "description": "Shown to user after login is updated." + }, + "nextSecurityTaskAction": { + "message": "Change next password", + "description": "Message prompting user to undertake completion of another security task." + }, "saveFailure": { "message": "Error saving", "description": "Error message shown when the system fails to save login details." @@ -1391,24 +1416,12 @@ "premiumRequiredDesc": { "message": "A Premium membership is required to use this feature." }, - "enterVerificationCodeApp": { - "message": "Enter the 6 digit verification code from your authenticator app." - }, "authenticationTimeout": { "message": "Authentication timeout" }, "authenticationSessionTimedOut": { "message": "The authentication session timed out. Please restart the login process." }, - "enterVerificationCodeEmail": { - "message": "Enter the 6 digit verification code that was emailed to $EMAIL$.", - "placeholders": { - "email": { - "content": "$1", - "example": "example@gmail.com" - } - } - }, "verificationCodeEmailSent": { "message": "Verification email sent to $EMAIL$.", "placeholders": { @@ -1418,18 +1431,9 @@ } } }, - "rememberMe": { - "message": "Remember me" - }, "dontAskAgainOnThisDeviceFor30Days": { "message": "Don't ask again on this device for 30 days" }, - "sendVerificationCodeEmailAgain": { - "message": "Send verification code email again" - }, - "useAnotherTwoStepMethod": { - "message": "Use another two-step login method" - }, "selectAnotherMethod": { "message": "Select another method", "description": "Select another two-step login method" @@ -1437,18 +1441,9 @@ "useYourRecoveryCode": { "message": "Use your recovery code" }, - "insertYubiKey": { - "message": "Insert your YubiKey into your computer's USB port, then touch its button." - }, "insertU2f": { "message": "Insert your security key into your computer's USB port. If it has a button, touch it." }, - "webAuthnNewTab": { - "message": "To start the WebAuthn 2FA verification. Click the button below to open a new tab and follow the instructions provided in the new tab." - }, - "webAuthnNewTabOpen": { - "message": "Open new tab" - }, "openInNewTab": { "message": "Open in new tab" }, @@ -2327,6 +2322,9 @@ "privacyPolicy": { "message": "Privacy Policy" }, + "yourNewPasswordCannotBeTheSameAsYourCurrentPassword": { + "message": "Your new password cannot be the same as your current password." + }, "hintEqualsPassword": { "message": "Your password hint cannot be the same as your password." }, @@ -2534,15 +2532,15 @@ "message": "Your organization passwords are at-risk because they are weak, reused, and/or exposed.", "description": "Description of the review at-risk login slide on the at-risk password page carousel" }, - "reviewAtRiskLoginSlideImgAlt": { - "message": "Illustration of a list of logins that are at-risk" + "reviewAtRiskLoginSlideImgAltPeriod": { + "message": "Illustration of a list of logins that are at-risk." }, "generatePasswordSlideDesc": { "message": "Quickly generate a strong, unique password with the Bitwarden autofill menu on the at-risk site.", "description": "Description of the generate password slide on the at-risk password page carousel" }, - "generatePasswordSlideImgAlt": { - "message": "Illustration of the Bitwarden autofill menu displaying a generated password" + "generatePasswordSlideImgAltPeriod": { + "message": "Illustration of the Bitwarden autofill menu displaying a generated password." }, "updateInBitwarden": { "message": "Update in Bitwarden" @@ -2551,8 +2549,8 @@ "message": "Bitwarden will then prompt you to update the password in the password manager.", "description": "Description of the update in Bitwarden slide on the at-risk password page carousel" }, - "updateInBitwardenSlideImgAlt": { - "message": "Illustration of a Bitwarden’s notification prompting the user to update the login" + "updateInBitwardenSlideImgAltPeriod": { + "message": "Illustration of a Bitwarden’s notification prompting the user to update the login." }, "turnOnAutofill": { "message": "Turn on autofill" @@ -3007,6 +3005,15 @@ } } }, + "exportingIndividualVaultWithAttachmentsDescription": { + "message": "Only the individual vault items including attachments associated with $EMAIL$ will be exported. Organization vault items will not be included", + "placeholders": { + "email": { + "content": "$1", + "example": "name@example.com" + } + } + }, "exportingOrganizationVaultTitle": { "message": "Exporting organization vault" }, @@ -3839,15 +3846,9 @@ "duoHealthCheckResultsInNullAuthUrlError": { "message": "Error connecting with the Duo service. Use a different two-step login method or contact Duo for assistance." }, - "launchDuoAndFollowStepsToFinishLoggingIn": { - "message": "Launch Duo and follow the steps to finish logging in." - }, "duoRequiredForAccount": { "message": "Duo two-step login is required for your account." }, - "popoutTheExtensionToCompleteLogin": { - "message": "Popout the extension to complete login." - }, "popoutExtension": { "message": "Popout extension" }, @@ -4270,6 +4271,20 @@ } } }, + "viewItemTitleWithField": { + "message": "View item - $ITEMNAME$ - $FIELD$", + "description": "Title for a link that opens a view for an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + }, + "field": { + "content": "$2", + "example": "Username" + } + } + }, "autofillTitle": { "message": "Autofill - $ITEMNAME$", "description": "Title for a button that autofills a login item.", @@ -4280,6 +4295,20 @@ } } }, + "autofillTitleWithField": { + "message": "Autofill - $ITEMNAME$ - $FIELD$", + "description": "Title for a button that autofills a login item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + }, + "field": { + "content": "$2", + "example": "Username" + } + } + }, "copyFieldValue": { "message": "Copy $FIELD$, $VALUE$", "description": "Title for a button that copies a field value to the clipboard.", @@ -4899,8 +4928,8 @@ "message": "Password regenerated", "description": "Notification message for when a password has been regenerated" }, - "saveLoginToBitwarden": { - "message": "Save login to Bitwarden?", + "saveToBitwarden": { + "message": "Save to Bitwarden", "description": "Confirmation message for saving a login to Bitwarden" }, "spaceCharacterDescriptor": { @@ -5139,5 +5168,32 @@ }, "changeAtRiskPassword": { "message": "Change at-risk password" + }, + "introCarouselLabel": { + "message": "Welcome to Bitwarden" + }, + "securityPrioritized": { + "message": "Security, prioritized" + }, + "securityPrioritizedBody": { + "message": "Save logins, cards, and identities to your secure vault. Bitwarden uses zero-knowledge, end-to-end encryption to protect what’s important to you." + }, + "quickLogin": { + "message": "Quick and easy login" + }, + "quickLoginBody": { + "message": "Set up biometric unlock and autofill to log into your accounts without typing a single letter." + }, + "secureUser": { + "message": "Level up your logins" + }, + "secureUserBody": { + "message": "Use the generator to create and save strong, unique passwords for all your accounts." + }, + "secureDevices": { + "message": "Your data, when and where you need it" + }, + "secureDevicesBody": { + "message": "Save unlimited passwords across unlimited devices with Bitwarden mobile, browser, and desktop apps." } } diff --git a/apps/browser/src/_locales/ca/messages.json b/apps/browser/src/_locales/ca/messages.json index 14e4a577440..fbd752305a6 100644 --- a/apps/browser/src/_locales/ca/messages.json +++ b/apps/browser/src/_locales/ca/messages.json @@ -1098,6 +1098,31 @@ "message": "Login updated", "description": "Message displayed when login details are successfully updated." }, + "loginUpdateTaskSuccess": { + "message": "Great job! You took the steps to make you and $ORGANIZATION$ more secure.", + "placeholders": { + "organization": { + "content": "$1" + } + }, + "description": "Shown to user after login is updated." + }, + "loginUpdateTaskSuccessAdditional": { + "message": "Thank you for making $ORGANIZATION$ more secure. You have $TASK_COUNT$ more passwords to update.", + "placeholders": { + "organization": { + "content": "$1" + }, + "task_count": { + "content": "$2" + } + }, + "description": "Shown to user after login is updated." + }, + "nextSecurityTaskAction": { + "message": "Change next password", + "description": "Message prompting user to undertake completion of another security task." + }, "saveFailure": { "message": "Error saving", "description": "Error message shown when the system fails to save login details." @@ -1391,24 +1416,12 @@ "premiumRequiredDesc": { "message": "Cal una subscripció premium per utilitzar aquesta característica." }, - "enterVerificationCodeApp": { - "message": "Introduïu el codi de verificació de 6 dígits de l'aplicació autenticadora." - }, "authenticationTimeout": { "message": "Temps d'espera d'autenticació" }, "authenticationSessionTimedOut": { "message": "La sessió d'autenticació s'ha esgotat. Reinicieu el procés d'inici de sessió." }, - "enterVerificationCodeEmail": { - "message": "Introduïu el codi de verificació de 6 dígits que s'ha enviat per correu electrònic a $EMAIL$.", - "placeholders": { - "email": { - "content": "$1", - "example": "example@gmail.com" - } - } - }, "verificationCodeEmailSent": { "message": "Correu electrònic de verificació enviat a $EMAIL$.", "placeholders": { @@ -1418,18 +1431,9 @@ } } }, - "rememberMe": { - "message": "Recorda'm" - }, "dontAskAgainOnThisDeviceFor30Days": { "message": "Don't ask again on this device for 30 days" }, - "sendVerificationCodeEmailAgain": { - "message": "Envia el codi de verificació altra vegada" - }, - "useAnotherTwoStepMethod": { - "message": "Utilitzeu un altre mètode d'inici de sessió en dues passes" - }, "selectAnotherMethod": { "message": "Select another method", "description": "Select another two-step login method" @@ -1437,18 +1441,9 @@ "useYourRecoveryCode": { "message": "Use your recovery code" }, - "insertYubiKey": { - "message": "Introduïu la vostra YubiKey al port USB de l'ordinador i, a continuació, premeu el seu botó." - }, "insertU2f": { "message": "Introduïu la vostra clau de seguretat al port USB de l'ordinador. Si té un botó, premeu-lo." }, - "webAuthnNewTab": { - "message": "\nPer iniciar la verificació de WebAuthn 2FA. Feu clic al botó següent per obrir una pestanya nova i seguiu les instruccions d'aquesta." - }, - "webAuthnNewTabOpen": { - "message": "Obri una pestanya nova" - }, "openInNewTab": { "message": "Open in new tab" }, @@ -2327,6 +2322,9 @@ "privacyPolicy": { "message": "Declaració de privadesa" }, + "yourNewPasswordCannotBeTheSameAsYourCurrentPassword": { + "message": "Your new password cannot be the same as your current password." + }, "hintEqualsPassword": { "message": "El vostre suggeriment de contrasenya no pot ser el mateix que la vostra contrasenya." }, @@ -2534,15 +2532,15 @@ "message": "Your organization passwords are at-risk because they are weak, reused, and/or exposed.", "description": "Description of the review at-risk login slide on the at-risk password page carousel" }, - "reviewAtRiskLoginSlideImgAlt": { - "message": "Illustration of a list of logins that are at-risk" + "reviewAtRiskLoginSlideImgAltPeriod": { + "message": "Illustration of a list of logins that are at-risk." }, "generatePasswordSlideDesc": { "message": "Quickly generate a strong, unique password with the Bitwarden autofill menu on the at-risk site.", "description": "Description of the generate password slide on the at-risk password page carousel" }, - "generatePasswordSlideImgAlt": { - "message": "Illustration of the Bitwarden autofill menu displaying a generated password" + "generatePasswordSlideImgAltPeriod": { + "message": "Illustration of the Bitwarden autofill menu displaying a generated password." }, "updateInBitwarden": { "message": "Update in Bitwarden" @@ -2551,8 +2549,8 @@ "message": "Bitwarden will then prompt you to update the password in the password manager.", "description": "Description of the update in Bitwarden slide on the at-risk password page carousel" }, - "updateInBitwardenSlideImgAlt": { - "message": "Illustration of a Bitwarden’s notification prompting the user to update the login" + "updateInBitwardenSlideImgAltPeriod": { + "message": "Illustration of a Bitwarden’s notification prompting the user to update the login." }, "turnOnAutofill": { "message": "Turn on autofill" @@ -3007,6 +3005,15 @@ } } }, + "exportingIndividualVaultWithAttachmentsDescription": { + "message": "Només s'exportaran els elements personals incloent adjunts de la caixa forta associats a $EMAIL$. Els elements de la caixa forta de l'organització no s'inclouran", + "placeholders": { + "email": { + "content": "$1", + "example": "name@example.com" + } + } + }, "exportingOrganizationVaultTitle": { "message": "S'està exportant la caixa forta de l’organització" }, @@ -3839,15 +3846,9 @@ "duoHealthCheckResultsInNullAuthUrlError": { "message": "S'ha produït un error en connectar amb el servei Duo. Utilitzeu un mètode d'inici de sessió en dos passos diferent o poseu-vos en contacte amb Duo per obtenir ajuda." }, - "launchDuoAndFollowStepsToFinishLoggingIn": { - "message": "Inicieu DUO i seguiu els passos per finalitzar la sessió." - }, "duoRequiredForAccount": { "message": "Es requereix l'inici de sessió en dos passos de DUO al vostre compte." }, - "popoutTheExtensionToCompleteLogin": { - "message": "Desplega l'extensió per completar l'inici de sessió." - }, "popoutExtension": { "message": "Extensió emergent" }, @@ -4270,6 +4271,20 @@ } } }, + "viewItemTitleWithField": { + "message": "View item - $ITEMNAME$ - $FIELD$", + "description": "Title for a link that opens a view for an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + }, + "field": { + "content": "$2", + "example": "Username" + } + } + }, "autofillTitle": { "message": "Autofill - $ITEMNAME$", "description": "Title for a button that autofills a login item.", @@ -4280,6 +4295,20 @@ } } }, + "autofillTitleWithField": { + "message": "Autofill - $ITEMNAME$ - $FIELD$", + "description": "Title for a button that autofills a login item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + }, + "field": { + "content": "$2", + "example": "Username" + } + } + }, "copyFieldValue": { "message": "Copy $FIELD$, $VALUE$", "description": "Title for a button that copies a field value to the clipboard.", @@ -4899,8 +4928,8 @@ "message": "Contrasenya regenerada", "description": "Notification message for when a password has been regenerated" }, - "saveLoginToBitwarden": { - "message": "Save login to Bitwarden?", + "saveToBitwarden": { + "message": "Save to Bitwarden", "description": "Confirmation message for saving a login to Bitwarden" }, "spaceCharacterDescriptor": { @@ -5139,5 +5168,32 @@ }, "changeAtRiskPassword": { "message": "Change at-risk password" + }, + "introCarouselLabel": { + "message": "Welcome to Bitwarden" + }, + "securityPrioritized": { + "message": "Security, prioritized" + }, + "securityPrioritizedBody": { + "message": "Save logins, cards, and identities to your secure vault. Bitwarden uses zero-knowledge, end-to-end encryption to protect what’s important to you." + }, + "quickLogin": { + "message": "Quick and easy login" + }, + "quickLoginBody": { + "message": "Set up biometric unlock and autofill to log into your accounts without typing a single letter." + }, + "secureUser": { + "message": "Level up your logins" + }, + "secureUserBody": { + "message": "Use the generator to create and save strong, unique passwords for all your accounts." + }, + "secureDevices": { + "message": "Your data, when and where you need it" + }, + "secureDevicesBody": { + "message": "Save unlimited passwords across unlimited devices with Bitwarden mobile, browser, and desktop apps." } } diff --git a/apps/browser/src/_locales/cs/messages.json b/apps/browser/src/_locales/cs/messages.json index e106d371d57..f413fe30298 100644 --- a/apps/browser/src/_locales/cs/messages.json +++ b/apps/browser/src/_locales/cs/messages.json @@ -1098,6 +1098,31 @@ "message": "Přihlašovací údaje byly aktualizovány", "description": "Message displayed when login details are successfully updated." }, + "loginUpdateTaskSuccess": { + "message": "Skvělá práce! Podnikli jste kroky, abyste $ORGANIZATION$ udělali bezpečnější.", + "placeholders": { + "organization": { + "content": "$1" + } + }, + "description": "Shown to user after login is updated." + }, + "loginUpdateTaskSuccessAdditional": { + "message": "Děkujeme, že jste udělali $ORGANIZATION$ bezpečnější. Máte $TASK_COUNT$ hesel k aktualizaci.", + "placeholders": { + "organization": { + "content": "$1" + }, + "task_count": { + "content": "$2" + } + }, + "description": "Shown to user after login is updated." + }, + "nextSecurityTaskAction": { + "message": "Změnit další heslo", + "description": "Message prompting user to undertake completion of another security task." + }, "saveFailure": { "message": "Chyba při ukládání", "description": "Error message shown when the system fails to save login details." @@ -1391,24 +1416,12 @@ "premiumRequiredDesc": { "message": "Pro použití této funkce je potřebné členství Premium." }, - "enterVerificationCodeApp": { - "message": "Zadejte 6místný kód z ověřovací aplikace." - }, "authenticationTimeout": { "message": "Časový limit ověření" }, "authenticationSessionTimedOut": { "message": "Vypršel časový limit relace ověřování. Restartujte proces přihlášení." }, - "enterVerificationCodeEmail": { - "message": "Zadejte 6místný kód z e-mailu, který byl zaslán na $EMAIL$.", - "placeholders": { - "email": { - "content": "$1", - "example": "example@gmail.com" - } - } - }, "verificationCodeEmailSent": { "message": "Ověřovací e-mail byl zaslán na $EMAIL$.", "placeholders": { @@ -1418,18 +1431,9 @@ } } }, - "rememberMe": { - "message": "Zapamatovat mě" - }, "dontAskAgainOnThisDeviceFor30Days": { "message": "Neptat se na tomto zařízení 30 dnů" }, - "sendVerificationCodeEmailAgain": { - "message": "Znovu zaslat ověřovací kód na e-mail" - }, - "useAnotherTwoStepMethod": { - "message": "Použít jinou metodu dvoufázového přihlášení" - }, "selectAnotherMethod": { "message": "Vybrat jinou metodu", "description": "Select another two-step login method" @@ -1437,18 +1441,9 @@ "useYourRecoveryCode": { "message": "Použít obnovovací kód" }, - "insertYubiKey": { - "message": "Vložte YubiKey do USB portu Vašeho počítače a stiskněte jeho tlačítko." - }, "insertU2f": { "message": "Vložte svůj bezpečnostní klíč do USB portu Vašeho počítače a pokud má tlačítko, tak jej stiskněte." }, - "webAuthnNewTab": { - "message": "Pro spuštění ověření WebAuthn 2FA: Klepnutím na tlačítko níže otevřete novou kartu a postupujte podle pokynů uvedených v nové kartě." - }, - "webAuthnNewTabOpen": { - "message": "Otevřít novou kartu" - }, "openInNewTab": { "message": "Otevřít v nové kartě" }, @@ -2327,6 +2322,9 @@ "privacyPolicy": { "message": "Zásady ochrany osobních údajů" }, + "yourNewPasswordCannotBeTheSameAsYourCurrentPassword": { + "message": "Vaše nové heslo nemůže být stejné jako Vaše současné heslo." + }, "hintEqualsPassword": { "message": "Nápověda k Vašemu heslu nemůže být stejná jako Vaše heslo." }, @@ -2534,15 +2532,15 @@ "message": "Hesla Vaší organizace jsou ohrožena, protože jsou slabá, opakovaně používaná nebo odhalená.", "description": "Description of the review at-risk login slide on the at-risk password page carousel" }, - "reviewAtRiskLoginSlideImgAlt": { - "message": "Ilustrace seznamu přihlášení, která jsou riziková" + "reviewAtRiskLoginSlideImgAltPeriod": { + "message": "Ilustrace seznamu přihlášení, která jsou riziková." }, "generatePasswordSlideDesc": { "message": "Rychle vygeneruje silné, unikátní heslo s nabídkou automatického vyplňování Bitwarden na rizikových stránkách.", "description": "Description of the generate password slide on the at-risk password page carousel" }, - "generatePasswordSlideImgAlt": { - "message": "Ilustrace nabídky automatického vyplňování Bitwarden zobrazující vygenerované heslo" + "generatePasswordSlideImgAltPeriod": { + "message": "Ilustrace nabídky automatického vyplňování Bitwarden zobrazující vygenerované heslo." }, "updateInBitwarden": { "message": "Aktualizovat v Bitwardenu" @@ -2551,8 +2549,8 @@ "message": "Bitwarden Vás poté požádá o aktualizaci hesla ve správci hesel.", "description": "Description of the update in Bitwarden slide on the at-risk password page carousel" }, - "updateInBitwardenSlideImgAlt": { - "message": "Ilustrace oznámení v Bitwardenu, která uživatele vyzývá k aktualizaci přihlášení" + "updateInBitwardenSlideImgAltPeriod": { + "message": "Ilustrace oznámení v Bitwardenu, která uživatele vyzývá k aktualizaci přihlášení." }, "turnOnAutofill": { "message": "Zapnout automatické vyplňování" @@ -3007,6 +3005,15 @@ } } }, + "exportingIndividualVaultWithAttachmentsDescription": { + "message": "Budou exportovány jen osobní položky trezoru včetně příloh spojené s účtem $EMAIL$. Nebudou zahrnuty položky trezoru v organizaci.", + "placeholders": { + "email": { + "content": "$1", + "example": "name@example.com" + } + } + }, "exportingOrganizationVaultTitle": { "message": "Exportování trezoru organizace" }, @@ -3839,15 +3846,9 @@ "duoHealthCheckResultsInNullAuthUrlError": { "message": "Chyba při připojování ke službě Duo. Použijte jinou dvoufázovou metodu přihlášení nebo kontaktujte Duo o pomoc." }, - "launchDuoAndFollowStepsToFinishLoggingIn": { - "message": "Spusťte DUO a pro dokončení přihlášení postupujte podle kroků." - }, "duoRequiredForAccount": { "message": "Pro Váš účet je vyžadováno dvoufázové přihlášení DUO." }, - "popoutTheExtensionToCompleteLogin": { - "message": "Pro dokončení přihlášení použijte vyskakovací okno rozšíření." - }, "popoutExtension": { "message": "Zobrazit okno s doplňkem" }, @@ -4270,6 +4271,20 @@ } } }, + "viewItemTitleWithField": { + "message": "Zobrazit položku - $ITEMNAME$ - $FIELD$", + "description": "Title for a link that opens a view for an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + }, + "field": { + "content": "$2", + "example": "Username" + } + } + }, "autofillTitle": { "message": "Automatické vyplnění - $ITEMNAME$", "description": "Title for a button that autofills a login item.", @@ -4280,6 +4295,20 @@ } } }, + "autofillTitleWithField": { + "message": "Automatické vyplnění - $ITEMNAME$ - $FIELD$", + "description": "Title for a button that autofills a login item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + }, + "field": { + "content": "$2", + "example": "Username" + } + } + }, "copyFieldValue": { "message": "Kopírovat $FIELD$, $VALUE$", "description": "Title for a button that copies a field value to the clipboard.", @@ -4899,8 +4928,8 @@ "message": "Heslo bylo znovu vygenerováno", "description": "Notification message for when a password has been regenerated" }, - "saveLoginToBitwarden": { - "message": "Uložit přihlášení do Bitwardenu?", + "saveToBitwarden": { + "message": "Uložit do Bitwardenu", "description": "Confirmation message for saving a login to Bitwarden" }, "spaceCharacterDescriptor": { @@ -5139,5 +5168,32 @@ }, "changeAtRiskPassword": { "message": "Změnit ohrožené heslo" + }, + "introCarouselLabel": { + "message": "Vítejte v Bitwardenu" + }, + "securityPrioritized": { + "message": "Bezpečnost, priorita" + }, + "securityPrioritizedBody": { + "message": "Uložte si přihlašovací údaje, karty a identity do zabezpečeného trezoru. Bitwarden používá šifrování end-to-end s nulovou znalostí, aby ochránil to, co je pro Vás důležité." + }, + "quickLogin": { + "message": "Rychlé a snadné přihlášení" + }, + "quickLoginBody": { + "message": "Nastavte biometrické odemknutí a automatické vyplňování pro přihlášení k Vašim účtům bez zadání jediného písmene." + }, + "secureUser": { + "message": "Zvýšit úroveň přihlašování" + }, + "secureUserBody": { + "message": "Použijte generátor k vytvoření a uložení silných, jedinečných hesel pro všechny Vaše účty." + }, + "secureDevices": { + "message": "Vaše data, kdy a kde je potřebujete" + }, + "secureDevicesBody": { + "message": "Uložte neomezená hesla na neomezených zařízeních s Bitwardenem na mobilu, prohlížeči a desktopové aplikaci." } } diff --git a/apps/browser/src/_locales/cy/messages.json b/apps/browser/src/_locales/cy/messages.json index 83d09d13273..592e0e38e73 100644 --- a/apps/browser/src/_locales/cy/messages.json +++ b/apps/browser/src/_locales/cy/messages.json @@ -56,13 +56,13 @@ "message": "Prif gyfrinair" }, "masterPassDesc": { - "message": "The master password is the password you use to access your vault. It is very important that you do not forget your master password. There is no way to recover the password in the event that you forget it." + "message": "Y prif gyfrinair yw'r cyfrinair ddefnyddiwch chi i gael mynediad i'ch cell. Mae'n bwysig iawn nad ydych chi'n anghofio eich prif gyfrinair. Does dim modd adfer y cyfrinair pe baech yn ei anghofio." }, "masterPassHintDesc": { - "message": "A master password hint can help you remember your password if you forget it." + "message": "Gall awgrym o'ch prif gyfrinair eich helpu i'w gofio os ydych chi'n ei anghofio." }, "masterPassHintText": { - "message": "If you forget your password, the password hint can be sent to your email. $CURRENT$/$MAXIMUM$ character maximum.", + "message": "Os anghofiwch chi eich cyfrinair, gallwch anfon awgrym i'ch cyfeiriad ebost. $CURRENT$/$MAXIMUM$ nod.", "placeholders": { "current": { "content": "$1", @@ -380,7 +380,7 @@ "message": "Golygu ffolder" }, "editFolderWithName": { - "message": "Edit folder: $FOLDERNAME$", + "message": "Golygu ffolder: $FOLDERNAME$", "placeholders": { "foldername": { "content": "$1", @@ -392,10 +392,10 @@ "message": "Ffolder newydd" }, "folderName": { - "message": "Folder name" + "message": "Enw'r ffolder" }, "folderHintText": { - "message": "Nest a folder by adding the parent folder's name followed by a “/”. Example: Social/Forums" + "message": "Gallwch nythu ffolder drwy ychwanegu enw ffolder arall wedi'i olynu gan \"/\". Enghraifft: Cymdeithasol/Fforymau" }, "noFoldersAdded": { "message": "No folders added" @@ -459,19 +459,19 @@ "message": "Cynhyrchu cyfrinair" }, "generatePassphrase": { - "message": "Generate passphrase" + "message": "Cynhyrchu cyfrinymadrodd" }, "passwordGenerated": { - "message": "Password generated" + "message": "Cyfrinair wedi'i gynhyrchu" }, "passphraseGenerated": { - "message": "Passphrase generated" + "message": "Cyfrinymadrodd wedi'i gynhyrchu" }, "usernameGenerated": { - "message": "Username generated" + "message": "Enw defnyddiwr wedi'i gynhyrchu" }, "emailGenerated": { - "message": "Email generated" + "message": "Cyfeiriad ebost wedi'i gynhyrchu" }, "regeneratePassword": { "message": "Ailgynhyrchu cyfrinair" @@ -483,11 +483,11 @@ "message": "Hyd" }, "include": { - "message": "Include", + "message": "Cynnwys", "description": "Card header for password generator include block" }, "uppercaseDescription": { - "message": "Include uppercase characters", + "message": "Cynnwys priflythrennau", "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": "Cynnwys llythrennau bach", "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": "Cynnwys rhifau", "description": "Full description for the password generator numbers checkbox" }, "numbersLabel": { @@ -893,7 +893,7 @@ "message": "Please restart registration or try logging in." }, "youMayAlreadyHaveAnAccount": { - "message": "You may already have an account" + "message": "Mae'n bosib fod gennych gyfrif eisoes" }, "logOutConfirmation": { "message": "Ydych chi'n siŵr eich bod am allgofnodi?" @@ -905,10 +905,10 @@ "message": "Na" }, "location": { - "message": "Location" + "message": "Lleoliad" }, "unexpectedError": { - "message": "An unexpected error has occurred." + "message": "Digwyddodd gwall annisgwyl." }, "nameRequired": { "message": "Mae angen enw." @@ -1007,10 +1007,10 @@ "description": "This is the folder for uncategorized items" }, "enableAddLoginNotification": { - "message": "Ask to add login" + "message": "Gofyn i ychwanegu manylion mewngofnodi" }, "vaultSaveOptionsTitle": { - "message": "Save to vault options" + "message": "Dewisiadau cadw i'r gell" }, "addLoginNotificationDesc": { "message": "Ask to add an item if one isn't found in your vault." @@ -1098,6 +1098,31 @@ "message": "Login updated", "description": "Message displayed when login details are successfully updated." }, + "loginUpdateTaskSuccess": { + "message": "Great job! You took the steps to make you and $ORGANIZATION$ more secure.", + "placeholders": { + "organization": { + "content": "$1" + } + }, + "description": "Shown to user after login is updated." + }, + "loginUpdateTaskSuccessAdditional": { + "message": "Thank you for making $ORGANIZATION$ more secure. You have $TASK_COUNT$ more passwords to update.", + "placeholders": { + "organization": { + "content": "$1" + }, + "task_count": { + "content": "$2" + } + }, + "description": "Shown to user after login is updated." + }, + "nextSecurityTaskAction": { + "message": "Change next password", + "description": "Message prompting user to undertake completion of another security task." + }, "saveFailure": { "message": "Error saving", "description": "Error message shown when the system fails to save login details." @@ -1107,7 +1132,7 @@ "description": "Detailed error message shown when saving login details fails." }, "enableChangedPasswordNotification": { - "message": "Ask to update existing login" + "message": "Gofyn i ddiweddaru manylion mewngofnodi sy'n bodoli eisoes" }, "changedPasswordNotificationDesc": { "message": "Ask to update a login's password when a change is detected on a website." @@ -1207,7 +1232,7 @@ "description": "WARNING (should stay in capitalized letters if the language permits)" }, "warningCapitalized": { - "message": "Warning", + "message": "Rhybudd", "description": "Warning (should maintain locale-relevant capitalization)" }, "confirmVaultExport": { @@ -1391,24 +1416,12 @@ "premiumRequiredDesc": { "message": "Mae angen aelodaeth uwch i ddefnyddio'r nodwedd hon." }, - "enterVerificationCodeApp": { - "message": "Enter the 6 digit verification code from your authenticator app." - }, "authenticationTimeout": { "message": "Authentication timeout" }, "authenticationSessionTimedOut": { "message": "The authentication session timed out. Please restart the login process." }, - "enterVerificationCodeEmail": { - "message": "Enter the 6 digit verification code that was emailed to $EMAIL$.", - "placeholders": { - "email": { - "content": "$1", - "example": "example@gmail.com" - } - } - }, "verificationCodeEmailSent": { "message": "Anfonwyd ebost dilysu i $EMAIL$.", "placeholders": { @@ -1418,18 +1431,9 @@ } } }, - "rememberMe": { - "message": "Fy nghofio i" - }, "dontAskAgainOnThisDeviceFor30Days": { "message": "Don't ask again on this device for 30 days" }, - "sendVerificationCodeEmailAgain": { - "message": "Anfon ebost â chod dilysu eto" - }, - "useAnotherTwoStepMethod": { - "message": "Use another two-step login method" - }, "selectAnotherMethod": { "message": "Select another method", "description": "Select another two-step login method" @@ -1437,18 +1441,9 @@ "useYourRecoveryCode": { "message": "Use your recovery code" }, - "insertYubiKey": { - "message": "Rhowch eich YubiKey i mewn i borth USB eich cyfrifiadur, yna gwasgwch y botwm." - }, "insertU2f": { "message": "Insert your security key into your computer's USB port. If it has a button, touch it." }, - "webAuthnNewTab": { - "message": "To start the WebAuthn 2FA verification. Click the button below to open a new tab and follow the instructions provided in the new tab." - }, - "webAuthnNewTabOpen": { - "message": "Agor tab newydd" - }, "openInNewTab": { "message": "Agor mewn tab newydd" }, @@ -1674,7 +1669,7 @@ "message": "Testun" }, "cfTypeHidden": { - "message": "Hidden" + "message": "Cudd" }, "cfTypeBoolean": { "message": "Gwerth Boole" @@ -1877,7 +1872,7 @@ } }, "editItemHeader": { - "message": "Edit $TYPE$", + "message": "Golygu $TYPE$", "placeholders": { "type": { "content": "$1", @@ -1886,7 +1881,7 @@ } }, "viewItemHeader": { - "message": "View $TYPE$", + "message": "Gweld $TYPE$", "placeholders": { "type": { "content": "$1", @@ -1898,10 +1893,10 @@ "message": "Hanes cyfrineiriau" }, "generatorHistory": { - "message": "Generator history" + "message": "Hanes y cynhyrchydd" }, "clearGeneratorHistoryTitle": { - "message": "Clear generator history" + "message": "Clirio hanes y cynhyrchydd" }, "cleargGeneratorHistoryDescription": { "message": "If you continue, all entries will be permanently deleted from generator's history. Are you sure you want to continue?" @@ -1913,7 +1908,7 @@ "message": "Casgliadau" }, "nCollections": { - "message": "$COUNT$ collections", + "message": "$COUNT$ o gasgliadau", "placeholders": { "count": { "content": "$1", @@ -1969,11 +1964,11 @@ "description": "Domain name. Ex. website.com" }, "baseDomainOptionRecommended": { - "message": "Base domain (recommended)", + "message": "Parth sylfaen (awgrymir)", "description": "Domain name. Ex. website.com" }, "domainName": { - "message": "Domain name", + "message": "Enw parth", "description": "Domain name. Ex. website.com" }, "host": { @@ -2023,13 +2018,13 @@ "message": "Does dim cyfrineiriau i'w rhestru." }, "clearHistory": { - "message": "Clear history" + "message": "Clirio'r hanes" }, "nothingToShow": { - "message": "Nothing to show" + "message": "Dim byd i'w ddangos" }, "nothingGeneratedRecently": { - "message": "You haven't generated anything recently" + "message": "Dydych chi heb gynhyrchu unrhyw beth yn ddiweddar" }, "remove": { "message": "Tynnu" @@ -2056,7 +2051,7 @@ "message": "You do not belong to any organizations. Organizations allow you to securely share items with other users." }, "noCollectionsInList": { - "message": "There are no collections to list." + "message": "Does dim casgliadau i'w rhestru." }, "ownership": { "message": "Perchnogaeth" @@ -2090,10 +2085,10 @@ "message": "Datgloi â PIN" }, "setYourPinTitle": { - "message": "Set PIN" + "message": "Gosod PIN" }, "setYourPinButton": { - "message": "Set PIN" + "message": "Gosod PIN" }, "setYourPinCode": { "message": "Set your PIN code for unlocking Bitwarden. Your PIN settings will be reset if you ever fully log out of the application." @@ -2114,7 +2109,7 @@ "message": "Datgloi â biometreg" }, "unlockWithMasterPassword": { - "message": "Unlock with master password" + "message": "Datgloi gyda'r prif gyfrinair" }, "awaitDesktop": { "message": "Awaiting confirmation from desktop" @@ -2126,7 +2121,7 @@ "message": "Lock with master password on browser restart" }, "lockWithMasterPassOnRestart1": { - "message": "Require master password on browser restart" + "message": "Gofyn am y prif gyfrinair wrth ailgychwyn y porwr" }, "selectOneCollection": { "message": "You must select at least one collection." @@ -2156,11 +2151,11 @@ "message": "Secure password generated! Don't forget to also update your password on the website." }, "useGeneratorHelpTextPartOne": { - "message": "Use the generator", + "message": "Defnyddiwch y cynhyrchydd", "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": "i greu cyfrinair cryf ac unigryw", "description": "This will be used as part of a larger sentence, broken up to include the generator icon. The full sentence will read 'Use the generator [GENERATOR_ICON] to create a strong unique password'" }, "vaultCustomization": { @@ -2250,13 +2245,13 @@ "message": "Gosod prif gyfrinair" }, "currentMasterPass": { - "message": "Current master password" + "message": "Prif gyfrinair presennol" }, "newMasterPass": { "message": "Prif gyfrinair newydd" }, "confirmNewMasterPass": { - "message": "Confirm new master password" + "message": "Cadarnhau'r prif gyfrinair newydd" }, "masterPasswordPolicyInEffect": { "message": "One or more organization policies require your master password to meet the following requirements:" @@ -2327,11 +2322,14 @@ "privacyPolicy": { "message": "Polisi preifatrwydd" }, + "yourNewPasswordCannotBeTheSameAsYourCurrentPassword": { + "message": "Your new password cannot be the same as your current password." + }, "hintEqualsPassword": { "message": "Your password hint cannot be the same as your password." }, "ok": { - "message": "Ok" + "message": "Iawn" }, "errorRefreshingAccessToken": { "message": "Access Token Refresh Error" @@ -2473,7 +2471,7 @@ } }, "atRiskPasswords": { - "message": "At-risk passwords" + "message": "Cyfrineiriau mewn perygl" }, "atRiskPasswordDescSingleOrg": { "message": "$ORGANIZATION$ is requesting you change one password because it is at-risk.", @@ -2534,15 +2532,15 @@ "message": "Your organization passwords are at-risk because they are weak, reused, and/or exposed.", "description": "Description of the review at-risk login slide on the at-risk password page carousel" }, - "reviewAtRiskLoginSlideImgAlt": { - "message": "Illustration of a list of logins that are at-risk" + "reviewAtRiskLoginSlideImgAltPeriod": { + "message": "Illustration of a list of logins that are at-risk." }, "generatePasswordSlideDesc": { "message": "Quickly generate a strong, unique password with the Bitwarden autofill menu on the at-risk site.", "description": "Description of the generate password slide on the at-risk password page carousel" }, - "generatePasswordSlideImgAlt": { - "message": "Illustration of the Bitwarden autofill menu displaying a generated password" + "generatePasswordSlideImgAltPeriod": { + "message": "Illustration of the Bitwarden autofill menu displaying a generated password." }, "updateInBitwarden": { "message": "Update in Bitwarden" @@ -2551,8 +2549,8 @@ "message": "Bitwarden will then prompt you to update the password in the password manager.", "description": "Description of the update in Bitwarden slide on the at-risk password page carousel" }, - "updateInBitwardenSlideImgAlt": { - "message": "Illustration of a Bitwarden’s notification prompting the user to update the login" + "updateInBitwardenSlideImgAltPeriod": { + "message": "Illustration of a Bitwarden’s notification prompting the user to update the login." }, "turnOnAutofill": { "message": "Turn on autofill" @@ -2561,7 +2559,7 @@ "message": "Turned on autofill" }, "dismiss": { - "message": "Dismiss" + "message": "Diystyru" }, "websiteItemLabel": { "message": "Website $number$ (URI)", @@ -2662,7 +2660,7 @@ "message": "Disabled" }, "removePasswordConfirmation": { - "message": "Are you sure you want to remove the password?" + "message": "Ydych chi'n sicr yr hoffech chi dynnu'r cyfrinair?" }, "deleteSend": { "message": "Delete Send", @@ -3007,6 +3005,15 @@ } } }, + "exportingIndividualVaultWithAttachmentsDescription": { + "message": "Only the individual vault items including attachments associated with $EMAIL$ will be exported. Organization vault items will not be included", + "placeholders": { + "email": { + "content": "$1", + "example": "name@example.com" + } + } + }, "exportingOrganizationVaultTitle": { "message": "Exporting organization vault" }, @@ -3040,10 +3047,10 @@ "message": "Cynhyrchu enw defnyddiwr" }, "generateEmail": { - "message": "Generate email" + "message": "Cynhyrchu ebost" }, "spinboxBoundariesHint": { - "message": "Value must be between $MIN$ and $MAX$.", + "message": "Rhaid iddo fod rhwng $MIN$ a $MAX$ nod.", "description": "Explains spin box minimum and maximum values to the user", "placeholders": { "min": { @@ -3057,7 +3064,7 @@ } }, "passwordLengthRecommendationHint": { - "message": " Use $RECOMMENDED$ characters or more to generate a strong password.", + "message": " Defnyddiwch $RECOMMENDED$ neu fwy o nodau i gynhyrchu cyfrinair cryf.", "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": { @@ -3067,7 +3074,7 @@ } }, "passphraseNumWordsRecommendationHint": { - "message": " Use $RECOMMENDED$ words or more to generate a strong passphrase.", + "message": " Defnyddiwch $RECOMMENDED$ neu fwy o eiriau i gynhyrchu cyfrinymadrodd cryff.", "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": { @@ -3130,7 +3137,7 @@ } }, "forwarderGeneratedBy": { - "message": "Generated by Bitwarden.", + "message": "Cynhyrchwyd gan Bitwarden.", "description": "Displayed with the address on the forwarding service's configuration screen." }, "forwarderGeneratedByWithWebsite": { @@ -3144,7 +3151,7 @@ } }, "forwaderInvalidToken": { - "message": "Invalid $SERVICENAME$ API token", + "message": "Tocyn API $SERVICENAME$ annilys", "description": "Displayed when the user's API token is empty or rejected by the forwarding service.", "placeholders": { "servicename": { @@ -3154,7 +3161,7 @@ } }, "forwaderInvalidTokenWithMessage": { - "message": "Invalid $SERVICENAME$ API token: $ERRORMESSAGE$", + "message": "Tocyn API $SERVICENAME$ annilys: $ERRORMESSAGE$", "description": "Displayed when the user's API token is rejected by the forwarding service with an error message.", "placeholders": { "servicename": { @@ -3411,7 +3418,7 @@ "message": "Change shortcut" }, "autofillKeyboardManagerShortcutsLabel": { - "message": "Manage shortcuts" + "message": "Rheoli llwybrau byr" }, "autofillShortcut": { "message": "Autofill keyboard shortcut" @@ -3474,10 +3481,10 @@ "message": "Check your email" }, "followTheLinkInTheEmailSentTo": { - "message": "Follow the link in the email sent to" + "message": "Dilynwch y ddolen yn yr ebost anfonwyd i" }, "andContinueCreatingYourAccount": { - "message": "and continue creating your account." + "message": "a pharhau i greu eich cyfrif." }, "noEmail": { "message": "Dim ebost?" @@ -3537,7 +3544,7 @@ "message": "Input is required." }, "required": { - "message": "required" + "message": "gofynnol" }, "search": { "message": "Chwilio" @@ -3789,7 +3796,7 @@ } }, "tryAgain": { - "message": "Try again" + "message": "Ceisio eto" }, "verificationRequiredForActionSetPinToContinue": { "message": "Verification required for this action. Set a PIN to continue." @@ -3822,7 +3829,7 @@ "message": "Enter the verification code that was sent to your email." }, "resendCode": { - "message": "Resend code" + "message": "Ailanfon cod" }, "total": { "message": "Cyfanswm" @@ -3839,15 +3846,9 @@ "duoHealthCheckResultsInNullAuthUrlError": { "message": "Error connecting with the Duo service. Use a different two-step login method or contact Duo for assistance." }, - "launchDuoAndFollowStepsToFinishLoggingIn": { - "message": "Launch Duo and follow the steps to finish logging in." - }, "duoRequiredForAccount": { "message": "Duo two-step login is required for your account." }, - "popoutTheExtensionToCompleteLogin": { - "message": "Popout the extension to complete login." - }, "popoutExtension": { "message": "Popout extension" }, @@ -4004,13 +4005,13 @@ "message": "Enw defnyddiwr neu gyfrinair anghywir" }, "incorrectPassword": { - "message": "Incorrect password" + "message": "Cyfrinair anghywir" }, "incorrectCode": { - "message": "Incorrect code" + "message": "Cod anghywir" }, "incorrectPin": { - "message": "Incorrect PIN" + "message": "PIN anghywir" }, "multifactorAuthenticationFailed": { "message": "Multifactor authentication failed" @@ -4270,6 +4271,20 @@ } } }, + "viewItemTitleWithField": { + "message": "View item - $ITEMNAME$ - $FIELD$", + "description": "Title for a link that opens a view for an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + }, + "field": { + "content": "$2", + "example": "Username" + } + } + }, "autofillTitle": { "message": "Autofill - $ITEMNAME$", "description": "Title for a button that autofills a login item.", @@ -4280,6 +4295,20 @@ } } }, + "autofillTitleWithField": { + "message": "Autofill - $ITEMNAME$ - $FIELD$", + "description": "Title for a button that autofills a login item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + }, + "field": { + "content": "$2", + "example": "Username" + } + } + }, "copyFieldValue": { "message": "Copy $FIELD$, $VALUE$", "description": "Title for a button that copies a field value to the clipboard.", @@ -4328,7 +4357,7 @@ "message": "Error assigning target folder." }, "viewItemsIn": { - "message": "View items in $NAME$", + "message": "Gweld eitemau yn $NAME$", "description": "Button to view the contents of a folder or collection", "placeholders": { "name": { @@ -4338,7 +4367,7 @@ } }, "backTo": { - "message": "Back to $NAME$", + "message": "Yn ôl i $NAME$", "description": "Navigate back to a previous folder or collection", "placeholders": { "name": { @@ -4351,7 +4380,7 @@ "message": "Newydd" }, "removeItem": { - "message": "Remove $NAME$", + "message": "Tynnu $NAME$", "description": "Remove a selected option, such as a folder or collection", "placeholders": { "name": { @@ -4899,8 +4928,8 @@ "message": "Password regenerated", "description": "Notification message for when a password has been regenerated" }, - "saveLoginToBitwarden": { - "message": "Save login to Bitwarden?", + "saveToBitwarden": { + "message": "Save to Bitwarden", "description": "Confirmation message for saving a login to Bitwarden" }, "spaceCharacterDescriptor": { @@ -5045,7 +5074,7 @@ "message": "Generated password" }, "compactMode": { - "message": "Compact mode" + "message": "Modd cryno" }, "beta": { "message": "Beta" @@ -5139,5 +5168,32 @@ }, "changeAtRiskPassword": { "message": "Change at-risk password" + }, + "introCarouselLabel": { + "message": "Welcome to Bitwarden" + }, + "securityPrioritized": { + "message": "Security, prioritized" + }, + "securityPrioritizedBody": { + "message": "Save logins, cards, and identities to your secure vault. Bitwarden uses zero-knowledge, end-to-end encryption to protect what’s important to you." + }, + "quickLogin": { + "message": "Quick and easy login" + }, + "quickLoginBody": { + "message": "Set up biometric unlock and autofill to log into your accounts without typing a single letter." + }, + "secureUser": { + "message": "Level up your logins" + }, + "secureUserBody": { + "message": "Use the generator to create and save strong, unique passwords for all your accounts." + }, + "secureDevices": { + "message": "Your data, when and where you need it" + }, + "secureDevicesBody": { + "message": "Save unlimited passwords across unlimited devices with Bitwarden mobile, browser, and desktop apps." } } diff --git a/apps/browser/src/_locales/da/messages.json b/apps/browser/src/_locales/da/messages.json index 69c8b28d29a..43cae7d9c50 100644 --- a/apps/browser/src/_locales/da/messages.json +++ b/apps/browser/src/_locales/da/messages.json @@ -1098,6 +1098,31 @@ "message": "Login updated", "description": "Message displayed when login details are successfully updated." }, + "loginUpdateTaskSuccess": { + "message": "Great job! You took the steps to make you and $ORGANIZATION$ more secure.", + "placeholders": { + "organization": { + "content": "$1" + } + }, + "description": "Shown to user after login is updated." + }, + "loginUpdateTaskSuccessAdditional": { + "message": "Thank you for making $ORGANIZATION$ more secure. You have $TASK_COUNT$ more passwords to update.", + "placeholders": { + "organization": { + "content": "$1" + }, + "task_count": { + "content": "$2" + } + }, + "description": "Shown to user after login is updated." + }, + "nextSecurityTaskAction": { + "message": "Change next password", + "description": "Message prompting user to undertake completion of another security task." + }, "saveFailure": { "message": "Error saving", "description": "Error message shown when the system fails to save login details." @@ -1391,24 +1416,12 @@ "premiumRequiredDesc": { "message": "Premium-medlemskab kræves for at anvende denne funktion." }, - "enterVerificationCodeApp": { - "message": "Indtast den 6-cifrede verifikationskode fra din autentificerings-app." - }, "authenticationTimeout": { "message": "Godkendelsestimeout" }, "authenticationSessionTimedOut": { "message": "Godkendelsessessionen fik timeout. Genstart loginprocessen." }, - "enterVerificationCodeEmail": { - "message": "Indtast den 6-cifrede verifikationskode, der blev sendt til $EMAIL$.", - "placeholders": { - "email": { - "content": "$1", - "example": "example@gmail.com" - } - } - }, "verificationCodeEmailSent": { "message": "Bekræftelsesmail sendt til $EMAIL$.", "placeholders": { @@ -1418,18 +1431,9 @@ } } }, - "rememberMe": { - "message": "Husk mig" - }, "dontAskAgainOnThisDeviceFor30Days": { "message": "Don't ask again on this device for 30 days" }, - "sendVerificationCodeEmailAgain": { - "message": "Send verifikationskode-email igen" - }, - "useAnotherTwoStepMethod": { - "message": "Brug en anden to-trins login metode" - }, "selectAnotherMethod": { "message": "Select another method", "description": "Select another two-step login method" @@ -1437,18 +1441,9 @@ "useYourRecoveryCode": { "message": "Use your recovery code" }, - "insertYubiKey": { - "message": "Indsæt din YubiKey i din computers USB-port, og tryk derefter på dens knap." - }, "insertU2f": { "message": "Indsæt din sikkerhedsnøgle i din computers USB-port. Hvis den har en knap, tryk på den." }, - "webAuthnNewTab": { - "message": "For at starte WebAuthn 2FA-verifikationen. Klik på knappen nedenfor for at åbne en ny fane og følg instruktionerne i den nye fane." - }, - "webAuthnNewTabOpen": { - "message": "Åbn ny fane" - }, "openInNewTab": { "message": "Open in new tab" }, @@ -2327,6 +2322,9 @@ "privacyPolicy": { "message": "Fortrolighedspolitik" }, + "yourNewPasswordCannotBeTheSameAsYourCurrentPassword": { + "message": "Your new password cannot be the same as your current password." + }, "hintEqualsPassword": { "message": "Dit adgangskodetip kan ikke være det samme som din adgangskode." }, @@ -2534,15 +2532,15 @@ "message": "Your organization passwords are at-risk because they are weak, reused, and/or exposed.", "description": "Description of the review at-risk login slide on the at-risk password page carousel" }, - "reviewAtRiskLoginSlideImgAlt": { - "message": "Illustration of a list of logins that are at-risk" + "reviewAtRiskLoginSlideImgAltPeriod": { + "message": "Illustration of a list of logins that are at-risk." }, "generatePasswordSlideDesc": { "message": "Quickly generate a strong, unique password with the Bitwarden autofill menu on the at-risk site.", "description": "Description of the generate password slide on the at-risk password page carousel" }, - "generatePasswordSlideImgAlt": { - "message": "Illustration of the Bitwarden autofill menu displaying a generated password" + "generatePasswordSlideImgAltPeriod": { + "message": "Illustration of the Bitwarden autofill menu displaying a generated password." }, "updateInBitwarden": { "message": "Update in Bitwarden" @@ -2551,8 +2549,8 @@ "message": "Bitwarden will then prompt you to update the password in the password manager.", "description": "Description of the update in Bitwarden slide on the at-risk password page carousel" }, - "updateInBitwardenSlideImgAlt": { - "message": "Illustration of a Bitwarden’s notification prompting the user to update the login" + "updateInBitwardenSlideImgAltPeriod": { + "message": "Illustration of a Bitwarden’s notification prompting the user to update the login." }, "turnOnAutofill": { "message": "Turn on autofill" @@ -3007,6 +3005,15 @@ } } }, + "exportingIndividualVaultWithAttachmentsDescription": { + "message": "Only the individual vault items including attachments associated with $EMAIL$ will be exported. Organization vault items will not be included", + "placeholders": { + "email": { + "content": "$1", + "example": "name@example.com" + } + } + }, "exportingOrganizationVaultTitle": { "message": "Eksport af organisationsboks" }, @@ -3839,15 +3846,9 @@ "duoHealthCheckResultsInNullAuthUrlError": { "message": "Fejl under forbindelsesoprettelsen til Duo-tjenesten. Brug en anden totrins-indlogningsmetode eller kontakt Duo for hjælp." }, - "launchDuoAndFollowStepsToFinishLoggingIn": { - "message": "Start Duo og følg trinnene for at fuldføre indlogningen." - }, "duoRequiredForAccount": { "message": "Duo-totrinsindlogning kræves for kontoen." }, - "popoutTheExtensionToCompleteLogin": { - "message": "Pop udvidelsen ud for at fuldføre indlogning." - }, "popoutExtension": { "message": "Pop ud-udvidelse" }, @@ -4270,6 +4271,20 @@ } } }, + "viewItemTitleWithField": { + "message": "View item - $ITEMNAME$ - $FIELD$", + "description": "Title for a link that opens a view for an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + }, + "field": { + "content": "$2", + "example": "Username" + } + } + }, "autofillTitle": { "message": "Autoudfyld - $ITEMNAME$", "description": "Title for a button that autofills a login item.", @@ -4280,6 +4295,20 @@ } } }, + "autofillTitleWithField": { + "message": "Autofill - $ITEMNAME$ - $FIELD$", + "description": "Title for a button that autofills a login item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + }, + "field": { + "content": "$2", + "example": "Username" + } + } + }, "copyFieldValue": { "message": "Copy $FIELD$, $VALUE$", "description": "Title for a button that copies a field value to the clipboard.", @@ -4899,8 +4928,8 @@ "message": "Adgangskode genereret igen", "description": "Notification message for when a password has been regenerated" }, - "saveLoginToBitwarden": { - "message": "Gem login til Bitwarden?", + "saveToBitwarden": { + "message": "Save to Bitwarden", "description": "Confirmation message for saving a login to Bitwarden" }, "spaceCharacterDescriptor": { @@ -5139,5 +5168,32 @@ }, "changeAtRiskPassword": { "message": "Change at-risk password" + }, + "introCarouselLabel": { + "message": "Welcome to Bitwarden" + }, + "securityPrioritized": { + "message": "Security, prioritized" + }, + "securityPrioritizedBody": { + "message": "Save logins, cards, and identities to your secure vault. Bitwarden uses zero-knowledge, end-to-end encryption to protect what’s important to you." + }, + "quickLogin": { + "message": "Quick and easy login" + }, + "quickLoginBody": { + "message": "Set up biometric unlock and autofill to log into your accounts without typing a single letter." + }, + "secureUser": { + "message": "Level up your logins" + }, + "secureUserBody": { + "message": "Use the generator to create and save strong, unique passwords for all your accounts." + }, + "secureDevices": { + "message": "Your data, when and where you need it" + }, + "secureDevicesBody": { + "message": "Save unlimited passwords across unlimited devices with Bitwarden mobile, browser, and desktop apps." } } diff --git a/apps/browser/src/_locales/de/messages.json b/apps/browser/src/_locales/de/messages.json index a7439db6432..dad00bce98d 100644 --- a/apps/browser/src/_locales/de/messages.json +++ b/apps/browser/src/_locales/de/messages.json @@ -1098,6 +1098,31 @@ "message": "Zugangsdaten aktualisiert", "description": "Message displayed when login details are successfully updated." }, + "loginUpdateTaskSuccess": { + "message": "Gut gemacht! Du hast die Schritte unternommen, um dich und $ORGANIZATION$ sicherer zu machen.", + "placeholders": { + "organization": { + "content": "$1" + } + }, + "description": "Shown to user after login is updated." + }, + "loginUpdateTaskSuccessAdditional": { + "message": "Vielen Dank, dass du $ORGANIZATION$ sicherer gemacht hast. Du hast $TASK_COUNT$ weitere Passwörter zum Aktualisieren.", + "placeholders": { + "organization": { + "content": "$1" + }, + "task_count": { + "content": "$2" + } + }, + "description": "Shown to user after login is updated." + }, + "nextSecurityTaskAction": { + "message": "Nächstes Passwort ändern", + "description": "Message prompting user to undertake completion of another security task." + }, "saveFailure": { "message": "Fehler beim Speichern", "description": "Error message shown when the system fails to save login details." @@ -1150,7 +1175,7 @@ "description": "Default URI match detection for autofill." }, "defaultUriMatchDetectionDesc": { - "message": "Wähle die Standardmethode, mit der die URI-Match-Erkennung für Anmeldungen bei Aktionen wie dem automatischen Ausfüllen behandelt wird." + "message": "Wähle die Standardmethode, mit der die URI-Übereinstimmungserkennung für Anmeldungen bei Aktionen wie dem automatischen Ausfüllen behandelt wird." }, "theme": { "message": "Design" @@ -1391,24 +1416,12 @@ "premiumRequiredDesc": { "message": "Eine Premium-Mitgliedschaft ist für diese Funktion notwendig." }, - "enterVerificationCodeApp": { - "message": "Gib den 6-stelligen Verifizierungscode aus deiner Authenticator App ein." - }, "authenticationTimeout": { "message": "Authentifizierungs-Timeout" }, "authenticationSessionTimedOut": { "message": "Die Authentifizierungssitzung ist abgelaufen. Bitte starte den Anmeldeprozess neu." }, - "enterVerificationCodeEmail": { - "message": "Gib den 6-stelligen Bestätigungscode ein, der an $EMAIL$ gesendet wurde.", - "placeholders": { - "email": { - "content": "$1", - "example": "example@gmail.com" - } - } - }, "verificationCodeEmailSent": { "message": "Verifizierungsmail wurde an $EMAIL$ gesendet.", "placeholders": { @@ -1418,18 +1431,9 @@ } } }, - "rememberMe": { - "message": "Angemeldet bleiben" - }, "dontAskAgainOnThisDeviceFor30Days": { "message": "Für 30 Tage auf diesem Gerät nicht mehr fragen" }, - "sendVerificationCodeEmailAgain": { - "message": "E-Mail mit Bestätigungscode erneut versenden" - }, - "useAnotherTwoStepMethod": { - "message": "Verwende eine andere zweistufige Login-Methode" - }, "selectAnotherMethod": { "message": "Wähle eine andere Methode", "description": "Select another two-step login method" @@ -1437,18 +1441,9 @@ "useYourRecoveryCode": { "message": "Verwende deinen Wiederherstellungscode" }, - "insertYubiKey": { - "message": "Stecke deinen YubiKey in den USB-Port Ihres Computers, dann berühre den Button." - }, "insertU2f": { "message": "Stecke deinen Sicherheitsschlüssel in den USB-Port deines Computers. Falls ein Knopf vorhanden ist, berühre diesen." }, - "webAuthnNewTab": { - "message": "Um die WebAuthn 2FA Verifizierung zu starten, klicke auf die Schaltfläche unten, um einen neuen Tab zu öffnen und folge den Anweisungen, die im neuen Tab angezeigt werden." - }, - "webAuthnNewTabOpen": { - "message": "Neuen Tab öffnen" - }, "openInNewTab": { "message": "In neuem Tab öffnen" }, @@ -1614,7 +1609,7 @@ "message": "Erfahre mehr über Auto-Ausfüllen" }, "defaultAutoFillOnPageLoad": { - "message": "Standard Auto-Ausfüllen Einstellung für Login-Einträge" + "message": "Standard Auto-Ausfüllen Einstellung für Zugangsdaten-Einträge" }, "defaultAutoFillOnPageLoadDesc": { "message": "Du kannst Auto-Ausfüllen beim Laden der Seite für einzelne Zugangsdaten-Einträge in der Bearbeiten-Ansicht des Eintrags deaktivieren." @@ -1995,7 +1990,7 @@ "description": "URI match detection for autofill." }, "defaultMatchDetection": { - "message": "Standard-Match-Erkennung", + "message": "Standard Übereinstimmungserkennung", "description": "Default URI match detection for autofill." }, "toggleOptions": { @@ -2327,6 +2322,9 @@ "privacyPolicy": { "message": "Datenschutzbestimmungen" }, + "yourNewPasswordCannotBeTheSameAsYourCurrentPassword": { + "message": "Dein neues Passwort darf nicht dasselbe sein wie dein aktuelles Passwort." + }, "hintEqualsPassword": { "message": "Dein Passwort-Hinweis darf nicht identisch mit deinem Passwort sein." }, @@ -2534,15 +2532,15 @@ "message": "Die Passwörter deiner Organisationen sind gefährdet, weil sie schwach, wiederverwendet und/oder kompromittiert sind.", "description": "Description of the review at-risk login slide on the at-risk password page carousel" }, - "reviewAtRiskLoginSlideImgAlt": { - "message": "Illustration einer Liste gefährdeter Zugangsdaten" + "reviewAtRiskLoginSlideImgAltPeriod": { + "message": "Illustration einer Liste gefährdeter Zugangsdaten." }, "generatePasswordSlideDesc": { "message": "Generiere schnell ein starkes, einzigartiges Passwort mit dem Bitwarden Auto-Ausfüllen-Menü auf der gefährdeten Website.", "description": "Description of the generate password slide on the at-risk password page carousel" }, - "generatePasswordSlideImgAlt": { - "message": "Illustration des Bitwarden Auto-Ausfüllen-Menüs, das ein generiertes Passwort anzeigt" + "generatePasswordSlideImgAltPeriod": { + "message": "Illustration des Bitwarden Auto-Ausfüllen-Menüs, das ein generiertes Passwort anzeigt." }, "updateInBitwarden": { "message": "In Bitwarden aktualisieren" @@ -2551,8 +2549,8 @@ "message": "Bitwarden wird dich dann auffordern, das Passwort im Passwort-Manager zu aktualisieren.", "description": "Description of the update in Bitwarden slide on the at-risk password page carousel" }, - "updateInBitwardenSlideImgAlt": { - "message": "Illustration einer Bitwarden-Benachrichtigung, die den Benutzer dazu auffordert, die Zugangsdaten zu aktualisieren" + "updateInBitwardenSlideImgAltPeriod": { + "message": "Illustration einer Bitwarden-Benachrichtigung, die den Benutzer dazu auffordert, die Zugangsdaten zu aktualisieren." }, "turnOnAutofill": { "message": "Auto-Ausfüllen aktivieren" @@ -3007,6 +3005,15 @@ } } }, + "exportingIndividualVaultWithAttachmentsDescription": { + "message": "Nur die einzelnen Tresor-Einträge einschließlich Anhängen von $EMAIL$ werden exportiert. Tresor-Einträge der Organisation werden nicht berücksichtigt", + "placeholders": { + "email": { + "content": "$1", + "example": "name@example.com" + } + } + }, "exportingOrganizationVaultTitle": { "message": "Tresor der Organisation wird exportiert" }, @@ -3839,15 +3846,9 @@ "duoHealthCheckResultsInNullAuthUrlError": { "message": "Fehler beim Verbinden mit dem Duo-Dienst. Verwende eine andere Zwei-Faktor-Authentifizierungsmethode oder kontaktiere Duo für Hilfe." }, - "launchDuoAndFollowStepsToFinishLoggingIn": { - "message": "Starte DUO und folge den Schritten, um die Anmeldung zu abzuschließen." - }, "duoRequiredForAccount": { "message": "Für dein Konto ist die Duo Zwei-Faktor-Authentifizierung erforderlich." }, - "popoutTheExtensionToCompleteLogin": { - "message": "Koppel die Erweiterung ab, um die Anmeldung abzuschließen." - }, "popoutExtension": { "message": "Popout-Erweiterung" }, @@ -4270,6 +4271,20 @@ } } }, + "viewItemTitleWithField": { + "message": "Eintrag ansehen - $ITEMNAME$ - $FIELD$", + "description": "Title for a link that opens a view for an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + }, + "field": { + "content": "$2", + "example": "Username" + } + } + }, "autofillTitle": { "message": "Auto-Ausfüllen - $ITEMNAME$", "description": "Title for a button that autofills a login item.", @@ -4280,6 +4295,20 @@ } } }, + "autofillTitleWithField": { + "message": "Auto-Ausfüllen - $ITEMNAME$ - $FIELD$", + "description": "Title for a button that autofills a login item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + }, + "field": { + "content": "$2", + "example": "Username" + } + } + }, "copyFieldValue": { "message": "$FIELD$, $VALUE$ kopieren", "description": "Title for a button that copies a field value to the clipboard.", @@ -4899,8 +4928,8 @@ "message": "Passwort neu generiert", "description": "Notification message for when a password has been regenerated" }, - "saveLoginToBitwarden": { - "message": "Zugangsdaten in Bitwarden speichern?", + "saveToBitwarden": { + "message": "Save to Bitwarden", "description": "Confirmation message for saving a login to Bitwarden" }, "spaceCharacterDescriptor": { @@ -5139,5 +5168,32 @@ }, "changeAtRiskPassword": { "message": "Gefährdetes Passwort ändern" + }, + "introCarouselLabel": { + "message": "Willkommen bei Bitwarden" + }, + "securityPrioritized": { + "message": "Sicherheit, priorisiert" + }, + "securityPrioritizedBody": { + "message": "Speichere Zugangsdaten, Karten und Identitäten in deinem sicheren Tresor. Bitwarden verwendet Zero-Knowledge und Ende-zu-Ende-Verschlüsselung, um das zu schützen, was für dich wichtig ist." + }, + "quickLogin": { + "message": "Schnelle und einfache Anmeldung" + }, + "quickLoginBody": { + "message": "Richte biometrisches Entsperren und Auto-Ausfüllen ein, um dich ohne einen einzigen Buchstaben einzugeben bei deinen Konten anzumelden." + }, + "secureUser": { + "message": "Optimiere deine Zugangsdaten" + }, + "secureUserBody": { + "message": "Verwende den Generator, um einzigartige Passwörter für alle deine Konten zu erstellen und zu speichern." + }, + "secureDevices": { + "message": "Deine Daten, wann und wo du sie brauchst" + }, + "secureDevicesBody": { + "message": "Speicher eine unbegrenzte Anzahl von Passwörtern auf unbegrenzt vielen Geräten mit Bitwarden-Apps für Smartphones, Browser und Desktop." } } diff --git a/apps/browser/src/_locales/el/messages.json b/apps/browser/src/_locales/el/messages.json index fc07f12a48f..7cdb3f14ec3 100644 --- a/apps/browser/src/_locales/el/messages.json +++ b/apps/browser/src/_locales/el/messages.json @@ -1098,6 +1098,31 @@ "message": "Login updated", "description": "Message displayed when login details are successfully updated." }, + "loginUpdateTaskSuccess": { + "message": "Great job! You took the steps to make you and $ORGANIZATION$ more secure.", + "placeholders": { + "organization": { + "content": "$1" + } + }, + "description": "Shown to user after login is updated." + }, + "loginUpdateTaskSuccessAdditional": { + "message": "Thank you for making $ORGANIZATION$ more secure. You have $TASK_COUNT$ more passwords to update.", + "placeholders": { + "organization": { + "content": "$1" + }, + "task_count": { + "content": "$2" + } + }, + "description": "Shown to user after login is updated." + }, + "nextSecurityTaskAction": { + "message": "Change next password", + "description": "Message prompting user to undertake completion of another security task." + }, "saveFailure": { "message": "Error saving", "description": "Error message shown when the system fails to save login details." @@ -1391,24 +1416,12 @@ "premiumRequiredDesc": { "message": "Για να χρησιμοποιήσετε αυτή τη λειτουργία, απαιτείται συνδρομή Premium." }, - "enterVerificationCodeApp": { - "message": "Εισάγετε τον 6ψήφιο κωδικό από την εφαρμογή επαλήθευσης." - }, "authenticationTimeout": { "message": "Χρονικό όριο επαλήθευσης" }, "authenticationSessionTimedOut": { "message": "Λήξη χρονικού ορίου συνεδρίας επαλήθευσης. Παρακαλώ επανεκκινήστε τη διαδικασία σύνδεσης." }, - "enterVerificationCodeEmail": { - "message": "Εισάγετε τον 6ψήφιο κωδικό επαλήθευσης τον οποίο λάβατε στο $EMAIL$.", - "placeholders": { - "email": { - "content": "$1", - "example": "example@gmail.com" - } - } - }, "verificationCodeEmailSent": { "message": "Εστάλη email επαλήθευσης στο $EMAIL$.", "placeholders": { @@ -1418,18 +1431,9 @@ } } }, - "rememberMe": { - "message": "Να με θυμάσαι" - }, "dontAskAgainOnThisDeviceFor30Days": { "message": "Don't ask again on this device for 30 days" }, - "sendVerificationCodeEmailAgain": { - "message": "Αποστολή email κωδικού επαλήθευσης ξανά" - }, - "useAnotherTwoStepMethod": { - "message": "Χρήση άλλης μεθόδου σύνδεσης δύο παραγόντων" - }, "selectAnotherMethod": { "message": "Select another method", "description": "Select another two-step login method" @@ -1437,18 +1441,9 @@ "useYourRecoveryCode": { "message": "Use your recovery code" }, - "insertYubiKey": { - "message": "Τοποθετήστε το YubiKey στη θύρα USB του υπολογιστή σας και έπειτα κάντε κλικ στο κουμπί του." - }, "insertU2f": { "message": "Εισάγετε το κλειδί ασφαλείας στη θύρα USB του υπολογιστή σας. Αν έχει κουμπί, πατήστε το." }, - "webAuthnNewTab": { - "message": "Συνεχίστε την επαλήθευση WebAuthn 2FA στη νέα καρτέλα." - }, - "webAuthnNewTabOpen": { - "message": "Άνοιγμα νέας καρτέλας" - }, "openInNewTab": { "message": "Open in new tab" }, @@ -2327,6 +2322,9 @@ "privacyPolicy": { "message": "Πολιτική Απορρήτου" }, + "yourNewPasswordCannotBeTheSameAsYourCurrentPassword": { + "message": "Your new password cannot be the same as your current password." + }, "hintEqualsPassword": { "message": "Η υπόδειξη κωδικού πρόσβασης, δεν μπορεί να είναι η ίδια με τον κωδικό πρόσβασης σας." }, @@ -2534,15 +2532,15 @@ "message": "Your organization passwords are at-risk because they are weak, reused, and/or exposed.", "description": "Description of the review at-risk login slide on the at-risk password page carousel" }, - "reviewAtRiskLoginSlideImgAlt": { - "message": "Illustration of a list of logins that are at-risk" + "reviewAtRiskLoginSlideImgAltPeriod": { + "message": "Illustration of a list of logins that are at-risk." }, "generatePasswordSlideDesc": { "message": "Quickly generate a strong, unique password with the Bitwarden autofill menu on the at-risk site.", "description": "Description of the generate password slide on the at-risk password page carousel" }, - "generatePasswordSlideImgAlt": { - "message": "Illustration of the Bitwarden autofill menu displaying a generated password" + "generatePasswordSlideImgAltPeriod": { + "message": "Illustration of the Bitwarden autofill menu displaying a generated password." }, "updateInBitwarden": { "message": "Update in Bitwarden" @@ -2551,8 +2549,8 @@ "message": "Bitwarden will then prompt you to update the password in the password manager.", "description": "Description of the update in Bitwarden slide on the at-risk password page carousel" }, - "updateInBitwardenSlideImgAlt": { - "message": "Illustration of a Bitwarden’s notification prompting the user to update the login" + "updateInBitwardenSlideImgAltPeriod": { + "message": "Illustration of a Bitwarden’s notification prompting the user to update the login." }, "turnOnAutofill": { "message": "Ενεργοποίηση αυτόματης συμπλήρωσης" @@ -3007,6 +3005,15 @@ } } }, + "exportingIndividualVaultWithAttachmentsDescription": { + "message": "Only the individual vault items including attachments associated with $EMAIL$ will be exported. Organization vault items will not be included", + "placeholders": { + "email": { + "content": "$1", + "example": "name@example.com" + } + } + }, "exportingOrganizationVaultTitle": { "message": "Εξαγωγή θησαυ/κίου οργανισμού" }, @@ -3839,15 +3846,9 @@ "duoHealthCheckResultsInNullAuthUrlError": { "message": "Σφάλμα κατά τη σύνδεση με την υπηρεσία Duo. Χρησιμοποιήστε μια διαφορετική μέθοδο σύνδεσης δύο βημάτων ή επικοινωνήστε με την Duo για βοήθεια." }, - "launchDuoAndFollowStepsToFinishLoggingIn": { - "message": "Εκκινήστε το Duo και ακολουθήστε τα βήματα για να ολοκληρώσετε τη σύνδεση." - }, "duoRequiredForAccount": { "message": "Απαιτείται σύνδεση δύο βημάτων Duo για το λογαριασμό σας." }, - "popoutTheExtensionToCompleteLogin": { - "message": "Ανοίξτε την επέκταση σε νέο παράθυρο για να ολοκληρώσετε τη σύνδεση." - }, "popoutExtension": { "message": "Άνοιγμα επέκτασης σε νέο παράθυρο" }, @@ -4270,6 +4271,20 @@ } } }, + "viewItemTitleWithField": { + "message": "View item - $ITEMNAME$ - $FIELD$", + "description": "Title for a link that opens a view for an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + }, + "field": { + "content": "$2", + "example": "Username" + } + } + }, "autofillTitle": { "message": "Αυτόματη συμπλήρωση - $ITEMNAME$", "description": "Title for a button that autofills a login item.", @@ -4280,6 +4295,20 @@ } } }, + "autofillTitleWithField": { + "message": "Autofill - $ITEMNAME$ - $FIELD$", + "description": "Title for a button that autofills a login item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + }, + "field": { + "content": "$2", + "example": "Username" + } + } + }, "copyFieldValue": { "message": "Copy $FIELD$, $VALUE$", "description": "Title for a button that copies a field value to the clipboard.", @@ -4899,8 +4928,8 @@ "message": "Ο κωδικός επαναδημιουργήθηκε", "description": "Notification message for when a password has been regenerated" }, - "saveLoginToBitwarden": { - "message": "Αποθήκευση σύνδεσης στο Bitwarden;", + "saveToBitwarden": { + "message": "Save to Bitwarden", "description": "Confirmation message for saving a login to Bitwarden" }, "spaceCharacterDescriptor": { @@ -5139,5 +5168,32 @@ }, "changeAtRiskPassword": { "message": "Change at-risk password" + }, + "introCarouselLabel": { + "message": "Welcome to Bitwarden" + }, + "securityPrioritized": { + "message": "Security, prioritized" + }, + "securityPrioritizedBody": { + "message": "Save logins, cards, and identities to your secure vault. Bitwarden uses zero-knowledge, end-to-end encryption to protect what’s important to you." + }, + "quickLogin": { + "message": "Quick and easy login" + }, + "quickLoginBody": { + "message": "Set up biometric unlock and autofill to log into your accounts without typing a single letter." + }, + "secureUser": { + "message": "Level up your logins" + }, + "secureUserBody": { + "message": "Use the generator to create and save strong, unique passwords for all your accounts." + }, + "secureDevices": { + "message": "Your data, when and where you need it" + }, + "secureDevicesBody": { + "message": "Save unlimited passwords across unlimited devices with Bitwarden mobile, browser, and desktop apps." } } diff --git a/apps/browser/src/_locales/en/messages.json b/apps/browser/src/_locales/en/messages.json index 16f462b7f17..b0f3fb5d19e 100644 --- a/apps/browser/src/_locales/en/messages.json +++ b/apps/browser/src/_locales/en/messages.json @@ -2,6 +2,9 @@ "appName": { "message": "Bitwarden" }, + "appLogoLabel": { + "message": "Bitwarden logo" + }, "extName": { "message": "Bitwarden Password Manager", "description": "Extension name, MUST be less than 40 characters (Safari restriction)" @@ -1098,6 +1101,31 @@ "message": "Login updated", "description": "Message displayed when login details are successfully updated." }, + "loginUpdateTaskSuccess": { + "message": "Great job! You took the steps to make you and $ORGANIZATION$ more secure.", + "placeholders": { + "organization": { + "content": "$1" + } + }, + "description": "Shown to user after login is updated." + }, + "loginUpdateTaskSuccessAdditional": { + "message": "Thank you for making $ORGANIZATION$ more secure. You have $TASK_COUNT$ more passwords to update.", + "placeholders": { + "organization": { + "content": "$1" + }, + "task_count": { + "content": "$2" + } + }, + "description": "Shown to user after login is updated." + }, + "nextSecurityTaskAction": { + "message": "Change next password", + "description": "Message prompting user to undertake completion of another security task." + }, "saveFailure": { "message": "Error saving", "description": "Error message shown when the system fails to save login details." @@ -1391,24 +1419,12 @@ "premiumRequiredDesc": { "message": "A Premium membership is required to use this feature." }, - "enterVerificationCodeApp": { - "message": "Enter the 6 digit verification code from your authenticator app." - }, "authenticationTimeout": { "message": "Authentication timeout" }, "authenticationSessionTimedOut": { "message": "The authentication session timed out. Please restart the login process." }, - "enterVerificationCodeEmail": { - "message": "Enter the 6 digit verification code that was emailed to $EMAIL$.", - "placeholders": { - "email": { - "content": "$1", - "example": "example@gmail.com" - } - } - }, "verificationCodeEmailSent": { "message": "Verification email sent to $EMAIL$.", "placeholders": { @@ -1418,18 +1434,9 @@ } } }, - "rememberMe": { - "message": "Remember me" - }, "dontAskAgainOnThisDeviceFor30Days": { "message": "Don't ask again on this device for 30 days" }, - "sendVerificationCodeEmailAgain": { - "message": "Send verification code email again" - }, - "useAnotherTwoStepMethod": { - "message": "Use another two-step login method" - }, "selectAnotherMethod": { "message": "Select another method", "description": "Select another two-step login method" @@ -1437,18 +1444,9 @@ "useYourRecoveryCode": { "message": "Use your recovery code" }, - "insertYubiKey": { - "message": "Insert your YubiKey into your computer's USB port, then touch its button." - }, "insertU2f": { "message": "Insert your security key into your computer's USB port. If it has a button, touch it." }, - "webAuthnNewTab": { - "message": "To start the WebAuthn 2FA verification. Click the button below to open a new tab and follow the instructions provided in the new tab." - }, - "webAuthnNewTabOpen": { - "message": "Open new tab" - }, "openInNewTab": { "message": "Open in new tab" }, @@ -2327,6 +2325,9 @@ "privacyPolicy": { "message": "Privacy Policy" }, + "yourNewPasswordCannotBeTheSameAsYourCurrentPassword": { + "message": "Your new password cannot be the same as your current password." + }, "hintEqualsPassword": { "message": "Your password hint cannot be the same as your password." }, @@ -2534,15 +2535,15 @@ "message": "Your organization passwords are at-risk because they are weak, reused, and/or exposed.", "description": "Description of the review at-risk login slide on the at-risk password page carousel" }, - "reviewAtRiskLoginSlideImgAlt": { - "message": "Illustration of a list of logins that are at-risk" + "reviewAtRiskLoginSlideImgAltPeriod": { + "message": "Illustration of a list of logins that are at-risk." }, "generatePasswordSlideDesc": { "message": "Quickly generate a strong, unique password with the Bitwarden autofill menu on the at-risk site.", "description": "Description of the generate password slide on the at-risk password page carousel" }, - "generatePasswordSlideImgAlt": { - "message": "Illustration of the Bitwarden autofill menu displaying a generated password" + "generatePasswordSlideImgAltPeriod": { + "message": "Illustration of the Bitwarden autofill menu displaying a generated password." }, "updateInBitwarden": { "message": "Update in Bitwarden" @@ -2551,8 +2552,8 @@ "message": "Bitwarden will then prompt you to update the password in the password manager.", "description": "Description of the update in Bitwarden slide on the at-risk password page carousel" }, - "updateInBitwardenSlideImgAlt": { - "message": "Illustration of a Bitwarden’s notification prompting the user to update the login" + "updateInBitwardenSlideImgAltPeriod": { + "message": "Illustration of a Bitwarden’s notification prompting the user to update the login." }, "turnOnAutofill": { "message": "Turn on autofill" @@ -3007,6 +3008,15 @@ } } }, + "exportingIndividualVaultWithAttachmentsDescription": { + "message": "Only the individual vault items including attachments associated with $EMAIL$ will be exported. Organization vault items will not be included", + "placeholders": { + "email": { + "content": "$1", + "example": "name@example.com" + } + } + }, "exportingOrganizationVaultTitle": { "message": "Exporting organization vault" }, @@ -3839,15 +3849,9 @@ "duoHealthCheckResultsInNullAuthUrlError": { "message": "Error connecting with the Duo service. Use a different two-step login method or contact Duo for assistance." }, - "launchDuoAndFollowStepsToFinishLoggingIn": { - "message": "Launch Duo and follow the steps to finish logging in." - }, "duoRequiredForAccount": { "message": "Duo two-step login is required for your account." }, - "popoutTheExtensionToCompleteLogin": { - "message": "Popout the extension to complete login." - }, "popoutExtension": { "message": "Popout extension" }, @@ -4270,6 +4274,20 @@ } } }, + "viewItemTitleWithField": { + "message": "View item - $ITEMNAME$ - $FIELD$", + "description": "Title for a link that opens a view for an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + }, + "field": { + "content": "$2", + "example": "Username" + } + } + }, "autofillTitle": { "message": "Autofill - $ITEMNAME$", "description": "Title for a button that autofills a login item.", @@ -4280,6 +4298,20 @@ } } }, + "autofillTitleWithField": { + "message": "Autofill - $ITEMNAME$ - $FIELD$", + "description": "Title for a button that autofills a login item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + }, + "field": { + "content": "$2", + "example": "Username" + } + } + }, "copyFieldValue": { "message": "Copy $FIELD$, $VALUE$", "description": "Title for a button that copies a field value to the clipboard.", @@ -4899,8 +4931,8 @@ "message": "Password regenerated", "description": "Notification message for when a password has been regenerated" }, - "saveLoginToBitwarden": { - "message": "Save login to Bitwarden?", + "saveToBitwarden": { + "message": "Save to Bitwarden", "description": "Confirmation message for saving a login to Bitwarden" }, "spaceCharacterDescriptor": { @@ -5139,5 +5171,32 @@ }, "changeAtRiskPassword": { "message": "Change at-risk password" + }, + "introCarouselLabel": { + "message": "Welcome to Bitwarden" + }, + "securityPrioritized": { + "message": "Security, prioritized" + }, + "securityPrioritizedBody": { + "message": "Save logins, cards, and identities to your secure vault. Bitwarden uses zero-knowledge, end-to-end encryption to protect what’s important to you." + }, + "quickLogin": { + "message": "Quick and easy login" + }, + "quickLoginBody": { + "message": "Set up biometric unlock and autofill to log into your accounts without typing a single letter." + }, + "secureUser": { + "message": "Level up your logins" + }, + "secureUserBody": { + "message": "Use the generator to create and save strong, unique passwords for all your accounts." + }, + "secureDevices": { + "message": "Your data, when and where you need it" + }, + "secureDevicesBody": { + "message": "Save unlimited passwords across unlimited devices with Bitwarden mobile, browser, and desktop apps." } } diff --git a/apps/browser/src/_locales/en_GB/messages.json b/apps/browser/src/_locales/en_GB/messages.json index 1381afbdc6e..0be594e67ba 100644 --- a/apps/browser/src/_locales/en_GB/messages.json +++ b/apps/browser/src/_locales/en_GB/messages.json @@ -1098,6 +1098,31 @@ "message": "Login updated", "description": "Message displayed when login details are successfully updated." }, + "loginUpdateTaskSuccess": { + "message": "Great job! You took the steps to make you and $ORGANIZATION$ more secure.", + "placeholders": { + "organization": { + "content": "$1" + } + }, + "description": "Shown to user after login is updated." + }, + "loginUpdateTaskSuccessAdditional": { + "message": "Thank you for making $ORGANIZATION$ more secure. You have $TASK_COUNT$ more passwords to update.", + "placeholders": { + "organization": { + "content": "$1" + }, + "task_count": { + "content": "$2" + } + }, + "description": "Shown to user after login is updated." + }, + "nextSecurityTaskAction": { + "message": "Change next password", + "description": "Message prompting user to undertake completion of another security task." + }, "saveFailure": { "message": "Error saving", "description": "Error message shown when the system fails to save login details." @@ -1391,24 +1416,12 @@ "premiumRequiredDesc": { "message": "A Premium membership is required to use this feature." }, - "enterVerificationCodeApp": { - "message": "Enter the 6 digit verification code from your authenticator app." - }, "authenticationTimeout": { "message": "Authentication timeout" }, "authenticationSessionTimedOut": { "message": "The authentication session timed out. Please restart the login process." }, - "enterVerificationCodeEmail": { - "message": "Enter the 6 digit verification code that was emailed to $EMAIL$.", - "placeholders": { - "email": { - "content": "$1", - "example": "example@gmail.com" - } - } - }, "verificationCodeEmailSent": { "message": "Verification email sent to $EMAIL$.", "placeholders": { @@ -1418,18 +1431,9 @@ } } }, - "rememberMe": { - "message": "Remember me" - }, "dontAskAgainOnThisDeviceFor30Days": { "message": "Don't ask again on this device for 30 days" }, - "sendVerificationCodeEmailAgain": { - "message": "Send verification code email again" - }, - "useAnotherTwoStepMethod": { - "message": "Use another two-step login method" - }, "selectAnotherMethod": { "message": "Select another method", "description": "Select another two-step login method" @@ -1437,18 +1441,9 @@ "useYourRecoveryCode": { "message": "Use your recovery code" }, - "insertYubiKey": { - "message": "Insert your YubiKey into your computer's USB port, then touch its button." - }, "insertU2f": { "message": "Insert your security key into your computer's USB port. If it has a button, touch it." }, - "webAuthnNewTab": { - "message": "To start the WebAuthn 2FA verification. Click the button below to open a new tab and follow the instructions provided in the new tab." - }, - "webAuthnNewTabOpen": { - "message": "Open new tab" - }, "openInNewTab": { "message": "Open in new tab" }, @@ -2327,6 +2322,9 @@ "privacyPolicy": { "message": "Privacy policy" }, + "yourNewPasswordCannotBeTheSameAsYourCurrentPassword": { + "message": "Your new password cannot be the same as your current password." + }, "hintEqualsPassword": { "message": "Your password hint cannot be the same as your password." }, @@ -2534,15 +2532,15 @@ "message": "Your organisation passwords are at-risk because they are weak, reused, and/or exposed.", "description": "Description of the review at-risk login slide on the at-risk password page carousel" }, - "reviewAtRiskLoginSlideImgAlt": { - "message": "Illustration of a list of logins that are at-risk" + "reviewAtRiskLoginSlideImgAltPeriod": { + "message": "Illustration of a list of logins that are at-risk." }, "generatePasswordSlideDesc": { "message": "Quickly generate a strong, unique password with the Bitwarden autofill menu on the at-risk site.", "description": "Description of the generate password slide on the at-risk password page carousel" }, - "generatePasswordSlideImgAlt": { - "message": "Illustration of the Bitwarden autofill menu displaying a generated password" + "generatePasswordSlideImgAltPeriod": { + "message": "Illustration of the Bitwarden autofill menu displaying a generated password." }, "updateInBitwarden": { "message": "Update in Bitwarden" @@ -2551,8 +2549,8 @@ "message": "Bitwarden will then prompt you to update the password in the password manager.", "description": "Description of the update in Bitwarden slide on the at-risk password page carousel" }, - "updateInBitwardenSlideImgAlt": { - "message": "Illustration of a Bitwarden’s notification prompting the user to update the login" + "updateInBitwardenSlideImgAltPeriod": { + "message": "Illustration of a Bitwarden’s notification prompting the user to update the login." }, "turnOnAutofill": { "message": "Turn on autofill" @@ -3007,6 +3005,15 @@ } } }, + "exportingIndividualVaultWithAttachmentsDescription": { + "message": "Only the individual vault items including attachments associated with $EMAIL$ will be exported. Organisation vault items will not be included", + "placeholders": { + "email": { + "content": "$1", + "example": "name@example.com" + } + } + }, "exportingOrganizationVaultTitle": { "message": "Exporting organisation vault" }, @@ -3839,15 +3846,9 @@ "duoHealthCheckResultsInNullAuthUrlError": { "message": "Error connecting with the Duo service. Use a different two-step login method or contact Duo for assistance." }, - "launchDuoAndFollowStepsToFinishLoggingIn": { - "message": "Launch Duo and follow the steps to finish logging in." - }, "duoRequiredForAccount": { "message": "Duo two-step login is required for your account." }, - "popoutTheExtensionToCompleteLogin": { - "message": "Popout the extension to complete login." - }, "popoutExtension": { "message": "Popout extension" }, @@ -4270,6 +4271,20 @@ } } }, + "viewItemTitleWithField": { + "message": "View item - $ITEMNAME$ - $FIELD$", + "description": "Title for a link that opens a view for an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + }, + "field": { + "content": "$2", + "example": "Username" + } + } + }, "autofillTitle": { "message": "Auto-fill - $ITEMNAME$", "description": "Title for a button that autofills a login item.", @@ -4280,6 +4295,20 @@ } } }, + "autofillTitleWithField": { + "message": "Autofill - $ITEMNAME$ - $FIELD$", + "description": "Title for a button that autofills a login item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + }, + "field": { + "content": "$2", + "example": "Username" + } + } + }, "copyFieldValue": { "message": "Copy $FIELD$, $VALUE$", "description": "Title for a button that copies a field value to the clipboard.", @@ -4899,8 +4928,8 @@ "message": "Password regenerated", "description": "Notification message for when a password has been regenerated" }, - "saveLoginToBitwarden": { - "message": "Save login to Bitwarden?", + "saveToBitwarden": { + "message": "Save to Bitwarden", "description": "Confirmation message for saving a login to Bitwarden" }, "spaceCharacterDescriptor": { @@ -5139,5 +5168,32 @@ }, "changeAtRiskPassword": { "message": "Change at-risk password" + }, + "introCarouselLabel": { + "message": "Welcome to Bitwarden" + }, + "securityPrioritized": { + "message": "Security, prioritised" + }, + "securityPrioritizedBody": { + "message": "Save logins, cards, and identities to your secure vault. Bitwarden uses zero-knowledge, end-to-end encryption to protect what’s important to you." + }, + "quickLogin": { + "message": "Quick and easy login" + }, + "quickLoginBody": { + "message": "Set up biometric unlock and autofill to log into your accounts without typing a single letter." + }, + "secureUser": { + "message": "Level up your logins" + }, + "secureUserBody": { + "message": "Use the generator to create and save strong, unique passwords for all your accounts." + }, + "secureDevices": { + "message": "Your data, when and where you need it" + }, + "secureDevicesBody": { + "message": "Save unlimited passwords across unlimited devices with Bitwarden mobile, browser, and desktop apps." } } diff --git a/apps/browser/src/_locales/en_IN/messages.json b/apps/browser/src/_locales/en_IN/messages.json index 6b14a358148..94ec0753410 100644 --- a/apps/browser/src/_locales/en_IN/messages.json +++ b/apps/browser/src/_locales/en_IN/messages.json @@ -1098,6 +1098,31 @@ "message": "Login updated", "description": "Message displayed when login details are successfully updated." }, + "loginUpdateTaskSuccess": { + "message": "Great job! You took the steps to make you and $ORGANIZATION$ more secure.", + "placeholders": { + "organization": { + "content": "$1" + } + }, + "description": "Shown to user after login is updated." + }, + "loginUpdateTaskSuccessAdditional": { + "message": "Thank you for making $ORGANIZATION$ more secure. You have $TASK_COUNT$ more passwords to update.", + "placeholders": { + "organization": { + "content": "$1" + }, + "task_count": { + "content": "$2" + } + }, + "description": "Shown to user after login is updated." + }, + "nextSecurityTaskAction": { + "message": "Change next password", + "description": "Message prompting user to undertake completion of another security task." + }, "saveFailure": { "message": "Error saving", "description": "Error message shown when the system fails to save login details." @@ -1391,24 +1416,12 @@ "premiumRequiredDesc": { "message": "A premium membership is required to use this feature." }, - "enterVerificationCodeApp": { - "message": "Enter the 6 digit verification code from your authenticator app." - }, "authenticationTimeout": { "message": "Authentication timeout" }, "authenticationSessionTimedOut": { "message": "The authentication session timed out. Please restart the login process." }, - "enterVerificationCodeEmail": { - "message": "Enter the 6 digit verification code that was emailed to $EMAIL$.", - "placeholders": { - "email": { - "content": "$1", - "example": "example@gmail.com" - } - } - }, "verificationCodeEmailSent": { "message": "Verification email sent to $EMAIL$.", "placeholders": { @@ -1418,18 +1431,9 @@ } } }, - "rememberMe": { - "message": "Remember me" - }, "dontAskAgainOnThisDeviceFor30Days": { "message": "Don't ask again on this device for 30 days" }, - "sendVerificationCodeEmailAgain": { - "message": "Send verification code email again" - }, - "useAnotherTwoStepMethod": { - "message": "Use another two-step login method" - }, "selectAnotherMethod": { "message": "Select another method", "description": "Select another two-step login method" @@ -1437,18 +1441,9 @@ "useYourRecoveryCode": { "message": "Use your recovery code" }, - "insertYubiKey": { - "message": "Insert your YubiKey into your computer's USB port, then touch its button." - }, "insertU2f": { "message": "Insert your security key into your computer's USB port. If it has a button, touch it." }, - "webAuthnNewTab": { - "message": "To start the WebAuthn 2FA verification. Click the button below to open a new tab and follow the instructions provided in the new tab." - }, - "webAuthnNewTabOpen": { - "message": "Open new tab" - }, "openInNewTab": { "message": "Open in new tab" }, @@ -2327,6 +2322,9 @@ "privacyPolicy": { "message": "Privacy Policy" }, + "yourNewPasswordCannotBeTheSameAsYourCurrentPassword": { + "message": "Your new password cannot be the same as your current password." + }, "hintEqualsPassword": { "message": "Your password hint cannot be the same as your password." }, @@ -2534,15 +2532,15 @@ "message": "Your organisation passwords are at-risk because they are weak, reused, and/or exposed.", "description": "Description of the review at-risk login slide on the at-risk password page carousel" }, - "reviewAtRiskLoginSlideImgAlt": { - "message": "Illustration of a list of logins that are at-risk" + "reviewAtRiskLoginSlideImgAltPeriod": { + "message": "Illustration of a list of logins that are at-risk." }, "generatePasswordSlideDesc": { "message": "Quickly generate a strong, unique password with the Bitwarden autofill menu on the at-risk site.", "description": "Description of the generate password slide on the at-risk password page carousel" }, - "generatePasswordSlideImgAlt": { - "message": "Illustration of the Bitwarden autofill menu displaying a generated password" + "generatePasswordSlideImgAltPeriod": { + "message": "Illustration of the Bitwarden autofill menu displaying a generated password." }, "updateInBitwarden": { "message": "Update in Bitwarden" @@ -2551,8 +2549,8 @@ "message": "Bitwarden will then prompt you to update the password in the password manager.", "description": "Description of the update in Bitwarden slide on the at-risk password page carousel" }, - "updateInBitwardenSlideImgAlt": { - "message": "Illustration of a Bitwarden’s notification prompting the user to update the login" + "updateInBitwardenSlideImgAltPeriod": { + "message": "Illustration of a Bitwarden’s notification prompting the user to update the login." }, "turnOnAutofill": { "message": "Turn on autofill" @@ -3007,6 +3005,15 @@ } } }, + "exportingIndividualVaultWithAttachmentsDescription": { + "message": "Only the individual vault items including attachments associated with $EMAIL$ will be exported. Organisation vault items will not be included", + "placeholders": { + "email": { + "content": "$1", + "example": "name@example.com" + } + } + }, "exportingOrganizationVaultTitle": { "message": "Exporting organisation vault" }, @@ -3839,15 +3846,9 @@ "duoHealthCheckResultsInNullAuthUrlError": { "message": "Error connecting with the Duo service. Use a different two-step login method or contact Duo for assistance." }, - "launchDuoAndFollowStepsToFinishLoggingIn": { - "message": "Launch Duo and follow the steps to finish logging in." - }, "duoRequiredForAccount": { "message": "Duo two-step login is required for your account." }, - "popoutTheExtensionToCompleteLogin": { - "message": "Popout the extension to complete login." - }, "popoutExtension": { "message": "Popout extension" }, @@ -4270,6 +4271,20 @@ } } }, + "viewItemTitleWithField": { + "message": "View item - $ITEMNAME$ - $FIELD$", + "description": "Title for a link that opens a view for an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + }, + "field": { + "content": "$2", + "example": "Username" + } + } + }, "autofillTitle": { "message": "Auto-fill - $ITEMNAME$", "description": "Title for a button that autofills a login item.", @@ -4280,6 +4295,20 @@ } } }, + "autofillTitleWithField": { + "message": "Autofill - $ITEMNAME$ - $FIELD$", + "description": "Title for a button that autofills a login item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + }, + "field": { + "content": "$2", + "example": "Username" + } + } + }, "copyFieldValue": { "message": "Copy $FIELD$, $VALUE$", "description": "Title for a button that copies a field value to the clipboard.", @@ -4899,8 +4928,8 @@ "message": "Password regenerated", "description": "Notification message for when a password has been regenerated" }, - "saveLoginToBitwarden": { - "message": "Save login to Bitwarden?", + "saveToBitwarden": { + "message": "Save to Bitwarden", "description": "Confirmation message for saving a login to Bitwarden" }, "spaceCharacterDescriptor": { @@ -5139,5 +5168,32 @@ }, "changeAtRiskPassword": { "message": "Change at-risk password" + }, + "introCarouselLabel": { + "message": "Welcome to Bitwarden" + }, + "securityPrioritized": { + "message": "Security, prioritised" + }, + "securityPrioritizedBody": { + "message": "Save logins, cards, and identities to your secure vault. Bitwarden uses zero-knowledge, end-to-end encryption to protect what’s important to you." + }, + "quickLogin": { + "message": "Quick and easy login" + }, + "quickLoginBody": { + "message": "Set up biometric unlock and autofill to log into your accounts without typing a single letter." + }, + "secureUser": { + "message": "Level up your logins" + }, + "secureUserBody": { + "message": "Use the generator to create and save strong, unique passwords for all your accounts." + }, + "secureDevices": { + "message": "Your data, when and where you need it" + }, + "secureDevicesBody": { + "message": "Save unlimited passwords across unlimited devices with Bitwarden mobile, browser, and desktop apps." } } diff --git a/apps/browser/src/_locales/es/messages.json b/apps/browser/src/_locales/es/messages.json index 4d430d23337..3ddea49820d 100644 --- a/apps/browser/src/_locales/es/messages.json +++ b/apps/browser/src/_locales/es/messages.json @@ -380,7 +380,7 @@ "message": "Editar carpeta" }, "editFolderWithName": { - "message": "Edit folder: $FOLDERNAME$", + "message": "Editar carpeta: $FOLDERNAME$", "placeholders": { "foldername": { "content": "$1", @@ -872,7 +872,7 @@ "message": "Enter the code sent to your email" }, "enterTheCodeFromYourAuthenticatorApp": { - "message": "Enter the code from your authenticator app" + "message": "Introduce el código de tu aplicación de autenticación" }, "pressYourYubiKeyToAuthenticate": { "message": "Press your YubiKey to authenticate" @@ -1098,6 +1098,31 @@ "message": "Login updated", "description": "Message displayed when login details are successfully updated." }, + "loginUpdateTaskSuccess": { + "message": "Great job! You took the steps to make you and $ORGANIZATION$ more secure.", + "placeholders": { + "organization": { + "content": "$1" + } + }, + "description": "Shown to user after login is updated." + }, + "loginUpdateTaskSuccessAdditional": { + "message": "Thank you for making $ORGANIZATION$ more secure. You have $TASK_COUNT$ more passwords to update.", + "placeholders": { + "organization": { + "content": "$1" + }, + "task_count": { + "content": "$2" + } + }, + "description": "Shown to user after login is updated." + }, + "nextSecurityTaskAction": { + "message": "Change next password", + "description": "Message prompting user to undertake completion of another security task." + }, "saveFailure": { "message": "Error saving", "description": "Error message shown when the system fails to save login details." @@ -1391,24 +1416,12 @@ "premiumRequiredDesc": { "message": "Una membrasía Premium es requerida para utilizar esta característica." }, - "enterVerificationCodeApp": { - "message": "Introduce el código de verificación de 6 dígitos de tu aplicación autenticadora." - }, "authenticationTimeout": { "message": "Tiempo de autenticación agotado" }, "authenticationSessionTimedOut": { "message": "Se ha agotado el tiempo de la sesión de autenticación. Por favor, inicie nuevamente el proceso de inicio de sesión." }, - "enterVerificationCodeEmail": { - "message": "Introduce el código de verificación de 6 dígitos que te ha sido enviado por correo electrónico", - "placeholders": { - "email": { - "content": "$1", - "example": "example@gmail.com" - } - } - }, "verificationCodeEmailSent": { "message": "Correo electrónico de verificación enviado a $EMAIL$.", "placeholders": { @@ -1418,18 +1431,9 @@ } } }, - "rememberMe": { - "message": "Recordarme" - }, "dontAskAgainOnThisDeviceFor30Days": { "message": "Don't ask again on this device for 30 days" }, - "sendVerificationCodeEmailAgain": { - "message": "Reenviar código de verificación por correo electrónico" - }, - "useAnotherTwoStepMethod": { - "message": "Utilizar otro método de autenticación en dos pasos" - }, "selectAnotherMethod": { "message": "Select another method", "description": "Select another two-step login method" @@ -1437,20 +1441,11 @@ "useYourRecoveryCode": { "message": "Use your recovery code" }, - "insertYubiKey": { - "message": "Inserta tu YubiKey en el puerto USB de tu equipo y posteriormente pulsa su botón." - }, "insertU2f": { "message": "Inserta tu llave de seguridad en el puerto USB de tu equipo. Si tiene un botón, púlsalo." }, - "webAuthnNewTab": { - "message": "Para iniciar la verificación de WebAuthn 2FA. Haga clic en el botón de abajo para abrir una nueva pestaña y siga las instrucciones proporcionadas en la nueva pestaña." - }, - "webAuthnNewTabOpen": { - "message": "Abrir nueva pestaña" - }, "openInNewTab": { - "message": "Open in new tab" + "message": "Abrir en nueva pestaña" }, "webAuthnAuthenticate": { "message": "Autenticar WebAuthn" @@ -1668,7 +1663,7 @@ "message": "Arrastrar para ordenar" }, "dragToReorder": { - "message": "Drag to reorder" + "message": "Arrastra para reordenar" }, "cfTypeText": { "message": "Texto" @@ -2327,6 +2322,9 @@ "privacyPolicy": { "message": "Política de privacidad" }, + "yourNewPasswordCannotBeTheSameAsYourCurrentPassword": { + "message": "Your new password cannot be the same as your current password." + }, "hintEqualsPassword": { "message": "Tu contraseña no puede ser idéntica a la pista de contraseña." }, @@ -2534,15 +2532,15 @@ "message": "Your organization passwords are at-risk because they are weak, reused, and/or exposed.", "description": "Description of the review at-risk login slide on the at-risk password page carousel" }, - "reviewAtRiskLoginSlideImgAlt": { - "message": "Illustration of a list of logins that are at-risk" + "reviewAtRiskLoginSlideImgAltPeriod": { + "message": "Illustration of a list of logins that are at-risk." }, "generatePasswordSlideDesc": { "message": "Quickly generate a strong, unique password with the Bitwarden autofill menu on the at-risk site.", "description": "Description of the generate password slide on the at-risk password page carousel" }, - "generatePasswordSlideImgAlt": { - "message": "Illustration of the Bitwarden autofill menu displaying a generated password" + "generatePasswordSlideImgAltPeriod": { + "message": "Illustration of the Bitwarden autofill menu displaying a generated password." }, "updateInBitwarden": { "message": "Update in Bitwarden" @@ -2551,8 +2549,8 @@ "message": "Bitwarden will then prompt you to update the password in the password manager.", "description": "Description of the update in Bitwarden slide on the at-risk password page carousel" }, - "updateInBitwardenSlideImgAlt": { - "message": "Illustration of a Bitwarden’s notification prompting the user to update the login" + "updateInBitwardenSlideImgAltPeriod": { + "message": "Illustration of a Bitwarden’s notification prompting the user to update the login." }, "turnOnAutofill": { "message": "Activar autorrelleno" @@ -3007,6 +3005,15 @@ } } }, + "exportingIndividualVaultWithAttachmentsDescription": { + "message": "Only the individual vault items including attachments associated with $EMAIL$ will be exported. Organization vault items will not be included", + "placeholders": { + "email": { + "content": "$1", + "example": "name@example.com" + } + } + }, "exportingOrganizationVaultTitle": { "message": "Exportando caja fuerte de la organización" }, @@ -3607,10 +3614,10 @@ } }, "singleFieldNeedsAttention": { - "message": "1 field needs your attention." + "message": "1 campo necesita tu atención." }, "multipleFieldsNeedAttention": { - "message": "$COUNT$ fields need your attention.", + "message": "Los campos $COUNT$ necesitan tu atención.", "placeholders": { "count": { "content": "$1", @@ -3839,15 +3846,9 @@ "duoHealthCheckResultsInNullAuthUrlError": { "message": "Error al conectarse con el servicio Duo. Utiliza un método de inicio de sesión en dos pasos diferente o ponte en contacto con Duo para obtener ayuda." }, - "launchDuoAndFollowStepsToFinishLoggingIn": { - "message": "Abra Duo y siga los pasos para terminar de iniciar sesión." - }, "duoRequiredForAccount": { "message": "Se requiere el inicio de sesión en dos pasos Duo para su cuenta." }, - "popoutTheExtensionToCompleteLogin": { - "message": "Abra la extensión para completar el inicio de sesión." - }, "popoutExtension": { "message": "Abrir extensión" }, @@ -4080,7 +4081,7 @@ "message": "Cuenta activa" }, "bitwardenAccount": { - "message": "Bitwarden account" + "message": "Cuenta de Bitwarden" }, "availableAccounts": { "message": "Cuentas disponibles" @@ -4178,7 +4179,7 @@ "description": "Notification message for when saving credentials has succeeded." }, "passwordSaved": { - "message": "Password saved!", + "message": "¡Contraseña guardada!", "description": "Notification message for when saving credentials has succeeded." }, "updateCipherAttemptSuccess": { @@ -4270,6 +4271,20 @@ } } }, + "viewItemTitleWithField": { + "message": "View item - $ITEMNAME$ - $FIELD$", + "description": "Title for a link that opens a view for an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + }, + "field": { + "content": "$2", + "example": "Username" + } + } + }, "autofillTitle": { "message": "Autocompletar - $ITEMNAME$", "description": "Title for a button that autofills a login item.", @@ -4280,6 +4295,20 @@ } } }, + "autofillTitleWithField": { + "message": "Autofill - $ITEMNAME$ - $FIELD$", + "description": "Title for a button that autofills a login item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + }, + "field": { + "content": "$2", + "example": "Username" + } + } + }, "copyFieldValue": { "message": "Copy $FIELD$, $VALUE$", "description": "Title for a button that copies a field value to the clipboard.", @@ -4486,10 +4515,10 @@ "message": "Autofill options" }, "websiteUri": { - "message": "Website (URI)" + "message": "Página web (URI)" }, "websiteUriCount": { - "message": "Website (URI) $COUNT$", + "message": "Página web (URI) $COUNT$", "description": "Label for an input field that contains a website URI. The input field is part of a list of fields, and the count indicates the position of the field in the list.", "placeholders": { "count": { @@ -4560,7 +4589,7 @@ "message": "Activar animaciones" }, "showAnimations": { - "message": "Show animations" + "message": "Mostrar animaciones" }, "addAccount": { "message": "Añadir cuenta" @@ -4632,10 +4661,10 @@ "message": "Enter the the field's html id, name, aria-label, or placeholder." }, "editField": { - "message": "Edit field" + "message": "Editar campo" }, "editFieldLabel": { - "message": "Edit $LABEL$", + "message": "Editar $LABEL$", "placeholders": { "label": { "content": "$1", @@ -4799,16 +4828,16 @@ "message": "Enterprise policy requirements have been applied to this setting" }, "sshPrivateKey": { - "message": "Private key" + "message": "Clave privada" }, "sshPublicKey": { - "message": "Public key" + "message": "Clave pública" }, "sshFingerprint": { "message": "Fingerprint" }, "sshKeyAlgorithm": { - "message": "Key type" + "message": "Tipo de clave" }, "sshKeyAlgorithmED25519": { "message": "ED25519" @@ -4899,8 +4928,8 @@ "message": "Contraseña generada", "description": "Notification message for when a password has been regenerated" }, - "saveLoginToBitwarden": { - "message": "¿Guardar inicio de sesión en Bitwarden?", + "saveToBitwarden": { + "message": "Guardar en Bitwarden", "description": "Confirmation message for saving a login to Bitwarden" }, "spaceCharacterDescriptor": { @@ -5051,7 +5080,7 @@ "message": "Beta" }, "importantNotice": { - "message": "Important notice" + "message": "Aviso importante" }, "setupTwoStepLogin": { "message": "Set up two-step login" @@ -5063,10 +5092,10 @@ "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": "Recuérdame más tarde" }, "newDeviceVerificationNoticePageOneFormContent": { - "message": "Do you have reliable access to your email, $EMAIL$?", + "message": "¿Tienes acceso fiable a tu correo electrónico, $EMAIL$?", "placeholders": { "email": { "content": "$1", @@ -5075,7 +5104,7 @@ } }, "newDeviceVerificationNoticePageOneEmailAccessNo": { - "message": "No, I do not" + "message": "No, no lo tengo" }, "newDeviceVerificationNoticePageOneEmailAccessYes": { "message": "Sí, puedo acceder a mi correo electrónico de forma fiable" @@ -5096,16 +5125,16 @@ "message": "Extraancho" }, "sshKeyWrongPassword": { - "message": "The password you entered is incorrect." + "message": "La contraseña introducida es incorrecta." }, "importSshKey": { - "message": "Import" + "message": "Importar" }, "confirmSshKeyPassword": { - "message": "Confirm password" + "message": "Confirmar contraseña" }, "enterSshKeyPasswordDesc": { - "message": "Enter the password for the SSH key." + "message": "Introduce la contraseña para la clave SSH." }, "enterSshKeyPassword": { "message": "Enter password" @@ -5139,5 +5168,32 @@ }, "changeAtRiskPassword": { "message": "Change at-risk password" + }, + "introCarouselLabel": { + "message": "Welcome to Bitwarden" + }, + "securityPrioritized": { + "message": "Security, prioritized" + }, + "securityPrioritizedBody": { + "message": "Save logins, cards, and identities to your secure vault. Bitwarden uses zero-knowledge, end-to-end encryption to protect what’s important to you." + }, + "quickLogin": { + "message": "Quick and easy login" + }, + "quickLoginBody": { + "message": "Set up biometric unlock and autofill to log into your accounts without typing a single letter." + }, + "secureUser": { + "message": "Level up your logins" + }, + "secureUserBody": { + "message": "Use the generator to create and save strong, unique passwords for all your accounts." + }, + "secureDevices": { + "message": "Your data, when and where you need it" + }, + "secureDevicesBody": { + "message": "Save unlimited passwords across unlimited devices with Bitwarden mobile, browser, and desktop apps." } } diff --git a/apps/browser/src/_locales/et/messages.json b/apps/browser/src/_locales/et/messages.json index 2daf5f9d7f0..46731c85cfa 100644 --- a/apps/browser/src/_locales/et/messages.json +++ b/apps/browser/src/_locales/et/messages.json @@ -1098,6 +1098,31 @@ "message": "Login updated", "description": "Message displayed when login details are successfully updated." }, + "loginUpdateTaskSuccess": { + "message": "Great job! You took the steps to make you and $ORGANIZATION$ more secure.", + "placeholders": { + "organization": { + "content": "$1" + } + }, + "description": "Shown to user after login is updated." + }, + "loginUpdateTaskSuccessAdditional": { + "message": "Thank you for making $ORGANIZATION$ more secure. You have $TASK_COUNT$ more passwords to update.", + "placeholders": { + "organization": { + "content": "$1" + }, + "task_count": { + "content": "$2" + } + }, + "description": "Shown to user after login is updated." + }, + "nextSecurityTaskAction": { + "message": "Change next password", + "description": "Message prompting user to undertake completion of another security task." + }, "saveFailure": { "message": "Error saving", "description": "Error message shown when the system fails to save login details." @@ -1391,24 +1416,12 @@ "premiumRequiredDesc": { "message": "Selle funktsiooni kasutamiseks on vajalik tasulist kontot omada." }, - "enterVerificationCodeApp": { - "message": "Sisesta autentimise rakendusest 6 kohaline number." - }, "authenticationTimeout": { "message": "Authentication timeout" }, "authenticationSessionTimedOut": { "message": "The authentication session timed out. Please restart the login process." }, - "enterVerificationCodeEmail": { - "message": "Sisesta 6 kohaline number, mis saadeti e-posti aadressile $EMAIL$.", - "placeholders": { - "email": { - "content": "$1", - "example": "example@gmail.com" - } - } - }, "verificationCodeEmailSent": { "message": "Kinnituskood saadeti e-posti aadressile $EMAIL$.", "placeholders": { @@ -1418,18 +1431,9 @@ } } }, - "rememberMe": { - "message": "Jäta mind meelde" - }, "dontAskAgainOnThisDeviceFor30Days": { "message": "Don't ask again on this device for 30 days" }, - "sendVerificationCodeEmailAgain": { - "message": "Saada kinnituskood uuesti e-postile" - }, - "useAnotherTwoStepMethod": { - "message": "Kasuta teist kaheastmelist sisselogimise meetodit" - }, "selectAnotherMethod": { "message": "Select another method", "description": "Select another two-step login method" @@ -1437,18 +1441,9 @@ "useYourRecoveryCode": { "message": "Use your recovery code" }, - "insertYubiKey": { - "message": "Sisesta oma YubiKey arvuti USB porti ja kliki sellele nupule." - }, "insertU2f": { "message": "Sisesta oma turvaline võti arvuti USB porti. Kui sellel on nupp, siis vajuta seda." }, - "webAuthnNewTab": { - "message": "Jätka WebAuthn 2FA kinnitamisega uuel vahelehel." - }, - "webAuthnNewTabOpen": { - "message": "Ava uus vahekaart" - }, "openInNewTab": { "message": "Open in new tab" }, @@ -2327,6 +2322,9 @@ "privacyPolicy": { "message": "Privaatsuspoliitika" }, + "yourNewPasswordCannotBeTheSameAsYourCurrentPassword": { + "message": "Your new password cannot be the same as your current password." + }, "hintEqualsPassword": { "message": "Parooli vihje ei saa olla sama mis parool ise." }, @@ -2534,15 +2532,15 @@ "message": "Your organization passwords are at-risk because they are weak, reused, and/or exposed.", "description": "Description of the review at-risk login slide on the at-risk password page carousel" }, - "reviewAtRiskLoginSlideImgAlt": { - "message": "Illustration of a list of logins that are at-risk" + "reviewAtRiskLoginSlideImgAltPeriod": { + "message": "Illustration of a list of logins that are at-risk." }, "generatePasswordSlideDesc": { "message": "Quickly generate a strong, unique password with the Bitwarden autofill menu on the at-risk site.", "description": "Description of the generate password slide on the at-risk password page carousel" }, - "generatePasswordSlideImgAlt": { - "message": "Illustration of the Bitwarden autofill menu displaying a generated password" + "generatePasswordSlideImgAltPeriod": { + "message": "Illustration of the Bitwarden autofill menu displaying a generated password." }, "updateInBitwarden": { "message": "Update in Bitwarden" @@ -2551,8 +2549,8 @@ "message": "Bitwarden will then prompt you to update the password in the password manager.", "description": "Description of the update in Bitwarden slide on the at-risk password page carousel" }, - "updateInBitwardenSlideImgAlt": { - "message": "Illustration of a Bitwarden’s notification prompting the user to update the login" + "updateInBitwardenSlideImgAltPeriod": { + "message": "Illustration of a Bitwarden’s notification prompting the user to update the login." }, "turnOnAutofill": { "message": "Turn on autofill" @@ -3007,6 +3005,15 @@ } } }, + "exportingIndividualVaultWithAttachmentsDescription": { + "message": "Only the individual vault items including attachments associated with $EMAIL$ will be exported. Organization vault items will not be included", + "placeholders": { + "email": { + "content": "$1", + "example": "name@example.com" + } + } + }, "exportingOrganizationVaultTitle": { "message": "Exporting organization vault" }, @@ -3839,15 +3846,9 @@ "duoHealthCheckResultsInNullAuthUrlError": { "message": "Error connecting with the Duo service. Use a different two-step login method or contact Duo for assistance." }, - "launchDuoAndFollowStepsToFinishLoggingIn": { - "message": "Launch Duo and follow the steps to finish logging in." - }, "duoRequiredForAccount": { "message": "Duo two-step login is required for your account." }, - "popoutTheExtensionToCompleteLogin": { - "message": "Popout the extension to complete login." - }, "popoutExtension": { "message": "Popout extension" }, @@ -4270,6 +4271,20 @@ } } }, + "viewItemTitleWithField": { + "message": "View item - $ITEMNAME$ - $FIELD$", + "description": "Title for a link that opens a view for an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + }, + "field": { + "content": "$2", + "example": "Username" + } + } + }, "autofillTitle": { "message": "Autofill - $ITEMNAME$", "description": "Title for a button that autofills a login item.", @@ -4280,6 +4295,20 @@ } } }, + "autofillTitleWithField": { + "message": "Autofill - $ITEMNAME$ - $FIELD$", + "description": "Title for a button that autofills a login item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + }, + "field": { + "content": "$2", + "example": "Username" + } + } + }, "copyFieldValue": { "message": "Copy $FIELD$, $VALUE$", "description": "Title for a button that copies a field value to the clipboard.", @@ -4899,8 +4928,8 @@ "message": "Password regenerated", "description": "Notification message for when a password has been regenerated" }, - "saveLoginToBitwarden": { - "message": "Save login to Bitwarden?", + "saveToBitwarden": { + "message": "Save to Bitwarden", "description": "Confirmation message for saving a login to Bitwarden" }, "spaceCharacterDescriptor": { @@ -5139,5 +5168,32 @@ }, "changeAtRiskPassword": { "message": "Change at-risk password" + }, + "introCarouselLabel": { + "message": "Welcome to Bitwarden" + }, + "securityPrioritized": { + "message": "Security, prioritized" + }, + "securityPrioritizedBody": { + "message": "Save logins, cards, and identities to your secure vault. Bitwarden uses zero-knowledge, end-to-end encryption to protect what’s important to you." + }, + "quickLogin": { + "message": "Quick and easy login" + }, + "quickLoginBody": { + "message": "Set up biometric unlock and autofill to log into your accounts without typing a single letter." + }, + "secureUser": { + "message": "Level up your logins" + }, + "secureUserBody": { + "message": "Use the generator to create and save strong, unique passwords for all your accounts." + }, + "secureDevices": { + "message": "Your data, when and where you need it" + }, + "secureDevicesBody": { + "message": "Save unlimited passwords across unlimited devices with Bitwarden mobile, browser, and desktop apps." } } diff --git a/apps/browser/src/_locales/eu/messages.json b/apps/browser/src/_locales/eu/messages.json index b1e1ca3526b..687e6a52473 100644 --- a/apps/browser/src/_locales/eu/messages.json +++ b/apps/browser/src/_locales/eu/messages.json @@ -1098,6 +1098,31 @@ "message": "Login updated", "description": "Message displayed when login details are successfully updated." }, + "loginUpdateTaskSuccess": { + "message": "Great job! You took the steps to make you and $ORGANIZATION$ more secure.", + "placeholders": { + "organization": { + "content": "$1" + } + }, + "description": "Shown to user after login is updated." + }, + "loginUpdateTaskSuccessAdditional": { + "message": "Thank you for making $ORGANIZATION$ more secure. You have $TASK_COUNT$ more passwords to update.", + "placeholders": { + "organization": { + "content": "$1" + }, + "task_count": { + "content": "$2" + } + }, + "description": "Shown to user after login is updated." + }, + "nextSecurityTaskAction": { + "message": "Change next password", + "description": "Message prompting user to undertake completion of another security task." + }, "saveFailure": { "message": "Error saving", "description": "Error message shown when the system fails to save login details." @@ -1391,24 +1416,12 @@ "premiumRequiredDesc": { "message": "Premium bazkidetza beharrezkoa da ezaugarri hau erabiltzeko." }, - "enterVerificationCodeApp": { - "message": "Sartu zure autentifikazio aplikazioaren 6 digituko egiaztatze kodea." - }, "authenticationTimeout": { "message": "Authentication timeout" }, "authenticationSessionTimedOut": { "message": "The authentication session timed out. Please restart the login process." }, - "enterVerificationCodeEmail": { - "message": "Sartu $EMAIL$-era bidalitako 6 digituko egiaztatze-kodea.", - "placeholders": { - "email": { - "content": "$1", - "example": "example@gmail.com" - } - } - }, "verificationCodeEmailSent": { "message": "Egiaztatze emaila $EMAIL$-era bidalia.", "placeholders": { @@ -1418,18 +1431,9 @@ } } }, - "rememberMe": { - "message": "Gogora nazazu" - }, "dontAskAgainOnThisDeviceFor30Days": { "message": "Don't ask again on this device for 30 days" }, - "sendVerificationCodeEmailAgain": { - "message": "Berbidali email bidezko egiaztatze-kodea." - }, - "useAnotherTwoStepMethod": { - "message": "Erabili bi urratseko saio hasierarako beste modu bat" - }, "selectAnotherMethod": { "message": "Select another method", "description": "Select another two-step login method" @@ -1437,18 +1441,9 @@ "useYourRecoveryCode": { "message": "Use your recovery code" }, - "insertYubiKey": { - "message": "Sartu zure YubiKey-a ordenagailuko USB atakan, ondoren, sakatu bere botoia." - }, "insertU2f": { "message": "Sartu zure segurtasun-gakoa ordenagailuaren USB atakan. Botoia badu, sakatu ezazu." }, - "webAuthnNewTab": { - "message": "WebAuthn 2FA egiaztatzea hasteko. Egin klik beheko botoian fitxa berria irekitzeko eta jarraitu fitxa berriko jarraibideei." - }, - "webAuthnNewTabOpen": { - "message": "Ireki fitxa berria" - }, "openInNewTab": { "message": "Open in new tab" }, @@ -2327,6 +2322,9 @@ "privacyPolicy": { "message": "Pribatutasun politika" }, + "yourNewPasswordCannotBeTheSameAsYourCurrentPassword": { + "message": "Your new password cannot be the same as your current password." + }, "hintEqualsPassword": { "message": "Zure pasahitza ezin da izan zure pasahitzaren pistaren berdina." }, @@ -2534,15 +2532,15 @@ "message": "Your organization passwords are at-risk because they are weak, reused, and/or exposed.", "description": "Description of the review at-risk login slide on the at-risk password page carousel" }, - "reviewAtRiskLoginSlideImgAlt": { - "message": "Illustration of a list of logins that are at-risk" + "reviewAtRiskLoginSlideImgAltPeriod": { + "message": "Illustration of a list of logins that are at-risk." }, "generatePasswordSlideDesc": { "message": "Quickly generate a strong, unique password with the Bitwarden autofill menu on the at-risk site.", "description": "Description of the generate password slide on the at-risk password page carousel" }, - "generatePasswordSlideImgAlt": { - "message": "Illustration of the Bitwarden autofill menu displaying a generated password" + "generatePasswordSlideImgAltPeriod": { + "message": "Illustration of the Bitwarden autofill menu displaying a generated password." }, "updateInBitwarden": { "message": "Update in Bitwarden" @@ -2551,8 +2549,8 @@ "message": "Bitwarden will then prompt you to update the password in the password manager.", "description": "Description of the update in Bitwarden slide on the at-risk password page carousel" }, - "updateInBitwardenSlideImgAlt": { - "message": "Illustration of a Bitwarden’s notification prompting the user to update the login" + "updateInBitwardenSlideImgAltPeriod": { + "message": "Illustration of a Bitwarden’s notification prompting the user to update the login." }, "turnOnAutofill": { "message": "Turn on autofill" @@ -3007,6 +3005,15 @@ } } }, + "exportingIndividualVaultWithAttachmentsDescription": { + "message": "Only the individual vault items including attachments associated with $EMAIL$ will be exported. Organization vault items will not be included", + "placeholders": { + "email": { + "content": "$1", + "example": "name@example.com" + } + } + }, "exportingOrganizationVaultTitle": { "message": "Exporting organization vault" }, @@ -3839,15 +3846,9 @@ "duoHealthCheckResultsInNullAuthUrlError": { "message": "Error connecting with the Duo service. Use a different two-step login method or contact Duo for assistance." }, - "launchDuoAndFollowStepsToFinishLoggingIn": { - "message": "Launch Duo and follow the steps to finish logging in." - }, "duoRequiredForAccount": { "message": "Duo two-step login is required for your account." }, - "popoutTheExtensionToCompleteLogin": { - "message": "Popout the extension to complete login." - }, "popoutExtension": { "message": "Popout extension" }, @@ -4270,6 +4271,20 @@ } } }, + "viewItemTitleWithField": { + "message": "View item - $ITEMNAME$ - $FIELD$", + "description": "Title for a link that opens a view for an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + }, + "field": { + "content": "$2", + "example": "Username" + } + } + }, "autofillTitle": { "message": "Autofill - $ITEMNAME$", "description": "Title for a button that autofills a login item.", @@ -4280,6 +4295,20 @@ } } }, + "autofillTitleWithField": { + "message": "Autofill - $ITEMNAME$ - $FIELD$", + "description": "Title for a button that autofills a login item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + }, + "field": { + "content": "$2", + "example": "Username" + } + } + }, "copyFieldValue": { "message": "Copy $FIELD$, $VALUE$", "description": "Title for a button that copies a field value to the clipboard.", @@ -4899,8 +4928,8 @@ "message": "Password regenerated", "description": "Notification message for when a password has been regenerated" }, - "saveLoginToBitwarden": { - "message": "Save login to Bitwarden?", + "saveToBitwarden": { + "message": "Save to Bitwarden", "description": "Confirmation message for saving a login to Bitwarden" }, "spaceCharacterDescriptor": { @@ -5139,5 +5168,32 @@ }, "changeAtRiskPassword": { "message": "Change at-risk password" + }, + "introCarouselLabel": { + "message": "Welcome to Bitwarden" + }, + "securityPrioritized": { + "message": "Security, prioritized" + }, + "securityPrioritizedBody": { + "message": "Save logins, cards, and identities to your secure vault. Bitwarden uses zero-knowledge, end-to-end encryption to protect what’s important to you." + }, + "quickLogin": { + "message": "Quick and easy login" + }, + "quickLoginBody": { + "message": "Set up biometric unlock and autofill to log into your accounts without typing a single letter." + }, + "secureUser": { + "message": "Level up your logins" + }, + "secureUserBody": { + "message": "Use the generator to create and save strong, unique passwords for all your accounts." + }, + "secureDevices": { + "message": "Your data, when and where you need it" + }, + "secureDevicesBody": { + "message": "Save unlimited passwords across unlimited devices with Bitwarden mobile, browser, and desktop apps." } } diff --git a/apps/browser/src/_locales/fa/messages.json b/apps/browser/src/_locales/fa/messages.json index 2b3d66ad104..8e94676b17e 100644 --- a/apps/browser/src/_locales/fa/messages.json +++ b/apps/browser/src/_locales/fa/messages.json @@ -1098,6 +1098,31 @@ "message": "Login updated", "description": "Message displayed when login details are successfully updated." }, + "loginUpdateTaskSuccess": { + "message": "Great job! You took the steps to make you and $ORGANIZATION$ more secure.", + "placeholders": { + "organization": { + "content": "$1" + } + }, + "description": "Shown to user after login is updated." + }, + "loginUpdateTaskSuccessAdditional": { + "message": "Thank you for making $ORGANIZATION$ more secure. You have $TASK_COUNT$ more passwords to update.", + "placeholders": { + "organization": { + "content": "$1" + }, + "task_count": { + "content": "$2" + } + }, + "description": "Shown to user after login is updated." + }, + "nextSecurityTaskAction": { + "message": "Change next password", + "description": "Message prompting user to undertake completion of another security task." + }, "saveFailure": { "message": "Error saving", "description": "Error message shown when the system fails to save login details." @@ -1391,24 +1416,12 @@ "premiumRequiredDesc": { "message": "برای استفاده از این ویژگی عضویت پرمیوم لازم است." }, - "enterVerificationCodeApp": { - "message": "کد ۶ رقمی تأیید را از برنامه احراز هویت وارد کنید." - }, "authenticationTimeout": { "message": "Authentication timeout" }, "authenticationSessionTimedOut": { "message": "The authentication session timed out. Please restart the login process." }, - "enterVerificationCodeEmail": { - "message": "کد ۶ رقمی تأیید را که به $EMAIL$ ایمیل شده را وارد کنید.", - "placeholders": { - "email": { - "content": "$1", - "example": "example@gmail.com" - } - } - }, "verificationCodeEmailSent": { "message": "ایمیل تأیید به $EMAIL$ ارسال شد.", "placeholders": { @@ -1418,18 +1431,9 @@ } } }, - "rememberMe": { - "message": "مرا به خاطر بسپار" - }, "dontAskAgainOnThisDeviceFor30Days": { "message": "Don't ask again on this device for 30 days" }, - "sendVerificationCodeEmailAgain": { - "message": "ارسال دوباره ایمیل کد تأیید" - }, - "useAnotherTwoStepMethod": { - "message": "استفاده از روش ورود دو مرحله‌ای دیگر" - }, "selectAnotherMethod": { "message": "Select another method", "description": "Select another two-step login method" @@ -1437,18 +1441,9 @@ "useYourRecoveryCode": { "message": "Use your recovery code" }, - "insertYubiKey": { - "message": "YubiKey خود را وارد پورت USB رایانه کنید، بعد دکمه آن را بفشارید." - }, "insertU2f": { "message": "کلید امنیتی خود را وارد پورت USB رایانه کنید، اگر دکمه ای دارد آن را بفشارید." }, - "webAuthnNewTab": { - "message": "تأیید WebAuthn 2FA را در برگه جدید ادامه دهید." - }, - "webAuthnNewTabOpen": { - "message": "باز کردن زبانه جدید" - }, "openInNewTab": { "message": "Open in new tab" }, @@ -2327,6 +2322,9 @@ "privacyPolicy": { "message": "سیاست حفظ حریم خصوصی" }, + "yourNewPasswordCannotBeTheSameAsYourCurrentPassword": { + "message": "Your new password cannot be the same as your current password." + }, "hintEqualsPassword": { "message": "اشاره به کلمه عبور شما نمی‌تواند همان کلمه عبور شما باشد." }, @@ -2534,15 +2532,15 @@ "message": "Your organization passwords are at-risk because they are weak, reused, and/or exposed.", "description": "Description of the review at-risk login slide on the at-risk password page carousel" }, - "reviewAtRiskLoginSlideImgAlt": { - "message": "Illustration of a list of logins that are at-risk" + "reviewAtRiskLoginSlideImgAltPeriod": { + "message": "Illustration of a list of logins that are at-risk." }, "generatePasswordSlideDesc": { "message": "Quickly generate a strong, unique password with the Bitwarden autofill menu on the at-risk site.", "description": "Description of the generate password slide on the at-risk password page carousel" }, - "generatePasswordSlideImgAlt": { - "message": "Illustration of the Bitwarden autofill menu displaying a generated password" + "generatePasswordSlideImgAltPeriod": { + "message": "Illustration of the Bitwarden autofill menu displaying a generated password." }, "updateInBitwarden": { "message": "Update in Bitwarden" @@ -2551,8 +2549,8 @@ "message": "Bitwarden will then prompt you to update the password in the password manager.", "description": "Description of the update in Bitwarden slide on the at-risk password page carousel" }, - "updateInBitwardenSlideImgAlt": { - "message": "Illustration of a Bitwarden’s notification prompting the user to update the login" + "updateInBitwardenSlideImgAltPeriod": { + "message": "Illustration of a Bitwarden’s notification prompting the user to update the login." }, "turnOnAutofill": { "message": "Turn on autofill" @@ -3007,6 +3005,15 @@ } } }, + "exportingIndividualVaultWithAttachmentsDescription": { + "message": "Only the individual vault items including attachments associated with $EMAIL$ will be exported. Organization vault items will not be included", + "placeholders": { + "email": { + "content": "$1", + "example": "name@example.com" + } + } + }, "exportingOrganizationVaultTitle": { "message": "Exporting organization vault" }, @@ -3839,15 +3846,9 @@ "duoHealthCheckResultsInNullAuthUrlError": { "message": "Error connecting with the Duo service. Use a different two-step login method or contact Duo for assistance." }, - "launchDuoAndFollowStepsToFinishLoggingIn": { - "message": "Launch Duo and follow the steps to finish logging in." - }, "duoRequiredForAccount": { "message": "Duo two-step login is required for your account." }, - "popoutTheExtensionToCompleteLogin": { - "message": "Popout the extension to complete login." - }, "popoutExtension": { "message": "Popout extension" }, @@ -4270,6 +4271,20 @@ } } }, + "viewItemTitleWithField": { + "message": "View item - $ITEMNAME$ - $FIELD$", + "description": "Title for a link that opens a view for an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + }, + "field": { + "content": "$2", + "example": "Username" + } + } + }, "autofillTitle": { "message": "Autofill - $ITEMNAME$", "description": "Title for a button that autofills a login item.", @@ -4280,6 +4295,20 @@ } } }, + "autofillTitleWithField": { + "message": "Autofill - $ITEMNAME$ - $FIELD$", + "description": "Title for a button that autofills a login item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + }, + "field": { + "content": "$2", + "example": "Username" + } + } + }, "copyFieldValue": { "message": "Copy $FIELD$, $VALUE$", "description": "Title for a button that copies a field value to the clipboard.", @@ -4899,8 +4928,8 @@ "message": "Password regenerated", "description": "Notification message for when a password has been regenerated" }, - "saveLoginToBitwarden": { - "message": "Save login to Bitwarden?", + "saveToBitwarden": { + "message": "Save to Bitwarden", "description": "Confirmation message for saving a login to Bitwarden" }, "spaceCharacterDescriptor": { @@ -5139,5 +5168,32 @@ }, "changeAtRiskPassword": { "message": "Change at-risk password" + }, + "introCarouselLabel": { + "message": "Welcome to Bitwarden" + }, + "securityPrioritized": { + "message": "Security, prioritized" + }, + "securityPrioritizedBody": { + "message": "Save logins, cards, and identities to your secure vault. Bitwarden uses zero-knowledge, end-to-end encryption to protect what’s important to you." + }, + "quickLogin": { + "message": "Quick and easy login" + }, + "quickLoginBody": { + "message": "Set up biometric unlock and autofill to log into your accounts without typing a single letter." + }, + "secureUser": { + "message": "Level up your logins" + }, + "secureUserBody": { + "message": "Use the generator to create and save strong, unique passwords for all your accounts." + }, + "secureDevices": { + "message": "Your data, when and where you need it" + }, + "secureDevicesBody": { + "message": "Save unlimited passwords across unlimited devices with Bitwarden mobile, browser, and desktop apps." } } diff --git a/apps/browser/src/_locales/fi/messages.json b/apps/browser/src/_locales/fi/messages.json index a37bd0235c1..5e9a14d6aaf 100644 --- a/apps/browser/src/_locales/fi/messages.json +++ b/apps/browser/src/_locales/fi/messages.json @@ -1098,6 +1098,31 @@ "message": "Kirjautumistieto päivitettiin", "description": "Message displayed when login details are successfully updated." }, + "loginUpdateTaskSuccess": { + "message": "Hienoa työtä! Otit askeleita, joilla teet itsestäsi ja organisaatiosta $ORGANIZATION$ turvallisemman.", + "placeholders": { + "organization": { + "content": "$1" + } + }, + "description": "Shown to user after login is updated." + }, + "loginUpdateTaskSuccessAdditional": { + "message": "Kiitos, että teet organisaatiosta $ORGANIZATION$ turvallisemman. Sinulla on vielä $TASK_COUNT$ salasanaa päivitettävänä.", + "placeholders": { + "organization": { + "content": "$1" + }, + "task_count": { + "content": "$2" + } + }, + "description": "Shown to user after login is updated." + }, + "nextSecurityTaskAction": { + "message": "Vaihda seuraava salasana", + "description": "Message prompting user to undertake completion of another security task." + }, "saveFailure": { "message": "Virhe tallennettaessa", "description": "Error message shown when the system fails to save login details." @@ -1391,24 +1416,12 @@ "premiumRequiredDesc": { "message": "Tämä ominaisuus edellyttää Premium-jäsenyyttä." }, - "enterVerificationCodeApp": { - "message": "Syötä todennussovelluksesi näyttämä kuusinumeroinen todennuskoodi." - }, "authenticationTimeout": { "message": "Todennuksen aikakatkaisu" }, "authenticationSessionTimedOut": { "message": "Todennusistunto aikakatkaistiin. Ole hyvä ja aloita kirjautumisprosessi uudelleen." }, - "enterVerificationCodeEmail": { - "message": "Syötä osoitteeseen $EMAIL$ lähetetty kuusinumeroinen todennuskoodi.", - "placeholders": { - "email": { - "content": "$1", - "example": "example@gmail.com" - } - } - }, "verificationCodeEmailSent": { "message": "Todennussähköposti lähetettiin osoitteeseen $EMAIL$.", "placeholders": { @@ -1418,18 +1431,9 @@ } } }, - "rememberMe": { - "message": "Muista minut" - }, "dontAskAgainOnThisDeviceFor30Days": { "message": "Älä kysy uudelleen tällä laitteella 30 päivään" }, - "sendVerificationCodeEmailAgain": { - "message": "Lähetä todennuskoodi sähköpostitse uudelleen" - }, - "useAnotherTwoStepMethod": { - "message": "Käytä vaihtoehtoista todennustapaa" - }, "selectAnotherMethod": { "message": "Valitse vaihtoehtoinen tapa", "description": "Select another two-step login method" @@ -1437,18 +1441,9 @@ "useYourRecoveryCode": { "message": "Käytä palautuskoodiasi" }, - "insertYubiKey": { - "message": "Kytke YubiKey-suojausavaimesi tietokoneen USB-porttiin ja kosketa sen painiketta." - }, "insertU2f": { "message": "Kytke suojausavaimesi tietokoneen USB-porttiin. Jos laitteessa on painike, paina sitä." }, - "webAuthnNewTab": { - "message": "Aloittaaksesi kaksivaiheisen WebAuthn-tunnistautumisen, seuraa alla olevasta painikkeesta uuteen välilehteen avautuvia ohjeita." - }, - "webAuthnNewTabOpen": { - "message": "Avaa uusi välilehti" - }, "openInNewTab": { "message": "Avaa uudessa välilehdessä" }, @@ -2327,6 +2322,9 @@ "privacyPolicy": { "message": "Tietosuojakäytäntö" }, + "yourNewPasswordCannotBeTheSameAsYourCurrentPassword": { + "message": "Uusi salasanasi ei voi olla sama kuin nykyinen salasanasi." + }, "hintEqualsPassword": { "message": "Salasanavihjeesi ei voi olla sama kuin salasanasi." }, @@ -2534,15 +2532,15 @@ "message": "Organisaatiosalasanasi ovat vaarantuneet, koska ne ovat heikkoja, toistuvasti käytettyjä ja/tai paljastuneita.", "description": "Description of the review at-risk login slide on the at-risk password page carousel" }, - "reviewAtRiskLoginSlideImgAlt": { - "message": "Kuvitus vaarantuneiden kirjautumistietojen luettelosta" + "reviewAtRiskLoginSlideImgAltPeriod": { + "message": "Kuvitus vaarantuneiden kirjautumistietojen luettelosta." }, "generatePasswordSlideDesc": { "message": "Luo vahva ja ainutlaatuinen salasana nopeasti Bitwardenin automaattitäytön valikosta vaarantuneella sivustolla.", "description": "Description of the generate password slide on the at-risk password page carousel" }, - "generatePasswordSlideImgAlt": { - "message": "Kuvitus Bitwardenin automaattitäytön valikosta, luodulla salasanalla" + "generatePasswordSlideImgAltPeriod": { + "message": "Kuvitus Bitwardenin automaattitäytön valikosta, luodulla salasanalla." }, "updateInBitwarden": { "message": "Päivitä Bitwardenissa" @@ -2551,8 +2549,8 @@ "message": "Bitwarden pyytää sinua sitten päivittämään salasanan salasanahallinnassa.", "description": "Description of the update in Bitwarden slide on the at-risk password page carousel" }, - "updateInBitwardenSlideImgAlt": { - "message": "Kuvitus ilmoituksesta, jossa Bitwarden tarjoaa kirjautumistiedon päivitystä" + "updateInBitwardenSlideImgAltPeriod": { + "message": "Kuvitus ilmoituksesta, jossa Bitwarden tarjoaa kirjautumistiedon päivitystä." }, "turnOnAutofill": { "message": "Ota automaattitäyttö käyttöön" @@ -3007,6 +3005,15 @@ } } }, + "exportingIndividualVaultWithAttachmentsDescription": { + "message": "Vain henkilökohtaiset tunnukseen $EMAIL$ liittyvät holvin kohteet liitetiedostoineen viedään. Organisaation holvikohteita ei sisällytetä", + "placeholders": { + "email": { + "content": "$1", + "example": "name@example.com" + } + } + }, "exportingOrganizationVaultTitle": { "message": "Organisaation holvin vienti" }, @@ -3839,15 +3846,9 @@ "duoHealthCheckResultsInNullAuthUrlError": { "message": "Virhe yhdistettäessä Duo-palveluun. Käytä vaihtoehtoista todennustapaa tai ole yhteydessä Duon asiakaspalveluun saadaksesi apua." }, - "launchDuoAndFollowStepsToFinishLoggingIn": { - "message": "Avaa Duo ja viimeistele kirjautuminen seuraamalla ohjeita." - }, "duoRequiredForAccount": { "message": "Tilillesi kirjautuminen vaatii Duo-vahvistuksen." }, - "popoutTheExtensionToCompleteLogin": { - "message": "Viimeistele kirjautuminen avaamalla laajennus erilliseen ikkunaan." - }, "popoutExtension": { "message": "Irrota laajennus" }, @@ -4270,6 +4271,20 @@ } } }, + "viewItemTitleWithField": { + "message": "Tarkastele kohdetta - $ITEMNAME$ - $FIELD$", + "description": "Title for a link that opens a view for an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + }, + "field": { + "content": "$2", + "example": "Username" + } + } + }, "autofillTitle": { "message": "Automaattitäytä - $ITEMNAME$", "description": "Title for a button that autofills a login item.", @@ -4280,6 +4295,20 @@ } } }, + "autofillTitleWithField": { + "message": "Automaattitäytä - $ITEMNAME$ - $FIELD$", + "description": "Title for a button that autofills a login item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + }, + "field": { + "content": "$2", + "example": "Username" + } + } + }, "copyFieldValue": { "message": "Kopioi $FIELD$, $VALUE$", "description": "Title for a button that copies a field value to the clipboard.", @@ -4899,8 +4928,8 @@ "message": "Salasana luotiin uudelleen", "description": "Notification message for when a password has been regenerated" }, - "saveLoginToBitwarden": { - "message": "Tallennetaanko kirjautumistieto Bitwardeniin?", + "saveToBitwarden": { + "message": "Tallenna Bitwardeniin", "description": "Confirmation message for saving a login to Bitwarden" }, "spaceCharacterDescriptor": { @@ -5139,5 +5168,32 @@ }, "changeAtRiskPassword": { "message": "Vaihda vaarantunut salasana" + }, + "introCarouselLabel": { + "message": "Tervetuloa Bitwardeniin" + }, + "securityPrioritized": { + "message": "Tietoturva etusijalla" + }, + "securityPrioritizedBody": { + "message": "Tallenna kirjautumistiedot, kortit ja henkilöllisyydet suojattuun holviisi. Bitwarden suojaa tärkeät tietosi nollatietoisella päästä päähän -salauksella." + }, + "quickLogin": { + "message": "Nopea ja helppo kirjautuminen" + }, + "quickLoginBody": { + "message": "Määritä biometrinen avaus ja automaattitäyttö kirjautuaksesi tileillesi kirjoittamatta yhtäkään kirjainta." + }, + "secureUser": { + "message": "Nosta kirjautumisesi uudelle tasolle" + }, + "secureUserBody": { + "message": "Käytä generaattoria luodaksesi ja tallentaaksesi vahvoja, ainutlaatuisia salasanoja kaikille tileillesi." + }, + "secureDevices": { + "message": "Sinun tietosi, missä ja milloin tarvitset niitä" + }, + "secureDevicesBody": { + "message": "Tallenna rajattomasti salasanoja, rajattomalla määrällä laitteita, Bitwardenin mobiili-, selain- ja työpöytäsovelluksilla." } } diff --git a/apps/browser/src/_locales/fil/messages.json b/apps/browser/src/_locales/fil/messages.json index 9f991843f4f..14820d62f45 100644 --- a/apps/browser/src/_locales/fil/messages.json +++ b/apps/browser/src/_locales/fil/messages.json @@ -1098,6 +1098,31 @@ "message": "Login updated", "description": "Message displayed when login details are successfully updated." }, + "loginUpdateTaskSuccess": { + "message": "Great job! You took the steps to make you and $ORGANIZATION$ more secure.", + "placeholders": { + "organization": { + "content": "$1" + } + }, + "description": "Shown to user after login is updated." + }, + "loginUpdateTaskSuccessAdditional": { + "message": "Thank you for making $ORGANIZATION$ more secure. You have $TASK_COUNT$ more passwords to update.", + "placeholders": { + "organization": { + "content": "$1" + }, + "task_count": { + "content": "$2" + } + }, + "description": "Shown to user after login is updated." + }, + "nextSecurityTaskAction": { + "message": "Change next password", + "description": "Message prompting user to undertake completion of another security task." + }, "saveFailure": { "message": "Error saving", "description": "Error message shown when the system fails to save login details." @@ -1391,24 +1416,12 @@ "premiumRequiredDesc": { "message": "Ang Premium na membership ay kinakailangan upang gamitin ang tampok na ito." }, - "enterVerificationCodeApp": { - "message": "Ipasok ang 6 na digit na code ng pagpapatunay mula sa iyong authenticator app." - }, "authenticationTimeout": { "message": "Authentication timeout" }, "authenticationSessionTimedOut": { "message": "The authentication session timed out. Please restart the login process." }, - "enterVerificationCodeEmail": { - "message": "Ipasok ang 6 na digit na code na na-email sa $EMAIL$.", - "placeholders": { - "email": { - "content": "$1", - "example": "example@gmail.com" - } - } - }, "verificationCodeEmailSent": { "message": "Veripikasyon na email na ipinadala sa $EMAIL$.", "placeholders": { @@ -1418,18 +1431,9 @@ } } }, - "rememberMe": { - "message": "Tandaan mo ako" - }, "dontAskAgainOnThisDeviceFor30Days": { "message": "Don't ask again on this device for 30 days" }, - "sendVerificationCodeEmailAgain": { - "message": "Ipadala muli ang email ng verification code" - }, - "useAnotherTwoStepMethod": { - "message": "Gamitin ang isa pang two-step na paraan ng pag-login" - }, "selectAnotherMethod": { "message": "Select another method", "description": "Select another two-step login method" @@ -1437,18 +1441,9 @@ "useYourRecoveryCode": { "message": "Use your recovery code" }, - "insertYubiKey": { - "message": "I-insert ang iyong YubiKey sa USB port ng iyong computer, pagkatapos ay tindigin ang buton nito." - }, "insertU2f": { "message": "I-insert ang iyong security key sa USB port ng iyong computer. Kung mayroon itong buton, tindigin ito." }, - "webAuthnNewTab": { - "message": "Upang simulan ang WebAuthn 2FA verification. I-click ang buton sa ibaba upang buksan ang isang bagong tab at sundin ang mga tagubilin na ibinigay sa bagong tab." - }, - "webAuthnNewTabOpen": { - "message": "Buksan ang bagong tab" - }, "openInNewTab": { "message": "Open in new tab" }, @@ -2327,6 +2322,9 @@ "privacyPolicy": { "message": "Patakaran sa Privacy" }, + "yourNewPasswordCannotBeTheSameAsYourCurrentPassword": { + "message": "Your new password cannot be the same as your current password." + }, "hintEqualsPassword": { "message": "Hindi pwedeng maging pareho ang password hint at password mo." }, @@ -2534,15 +2532,15 @@ "message": "Your organization passwords are at-risk because they are weak, reused, and/or exposed.", "description": "Description of the review at-risk login slide on the at-risk password page carousel" }, - "reviewAtRiskLoginSlideImgAlt": { - "message": "Illustration of a list of logins that are at-risk" + "reviewAtRiskLoginSlideImgAltPeriod": { + "message": "Illustration of a list of logins that are at-risk." }, "generatePasswordSlideDesc": { "message": "Quickly generate a strong, unique password with the Bitwarden autofill menu on the at-risk site.", "description": "Description of the generate password slide on the at-risk password page carousel" }, - "generatePasswordSlideImgAlt": { - "message": "Illustration of the Bitwarden autofill menu displaying a generated password" + "generatePasswordSlideImgAltPeriod": { + "message": "Illustration of the Bitwarden autofill menu displaying a generated password." }, "updateInBitwarden": { "message": "Update in Bitwarden" @@ -2551,8 +2549,8 @@ "message": "Bitwarden will then prompt you to update the password in the password manager.", "description": "Description of the update in Bitwarden slide on the at-risk password page carousel" }, - "updateInBitwardenSlideImgAlt": { - "message": "Illustration of a Bitwarden’s notification prompting the user to update the login" + "updateInBitwardenSlideImgAltPeriod": { + "message": "Illustration of a Bitwarden’s notification prompting the user to update the login." }, "turnOnAutofill": { "message": "Turn on autofill" @@ -3007,6 +3005,15 @@ } } }, + "exportingIndividualVaultWithAttachmentsDescription": { + "message": "Only the individual vault items including attachments associated with $EMAIL$ will be exported. Organization vault items will not be included", + "placeholders": { + "email": { + "content": "$1", + "example": "name@example.com" + } + } + }, "exportingOrganizationVaultTitle": { "message": "Exporting organization vault" }, @@ -3839,15 +3846,9 @@ "duoHealthCheckResultsInNullAuthUrlError": { "message": "Error connecting with the Duo service. Use a different two-step login method or contact Duo for assistance." }, - "launchDuoAndFollowStepsToFinishLoggingIn": { - "message": "Launch Duo and follow the steps to finish logging in." - }, "duoRequiredForAccount": { "message": "Duo two-step login is required for your account." }, - "popoutTheExtensionToCompleteLogin": { - "message": "Popout the extension to complete login." - }, "popoutExtension": { "message": "Popout extension" }, @@ -4270,6 +4271,20 @@ } } }, + "viewItemTitleWithField": { + "message": "View item - $ITEMNAME$ - $FIELD$", + "description": "Title for a link that opens a view for an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + }, + "field": { + "content": "$2", + "example": "Username" + } + } + }, "autofillTitle": { "message": "Autofill - $ITEMNAME$", "description": "Title for a button that autofills a login item.", @@ -4280,6 +4295,20 @@ } } }, + "autofillTitleWithField": { + "message": "Autofill - $ITEMNAME$ - $FIELD$", + "description": "Title for a button that autofills a login item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + }, + "field": { + "content": "$2", + "example": "Username" + } + } + }, "copyFieldValue": { "message": "Copy $FIELD$, $VALUE$", "description": "Title for a button that copies a field value to the clipboard.", @@ -4899,8 +4928,8 @@ "message": "Password regenerated", "description": "Notification message for when a password has been regenerated" }, - "saveLoginToBitwarden": { - "message": "Save login to Bitwarden?", + "saveToBitwarden": { + "message": "Save to Bitwarden", "description": "Confirmation message for saving a login to Bitwarden" }, "spaceCharacterDescriptor": { @@ -5139,5 +5168,32 @@ }, "changeAtRiskPassword": { "message": "Change at-risk password" + }, + "introCarouselLabel": { + "message": "Welcome to Bitwarden" + }, + "securityPrioritized": { + "message": "Security, prioritized" + }, + "securityPrioritizedBody": { + "message": "Save logins, cards, and identities to your secure vault. Bitwarden uses zero-knowledge, end-to-end encryption to protect what’s important to you." + }, + "quickLogin": { + "message": "Quick and easy login" + }, + "quickLoginBody": { + "message": "Set up biometric unlock and autofill to log into your accounts without typing a single letter." + }, + "secureUser": { + "message": "Level up your logins" + }, + "secureUserBody": { + "message": "Use the generator to create and save strong, unique passwords for all your accounts." + }, + "secureDevices": { + "message": "Your data, when and where you need it" + }, + "secureDevicesBody": { + "message": "Save unlimited passwords across unlimited devices with Bitwarden mobile, browser, and desktop apps." } } diff --git a/apps/browser/src/_locales/fr/messages.json b/apps/browser/src/_locales/fr/messages.json index 32b6dd0296b..a41c958c6c6 100644 --- a/apps/browser/src/_locales/fr/messages.json +++ b/apps/browser/src/_locales/fr/messages.json @@ -1098,6 +1098,31 @@ "message": "Identifiant mis à jour", "description": "Message displayed when login details are successfully updated." }, + "loginUpdateTaskSuccess": { + "message": "Great job! You took the steps to make you and $ORGANIZATION$ more secure.", + "placeholders": { + "organization": { + "content": "$1" + } + }, + "description": "Shown to user after login is updated." + }, + "loginUpdateTaskSuccessAdditional": { + "message": "Thank you for making $ORGANIZATION$ more secure. You have $TASK_COUNT$ more passwords to update.", + "placeholders": { + "organization": { + "content": "$1" + }, + "task_count": { + "content": "$2" + } + }, + "description": "Shown to user after login is updated." + }, + "nextSecurityTaskAction": { + "message": "Change next password", + "description": "Message prompting user to undertake completion of another security task." + }, "saveFailure": { "message": "Erreur lors de l'enregistrement", "description": "Error message shown when the system fails to save login details." @@ -1391,24 +1416,12 @@ "premiumRequiredDesc": { "message": "Une adhésion Premium est requise pour utiliser cette fonctionnalité." }, - "enterVerificationCodeApp": { - "message": "Saisissez le code de vérification à 6 chiffres depuis votre application d'authentification." - }, "authenticationTimeout": { "message": "Délai d'authentification dépassé" }, "authenticationSessionTimedOut": { "message": "La session d'authentification a expiré. Veuillez redémarrer le processus de connexion." }, - "enterVerificationCodeEmail": { - "message": "Saisissez le code de vérification à 6 chiffres qui a été envoyé par courriel à $EMAIL$.", - "placeholders": { - "email": { - "content": "$1", - "example": "example@gmail.com" - } - } - }, "verificationCodeEmailSent": { "message": "Courriel de vérification envoyé à $EMAIL$.", "placeholders": { @@ -1418,18 +1431,9 @@ } } }, - "rememberMe": { - "message": "Rester connecté" - }, "dontAskAgainOnThisDeviceFor30Days": { "message": "Ne plus demander sur cet appareil pendant 30 jours" }, - "sendVerificationCodeEmailAgain": { - "message": "Envoyer à nouveau le courriel de code de vérification" - }, - "useAnotherTwoStepMethod": { - "message": "Utiliser une autre méthode d'identification en deux étapes" - }, "selectAnotherMethod": { "message": "Sélectionnez une autre méthode", "description": "Select another two-step login method" @@ -1437,18 +1441,9 @@ "useYourRecoveryCode": { "message": "Utilisez votre code de récupération" }, - "insertYubiKey": { - "message": "Insérez votre YubiKey dans le port USB de votre ordinateur puis appuyez sur son bouton." - }, "insertU2f": { "message": "Insérez votre clé de sécurité dans le port USB de votre ordinateur. S'il dispose d'un bouton, appuyez dessus." }, - "webAuthnNewTab": { - "message": "Pour démarrer la vérification 2FA WebAuthn, cliquez sur le bouton ci-dessous et suivez les instructions dans le nouvel onglet." - }, - "webAuthnNewTabOpen": { - "message": "Ouvrir un nouvel onglet" - }, "openInNewTab": { "message": "Ouvrir dans un nouvel onglet" }, @@ -2327,6 +2322,9 @@ "privacyPolicy": { "message": "Politique de confidentialité" }, + "yourNewPasswordCannotBeTheSameAsYourCurrentPassword": { + "message": "Your new password cannot be the same as your current password." + }, "hintEqualsPassword": { "message": "Votre indice de mot de passe ne peut pas être identique à votre mot de passe." }, @@ -2534,15 +2532,15 @@ "message": "Les mots de passe de votre organisation sont à risque, car ils sont faibles, réutilisés et/ou exposés.", "description": "Description of the review at-risk login slide on the at-risk password page carousel" }, - "reviewAtRiskLoginSlideImgAlt": { - "message": "Illustration d'une liste d'identifiants à risque" + "reviewAtRiskLoginSlideImgAltPeriod": { + "message": "Illustration of a list of logins that are at-risk." }, "generatePasswordSlideDesc": { "message": "Générez rapidement un mot de passe fort et unique grâce au menu de saisie automatique de Bitwarden sur le site à risque.", "description": "Description of the generate password slide on the at-risk password page carousel" }, - "generatePasswordSlideImgAlt": { - "message": "Illustration du menu de saisie automatique de Bitwarden affichant un mot de passe généré" + "generatePasswordSlideImgAltPeriod": { + "message": "Illustration of the Bitwarden autofill menu displaying a generated password." }, "updateInBitwarden": { "message": "Mettre à jour dans Bitwarden" @@ -2551,8 +2549,8 @@ "message": "Bitwarden vous demandera alors de mettre à jour le mot de passe dans le gestionnaire de mots de passe.", "description": "Description of the update in Bitwarden slide on the at-risk password page carousel" }, - "updateInBitwardenSlideImgAlt": { - "message": "Illustration d’une notification de Bitwarden invitant l’utilisateur à mettre à jour l'identifiant" + "updateInBitwardenSlideImgAltPeriod": { + "message": "Illustration of a Bitwarden’s notification prompting the user to update the login." }, "turnOnAutofill": { "message": "Activer la saisie automatique" @@ -3007,6 +3005,15 @@ } } }, + "exportingIndividualVaultWithAttachmentsDescription": { + "message": "Only the individual vault items including attachments associated with $EMAIL$ will be exported. Organization vault items will not be included", + "placeholders": { + "email": { + "content": "$1", + "example": "name@example.com" + } + } + }, "exportingOrganizationVaultTitle": { "message": "Export du coffre de l'organisation" }, @@ -3839,15 +3846,9 @@ "duoHealthCheckResultsInNullAuthUrlError": { "message": "Erreur de connexion avec le service Duo. Utilisez une autre méthode de connexion en deux étapes ou contactez Duo pour obtenir de l'aide." }, - "launchDuoAndFollowStepsToFinishLoggingIn": { - "message": "Lancez DUO et suivez les étapes pour terminer la connexion." - }, "duoRequiredForAccount": { "message": "L'authentification à deux facteurs Duo est requise pour votre compte." }, - "popoutTheExtensionToCompleteLogin": { - "message": "Faire apparaître l'extension pour terminer la connexion." - }, "popoutExtension": { "message": "Détacher l'extension" }, @@ -4270,6 +4271,20 @@ } } }, + "viewItemTitleWithField": { + "message": "View item - $ITEMNAME$ - $FIELD$", + "description": "Title for a link that opens a view for an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + }, + "field": { + "content": "$2", + "example": "Username" + } + } + }, "autofillTitle": { "message": "Saisie automatique - $ITEMNAME$", "description": "Title for a button that autofills a login item.", @@ -4280,6 +4295,20 @@ } } }, + "autofillTitleWithField": { + "message": "Autofill - $ITEMNAME$ - $FIELD$", + "description": "Title for a button that autofills a login item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + }, + "field": { + "content": "$2", + "example": "Username" + } + } + }, "copyFieldValue": { "message": "Copier $FIELD$, $VALUE$", "description": "Title for a button that copies a field value to the clipboard.", @@ -4899,8 +4928,8 @@ "message": "Mot de passe régénéré", "description": "Notification message for when a password has been regenerated" }, - "saveLoginToBitwarden": { - "message": "Enregistrer l'identifiant sur Bitwarden ?", + "saveToBitwarden": { + "message": "Save to Bitwarden", "description": "Confirmation message for saving a login to Bitwarden" }, "spaceCharacterDescriptor": { @@ -5139,5 +5168,32 @@ }, "changeAtRiskPassword": { "message": "Changer le mot de passe à risque" + }, + "introCarouselLabel": { + "message": "Welcome to Bitwarden" + }, + "securityPrioritized": { + "message": "Security, prioritized" + }, + "securityPrioritizedBody": { + "message": "Save logins, cards, and identities to your secure vault. Bitwarden uses zero-knowledge, end-to-end encryption to protect what’s important to you." + }, + "quickLogin": { + "message": "Quick and easy login" + }, + "quickLoginBody": { + "message": "Set up biometric unlock and autofill to log into your accounts without typing a single letter." + }, + "secureUser": { + "message": "Level up your logins" + }, + "secureUserBody": { + "message": "Use the generator to create and save strong, unique passwords for all your accounts." + }, + "secureDevices": { + "message": "Your data, when and where you need it" + }, + "secureDevicesBody": { + "message": "Save unlimited passwords across unlimited devices with Bitwarden mobile, browser, and desktop apps." } } diff --git a/apps/browser/src/_locales/gl/messages.json b/apps/browser/src/_locales/gl/messages.json index 6c0b9cce87b..dc855d6e230 100644 --- a/apps/browser/src/_locales/gl/messages.json +++ b/apps/browser/src/_locales/gl/messages.json @@ -1098,6 +1098,31 @@ "message": "Login updated", "description": "Message displayed when login details are successfully updated." }, + "loginUpdateTaskSuccess": { + "message": "Great job! You took the steps to make you and $ORGANIZATION$ more secure.", + "placeholders": { + "organization": { + "content": "$1" + } + }, + "description": "Shown to user after login is updated." + }, + "loginUpdateTaskSuccessAdditional": { + "message": "Thank you for making $ORGANIZATION$ more secure. You have $TASK_COUNT$ more passwords to update.", + "placeholders": { + "organization": { + "content": "$1" + }, + "task_count": { + "content": "$2" + } + }, + "description": "Shown to user after login is updated." + }, + "nextSecurityTaskAction": { + "message": "Change next password", + "description": "Message prompting user to undertake completion of another security task." + }, "saveFailure": { "message": "Error saving", "description": "Error message shown when the system fails to save login details." @@ -1391,24 +1416,12 @@ "premiumRequiredDesc": { "message": "Requírese un plan Prémium para poder empregar esta función." }, - "enterVerificationCodeApp": { - "message": "Insire o código de 6 díxitos da túa aplicación de autenticación." - }, "authenticationTimeout": { "message": "Tempo límite de autenticación superado" }, "authenticationSessionTimedOut": { "message": "Superouse o tempo límite da sesión de autenticación. Recomeza o proceso." }, - "enterVerificationCodeEmail": { - "message": "Insire o código de verificación de 6 díxitos enviado a $EMAIL$.", - "placeholders": { - "email": { - "content": "$1", - "example": "example@gmail.com" - } - } - }, "verificationCodeEmailSent": { "message": "Enviouse un correo de verificación a $EMAIL$.", "placeholders": { @@ -1418,18 +1431,9 @@ } } }, - "rememberMe": { - "message": "Lémbrame" - }, "dontAskAgainOnThisDeviceFor30Days": { "message": "Don't ask again on this device for 30 days" }, - "sendVerificationCodeEmailAgain": { - "message": "Enviar un novo correo de verificación" - }, - "useAnotherTwoStepMethod": { - "message": "Empregar outro método de verificación en 2 pasos" - }, "selectAnotherMethod": { "message": "Select another method", "description": "Select another two-step login method" @@ -1437,18 +1441,9 @@ "useYourRecoveryCode": { "message": "Use your recovery code" }, - "insertYubiKey": { - "message": "Conecta a túa YubiKey no porto USB, despois preme o seu botón." - }, "insertU2f": { "message": "Conecta a túa YubiKey no porto USB. Se ten un botón, prémeo." }, - "webAuthnNewTab": { - "message": "Para iniciar o proceso de verificación WebAuthn 2FA, clica no botón embaixo e segue as instrucións na pestana que se abrirá." - }, - "webAuthnNewTabOpen": { - "message": "Abrir nova pestana" - }, "openInNewTab": { "message": "Open in new tab" }, @@ -2327,6 +2322,9 @@ "privacyPolicy": { "message": "Política de Privacidade" }, + "yourNewPasswordCannotBeTheSameAsYourCurrentPassword": { + "message": "Your new password cannot be the same as your current password." + }, "hintEqualsPassword": { "message": "A pista do contrasinal non pode ser o contrasinal." }, @@ -2534,15 +2532,15 @@ "message": "Your organization passwords are at-risk because they are weak, reused, and/or exposed.", "description": "Description of the review at-risk login slide on the at-risk password page carousel" }, - "reviewAtRiskLoginSlideImgAlt": { - "message": "Illustration of a list of logins that are at-risk" + "reviewAtRiskLoginSlideImgAltPeriod": { + "message": "Illustration of a list of logins that are at-risk." }, "generatePasswordSlideDesc": { "message": "Quickly generate a strong, unique password with the Bitwarden autofill menu on the at-risk site.", "description": "Description of the generate password slide on the at-risk password page carousel" }, - "generatePasswordSlideImgAlt": { - "message": "Illustration of the Bitwarden autofill menu displaying a generated password" + "generatePasswordSlideImgAltPeriod": { + "message": "Illustration of the Bitwarden autofill menu displaying a generated password." }, "updateInBitwarden": { "message": "Update in Bitwarden" @@ -2551,8 +2549,8 @@ "message": "Bitwarden will then prompt you to update the password in the password manager.", "description": "Description of the update in Bitwarden slide on the at-risk password page carousel" }, - "updateInBitwardenSlideImgAlt": { - "message": "Illustration of a Bitwarden’s notification prompting the user to update the login" + "updateInBitwardenSlideImgAltPeriod": { + "message": "Illustration of a Bitwarden’s notification prompting the user to update the login." }, "turnOnAutofill": { "message": "Turn on autofill" @@ -3007,6 +3005,15 @@ } } }, + "exportingIndividualVaultWithAttachmentsDescription": { + "message": "Only the individual vault items including attachments associated with $EMAIL$ will be exported. Organization vault items will not be included", + "placeholders": { + "email": { + "content": "$1", + "example": "name@example.com" + } + } + }, "exportingOrganizationVaultTitle": { "message": "Exportar Caixa forte da organización" }, @@ -3839,15 +3846,9 @@ "duoHealthCheckResultsInNullAuthUrlError": { "message": "Erro conectando co servizo de Duo. Usa un método de verificación en 2 pasos alternativo ou contacta con Duo." }, - "launchDuoAndFollowStepsToFinishLoggingIn": { - "message": "Executa Duo e segue os pasos para finalizar o inicio de sesión." - }, "duoRequiredForAccount": { "message": "A túa conta require a verificación en 2 pasos de Duo." }, - "popoutTheExtensionToCompleteLogin": { - "message": "Saca a extensión nunha ventá para continuar." - }, "popoutExtension": { "message": "Sacar a extensión" }, @@ -4270,6 +4271,20 @@ } } }, + "viewItemTitleWithField": { + "message": "View item - $ITEMNAME$ - $FIELD$", + "description": "Title for a link that opens a view for an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + }, + "field": { + "content": "$2", + "example": "Username" + } + } + }, "autofillTitle": { "message": "Autoenchido - $ITEMNAME$", "description": "Title for a button that autofills a login item.", @@ -4280,6 +4295,20 @@ } } }, + "autofillTitleWithField": { + "message": "Autofill - $ITEMNAME$ - $FIELD$", + "description": "Title for a button that autofills a login item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + }, + "field": { + "content": "$2", + "example": "Username" + } + } + }, "copyFieldValue": { "message": "Copy $FIELD$, $VALUE$", "description": "Title for a button that copies a field value to the clipboard.", @@ -4899,8 +4928,8 @@ "message": "Contrasinal xerado de novo", "description": "Notification message for when a password has been regenerated" }, - "saveLoginToBitwarden": { - "message": "Gardar credenciais en Bitwarden?", + "saveToBitwarden": { + "message": "Save to Bitwarden", "description": "Confirmation message for saving a login to Bitwarden" }, "spaceCharacterDescriptor": { @@ -5139,5 +5168,32 @@ }, "changeAtRiskPassword": { "message": "Change at-risk password" + }, + "introCarouselLabel": { + "message": "Welcome to Bitwarden" + }, + "securityPrioritized": { + "message": "Security, prioritized" + }, + "securityPrioritizedBody": { + "message": "Save logins, cards, and identities to your secure vault. Bitwarden uses zero-knowledge, end-to-end encryption to protect what’s important to you." + }, + "quickLogin": { + "message": "Quick and easy login" + }, + "quickLoginBody": { + "message": "Set up biometric unlock and autofill to log into your accounts without typing a single letter." + }, + "secureUser": { + "message": "Level up your logins" + }, + "secureUserBody": { + "message": "Use the generator to create and save strong, unique passwords for all your accounts." + }, + "secureDevices": { + "message": "Your data, when and where you need it" + }, + "secureDevicesBody": { + "message": "Save unlimited passwords across unlimited devices with Bitwarden mobile, browser, and desktop apps." } } diff --git a/apps/browser/src/_locales/he/messages.json b/apps/browser/src/_locales/he/messages.json index 035bf9da48e..1c5ece85f96 100644 --- a/apps/browser/src/_locales/he/messages.json +++ b/apps/browser/src/_locales/he/messages.json @@ -950,7 +950,7 @@ "message": "הסיסמה הועתקה" }, "uri": { - "message": "כתובת" + "message": "URI" }, "uriPosition": { "message": "כתובת $POSITION$", @@ -1098,6 +1098,31 @@ "message": "כניסה עודכנה", "description": "Message displayed when login details are successfully updated." }, + "loginUpdateTaskSuccess": { + "message": "Great job! You took the steps to make you and $ORGANIZATION$ more secure.", + "placeholders": { + "organization": { + "content": "$1" + } + }, + "description": "Shown to user after login is updated." + }, + "loginUpdateTaskSuccessAdditional": { + "message": "Thank you for making $ORGANIZATION$ more secure. You have $TASK_COUNT$ more passwords to update.", + "placeholders": { + "organization": { + "content": "$1" + }, + "task_count": { + "content": "$2" + } + }, + "description": "Shown to user after login is updated." + }, + "nextSecurityTaskAction": { + "message": "Change next password", + "description": "Message prompting user to undertake completion of another security task." + }, "saveFailure": { "message": "שגיאה בשמירה", "description": "Error message shown when the system fails to save login details." @@ -1391,24 +1416,12 @@ "premiumRequiredDesc": { "message": "נדרשת חברות פרימיום כדי להשתמש בתכונה זו." }, - "enterVerificationCodeApp": { - "message": "הכנס את קוד האימות בן 6 הספרות מאפליקציית האימות שלך." - }, "authenticationTimeout": { "message": "פסק זמן לאימות" }, "authenticationSessionTimedOut": { "message": "זמן אימות ההפעלה תם. נא להתחיל מחדש את תהליך הכניסה." }, - "enterVerificationCodeEmail": { - "message": "הכנס את קוד האימות בן 6 הספרות שנשלח ל-$EMAIL$.", - "placeholders": { - "email": { - "content": "$1", - "example": "example@gmail.com" - } - } - }, "verificationCodeEmailSent": { "message": "מייל אימות נשלח לכתובת $EMAIL$.", "placeholders": { @@ -1418,18 +1431,9 @@ } } }, - "rememberMe": { - "message": "זכור אותי" - }, "dontAskAgainOnThisDeviceFor30Days": { "message": "אל תשאל אותי שוב במכשיר זה למשך 30 יום" }, - "sendVerificationCodeEmailAgain": { - "message": "שלח שוב קוד אימות לאימייל" - }, - "useAnotherTwoStepMethod": { - "message": "השתמש בשיטה אחרת עבור כניסה דו שלבית" - }, "selectAnotherMethod": { "message": "בחר שיטה אחרת", "description": "Select another two-step login method" @@ -1437,18 +1441,9 @@ "useYourRecoveryCode": { "message": "השתמש בקוד השחזור שלך" }, - "insertYubiKey": { - "message": "הכנס את ה-YubiKey אל כניסת ה-USB במחשבך, ואז גע בכפתור שלו." - }, "insertU2f": { "message": "הכנס את מפתח האבטחה שלך אל כניסת ה-USB במחשבך. אם יש לו כפתור, לחץ עליו." }, - "webAuthnNewTab": { - "message": "על מנת להתחיל אימות WebAuthn דו־שלבי. לחץ על הלחצן למטה כדי לפתוח כרטיסיה חדשה ועקוב אחר ההוראות המסופקת בכרטיסיה החדשה." - }, - "webAuthnNewTabOpen": { - "message": "פתח כרטיסיה חדשה" - }, "openInNewTab": { "message": "פתח בכרטיסיה חדשה" }, @@ -2327,6 +2322,9 @@ "privacyPolicy": { "message": "מדיניות הפרטיות" }, + "yourNewPasswordCannotBeTheSameAsYourCurrentPassword": { + "message": "לא ניתן להשתמש בסיסמה בתור רמז לסיסמה." + }, "hintEqualsPassword": { "message": "רמז הסיסמה שלך לא יכול להיות זהה לסיסמה שלך." }, @@ -2534,15 +2532,15 @@ "message": "סיסמאות הארגון שלך הן בסכנה בגלל שהן חלשות, משומשות, ו/או חשופות.", "description": "Description of the review at-risk login slide on the at-risk password page carousel" }, - "reviewAtRiskLoginSlideImgAlt": { - "message": "איור של רשימת כניסות בסיכון" + "reviewAtRiskLoginSlideImgAltPeriod": { + "message": "Illustration of a list of logins that are at-risk." }, "generatePasswordSlideDesc": { "message": "צור במהירות סיסמה חזקה וייחודית עם תפריט המילוי האוטומטי של Bitwarden באתר שבסיכון.", "description": "Description of the generate password slide on the at-risk password page carousel" }, - "generatePasswordSlideImgAlt": { - "message": "איור של תפריט המילוי האוטומטי של Bitwarden המציג סיסמה שנוצרה" + "generatePasswordSlideImgAltPeriod": { + "message": "Illustration of the Bitwarden autofill menu displaying a generated password." }, "updateInBitwarden": { "message": "עדכן ב־Bitwarden" @@ -2551,8 +2549,8 @@ "message": "Bitwarden אז ינחה אותך לעדכן את הסיסמה במנהל הסיסמאות.", "description": "Description of the update in Bitwarden slide on the at-risk password page carousel" }, - "updateInBitwardenSlideImgAlt": { - "message": "איור של התראת Bitwarden המנחה את המשתמש לעדכן את הכניסה" + "updateInBitwardenSlideImgAltPeriod": { + "message": "Illustration of a Bitwarden’s notification prompting the user to update the login." }, "turnOnAutofill": { "message": "הפעל מילוי אוטומטי" @@ -3007,6 +3005,15 @@ } } }, + "exportingIndividualVaultWithAttachmentsDescription": { + "message": "Only the individual vault items including attachments associated with $EMAIL$ will be exported. Organization vault items will not be included", + "placeholders": { + "email": { + "content": "$1", + "example": "name@example.com" + } + } + }, "exportingOrganizationVaultTitle": { "message": "מייצא כספת ארגון" }, @@ -3839,15 +3846,9 @@ "duoHealthCheckResultsInNullAuthUrlError": { "message": "שגיאה בהתחברות עם השירות Duo. השתמש בשיטת כניסה דו־שלבית אחרת או פנה אל Duo לסיוע." }, - "launchDuoAndFollowStepsToFinishLoggingIn": { - "message": "פתח את Duo ועקוב אחר השלבים כדי לסיים להיכנס." - }, "duoRequiredForAccount": { "message": "נדרשת כניסה דו־שלבית של Duo עבור החשבון שלך." }, - "popoutTheExtensionToCompleteLogin": { - "message": "הקפץ את ההרחבה כדי להשלים כניסה." - }, "popoutExtension": { "message": "הקפץ הרחבה" }, @@ -4270,6 +4271,20 @@ } } }, + "viewItemTitleWithField": { + "message": "View item - $ITEMNAME$ - $FIELD$", + "description": "Title for a link that opens a view for an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + }, + "field": { + "content": "$2", + "example": "Username" + } + } + }, "autofillTitle": { "message": "מילוי אוטומטי - $ITEMNAME$", "description": "Title for a button that autofills a login item.", @@ -4280,6 +4295,20 @@ } } }, + "autofillTitleWithField": { + "message": "Autofill - $ITEMNAME$ - $FIELD$", + "description": "Title for a button that autofills a login item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + }, + "field": { + "content": "$2", + "example": "Username" + } + } + }, "copyFieldValue": { "message": "העתק $FIELD$, $VALUE$", "description": "Title for a button that copies a field value to the clipboard.", @@ -4899,8 +4928,8 @@ "message": "סיסמה נוצרה מחדש", "description": "Notification message for when a password has been regenerated" }, - "saveLoginToBitwarden": { - "message": "לשמור כניסה ב־Bitwarden?", + "saveToBitwarden": { + "message": "Save to Bitwarden", "description": "Confirmation message for saving a login to Bitwarden" }, "spaceCharacterDescriptor": { @@ -5139,5 +5168,32 @@ }, "changeAtRiskPassword": { "message": "שנה סיסמה בסיכון" + }, + "introCarouselLabel": { + "message": "Welcome to Bitwarden" + }, + "securityPrioritized": { + "message": "Security, prioritized" + }, + "securityPrioritizedBody": { + "message": "Save logins, cards, and identities to your secure vault. Bitwarden uses zero-knowledge, end-to-end encryption to protect what’s important to you." + }, + "quickLogin": { + "message": "Quick and easy login" + }, + "quickLoginBody": { + "message": "Set up biometric unlock and autofill to log into your accounts without typing a single letter." + }, + "secureUser": { + "message": "Level up your logins" + }, + "secureUserBody": { + "message": "Use the generator to create and save strong, unique passwords for all your accounts." + }, + "secureDevices": { + "message": "Your data, when and where you need it" + }, + "secureDevicesBody": { + "message": "Save unlimited passwords across unlimited devices with Bitwarden mobile, browser, and desktop apps." } } diff --git a/apps/browser/src/_locales/hi/messages.json b/apps/browser/src/_locales/hi/messages.json index 748d9eb966b..368f1e7a828 100644 --- a/apps/browser/src/_locales/hi/messages.json +++ b/apps/browser/src/_locales/hi/messages.json @@ -1098,6 +1098,31 @@ "message": "Login updated", "description": "Message displayed when login details are successfully updated." }, + "loginUpdateTaskSuccess": { + "message": "Great job! You took the steps to make you and $ORGANIZATION$ more secure.", + "placeholders": { + "organization": { + "content": "$1" + } + }, + "description": "Shown to user after login is updated." + }, + "loginUpdateTaskSuccessAdditional": { + "message": "Thank you for making $ORGANIZATION$ more secure. You have $TASK_COUNT$ more passwords to update.", + "placeholders": { + "organization": { + "content": "$1" + }, + "task_count": { + "content": "$2" + } + }, + "description": "Shown to user after login is updated." + }, + "nextSecurityTaskAction": { + "message": "Change next password", + "description": "Message prompting user to undertake completion of another security task." + }, "saveFailure": { "message": "Error saving", "description": "Error message shown when the system fails to save login details." @@ -1391,24 +1416,12 @@ "premiumRequiredDesc": { "message": "इस सुविधा का उपयोग करने के लिए प्रीमियम सदस्यता की आवश्यकता होती है।" }, - "enterVerificationCodeApp": { - "message": "अपने ऑथेंटिकेटर ऐप से 6 डिजिट वेरिफिकेशन कोड डालें।" - }, "authenticationTimeout": { "message": "Authentication timeout" }, "authenticationSessionTimedOut": { "message": "The authentication session timed out. Please restart the login process." }, - "enterVerificationCodeEmail": { - "message": "Enter the 6 digit verification code that was emailed to $EMAIL$.", - "placeholders": { - "email": { - "content": "$1", - "example": "example@gmail.com" - } - } - }, "verificationCodeEmailSent": { "message": "ईमेल $EMAIL$ को भेजा गया।", "placeholders": { @@ -1418,18 +1431,9 @@ } } }, - "rememberMe": { - "message": "मुझे याद रखें" - }, "dontAskAgainOnThisDeviceFor30Days": { "message": "Don't ask again on this device for 30 days" }, - "sendVerificationCodeEmailAgain": { - "message": "फिर से सत्यापन कोड ईमेल भेजें" - }, - "useAnotherTwoStepMethod": { - "message": "एक और दो-चरण लॉगिन विधि का उपयोग करें" - }, "selectAnotherMethod": { "message": "Select another method", "description": "Select another two-step login method" @@ -1437,18 +1441,9 @@ "useYourRecoveryCode": { "message": "Use your recovery code" }, - "insertYubiKey": { - "message": "अपने कंप्यूटर के यूएसबी पोर्ट में अपने YubiKey डालें, फिर इसके बटन को स्पर्श करें।" - }, "insertU2f": { "message": "अपने कंप्यूटर के यूएसबी पोर्ट में अपनी सुरक्षा कुंजी डालें। अगर इसमें कोई बटन है तो उसे टच करें।\n" }, - "webAuthnNewTab": { - "message": "वेबऑथन 2FA सत्यापन शुरू करने के लिए। एक नया टैब खोलने के लिए नीचे दिए गए बटन पर क्लिक करें और नए टैब में दिए गए निर्देशों का पालन करें।" - }, - "webAuthnNewTabOpen": { - "message": "नया टैब खोलें" - }, "openInNewTab": { "message": "Open in new tab" }, @@ -2327,6 +2322,9 @@ "privacyPolicy": { "message": "प्राइवेसी पोलिसी" }, + "yourNewPasswordCannotBeTheSameAsYourCurrentPassword": { + "message": "Your new password cannot be the same as your current password." + }, "hintEqualsPassword": { "message": "आपका पासवर्ड संकेत आपके पासवर्ड के समान नहीं हो सकता है।" }, @@ -2534,15 +2532,15 @@ "message": "Your organization passwords are at-risk because they are weak, reused, and/or exposed.", "description": "Description of the review at-risk login slide on the at-risk password page carousel" }, - "reviewAtRiskLoginSlideImgAlt": { - "message": "Illustration of a list of logins that are at-risk" + "reviewAtRiskLoginSlideImgAltPeriod": { + "message": "जोखिमग्रस्त लॉगिन की सूची का चित्रण।" }, "generatePasswordSlideDesc": { "message": "Quickly generate a strong, unique password with the Bitwarden autofill menu on the at-risk site.", "description": "Description of the generate password slide on the at-risk password page carousel" }, - "generatePasswordSlideImgAlt": { - "message": "Illustration of the Bitwarden autofill menu displaying a generated password" + "generatePasswordSlideImgAltPeriod": { + "message": "उत्पन्न पासवर्ड प्रदर्शित करने वाले बिटवर्डन स्वतः भरण मेनू का चित्रण।" }, "updateInBitwarden": { "message": "Update in Bitwarden" @@ -2551,8 +2549,8 @@ "message": "Bitwarden will then prompt you to update the password in the password manager.", "description": "Description of the update in Bitwarden slide on the at-risk password page carousel" }, - "updateInBitwardenSlideImgAlt": { - "message": "Illustration of a Bitwarden’s notification prompting the user to update the login" + "updateInBitwardenSlideImgAltPeriod": { + "message": "उपयोगकर्ता को लॉगिन अपडेट करने के लिए प्रेरित करने वाली बिटवर्डन की अधिसूचना का चित्रण।" }, "turnOnAutofill": { "message": "Turn on autofill" @@ -3007,6 +3005,15 @@ } } }, + "exportingIndividualVaultWithAttachmentsDescription": { + "message": "केवल $EMAIL$ से जुड़े अनुलग्नकों सहित व्यक्तिगत वॉल्ट आइटम ही निर्यात किए जाएंगे. संगठन वॉल्ट आइटम शामिल नहीं किए जाएंगे", + "placeholders": { + "email": { + "content": "$1", + "example": "name@example.com" + } + } + }, "exportingOrganizationVaultTitle": { "message": "Exporting organization vault" }, @@ -3839,15 +3846,9 @@ "duoHealthCheckResultsInNullAuthUrlError": { "message": "Error connecting with the Duo service. Use a different two-step login method or contact Duo for assistance." }, - "launchDuoAndFollowStepsToFinishLoggingIn": { - "message": "Launch Duo and follow the steps to finish logging in." - }, "duoRequiredForAccount": { "message": "Duo two-step login is required for your account." }, - "popoutTheExtensionToCompleteLogin": { - "message": "Popout the extension to complete login." - }, "popoutExtension": { "message": "Popout extension" }, @@ -4270,6 +4271,20 @@ } } }, + "viewItemTitleWithField": { + "message": "View item - $ITEMNAME$ - $FIELD$", + "description": "Title for a link that opens a view for an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + }, + "field": { + "content": "$2", + "example": "Username" + } + } + }, "autofillTitle": { "message": "Autofill - $ITEMNAME$", "description": "Title for a button that autofills a login item.", @@ -4280,6 +4295,20 @@ } } }, + "autofillTitleWithField": { + "message": "Autofill - $ITEMNAME$ - $FIELD$", + "description": "Title for a button that autofills a login item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + }, + "field": { + "content": "$2", + "example": "Username" + } + } + }, "copyFieldValue": { "message": "Copy $FIELD$, $VALUE$", "description": "Title for a button that copies a field value to the clipboard.", @@ -4899,8 +4928,8 @@ "message": "Password regenerated", "description": "Notification message for when a password has been regenerated" }, - "saveLoginToBitwarden": { - "message": "Save login to Bitwarden?", + "saveToBitwarden": { + "message": "Save to Bitwarden", "description": "Confirmation message for saving a login to Bitwarden" }, "spaceCharacterDescriptor": { @@ -5139,5 +5168,32 @@ }, "changeAtRiskPassword": { "message": "Change at-risk password" + }, + "introCarouselLabel": { + "message": "Welcome to Bitwarden" + }, + "securityPrioritized": { + "message": "Security, prioritized" + }, + "securityPrioritizedBody": { + "message": "Save logins, cards, and identities to your secure vault. Bitwarden uses zero-knowledge, end-to-end encryption to protect what’s important to you." + }, + "quickLogin": { + "message": "Quick and easy login" + }, + "quickLoginBody": { + "message": "Set up biometric unlock and autofill to log into your accounts without typing a single letter." + }, + "secureUser": { + "message": "Level up your logins" + }, + "secureUserBody": { + "message": "Use the generator to create and save strong, unique passwords for all your accounts." + }, + "secureDevices": { + "message": "Your data, when and where you need it" + }, + "secureDevicesBody": { + "message": "Save unlimited passwords across unlimited devices with Bitwarden mobile, browser, and desktop apps." } } diff --git a/apps/browser/src/_locales/hr/messages.json b/apps/browser/src/_locales/hr/messages.json index b88fc45493f..72f14216020 100644 --- a/apps/browser/src/_locales/hr/messages.json +++ b/apps/browser/src/_locales/hr/messages.json @@ -1098,6 +1098,31 @@ "message": "Prijava ažurirana", "description": "Message displayed when login details are successfully updated." }, + "loginUpdateTaskSuccess": { + "message": "Great job! You took the steps to make you and $ORGANIZATION$ more secure.", + "placeholders": { + "organization": { + "content": "$1" + } + }, + "description": "Shown to user after login is updated." + }, + "loginUpdateTaskSuccessAdditional": { + "message": "Thank you for making $ORGANIZATION$ more secure. You have $TASK_COUNT$ more passwords to update.", + "placeholders": { + "organization": { + "content": "$1" + }, + "task_count": { + "content": "$2" + } + }, + "description": "Shown to user after login is updated." + }, + "nextSecurityTaskAction": { + "message": "Change next password", + "description": "Message prompting user to undertake completion of another security task." + }, "saveFailure": { "message": "Greška kod spremanja", "description": "Error message shown when the system fails to save login details." @@ -1391,24 +1416,12 @@ "premiumRequiredDesc": { "message": "Za korištenje ove značajke potrebno je Premium članstvo." }, - "enterVerificationCodeApp": { - "message": "Unesi 6-znamenkasti kôd za provjeru iz autentifikatorske aplikacije." - }, "authenticationTimeout": { "message": "Istek vremena za autentifikaciju" }, "authenticationSessionTimedOut": { "message": "Sesija za autentifikaciju je istekla. Ponovi proces prijave." }, - "enterVerificationCodeEmail": { - "message": "Unesi 6-znamenkasti kôd za provjeru poslan e-poštom na $EMAIL$.", - "placeholders": { - "email": { - "content": "$1", - "example": "example@gmail.com" - } - } - }, "verificationCodeEmailSent": { "message": "E-pošta za potvrdu poslana je na $EMAIL$.", "placeholders": { @@ -1418,18 +1431,9 @@ } } }, - "rememberMe": { - "message": "Zapamti me" - }, "dontAskAgainOnThisDeviceFor30Days": { "message": "Ne pitaj na ovom uređaju idućih 30 dana" }, - "sendVerificationCodeEmailAgain": { - "message": "Ponovno slanje kontrolnog koda e-poštom" - }, - "useAnotherTwoStepMethod": { - "message": "Koristiti drugi način prijave dvostrukom autentifikacijom" - }, "selectAnotherMethod": { "message": "Odaberi drugi način", "description": "Select another two-step login method" @@ -1437,18 +1441,9 @@ "useYourRecoveryCode": { "message": "Koristi kôd za oporavak" }, - "insertYubiKey": { - "message": "Umetni svoj YubiKey u USB priključak računala, a zatim dodirni njegovu tipku." - }, "insertU2f": { "message": "Umetni svoj sigurnosni ključ u USB priključak računala. Ako ima tipku, dodirni ju." }, - "webAuthnNewTab": { - "message": "Nastavi na WebAuthn 2FA verifikaciju u novoj kartici." - }, - "webAuthnNewTabOpen": { - "message": "Otvori novu karticu" - }, "openInNewTab": { "message": "Otvori u novoj kartici" }, @@ -2327,6 +2322,9 @@ "privacyPolicy": { "message": "Pravila privatnosti" }, + "yourNewPasswordCannotBeTheSameAsYourCurrentPassword": { + "message": "Your new password cannot be the same as your current password." + }, "hintEqualsPassword": { "message": "Podsjetnik za lozinku ne može biti isti kao lozinka." }, @@ -2534,15 +2532,15 @@ "message": "Lozinke tvoje organizacije su rizične jer su slabe, nanovo korištene i/ili iscurile.", "description": "Description of the review at-risk login slide on the at-risk password page carousel" }, - "reviewAtRiskLoginSlideImgAlt": { - "message": "Ilustracija liste rizičnih prijava" + "reviewAtRiskLoginSlideImgAltPeriod": { + "message": "Illustration of a list of logins that are at-risk." }, "generatePasswordSlideDesc": { "message": "Brzo generiraj jake, jedinstvene lozinke koristeći Bitwarden dijalog auto-ispune direktno na stranici.", "description": "Description of the generate password slide on the at-risk password page carousel" }, - "generatePasswordSlideImgAlt": { - "message": "Ilustracija Bitwarden dijalog auto-ispune s prikazom generirane lozinke" + "generatePasswordSlideImgAltPeriod": { + "message": "Illustration of the Bitwarden autofill menu displaying a generated password." }, "updateInBitwarden": { "message": "Ažuriraj u Bitwardenu" @@ -2551,8 +2549,8 @@ "message": "Bitwarden će te pitati treba li ažurirati lozinku u upravitelju lozinki.", "description": "Description of the update in Bitwarden slide on the at-risk password page carousel" }, - "updateInBitwardenSlideImgAlt": { - "message": "Ilustracija Bitwarden upita za ažuriranje prijave" + "updateInBitwardenSlideImgAltPeriod": { + "message": "Illustration of a Bitwarden’s notification prompting the user to update the login." }, "turnOnAutofill": { "message": "Uključi auto-ispunu" @@ -3007,6 +3005,15 @@ } } }, + "exportingIndividualVaultWithAttachmentsDescription": { + "message": "Izvest će se samo stavke i privici osobnog trezora povezanog s $EMAIL$. Stavke organizacijskog trezora neće biti uključene", + "placeholders": { + "email": { + "content": "$1", + "example": "name@example.com" + } + } + }, "exportingOrganizationVaultTitle": { "message": "Izvoz organizacijskog trezora" }, @@ -3839,15 +3846,9 @@ "duoHealthCheckResultsInNullAuthUrlError": { "message": "Greška pri povezivanju s uslugom Duo. Koristi drugu metodu prijave s dvostrukom autentifikacijom ili kontaktiraj Duo za pomoć." }, - "launchDuoAndFollowStepsToFinishLoggingIn": { - "message": "Pokreni Duo i slijedi korake za dovršetak prijave." - }, "duoRequiredForAccount": { "message": "Za tvoj račun je potrebna Duo dvostruka autentifikacija." }, - "popoutTheExtensionToCompleteLogin": { - "message": "Otvori proširenje za dovršetak prijave." - }, "popoutExtension": { "message": "Otvori proširenje" }, @@ -4270,6 +4271,20 @@ } } }, + "viewItemTitleWithField": { + "message": "View item - $ITEMNAME$ - $FIELD$", + "description": "Title for a link that opens a view for an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + }, + "field": { + "content": "$2", + "example": "Username" + } + } + }, "autofillTitle": { "message": "Auto-ispuna - $ITEMNAME$", "description": "Title for a button that autofills a login item.", @@ -4280,6 +4295,20 @@ } } }, + "autofillTitleWithField": { + "message": "Autofill - $ITEMNAME$ - $FIELD$", + "description": "Title for a button that autofills a login item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + }, + "field": { + "content": "$2", + "example": "Username" + } + } + }, "copyFieldValue": { "message": "Kopiraj $FIELD$, $VALUE$", "description": "Title for a button that copies a field value to the clipboard.", @@ -4899,8 +4928,8 @@ "message": "Lozinka re-generirana", "description": "Notification message for when a password has been regenerated" }, - "saveLoginToBitwarden": { - "message": "Spremi prijavu u Bitwarden?", + "saveToBitwarden": { + "message": "Save to Bitwarden", "description": "Confirmation message for saving a login to Bitwarden" }, "spaceCharacterDescriptor": { @@ -5139,5 +5168,32 @@ }, "changeAtRiskPassword": { "message": "Promijeni rizičnu lozinku" + }, + "introCarouselLabel": { + "message": "Welcome to Bitwarden" + }, + "securityPrioritized": { + "message": "Security, prioritized" + }, + "securityPrioritizedBody": { + "message": "Save logins, cards, and identities to your secure vault. Bitwarden uses zero-knowledge, end-to-end encryption to protect what’s important to you." + }, + "quickLogin": { + "message": "Quick and easy login" + }, + "quickLoginBody": { + "message": "Set up biometric unlock and autofill to log into your accounts without typing a single letter." + }, + "secureUser": { + "message": "Level up your logins" + }, + "secureUserBody": { + "message": "Use the generator to create and save strong, unique passwords for all your accounts." + }, + "secureDevices": { + "message": "Your data, when and where you need it" + }, + "secureDevicesBody": { + "message": "Save unlimited passwords across unlimited devices with Bitwarden mobile, browser, and desktop apps." } } diff --git a/apps/browser/src/_locales/hu/messages.json b/apps/browser/src/_locales/hu/messages.json index 80b1dbf095d..d4b86eca2ae 100644 --- a/apps/browser/src/_locales/hu/messages.json +++ b/apps/browser/src/_locales/hu/messages.json @@ -1098,6 +1098,31 @@ "message": "A bejelentkezés frissítésre került.", "description": "Message displayed when login details are successfully updated." }, + "loginUpdateTaskSuccess": { + "message": "Remek munka! Megtettük a lépéseket, hogy magunk és $ORGANIZATION$ biztonságosabbá váljon.", + "placeholders": { + "organization": { + "content": "$1" + } + }, + "description": "Shown to user after login is updated." + }, + "loginUpdateTaskSuccessAdditional": { + "message": "Köszönet $ORGANIZATION$ biztonságosabbá válásához. További $TASK_COUNT$ frissítendő jelszó van még.", + "placeholders": { + "organization": { + "content": "$1" + }, + "task_count": { + "content": "$2" + } + }, + "description": "Shown to user after login is updated." + }, + "nextSecurityTaskAction": { + "message": "Következő jelszó megváltoztatása", + "description": "Message prompting user to undertake completion of another security task." + }, "saveFailure": { "message": "Hiba történt a bejelentkezés mentésekor.", "description": "Error message shown when the system fails to save login details." @@ -1391,24 +1416,12 @@ "premiumRequiredDesc": { "message": "Prémium tagság szükséges ennek a funkciónak eléréséhez a jövőben." }, - "enterVerificationCodeApp": { - "message": "Add meg a 6 számjegyű ellenőrző kódot a hitelesítő alkalmazásodból." - }, "authenticationTimeout": { "message": "Hitelesítési időkifutás" }, "authenticationSessionTimedOut": { "message": "A hitelesítési munkamenet időkifutással lejárt. Indítsuk újra a bejelentkezési folyamatot." }, - "enterVerificationCodeEmail": { - "message": "$EMAIL$ email címre elküldött 6 számjegyű ellenőrző kód megadása.", - "placeholders": { - "email": { - "content": "$1", - "example": "example@gmail.com" - } - } - }, "verificationCodeEmailSent": { "message": "Az ellenőrző kód elküldésre került $EMAIL$ email címre.", "placeholders": { @@ -1418,18 +1431,9 @@ } } }, - "rememberMe": { - "message": "Emlékezz rám" - }, "dontAskAgainOnThisDeviceFor30Days": { "message": "Ne kérdezzen újra ezen az eszközön 30 napig" }, - "sendVerificationCodeEmailAgain": { - "message": "Megerősítő kód e-mail újra küldése" - }, - "useAnotherTwoStepMethod": { - "message": "Más két lépcsős bejelentkezés használata" - }, "selectAnotherMethod": { "message": "Másik módszer választás", "description": "Select another two-step login method" @@ -1437,18 +1441,9 @@ "useYourRecoveryCode": { "message": "Helyreállító kód használata" }, - "insertYubiKey": { - "message": "Illeszd be a YubiKey-t a számítógéped egyik USB portjába, majd nyomd meg a gombját." - }, "insertU2f": { "message": "Illesz be biztonsági kulcsod a számítógéped egyik USB portjába. Ha van rajta egy gomb, nyomd le." }, - "webAuthnNewTab": { - "message": "A WebAuthn 2FA ellenőrzés folytatása az új fülön." - }, - "webAuthnNewTabOpen": { - "message": "Új fül megnyitása" - }, "openInNewTab": { "message": "Megnyitás új fülön" }, @@ -2327,6 +2322,9 @@ "privacyPolicy": { "message": "Adatvédelem" }, + "yourNewPasswordCannotBeTheSameAsYourCurrentPassword": { + "message": "Az új jelszó nem lehet azonos a jelenlegi jelszóval." + }, "hintEqualsPassword": { "message": "A jelszavas tipp nem lehet azonos a jelszóval." }, @@ -2534,14 +2532,14 @@ "message": "A szervezeti jelszavak kockázatosak, mert gyengék, újra felhasználásra kerültek és/vagy nyilvánosságra kerültek.", "description": "Description of the review at-risk login slide on the at-risk password page carousel" }, - "reviewAtRiskLoginSlideImgAlt": { - "message": "A kockázatos bejelentkezések listájának illusztrációja" + "reviewAtRiskLoginSlideImgAltPeriod": { + "message": "A kockázatos bejelentkezések listájának illusztrációja." }, "generatePasswordSlideDesc": { "message": "Gyorsan generálhatunk erős, egyedi jelszót a Bitwarden automatikus kitöltési menüjével a kockázatos webhelyen.", "description": "Description of the generate password slide on the at-risk password page carousel" }, - "generatePasswordSlideImgAlt": { + "generatePasswordSlideImgAltPeriod": { "message": "A Bitwarden automatikus kitöltési menüjének illusztrációja, amely egy generált jelszót jelenít meg." }, "updateInBitwarden": { @@ -2551,7 +2549,7 @@ "message": "A Bitwarden ezután felkér a jelszó frissítésére a jelszókezelőben.", "description": "Description of the update in Bitwarden slide on the at-risk password page carousel" }, - "updateInBitwardenSlideImgAlt": { + "updateInBitwardenSlideImgAltPeriod": { "message": "Illusztráció a Bitwarden értesítéséről, amely felszólítja a felhasználót a bejelentkezési adatok frissítésére." }, "turnOnAutofill": { @@ -3007,6 +3005,15 @@ } } }, + "exportingIndividualVaultWithAttachmentsDescription": { + "message": "Csak $EMAIL$ email címmel társított személyes széf elemek kerülnek exportálásra. Ebbe nem kerülnek be a szervezeti széf elemek.", + "placeholders": { + "email": { + "content": "$1", + "example": "name@example.com" + } + } + }, "exportingOrganizationVaultTitle": { "message": "Szervezeti széf exportálása" }, @@ -3839,15 +3846,9 @@ "duoHealthCheckResultsInNullAuthUrlError": { "message": "Error connecting with the Duo service. Use a different two-step login method or contact Duo for assistance." }, - "launchDuoAndFollowStepsToFinishLoggingIn": { - "message": "Indítsuk el a DUO-t és kövessük a lépéseket a bejelentkezés befejezéséhez." - }, "duoRequiredForAccount": { "message": "A fiókhoz kétlépcsős DUO bejelentkezés szükséges." }, - "popoutTheExtensionToCompleteLogin": { - "message": "A bejelentkezés befejezéséhez nyissuk meg a kiterjesztést." - }, "popoutExtension": { "message": "Felugró bővítmény" }, @@ -4270,6 +4271,20 @@ } } }, + "viewItemTitleWithField": { + "message": "Elem megtekintése - $ITEMNAME$ - $FIELD$", + "description": "Title for a link that opens a view for an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + }, + "field": { + "content": "$2", + "example": "Username" + } + } + }, "autofillTitle": { "message": "Automatikus kitöltés - $ITEMNAME$", "description": "Title for a button that autofills a login item.", @@ -4280,6 +4295,20 @@ } } }, + "autofillTitleWithField": { + "message": "Automatikus kitöltés - $ITEMNAME$ - $FIELD$", + "description": "Title for a button that autofills a login item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + }, + "field": { + "content": "$2", + "example": "Username" + } + } + }, "copyFieldValue": { "message": "$FIELD$, $VALUE$ másolása", "description": "Title for a button that copies a field value to the clipboard.", @@ -4899,8 +4928,8 @@ "message": "A jelszó generálásra került.", "description": "Notification message for when a password has been regenerated" }, - "saveLoginToBitwarden": { - "message": "Bejelentkezés mentése a Bitwardenbe?", + "saveToBitwarden": { + "message": "Mentés a Bitwardenbe", "description": "Confirmation message for saving a login to Bitwarden" }, "spaceCharacterDescriptor": { @@ -5139,5 +5168,32 @@ }, "changeAtRiskPassword": { "message": "Kockázatos jelszó megváltoztatása" + }, + "introCarouselLabel": { + "message": "Üdvözlet a Bitwardenben" + }, + "securityPrioritized": { + "message": "Biztonság, prioritásos" + }, + "securityPrioritizedBody": { + "message": "Mentsük el a bejelentkezési adatokat, kártyákat és azonosításokat a biztonságos széfbe. A Bitwarden tudás nélküli, végpontok közötti titkosítást használ a felhasználók számára fontos dolgok védelmére." + }, + "quickLogin": { + "message": "Gyors és könnyű bejelentkezés" + }, + "quickLoginBody": { + "message": "Állítsuk be a biometrikus feloldást és az automatikus kitöltést, hogy egyetlen betű beírása nélkül jelentkezzünk be a fiókokba." + }, + "secureUser": { + "message": "A bejelentkezések magasabb szintre emelése" + }, + "secureUserBody": { + "message": "Használjuk a generátort, hogy erős, egyedi jelszavakat hozzunk létre és mentsük az összes fióknál." + }, + "secureDevices": { + "message": "Saját adatok, mikor és hol van rá szükség" + }, + "secureDevicesBody": { + "message": "Mentsünk el a korlátlan jelszót korlátlan számú eszközön a Bitwarden mobil, böngésző és asztali alkalmazásokkal." } } diff --git a/apps/browser/src/_locales/id/messages.json b/apps/browser/src/_locales/id/messages.json index 0146fb2a000..3efc404a9a0 100644 --- a/apps/browser/src/_locales/id/messages.json +++ b/apps/browser/src/_locales/id/messages.json @@ -81,7 +81,7 @@ "message": "Petunjuk Kata Sandi Utama (opsional)" }, "passwordStrengthScore": { - "message": "Password strength score $SCORE$", + "message": "Skor kekuatan kata sandi $SCORE$", "placeholders": { "score": { "content": "$1", @@ -656,10 +656,10 @@ "message": "Verifikasikan identitas Anda" }, "weDontRecognizeThisDevice": { - "message": "We don't recognize this device. Enter the code sent to your email to verify your identity." + "message": "Kami tidak mengenali perangkat ini. Masukkan kode yang dikirim ke surel Anda untuk memverifikasi identitas Anda." }, "continueLoggingIn": { - "message": "Continue logging in" + "message": "Lanjutkan log masuk" }, "yourVaultIsLocked": { "message": "Brankas Anda terkunci. Verifikasi kata sandi utama Anda untuk melanjutkan." @@ -869,19 +869,19 @@ "message": "Masuk ke Bitwarden" }, "enterTheCodeSentToYourEmail": { - "message": "Enter the code sent to your email" + "message": "Masukkan kode yang dikirim ke surel Anda" }, "enterTheCodeFromYourAuthenticatorApp": { - "message": "Enter the code from your authenticator app" + "message": "Masukkan kode dari aplikasi autentikator Anda" }, "pressYourYubiKeyToAuthenticate": { - "message": "Press your YubiKey to authenticate" + "message": "Sentuh YubiKey Anda untuk mengautentikasi" }, "duoTwoFactorRequiredPageSubtitle": { - "message": "Duo two-step login is required for your account. Follow the steps below to finish logging in." + "message": "Log masuk dua langkah berganda diperlukan bagi akun Anda. Ikuti langkah di bawah untuk menyelesaikan log masuk." }, "followTheStepsBelowToFinishLoggingIn": { - "message": "Follow the steps below to finish logging in." + "message": "Ikuti langkah-langkah di bawah untuk menyelesaikan log masuk." }, "restartRegistration": { "message": "Mulai ulang pendaftaran" @@ -1019,7 +1019,7 @@ "message": "Tanyakan untuk menambah sebuah benda jika benda itu tidak ditemukan di brankas Anda. Diterapkan ke seluruh akun yang telah masuk." }, "showCardsInVaultViewV2": { - "message": "Always show cards as Autofill suggestions on Vault view" + "message": "Selalu tampilan kartu sebagai saran isi otomatis pada tampilan Brankas" }, "showCardsCurrentTab": { "message": "Tamplikan kartu pada halaman Tab" @@ -1028,7 +1028,7 @@ "message": "Buat tampilan daftar benda dari kartu pada halaman Tab untuk isi otomatis yang mudah." }, "showIdentitiesInVaultViewV2": { - "message": "Always show identities as Autofill suggestions on Vault view" + "message": "Selalu tampilan identitas sebagai saran isi otomatis pada tampilan Brankas" }, "showIdentitiesCurrentTab": { "message": "Tampilkan identitas pada halaman Tab" @@ -1037,10 +1037,10 @@ "message": "Buat tampilan daftar benda dari identitas pada halaman Tab untuk isi otomatis yang mudah." }, "clickToAutofillOnVault": { - "message": "Click items to autofill on Vault view" + "message": "Klik butir untuk mengisi otomatis pada tampilan Brankas" }, "clickToAutofill": { - "message": "Click items in autofill suggestion to fill" + "message": "Klik butir dalam saran isi otomatis untuk mengisi" }, "clearClipboard": { "message": "Hapus Papan Klip", @@ -1057,7 +1057,7 @@ "message": "Iya, Simpan Sekarang" }, "loginSaveSuccessDetails": { - "message": "$USERNAME$ saved to Bitwarden.", + "message": "$USERNAME$ disimpan ke Bitwarden.", "placeholders": { "username": { "content": "$1" @@ -1066,7 +1066,7 @@ "description": "Shown to user after login is saved." }, "loginUpdatedSuccessDetails": { - "message": "$USERNAME$ updated in Bitwarden.", + "message": "$USERNAME$ diperbarui di Bitwarden.", "placeholders": { "username": { "content": "$1" @@ -1075,35 +1075,60 @@ "description": "Shown to user after login is updated." }, "saveAsNewLoginAction": { - "message": "Save as new login", + "message": "Simpan sebagai log masuk baru", "description": "Button text for saving login details as a new entry." }, "updateLoginAction": { - "message": "Update login", + "message": "Perbarui log masuk", "description": "Button text for updating an existing login entry." }, "saveLoginPrompt": { - "message": "Save login?", + "message": "Simpan log masuk?", "description": "Prompt asking the user if they want to save their login details." }, "updateLoginPrompt": { - "message": "Update existing login?", + "message": "Perbarui log masuk yang ada?", "description": "Prompt asking the user if they want to update an existing login entry." }, "loginSaveSuccess": { - "message": "Login saved", + "message": "Log masuk disimpan", "description": "Message displayed when login details are successfully saved." }, "loginUpdateSuccess": { - "message": "Login updated", + "message": "Log masuk diperbarui", "description": "Message displayed when login details are successfully updated." }, + "loginUpdateTaskSuccess": { + "message": "Great job! You took the steps to make you and $ORGANIZATION$ more secure.", + "placeholders": { + "organization": { + "content": "$1" + } + }, + "description": "Shown to user after login is updated." + }, + "loginUpdateTaskSuccessAdditional": { + "message": "Thank you for making $ORGANIZATION$ more secure. You have $TASK_COUNT$ more passwords to update.", + "placeholders": { + "organization": { + "content": "$1" + }, + "task_count": { + "content": "$2" + } + }, + "description": "Shown to user after login is updated." + }, + "nextSecurityTaskAction": { + "message": "Change next password", + "description": "Message prompting user to undertake completion of another security task." + }, "saveFailure": { - "message": "Error saving", + "message": "Kesalahan saat menyimpan", "description": "Error message shown when the system fails to save login details." }, "saveFailureDetails": { - "message": "Oh no! We couldn't save this. Try entering the details manually.", + "message": "Oh tidak! Kami tidak bisa menyimpan ini. Cobalah memasukkan rincian secara manual.", "description": "Detailed error message shown when saving login details fails." }, "enableChangedPasswordNotification": { @@ -1391,24 +1416,12 @@ "premiumRequiredDesc": { "message": "Keanggotaan premium diperlukan untuk menggunakan fitur ini." }, - "enterVerificationCodeApp": { - "message": "Masukkan 6 digit kode verifikasi dari aplikasi autentikasi Anda." - }, "authenticationTimeout": { "message": "Batas waktu otentikasi" }, "authenticationSessionTimedOut": { "message": "Sesi otentikasi telah berakhir. Harap mulai ulang proses masuk." }, - "enterVerificationCodeEmail": { - "message": "Masukkan 6 digit kode verifikasi yang dikirim melalui email ke $EMAIL$.", - "placeholders": { - "email": { - "content": "$1", - "example": "example@gmail.com" - } - } - }, "verificationCodeEmailSent": { "message": "Surel verifikasi telah dikirim ke $EMAIL$.", "placeholders": { @@ -1418,48 +1431,30 @@ } } }, - "rememberMe": { - "message": "Ingat saya" - }, "dontAskAgainOnThisDeviceFor30Days": { - "message": "Don't ask again on this device for 30 days" - }, - "sendVerificationCodeEmailAgain": { - "message": "Kirim ulang email kode verifikasi" - }, - "useAnotherTwoStepMethod": { - "message": "Gunakan metode masuk dua langkah lainnya" + "message": "Jangan tanyakan lagi pada perangkat ini untuk 30 hari" }, "selectAnotherMethod": { - "message": "Select another method", + "message": "Pilih metode lain", "description": "Select another two-step login method" }, "useYourRecoveryCode": { - "message": "Use your recovery code" - }, - "insertYubiKey": { - "message": "Masukkan YubiKey Anda ke port USB komputer Anda, lalu sentuh tombolnya." + "message": "Gunakan kode pemulihan Anda" }, "insertU2f": { "message": "Masukkan kunci keamanan ke port USB komputer Anda. Jika ada tombolnya, tekanlah." }, - "webAuthnNewTab": { - "message": "Untuk memulai verifikasi 2FA WebAuthn. Klik tombol di bawah untuk membuka tab baru dan ikuti instruksi yang diberikan." - }, - "webAuthnNewTabOpen": { - "message": "Buka tab baru" - }, "openInNewTab": { - "message": "Open in new tab" + "message": "Buka dalam tab baru" }, "webAuthnAuthenticate": { "message": "Autentikasi dengan WebAuthn." }, "readSecurityKey": { - "message": "Read security key" + "message": "Baca kunci keamanan" }, "awaitingSecurityKeyInteraction": { - "message": "Awaiting security key interaction..." + "message": "Menunggu interaksi kunci keamanan..." }, "loginUnavailable": { "message": "Info Masuk Tidak Tersedia" @@ -1474,7 +1469,7 @@ "message": "Opsi Info Masuk Dua Langkah" }, "selectTwoStepLoginMethod": { - "message": "Select two-step login method" + "message": "Pilih metode log masuk dua langkah" }, "recoveryCodeDesc": { "message": "Kehilangan akses ke semua penyedia dua faktor Anda? Gunakan kode pemulihan untuk menonaktifkan semua penyedia dua faktor dari akun Anda." @@ -1668,7 +1663,7 @@ "message": "Seret untuk mengurutkan" }, "dragToReorder": { - "message": "Drag to reorder" + "message": "Seret untuk mengubah urutan" }, "cfTypeText": { "message": "Teks" @@ -2144,7 +2139,7 @@ "message": "Pembuat nama pengguna" }, "useThisEmail": { - "message": "Use this email" + "message": "Pakai surel ini" }, "useThisPassword": { "message": "Gunakan kata sandi ini" @@ -2164,7 +2159,7 @@ "description": "This will be used as part of a larger sentence, broken up to include the generator icon. The full sentence will read 'Use the generator [GENERATOR_ICON] to create a strong unique password'" }, "vaultCustomization": { - "message": "Vault customization" + "message": "Penyesuaian brankas" }, "vaultTimeoutAction": { "message": "Tindakan Batas Waktu Brankas" @@ -2173,13 +2168,13 @@ "message": "Batas waktu tindakan" }, "newCustomizationOptionsCalloutTitle": { - "message": "New customization options" + "message": "Opsi penyesuaian baru" }, "newCustomizationOptionsCalloutContent": { - "message": "Customize your vault experience with quick copy actions, compact mode, and more!" + "message": "Sesuaikan pengalaman brankas Anda dengan aksi salin cepat, mode kompak, dan lainnya!" }, "newCustomizationOptionsCalloutLink": { - "message": "View all Appearance settings" + "message": "Lihat semua pengaturan Penampilan" }, "lock": { "message": "Kunci", @@ -2327,6 +2322,9 @@ "privacyPolicy": { "message": "Kebijakan Privasi" }, + "yourNewPasswordCannotBeTheSameAsYourCurrentPassword": { + "message": "Your new password cannot be the same as your current password." + }, "hintEqualsPassword": { "message": "Petunjuk kata sandi Anda tidak boleh sama dengan kata sandi Anda." }, @@ -2437,10 +2435,10 @@ "description": "A category title describing the concept of web domains" }, "blockedDomains": { - "message": "Blocked domains" + "message": "Domain terblokir" }, "learnMoreAboutBlockedDomains": { - "message": "Learn more about blocked domains" + "message": "Pelajari lebih lanjut tentang domain yang diblokir" }, "excludedDomains": { "message": "Domain yang Dikecualikan" @@ -2452,19 +2450,19 @@ "message": "Bitwarden tidak akan meminta untuk menyimpan rincian login untuk domain tersebut. Anda harus menyegarkan halaman agar perubahan diterapkan." }, "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": "Isi otomatis dan fitur terkait lain tidak akan ditawarkan bagi situs-situs web ini. Anda mesti menyegarkan halaman agar perubahan berdampak." }, "autofillBlockedNoticeV2": { - "message": "Autofill is blocked for this website." + "message": "Isi otomatis diblokir bagi situs web ini." }, "autofillBlockedNoticeGuidance": { - "message": "Change this in settings" + "message": "Ubah ini di pengaturan" }, "change": { "message": "Ubah" }, "changeButtonTitle": { - "message": "Change password - $ITEMNAME$", + "message": "Ubah kata sandi - $ITEMNAME$", "placeholders": { "itemname": { "content": "$1", @@ -2473,10 +2471,10 @@ } }, "atRiskPasswords": { - "message": "At-risk passwords" + "message": "Kata sandi yang berrisiko" }, "atRiskPasswordDescSingleOrg": { - "message": "$ORGANIZATION$ is requesting you change one password because it is at-risk.", + "message": "$ORGANIZATION$ meminta Ada mengubah satu kata sandi karena itu berrisiko.", "placeholders": { "organization": { "content": "$1", @@ -2485,7 +2483,7 @@ } }, "atRiskPasswordsDescSingleOrgPlural": { - "message": "$ORGANIZATION$ is requesting you change the $COUNT$ passwords because they are at-risk.", + "message": "$ORGANIZATION$ meminta Anda mengubah $COUNT$ kata sandi karena mereka berrisiko.", "placeholders": { "organization": { "content": "$1", @@ -2498,7 +2496,7 @@ } }, "atRiskPasswordsDescMultiOrgPlural": { - "message": "Your organizations are requesting you change the $COUNT$ passwords because they are at-risk.", + "message": "Organisasi Anda meminta Anda mengubah $COUNT$ kata sandi karena mereka berrisiko.", "placeholders": { "count": { "content": "$1", @@ -2507,10 +2505,10 @@ } }, "reviewAndChangeAtRiskPassword": { - "message": "Review and change one at-risk password" + "message": "Tinjau dan ubah satu kata sandi berrisiko" }, "reviewAndChangeAtRiskPasswordsPlural": { - "message": "Review and change $COUNT$ at-risk passwords", + "message": "Tinjau dan ubah $COUNT$ kata sandi berrisiko", "placeholders": { "count": { "content": "$1", @@ -2519,7 +2517,7 @@ } }, "changeAtRiskPasswordsFaster": { - "message": "Change at-risk passwords faster" + "message": "Ubah lebih cepat kata sandi yang berrisiko" }, "changeAtRiskPasswordsFasterDesc": { "message": "Update your settings so you can quickly autofill your passwords and generate new ones" @@ -2528,21 +2526,21 @@ "message": "Review at-risk logins" }, "reviewAtRiskPasswords": { - "message": "Review at-risk passwords" + "message": "Tinjau kata sandi yang berrisiko" }, "reviewAtRiskLoginsSlideDesc": { - "message": "Your organization passwords are at-risk because they are weak, reused, and/or exposed.", + "message": "Kata sandi organisasi Anda berrisiko karena mereka lemah, dipakai ulang, dan/atau terpapar.", "description": "Description of the review at-risk login slide on the at-risk password page carousel" }, - "reviewAtRiskLoginSlideImgAlt": { - "message": "Illustration of a list of logins that are at-risk" + "reviewAtRiskLoginSlideImgAltPeriod": { + "message": "Illustration of a list of logins that are at-risk." }, "generatePasswordSlideDesc": { "message": "Quickly generate a strong, unique password with the Bitwarden autofill menu on the at-risk site.", "description": "Description of the generate password slide on the at-risk password page carousel" }, - "generatePasswordSlideImgAlt": { - "message": "Illustration of the Bitwarden autofill menu displaying a generated password" + "generatePasswordSlideImgAltPeriod": { + "message": "Illustration of the Bitwarden autofill menu displaying a generated password." }, "updateInBitwarden": { "message": "Update in Bitwarden" @@ -2551,8 +2549,8 @@ "message": "Bitwarden will then prompt you to update the password in the password manager.", "description": "Description of the update in Bitwarden slide on the at-risk password page carousel" }, - "updateInBitwardenSlideImgAlt": { - "message": "Illustration of a Bitwarden’s notification prompting the user to update the login" + "updateInBitwardenSlideImgAltPeriod": { + "message": "Illustration of a Bitwarden’s notification prompting the user to update the login." }, "turnOnAutofill": { "message": "Turn on autofill" @@ -2561,7 +2559,7 @@ "message": "Turned on autofill" }, "dismiss": { - "message": "Dismiss" + "message": "Tutup" }, "websiteItemLabel": { "message": "Situs web $number$ (URI)", @@ -2582,7 +2580,7 @@ } }, "blockedDomainsSavedSuccess": { - "message": "Blocked domain changes saved" + "message": "Perubahan domain yang diblokir disimpan" }, "excludedDomainsSavedSuccess": { "message": "Perubahan domain yang diabaikan telah disimpan" @@ -3007,6 +3005,15 @@ } } }, + "exportingIndividualVaultWithAttachmentsDescription": { + "message": "Only the individual vault items including attachments associated with $EMAIL$ will be exported. Organization vault items will not be included", + "placeholders": { + "email": { + "content": "$1", + "example": "name@example.com" + } + } + }, "exportingOrganizationVaultTitle": { "message": "Mengekspor brankas organisasi" }, @@ -3023,17 +3030,17 @@ "message": "Galat" }, "decryptionError": { - "message": "Decryption error" + "message": "Kesalahan dekripsi" }, "couldNotDecryptVaultItemsBelow": { - "message": "Bitwarden could not decrypt the vault item(s) listed below." + "message": "Bitwarden tidak bisa mendekripsi butir brankas yang tercantum di bawah." }, "contactCSToAvoidDataLossPart1": { "message": "Contact customer success", "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": "untuk menghindari lanjutan hilang data.", "description": "This is part of a larger sentence. The full sentence will read 'Contact customer success to avoid additional data loss.'" }, "generateUsername": { @@ -3168,7 +3175,7 @@ } }, "forwaderInvalidOperation": { - "message": "$SERVICENAME$ refused your request. Please contact your service provider for assistance.", + "message": "$SERVICENAME$ menolak permintaan Anda. Harap hubungi penyedia layanan Anda untuk bantuan.", "description": "Displayed when the user is forbidden from using the API by the forwarding service.", "placeholders": { "servicename": { @@ -3178,7 +3185,7 @@ } }, "forwaderInvalidOperationWithMessage": { - "message": "$SERVICENAME$ refused your request: $ERRORMESSAGE$", + "message": "$SERVICENAME$ menolak permintaan Anda: $ERRORMESSAGE$", "description": "Displayed when the user is forbidden from using the API by the forwarding service with an error message.", "placeholders": { "servicename": { @@ -3327,13 +3334,13 @@ "message": "Sebuah pemberitahuan dikirim ke perangkat Anda." }, "notificationSentDevicePart1": { - "message": "Unlock Bitwarden on your device or on the" + "message": "Buka kunci Bitwarden pada perangkat Anda atau pada" }, "notificationSentDeviceAnchor": { - "message": "web app" + "message": "aplikasi web" }, "notificationSentDevicePart2": { - "message": "Make sure the Fingerprint phrase matches the one below before approving." + "message": "Pastikan frasa Sidik Jari cocok dengan yang di bawah sebelum menyetujui." }, "aNotificationWasSentToYourDevice": { "message": "Sebuah pemberitahuan telah dikirim ke perangkat Anda" @@ -3348,7 +3355,7 @@ "message": "Memulai login" }, "logInRequestSent": { - "message": "Request sent" + "message": "Permintaan terkirim" }, "exposedMasterPassword": { "message": "Kata Sandi Utama yang Terpapar" @@ -3839,15 +3846,9 @@ "duoHealthCheckResultsInNullAuthUrlError": { "message": "Gagal menyambungkan dengan layanan Duo. Gunakan cara masuk dua-langkah lainnya atau hubungi Duo untuk mendapatkan panduan." }, - "launchDuoAndFollowStepsToFinishLoggingIn": { - "message": "Luncurkan Duo dan ikuti langkah-langkah untuk menyelesaikan masuk." - }, "duoRequiredForAccount": { "message": "Login dua-langkah Duo diperlukan untuk akun Anda." }, - "popoutTheExtensionToCompleteLogin": { - "message": "Sembulkan ekstensi untuk melengkapi login." - }, "popoutExtension": { "message": "Sembulkan ekstensi" }, @@ -4080,7 +4081,7 @@ "message": "Akun aktif" }, "bitwardenAccount": { - "message": "Bitwarden account" + "message": "Akun Bitwarden" }, "availableAccounts": { "message": "Akun yang tersedia" @@ -4203,10 +4204,10 @@ "message": "Kunci sandi dihapus" }, "autofillSuggestions": { - "message": "Autofill suggestions" + "message": "Saran isi otomatis" }, "itemSuggestions": { - "message": "Suggested items" + "message": "Butir yang disarankan" }, "autofillSuggestionsTip": { "message": "Simpan benda login untuk situs ini ke isi otomatis" @@ -4270,6 +4271,20 @@ } } }, + "viewItemTitleWithField": { + "message": "View item - $ITEMNAME$ - $FIELD$", + "description": "Title for a link that opens a view for an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + }, + "field": { + "content": "$2", + "example": "Username" + } + } + }, "autofillTitle": { "message": "Isi otomatis - $ITEMNAME$", "description": "Title for a button that autofills a login item.", @@ -4280,8 +4295,22 @@ } } }, + "autofillTitleWithField": { + "message": "Autofill - $ITEMNAME$ - $FIELD$", + "description": "Title for a button that autofills a login item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + }, + "field": { + "content": "$2", + "example": "Username" + } + } + }, "copyFieldValue": { - "message": "Copy $FIELD$, $VALUE$", + "message": "Salin $FIELD$, $VALUE$", "description": "Title for a button that copies a field value to the clipboard.", "placeholders": { "field": { @@ -4769,7 +4798,7 @@ } }, "itemLocation": { - "message": "Item Location" + "message": "Lokasi Item" }, "fileSend": { "message": "File Send" @@ -4835,7 +4864,7 @@ "message": "File saved to device. Manage from your device downloads." }, "showCharacterCount": { - "message": "Show character count" + "message": "Tunjukkan cacah karakter" }, "hideCharacterCount": { "message": "Hide character count" @@ -4896,15 +4925,15 @@ "description": "Heading for the password generator within the inline menu" }, "passwordRegenerated": { - "message": "Password regenerated", + "message": "Kata sandi dibuat ulang", "description": "Notification message for when a password has been regenerated" }, - "saveLoginToBitwarden": { - "message": "Save login to Bitwarden?", + "saveToBitwarden": { + "message": "Save to Bitwarden", "description": "Confirmation message for saving a login to Bitwarden" }, "spaceCharacterDescriptor": { - "message": "Space", + "message": "Spasi", "description": "Represents the space key in screen reader content as a readable word" }, "tildeCharacterDescriptor": { @@ -5051,22 +5080,22 @@ "message": "Beta" }, "importantNotice": { - "message": "Important notice" + "message": "Pemberitahuan penting" }, "setupTwoStepLogin": { - "message": "Set up two-step login" + "message": "Siapkan log masuk dua langkah" }, "newDeviceVerificationNoticeContentPage1": { - "message": "Bitwarden will send a code to your account email to verify logins from new devices starting in February 2025." + "message": "Bitwarden akan mengirim suatu kode ke akun surel Anda untuk memverifikasi log masuk dari perangkat baru sejak Februari 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": "Anda dapat menyiapkan log masuk dua langkah sebagai cara alternatif untuk melindungi akun Anda atau mengubah surel Anda ke yang bisa Anda akses." }, "remindMeLater": { - "message": "Remind me later" + "message": "Ingatkan saya nanti" }, "newDeviceVerificationNoticePageOneFormContent": { - "message": "Do you have reliable access to your email, $EMAIL$?", + "message": "Apakah Anda punya akses yang handal ke surel Anda, $EMAIL$?", "placeholders": { "email": { "content": "$1", @@ -5081,7 +5110,7 @@ "message": "Ya, saya dapat mengakses surel saya secara handla" }, "turnOnTwoStepLogin": { - "message": "Turn on two-step login" + "message": "Nyalakan log masuk dua langkah" }, "changeAcctEmail": { "message": "Ubah surel akun" @@ -5139,5 +5168,32 @@ }, "changeAtRiskPassword": { "message": "Ubah kata sandi yang berrisiko" + }, + "introCarouselLabel": { + "message": "Welcome to Bitwarden" + }, + "securityPrioritized": { + "message": "Security, prioritized" + }, + "securityPrioritizedBody": { + "message": "Save logins, cards, and identities to your secure vault. Bitwarden uses zero-knowledge, end-to-end encryption to protect what’s important to you." + }, + "quickLogin": { + "message": "Quick and easy login" + }, + "quickLoginBody": { + "message": "Set up biometric unlock and autofill to log into your accounts without typing a single letter." + }, + "secureUser": { + "message": "Level up your logins" + }, + "secureUserBody": { + "message": "Use the generator to create and save strong, unique passwords for all your accounts." + }, + "secureDevices": { + "message": "Your data, when and where you need it" + }, + "secureDevicesBody": { + "message": "Save unlimited passwords across unlimited devices with Bitwarden mobile, browser, and desktop apps." } } diff --git a/apps/browser/src/_locales/it/messages.json b/apps/browser/src/_locales/it/messages.json index cb8e414ca37..fa8ed288cfc 100644 --- a/apps/browser/src/_locales/it/messages.json +++ b/apps/browser/src/_locales/it/messages.json @@ -1098,6 +1098,31 @@ "message": "Accesso aggiornato", "description": "Message displayed when login details are successfully updated." }, + "loginUpdateTaskSuccess": { + "message": "Great job! You took the steps to make you and $ORGANIZATION$ more secure.", + "placeholders": { + "organization": { + "content": "$1" + } + }, + "description": "Shown to user after login is updated." + }, + "loginUpdateTaskSuccessAdditional": { + "message": "Thank you for making $ORGANIZATION$ more secure. You have $TASK_COUNT$ more passwords to update.", + "placeholders": { + "organization": { + "content": "$1" + }, + "task_count": { + "content": "$2" + } + }, + "description": "Shown to user after login is updated." + }, + "nextSecurityTaskAction": { + "message": "Change next password", + "description": "Message prompting user to undertake completion of another security task." + }, "saveFailure": { "message": "Errore nel salvataggio", "description": "Error message shown when the system fails to save login details." @@ -1391,24 +1416,12 @@ "premiumRequiredDesc": { "message": "Passa a Premium per utilizzare questa funzionalità." }, - "enterVerificationCodeApp": { - "message": "Inserisci il codice di verifica a 6 cifre dalla tua app di autenticazione." - }, "authenticationTimeout": { "message": "Timeout autenticazione" }, "authenticationSessionTimedOut": { "message": "La sessione di autenticazione è scaduta. Accedi di nuovo." }, - "enterVerificationCodeEmail": { - "message": "Inserisci il codice di verifica a 6 cifre inviato a $EMAIL$.", - "placeholders": { - "email": { - "content": "$1", - "example": "example@gmail.com" - } - } - }, "verificationCodeEmailSent": { "message": "L'email di verifica è stata inviata all'indirizzo $EMAIL$.", "placeholders": { @@ -1418,18 +1431,9 @@ } } }, - "rememberMe": { - "message": "Ricordami" - }, "dontAskAgainOnThisDeviceFor30Days": { "message": "Non chiedere più su questo dispositivo per 30 giorni" }, - "sendVerificationCodeEmailAgain": { - "message": "Invia di nuovo l'email con codice di verifica" - }, - "useAnotherTwoStepMethod": { - "message": "Usa un altro metodo di verifica in due passaggi" - }, "selectAnotherMethod": { "message": "Seleziona un altro metodo", "description": "Select another two-step login method" @@ -1437,18 +1441,9 @@ "useYourRecoveryCode": { "message": "Usa il tuo codice di recupero" }, - "insertYubiKey": { - "message": "Inserisci la tua YubiKey nella porta USB del computer, poi premi il suo pulsante." - }, "insertU2f": { "message": "Inserisci la tua chiave di sicurezza nella porta USB del tuo computer. Se dispone di un pulsante, premilo." }, - "webAuthnNewTab": { - "message": "Per avviare la verifica WebAuthn 2FA. Clicca il pulsante qui sotto per aprire una nuova scheda e segui le istruzioni fornite nella nuova scheda." - }, - "webAuthnNewTabOpen": { - "message": "Apri nuova scheda" - }, "openInNewTab": { "message": "Apri in una nuova scheda" }, @@ -2327,6 +2322,9 @@ "privacyPolicy": { "message": "Informativa sulla Privacy" }, + "yourNewPasswordCannotBeTheSameAsYourCurrentPassword": { + "message": "Your new password cannot be the same as your current password." + }, "hintEqualsPassword": { "message": "Il suggerimento della password non può essere uguale alla password." }, @@ -2534,15 +2532,15 @@ "message": "Le parole d'accesso dell'organizzazione sono a rischio perché sono deboli, riutilizzate, e/o esposte.", "description": "Description of the review at-risk login slide on the at-risk password page carousel" }, - "reviewAtRiskLoginSlideImgAlt": { - "message": "Illustrazione di un elenco di accessi a rischio" + "reviewAtRiskLoginSlideImgAltPeriod": { + "message": "Illustration of a list of logins that are at-risk." }, "generatePasswordSlideDesc": { "message": "Genera rapidamente una parola d'accesso forte e unica con il menu' di riempimento automatico Bitwarden nel sito a rischio.", "description": "Description of the generate password slide on the at-risk password page carousel" }, - "generatePasswordSlideImgAlt": { - "message": "Illustrazione del menu' di riempimento automatico Bitwarden che mostra una parola d'accesso generata" + "generatePasswordSlideImgAltPeriod": { + "message": "Illustration of the Bitwarden autofill menu displaying a generated password." }, "updateInBitwarden": { "message": "Aggiorna in Bitwarden" @@ -2551,8 +2549,8 @@ "message": "Bitwarden ti chiederà quindi di aggiornare la parola d'accesso nel gestore di parole d'accesso.", "description": "Description of the update in Bitwarden slide on the at-risk password page carousel" }, - "updateInBitwardenSlideImgAlt": { - "message": "Illustrazione di una notifica Bitwarden che richiede all'utente di aggiornare l'accesso" + "updateInBitwardenSlideImgAltPeriod": { + "message": "Illustration of a Bitwarden’s notification prompting the user to update the login." }, "turnOnAutofill": { "message": "Attiva riempimento automatico" @@ -3007,6 +3005,15 @@ } } }, + "exportingIndividualVaultWithAttachmentsDescription": { + "message": "Only the individual vault items including attachments associated with $EMAIL$ will be exported. Organization vault items will not be included", + "placeholders": { + "email": { + "content": "$1", + "example": "name@example.com" + } + } + }, "exportingOrganizationVaultTitle": { "message": "Esportando cassaforte dell'organizzazione" }, @@ -3839,15 +3846,9 @@ "duoHealthCheckResultsInNullAuthUrlError": { "message": "Errore di connessione con il servizio Duo. Utilizza un metodo di login in due passaggi diverso o contatta Duo per assistenza." }, - "launchDuoAndFollowStepsToFinishLoggingIn": { - "message": "Avvia DUO e segui i passaggi per finire di accedere." - }, "duoRequiredForAccount": { "message": "Per il tuo account è richiesta la verifica in due passaggi DUO." }, - "popoutTheExtensionToCompleteLogin": { - "message": "Apri l'estensione in un popup per completare l'accesso." - }, "popoutExtension": { "message": "Estrai estensione" }, @@ -4270,6 +4271,20 @@ } } }, + "viewItemTitleWithField": { + "message": "View item - $ITEMNAME$ - $FIELD$", + "description": "Title for a link that opens a view for an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + }, + "field": { + "content": "$2", + "example": "Username" + } + } + }, "autofillTitle": { "message": "Riempi automaticamente - $ITEMNAME$", "description": "Title for a button that autofills a login item.", @@ -4280,6 +4295,20 @@ } } }, + "autofillTitleWithField": { + "message": "Autofill - $ITEMNAME$ - $FIELD$", + "description": "Title for a button that autofills a login item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + }, + "field": { + "content": "$2", + "example": "Username" + } + } + }, "copyFieldValue": { "message": "Copia $FIELD$, $VALUE$", "description": "Title for a button that copies a field value to the clipboard.", @@ -4899,8 +4928,8 @@ "message": "Password rigenerata", "description": "Notification message for when a password has been regenerated" }, - "saveLoginToBitwarden": { - "message": "Salvare il login su Bitwarden?", + "saveToBitwarden": { + "message": "Save to Bitwarden", "description": "Confirmation message for saving a login to Bitwarden" }, "spaceCharacterDescriptor": { @@ -5139,5 +5168,32 @@ }, "changeAtRiskPassword": { "message": "Cambia parola d'accesso a rischio" + }, + "introCarouselLabel": { + "message": "Welcome to Bitwarden" + }, + "securityPrioritized": { + "message": "Security, prioritized" + }, + "securityPrioritizedBody": { + "message": "Save logins, cards, and identities to your secure vault. Bitwarden uses zero-knowledge, end-to-end encryption to protect what’s important to you." + }, + "quickLogin": { + "message": "Quick and easy login" + }, + "quickLoginBody": { + "message": "Set up biometric unlock and autofill to log into your accounts without typing a single letter." + }, + "secureUser": { + "message": "Level up your logins" + }, + "secureUserBody": { + "message": "Use the generator to create and save strong, unique passwords for all your accounts." + }, + "secureDevices": { + "message": "Your data, when and where you need it" + }, + "secureDevicesBody": { + "message": "Save unlimited passwords across unlimited devices with Bitwarden mobile, browser, and desktop apps." } } diff --git a/apps/browser/src/_locales/ja/messages.json b/apps/browser/src/_locales/ja/messages.json index b67d0b62a6e..1f6aa5e0045 100644 --- a/apps/browser/src/_locales/ja/messages.json +++ b/apps/browser/src/_locales/ja/messages.json @@ -1098,6 +1098,31 @@ "message": "ログイン情報が更新されました", "description": "Message displayed when login details are successfully updated." }, + "loginUpdateTaskSuccess": { + "message": "Great job! You took the steps to make you and $ORGANIZATION$ more secure.", + "placeholders": { + "organization": { + "content": "$1" + } + }, + "description": "Shown to user after login is updated." + }, + "loginUpdateTaskSuccessAdditional": { + "message": "Thank you for making $ORGANIZATION$ more secure. You have $TASK_COUNT$ more passwords to update.", + "placeholders": { + "organization": { + "content": "$1" + }, + "task_count": { + "content": "$2" + } + }, + "description": "Shown to user after login is updated." + }, + "nextSecurityTaskAction": { + "message": "Change next password", + "description": "Message prompting user to undertake completion of another security task." + }, "saveFailure": { "message": "保存エラー", "description": "Error message shown when the system fails to save login details." @@ -1391,24 +1416,12 @@ "premiumRequiredDesc": { "message": "この機能を使うにはプレミアム会員になってください。" }, - "enterVerificationCodeApp": { - "message": "認証アプリに表示された6桁の認証コードを入力してください。" - }, "authenticationTimeout": { "message": "認証のタイムアウト" }, "authenticationSessionTimedOut": { "message": "認証セッションの有効期限が切れました。ログインプロセスを再開してください。" }, - "enterVerificationCodeEmail": { - "message": "$EMAIL$に送信された6桁の認証コードを入力してください。", - "placeholders": { - "email": { - "content": "$1", - "example": "example@gmail.com" - } - } - }, "verificationCodeEmailSent": { "message": "$EMAIL$に認証コードを送信しました。", "placeholders": { @@ -1418,18 +1431,9 @@ } } }, - "rememberMe": { - "message": "情報を保存する" - }, "dontAskAgainOnThisDeviceFor30Days": { "message": "このデバイスで30日間再表示しない" }, - "sendVerificationCodeEmailAgain": { - "message": "確認コードをメールで再送" - }, - "useAnotherTwoStepMethod": { - "message": "他の2段階認証方法を使用" - }, "selectAnotherMethod": { "message": "別の方法を選択", "description": "Select another two-step login method" @@ -1437,18 +1441,9 @@ "useYourRecoveryCode": { "message": "リカバリーコードを使用する" }, - "insertYubiKey": { - "message": " YubiKey を USB ポートに挿入し、ボタンをタッチしてください。" - }, "insertU2f": { "message": "セキュリティキーを USB ポートに挿入し、ボタンがある場合はボタンをタッチしてください。" }, - "webAuthnNewTab": { - "message": "WebAuthn 2FA 認証を開始するには、下のボタンをクリックして新しいタブを開き、新しいタブの指示に従ってください。" - }, - "webAuthnNewTabOpen": { - "message": "新しいタブを開く" - }, "openInNewTab": { "message": "新しいタブで開く" }, @@ -2327,6 +2322,9 @@ "privacyPolicy": { "message": "プライバシーポリシー" }, + "yourNewPasswordCannotBeTheSameAsYourCurrentPassword": { + "message": "新しいパスワードを現在のパスワードと同じにすることはできません。" + }, "hintEqualsPassword": { "message": "パスワードのヒントをパスワードと同じにすることはできません。" }, @@ -2534,14 +2532,14 @@ "message": "組織で使用するパスワードが脆弱である、または再利用されているか流出しており、危険な状態です。", "description": "Description of the review at-risk login slide on the at-risk password page carousel" }, - "reviewAtRiskLoginSlideImgAlt": { + "reviewAtRiskLoginSlideImgAltPeriod": { "message": "危険な状態にあるログイン情報の一覧表示の例" }, "generatePasswordSlideDesc": { "message": "Bitwarden の自動入力メニューで、強力で一意なパスワードをすぐに生成しましょう。", "description": "Description of the generate password slide on the at-risk password page carousel" }, - "generatePasswordSlideImgAlt": { + "generatePasswordSlideImgAltPeriod": { "message": "Bitwarden の自動入力メニューで、生成されたパスワードが表示されている例" }, "updateInBitwarden": { @@ -2551,7 +2549,7 @@ "message": "続いて、 Bitwarden がパスワードマネージャーに保存されたパスワードを更新するよう促します。", "description": "Description of the update in Bitwarden slide on the at-risk password page carousel" }, - "updateInBitwardenSlideImgAlt": { + "updateInBitwardenSlideImgAltPeriod": { "message": "ユーザーにログイン情報を更新するよう促す Bitwarden の通知例" }, "turnOnAutofill": { @@ -3007,6 +3005,15 @@ } } }, + "exportingIndividualVaultWithAttachmentsDescription": { + "message": "$EMAIL$ に関連付けられた個人用保管庫のアイテムのみが、添付ファイルを含めてエクスポートされます。組織用保管庫のアイテムは含まれません。", + "placeholders": { + "email": { + "content": "$1", + "example": "name@example.com" + } + } + }, "exportingOrganizationVaultTitle": { "message": "組織保管庫のエクスポート" }, @@ -3839,15 +3846,9 @@ "duoHealthCheckResultsInNullAuthUrlError": { "message": "Duo サービスへの接続中にエラーが発生しました。異なる二段階ログイン方法を使用するか、Duo に連絡してください。" }, - "launchDuoAndFollowStepsToFinishLoggingIn": { - "message": "ログインを完了するには DUO を起動し手順に従ってください。" - }, "duoRequiredForAccount": { "message": "アカウントには Duo 二段階認証が必要です。" }, - "popoutTheExtensionToCompleteLogin": { - "message": "ログインを完了するために拡張機能を開きます。" - }, "popoutExtension": { "message": "拡張機能のポップアップ" }, @@ -4270,6 +4271,20 @@ } } }, + "viewItemTitleWithField": { + "message": "アイテムを表示 - $ITEMNAME$ - $FIELD$", + "description": "Title for a link that opens a view for an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + }, + "field": { + "content": "$2", + "example": "Username" + } + } + }, "autofillTitle": { "message": "自動入力 - $ITEMNAME$", "description": "Title for a button that autofills a login item.", @@ -4280,6 +4295,20 @@ } } }, + "autofillTitleWithField": { + "message": "自動入力 - $ITEMNAME$ - $FIELD$", + "description": "Title for a button that autofills a login item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + }, + "field": { + "content": "$2", + "example": "Username" + } + } + }, "copyFieldValue": { "message": "$FIELD$ 「$VALUE$」 をコピー", "description": "Title for a button that copies a field value to the clipboard.", @@ -4899,8 +4928,8 @@ "message": "パスワードを再生成しました", "description": "Notification message for when a password has been regenerated" }, - "saveLoginToBitwarden": { - "message": "Bitwarden にログイン情報を保存しますか?", + "saveToBitwarden": { + "message": "Save to Bitwarden", "description": "Confirmation message for saving a login to Bitwarden" }, "spaceCharacterDescriptor": { @@ -5066,7 +5095,7 @@ "message": "後で再通知" }, "newDeviceVerificationNoticePageOneFormContent": { - "message": "新しいメールアドレス $EMAIL$ はあなたが管理しているものですか?", + "message": "メールアドレス $EMAIL$ は、確実にアクセスできるものですか?", "placeholders": { "email": { "content": "$1", @@ -5139,5 +5168,32 @@ }, "changeAtRiskPassword": { "message": "危険なパスワードの変更" + }, + "introCarouselLabel": { + "message": "Bitwarden へようこそ" + }, + "securityPrioritized": { + "message": "セキュリティが優先" + }, + "securityPrioritizedBody": { + "message": "ログイン情報、カード、ID を安全な保管庫に保存します。 Bitwarden はゼロ知識、エンドツーエンドの暗号化を使用して、あなたにとって重要なものを保護します。" + }, + "quickLogin": { + "message": "すばやく簡単にログイン" + }, + "quickLoginBody": { + "message": "生体認証によるロック解除と自動入力を設定すると、文字を一切入力することなく各種アカウントにログインすることができます。" + }, + "secureUser": { + "message": "ログインをレベルアップ" + }, + "secureUserBody": { + "message": "パスワード生成機能を使用すると、すべてのアカウントで強力な一意のパスワードを作成して保存できます。" + }, + "secureDevices": { + "message": "必要なデータを、いつでもどこでも" + }, + "secureDevicesBody": { + "message": "Bitwarden のモバイル、ブラウザ、デスクトップアプリでは、保存できるパスワード数やデバイス数に制限はありません。" } } diff --git a/apps/browser/src/_locales/ka/messages.json b/apps/browser/src/_locales/ka/messages.json index 818d7cdcd19..613b876c67b 100644 --- a/apps/browser/src/_locales/ka/messages.json +++ b/apps/browser/src/_locales/ka/messages.json @@ -1098,6 +1098,31 @@ "message": "Login updated", "description": "Message displayed when login details are successfully updated." }, + "loginUpdateTaskSuccess": { + "message": "Great job! You took the steps to make you and $ORGANIZATION$ more secure.", + "placeholders": { + "organization": { + "content": "$1" + } + }, + "description": "Shown to user after login is updated." + }, + "loginUpdateTaskSuccessAdditional": { + "message": "Thank you for making $ORGANIZATION$ more secure. You have $TASK_COUNT$ more passwords to update.", + "placeholders": { + "organization": { + "content": "$1" + }, + "task_count": { + "content": "$2" + } + }, + "description": "Shown to user after login is updated." + }, + "nextSecurityTaskAction": { + "message": "Change next password", + "description": "Message prompting user to undertake completion of another security task." + }, "saveFailure": { "message": "Error saving", "description": "Error message shown when the system fails to save login details." @@ -1391,24 +1416,12 @@ "premiumRequiredDesc": { "message": "A Premium membership is required to use this feature." }, - "enterVerificationCodeApp": { - "message": "Enter the 6 digit verification code from your authenticator app." - }, "authenticationTimeout": { "message": "Authentication timeout" }, "authenticationSessionTimedOut": { "message": "The authentication session timed out. Please restart the login process." }, - "enterVerificationCodeEmail": { - "message": "Enter the 6 digit verification code that was emailed to $EMAIL$.", - "placeholders": { - "email": { - "content": "$1", - "example": "example@gmail.com" - } - } - }, "verificationCodeEmailSent": { "message": "Verification email sent to $EMAIL$.", "placeholders": { @@ -1418,18 +1431,9 @@ } } }, - "rememberMe": { - "message": "დამიმახსოვრე" - }, "dontAskAgainOnThisDeviceFor30Days": { "message": "Don't ask again on this device for 30 days" }, - "sendVerificationCodeEmailAgain": { - "message": "Send verification code email again" - }, - "useAnotherTwoStepMethod": { - "message": "Use another two-step login method" - }, "selectAnotherMethod": { "message": "Select another method", "description": "Select another two-step login method" @@ -1437,18 +1441,9 @@ "useYourRecoveryCode": { "message": "Use your recovery code" }, - "insertYubiKey": { - "message": "Insert your YubiKey into your computer's USB port, then touch its button." - }, "insertU2f": { "message": "Insert your security key into your computer's USB port. If it has a button, touch it." }, - "webAuthnNewTab": { - "message": "To start the WebAuthn 2FA verification. Click the button below to open a new tab and follow the instructions provided in the new tab." - }, - "webAuthnNewTabOpen": { - "message": "ახალი ჩანართის გახსნა" - }, "openInNewTab": { "message": "Open in new tab" }, @@ -2327,6 +2322,9 @@ "privacyPolicy": { "message": "კონფიდენციალობის პოლიტიკა" }, + "yourNewPasswordCannotBeTheSameAsYourCurrentPassword": { + "message": "Your new password cannot be the same as your current password." + }, "hintEqualsPassword": { "message": "Your password hint cannot be the same as your password." }, @@ -2534,15 +2532,15 @@ "message": "Your organization passwords are at-risk because they are weak, reused, and/or exposed.", "description": "Description of the review at-risk login slide on the at-risk password page carousel" }, - "reviewAtRiskLoginSlideImgAlt": { - "message": "Illustration of a list of logins that are at-risk" + "reviewAtRiskLoginSlideImgAltPeriod": { + "message": "Illustration of a list of logins that are at-risk." }, "generatePasswordSlideDesc": { "message": "Quickly generate a strong, unique password with the Bitwarden autofill menu on the at-risk site.", "description": "Description of the generate password slide on the at-risk password page carousel" }, - "generatePasswordSlideImgAlt": { - "message": "Illustration of the Bitwarden autofill menu displaying a generated password" + "generatePasswordSlideImgAltPeriod": { + "message": "Illustration of the Bitwarden autofill menu displaying a generated password." }, "updateInBitwarden": { "message": "Update in Bitwarden" @@ -2551,8 +2549,8 @@ "message": "Bitwarden will then prompt you to update the password in the password manager.", "description": "Description of the update in Bitwarden slide on the at-risk password page carousel" }, - "updateInBitwardenSlideImgAlt": { - "message": "Illustration of a Bitwarden’s notification prompting the user to update the login" + "updateInBitwardenSlideImgAltPeriod": { + "message": "Illustration of a Bitwarden’s notification prompting the user to update the login." }, "turnOnAutofill": { "message": "Turn on autofill" @@ -3007,6 +3005,15 @@ } } }, + "exportingIndividualVaultWithAttachmentsDescription": { + "message": "Only the individual vault items including attachments associated with $EMAIL$ will be exported. Organization vault items will not be included", + "placeholders": { + "email": { + "content": "$1", + "example": "name@example.com" + } + } + }, "exportingOrganizationVaultTitle": { "message": "Exporting organization vault" }, @@ -3839,15 +3846,9 @@ "duoHealthCheckResultsInNullAuthUrlError": { "message": "Error connecting with the Duo service. Use a different two-step login method or contact Duo for assistance." }, - "launchDuoAndFollowStepsToFinishLoggingIn": { - "message": "Launch Duo and follow the steps to finish logging in." - }, "duoRequiredForAccount": { "message": "Duo two-step login is required for your account." }, - "popoutTheExtensionToCompleteLogin": { - "message": "Popout the extension to complete login." - }, "popoutExtension": { "message": "Popout extension" }, @@ -4270,6 +4271,20 @@ } } }, + "viewItemTitleWithField": { + "message": "View item - $ITEMNAME$ - $FIELD$", + "description": "Title for a link that opens a view for an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + }, + "field": { + "content": "$2", + "example": "Username" + } + } + }, "autofillTitle": { "message": "Autofill - $ITEMNAME$", "description": "Title for a button that autofills a login item.", @@ -4280,6 +4295,20 @@ } } }, + "autofillTitleWithField": { + "message": "Autofill - $ITEMNAME$ - $FIELD$", + "description": "Title for a button that autofills a login item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + }, + "field": { + "content": "$2", + "example": "Username" + } + } + }, "copyFieldValue": { "message": "Copy $FIELD$, $VALUE$", "description": "Title for a button that copies a field value to the clipboard.", @@ -4899,8 +4928,8 @@ "message": "Password regenerated", "description": "Notification message for when a password has been regenerated" }, - "saveLoginToBitwarden": { - "message": "Save login to Bitwarden?", + "saveToBitwarden": { + "message": "Save to Bitwarden", "description": "Confirmation message for saving a login to Bitwarden" }, "spaceCharacterDescriptor": { @@ -5139,5 +5168,32 @@ }, "changeAtRiskPassword": { "message": "Change at-risk password" + }, + "introCarouselLabel": { + "message": "Welcome to Bitwarden" + }, + "securityPrioritized": { + "message": "Security, prioritized" + }, + "securityPrioritizedBody": { + "message": "Save logins, cards, and identities to your secure vault. Bitwarden uses zero-knowledge, end-to-end encryption to protect what’s important to you." + }, + "quickLogin": { + "message": "Quick and easy login" + }, + "quickLoginBody": { + "message": "Set up biometric unlock and autofill to log into your accounts without typing a single letter." + }, + "secureUser": { + "message": "Level up your logins" + }, + "secureUserBody": { + "message": "Use the generator to create and save strong, unique passwords for all your accounts." + }, + "secureDevices": { + "message": "Your data, when and where you need it" + }, + "secureDevicesBody": { + "message": "Save unlimited passwords across unlimited devices with Bitwarden mobile, browser, and desktop apps." } } diff --git a/apps/browser/src/_locales/km/messages.json b/apps/browser/src/_locales/km/messages.json index c9c29611deb..61d21cc2987 100644 --- a/apps/browser/src/_locales/km/messages.json +++ b/apps/browser/src/_locales/km/messages.json @@ -1098,6 +1098,31 @@ "message": "Login updated", "description": "Message displayed when login details are successfully updated." }, + "loginUpdateTaskSuccess": { + "message": "Great job! You took the steps to make you and $ORGANIZATION$ more secure.", + "placeholders": { + "organization": { + "content": "$1" + } + }, + "description": "Shown to user after login is updated." + }, + "loginUpdateTaskSuccessAdditional": { + "message": "Thank you for making $ORGANIZATION$ more secure. You have $TASK_COUNT$ more passwords to update.", + "placeholders": { + "organization": { + "content": "$1" + }, + "task_count": { + "content": "$2" + } + }, + "description": "Shown to user after login is updated." + }, + "nextSecurityTaskAction": { + "message": "Change next password", + "description": "Message prompting user to undertake completion of another security task." + }, "saveFailure": { "message": "Error saving", "description": "Error message shown when the system fails to save login details." @@ -1391,24 +1416,12 @@ "premiumRequiredDesc": { "message": "A Premium membership is required to use this feature." }, - "enterVerificationCodeApp": { - "message": "Enter the 6 digit verification code from your authenticator app." - }, "authenticationTimeout": { "message": "Authentication timeout" }, "authenticationSessionTimedOut": { "message": "The authentication session timed out. Please restart the login process." }, - "enterVerificationCodeEmail": { - "message": "Enter the 6 digit verification code that was emailed to $EMAIL$.", - "placeholders": { - "email": { - "content": "$1", - "example": "example@gmail.com" - } - } - }, "verificationCodeEmailSent": { "message": "Verification email sent to $EMAIL$.", "placeholders": { @@ -1418,18 +1431,9 @@ } } }, - "rememberMe": { - "message": "Remember me" - }, "dontAskAgainOnThisDeviceFor30Days": { "message": "Don't ask again on this device for 30 days" }, - "sendVerificationCodeEmailAgain": { - "message": "Send verification code email again" - }, - "useAnotherTwoStepMethod": { - "message": "Use another two-step login method" - }, "selectAnotherMethod": { "message": "Select another method", "description": "Select another two-step login method" @@ -1437,18 +1441,9 @@ "useYourRecoveryCode": { "message": "Use your recovery code" }, - "insertYubiKey": { - "message": "Insert your YubiKey into your computer's USB port, then touch its button." - }, "insertU2f": { "message": "Insert your security key into your computer's USB port. If it has a button, touch it." }, - "webAuthnNewTab": { - "message": "To start the WebAuthn 2FA verification. Click the button below to open a new tab and follow the instructions provided in the new tab." - }, - "webAuthnNewTabOpen": { - "message": "Open new tab" - }, "openInNewTab": { "message": "Open in new tab" }, @@ -2327,6 +2322,9 @@ "privacyPolicy": { "message": "Privacy Policy" }, + "yourNewPasswordCannotBeTheSameAsYourCurrentPassword": { + "message": "Your new password cannot be the same as your current password." + }, "hintEqualsPassword": { "message": "Your password hint cannot be the same as your password." }, @@ -2534,15 +2532,15 @@ "message": "Your organization passwords are at-risk because they are weak, reused, and/or exposed.", "description": "Description of the review at-risk login slide on the at-risk password page carousel" }, - "reviewAtRiskLoginSlideImgAlt": { - "message": "Illustration of a list of logins that are at-risk" + "reviewAtRiskLoginSlideImgAltPeriod": { + "message": "Illustration of a list of logins that are at-risk." }, "generatePasswordSlideDesc": { "message": "Quickly generate a strong, unique password with the Bitwarden autofill menu on the at-risk site.", "description": "Description of the generate password slide on the at-risk password page carousel" }, - "generatePasswordSlideImgAlt": { - "message": "Illustration of the Bitwarden autofill menu displaying a generated password" + "generatePasswordSlideImgAltPeriod": { + "message": "Illustration of the Bitwarden autofill menu displaying a generated password." }, "updateInBitwarden": { "message": "Update in Bitwarden" @@ -2551,8 +2549,8 @@ "message": "Bitwarden will then prompt you to update the password in the password manager.", "description": "Description of the update in Bitwarden slide on the at-risk password page carousel" }, - "updateInBitwardenSlideImgAlt": { - "message": "Illustration of a Bitwarden’s notification prompting the user to update the login" + "updateInBitwardenSlideImgAltPeriod": { + "message": "Illustration of a Bitwarden’s notification prompting the user to update the login." }, "turnOnAutofill": { "message": "Turn on autofill" @@ -3007,6 +3005,15 @@ } } }, + "exportingIndividualVaultWithAttachmentsDescription": { + "message": "Only the individual vault items including attachments associated with $EMAIL$ will be exported. Organization vault items will not be included", + "placeholders": { + "email": { + "content": "$1", + "example": "name@example.com" + } + } + }, "exportingOrganizationVaultTitle": { "message": "Exporting organization vault" }, @@ -3839,15 +3846,9 @@ "duoHealthCheckResultsInNullAuthUrlError": { "message": "Error connecting with the Duo service. Use a different two-step login method or contact Duo for assistance." }, - "launchDuoAndFollowStepsToFinishLoggingIn": { - "message": "Launch Duo and follow the steps to finish logging in." - }, "duoRequiredForAccount": { "message": "Duo two-step login is required for your account." }, - "popoutTheExtensionToCompleteLogin": { - "message": "Popout the extension to complete login." - }, "popoutExtension": { "message": "Popout extension" }, @@ -4270,6 +4271,20 @@ } } }, + "viewItemTitleWithField": { + "message": "View item - $ITEMNAME$ - $FIELD$", + "description": "Title for a link that opens a view for an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + }, + "field": { + "content": "$2", + "example": "Username" + } + } + }, "autofillTitle": { "message": "Autofill - $ITEMNAME$", "description": "Title for a button that autofills a login item.", @@ -4280,6 +4295,20 @@ } } }, + "autofillTitleWithField": { + "message": "Autofill - $ITEMNAME$ - $FIELD$", + "description": "Title for a button that autofills a login item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + }, + "field": { + "content": "$2", + "example": "Username" + } + } + }, "copyFieldValue": { "message": "Copy $FIELD$, $VALUE$", "description": "Title for a button that copies a field value to the clipboard.", @@ -4899,8 +4928,8 @@ "message": "Password regenerated", "description": "Notification message for when a password has been regenerated" }, - "saveLoginToBitwarden": { - "message": "Save login to Bitwarden?", + "saveToBitwarden": { + "message": "Save to Bitwarden", "description": "Confirmation message for saving a login to Bitwarden" }, "spaceCharacterDescriptor": { @@ -5139,5 +5168,32 @@ }, "changeAtRiskPassword": { "message": "Change at-risk password" + }, + "introCarouselLabel": { + "message": "Welcome to Bitwarden" + }, + "securityPrioritized": { + "message": "Security, prioritized" + }, + "securityPrioritizedBody": { + "message": "Save logins, cards, and identities to your secure vault. Bitwarden uses zero-knowledge, end-to-end encryption to protect what’s important to you." + }, + "quickLogin": { + "message": "Quick and easy login" + }, + "quickLoginBody": { + "message": "Set up biometric unlock and autofill to log into your accounts without typing a single letter." + }, + "secureUser": { + "message": "Level up your logins" + }, + "secureUserBody": { + "message": "Use the generator to create and save strong, unique passwords for all your accounts." + }, + "secureDevices": { + "message": "Your data, when and where you need it" + }, + "secureDevicesBody": { + "message": "Save unlimited passwords across unlimited devices with Bitwarden mobile, browser, and desktop apps." } } diff --git a/apps/browser/src/_locales/kn/messages.json b/apps/browser/src/_locales/kn/messages.json index c8aff3a6488..229842d993b 100644 --- a/apps/browser/src/_locales/kn/messages.json +++ b/apps/browser/src/_locales/kn/messages.json @@ -1098,6 +1098,31 @@ "message": "Login updated", "description": "Message displayed when login details are successfully updated." }, + "loginUpdateTaskSuccess": { + "message": "Great job! You took the steps to make you and $ORGANIZATION$ more secure.", + "placeholders": { + "organization": { + "content": "$1" + } + }, + "description": "Shown to user after login is updated." + }, + "loginUpdateTaskSuccessAdditional": { + "message": "Thank you for making $ORGANIZATION$ more secure. You have $TASK_COUNT$ more passwords to update.", + "placeholders": { + "organization": { + "content": "$1" + }, + "task_count": { + "content": "$2" + } + }, + "description": "Shown to user after login is updated." + }, + "nextSecurityTaskAction": { + "message": "Change next password", + "description": "Message prompting user to undertake completion of another security task." + }, "saveFailure": { "message": "Error saving", "description": "Error message shown when the system fails to save login details." @@ -1391,24 +1416,12 @@ "premiumRequiredDesc": { "message": "ಈ ವೈಶಿಷ್ಟ್ಯವನ್ನು ಬಳಸಲು ಪ್ರೀಮಿಯಂ ಸದಸ್ಯತ್ವ ಅಗತ್ಯವಿದೆ." }, - "enterVerificationCodeApp": { - "message": "ನಿಮ್ಮ ದೃಢೀಕರಣ ಅಪ್ಲಿಕೇಶನ್‌ನಿಂದ 6 ಅಂಕಿಯ ಪರಿಶೀಲನಾ ಕೋಡ್ ಅನ್ನು ನಮೂದಿಸಿ." - }, "authenticationTimeout": { "message": "Authentication timeout" }, "authenticationSessionTimedOut": { "message": "The authentication session timed out. Please restart the login process." }, - "enterVerificationCodeEmail": { - "message": "$EMAIL$ಗೆ ಇಮೇಲ್ ಮಾಡಲಾದ 6 ಅಂಕಿಯ ಪರಿಶೀಲನಾ ಕೋಡ್ ಅನ್ನು ನಮೂದಿಸಿ.", - "placeholders": { - "email": { - "content": "$1", - "example": "example@gmail.com" - } - } - }, "verificationCodeEmailSent": { "message": "ಪರಿಶೀಲನೆ ಇಮೇಲ್ $EMAIL$ ಗೆ ಕಳುಹಿಸಲಾಗಿದೆ.", "placeholders": { @@ -1418,18 +1431,9 @@ } } }, - "rememberMe": { - "message": "ನನ್ನನ್ನು ನೆನಪಿನಲ್ಲಿ ಇಡು" - }, "dontAskAgainOnThisDeviceFor30Days": { "message": "Don't ask again on this device for 30 days" }, - "sendVerificationCodeEmailAgain": { - "message": "ಪರಿಶೀಲನೆ ಕೋಡ್ ಇಮೇಲ್ ಅನ್ನು ಮತ್ತೆ ಕಳುಹಿಸಿ" - }, - "useAnotherTwoStepMethod": { - "message": "ಮತ್ತೊಂದು ಎರಡು-ಹಂತದ ಲಾಗಿನ್ ವಿಧಾನವನ್ನು ಬಳಸಿ" - }, "selectAnotherMethod": { "message": "Select another method", "description": "Select another two-step login method" @@ -1437,18 +1441,9 @@ "useYourRecoveryCode": { "message": "Use your recovery code" }, - "insertYubiKey": { - "message": "ನಿಮ್ಮ ಯುಬಿಕಿಯನ್ನು ನಿಮ್ಮ ಕಂಪ್ಯೂಟರ್‌ನ ಯುಎಸ್‌ಬಿ ಪೋರ್ಟ್ಗೆ ಸೇರಿಸಿ, ನಂತರ ಅದರ ಗುಂಡಿಯನ್ನು ಸ್ಪರ್ಶಿಸಿ." - }, "insertU2f": { "message": "ನಿಮ್ಮ ಕಂಪ್ಯೂಟರ್‌ನ ಯುಎಸ್‌ಬಿ ಪೋರ್ಟ್ಗೆ ನಿಮ್ಮ ಭದ್ರತಾ ಕೀಲಿಯನ್ನು ಸೇರಿಸಿ. ಅದು ಬಟನ್ ಹೊಂದಿದ್ದರೆ, ಅದನ್ನು ಸ್ಪರ್ಶಿಸಿ." }, - "webAuthnNewTab": { - "message": "WebAuthn 2FA ಪರಿಶೀಲನೆಯನ್ನು ಪ್ರಾರಂಭಿಸಲು. ಹೊಸ ಟ್ಯಾಬ್ ತೆರೆಯಲು ಕೆಳಗಿನ ಬಟನ್ ಕ್ಲಿಕ್ ಮಾಡಿ ಮತ್ತು ಹೊಸ ಟ್ಯಾಬ್‌ನಲ್ಲಿ ಒದಗಿಸಲಾದ ಸೂಚನೆಗಳನ್ನು ಅನುಸರಿಸಿ." - }, - "webAuthnNewTabOpen": { - "message": "ಹೊಸ ಟ್ಯಾಬ್ ತೆರೆಯಿರಿ" - }, "openInNewTab": { "message": "Open in new tab" }, @@ -2327,6 +2322,9 @@ "privacyPolicy": { "message": "ಗೌಪ್ಯತಾ ನೀತಿ" }, + "yourNewPasswordCannotBeTheSameAsYourCurrentPassword": { + "message": "Your new password cannot be the same as your current password." + }, "hintEqualsPassword": { "message": "ನಿಮ್ಮ ಪಾಸ್‌ವರ್ಡ್ ಸುಳಿವು ನಿಮ್ಮ ಪಾಸ್‌ವರ್ಡ್‌ನಂತೆಯೇ ಇರಬಾರದು." }, @@ -2534,15 +2532,15 @@ "message": "Your organization passwords are at-risk because they are weak, reused, and/or exposed.", "description": "Description of the review at-risk login slide on the at-risk password page carousel" }, - "reviewAtRiskLoginSlideImgAlt": { - "message": "Illustration of a list of logins that are at-risk" + "reviewAtRiskLoginSlideImgAltPeriod": { + "message": "Illustration of a list of logins that are at-risk." }, "generatePasswordSlideDesc": { "message": "Quickly generate a strong, unique password with the Bitwarden autofill menu on the at-risk site.", "description": "Description of the generate password slide on the at-risk password page carousel" }, - "generatePasswordSlideImgAlt": { - "message": "Illustration of the Bitwarden autofill menu displaying a generated password" + "generatePasswordSlideImgAltPeriod": { + "message": "Illustration of the Bitwarden autofill menu displaying a generated password." }, "updateInBitwarden": { "message": "Update in Bitwarden" @@ -2551,8 +2549,8 @@ "message": "Bitwarden will then prompt you to update the password in the password manager.", "description": "Description of the update in Bitwarden slide on the at-risk password page carousel" }, - "updateInBitwardenSlideImgAlt": { - "message": "Illustration of a Bitwarden’s notification prompting the user to update the login" + "updateInBitwardenSlideImgAltPeriod": { + "message": "Illustration of a Bitwarden’s notification prompting the user to update the login." }, "turnOnAutofill": { "message": "Turn on autofill" @@ -3007,6 +3005,15 @@ } } }, + "exportingIndividualVaultWithAttachmentsDescription": { + "message": "Only the individual vault items including attachments associated with $EMAIL$ will be exported. Organization vault items will not be included", + "placeholders": { + "email": { + "content": "$1", + "example": "name@example.com" + } + } + }, "exportingOrganizationVaultTitle": { "message": "Exporting organization vault" }, @@ -3839,15 +3846,9 @@ "duoHealthCheckResultsInNullAuthUrlError": { "message": "Error connecting with the Duo service. Use a different two-step login method or contact Duo for assistance." }, - "launchDuoAndFollowStepsToFinishLoggingIn": { - "message": "Launch Duo and follow the steps to finish logging in." - }, "duoRequiredForAccount": { "message": "Duo two-step login is required for your account." }, - "popoutTheExtensionToCompleteLogin": { - "message": "Popout the extension to complete login." - }, "popoutExtension": { "message": "Popout extension" }, @@ -4270,6 +4271,20 @@ } } }, + "viewItemTitleWithField": { + "message": "View item - $ITEMNAME$ - $FIELD$", + "description": "Title for a link that opens a view for an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + }, + "field": { + "content": "$2", + "example": "Username" + } + } + }, "autofillTitle": { "message": "Autofill - $ITEMNAME$", "description": "Title for a button that autofills a login item.", @@ -4280,6 +4295,20 @@ } } }, + "autofillTitleWithField": { + "message": "Autofill - $ITEMNAME$ - $FIELD$", + "description": "Title for a button that autofills a login item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + }, + "field": { + "content": "$2", + "example": "Username" + } + } + }, "copyFieldValue": { "message": "Copy $FIELD$, $VALUE$", "description": "Title for a button that copies a field value to the clipboard.", @@ -4899,8 +4928,8 @@ "message": "Password regenerated", "description": "Notification message for when a password has been regenerated" }, - "saveLoginToBitwarden": { - "message": "Save login to Bitwarden?", + "saveToBitwarden": { + "message": "Save to Bitwarden", "description": "Confirmation message for saving a login to Bitwarden" }, "spaceCharacterDescriptor": { @@ -5139,5 +5168,32 @@ }, "changeAtRiskPassword": { "message": "Change at-risk password" + }, + "introCarouselLabel": { + "message": "Welcome to Bitwarden" + }, + "securityPrioritized": { + "message": "Security, prioritized" + }, + "securityPrioritizedBody": { + "message": "Save logins, cards, and identities to your secure vault. Bitwarden uses zero-knowledge, end-to-end encryption to protect what’s important to you." + }, + "quickLogin": { + "message": "Quick and easy login" + }, + "quickLoginBody": { + "message": "Set up biometric unlock and autofill to log into your accounts without typing a single letter." + }, + "secureUser": { + "message": "Level up your logins" + }, + "secureUserBody": { + "message": "Use the generator to create and save strong, unique passwords for all your accounts." + }, + "secureDevices": { + "message": "Your data, when and where you need it" + }, + "secureDevicesBody": { + "message": "Save unlimited passwords across unlimited devices with Bitwarden mobile, browser, and desktop apps." } } diff --git a/apps/browser/src/_locales/ko/messages.json b/apps/browser/src/_locales/ko/messages.json index cd54ac47506..5e8f2dec4c5 100644 --- a/apps/browser/src/_locales/ko/messages.json +++ b/apps/browser/src/_locales/ko/messages.json @@ -1098,6 +1098,31 @@ "message": "Login updated", "description": "Message displayed when login details are successfully updated." }, + "loginUpdateTaskSuccess": { + "message": "Great job! You took the steps to make you and $ORGANIZATION$ more secure.", + "placeholders": { + "organization": { + "content": "$1" + } + }, + "description": "Shown to user after login is updated." + }, + "loginUpdateTaskSuccessAdditional": { + "message": "Thank you for making $ORGANIZATION$ more secure. You have $TASK_COUNT$ more passwords to update.", + "placeholders": { + "organization": { + "content": "$1" + }, + "task_count": { + "content": "$2" + } + }, + "description": "Shown to user after login is updated." + }, + "nextSecurityTaskAction": { + "message": "Change next password", + "description": "Message prompting user to undertake completion of another security task." + }, "saveFailure": { "message": "Error saving", "description": "Error message shown when the system fails to save login details." @@ -1391,24 +1416,12 @@ "premiumRequiredDesc": { "message": "이 기능을 사용하려면 프리미엄 멤버십이 필요합니다." }, - "enterVerificationCodeApp": { - "message": "인증 앱에서 6자리 인증 코드를 입력하세요." - }, "authenticationTimeout": { "message": "인증 시간 초과" }, "authenticationSessionTimedOut": { "message": "인증 세션 시간이 초과 되었습니다. 다시 로그인을 시작해주세요." }, - "enterVerificationCodeEmail": { - "message": "$EMAIL$ 주소로 전송된 6자리 인증 코드를 입력하세요.", - "placeholders": { - "email": { - "content": "$1", - "example": "example@gmail.com" - } - } - }, "verificationCodeEmailSent": { "message": "$EMAIL$ 주소로 인증 이메일을 보냈습니다.", "placeholders": { @@ -1418,18 +1431,9 @@ } } }, - "rememberMe": { - "message": "기억하기" - }, "dontAskAgainOnThisDeviceFor30Days": { "message": "Don't ask again on this device for 30 days" }, - "sendVerificationCodeEmailAgain": { - "message": "인증 코드 이메일 다시 보내기" - }, - "useAnotherTwoStepMethod": { - "message": "다른 2단계 인증 사용" - }, "selectAnotherMethod": { "message": "Select another method", "description": "Select another two-step login method" @@ -1437,18 +1441,9 @@ "useYourRecoveryCode": { "message": "Use your recovery code" }, - "insertYubiKey": { - "message": "YubiKey를 컴퓨터의 USB 포트에 삽입하고 이 버튼을 누르세요." - }, "insertU2f": { "message": "보안 키를 컴퓨터의 USB 포트에 삽입하고 버튼이 있는 경우 누르세요." }, - "webAuthnNewTab": { - "message": "새 탭에서 WebAuthn 2단계 인증을 계속하세요." - }, - "webAuthnNewTabOpen": { - "message": "새 탭 열기" - }, "openInNewTab": { "message": "Open in new tab" }, @@ -2327,6 +2322,9 @@ "privacyPolicy": { "message": "개인 정보 보호 정책" }, + "yourNewPasswordCannotBeTheSameAsYourCurrentPassword": { + "message": "Your new password cannot be the same as your current password." + }, "hintEqualsPassword": { "message": "비밀번호 힌트는 비밀번호와 같을 수 없습니다." }, @@ -2534,15 +2532,15 @@ "message": "Your organization passwords are at-risk because they are weak, reused, and/or exposed.", "description": "Description of the review at-risk login slide on the at-risk password page carousel" }, - "reviewAtRiskLoginSlideImgAlt": { - "message": "Illustration of a list of logins that are at-risk" + "reviewAtRiskLoginSlideImgAltPeriod": { + "message": "Illustration of a list of logins that are at-risk." }, "generatePasswordSlideDesc": { "message": "Quickly generate a strong, unique password with the Bitwarden autofill menu on the at-risk site.", "description": "Description of the generate password slide on the at-risk password page carousel" }, - "generatePasswordSlideImgAlt": { - "message": "Illustration of the Bitwarden autofill menu displaying a generated password" + "generatePasswordSlideImgAltPeriod": { + "message": "Illustration of the Bitwarden autofill menu displaying a generated password." }, "updateInBitwarden": { "message": "Update in Bitwarden" @@ -2551,8 +2549,8 @@ "message": "Bitwarden will then prompt you to update the password in the password manager.", "description": "Description of the update in Bitwarden slide on the at-risk password page carousel" }, - "updateInBitwardenSlideImgAlt": { - "message": "Illustration of a Bitwarden’s notification prompting the user to update the login" + "updateInBitwardenSlideImgAltPeriod": { + "message": "Illustration of a Bitwarden’s notification prompting the user to update the login." }, "turnOnAutofill": { "message": "Turn on autofill" @@ -3007,6 +3005,15 @@ } } }, + "exportingIndividualVaultWithAttachmentsDescription": { + "message": "Only the individual vault items including attachments associated with $EMAIL$ will be exported. Organization vault items will not be included", + "placeholders": { + "email": { + "content": "$1", + "example": "name@example.com" + } + } + }, "exportingOrganizationVaultTitle": { "message": "조직 보관함을 내보내는 중" }, @@ -3839,15 +3846,9 @@ "duoHealthCheckResultsInNullAuthUrlError": { "message": "Duo 서비스 연결 중 오류가 발생했습니다. 다른 2단계 로그인 방법을 사용하거나 Duo에 문의하여 도움을 받으세요." }, - "launchDuoAndFollowStepsToFinishLoggingIn": { - "message": "듀오를 실행하고 단계를 따라 로그인을 완료하세요" - }, "duoRequiredForAccount": { "message": "계정에 Duo 2단계 로그인이 필요합니다." }, - "popoutTheExtensionToCompleteLogin": { - "message": "확장 프로그램을 실행하여 로그인을 완료합니다." - }, "popoutExtension": { "message": "확장 프로그램을 새 창에서 열기" }, @@ -4270,6 +4271,20 @@ } } }, + "viewItemTitleWithField": { + "message": "View item - $ITEMNAME$ - $FIELD$", + "description": "Title for a link that opens a view for an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + }, + "field": { + "content": "$2", + "example": "Username" + } + } + }, "autofillTitle": { "message": "자동 완성 - $ITEMNAME$", "description": "Title for a button that autofills a login item.", @@ -4280,6 +4295,20 @@ } } }, + "autofillTitleWithField": { + "message": "Autofill - $ITEMNAME$ - $FIELD$", + "description": "Title for a button that autofills a login item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + }, + "field": { + "content": "$2", + "example": "Username" + } + } + }, "copyFieldValue": { "message": "Copy $FIELD$, $VALUE$", "description": "Title for a button that copies a field value to the clipboard.", @@ -4899,8 +4928,8 @@ "message": "비밀번호가 재생성되었습니다.", "description": "Notification message for when a password has been regenerated" }, - "saveLoginToBitwarden": { - "message": "Bitwarden에 로그인을 저장하시겠습니까?", + "saveToBitwarden": { + "message": "Save to Bitwarden", "description": "Confirmation message for saving a login to Bitwarden" }, "spaceCharacterDescriptor": { @@ -5139,5 +5168,32 @@ }, "changeAtRiskPassword": { "message": "Change at-risk password" + }, + "introCarouselLabel": { + "message": "Welcome to Bitwarden" + }, + "securityPrioritized": { + "message": "Security, prioritized" + }, + "securityPrioritizedBody": { + "message": "Save logins, cards, and identities to your secure vault. Bitwarden uses zero-knowledge, end-to-end encryption to protect what’s important to you." + }, + "quickLogin": { + "message": "Quick and easy login" + }, + "quickLoginBody": { + "message": "Set up biometric unlock and autofill to log into your accounts without typing a single letter." + }, + "secureUser": { + "message": "Level up your logins" + }, + "secureUserBody": { + "message": "Use the generator to create and save strong, unique passwords for all your accounts." + }, + "secureDevices": { + "message": "Your data, when and where you need it" + }, + "secureDevicesBody": { + "message": "Save unlimited passwords across unlimited devices with Bitwarden mobile, browser, and desktop apps." } } diff --git a/apps/browser/src/_locales/lt/messages.json b/apps/browser/src/_locales/lt/messages.json index 8bf8a8f7518..88dbac2b1ab 100644 --- a/apps/browser/src/_locales/lt/messages.json +++ b/apps/browser/src/_locales/lt/messages.json @@ -1098,6 +1098,31 @@ "message": "Login updated", "description": "Message displayed when login details are successfully updated." }, + "loginUpdateTaskSuccess": { + "message": "Great job! You took the steps to make you and $ORGANIZATION$ more secure.", + "placeholders": { + "organization": { + "content": "$1" + } + }, + "description": "Shown to user after login is updated." + }, + "loginUpdateTaskSuccessAdditional": { + "message": "Thank you for making $ORGANIZATION$ more secure. You have $TASK_COUNT$ more passwords to update.", + "placeholders": { + "organization": { + "content": "$1" + }, + "task_count": { + "content": "$2" + } + }, + "description": "Shown to user after login is updated." + }, + "nextSecurityTaskAction": { + "message": "Change next password", + "description": "Message prompting user to undertake completion of another security task." + }, "saveFailure": { "message": "Error saving", "description": "Error message shown when the system fails to save login details." @@ -1391,24 +1416,12 @@ "premiumRequiredDesc": { "message": "Premium narystė reikalinga šiai funkcijai naudoti." }, - "enterVerificationCodeApp": { - "message": "Įvesk 6 skaitmenų patvirtinimo kodą iš tavo autentifikavimo aplikacijos." - }, "authenticationTimeout": { "message": "Authentication timeout" }, "authenticationSessionTimedOut": { "message": "The authentication session timed out. Please restart the login process." }, - "enterVerificationCodeEmail": { - "message": "Įvesk 6 skaitmenų prisijungimo kodą, kuris buvo išsiųstas $EMAIL$ el. paštu.", - "placeholders": { - "email": { - "content": "$1", - "example": "example@gmail.com" - } - } - }, "verificationCodeEmailSent": { "message": "Patvirtinimo elektroninis paštas išsiųstas į $EMAIL$.", "placeholders": { @@ -1418,18 +1431,9 @@ } } }, - "rememberMe": { - "message": "Prisiminti mane" - }, "dontAskAgainOnThisDeviceFor30Days": { "message": "Don't ask again on this device for 30 days" }, - "sendVerificationCodeEmailAgain": { - "message": "Pakartotinai atsiųsti patvirtinimo koda el. paštu" - }, - "useAnotherTwoStepMethod": { - "message": "Naudoti dar vieną dviejų žingsnių prisijungimo metodą" - }, "selectAnotherMethod": { "message": "Select another method", "description": "Select another two-step login method" @@ -1437,18 +1441,9 @@ "useYourRecoveryCode": { "message": "Use your recovery code" }, - "insertYubiKey": { - "message": "Įkišk YubiKey į savo kompiuterio USB prievadą, tada paliesk jo mygtuką." - }, "insertU2f": { "message": "Įkišk savo saugos raktą į kompiuterio USB prievadą. Jei jame yra mygtukas, paliesk jį." }, - "webAuthnNewTab": { - "message": "Norint pradėti WebAuthn 2FA patikrinimą. Spustelėk toliau esantį mygtuką, kad atsidarytų naujas skirtukas, ir sek naujame skirtuke pateiktas instrukcijas." - }, - "webAuthnNewTabOpen": { - "message": "Atidaryti naują skirtuką" - }, "openInNewTab": { "message": "Open in new tab" }, @@ -2327,6 +2322,9 @@ "privacyPolicy": { "message": "Privatumo politika" }, + "yourNewPasswordCannotBeTheSameAsYourCurrentPassword": { + "message": "Your new password cannot be the same as your current password." + }, "hintEqualsPassword": { "message": "Jūsų slaptažodžio užuomina negali būti tokia pati kaip Jūsų slaptažodis." }, @@ -2534,15 +2532,15 @@ "message": "Your organization passwords are at-risk because they are weak, reused, and/or exposed.", "description": "Description of the review at-risk login slide on the at-risk password page carousel" }, - "reviewAtRiskLoginSlideImgAlt": { - "message": "Illustration of a list of logins that are at-risk" + "reviewAtRiskLoginSlideImgAltPeriod": { + "message": "Illustration of a list of logins that are at-risk." }, "generatePasswordSlideDesc": { "message": "Quickly generate a strong, unique password with the Bitwarden autofill menu on the at-risk site.", "description": "Description of the generate password slide on the at-risk password page carousel" }, - "generatePasswordSlideImgAlt": { - "message": "Illustration of the Bitwarden autofill menu displaying a generated password" + "generatePasswordSlideImgAltPeriod": { + "message": "Illustration of the Bitwarden autofill menu displaying a generated password." }, "updateInBitwarden": { "message": "Update in Bitwarden" @@ -2551,8 +2549,8 @@ "message": "Bitwarden will then prompt you to update the password in the password manager.", "description": "Description of the update in Bitwarden slide on the at-risk password page carousel" }, - "updateInBitwardenSlideImgAlt": { - "message": "Illustration of a Bitwarden’s notification prompting the user to update the login" + "updateInBitwardenSlideImgAltPeriod": { + "message": "Illustration of a Bitwarden’s notification prompting the user to update the login." }, "turnOnAutofill": { "message": "Turn on autofill" @@ -3007,6 +3005,15 @@ } } }, + "exportingIndividualVaultWithAttachmentsDescription": { + "message": "Only the individual vault items including attachments associated with $EMAIL$ will be exported. Organization vault items will not be included", + "placeholders": { + "email": { + "content": "$1", + "example": "name@example.com" + } + } + }, "exportingOrganizationVaultTitle": { "message": "Exporting organization vault" }, @@ -3839,15 +3846,9 @@ "duoHealthCheckResultsInNullAuthUrlError": { "message": "Klaida prijungiant su „Duo“ paslauga. Naudokite kitą dvigubo prisijungimo būdą arba susisiekite su „Duo“ dėl pagalbos." }, - "launchDuoAndFollowStepsToFinishLoggingIn": { - "message": "Paleisk DUO ir sek veiksmus, kad baigtum prisijungti." - }, "duoRequiredForAccount": { "message": "Tavo paskyrai reikalingas Duo dviejų veiksmų prisijungimas." }, - "popoutTheExtensionToCompleteLogin": { - "message": "Išskleisk plėtinį, kad užbaigtum prisijungimą." - }, "popoutExtension": { "message": "Iššokantis plėtinys" }, @@ -4270,6 +4271,20 @@ } } }, + "viewItemTitleWithField": { + "message": "View item - $ITEMNAME$ - $FIELD$", + "description": "Title for a link that opens a view for an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + }, + "field": { + "content": "$2", + "example": "Username" + } + } + }, "autofillTitle": { "message": "Autofill - $ITEMNAME$", "description": "Title for a button that autofills a login item.", @@ -4280,6 +4295,20 @@ } } }, + "autofillTitleWithField": { + "message": "Autofill - $ITEMNAME$ - $FIELD$", + "description": "Title for a button that autofills a login item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + }, + "field": { + "content": "$2", + "example": "Username" + } + } + }, "copyFieldValue": { "message": "Copy $FIELD$, $VALUE$", "description": "Title for a button that copies a field value to the clipboard.", @@ -4899,8 +4928,8 @@ "message": "Password regenerated", "description": "Notification message for when a password has been regenerated" }, - "saveLoginToBitwarden": { - "message": "Save login to Bitwarden?", + "saveToBitwarden": { + "message": "Save to Bitwarden", "description": "Confirmation message for saving a login to Bitwarden" }, "spaceCharacterDescriptor": { @@ -5139,5 +5168,32 @@ }, "changeAtRiskPassword": { "message": "Change at-risk password" + }, + "introCarouselLabel": { + "message": "Welcome to Bitwarden" + }, + "securityPrioritized": { + "message": "Security, prioritized" + }, + "securityPrioritizedBody": { + "message": "Save logins, cards, and identities to your secure vault. Bitwarden uses zero-knowledge, end-to-end encryption to protect what’s important to you." + }, + "quickLogin": { + "message": "Quick and easy login" + }, + "quickLoginBody": { + "message": "Set up biometric unlock and autofill to log into your accounts without typing a single letter." + }, + "secureUser": { + "message": "Level up your logins" + }, + "secureUserBody": { + "message": "Use the generator to create and save strong, unique passwords for all your accounts." + }, + "secureDevices": { + "message": "Your data, when and where you need it" + }, + "secureDevicesBody": { + "message": "Save unlimited passwords across unlimited devices with Bitwarden mobile, browser, and desktop apps." } } diff --git a/apps/browser/src/_locales/lv/messages.json b/apps/browser/src/_locales/lv/messages.json index 7b5f077f69d..e1de9bd01b5 100644 --- a/apps/browser/src/_locales/lv/messages.json +++ b/apps/browser/src/_locales/lv/messages.json @@ -665,7 +665,7 @@ "message": "Glabātava ir aizslēgta. Jāapliecina sava identitāte, lai turpinātu." }, "yourVaultIsLockedV2": { - "message": "Glabātava ir slēgta" + "message": "Glabātava ir aizslēgta" }, "yourAccountIsLocked": { "message": "Konts ir slēgts" @@ -1098,6 +1098,31 @@ "message": "Pieteikšanās vienums atjaunināts", "description": "Message displayed when login details are successfully updated." }, + "loginUpdateTaskSuccess": { + "message": "Lielisks darbs! Tu attiecīgi rīkojies, lai padarītu savi un $ORGANIZATION$ drošāku.", + "placeholders": { + "organization": { + "content": "$1" + } + }, + "description": "Shown to user after login is updated." + }, + "loginUpdateTaskSuccessAdditional": { + "message": "Paldies par $ORGANIZATION$ padarīšanu drošāku! Tev ir vēl $TASK_COUNT$ paroļu, ko atjaunināt.", + "placeholders": { + "organization": { + "content": "$1" + }, + "task_count": { + "content": "$2" + } + }, + "description": "Shown to user after login is updated." + }, + "nextSecurityTaskAction": { + "message": "Mainīt nākamo paroli", + "description": "Message prompting user to undertake completion of another security task." + }, "saveFailure": { "message": "Kļūda saglabāšanas laikā", "description": "Error message shown when the system fails to save login details." @@ -1391,24 +1416,12 @@ "premiumRequiredDesc": { "message": "Ir nepieciešama Premium dalība, lai izmantotu šo iespēju." }, - "enterVerificationCodeApp": { - "message": "Jāievada 6 ciparu apstiprinājuma kods no autentificētāja lietotnes." - }, "authenticationTimeout": { "message": "Autentificēšanās noildze" }, "authenticationSessionTimedOut": { "message": "Iestājās autentificēšanās sesijas noildze. Lūgums sākt pieteikšanos no jauna." }, - "enterVerificationCodeEmail": { - "message": "Jāievada 6 ciparu apstiprinājuma kods, kas tika nosūtīts uz $EMAIL$.", - "placeholders": { - "email": { - "content": "$1", - "example": "example@gmail.com" - } - } - }, "verificationCodeEmailSent": { "message": "E-pasts apstiprināšanai nosūtīts uz $EMAIL$.", "placeholders": { @@ -1418,18 +1431,9 @@ } } }, - "rememberMe": { - "message": "Atcerēties mani" - }, "dontAskAgainOnThisDeviceFor30Days": { "message": "Šajā ierīcē 30 dienas vairs nevaicāt" }, - "sendVerificationCodeEmailAgain": { - "message": "Sūtīt apstiprinājuma koda e-pastu vēlreiz" - }, - "useAnotherTwoStepMethod": { - "message": "Izmantot citu divpakāpju pieteikšanās veidu" - }, "selectAnotherMethod": { "message": "Atlasīt citu veidu", "description": "Select another two-step login method" @@ -1437,18 +1441,9 @@ "useYourRecoveryCode": { "message": "Izmantot savu atkopes kodu" }, - "insertYubiKey": { - "message": "Ievieto savu YubiKey datora USB ligzdā un pieskaries tā pogai!" - }, "insertU2f": { "message": "Ievieto savu drošības atslēgu datora USB ligzdā! Ja tai ir poga, pieskaries tai!" }, - "webAuthnNewTab": { - "message": "Turpināt WebAuthn 2FA apstiprināšanu jaunā cilnē." - }, - "webAuthnNewTabOpen": { - "message": "Atvērt jaunu cilni" - }, "openInNewTab": { "message": "Atvērt jaunā cilnē" }, @@ -2327,6 +2322,9 @@ "privacyPolicy": { "message": "Privātuma nosacījumi" }, + "yourNewPasswordCannotBeTheSameAsYourCurrentPassword": { + "message": "Jaunā parole nevar būt tāda pati kā pašreizējā." + }, "hintEqualsPassword": { "message": "Paroles norāde nedrīkst būt tāda pati kā parole." }, @@ -2534,15 +2532,15 @@ "message": "Apvienības paroles ir pakļautas riskam, jo tās ir vājas, atkārtoti izmantotas un/vai noplūdušas.", "description": "Description of the review at-risk login slide on the at-risk password page carousel" }, - "reviewAtRiskLoginSlideImgAlt": { - "message": "Riskam pakļauto pieteikšanās vienumu saraksta attēlojums" + "reviewAtRiskLoginSlideImgAltPeriod": { + "message": "Riskam pakļauto pieteikšanās vienumu saraksta attēlojums." }, "generatePasswordSlideDesc": { "message": "Riskam pakļauto vienumu vietnē ar automātiskās aizpildes izvēlni var ātri izveidot stipru, neatkārtojamu paroli.", "description": "Description of the generate password slide on the at-risk password page carousel" }, - "generatePasswordSlideImgAlt": { - "message": "Bitwarden automātiskās izvēlnes attēlojums, kurā ir redzama izveidota parole" + "generatePasswordSlideImgAltPeriod": { + "message": "Bitwarden automātiskās izvēlnes attēlojums, kurā ir redzama izveidota parole." }, "updateInBitwarden": { "message": "Atjaunināt Bitwarden" @@ -2551,8 +2549,8 @@ "message": "Bitwarden tad vaicās atjaunināt paroli paroļu pārvaldniekā.", "description": "Description of the update in Bitwarden slide on the at-risk password page carousel" }, - "updateInBitwardenSlideImgAlt": { - "message": "Bitwarden paziņojuma, kas aicina lietotāju atjaunināt pieteikšanās vienumu, attēlojums" + "updateInBitwardenSlideImgAltPeriod": { + "message": "Bitwarden paziņojuma, kas aicina lietotāju atjaunināt pieteikšanās vienumu, attēlojums." }, "turnOnAutofill": { "message": "Ieslēgt automātisko aizpildi" @@ -3007,6 +3005,15 @@ } } }, + "exportingIndividualVaultWithAttachmentsDescription": { + "message": "Tiks izdoti tikai atsevišķi glabātavas vienumi, tajā skaitā pielikumi, kas ir saistīti ar $EMAIL$. Apvienības glabātavas vienumi netiks iekļauti", + "placeholders": { + "email": { + "content": "$1", + "example": "name@example.com" + } + } + }, "exportingOrganizationVaultTitle": { "message": "Izgūst apvienības glabātavu" }, @@ -3839,15 +3846,9 @@ "duoHealthCheckResultsInNullAuthUrlError": { "message": "Kļūda savienojuma izveidošanā ar Duo pakalpojumu. Jāizmanto cits divpakāpju pieteikšanās veids vai jāvēršas pie Duo pēc palīdzības." }, - "launchDuoAndFollowStepsToFinishLoggingIn": { - "message": "Jāpalaiž DUO un jāseko soļiem, lai pabeigtu pieteikšanos." - }, "duoRequiredForAccount": { "message": "Kontam ir nepieciešama Duo divpakāpju pieteikšanās." }, - "popoutTheExtensionToCompleteLogin": { - "message": "Jāatver paplašinājums atsevišķā logā, lai pabeigtu pieteikšanos." - }, "popoutExtension": { "message": "Atvērt paplašinājumu atsevišķi" }, @@ -4270,6 +4271,20 @@ } } }, + "viewItemTitleWithField": { + "message": "Apskatīt vienumu - $ITEMNAME$ - $FIELD$", + "description": "Title for a link that opens a view for an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + }, + "field": { + "content": "$2", + "example": "Username" + } + } + }, "autofillTitle": { "message": "Automātiski aizpildīt - $ITEMNAME$", "description": "Title for a button that autofills a login item.", @@ -4280,6 +4295,20 @@ } } }, + "autofillTitleWithField": { + "message": "Automātiskā aizpilde - $ITEMNAME$ - $FIELD$", + "description": "Title for a button that autofills a login item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + }, + "field": { + "content": "$2", + "example": "Username" + } + } + }, "copyFieldValue": { "message": "Ievietot starpliktuvē $FIELD$, $VALUE$", "description": "Title for a button that copies a field value to the clipboard.", @@ -4899,8 +4928,8 @@ "message": "Parole pārizveidota", "description": "Notification message for when a password has been regenerated" }, - "saveLoginToBitwarden": { - "message": "Saglabāt pieteikšanās vienumu Bitwarden?", + "saveToBitwarden": { + "message": "Saglabāt Bitwarden", "description": "Confirmation message for saving a login to Bitwarden" }, "spaceCharacterDescriptor": { @@ -5138,6 +5167,33 @@ "message": "Lai izmantotu atslēgšanu ar biometriju, lūgums atjaunināt darbvirsmas lietotni vai atspējot atslēgšanu ar pirkstu nospiedumu darbvirsmas iestatījumos." }, "changeAtRiskPassword": { - "message": "Change at-risk password" + "message": "Mainīt riskam pakļautu paroli" + }, + "introCarouselLabel": { + "message": "Laipni lūdzam Bitwarden" + }, + "securityPrioritized": { + "message": "Drošība pirmajā vietā" + }, + "securityPrioritizedBody": { + "message": "Pieteikšanās vienumu, karšu un identitāšu glabāšana savā drošajā glabātavā. Bitwarden izmanto nulles zināšanu pilnīgu šifrēšanu, lai aizsargātu to, kas Tev ir svarīgs." + }, + "quickLogin": { + "message": "Ātra un vienkārša pieteikšanās" + }, + "quickLoginBody": { + "message": "Iestati biometrisko atslēgšanu un automātiski aizpildi, lai pieteiktos savos kontos bez neviena burta ievadīšanas." + }, + "secureUser": { + "message": "Uzlabo savu pieteikšanos" + }, + "secureUserBody": { + "message": "Veidotājs ir izmantojams, lai izveidotu un saglabātu spēcīgas, neatkārtojamas paroles visiem Taviem kontiem." + }, + "secureDevices": { + "message": "Tavi dati, kad un kur vien tie ir nepieciešami" + }, + "secureDevicesBody": { + "message": "Neierobežotu paroļu skaitu var saglabāt neierobežotā ierīdžu daudzumā ar Bitwarden viedtālruņa, pārlūka un darbvirsmas lietotni." } } diff --git a/apps/browser/src/_locales/ml/messages.json b/apps/browser/src/_locales/ml/messages.json index 24a096db0ef..478086b5f7d 100644 --- a/apps/browser/src/_locales/ml/messages.json +++ b/apps/browser/src/_locales/ml/messages.json @@ -1098,6 +1098,31 @@ "message": "Login updated", "description": "Message displayed when login details are successfully updated." }, + "loginUpdateTaskSuccess": { + "message": "Great job! You took the steps to make you and $ORGANIZATION$ more secure.", + "placeholders": { + "organization": { + "content": "$1" + } + }, + "description": "Shown to user after login is updated." + }, + "loginUpdateTaskSuccessAdditional": { + "message": "Thank you for making $ORGANIZATION$ more secure. You have $TASK_COUNT$ more passwords to update.", + "placeholders": { + "organization": { + "content": "$1" + }, + "task_count": { + "content": "$2" + } + }, + "description": "Shown to user after login is updated." + }, + "nextSecurityTaskAction": { + "message": "Change next password", + "description": "Message prompting user to undertake completion of another security task." + }, "saveFailure": { "message": "Error saving", "description": "Error message shown when the system fails to save login details." @@ -1391,24 +1416,12 @@ "premiumRequiredDesc": { "message": "ഈ സവിശേഷത ഉപയോഗിക്കുന്നതിന് പ്രീമിയം അംഗത്വം ആവശ്യമാണ്." }, - "enterVerificationCodeApp": { - "message": "നിങ്ങളുടെ ഓതന്റിക്കേറ്റർ അപ്ലിക്കേഷനിൽ നിന്ന് 6 അക്ക സ്ഥിരീകരണ കോഡ് നൽകുക." - }, "authenticationTimeout": { "message": "Authentication timeout" }, "authenticationSessionTimedOut": { "message": "The authentication session timed out. Please restart the login process." }, - "enterVerificationCodeEmail": { - "message": "$EMAIL$ൽ ഇമെയിൽ ചെയ്ത 6 അക്ക സ്ഥിരീകരണ കോഡ് നൽകുക", - "placeholders": { - "email": { - "content": "$1", - "example": "example@gmail.com" - } - } - }, "verificationCodeEmailSent": { "message": "സ്ഥിരീകരണ ഇമെയിൽ $EMAIL$ ലേക്ക് അയച്ചു.", "placeholders": { @@ -1418,18 +1431,9 @@ } } }, - "rememberMe": { - "message": "എന്നെ ഓർക്കുക" - }, "dontAskAgainOnThisDeviceFor30Days": { "message": "Don't ask again on this device for 30 days" }, - "sendVerificationCodeEmailAgain": { - "message": "സ്ഥിരീകരണ കോഡ് ഇമെയിൽ വഴി അയയ്ക്കുക" - }, - "useAnotherTwoStepMethod": { - "message": "മറ്റൊരു രണ്ട് ഘട്ട ലോഗിൻ രീതി ഉപയോഗിക്കുക" - }, "selectAnotherMethod": { "message": "Select another method", "description": "Select another two-step login method" @@ -1437,18 +1441,9 @@ "useYourRecoveryCode": { "message": "Use your recovery code" }, - "insertYubiKey": { - "message": "നിങ്ങളുടെ കമ്പ്യൂട്ടറിന്റെ യു‌എസ്‌ബി പോർട്ടിലേക്ക് യുബിക്കി ഇടുക, തുടർന്ന് അതിന്റെ ബട്ടൺ അമർത്തുക." - }, "insertU2f": { "message": "നിങ്ങളുടെ കമ്പ്യൂട്ടറിന്റെ യുഎസ്ബി പോർട്ടിൽ സുരക്ഷാ കീ ഇടുക. അതിന് ഒരു ബട്ടൺ ഉണ്ടെങ്കിൽ അത് അമർത്തുക." }, - "webAuthnNewTab": { - "message": "To start the WebAuthn 2FA verification. Click the button below to open a new tab and follow the instructions provided in the new tab." - }, - "webAuthnNewTabOpen": { - "message": "Open new tab" - }, "openInNewTab": { "message": "Open in new tab" }, @@ -2327,6 +2322,9 @@ "privacyPolicy": { "message": "സ്വകാര്യതാനയം" }, + "yourNewPasswordCannotBeTheSameAsYourCurrentPassword": { + "message": "Your new password cannot be the same as your current password." + }, "hintEqualsPassword": { "message": "Your password hint cannot be the same as your password." }, @@ -2534,15 +2532,15 @@ "message": "Your organization passwords are at-risk because they are weak, reused, and/or exposed.", "description": "Description of the review at-risk login slide on the at-risk password page carousel" }, - "reviewAtRiskLoginSlideImgAlt": { - "message": "Illustration of a list of logins that are at-risk" + "reviewAtRiskLoginSlideImgAltPeriod": { + "message": "Illustration of a list of logins that are at-risk." }, "generatePasswordSlideDesc": { "message": "Quickly generate a strong, unique password with the Bitwarden autofill menu on the at-risk site.", "description": "Description of the generate password slide on the at-risk password page carousel" }, - "generatePasswordSlideImgAlt": { - "message": "Illustration of the Bitwarden autofill menu displaying a generated password" + "generatePasswordSlideImgAltPeriod": { + "message": "Illustration of the Bitwarden autofill menu displaying a generated password." }, "updateInBitwarden": { "message": "Update in Bitwarden" @@ -2551,8 +2549,8 @@ "message": "Bitwarden will then prompt you to update the password in the password manager.", "description": "Description of the update in Bitwarden slide on the at-risk password page carousel" }, - "updateInBitwardenSlideImgAlt": { - "message": "Illustration of a Bitwarden’s notification prompting the user to update the login" + "updateInBitwardenSlideImgAltPeriod": { + "message": "Illustration of a Bitwarden’s notification prompting the user to update the login." }, "turnOnAutofill": { "message": "Turn on autofill" @@ -3007,6 +3005,15 @@ } } }, + "exportingIndividualVaultWithAttachmentsDescription": { + "message": "Only the individual vault items including attachments associated with $EMAIL$ will be exported. Organization vault items will not be included", + "placeholders": { + "email": { + "content": "$1", + "example": "name@example.com" + } + } + }, "exportingOrganizationVaultTitle": { "message": "Exporting organization vault" }, @@ -3839,15 +3846,9 @@ "duoHealthCheckResultsInNullAuthUrlError": { "message": "Error connecting with the Duo service. Use a different two-step login method or contact Duo for assistance." }, - "launchDuoAndFollowStepsToFinishLoggingIn": { - "message": "Launch Duo and follow the steps to finish logging in." - }, "duoRequiredForAccount": { "message": "Duo two-step login is required for your account." }, - "popoutTheExtensionToCompleteLogin": { - "message": "Popout the extension to complete login." - }, "popoutExtension": { "message": "Popout extension" }, @@ -4270,6 +4271,20 @@ } } }, + "viewItemTitleWithField": { + "message": "View item - $ITEMNAME$ - $FIELD$", + "description": "Title for a link that opens a view for an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + }, + "field": { + "content": "$2", + "example": "Username" + } + } + }, "autofillTitle": { "message": "Autofill - $ITEMNAME$", "description": "Title for a button that autofills a login item.", @@ -4280,6 +4295,20 @@ } } }, + "autofillTitleWithField": { + "message": "Autofill - $ITEMNAME$ - $FIELD$", + "description": "Title for a button that autofills a login item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + }, + "field": { + "content": "$2", + "example": "Username" + } + } + }, "copyFieldValue": { "message": "Copy $FIELD$, $VALUE$", "description": "Title for a button that copies a field value to the clipboard.", @@ -4899,8 +4928,8 @@ "message": "Password regenerated", "description": "Notification message for when a password has been regenerated" }, - "saveLoginToBitwarden": { - "message": "Save login to Bitwarden?", + "saveToBitwarden": { + "message": "Save to Bitwarden", "description": "Confirmation message for saving a login to Bitwarden" }, "spaceCharacterDescriptor": { @@ -5139,5 +5168,32 @@ }, "changeAtRiskPassword": { "message": "Change at-risk password" + }, + "introCarouselLabel": { + "message": "Welcome to Bitwarden" + }, + "securityPrioritized": { + "message": "Security, prioritized" + }, + "securityPrioritizedBody": { + "message": "Save logins, cards, and identities to your secure vault. Bitwarden uses zero-knowledge, end-to-end encryption to protect what’s important to you." + }, + "quickLogin": { + "message": "Quick and easy login" + }, + "quickLoginBody": { + "message": "Set up biometric unlock and autofill to log into your accounts without typing a single letter." + }, + "secureUser": { + "message": "Level up your logins" + }, + "secureUserBody": { + "message": "Use the generator to create and save strong, unique passwords for all your accounts." + }, + "secureDevices": { + "message": "Your data, when and where you need it" + }, + "secureDevicesBody": { + "message": "Save unlimited passwords across unlimited devices with Bitwarden mobile, browser, and desktop apps." } } diff --git a/apps/browser/src/_locales/mr/messages.json b/apps/browser/src/_locales/mr/messages.json index 9a49998d3d9..5bfc85f9828 100644 --- a/apps/browser/src/_locales/mr/messages.json +++ b/apps/browser/src/_locales/mr/messages.json @@ -1098,6 +1098,31 @@ "message": "Login updated", "description": "Message displayed when login details are successfully updated." }, + "loginUpdateTaskSuccess": { + "message": "Great job! You took the steps to make you and $ORGANIZATION$ more secure.", + "placeholders": { + "organization": { + "content": "$1" + } + }, + "description": "Shown to user after login is updated." + }, + "loginUpdateTaskSuccessAdditional": { + "message": "Thank you for making $ORGANIZATION$ more secure. You have $TASK_COUNT$ more passwords to update.", + "placeholders": { + "organization": { + "content": "$1" + }, + "task_count": { + "content": "$2" + } + }, + "description": "Shown to user after login is updated." + }, + "nextSecurityTaskAction": { + "message": "Change next password", + "description": "Message prompting user to undertake completion of another security task." + }, "saveFailure": { "message": "Error saving", "description": "Error message shown when the system fails to save login details." @@ -1391,24 +1416,12 @@ "premiumRequiredDesc": { "message": "A Premium membership is required to use this feature." }, - "enterVerificationCodeApp": { - "message": "Enter the 6 digit verification code from your authenticator app." - }, "authenticationTimeout": { "message": "Authentication timeout" }, "authenticationSessionTimedOut": { "message": "The authentication session timed out. Please restart the login process." }, - "enterVerificationCodeEmail": { - "message": "Enter the 6 digit verification code that was emailed to $EMAIL$.", - "placeholders": { - "email": { - "content": "$1", - "example": "example@gmail.com" - } - } - }, "verificationCodeEmailSent": { "message": "Verification email sent to $EMAIL$.", "placeholders": { @@ -1418,18 +1431,9 @@ } } }, - "rememberMe": { - "message": "Remember me" - }, "dontAskAgainOnThisDeviceFor30Days": { "message": "Don't ask again on this device for 30 days" }, - "sendVerificationCodeEmailAgain": { - "message": "Send verification code email again" - }, - "useAnotherTwoStepMethod": { - "message": "Use another two-step login method" - }, "selectAnotherMethod": { "message": "Select another method", "description": "Select another two-step login method" @@ -1437,18 +1441,9 @@ "useYourRecoveryCode": { "message": "Use your recovery code" }, - "insertYubiKey": { - "message": "Insert your YubiKey into your computer's USB port, then touch its button." - }, "insertU2f": { "message": "Insert your security key into your computer's USB port. If it has a button, touch it." }, - "webAuthnNewTab": { - "message": "To start the WebAuthn 2FA verification. Click the button below to open a new tab and follow the instructions provided in the new tab." - }, - "webAuthnNewTabOpen": { - "message": "Open new tab" - }, "openInNewTab": { "message": "Open in new tab" }, @@ -2327,6 +2322,9 @@ "privacyPolicy": { "message": "Privacy Policy" }, + "yourNewPasswordCannotBeTheSameAsYourCurrentPassword": { + "message": "Your new password cannot be the same as your current password." + }, "hintEqualsPassword": { "message": "Your password hint cannot be the same as your password." }, @@ -2534,15 +2532,15 @@ "message": "Your organization passwords are at-risk because they are weak, reused, and/or exposed.", "description": "Description of the review at-risk login slide on the at-risk password page carousel" }, - "reviewAtRiskLoginSlideImgAlt": { - "message": "Illustration of a list of logins that are at-risk" + "reviewAtRiskLoginSlideImgAltPeriod": { + "message": "Illustration of a list of logins that are at-risk." }, "generatePasswordSlideDesc": { "message": "Quickly generate a strong, unique password with the Bitwarden autofill menu on the at-risk site.", "description": "Description of the generate password slide on the at-risk password page carousel" }, - "generatePasswordSlideImgAlt": { - "message": "Illustration of the Bitwarden autofill menu displaying a generated password" + "generatePasswordSlideImgAltPeriod": { + "message": "Illustration of the Bitwarden autofill menu displaying a generated password." }, "updateInBitwarden": { "message": "Update in Bitwarden" @@ -2551,8 +2549,8 @@ "message": "Bitwarden will then prompt you to update the password in the password manager.", "description": "Description of the update in Bitwarden slide on the at-risk password page carousel" }, - "updateInBitwardenSlideImgAlt": { - "message": "Illustration of a Bitwarden’s notification prompting the user to update the login" + "updateInBitwardenSlideImgAltPeriod": { + "message": "Illustration of a Bitwarden’s notification prompting the user to update the login." }, "turnOnAutofill": { "message": "Turn on autofill" @@ -3007,6 +3005,15 @@ } } }, + "exportingIndividualVaultWithAttachmentsDescription": { + "message": "Only the individual vault items including attachments associated with $EMAIL$ will be exported. Organization vault items will not be included", + "placeholders": { + "email": { + "content": "$1", + "example": "name@example.com" + } + } + }, "exportingOrganizationVaultTitle": { "message": "Exporting organization vault" }, @@ -3839,15 +3846,9 @@ "duoHealthCheckResultsInNullAuthUrlError": { "message": "Error connecting with the Duo service. Use a different two-step login method or contact Duo for assistance." }, - "launchDuoAndFollowStepsToFinishLoggingIn": { - "message": "Launch Duo and follow the steps to finish logging in." - }, "duoRequiredForAccount": { "message": "Duo two-step login is required for your account." }, - "popoutTheExtensionToCompleteLogin": { - "message": "Popout the extension to complete login." - }, "popoutExtension": { "message": "Popout extension" }, @@ -4270,6 +4271,20 @@ } } }, + "viewItemTitleWithField": { + "message": "View item - $ITEMNAME$ - $FIELD$", + "description": "Title for a link that opens a view for an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + }, + "field": { + "content": "$2", + "example": "Username" + } + } + }, "autofillTitle": { "message": "Autofill - $ITEMNAME$", "description": "Title for a button that autofills a login item.", @@ -4280,6 +4295,20 @@ } } }, + "autofillTitleWithField": { + "message": "Autofill - $ITEMNAME$ - $FIELD$", + "description": "Title for a button that autofills a login item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + }, + "field": { + "content": "$2", + "example": "Username" + } + } + }, "copyFieldValue": { "message": "Copy $FIELD$, $VALUE$", "description": "Title for a button that copies a field value to the clipboard.", @@ -4899,8 +4928,8 @@ "message": "Password regenerated", "description": "Notification message for when a password has been regenerated" }, - "saveLoginToBitwarden": { - "message": "Save login to Bitwarden?", + "saveToBitwarden": { + "message": "Save to Bitwarden", "description": "Confirmation message for saving a login to Bitwarden" }, "spaceCharacterDescriptor": { @@ -5139,5 +5168,32 @@ }, "changeAtRiskPassword": { "message": "Change at-risk password" + }, + "introCarouselLabel": { + "message": "Welcome to Bitwarden" + }, + "securityPrioritized": { + "message": "Security, prioritized" + }, + "securityPrioritizedBody": { + "message": "Save logins, cards, and identities to your secure vault. Bitwarden uses zero-knowledge, end-to-end encryption to protect what’s important to you." + }, + "quickLogin": { + "message": "Quick and easy login" + }, + "quickLoginBody": { + "message": "Set up biometric unlock and autofill to log into your accounts without typing a single letter." + }, + "secureUser": { + "message": "Level up your logins" + }, + "secureUserBody": { + "message": "Use the generator to create and save strong, unique passwords for all your accounts." + }, + "secureDevices": { + "message": "Your data, when and where you need it" + }, + "secureDevicesBody": { + "message": "Save unlimited passwords across unlimited devices with Bitwarden mobile, browser, and desktop apps." } } diff --git a/apps/browser/src/_locales/my/messages.json b/apps/browser/src/_locales/my/messages.json index c9c29611deb..61d21cc2987 100644 --- a/apps/browser/src/_locales/my/messages.json +++ b/apps/browser/src/_locales/my/messages.json @@ -1098,6 +1098,31 @@ "message": "Login updated", "description": "Message displayed when login details are successfully updated." }, + "loginUpdateTaskSuccess": { + "message": "Great job! You took the steps to make you and $ORGANIZATION$ more secure.", + "placeholders": { + "organization": { + "content": "$1" + } + }, + "description": "Shown to user after login is updated." + }, + "loginUpdateTaskSuccessAdditional": { + "message": "Thank you for making $ORGANIZATION$ more secure. You have $TASK_COUNT$ more passwords to update.", + "placeholders": { + "organization": { + "content": "$1" + }, + "task_count": { + "content": "$2" + } + }, + "description": "Shown to user after login is updated." + }, + "nextSecurityTaskAction": { + "message": "Change next password", + "description": "Message prompting user to undertake completion of another security task." + }, "saveFailure": { "message": "Error saving", "description": "Error message shown when the system fails to save login details." @@ -1391,24 +1416,12 @@ "premiumRequiredDesc": { "message": "A Premium membership is required to use this feature." }, - "enterVerificationCodeApp": { - "message": "Enter the 6 digit verification code from your authenticator app." - }, "authenticationTimeout": { "message": "Authentication timeout" }, "authenticationSessionTimedOut": { "message": "The authentication session timed out. Please restart the login process." }, - "enterVerificationCodeEmail": { - "message": "Enter the 6 digit verification code that was emailed to $EMAIL$.", - "placeholders": { - "email": { - "content": "$1", - "example": "example@gmail.com" - } - } - }, "verificationCodeEmailSent": { "message": "Verification email sent to $EMAIL$.", "placeholders": { @@ -1418,18 +1431,9 @@ } } }, - "rememberMe": { - "message": "Remember me" - }, "dontAskAgainOnThisDeviceFor30Days": { "message": "Don't ask again on this device for 30 days" }, - "sendVerificationCodeEmailAgain": { - "message": "Send verification code email again" - }, - "useAnotherTwoStepMethod": { - "message": "Use another two-step login method" - }, "selectAnotherMethod": { "message": "Select another method", "description": "Select another two-step login method" @@ -1437,18 +1441,9 @@ "useYourRecoveryCode": { "message": "Use your recovery code" }, - "insertYubiKey": { - "message": "Insert your YubiKey into your computer's USB port, then touch its button." - }, "insertU2f": { "message": "Insert your security key into your computer's USB port. If it has a button, touch it." }, - "webAuthnNewTab": { - "message": "To start the WebAuthn 2FA verification. Click the button below to open a new tab and follow the instructions provided in the new tab." - }, - "webAuthnNewTabOpen": { - "message": "Open new tab" - }, "openInNewTab": { "message": "Open in new tab" }, @@ -2327,6 +2322,9 @@ "privacyPolicy": { "message": "Privacy Policy" }, + "yourNewPasswordCannotBeTheSameAsYourCurrentPassword": { + "message": "Your new password cannot be the same as your current password." + }, "hintEqualsPassword": { "message": "Your password hint cannot be the same as your password." }, @@ -2534,15 +2532,15 @@ "message": "Your organization passwords are at-risk because they are weak, reused, and/or exposed.", "description": "Description of the review at-risk login slide on the at-risk password page carousel" }, - "reviewAtRiskLoginSlideImgAlt": { - "message": "Illustration of a list of logins that are at-risk" + "reviewAtRiskLoginSlideImgAltPeriod": { + "message": "Illustration of a list of logins that are at-risk." }, "generatePasswordSlideDesc": { "message": "Quickly generate a strong, unique password with the Bitwarden autofill menu on the at-risk site.", "description": "Description of the generate password slide on the at-risk password page carousel" }, - "generatePasswordSlideImgAlt": { - "message": "Illustration of the Bitwarden autofill menu displaying a generated password" + "generatePasswordSlideImgAltPeriod": { + "message": "Illustration of the Bitwarden autofill menu displaying a generated password." }, "updateInBitwarden": { "message": "Update in Bitwarden" @@ -2551,8 +2549,8 @@ "message": "Bitwarden will then prompt you to update the password in the password manager.", "description": "Description of the update in Bitwarden slide on the at-risk password page carousel" }, - "updateInBitwardenSlideImgAlt": { - "message": "Illustration of a Bitwarden’s notification prompting the user to update the login" + "updateInBitwardenSlideImgAltPeriod": { + "message": "Illustration of a Bitwarden’s notification prompting the user to update the login." }, "turnOnAutofill": { "message": "Turn on autofill" @@ -3007,6 +3005,15 @@ } } }, + "exportingIndividualVaultWithAttachmentsDescription": { + "message": "Only the individual vault items including attachments associated with $EMAIL$ will be exported. Organization vault items will not be included", + "placeholders": { + "email": { + "content": "$1", + "example": "name@example.com" + } + } + }, "exportingOrganizationVaultTitle": { "message": "Exporting organization vault" }, @@ -3839,15 +3846,9 @@ "duoHealthCheckResultsInNullAuthUrlError": { "message": "Error connecting with the Duo service. Use a different two-step login method or contact Duo for assistance." }, - "launchDuoAndFollowStepsToFinishLoggingIn": { - "message": "Launch Duo and follow the steps to finish logging in." - }, "duoRequiredForAccount": { "message": "Duo two-step login is required for your account." }, - "popoutTheExtensionToCompleteLogin": { - "message": "Popout the extension to complete login." - }, "popoutExtension": { "message": "Popout extension" }, @@ -4270,6 +4271,20 @@ } } }, + "viewItemTitleWithField": { + "message": "View item - $ITEMNAME$ - $FIELD$", + "description": "Title for a link that opens a view for an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + }, + "field": { + "content": "$2", + "example": "Username" + } + } + }, "autofillTitle": { "message": "Autofill - $ITEMNAME$", "description": "Title for a button that autofills a login item.", @@ -4280,6 +4295,20 @@ } } }, + "autofillTitleWithField": { + "message": "Autofill - $ITEMNAME$ - $FIELD$", + "description": "Title for a button that autofills a login item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + }, + "field": { + "content": "$2", + "example": "Username" + } + } + }, "copyFieldValue": { "message": "Copy $FIELD$, $VALUE$", "description": "Title for a button that copies a field value to the clipboard.", @@ -4899,8 +4928,8 @@ "message": "Password regenerated", "description": "Notification message for when a password has been regenerated" }, - "saveLoginToBitwarden": { - "message": "Save login to Bitwarden?", + "saveToBitwarden": { + "message": "Save to Bitwarden", "description": "Confirmation message for saving a login to Bitwarden" }, "spaceCharacterDescriptor": { @@ -5139,5 +5168,32 @@ }, "changeAtRiskPassword": { "message": "Change at-risk password" + }, + "introCarouselLabel": { + "message": "Welcome to Bitwarden" + }, + "securityPrioritized": { + "message": "Security, prioritized" + }, + "securityPrioritizedBody": { + "message": "Save logins, cards, and identities to your secure vault. Bitwarden uses zero-knowledge, end-to-end encryption to protect what’s important to you." + }, + "quickLogin": { + "message": "Quick and easy login" + }, + "quickLoginBody": { + "message": "Set up biometric unlock and autofill to log into your accounts without typing a single letter." + }, + "secureUser": { + "message": "Level up your logins" + }, + "secureUserBody": { + "message": "Use the generator to create and save strong, unique passwords for all your accounts." + }, + "secureDevices": { + "message": "Your data, when and where you need it" + }, + "secureDevicesBody": { + "message": "Save unlimited passwords across unlimited devices with Bitwarden mobile, browser, and desktop apps." } } diff --git a/apps/browser/src/_locales/nb/messages.json b/apps/browser/src/_locales/nb/messages.json index 0ff4ed9486a..06ff737edf7 100644 --- a/apps/browser/src/_locales/nb/messages.json +++ b/apps/browser/src/_locales/nb/messages.json @@ -1098,6 +1098,31 @@ "message": "Login updated", "description": "Message displayed when login details are successfully updated." }, + "loginUpdateTaskSuccess": { + "message": "Great job! You took the steps to make you and $ORGANIZATION$ more secure.", + "placeholders": { + "organization": { + "content": "$1" + } + }, + "description": "Shown to user after login is updated." + }, + "loginUpdateTaskSuccessAdditional": { + "message": "Thank you for making $ORGANIZATION$ more secure. You have $TASK_COUNT$ more passwords to update.", + "placeholders": { + "organization": { + "content": "$1" + }, + "task_count": { + "content": "$2" + } + }, + "description": "Shown to user after login is updated." + }, + "nextSecurityTaskAction": { + "message": "Change next password", + "description": "Message prompting user to undertake completion of another security task." + }, "saveFailure": { "message": "Error saving", "description": "Error message shown when the system fails to save login details." @@ -1391,24 +1416,12 @@ "premiumRequiredDesc": { "message": "Et Premium-medlemskap er påkrevd for å bruke denne funksjonen." }, - "enterVerificationCodeApp": { - "message": "Skriv inn den 6-sifrede verifiseringskoden som står på din autentiseringsapp." - }, "authenticationTimeout": { "message": "Authentication timeout" }, "authenticationSessionTimedOut": { "message": "The authentication session timed out. Please restart the login process." }, - "enterVerificationCodeEmail": { - "message": "Skriv inn den 6-sifrede verifiseringskoden som ble sendt til", - "placeholders": { - "email": { - "content": "$1", - "example": "example@gmail.com" - } - } - }, "verificationCodeEmailSent": { "message": "En verifiserings-E-post har blitt sendt til $EMAIL$.", "placeholders": { @@ -1418,18 +1431,9 @@ } } }, - "rememberMe": { - "message": "Husk på meg" - }, "dontAskAgainOnThisDeviceFor30Days": { "message": "Don't ask again on this device for 30 days" }, - "sendVerificationCodeEmailAgain": { - "message": "Send E-posten med verifiseringskoden på nytt" - }, - "useAnotherTwoStepMethod": { - "message": "Bruk en annen 2-trinnsinnloggingsmetode" - }, "selectAnotherMethod": { "message": "Select another method", "description": "Select another two-step login method" @@ -1437,18 +1441,9 @@ "useYourRecoveryCode": { "message": "Use your recovery code" }, - "insertYubiKey": { - "message": "Sett inn din YubiKey i din datamaskins USB-uttak, og så trykk på dens knapp." - }, "insertU2f": { "message": "Sett din sikkerhetsnøkkel inn i din datamaskins USB-uttak. Dersom den har en knapp, trykk på den." }, - "webAuthnNewTab": { - "message": "For å starte WebAuthn 2FA bekreftelsen. Klikk på knappen nedenfor for å åpne en ny fane og følge instruksene som er gitt i den nye fanen." - }, - "webAuthnNewTabOpen": { - "message": "Åpne ny fane" - }, "openInNewTab": { "message": "Open in new tab" }, @@ -2327,6 +2322,9 @@ "privacyPolicy": { "message": "Personvernerklæring" }, + "yourNewPasswordCannotBeTheSameAsYourCurrentPassword": { + "message": "Your new password cannot be the same as your current password." + }, "hintEqualsPassword": { "message": "Passordhintet ditt kan ikke være det samme som passordet ditt." }, @@ -2534,15 +2532,15 @@ "message": "Your organization passwords are at-risk because they are weak, reused, and/or exposed.", "description": "Description of the review at-risk login slide on the at-risk password page carousel" }, - "reviewAtRiskLoginSlideImgAlt": { - "message": "Illustration of a list of logins that are at-risk" + "reviewAtRiskLoginSlideImgAltPeriod": { + "message": "Illustration of a list of logins that are at-risk." }, "generatePasswordSlideDesc": { "message": "Quickly generate a strong, unique password with the Bitwarden autofill menu on the at-risk site.", "description": "Description of the generate password slide on the at-risk password page carousel" }, - "generatePasswordSlideImgAlt": { - "message": "Illustration of the Bitwarden autofill menu displaying a generated password" + "generatePasswordSlideImgAltPeriod": { + "message": "Illustration of the Bitwarden autofill menu displaying a generated password." }, "updateInBitwarden": { "message": "Update in Bitwarden" @@ -2551,8 +2549,8 @@ "message": "Bitwarden will then prompt you to update the password in the password manager.", "description": "Description of the update in Bitwarden slide on the at-risk password page carousel" }, - "updateInBitwardenSlideImgAlt": { - "message": "Illustration of a Bitwarden’s notification prompting the user to update the login" + "updateInBitwardenSlideImgAltPeriod": { + "message": "Illustration of a Bitwarden’s notification prompting the user to update the login." }, "turnOnAutofill": { "message": "Turn on autofill" @@ -3007,6 +3005,15 @@ } } }, + "exportingIndividualVaultWithAttachmentsDescription": { + "message": "Only the individual vault items including attachments associated with $EMAIL$ will be exported. Organization vault items will not be included", + "placeholders": { + "email": { + "content": "$1", + "example": "name@example.com" + } + } + }, "exportingOrganizationVaultTitle": { "message": "Exporting organization vault" }, @@ -3839,15 +3846,9 @@ "duoHealthCheckResultsInNullAuthUrlError": { "message": "Error connecting with the Duo service. Use a different two-step login method or contact Duo for assistance." }, - "launchDuoAndFollowStepsToFinishLoggingIn": { - "message": "Launch Duo and follow the steps to finish logging in." - }, "duoRequiredForAccount": { "message": "Duo two-step login is required for your account." }, - "popoutTheExtensionToCompleteLogin": { - "message": "Popout the extension to complete login." - }, "popoutExtension": { "message": "Popout extension" }, @@ -4270,6 +4271,20 @@ } } }, + "viewItemTitleWithField": { + "message": "View item - $ITEMNAME$ - $FIELD$", + "description": "Title for a link that opens a view for an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + }, + "field": { + "content": "$2", + "example": "Username" + } + } + }, "autofillTitle": { "message": "Autoutfyll - $ITEMNAME$", "description": "Title for a button that autofills a login item.", @@ -4280,6 +4295,20 @@ } } }, + "autofillTitleWithField": { + "message": "Autofill - $ITEMNAME$ - $FIELD$", + "description": "Title for a button that autofills a login item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + }, + "field": { + "content": "$2", + "example": "Username" + } + } + }, "copyFieldValue": { "message": "Copy $FIELD$, $VALUE$", "description": "Title for a button that copies a field value to the clipboard.", @@ -4899,8 +4928,8 @@ "message": "Passord ble generert på nytt", "description": "Notification message for when a password has been regenerated" }, - "saveLoginToBitwarden": { - "message": "Vil du lagre påloggingen i Bitwarden?", + "saveToBitwarden": { + "message": "Save to Bitwarden", "description": "Confirmation message for saving a login to Bitwarden" }, "spaceCharacterDescriptor": { @@ -5139,5 +5168,32 @@ }, "changeAtRiskPassword": { "message": "Change at-risk password" + }, + "introCarouselLabel": { + "message": "Welcome to Bitwarden" + }, + "securityPrioritized": { + "message": "Security, prioritized" + }, + "securityPrioritizedBody": { + "message": "Save logins, cards, and identities to your secure vault. Bitwarden uses zero-knowledge, end-to-end encryption to protect what’s important to you." + }, + "quickLogin": { + "message": "Quick and easy login" + }, + "quickLoginBody": { + "message": "Set up biometric unlock and autofill to log into your accounts without typing a single letter." + }, + "secureUser": { + "message": "Level up your logins" + }, + "secureUserBody": { + "message": "Use the generator to create and save strong, unique passwords for all your accounts." + }, + "secureDevices": { + "message": "Your data, when and where you need it" + }, + "secureDevicesBody": { + "message": "Save unlimited passwords across unlimited devices with Bitwarden mobile, browser, and desktop apps." } } diff --git a/apps/browser/src/_locales/ne/messages.json b/apps/browser/src/_locales/ne/messages.json index c9c29611deb..61d21cc2987 100644 --- a/apps/browser/src/_locales/ne/messages.json +++ b/apps/browser/src/_locales/ne/messages.json @@ -1098,6 +1098,31 @@ "message": "Login updated", "description": "Message displayed when login details are successfully updated." }, + "loginUpdateTaskSuccess": { + "message": "Great job! You took the steps to make you and $ORGANIZATION$ more secure.", + "placeholders": { + "organization": { + "content": "$1" + } + }, + "description": "Shown to user after login is updated." + }, + "loginUpdateTaskSuccessAdditional": { + "message": "Thank you for making $ORGANIZATION$ more secure. You have $TASK_COUNT$ more passwords to update.", + "placeholders": { + "organization": { + "content": "$1" + }, + "task_count": { + "content": "$2" + } + }, + "description": "Shown to user after login is updated." + }, + "nextSecurityTaskAction": { + "message": "Change next password", + "description": "Message prompting user to undertake completion of another security task." + }, "saveFailure": { "message": "Error saving", "description": "Error message shown when the system fails to save login details." @@ -1391,24 +1416,12 @@ "premiumRequiredDesc": { "message": "A Premium membership is required to use this feature." }, - "enterVerificationCodeApp": { - "message": "Enter the 6 digit verification code from your authenticator app." - }, "authenticationTimeout": { "message": "Authentication timeout" }, "authenticationSessionTimedOut": { "message": "The authentication session timed out. Please restart the login process." }, - "enterVerificationCodeEmail": { - "message": "Enter the 6 digit verification code that was emailed to $EMAIL$.", - "placeholders": { - "email": { - "content": "$1", - "example": "example@gmail.com" - } - } - }, "verificationCodeEmailSent": { "message": "Verification email sent to $EMAIL$.", "placeholders": { @@ -1418,18 +1431,9 @@ } } }, - "rememberMe": { - "message": "Remember me" - }, "dontAskAgainOnThisDeviceFor30Days": { "message": "Don't ask again on this device for 30 days" }, - "sendVerificationCodeEmailAgain": { - "message": "Send verification code email again" - }, - "useAnotherTwoStepMethod": { - "message": "Use another two-step login method" - }, "selectAnotherMethod": { "message": "Select another method", "description": "Select another two-step login method" @@ -1437,18 +1441,9 @@ "useYourRecoveryCode": { "message": "Use your recovery code" }, - "insertYubiKey": { - "message": "Insert your YubiKey into your computer's USB port, then touch its button." - }, "insertU2f": { "message": "Insert your security key into your computer's USB port. If it has a button, touch it." }, - "webAuthnNewTab": { - "message": "To start the WebAuthn 2FA verification. Click the button below to open a new tab and follow the instructions provided in the new tab." - }, - "webAuthnNewTabOpen": { - "message": "Open new tab" - }, "openInNewTab": { "message": "Open in new tab" }, @@ -2327,6 +2322,9 @@ "privacyPolicy": { "message": "Privacy Policy" }, + "yourNewPasswordCannotBeTheSameAsYourCurrentPassword": { + "message": "Your new password cannot be the same as your current password." + }, "hintEqualsPassword": { "message": "Your password hint cannot be the same as your password." }, @@ -2534,15 +2532,15 @@ "message": "Your organization passwords are at-risk because they are weak, reused, and/or exposed.", "description": "Description of the review at-risk login slide on the at-risk password page carousel" }, - "reviewAtRiskLoginSlideImgAlt": { - "message": "Illustration of a list of logins that are at-risk" + "reviewAtRiskLoginSlideImgAltPeriod": { + "message": "Illustration of a list of logins that are at-risk." }, "generatePasswordSlideDesc": { "message": "Quickly generate a strong, unique password with the Bitwarden autofill menu on the at-risk site.", "description": "Description of the generate password slide on the at-risk password page carousel" }, - "generatePasswordSlideImgAlt": { - "message": "Illustration of the Bitwarden autofill menu displaying a generated password" + "generatePasswordSlideImgAltPeriod": { + "message": "Illustration of the Bitwarden autofill menu displaying a generated password." }, "updateInBitwarden": { "message": "Update in Bitwarden" @@ -2551,8 +2549,8 @@ "message": "Bitwarden will then prompt you to update the password in the password manager.", "description": "Description of the update in Bitwarden slide on the at-risk password page carousel" }, - "updateInBitwardenSlideImgAlt": { - "message": "Illustration of a Bitwarden’s notification prompting the user to update the login" + "updateInBitwardenSlideImgAltPeriod": { + "message": "Illustration of a Bitwarden’s notification prompting the user to update the login." }, "turnOnAutofill": { "message": "Turn on autofill" @@ -3007,6 +3005,15 @@ } } }, + "exportingIndividualVaultWithAttachmentsDescription": { + "message": "Only the individual vault items including attachments associated with $EMAIL$ will be exported. Organization vault items will not be included", + "placeholders": { + "email": { + "content": "$1", + "example": "name@example.com" + } + } + }, "exportingOrganizationVaultTitle": { "message": "Exporting organization vault" }, @@ -3839,15 +3846,9 @@ "duoHealthCheckResultsInNullAuthUrlError": { "message": "Error connecting with the Duo service. Use a different two-step login method or contact Duo for assistance." }, - "launchDuoAndFollowStepsToFinishLoggingIn": { - "message": "Launch Duo and follow the steps to finish logging in." - }, "duoRequiredForAccount": { "message": "Duo two-step login is required for your account." }, - "popoutTheExtensionToCompleteLogin": { - "message": "Popout the extension to complete login." - }, "popoutExtension": { "message": "Popout extension" }, @@ -4270,6 +4271,20 @@ } } }, + "viewItemTitleWithField": { + "message": "View item - $ITEMNAME$ - $FIELD$", + "description": "Title for a link that opens a view for an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + }, + "field": { + "content": "$2", + "example": "Username" + } + } + }, "autofillTitle": { "message": "Autofill - $ITEMNAME$", "description": "Title for a button that autofills a login item.", @@ -4280,6 +4295,20 @@ } } }, + "autofillTitleWithField": { + "message": "Autofill - $ITEMNAME$ - $FIELD$", + "description": "Title for a button that autofills a login item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + }, + "field": { + "content": "$2", + "example": "Username" + } + } + }, "copyFieldValue": { "message": "Copy $FIELD$, $VALUE$", "description": "Title for a button that copies a field value to the clipboard.", @@ -4899,8 +4928,8 @@ "message": "Password regenerated", "description": "Notification message for when a password has been regenerated" }, - "saveLoginToBitwarden": { - "message": "Save login to Bitwarden?", + "saveToBitwarden": { + "message": "Save to Bitwarden", "description": "Confirmation message for saving a login to Bitwarden" }, "spaceCharacterDescriptor": { @@ -5139,5 +5168,32 @@ }, "changeAtRiskPassword": { "message": "Change at-risk password" + }, + "introCarouselLabel": { + "message": "Welcome to Bitwarden" + }, + "securityPrioritized": { + "message": "Security, prioritized" + }, + "securityPrioritizedBody": { + "message": "Save logins, cards, and identities to your secure vault. Bitwarden uses zero-knowledge, end-to-end encryption to protect what’s important to you." + }, + "quickLogin": { + "message": "Quick and easy login" + }, + "quickLoginBody": { + "message": "Set up biometric unlock and autofill to log into your accounts without typing a single letter." + }, + "secureUser": { + "message": "Level up your logins" + }, + "secureUserBody": { + "message": "Use the generator to create and save strong, unique passwords for all your accounts." + }, + "secureDevices": { + "message": "Your data, when and where you need it" + }, + "secureDevicesBody": { + "message": "Save unlimited passwords across unlimited devices with Bitwarden mobile, browser, and desktop apps." } } diff --git a/apps/browser/src/_locales/nl/messages.json b/apps/browser/src/_locales/nl/messages.json index 1c2b09ca3e3..e39405a8f73 100644 --- a/apps/browser/src/_locales/nl/messages.json +++ b/apps/browser/src/_locales/nl/messages.json @@ -1098,6 +1098,31 @@ "message": "Login bijgewerkt", "description": "Message displayed when login details are successfully updated." }, + "loginUpdateTaskSuccess": { + "message": "Goed gedaan! Je hebt stappen genomen om jou en $ORGANIZATION$ veiliger te maken.", + "placeholders": { + "organization": { + "content": "$1" + } + }, + "description": "Shown to user after login is updated." + }, + "loginUpdateTaskSuccessAdditional": { + "message": "Bedankt voor het veiliger maken van $ORGANIZATION$. Je moet nog $TASK_COUNT$ wachtwoorden bijwerken.", + "placeholders": { + "organization": { + "content": "$1" + }, + "task_count": { + "content": "$2" + } + }, + "description": "Shown to user after login is updated." + }, + "nextSecurityTaskAction": { + "message": "Volgend wachtwoord veranderen", + "description": "Message prompting user to undertake completion of another security task." + }, "saveFailure": { "message": "Fout bij opslaan", "description": "Error message shown when the system fails to save login details." @@ -1391,24 +1416,12 @@ "premiumRequiredDesc": { "message": "Je hebt een Premium-abonnement nodig om deze functie te gebruiken." }, - "enterVerificationCodeApp": { - "message": "Voer de 6-cijferige verificatiecode uit je authenticatie-app in." - }, "authenticationTimeout": { "message": "Authenticatie-timeout" }, "authenticationSessionTimedOut": { "message": "De verificatiesessie is verlopen. Start het inlogproces opnieuw op." }, - "enterVerificationCodeEmail": { - "message": "Voer de 6-cijferige verificatiecode in die via e-mail is verstuurd naar $EMAIL$.", - "placeholders": { - "email": { - "content": "$1", - "example": "example@gmail.com" - } - } - }, "verificationCodeEmailSent": { "message": "E-mail met verificatiecode is verzonden naar $EMAIL$.", "placeholders": { @@ -1418,18 +1431,9 @@ } } }, - "rememberMe": { - "message": "Mijn gegevens onthouden" - }, "dontAskAgainOnThisDeviceFor30Days": { "message": "30 dagen niet opnieuw vragen op dit apparaat" }, - "sendVerificationCodeEmailAgain": { - "message": "E-mail met verificatiecode opnieuw versturen" - }, - "useAnotherTwoStepMethod": { - "message": "Gebruik een andere methode voor tweestapsaanmelding" - }, "selectAnotherMethod": { "message": "Kies een andere methode", "description": "Select another two-step login method" @@ -1437,18 +1441,9 @@ "useYourRecoveryCode": { "message": "Gebruik je herstelcode" }, - "insertYubiKey": { - "message": "Plaats je YubiKey in de USB-poort van je computer en druk op de knop." - }, "insertU2f": { "message": "Plaats je beveilingssleutel in de USB-poort van je computer. Als het een knop heeft, druk deze dan in." }, - "webAuthnNewTab": { - "message": "Ga door met WebAuthn 2FA-verificatie in de nieuwe tab." - }, - "webAuthnNewTabOpen": { - "message": "Nieuwe tab openen" - }, "openInNewTab": { "message": "Openen in nieuwe tab" }, @@ -2327,6 +2322,9 @@ "privacyPolicy": { "message": "Privacybeleid" }, + "yourNewPasswordCannotBeTheSameAsYourCurrentPassword": { + "message": "Je nieuwe wachtwoord moet anders zijn dan je huidige wachtwoord." + }, "hintEqualsPassword": { "message": "Je wachtwoordhint moet anders zijn dan je wachtwoord." }, @@ -2473,7 +2471,7 @@ } }, "atRiskPasswords": { - "message": "Wachtwoorden in gevaar" + "message": "Risicovolle wachtwoorden" }, "atRiskPasswordDescSingleOrg": { "message": "$ORGANIZATION$ vraagt je om één wachtwoord te wijzigen omdat deze een risico vormt.", @@ -2534,15 +2532,15 @@ "message": "De wachtwoorden van je organisatie zijn in gevaar omdat ze zwak, hergebruikt en/of gelekt zijn.", "description": "Description of the review at-risk login slide on the at-risk password page carousel" }, - "reviewAtRiskLoginSlideImgAlt": { - "message": "Voorbeeld van een lijst van risicovolle logins" + "reviewAtRiskLoginSlideImgAltPeriod": { + "message": "Voorbeeld van een lijst van risicovolle inloggegevens." }, "generatePasswordSlideDesc": { "message": "Genereer snel een sterk, uniek wachtwoord met het automatisch invulmenu van Bitwarden op de risicovolle website.", "description": "Description of the generate password slide on the at-risk password page carousel" }, - "generatePasswordSlideImgAlt": { - "message": "Voorbeeld van het automatisch invulmenu van Bitwarden met een gegenereerd wachtwoord" + "generatePasswordSlideImgAltPeriod": { + "message": "Voorbeeld van het automatisch invulmenu van Bitwarden met een gegenereerd wachtwoord." }, "updateInBitwarden": { "message": "Bijwerken in Bitwarden" @@ -2551,8 +2549,8 @@ "message": "Bitwarden vraagt je vervolgens het wachtwoord bij te werken in de wachtwoordbeheerder.", "description": "Description of the update in Bitwarden slide on the at-risk password page carousel" }, - "updateInBitwardenSlideImgAlt": { - "message": "Voorbeeld van een Bitwarden melding die de gebruiker aanspoort tot het bijwerken van de login" + "updateInBitwardenSlideImgAltPeriod": { + "message": "Voorbeeld van een Bitwarden-melding die de gebruiker aanspoort tot het bijwerken van de login." }, "turnOnAutofill": { "message": "Automatisch invullen inschakelen" @@ -3007,6 +3005,15 @@ } } }, + "exportingIndividualVaultWithAttachmentsDescription": { + "message": "Exporteert alleen de persoonlijke kluis-items, inclusief attachments, gerelateerd aan $EMAIL$. Geen kluis-items van de organisatie", + "placeholders": { + "email": { + "content": "$1", + "example": "name@example.com" + } + } + }, "exportingOrganizationVaultTitle": { "message": "Organisatiekluis exporteren" }, @@ -3839,15 +3846,9 @@ "duoHealthCheckResultsInNullAuthUrlError": { "message": "Fout bij het verbinden met de Duo-service. Gebruik een andere tweestapsaanmeldingsmethode of neem contact op met Duo voor hulp." }, - "launchDuoAndFollowStepsToFinishLoggingIn": { - "message": "Start Duo en volg de stappen om het inloggen te voltooien." - }, "duoRequiredForAccount": { "message": "Jouw account vereist Duo-tweestapsaanmelding." }, - "popoutTheExtensionToCompleteLogin": { - "message": "Open de extensie om in te loggen." - }, "popoutExtension": { "message": "Pop-out extensie" }, @@ -4270,6 +4271,20 @@ } } }, + "viewItemTitleWithField": { + "message": "Item weergeven - $ITEMNAME$ - $FIELD$", + "description": "Title for a link that opens a view for an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + }, + "field": { + "content": "$2", + "example": "Username" + } + } + }, "autofillTitle": { "message": "Automatisch invullen - $ITEMNAME$", "description": "Title for a button that autofills a login item.", @@ -4280,6 +4295,20 @@ } } }, + "autofillTitleWithField": { + "message": "Automatisch aanvullen - $ITEMNAME$ - $FIELD$", + "description": "Title for a button that autofills a login item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + }, + "field": { + "content": "$2", + "example": "Username" + } + } + }, "copyFieldValue": { "message": "$FIELD$, $VALUE$ kopiëren", "description": "Title for a button that copies a field value to the clipboard.", @@ -4899,8 +4928,8 @@ "message": "Wachtwoord opnieuw gegenereerd", "description": "Notification message for when a password has been regenerated" }, - "saveLoginToBitwarden": { - "message": "Login opslaan in Bitwarden?", + "saveToBitwarden": { + "message": "Opslaan in Bitwarden", "description": "Confirmation message for saving a login to Bitwarden" }, "spaceCharacterDescriptor": { @@ -5139,5 +5168,32 @@ }, "changeAtRiskPassword": { "message": "Risicovol wachtwoord wijzigen" + }, + "introCarouselLabel": { + "message": "Welkom bij Bitwarden" + }, + "securityPrioritized": { + "message": "Security, geprioriteerd" + }, + "securityPrioritizedBody": { + "message": "Logins, kaarten en identiteiten in je beveiligde kluis opslaan. Bitwarden gebruikt zero-knowledge, end-to-end versleuteling om te beschermen wat belangrijk voor jou is." + }, + "quickLogin": { + "message": "Snel en eenvoudig inloggen" + }, + "quickLoginBody": { + "message": "Biometrische ontgrendelen en automatisch invullen instellen zodat je kunt inloggen op je accounts zonder één letter te typen." + }, + "secureUser": { + "message": "Versterk je logins" + }, + "secureUserBody": { + "message": "Gebruik de generator voor het aanmaken en bewaren van sterke, unieke wachtwoorden voor al je accounts." + }, + "secureDevices": { + "message": "Jouw gegevens, wanneer en waar je ze nodig hebt" + }, + "secureDevicesBody": { + "message": "Onbeperkt wachtwoorden opslaan op alle apparaten met Bitwarden-apps voor mobiel, browser en desktop." } } diff --git a/apps/browser/src/_locales/nn/messages.json b/apps/browser/src/_locales/nn/messages.json index c9c29611deb..61d21cc2987 100644 --- a/apps/browser/src/_locales/nn/messages.json +++ b/apps/browser/src/_locales/nn/messages.json @@ -1098,6 +1098,31 @@ "message": "Login updated", "description": "Message displayed when login details are successfully updated." }, + "loginUpdateTaskSuccess": { + "message": "Great job! You took the steps to make you and $ORGANIZATION$ more secure.", + "placeholders": { + "organization": { + "content": "$1" + } + }, + "description": "Shown to user after login is updated." + }, + "loginUpdateTaskSuccessAdditional": { + "message": "Thank you for making $ORGANIZATION$ more secure. You have $TASK_COUNT$ more passwords to update.", + "placeholders": { + "organization": { + "content": "$1" + }, + "task_count": { + "content": "$2" + } + }, + "description": "Shown to user after login is updated." + }, + "nextSecurityTaskAction": { + "message": "Change next password", + "description": "Message prompting user to undertake completion of another security task." + }, "saveFailure": { "message": "Error saving", "description": "Error message shown when the system fails to save login details." @@ -1391,24 +1416,12 @@ "premiumRequiredDesc": { "message": "A Premium membership is required to use this feature." }, - "enterVerificationCodeApp": { - "message": "Enter the 6 digit verification code from your authenticator app." - }, "authenticationTimeout": { "message": "Authentication timeout" }, "authenticationSessionTimedOut": { "message": "The authentication session timed out. Please restart the login process." }, - "enterVerificationCodeEmail": { - "message": "Enter the 6 digit verification code that was emailed to $EMAIL$.", - "placeholders": { - "email": { - "content": "$1", - "example": "example@gmail.com" - } - } - }, "verificationCodeEmailSent": { "message": "Verification email sent to $EMAIL$.", "placeholders": { @@ -1418,18 +1431,9 @@ } } }, - "rememberMe": { - "message": "Remember me" - }, "dontAskAgainOnThisDeviceFor30Days": { "message": "Don't ask again on this device for 30 days" }, - "sendVerificationCodeEmailAgain": { - "message": "Send verification code email again" - }, - "useAnotherTwoStepMethod": { - "message": "Use another two-step login method" - }, "selectAnotherMethod": { "message": "Select another method", "description": "Select another two-step login method" @@ -1437,18 +1441,9 @@ "useYourRecoveryCode": { "message": "Use your recovery code" }, - "insertYubiKey": { - "message": "Insert your YubiKey into your computer's USB port, then touch its button." - }, "insertU2f": { "message": "Insert your security key into your computer's USB port. If it has a button, touch it." }, - "webAuthnNewTab": { - "message": "To start the WebAuthn 2FA verification. Click the button below to open a new tab and follow the instructions provided in the new tab." - }, - "webAuthnNewTabOpen": { - "message": "Open new tab" - }, "openInNewTab": { "message": "Open in new tab" }, @@ -2327,6 +2322,9 @@ "privacyPolicy": { "message": "Privacy Policy" }, + "yourNewPasswordCannotBeTheSameAsYourCurrentPassword": { + "message": "Your new password cannot be the same as your current password." + }, "hintEqualsPassword": { "message": "Your password hint cannot be the same as your password." }, @@ -2534,15 +2532,15 @@ "message": "Your organization passwords are at-risk because they are weak, reused, and/or exposed.", "description": "Description of the review at-risk login slide on the at-risk password page carousel" }, - "reviewAtRiskLoginSlideImgAlt": { - "message": "Illustration of a list of logins that are at-risk" + "reviewAtRiskLoginSlideImgAltPeriod": { + "message": "Illustration of a list of logins that are at-risk." }, "generatePasswordSlideDesc": { "message": "Quickly generate a strong, unique password with the Bitwarden autofill menu on the at-risk site.", "description": "Description of the generate password slide on the at-risk password page carousel" }, - "generatePasswordSlideImgAlt": { - "message": "Illustration of the Bitwarden autofill menu displaying a generated password" + "generatePasswordSlideImgAltPeriod": { + "message": "Illustration of the Bitwarden autofill menu displaying a generated password." }, "updateInBitwarden": { "message": "Update in Bitwarden" @@ -2551,8 +2549,8 @@ "message": "Bitwarden will then prompt you to update the password in the password manager.", "description": "Description of the update in Bitwarden slide on the at-risk password page carousel" }, - "updateInBitwardenSlideImgAlt": { - "message": "Illustration of a Bitwarden’s notification prompting the user to update the login" + "updateInBitwardenSlideImgAltPeriod": { + "message": "Illustration of a Bitwarden’s notification prompting the user to update the login." }, "turnOnAutofill": { "message": "Turn on autofill" @@ -3007,6 +3005,15 @@ } } }, + "exportingIndividualVaultWithAttachmentsDescription": { + "message": "Only the individual vault items including attachments associated with $EMAIL$ will be exported. Organization vault items will not be included", + "placeholders": { + "email": { + "content": "$1", + "example": "name@example.com" + } + } + }, "exportingOrganizationVaultTitle": { "message": "Exporting organization vault" }, @@ -3839,15 +3846,9 @@ "duoHealthCheckResultsInNullAuthUrlError": { "message": "Error connecting with the Duo service. Use a different two-step login method or contact Duo for assistance." }, - "launchDuoAndFollowStepsToFinishLoggingIn": { - "message": "Launch Duo and follow the steps to finish logging in." - }, "duoRequiredForAccount": { "message": "Duo two-step login is required for your account." }, - "popoutTheExtensionToCompleteLogin": { - "message": "Popout the extension to complete login." - }, "popoutExtension": { "message": "Popout extension" }, @@ -4270,6 +4271,20 @@ } } }, + "viewItemTitleWithField": { + "message": "View item - $ITEMNAME$ - $FIELD$", + "description": "Title for a link that opens a view for an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + }, + "field": { + "content": "$2", + "example": "Username" + } + } + }, "autofillTitle": { "message": "Autofill - $ITEMNAME$", "description": "Title for a button that autofills a login item.", @@ -4280,6 +4295,20 @@ } } }, + "autofillTitleWithField": { + "message": "Autofill - $ITEMNAME$ - $FIELD$", + "description": "Title for a button that autofills a login item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + }, + "field": { + "content": "$2", + "example": "Username" + } + } + }, "copyFieldValue": { "message": "Copy $FIELD$, $VALUE$", "description": "Title for a button that copies a field value to the clipboard.", @@ -4899,8 +4928,8 @@ "message": "Password regenerated", "description": "Notification message for when a password has been regenerated" }, - "saveLoginToBitwarden": { - "message": "Save login to Bitwarden?", + "saveToBitwarden": { + "message": "Save to Bitwarden", "description": "Confirmation message for saving a login to Bitwarden" }, "spaceCharacterDescriptor": { @@ -5139,5 +5168,32 @@ }, "changeAtRiskPassword": { "message": "Change at-risk password" + }, + "introCarouselLabel": { + "message": "Welcome to Bitwarden" + }, + "securityPrioritized": { + "message": "Security, prioritized" + }, + "securityPrioritizedBody": { + "message": "Save logins, cards, and identities to your secure vault. Bitwarden uses zero-knowledge, end-to-end encryption to protect what’s important to you." + }, + "quickLogin": { + "message": "Quick and easy login" + }, + "quickLoginBody": { + "message": "Set up biometric unlock and autofill to log into your accounts without typing a single letter." + }, + "secureUser": { + "message": "Level up your logins" + }, + "secureUserBody": { + "message": "Use the generator to create and save strong, unique passwords for all your accounts." + }, + "secureDevices": { + "message": "Your data, when and where you need it" + }, + "secureDevicesBody": { + "message": "Save unlimited passwords across unlimited devices with Bitwarden mobile, browser, and desktop apps." } } diff --git a/apps/browser/src/_locales/or/messages.json b/apps/browser/src/_locales/or/messages.json index c9c29611deb..61d21cc2987 100644 --- a/apps/browser/src/_locales/or/messages.json +++ b/apps/browser/src/_locales/or/messages.json @@ -1098,6 +1098,31 @@ "message": "Login updated", "description": "Message displayed when login details are successfully updated." }, + "loginUpdateTaskSuccess": { + "message": "Great job! You took the steps to make you and $ORGANIZATION$ more secure.", + "placeholders": { + "organization": { + "content": "$1" + } + }, + "description": "Shown to user after login is updated." + }, + "loginUpdateTaskSuccessAdditional": { + "message": "Thank you for making $ORGANIZATION$ more secure. You have $TASK_COUNT$ more passwords to update.", + "placeholders": { + "organization": { + "content": "$1" + }, + "task_count": { + "content": "$2" + } + }, + "description": "Shown to user after login is updated." + }, + "nextSecurityTaskAction": { + "message": "Change next password", + "description": "Message prompting user to undertake completion of another security task." + }, "saveFailure": { "message": "Error saving", "description": "Error message shown when the system fails to save login details." @@ -1391,24 +1416,12 @@ "premiumRequiredDesc": { "message": "A Premium membership is required to use this feature." }, - "enterVerificationCodeApp": { - "message": "Enter the 6 digit verification code from your authenticator app." - }, "authenticationTimeout": { "message": "Authentication timeout" }, "authenticationSessionTimedOut": { "message": "The authentication session timed out. Please restart the login process." }, - "enterVerificationCodeEmail": { - "message": "Enter the 6 digit verification code that was emailed to $EMAIL$.", - "placeholders": { - "email": { - "content": "$1", - "example": "example@gmail.com" - } - } - }, "verificationCodeEmailSent": { "message": "Verification email sent to $EMAIL$.", "placeholders": { @@ -1418,18 +1431,9 @@ } } }, - "rememberMe": { - "message": "Remember me" - }, "dontAskAgainOnThisDeviceFor30Days": { "message": "Don't ask again on this device for 30 days" }, - "sendVerificationCodeEmailAgain": { - "message": "Send verification code email again" - }, - "useAnotherTwoStepMethod": { - "message": "Use another two-step login method" - }, "selectAnotherMethod": { "message": "Select another method", "description": "Select another two-step login method" @@ -1437,18 +1441,9 @@ "useYourRecoveryCode": { "message": "Use your recovery code" }, - "insertYubiKey": { - "message": "Insert your YubiKey into your computer's USB port, then touch its button." - }, "insertU2f": { "message": "Insert your security key into your computer's USB port. If it has a button, touch it." }, - "webAuthnNewTab": { - "message": "To start the WebAuthn 2FA verification. Click the button below to open a new tab and follow the instructions provided in the new tab." - }, - "webAuthnNewTabOpen": { - "message": "Open new tab" - }, "openInNewTab": { "message": "Open in new tab" }, @@ -2327,6 +2322,9 @@ "privacyPolicy": { "message": "Privacy Policy" }, + "yourNewPasswordCannotBeTheSameAsYourCurrentPassword": { + "message": "Your new password cannot be the same as your current password." + }, "hintEqualsPassword": { "message": "Your password hint cannot be the same as your password." }, @@ -2534,15 +2532,15 @@ "message": "Your organization passwords are at-risk because they are weak, reused, and/or exposed.", "description": "Description of the review at-risk login slide on the at-risk password page carousel" }, - "reviewAtRiskLoginSlideImgAlt": { - "message": "Illustration of a list of logins that are at-risk" + "reviewAtRiskLoginSlideImgAltPeriod": { + "message": "Illustration of a list of logins that are at-risk." }, "generatePasswordSlideDesc": { "message": "Quickly generate a strong, unique password with the Bitwarden autofill menu on the at-risk site.", "description": "Description of the generate password slide on the at-risk password page carousel" }, - "generatePasswordSlideImgAlt": { - "message": "Illustration of the Bitwarden autofill menu displaying a generated password" + "generatePasswordSlideImgAltPeriod": { + "message": "Illustration of the Bitwarden autofill menu displaying a generated password." }, "updateInBitwarden": { "message": "Update in Bitwarden" @@ -2551,8 +2549,8 @@ "message": "Bitwarden will then prompt you to update the password in the password manager.", "description": "Description of the update in Bitwarden slide on the at-risk password page carousel" }, - "updateInBitwardenSlideImgAlt": { - "message": "Illustration of a Bitwarden’s notification prompting the user to update the login" + "updateInBitwardenSlideImgAltPeriod": { + "message": "Illustration of a Bitwarden’s notification prompting the user to update the login." }, "turnOnAutofill": { "message": "Turn on autofill" @@ -3007,6 +3005,15 @@ } } }, + "exportingIndividualVaultWithAttachmentsDescription": { + "message": "Only the individual vault items including attachments associated with $EMAIL$ will be exported. Organization vault items will not be included", + "placeholders": { + "email": { + "content": "$1", + "example": "name@example.com" + } + } + }, "exportingOrganizationVaultTitle": { "message": "Exporting organization vault" }, @@ -3839,15 +3846,9 @@ "duoHealthCheckResultsInNullAuthUrlError": { "message": "Error connecting with the Duo service. Use a different two-step login method or contact Duo for assistance." }, - "launchDuoAndFollowStepsToFinishLoggingIn": { - "message": "Launch Duo and follow the steps to finish logging in." - }, "duoRequiredForAccount": { "message": "Duo two-step login is required for your account." }, - "popoutTheExtensionToCompleteLogin": { - "message": "Popout the extension to complete login." - }, "popoutExtension": { "message": "Popout extension" }, @@ -4270,6 +4271,20 @@ } } }, + "viewItemTitleWithField": { + "message": "View item - $ITEMNAME$ - $FIELD$", + "description": "Title for a link that opens a view for an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + }, + "field": { + "content": "$2", + "example": "Username" + } + } + }, "autofillTitle": { "message": "Autofill - $ITEMNAME$", "description": "Title for a button that autofills a login item.", @@ -4280,6 +4295,20 @@ } } }, + "autofillTitleWithField": { + "message": "Autofill - $ITEMNAME$ - $FIELD$", + "description": "Title for a button that autofills a login item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + }, + "field": { + "content": "$2", + "example": "Username" + } + } + }, "copyFieldValue": { "message": "Copy $FIELD$, $VALUE$", "description": "Title for a button that copies a field value to the clipboard.", @@ -4899,8 +4928,8 @@ "message": "Password regenerated", "description": "Notification message for when a password has been regenerated" }, - "saveLoginToBitwarden": { - "message": "Save login to Bitwarden?", + "saveToBitwarden": { + "message": "Save to Bitwarden", "description": "Confirmation message for saving a login to Bitwarden" }, "spaceCharacterDescriptor": { @@ -5139,5 +5168,32 @@ }, "changeAtRiskPassword": { "message": "Change at-risk password" + }, + "introCarouselLabel": { + "message": "Welcome to Bitwarden" + }, + "securityPrioritized": { + "message": "Security, prioritized" + }, + "securityPrioritizedBody": { + "message": "Save logins, cards, and identities to your secure vault. Bitwarden uses zero-knowledge, end-to-end encryption to protect what’s important to you." + }, + "quickLogin": { + "message": "Quick and easy login" + }, + "quickLoginBody": { + "message": "Set up biometric unlock and autofill to log into your accounts without typing a single letter." + }, + "secureUser": { + "message": "Level up your logins" + }, + "secureUserBody": { + "message": "Use the generator to create and save strong, unique passwords for all your accounts." + }, + "secureDevices": { + "message": "Your data, when and where you need it" + }, + "secureDevicesBody": { + "message": "Save unlimited passwords across unlimited devices with Bitwarden mobile, browser, and desktop apps." } } diff --git a/apps/browser/src/_locales/pl/messages.json b/apps/browser/src/_locales/pl/messages.json index f4c1303bd18..e0b66fc43f8 100644 --- a/apps/browser/src/_locales/pl/messages.json +++ b/apps/browser/src/_locales/pl/messages.json @@ -1098,6 +1098,31 @@ "message": "Dane logowania zostały zaktualizowane", "description": "Message displayed when login details are successfully updated." }, + "loginUpdateTaskSuccess": { + "message": "Świetna robota! Podjęto kroki mające na celu zwiększenie bezpieczeństwa Twojego oraz $ORGANIZATION$.", + "placeholders": { + "organization": { + "content": "$1" + } + }, + "description": "Shown to user after login is updated." + }, + "loginUpdateTaskSuccessAdditional": { + "message": "Dziękujemy za dbanie o bezpieczeństwo $ORGANIZATION$. Pozostało $TASK_COUNT$ haseł do zaktualizowania.", + "placeholders": { + "organization": { + "content": "$1" + }, + "task_count": { + "content": "$2" + } + }, + "description": "Shown to user after login is updated." + }, + "nextSecurityTaskAction": { + "message": "Zmień następne hasło", + "description": "Message prompting user to undertake completion of another security task." + }, "saveFailure": { "message": "Błąd podczas zapisywania", "description": "Error message shown when the system fails to save login details." @@ -1391,24 +1416,12 @@ "premiumRequiredDesc": { "message": "Konto Premium jest wymagane, aby skorzystać z tej funkcji." }, - "enterVerificationCodeApp": { - "message": "Wpisz 6-cyfrowy kod weryfikacyjny z aplikacji uwierzytelniającej." - }, "authenticationTimeout": { "message": "Limit czasu uwierzytelniania" }, "authenticationSessionTimedOut": { "message": "Upłynął limit czasu uwierzytelniania. Uruchom ponownie proces logowania." }, - "enterVerificationCodeEmail": { - "message": "Wpisz 6-cyfrowy kod weryfikacyjny, który został przesłany na adres $EMAIL$.", - "placeholders": { - "email": { - "content": "$1", - "example": "example@gmail.com" - } - } - }, "verificationCodeEmailSent": { "message": "Kod weryfikacyjny został wysłany na adres $EMAIL$.", "placeholders": { @@ -1418,18 +1431,9 @@ } } }, - "rememberMe": { - "message": "Zapamiętaj mnie" - }, "dontAskAgainOnThisDeviceFor30Days": { "message": "Nie pytaj ponownie na tym urządzeniu przez 30 dni" }, - "sendVerificationCodeEmailAgain": { - "message": "Wyślij ponownie wiadomość z kodem weryfikacyjnym" - }, - "useAnotherTwoStepMethod": { - "message": "Użyj innej metody logowania dwustopniowego" - }, "selectAnotherMethod": { "message": "Wybierz inną metodę", "description": "Select another two-step login method" @@ -1437,18 +1441,9 @@ "useYourRecoveryCode": { "message": "Użyj kodu odzyskiwania" }, - "insertYubiKey": { - "message": "Włóż klucz YubiKey do portu USB komputera, a następnie dotknij jego przycisku." - }, "insertU2f": { "message": "Włóż klucz bezpieczeństwa do portu USB komputera. Jeśli klucz posiada przycisk, dotknij go." }, - "webAuthnNewTab": { - "message": "Kontynuuj logowanie dwustopniowe WebAuthn w nowej karcie." - }, - "webAuthnNewTabOpen": { - "message": "Otwórz nową kartę" - }, "openInNewTab": { "message": "Otwórz w nowej karcie" }, @@ -2327,6 +2322,9 @@ "privacyPolicy": { "message": "Polityka prywatności" }, + "yourNewPasswordCannotBeTheSameAsYourCurrentPassword": { + "message": "Twoje nowe hasło nie może być takie samo jak Twoje aktualne hasło." + }, "hintEqualsPassword": { "message": "Podpowiedź do hasła nie może być taka sama jak hasło." }, @@ -2534,15 +2532,15 @@ "message": "Twoje hasła organizacji są zagrożone, ponieważ są słabe, ponownie używane i/lub narażone.", "description": "Description of the review at-risk login slide on the at-risk password page carousel" }, - "reviewAtRiskLoginSlideImgAlt": { - "message": "Ilustracja listy loginów, które są zagrożone" + "reviewAtRiskLoginSlideImgAltPeriod": { + "message": "Ilustracja listy danych logowania, które są zagrożone." }, "generatePasswordSlideDesc": { "message": "Szybko wygeneruj silne, unikalne hasło z menu autouzupełniania Bitwarden na stronie narażonej na ryzyko.", "description": "Description of the generate password slide on the at-risk password page carousel" }, - "generatePasswordSlideImgAlt": { - "message": "Ilustracja menu autouzupełniania Bitwarden pokazująca wygenerowane hasło" + "generatePasswordSlideImgAltPeriod": { + "message": "Ilustracja menu autouzupełniania Bitwardena pokazująca wygenerowane hasło." }, "updateInBitwarden": { "message": "Aktualizacja w Bitwarden" @@ -2551,8 +2549,8 @@ "message": "Bitwarden poprosi Cię o aktualizację hasła w menedżerze haseł.", "description": "Description of the update in Bitwarden slide on the at-risk password page carousel" }, - "updateInBitwardenSlideImgAlt": { - "message": "Ilustracja powiadomienia Bitwardena, która prosi użytkownika o aktualizację logowania" + "updateInBitwardenSlideImgAltPeriod": { + "message": "Ilustracja powiadomienia Bitwardena, skłaniająca użytkownika do zaktualizowania danych logowania." }, "turnOnAutofill": { "message": "Włącz autouzupełnienie" @@ -3007,6 +3005,15 @@ } } }, + "exportingIndividualVaultWithAttachmentsDescription": { + "message": "Tylko poszczególne elementy sejfu łącznie z załącznikami powiązanymi z $EMAIL$ zostaną wyeksportowane. Elementy sejfu organizacji nie będą dołączone", + "placeholders": { + "email": { + "content": "$1", + "example": "name@example.com" + } + } + }, "exportingOrganizationVaultTitle": { "message": "Eksportowanie sejfu organizacji" }, @@ -3839,15 +3846,9 @@ "duoHealthCheckResultsInNullAuthUrlError": { "message": "Wystąpił błąd podczas połączenia z usługą Duo. Aby uzyskać pomoc, użyj innej metody dwustopniowego logowania lub skontaktuj się z Duo." }, - "launchDuoAndFollowStepsToFinishLoggingIn": { - "message": "Uruchom DUO i wykonaj kroki, aby zakończyć logowanie." - }, "duoRequiredForAccount": { "message": "Dwustopniowe logowanie Duo jest wymagane dla Twojego konta." }, - "popoutTheExtensionToCompleteLogin": { - "message": "Otwórz rozszerzenie w nowym oknie, aby dokończyć logowanie." - }, "popoutExtension": { "message": "Otwórz rozszerzenie w nowym oknie" }, @@ -4270,6 +4271,20 @@ } } }, + "viewItemTitleWithField": { + "message": "Zobacz element - $ITEMNAME$ - $FIELD$", + "description": "Title for a link that opens a view for an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + }, + "field": { + "content": "$2", + "example": "Username" + } + } + }, "autofillTitle": { "message": "Autouzupełnij - $ITEMNAME$", "description": "Title for a button that autofills a login item.", @@ -4280,6 +4295,20 @@ } } }, + "autofillTitleWithField": { + "message": "Autouzupełnij - $ITEMNAME$ - $FIELD$", + "description": "Title for a button that autofills a login item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + }, + "field": { + "content": "$2", + "example": "Username" + } + } + }, "copyFieldValue": { "message": "Kopiuj $FIELD$, $VALUE$", "description": "Title for a button that copies a field value to the clipboard.", @@ -4899,8 +4928,8 @@ "message": "Hasło zostało ponownie wygenerowane", "description": "Notification message for when a password has been regenerated" }, - "saveLoginToBitwarden": { - "message": "Zapisać dane logowania w Bitwarden?", + "saveToBitwarden": { + "message": "Zapisz w Bitwarden", "description": "Confirmation message for saving a login to Bitwarden" }, "spaceCharacterDescriptor": { @@ -5139,5 +5168,32 @@ }, "changeAtRiskPassword": { "message": "Zmień hasło zagrożone" + }, + "introCarouselLabel": { + "message": "Witaj w Bitwarden" + }, + "securityPrioritized": { + "message": "Bezpieczeństwo priorytetem" + }, + "securityPrioritizedBody": { + "message": "Zapisz dane logowania, karty i tożsamości w bezpiecznym sejfie. Bitwarden stosuje szyfrowanie end-to-end z wiedzą zerową, aby chronić to, co jest dla Ciebie ważne." + }, + "quickLogin": { + "message": "Szybkie i łatwe logowanie" + }, + "quickLoginBody": { + "message": "Skonfiguruj odblokowanie i autouzupełnianie biometryczne, aby zalogować się na swoje konta bez wpisywania pojedynczej litery." + }, + "secureUser": { + "message": "Ulepsz swoje loginy" + }, + "secureUserBody": { + "message": "Użyj generatora do tworzenia i zapisywania silnych, unikalnych haseł dla wszystkich kont." + }, + "secureDevices": { + "message": "Twoje dane, kiedy i gdzie potrzebujesz" + }, + "secureDevicesBody": { + "message": "Zapisuj nieograniczoną liczbę haseł na nieograniczonej liczbie urządzeń dzięki aplikacjom Bitwarden na urządzenia mobilne, przeglądarki i komputery stacjonarne." } } diff --git a/apps/browser/src/_locales/pt_BR/messages.json b/apps/browser/src/_locales/pt_BR/messages.json index 0b5d569f443..a6d224587f1 100644 --- a/apps/browser/src/_locales/pt_BR/messages.json +++ b/apps/browser/src/_locales/pt_BR/messages.json @@ -878,7 +878,7 @@ "message": "Insira sua YubiKey para autenticar" }, "duoTwoFactorRequiredPageSubtitle": { - "message": "Duo two-step login is required for your account. Follow the steps below to finish logging in." + "message": "A autenticação de dois fatores é necessária para sua conta. Siga os passos abaixo para conseguir entrar." }, "followTheStepsBelowToFinishLoggingIn": { "message": "Siga os passos abaixo para finalizar o login." @@ -1019,7 +1019,7 @@ "message": "Pedir para adicionar um item se um não for encontrado no seu cofre. Aplica-se a todas as contas logadas." }, "showCardsInVaultViewV2": { - "message": "Always show cards as Autofill suggestions on Vault view" + "message": "Sempre mostrar cartões como sugestões de preenchimento automático na Tela do Cofre" }, "showCardsCurrentTab": { "message": "Mostrar cartões em páginas com guias." @@ -1028,7 +1028,7 @@ "message": "Exibir itens de cartão em páginas com abas para simplificar o preenchimento automático" }, "showIdentitiesInVaultViewV2": { - "message": "Always show identities as Autofill suggestions on Vault view" + "message": "Sempre mostrar identidades como sugestões de preenchimento automático na Tela do Cofre" }, "showIdentitiesCurrentTab": { "message": "Exibir Identidades na Aba Atual" @@ -1037,10 +1037,10 @@ "message": "Liste os itens de identidade na aba atual para facilitar preenchimento automático." }, "clickToAutofillOnVault": { - "message": "Click items to autofill on Vault view" + "message": "Clique em itens para autopreencher na Tela do Cofre" }, "clickToAutofill": { - "message": "Click items in autofill suggestion to fill" + "message": "Selecione itens sugeridos pelo autopreenchimento" }, "clearClipboard": { "message": "Limpar Área de Transferência", @@ -1098,6 +1098,31 @@ "message": "Sessão atualizada", "description": "Message displayed when login details are successfully updated." }, + "loginUpdateTaskSuccess": { + "message": "Great job! You took the steps to make you and $ORGANIZATION$ more secure.", + "placeholders": { + "organization": { + "content": "$1" + } + }, + "description": "Shown to user after login is updated." + }, + "loginUpdateTaskSuccessAdditional": { + "message": "Thank you for making $ORGANIZATION$ more secure. You have $TASK_COUNT$ more passwords to update.", + "placeholders": { + "organization": { + "content": "$1" + }, + "task_count": { + "content": "$2" + } + }, + "description": "Shown to user after login is updated." + }, + "nextSecurityTaskAction": { + "message": "Change next password", + "description": "Message prompting user to undertake completion of another security task." + }, "saveFailure": { "message": "Erro ao salvar", "description": "Error message shown when the system fails to save login details." @@ -1391,24 +1416,12 @@ "premiumRequiredDesc": { "message": "Uma conta premium é necessária para usar esse recurso." }, - "enterVerificationCodeApp": { - "message": "Insira o código de verificação de 6 dígitos do seu aplicativo de autenticação." - }, "authenticationTimeout": { "message": "Tempo de autenticação esgotado" }, "authenticationSessionTimedOut": { "message": "A sessão de autenticação expirou. Por favor, reinicie o processo de login." }, - "enterVerificationCodeEmail": { - "message": "Insira o código de verificação de 6 dígitos que foi enviado por e-mail para $EMAIL$.", - "placeholders": { - "email": { - "content": "$1", - "example": "example@gmail.com" - } - } - }, "verificationCodeEmailSent": { "message": "E-mail de verificação enviado para $EMAIL$.", "placeholders": { @@ -1418,18 +1431,9 @@ } } }, - "rememberMe": { - "message": "Lembrar de mim" - }, "dontAskAgainOnThisDeviceFor30Days": { "message": "Não perguntar novamente neste dispositivo por 30 dias" }, - "sendVerificationCodeEmailAgain": { - "message": "Enviar código de verificação para o e-mail novamente" - }, - "useAnotherTwoStepMethod": { - "message": "Utilizar outro método de verificação em duas etapas" - }, "selectAnotherMethod": { "message": "Escolher outro método", "description": "Select another two-step login method" @@ -1437,18 +1441,9 @@ "useYourRecoveryCode": { "message": "Use seu código de recuperação" }, - "insertYubiKey": { - "message": "Insira a sua YubiKey na porta USB do seu computador, e depois toque no botão da mesma." - }, "insertU2f": { "message": "Insira a sua chave de segurança na porta USB do seu computador. Se ele tiver um botão, toque nele." }, - "webAuthnNewTab": { - "message": "Para iniciar a verificação 2FA WebAuthn. Clique no botão abaixo para abrir uma nova aba e siga as instruções fornecidas na nova aba." - }, - "webAuthnNewTabOpen": { - "message": "Abrir nova aba" - }, "openInNewTab": { "message": "Abrir numa nova aba" }, @@ -1668,7 +1663,7 @@ "message": "Arrastar para ordenar" }, "dragToReorder": { - "message": "Drag to reorder" + "message": "Arraste para reorganizar" }, "cfTypeText": { "message": "Texto" @@ -2176,7 +2171,7 @@ "message": "Novas opções de personalização" }, "newCustomizationOptionsCalloutContent": { - "message": "Customize your vault experience with quick copy actions, compact mode, and more!" + "message": "Personalize a experiência do seu cofre com ações de cópia rápida, modo compacto e muito mais!" }, "newCustomizationOptionsCalloutLink": { "message": "Ver todas as configurações de aparência" @@ -2327,6 +2322,9 @@ "privacyPolicy": { "message": "Política de Privacidade" }, + "yourNewPasswordCannotBeTheSameAsYourCurrentPassword": { + "message": "Sua nova senha não pode ser a mesma que a sua atual." + }, "hintEqualsPassword": { "message": "Sua dica de senha não pode ser o mesmo que sua senha." }, @@ -2452,13 +2450,13 @@ "message": "O Bitwarden não irá pedir para salvar os detalhes de credencial para estes domínios. Você deve atualizar a página para que as alterações entrem em vigor." }, "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": "\"Autopreencher\" e outros recursos podem não estar disponíveis para estes sites. Atualize a página para que as mudanças surtam efeito." }, "autofillBlockedNoticeV2": { - "message": "Autofill is blocked for this website." + "message": "\"Auto completar\" está bloqueado para este site." }, "autofillBlockedNoticeGuidance": { - "message": "Change this in settings" + "message": "Altere isso em configurações" }, "change": { "message": "Alterar" @@ -2476,7 +2474,7 @@ "message": "Senhas em risco" }, "atRiskPasswordDescSingleOrg": { - "message": "$ORGANIZATION$ is requesting you change one password because it is at-risk.", + "message": "$ORGANIZATION$ solicita que altere uma senha, pois ela está vulnerável.", "placeholders": { "organization": { "content": "$1", @@ -2485,7 +2483,7 @@ } }, "atRiskPasswordsDescSingleOrgPlural": { - "message": "$ORGANIZATION$ is requesting you change the $COUNT$ passwords because they are at-risk.", + "message": "$ORGANIZATION$ solicita que altere $COUNT$ senhas, pois elas estão vulneráveis.", "placeholders": { "organization": { "content": "$1", @@ -2498,7 +2496,7 @@ } }, "atRiskPasswordsDescMultiOrgPlural": { - "message": "Your organizations are requesting you change the $COUNT$ passwords because they are at-risk.", + "message": "Suas organizações estão solicitando que altere $COUNT$ senhas porque elas estão vulneráveis.", "placeholders": { "count": { "content": "$1", @@ -2507,10 +2505,10 @@ } }, "reviewAndChangeAtRiskPassword": { - "message": "Review and change one at-risk password" + "message": "Revisar e alterar uma senha vulnerável" }, "reviewAndChangeAtRiskPasswordsPlural": { - "message": "Review and change $COUNT$ at-risk passwords", + "message": "Revisar e alterar $COUNT$ senhas vulneráveis", "placeholders": { "count": { "content": "$1", @@ -2519,40 +2517,40 @@ } }, "changeAtRiskPasswordsFaster": { - "message": "Change at-risk passwords faster" + "message": "Mude senhas vulneráveis rapidamente" }, "changeAtRiskPasswordsFasterDesc": { - "message": "Update your settings so you can quickly autofill your passwords and generate new ones" + "message": "Atualize suas configurações para poder autopreencher ou gerar novas senhas" }, "reviewAtRiskLogins": { - "message": "Review at-risk logins" + "message": "Revisar logins em risco" }, "reviewAtRiskPasswords": { - "message": "Review at-risk passwords" + "message": "Revisar senhas vulneráveis" }, "reviewAtRiskLoginsSlideDesc": { - "message": "Your organization passwords are at-risk because they are weak, reused, and/or exposed.", + "message": "As senhas da sua organização estão vulneráveis, pois são fracas, reutilizadas e/ou comprometidas.", "description": "Description of the review at-risk login slide on the at-risk password page carousel" }, - "reviewAtRiskLoginSlideImgAlt": { - "message": "Illustration of a list of logins that are at-risk" + "reviewAtRiskLoginSlideImgAltPeriod": { + "message": "Ilustração de uma lista de logins em risco." }, "generatePasswordSlideDesc": { - "message": "Quickly generate a strong, unique password with the Bitwarden autofill menu on the at-risk site.", + "message": "Gere rapidamente uma senha forte e única com a opção de autopreenchimento no site vulnerável.", "description": "Description of the generate password slide on the at-risk password page carousel" }, - "generatePasswordSlideImgAlt": { - "message": "Illustration of the Bitwarden autofill menu displaying a generated password" + "generatePasswordSlideImgAltPeriod": { + "message": "Ilustração do menu de autopreenchimento do Bitwarden exibindo uma senha gerada." }, "updateInBitwarden": { "message": "Atualizar no Bitwarden" }, "updateInBitwardenSlideDesc": { - "message": "Bitwarden will then prompt you to update the password in the password manager.", + "message": "O Bitwarden então solicitará que você atualize a senha no gerenciador de senhas.", "description": "Description of the update in Bitwarden slide on the at-risk password page carousel" }, - "updateInBitwardenSlideImgAlt": { - "message": "Illustration of a Bitwarden’s notification prompting the user to update the login" + "updateInBitwardenSlideImgAltPeriod": { + "message": "Ilustração de umja notificação do Bitwarden solicitando que o usuário atualize o login." }, "turnOnAutofill": { "message": "Ativar preenchimento automático" @@ -2582,7 +2580,7 @@ } }, "blockedDomainsSavedSuccess": { - "message": "Blocked domain changes saved" + "message": "Alterações de domínios bloqueados salvas" }, "excludedDomainsSavedSuccess": { "message": "Mudanças de domínios excluídos salvas" @@ -3007,6 +3005,15 @@ } } }, + "exportingIndividualVaultWithAttachmentsDescription": { + "message": "Apenas os itens individuais do cofre, incluindo anexos associados ao $EMAIL$ serão exportados. Os itens do cofre da organização não serão incluídos", + "placeholders": { + "email": { + "content": "$1", + "example": "name@example.com" + } + } + }, "exportingOrganizationVaultTitle": { "message": "Exportando cofre da organização" }, @@ -3029,11 +3036,11 @@ "message": "O Bitwarden não pode descriptografar o(s) item(ns) do cofre listado abaixo." }, "contactCSToAvoidDataLossPart1": { - "message": "Contact customer success", + "message": "Contato com o cliente feito com sucesso", "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": "para evitar a perca adicional dos dados.", "description": "This is part of a larger sentence. The full sentence will read 'Contact customer success to avoid additional data loss.'" }, "generateUsername": { @@ -3168,7 +3175,7 @@ } }, "forwaderInvalidOperation": { - "message": "$SERVICENAME$ refused your request. Please contact your service provider for assistance.", + "message": "$SERVICENAME$ recusou sua solicitação. Contate seu provedor de serviços para receber assistência.", "description": "Displayed when the user is forbidden from using the API by the forwarding service.", "placeholders": { "servicename": { @@ -3178,7 +3185,7 @@ } }, "forwaderInvalidOperationWithMessage": { - "message": "$SERVICENAME$ refused your request: $ERRORMESSAGE$", + "message": "$SERVICENAME$ recusou sua solicitação: $ERRORMESSAGE$", "description": "Displayed when the user is forbidden from using the API by the forwarding service with an error message.", "placeholders": { "servicename": { @@ -3327,13 +3334,13 @@ "message": "Uma notificação foi enviada para seu dispositivo." }, "notificationSentDevicePart1": { - "message": "Unlock Bitwarden on your device or on the" + "message": "Desbloqueie o Bitwarden em seu dispositivo ou na" }, "notificationSentDeviceAnchor": { - "message": "web app" + "message": "aplicativo web" }, "notificationSentDevicePart2": { - "message": "Make sure the Fingerprint phrase matches the one below before approving." + "message": "Certifique-se de que a frase de biometria corresponde a frase abaixo antes de aprovar." }, "aNotificationWasSentToYourDevice": { "message": "Uma notificação foi enviada para o seu dispositivo" @@ -3839,15 +3846,9 @@ "duoHealthCheckResultsInNullAuthUrlError": { "message": "Erro ao se conectar com o serviço Duo. Use um método de verificação de duas etapas diferente ou contate o Duo para assistência." }, - "launchDuoAndFollowStepsToFinishLoggingIn": { - "message": "Inicie o Duo e siga os passos para finalizar o login." - }, "duoRequiredForAccount": { "message": "A autenticação em duas etapas do Duo é necessária para sua conta." }, - "popoutTheExtensionToCompleteLogin": { - "message": "Abra a extensão para concluir o login." - }, "popoutExtension": { "message": "Extensão pop-out" }, @@ -4270,6 +4271,20 @@ } } }, + "viewItemTitleWithField": { + "message": "Visualizar item - $ITEMNAME$ - $FIELD$", + "description": "Title for a link that opens a view for an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + }, + "field": { + "content": "$2", + "example": "Username" + } + } + }, "autofillTitle": { "message": "Auto-preenchimento - $ITEMNAME$", "description": "Title for a button that autofills a login item.", @@ -4280,6 +4295,20 @@ } } }, + "autofillTitleWithField": { + "message": "Autocompletar - $ITEMNAME$ - $FIELD$", + "description": "Title for a button that autofills a login item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + }, + "field": { + "content": "$2", + "example": "Username" + } + } + }, "copyFieldValue": { "message": "Copiar $FIELD$, $VALUE$", "description": "Title for a button that copies a field value to the clipboard.", @@ -4671,7 +4700,7 @@ } }, "reorderWebsiteUriButton": { - "message": "Reorder website URI. Use arrow key to move item up or down." + "message": "Reorganize a URI do site. Use as setas para mover o item para cima ou para baixo." }, "reorderFieldUp": { "message": "$LABEL$ se moveu para cima, posição $INDEX$ de $LENGTH$", @@ -4790,7 +4819,7 @@ "message": "Mostrar o número de sugestões de preenchimento automático de login no ícone da extensão" }, "showQuickCopyActions": { - "message": "Show quick copy actions on Vault" + "message": "Mostrar a opção de cópia rápida no Cofre" }, "systemDefault": { "message": "Padrão do sistema" @@ -4862,22 +4891,22 @@ "message": "Você não tem permissão para editar este arquivo" }, "biometricsStatusHelptextUnlockNeeded": { - "message": "Biometric unlock is unavailable because PIN or password unlock is required first." + "message": "O desbloqueio por biometria está indisponível, pois é necessário informar o PIN ou a senha primeiro." }, "biometricsStatusHelptextHardwareUnavailable": { - "message": "Biometric unlock is currently unavailable." + "message": "O desbloqueio por biometria está indisponível no momento." }, "biometricsStatusHelptextAutoSetupNeeded": { - "message": "Biometric unlock is unavailable due to misconfigured system files." + "message": "O desbloqueio por biometria está indisponível devido a algum erro na configuração dos arquivos de sistema." }, "biometricsStatusHelptextManualSetupNeeded": { - "message": "Biometric unlock is unavailable due to misconfigured system files." + "message": "O desbloqueio por biometria está indisponível devido a algum erro na configuração dos arquivos de sistema." }, "biometricsStatusHelptextDesktopDisconnected": { - "message": "Biometric unlock is unavailable because the Bitwarden desktop app is closed." + "message": "O desbloqueio por biometria está indisponível porque o aplicativo de desktop não está aberto." }, "biometricsStatusHelptextNotEnabledInDesktop": { - "message": "Biometric unlock is unavailable because it is not enabled for $EMAIL$ in the Bitwarden desktop app.", + "message": "O desbloqueio por biometria está indisponível, pois a opção não foi ativada no aplicativo de desktop de $EMAIL$.", "placeholders": { "email": { "content": "$1", @@ -4886,7 +4915,7 @@ } }, "biometricsStatusHelptextUnavailableReasonUnknown": { - "message": "Biometric unlock is currently unavailable for an unknown reason." + "message": "O desbloqueio por biometria está indisponível por razões desconhecidas." }, "authenticating": { "message": "Autenticando" @@ -4899,8 +4928,8 @@ "message": "Senha regenerada", "description": "Notification message for when a password has been regenerated" }, - "saveLoginToBitwarden": { - "message": "Salvar login no Bitwarden?", + "saveToBitwarden": { + "message": "Save to Bitwarden", "description": "Confirmation message for saving a login to Bitwarden" }, "spaceCharacterDescriptor": { @@ -5096,31 +5125,31 @@ "message": "Extra Grande" }, "sshKeyWrongPassword": { - "message": "The password you entered is incorrect." + "message": "A senha está incorreta." }, "importSshKey": { - "message": "Import" + "message": "Importar" }, "confirmSshKeyPassword": { - "message": "Confirm password" + "message": "Confirme a senha" }, "enterSshKeyPasswordDesc": { - "message": "Enter the password for the SSH key." + "message": "Insira a senha da chave SSH." }, "enterSshKeyPassword": { - "message": "Enter password" + "message": "Insira a senha" }, "invalidSshKey": { - "message": "The SSH key is invalid" + "message": "A chave SSH é inválida" }, "sshKeyTypeUnsupported": { - "message": "The SSH key type is not supported" + "message": "O tipo de chave SSH não é suportado" }, "importSshKeyFromClipboard": { - "message": "Import key from clipboard" + "message": "Importar chave da área de transferência" }, "sshKeyImported": { - "message": "SSH key imported successfully" + "message": "Chave SSH importada com sucesso" }, "cannotRemoveViewOnlyCollections": { "message": "Você não pode remover coleções com permissões de Somente leitura: $COLLECTIONS$", @@ -5132,12 +5161,39 @@ } }, "updateDesktopAppOrDisableFingerprintDialogTitle": { - "message": "Please update your desktop application" + "message": "Atualize seu aplicativo de desktop" }, "updateDesktopAppOrDisableFingerprintDialogMessage": { - "message": "To use biometric unlock, please update your desktop application, or disable fingerprint unlock in the desktop settings." + "message": "Para usar o desbloqueio de biometria, atualize seu aplicativo de desktop ou desative a opção \"desbloqueio por biometria\"." }, "changeAtRiskPassword": { - "message": "Change at-risk password" + "message": "Alterar senhas vulneráveis" + }, + "introCarouselLabel": { + "message": "Bem-vindo(a) ao Bitwarden" + }, + "securityPrioritized": { + "message": "Segurança em primeiro lugar" + }, + "securityPrioritizedBody": { + "message": "Guarde suas senhas, cartões e documentos no seu cofre seguro. Bitwarden usa criptografia ponta-a-ponta de zero-knowledge, protegendo o que é valioso para você." + }, + "quickLogin": { + "message": "Login rápido e fácil" + }, + "quickLoginBody": { + "message": "Ative o desbloqueio por biometria e o autopreenchimento para acessar suas contas sem digitar uma única letra." + }, + "secureUser": { + "message": "Melhore seus logins de nível" + }, + "secureUserBody": { + "message": "Use o gerador de senhas para criar e salvar senhas fortes e únicas para todas as suas contas." + }, + "secureDevices": { + "message": "Seus dados, quando e onde precisar" + }, + "secureDevicesBody": { + "message": "Guarde quantas senhas quiser e acesse de qualquer lugar com o Bitwarden. No seu celular, navegador e computador." } } diff --git a/apps/browser/src/_locales/pt_PT/messages.json b/apps/browser/src/_locales/pt_PT/messages.json index c1f1f51609c..4c95f0d6533 100644 --- a/apps/browser/src/_locales/pt_PT/messages.json +++ b/apps/browser/src/_locales/pt_PT/messages.json @@ -1098,6 +1098,31 @@ "message": "Credencial atualizada", "description": "Message displayed when login details are successfully updated." }, + "loginUpdateTaskSuccess": { + "message": "Excelente trabalho! Tomou as medidas necessárias para o tornar a si e à sua $ORGANIZATION$ mais seguros.", + "placeholders": { + "organization": { + "content": "$1" + } + }, + "description": "Shown to user after login is updated." + }, + "loginUpdateTaskSuccessAdditional": { + "message": "Obrigado por tornar a $ORGANIZATION$ mais segura. Tem mais $TASK_COUNT$ palavras-passe para atualizar.", + "placeholders": { + "organization": { + "content": "$1" + }, + "task_count": { + "content": "$2" + } + }, + "description": "Shown to user after login is updated." + }, + "nextSecurityTaskAction": { + "message": "Alterar a palavra-passe seguinte", + "description": "Message prompting user to undertake completion of another security task." + }, "saveFailure": { "message": "Erro ao guardar", "description": "Error message shown when the system fails to save login details." @@ -1391,24 +1416,12 @@ "premiumRequiredDesc": { "message": "É necessária uma subscrição Premium para utilizar esta funcionalidade." }, - "enterVerificationCodeApp": { - "message": "Introduza o código de verificação de 6 dígitos da sua aplicação de autenticação." - }, "authenticationTimeout": { "message": "Tempo limite de autenticação" }, "authenticationSessionTimedOut": { "message": "A sessão de autenticação expirou. Por favor, reinicie o processo de início de sessão." }, - "enterVerificationCodeEmail": { - "message": "Introduza o código de verificação de 6 dígitos que foi enviado por e-mail para $EMAIL$.", - "placeholders": { - "email": { - "content": "$1", - "example": "example@gmail.com" - } - } - }, "verificationCodeEmailSent": { "message": "E-mail de verificação enviado para $EMAIL$.", "placeholders": { @@ -1418,18 +1431,9 @@ } } }, - "rememberMe": { - "message": "Memorizar" - }, "dontAskAgainOnThisDeviceFor30Days": { "message": "Não voltar a perguntar neste dispositivo durante 30 dias" }, - "sendVerificationCodeEmailAgain": { - "message": "Enviar e-mail com o código de verificação novamente" - }, - "useAnotherTwoStepMethod": { - "message": "Utilizar outro método de verificação de dois passos" - }, "selectAnotherMethod": { "message": "Selecionar outro método", "description": "Select another two-step login method" @@ -1437,18 +1441,9 @@ "useYourRecoveryCode": { "message": "Utilize o seu código de recuperação" }, - "insertYubiKey": { - "message": "Introduza a sua YubiKey na porta USB do seu computador, depois toque no botão da mesma." - }, "insertU2f": { "message": "Introduza a sua chave de segurança na porta USB do seu computador. Se tiver um botão, toque no mesmo." }, - "webAuthnNewTab": { - "message": "Para iniciar a verificação do WebAuthn 2FA, clique no botão abaixo para abrir um novo separador e siga as instruções fornecidas no novo separador." - }, - "webAuthnNewTabOpen": { - "message": "Abrir novo separador" - }, "openInNewTab": { "message": "Abrir num novo separador" }, @@ -2327,6 +2322,9 @@ "privacyPolicy": { "message": "Política de privacidade" }, + "yourNewPasswordCannotBeTheSameAsYourCurrentPassword": { + "message": "A sua nova palavra-passe não pode ser igual à sua palavra-passe atual." + }, "hintEqualsPassword": { "message": "A dica da sua palavra-passe não pode ser igual à sua palavra-passe." }, @@ -2534,15 +2532,15 @@ "message": "As palavras-passe da sua organização estão em risco porque são fracas, reutilizadas e/ou expostas.", "description": "Description of the review at-risk login slide on the at-risk password page carousel" }, - "reviewAtRiskLoginSlideImgAlt": { - "message": "Ilustração de uma lista de credenciais que estão em risco" + "reviewAtRiskLoginSlideImgAltPeriod": { + "message": "Ilustração de uma lista de credenciais que estão em risco." }, "generatePasswordSlideDesc": { "message": "Gira rapidamente uma palavra-passe forte e única com o menu de preenchimento automático do Bitwarden no site em risco.", "description": "Description of the generate password slide on the at-risk password page carousel" }, - "generatePasswordSlideImgAlt": { - "message": "Ilustração do menu de preenchimento automático do Bitwarden com uma palavra-passe gerada" + "generatePasswordSlideImgAltPeriod": { + "message": "Ilustração do menu de preenchimento automático do Bitwarden com uma palavra-passe gerada." }, "updateInBitwarden": { "message": "Atualização no Bitwarden" @@ -2551,8 +2549,8 @@ "message": "O Bitwarden pedir-lhe-á então para atualizar a palavra-passe no gestor de palavras-passe.", "description": "Description of the update in Bitwarden slide on the at-risk password page carousel" }, - "updateInBitwardenSlideImgAlt": { - "message": "Ilustração de uma notificação do Bitwarden a pedir ao utilizador que atualize a credencial" + "updateInBitwardenSlideImgAltPeriod": { + "message": "Ilustração de uma notificação do Bitwarden a pedir ao utilizador que atualize a credencial." }, "turnOnAutofill": { "message": "Ativar o preenchimento automático" @@ -3007,6 +3005,15 @@ } } }, + "exportingIndividualVaultWithAttachmentsDescription": { + "message": "Apenas os itens individuais do cofre, incluindo os anexos associados a $EMAIL$, serão exportados. Os itens do cofre da organização não serão incluídos", + "placeholders": { + "email": { + "content": "$1", + "example": "name@example.com" + } + } + }, "exportingOrganizationVaultTitle": { "message": "A exportar o cofre da organização" }, @@ -3839,15 +3846,9 @@ "duoHealthCheckResultsInNullAuthUrlError": { "message": "Erro ao ligar ao serviço Duo. Utilize um método de verificação de dois passos diferente ou contacte o Duo para obter assistência." }, - "launchDuoAndFollowStepsToFinishLoggingIn": { - "message": "Inicie o Duo e siga os passos para concluir o início de sessão." - }, "duoRequiredForAccount": { "message": "A verificação de dois passos Duo é necessária para a sua conta." }, - "popoutTheExtensionToCompleteLogin": { - "message": "Abra a extensão para concluir o início de sessão." - }, "popoutExtension": { "message": "Extensão popout" }, @@ -4270,6 +4271,20 @@ } } }, + "viewItemTitleWithField": { + "message": "Ver item - $ITEMNAME$ - $FIELD$", + "description": "Title for a link that opens a view for an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + }, + "field": { + "content": "$2", + "example": "Username" + } + } + }, "autofillTitle": { "message": "Preencher automaticamente - $ITEMNAME$", "description": "Title for a button that autofills a login item.", @@ -4280,6 +4295,20 @@ } } }, + "autofillTitleWithField": { + "message": "Preencher automaticamente - $ITEMNAME$ - $FIELD$", + "description": "Title for a button that autofills a login item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + }, + "field": { + "content": "$2", + "example": "Username" + } + } + }, "copyFieldValue": { "message": "Copiar $FIELD$, $VALUE$", "description": "Title for a button that copies a field value to the clipboard.", @@ -4899,8 +4928,8 @@ "message": "Palavra-passe gerada novamente", "description": "Notification message for when a password has been regenerated" }, - "saveLoginToBitwarden": { - "message": "Guardar credencial no Bitwarden?", + "saveToBitwarden": { + "message": "Guardar no Bitwarden", "description": "Confirmation message for saving a login to Bitwarden" }, "spaceCharacterDescriptor": { @@ -5139,5 +5168,32 @@ }, "changeAtRiskPassword": { "message": "Alterar palavra-passe em risco" + }, + "introCarouselLabel": { + "message": "Bem-vindo ao Bitwarden" + }, + "securityPrioritized": { + "message": "Segurança, com prioridade" + }, + "securityPrioritizedBody": { + "message": "Guarde credenciais, cartões e identidades no seu cofre seguro. O Bitwarden utiliza encriptação de ponto a ponto e conhecimento zero para proteger o que é importante para si." + }, + "quickLogin": { + "message": "Início de sessão rápido e fácil" + }, + "quickLoginBody": { + "message": "Configure o desbloqueio biométrico e o preenchimento automático para iniciar sessão nas suas contas sem escrever uma única letra." + }, + "secureUser": { + "message": "Eleve o nível das suas credenciais" + }, + "secureUserBody": { + "message": "Utilize o gerador para criar e guardar palavras-passe fortes e únicas para todas as suas contas." + }, + "secureDevices": { + "message": "Os seus dados, quando e onde precisar" + }, + "secureDevicesBody": { + "message": "Guarde palavras-passe ilimitadas em dispositivos ilimitados com as apps Bitwarden para telemóvel, navegador e computador." } } diff --git a/apps/browser/src/_locales/ro/messages.json b/apps/browser/src/_locales/ro/messages.json index 5ce73eb2e49..6f870a7e775 100644 --- a/apps/browser/src/_locales/ro/messages.json +++ b/apps/browser/src/_locales/ro/messages.json @@ -1098,6 +1098,31 @@ "message": "Login updated", "description": "Message displayed when login details are successfully updated." }, + "loginUpdateTaskSuccess": { + "message": "Great job! You took the steps to make you and $ORGANIZATION$ more secure.", + "placeholders": { + "organization": { + "content": "$1" + } + }, + "description": "Shown to user after login is updated." + }, + "loginUpdateTaskSuccessAdditional": { + "message": "Thank you for making $ORGANIZATION$ more secure. You have $TASK_COUNT$ more passwords to update.", + "placeholders": { + "organization": { + "content": "$1" + }, + "task_count": { + "content": "$2" + } + }, + "description": "Shown to user after login is updated." + }, + "nextSecurityTaskAction": { + "message": "Change next password", + "description": "Message prompting user to undertake completion of another security task." + }, "saveFailure": { "message": "Error saving", "description": "Error message shown when the system fails to save login details." @@ -1391,24 +1416,12 @@ "premiumRequiredDesc": { "message": "Pentru a utiliza această funcție este necesar un abonament Premium." }, - "enterVerificationCodeApp": { - "message": "Introducere cod de verificare din 6 cifre din aplicația de autentificare." - }, "authenticationTimeout": { "message": "Authentication timeout" }, "authenticationSessionTimedOut": { "message": "The authentication session timed out. Please restart the login process." }, - "enterVerificationCodeEmail": { - "message": "Introducere cod de verificare din 6 cifre care a fost trimis prin e-mail la $EMAIL$.", - "placeholders": { - "email": { - "content": "$1", - "example": "example@gmail.com" - } - } - }, "verificationCodeEmailSent": { "message": "E-mailul de verificare a fost trimis la $EMAIL$.", "placeholders": { @@ -1418,18 +1431,9 @@ } } }, - "rememberMe": { - "message": "Memorare autentificare" - }, "dontAskAgainOnThisDeviceFor30Days": { "message": "Don't ask again on this device for 30 days" }, - "sendVerificationCodeEmailAgain": { - "message": "Retrimitere e-mail cu codul de verificare" - }, - "useAnotherTwoStepMethod": { - "message": "Utilizare de metodă diferită de autentificare în două etape" - }, "selectAnotherMethod": { "message": "Select another method", "description": "Select another two-step login method" @@ -1437,18 +1441,9 @@ "useYourRecoveryCode": { "message": "Use your recovery code" }, - "insertYubiKey": { - "message": "Introduceți YubiKey în portul USB al calculatorului apoi apăsați butonul acestuia." - }, "insertU2f": { "message": "Introduceți cheia de securitate în portul USB al computerului. Dacă are un buton, apăsați-l." }, - "webAuthnNewTab": { - "message": "Pentru a începe verificarea WebAuthn 2FA. Faceți clic pe butonul de mai jos pentru a deschide o filă nouă și urmați instrucțiunile furnizate în filă nouă." - }, - "webAuthnNewTabOpen": { - "message": "Deschideți o filă nouă" - }, "openInNewTab": { "message": "Open in new tab" }, @@ -2327,6 +2322,9 @@ "privacyPolicy": { "message": "Politică de confidențialitate" }, + "yourNewPasswordCannotBeTheSameAsYourCurrentPassword": { + "message": "Your new password cannot be the same as your current password." + }, "hintEqualsPassword": { "message": "Indiciul dvs. de parolă nu poate fi același cu parola dvs." }, @@ -2534,15 +2532,15 @@ "message": "Your organization passwords are at-risk because they are weak, reused, and/or exposed.", "description": "Description of the review at-risk login slide on the at-risk password page carousel" }, - "reviewAtRiskLoginSlideImgAlt": { - "message": "Illustration of a list of logins that are at-risk" + "reviewAtRiskLoginSlideImgAltPeriod": { + "message": "Illustration of a list of logins that are at-risk." }, "generatePasswordSlideDesc": { "message": "Quickly generate a strong, unique password with the Bitwarden autofill menu on the at-risk site.", "description": "Description of the generate password slide on the at-risk password page carousel" }, - "generatePasswordSlideImgAlt": { - "message": "Illustration of the Bitwarden autofill menu displaying a generated password" + "generatePasswordSlideImgAltPeriod": { + "message": "Illustration of the Bitwarden autofill menu displaying a generated password." }, "updateInBitwarden": { "message": "Update in Bitwarden" @@ -2551,8 +2549,8 @@ "message": "Bitwarden will then prompt you to update the password in the password manager.", "description": "Description of the update in Bitwarden slide on the at-risk password page carousel" }, - "updateInBitwardenSlideImgAlt": { - "message": "Illustration of a Bitwarden’s notification prompting the user to update the login" + "updateInBitwardenSlideImgAltPeriod": { + "message": "Illustration of a Bitwarden’s notification prompting the user to update the login." }, "turnOnAutofill": { "message": "Turn on autofill" @@ -3007,6 +3005,15 @@ } } }, + "exportingIndividualVaultWithAttachmentsDescription": { + "message": "Only the individual vault items including attachments associated with $EMAIL$ will be exported. Organization vault items will not be included", + "placeholders": { + "email": { + "content": "$1", + "example": "name@example.com" + } + } + }, "exportingOrganizationVaultTitle": { "message": "Exporting organization vault" }, @@ -3839,15 +3846,9 @@ "duoHealthCheckResultsInNullAuthUrlError": { "message": "Error connecting with the Duo service. Use a different two-step login method or contact Duo for assistance." }, - "launchDuoAndFollowStepsToFinishLoggingIn": { - "message": "Launch Duo and follow the steps to finish logging in." - }, "duoRequiredForAccount": { "message": "Duo two-step login is required for your account." }, - "popoutTheExtensionToCompleteLogin": { - "message": "Popout the extension to complete login." - }, "popoutExtension": { "message": "Popout extension" }, @@ -4270,6 +4271,20 @@ } } }, + "viewItemTitleWithField": { + "message": "View item - $ITEMNAME$ - $FIELD$", + "description": "Title for a link that opens a view for an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + }, + "field": { + "content": "$2", + "example": "Username" + } + } + }, "autofillTitle": { "message": "Autofill - $ITEMNAME$", "description": "Title for a button that autofills a login item.", @@ -4280,6 +4295,20 @@ } } }, + "autofillTitleWithField": { + "message": "Autofill - $ITEMNAME$ - $FIELD$", + "description": "Title for a button that autofills a login item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + }, + "field": { + "content": "$2", + "example": "Username" + } + } + }, "copyFieldValue": { "message": "Copy $FIELD$, $VALUE$", "description": "Title for a button that copies a field value to the clipboard.", @@ -4899,8 +4928,8 @@ "message": "Password regenerated", "description": "Notification message for when a password has been regenerated" }, - "saveLoginToBitwarden": { - "message": "Save login to Bitwarden?", + "saveToBitwarden": { + "message": "Save to Bitwarden", "description": "Confirmation message for saving a login to Bitwarden" }, "spaceCharacterDescriptor": { @@ -5139,5 +5168,32 @@ }, "changeAtRiskPassword": { "message": "Change at-risk password" + }, + "introCarouselLabel": { + "message": "Welcome to Bitwarden" + }, + "securityPrioritized": { + "message": "Security, prioritized" + }, + "securityPrioritizedBody": { + "message": "Save logins, cards, and identities to your secure vault. Bitwarden uses zero-knowledge, end-to-end encryption to protect what’s important to you." + }, + "quickLogin": { + "message": "Quick and easy login" + }, + "quickLoginBody": { + "message": "Set up biometric unlock and autofill to log into your accounts without typing a single letter." + }, + "secureUser": { + "message": "Level up your logins" + }, + "secureUserBody": { + "message": "Use the generator to create and save strong, unique passwords for all your accounts." + }, + "secureDevices": { + "message": "Your data, when and where you need it" + }, + "secureDevicesBody": { + "message": "Save unlimited passwords across unlimited devices with Bitwarden mobile, browser, and desktop apps." } } diff --git a/apps/browser/src/_locales/ru/messages.json b/apps/browser/src/_locales/ru/messages.json index 11d8de4acbe..00657d94978 100644 --- a/apps/browser/src/_locales/ru/messages.json +++ b/apps/browser/src/_locales/ru/messages.json @@ -1098,6 +1098,31 @@ "message": "Логин обновлен", "description": "Message displayed when login details are successfully updated." }, + "loginUpdateTaskSuccess": { + "message": "Отличная работа! Вы предприняли шаги, чтобы сделать себя и $ORGANIZATION$ более защищенными.", + "placeholders": { + "organization": { + "content": "$1" + } + }, + "description": "Shown to user after login is updated." + }, + "loginUpdateTaskSuccessAdditional": { + "message": "Спасибо, что сделали $ORGANIZATION$ более защищенной. У вас есть еще $TASK_COUNT$ паролей для обновления.", + "placeholders": { + "organization": { + "content": "$1" + }, + "task_count": { + "content": "$2" + } + }, + "description": "Shown to user after login is updated." + }, + "nextSecurityTaskAction": { + "message": "Изменить следующий пароль", + "description": "Message prompting user to undertake completion of another security task." + }, "saveFailure": { "message": "Ошибка при сохранении", "description": "Error message shown when the system fails to save login details." @@ -1391,24 +1416,12 @@ "premiumRequiredDesc": { "message": "Для использования этой функции необходим Премиум." }, - "enterVerificationCodeApp": { - "message": "Введите 6-значный код подтверждения из вашего приложения-аутентификатора." - }, "authenticationTimeout": { "message": "Таймаут аутентификации" }, "authenticationSessionTimedOut": { "message": "Сеанс аутентификации завершился по времени. Пожалуйста, попробуйте войти еще раз." }, - "enterVerificationCodeEmail": { - "message": "Введите 6-значный код подтверждения, который был отправлен на $EMAIL$.", - "placeholders": { - "email": { - "content": "$1", - "example": "example@gmail.com" - } - } - }, "verificationCodeEmailSent": { "message": "Отправлено письмо подтверждения на $EMAIL$.", "placeholders": { @@ -1418,18 +1431,9 @@ } } }, - "rememberMe": { - "message": "Запомнить меня" - }, "dontAskAgainOnThisDeviceFor30Days": { "message": "Не спрашивать на этом устройстве в течение 30 дней" }, - "sendVerificationCodeEmailAgain": { - "message": "Отправить код подтверждения еще раз" - }, - "useAnotherTwoStepMethod": { - "message": "Использовать другой метод двухэтапной аутентификации" - }, "selectAnotherMethod": { "message": "Выбрать другой способ", "description": "Select another two-step login method" @@ -1437,18 +1441,9 @@ "useYourRecoveryCode": { "message": "Использовать код восстановления" }, - "insertYubiKey": { - "message": "Вставьте свой YubiKey в USB-порт компьютера и нажмите его кнопку." - }, "insertU2f": { "message": "Вставьте ключ безопасности в USB-порт компьютера. Если у ключа есть кнопка, нажмите ее." }, - "webAuthnNewTab": { - "message": "Продолжить верификацию 2ЭА WebAuthn в новой вкладке." - }, - "webAuthnNewTabOpen": { - "message": "Открыть новую вкладку" - }, "openInNewTab": { "message": "Открыть в новой вкладке" }, @@ -1802,7 +1797,7 @@ "message": "Полное имя" }, "identityName": { - "message": "Имя" + "message": "Название личности" }, "company": { "message": "Компания" @@ -2327,6 +2322,9 @@ "privacyPolicy": { "message": "Политика конфиденциальности" }, + "yourNewPasswordCannotBeTheSameAsYourCurrentPassword": { + "message": "Ваш новый пароль не может быть таким же, как текущий." + }, "hintEqualsPassword": { "message": "Подсказка для пароля не может совпадать с паролем." }, @@ -2534,15 +2532,15 @@ "message": "Пароли вашей организации подвержены риску, потому что они слабые, повторно используются и/или раскрыты.", "description": "Description of the review at-risk login slide on the at-risk password page carousel" }, - "reviewAtRiskLoginSlideImgAlt": { - "message": "Иллюстрация списка логинов, которые подвержены риску" + "reviewAtRiskLoginSlideImgAltPeriod": { + "message": "Иллюстрация списка логинов, которые подвержены риску." }, "generatePasswordSlideDesc": { "message": "Быстро сгенерируйте надежный уникальный пароль с помощью меню автозаполнения Bitwarden на сайте, подверженном риску.", "description": "Description of the generate password slide on the at-risk password page carousel" }, - "generatePasswordSlideImgAlt": { - "message": "Иллюстрация меню автозаполнения Bitwarden, отображающего сгенерированный пароль" + "generatePasswordSlideImgAltPeriod": { + "message": "Иллюстрация меню автозаполнения Bitwarden, отображающего сгенерированный пароль." }, "updateInBitwarden": { "message": "Обновить в Bitwarden" @@ -2551,8 +2549,8 @@ "message": "После этого Bitwarden предложит вам обновить пароль в менеджере паролей.", "description": "Description of the update in Bitwarden slide on the at-risk password page carousel" }, - "updateInBitwardenSlideImgAlt": { - "message": "Иллюстрация уведомления Bitwarden, предлагающего пользователю обновить логин" + "updateInBitwardenSlideImgAltPeriod": { + "message": "Иллюстрация уведомления Bitwarden, предлагающего пользователю обновить логин." }, "turnOnAutofill": { "message": "Включить автозаполнение" @@ -3007,6 +3005,15 @@ } } }, + "exportingIndividualVaultWithAttachmentsDescription": { + "message": "Будут экспортированы только отдельные элементы хранилища, включая вложения, связанные с $EMAIL$. Элементы хранилища организации включены не будут", + "placeholders": { + "email": { + "content": "$1", + "example": "name@example.com" + } + } + }, "exportingOrganizationVaultTitle": { "message": "Экспорт хранилища организации" }, @@ -3839,15 +3846,9 @@ "duoHealthCheckResultsInNullAuthUrlError": { "message": "Ошибка при подключении к сервису Duo. Используйте другой метод двухэтапной аутентификации или обратитесь за помощью в Duo." }, - "launchDuoAndFollowStepsToFinishLoggingIn": { - "message": "Запустите Duo и следуйте шагам для завершения авторизации." - }, "duoRequiredForAccount": { "message": "Для вашего аккаунта требуется двухэтапная аутентификация Duo." }, - "popoutTheExtensionToCompleteLogin": { - "message": "Запустите расширение для завершения авторизации." - }, "popoutExtension": { "message": "Открепить расширение" }, @@ -4270,6 +4271,20 @@ } } }, + "viewItemTitleWithField": { + "message": "Просмотр элемента - $ITEMNAME$ - $FIELD$", + "description": "Title for a link that opens a view for an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + }, + "field": { + "content": "$2", + "example": "Username" + } + } + }, "autofillTitle": { "message": "Автозаполнение - $ITEMNAME$", "description": "Title for a button that autofills a login item.", @@ -4280,6 +4295,20 @@ } } }, + "autofillTitleWithField": { + "message": "Автозаполнение - $ITEMNAME$ - $FIELD$", + "description": "Title for a button that autofills a login item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + }, + "field": { + "content": "$2", + "example": "Username" + } + } + }, "copyFieldValue": { "message": "Скопировать $FIELD$, $VALUE$", "description": "Title for a button that copies a field value to the clipboard.", @@ -4899,8 +4928,8 @@ "message": "Пароль сгенерирован", "description": "Notification message for when a password has been regenerated" }, - "saveLoginToBitwarden": { - "message": "Сохранить логин в Bitwarden?", + "saveToBitwarden": { + "message": "Сохранить в Bitwarden", "description": "Confirmation message for saving a login to Bitwarden" }, "spaceCharacterDescriptor": { @@ -5139,5 +5168,32 @@ }, "changeAtRiskPassword": { "message": "Изменить пароль, подверженный риску" + }, + "introCarouselLabel": { + "message": "Добро пожаловать в Bitwarden" + }, + "securityPrioritized": { + "message": "Безопасность, приоритет" + }, + "securityPrioritizedBody": { + "message": "Сохраняйте логины, карты и личные данные в своем защищенном хранилище. Bitwarden использует сквозное шифрование, чтобы защитить то, что для вас важно." + }, + "quickLogin": { + "message": "Быстрая и простая авторизация" + }, + "quickLoginBody": { + "message": "Настройте биометрическую разблокировку и автозаполнение, чтобы входить в свои аккаунты, не набирая ни одной буквы." + }, + "secureUser": { + "message": "Сделайте авторизацию еще проще" + }, + "secureUserBody": { + "message": "Используйте генератор для создания и сохранения надежных, уникальных паролей для всех ваших аккаунтов." + }, + "secureDevices": { + "message": "Ваши данные, в любое время в любом месте" + }, + "secureDevicesBody": { + "message": "Сохраняйте неограниченное количество паролей на неограниченном количестве устройств с помощью мобильных, браузерных и десктопных приложений Bitwarden." } } diff --git a/apps/browser/src/_locales/si/messages.json b/apps/browser/src/_locales/si/messages.json index 721d16a2eee..4a99c185afa 100644 --- a/apps/browser/src/_locales/si/messages.json +++ b/apps/browser/src/_locales/si/messages.json @@ -1098,6 +1098,31 @@ "message": "Login updated", "description": "Message displayed when login details are successfully updated." }, + "loginUpdateTaskSuccess": { + "message": "Great job! You took the steps to make you and $ORGANIZATION$ more secure.", + "placeholders": { + "organization": { + "content": "$1" + } + }, + "description": "Shown to user after login is updated." + }, + "loginUpdateTaskSuccessAdditional": { + "message": "Thank you for making $ORGANIZATION$ more secure. You have $TASK_COUNT$ more passwords to update.", + "placeholders": { + "organization": { + "content": "$1" + }, + "task_count": { + "content": "$2" + } + }, + "description": "Shown to user after login is updated." + }, + "nextSecurityTaskAction": { + "message": "Change next password", + "description": "Message prompting user to undertake completion of another security task." + }, "saveFailure": { "message": "Error saving", "description": "Error message shown when the system fails to save login details." @@ -1391,24 +1416,12 @@ "premiumRequiredDesc": { "message": "මෙම අංගය භාවිතා කිරීම සඳහා වාරික සාමාජිකත්වයක් අවශ්ය වේ." }, - "enterVerificationCodeApp": { - "message": "ඔබගේ සත්යාපන යෙදුමෙන් 6 ඉලක්කම් සත්යාපන කේතය ඇතුළත් කරන්න." - }, "authenticationTimeout": { "message": "Authentication timeout" }, "authenticationSessionTimedOut": { "message": "The authentication session timed out. Please restart the login process." }, - "enterVerificationCodeEmail": { - "message": "$EMAIL$වෙත ඊමේල් කරන ලද 6 ඉලක්කම් සත්යාපන කේතය ඇතුළත් කරන්න.", - "placeholders": { - "email": { - "content": "$1", - "example": "example@gmail.com" - } - } - }, "verificationCodeEmailSent": { "message": "සත්යාපන විද්යුත් තැපෑල $EMAIL$වෙත යවා ඇත.", "placeholders": { @@ -1418,18 +1431,9 @@ } } }, - "rememberMe": { - "message": "මාව මතක තබා ගන්න" - }, "dontAskAgainOnThisDeviceFor30Days": { "message": "Don't ask again on this device for 30 days" }, - "sendVerificationCodeEmailAgain": { - "message": "සත්යාපන කේතය නැවත විද්යුත් තැපෑල යවන්න" - }, - "useAnotherTwoStepMethod": { - "message": "තවත් පියවර දෙකක පිවිසුම් ක්රමයක් භාවිතා කරන්න" - }, "selectAnotherMethod": { "message": "Select another method", "description": "Select another two-step login method" @@ -1437,18 +1441,9 @@ "useYourRecoveryCode": { "message": "Use your recovery code" }, - "insertYubiKey": { - "message": "ඔබේ පරිගණකයේ USB පෝට් එකට ඔබගේ YuBiKey ඇතුල් කරන්න, ඉන්පසු එහි බොත්තම ස්පර්ශ කරන්න." - }, "insertU2f": { "message": "ඔබේ ආරක්ෂක යතුර ඔබේ පරිගණකයේ USB පෝට් එකට ඇතුල් කරන්න. එයට බොත්තමක් තිබේ නම් එය ස්පර්ශ කරන්න." }, - "webAuthnNewTab": { - "message": "WebAUTN 2FA සත්යාපනය ආරම්භ කිරීමට. නව පටිත්තක් විවෘත කිරීමට පහත බොත්තම ක්ලික් කර නව පටිත්තෙහි ඇති උපදෙස් අනුගමනය කරන්න." - }, - "webAuthnNewTabOpen": { - "message": "නව ටැබය විවෘත කරන්න" - }, "openInNewTab": { "message": "Open in new tab" }, @@ -2327,6 +2322,9 @@ "privacyPolicy": { "message": "රහස්යතා ප්රතිපත්තිය" }, + "yourNewPasswordCannotBeTheSameAsYourCurrentPassword": { + "message": "Your new password cannot be the same as your current password." + }, "hintEqualsPassword": { "message": "ඔබගේ මුරපද ඉඟිය ඔබගේ මුරපදයට සමාන විය නොහැක." }, @@ -2534,15 +2532,15 @@ "message": "Your organization passwords are at-risk because they are weak, reused, and/or exposed.", "description": "Description of the review at-risk login slide on the at-risk password page carousel" }, - "reviewAtRiskLoginSlideImgAlt": { - "message": "Illustration of a list of logins that are at-risk" + "reviewAtRiskLoginSlideImgAltPeriod": { + "message": "Illustration of a list of logins that are at-risk." }, "generatePasswordSlideDesc": { "message": "Quickly generate a strong, unique password with the Bitwarden autofill menu on the at-risk site.", "description": "Description of the generate password slide on the at-risk password page carousel" }, - "generatePasswordSlideImgAlt": { - "message": "Illustration of the Bitwarden autofill menu displaying a generated password" + "generatePasswordSlideImgAltPeriod": { + "message": "Illustration of the Bitwarden autofill menu displaying a generated password." }, "updateInBitwarden": { "message": "Update in Bitwarden" @@ -2551,8 +2549,8 @@ "message": "Bitwarden will then prompt you to update the password in the password manager.", "description": "Description of the update in Bitwarden slide on the at-risk password page carousel" }, - "updateInBitwardenSlideImgAlt": { - "message": "Illustration of a Bitwarden’s notification prompting the user to update the login" + "updateInBitwardenSlideImgAltPeriod": { + "message": "Illustration of a Bitwarden’s notification prompting the user to update the login." }, "turnOnAutofill": { "message": "Turn on autofill" @@ -3007,6 +3005,15 @@ } } }, + "exportingIndividualVaultWithAttachmentsDescription": { + "message": "Only the individual vault items including attachments associated with $EMAIL$ will be exported. Organization vault items will not be included", + "placeholders": { + "email": { + "content": "$1", + "example": "name@example.com" + } + } + }, "exportingOrganizationVaultTitle": { "message": "Exporting organization vault" }, @@ -3839,15 +3846,9 @@ "duoHealthCheckResultsInNullAuthUrlError": { "message": "Error connecting with the Duo service. Use a different two-step login method or contact Duo for assistance." }, - "launchDuoAndFollowStepsToFinishLoggingIn": { - "message": "Launch Duo and follow the steps to finish logging in." - }, "duoRequiredForAccount": { "message": "Duo two-step login is required for your account." }, - "popoutTheExtensionToCompleteLogin": { - "message": "Popout the extension to complete login." - }, "popoutExtension": { "message": "Popout extension" }, @@ -4270,6 +4271,20 @@ } } }, + "viewItemTitleWithField": { + "message": "View item - $ITEMNAME$ - $FIELD$", + "description": "Title for a link that opens a view for an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + }, + "field": { + "content": "$2", + "example": "Username" + } + } + }, "autofillTitle": { "message": "Autofill - $ITEMNAME$", "description": "Title for a button that autofills a login item.", @@ -4280,6 +4295,20 @@ } } }, + "autofillTitleWithField": { + "message": "Autofill - $ITEMNAME$ - $FIELD$", + "description": "Title for a button that autofills a login item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + }, + "field": { + "content": "$2", + "example": "Username" + } + } + }, "copyFieldValue": { "message": "Copy $FIELD$, $VALUE$", "description": "Title for a button that copies a field value to the clipboard.", @@ -4899,8 +4928,8 @@ "message": "Password regenerated", "description": "Notification message for when a password has been regenerated" }, - "saveLoginToBitwarden": { - "message": "Save login to Bitwarden?", + "saveToBitwarden": { + "message": "Save to Bitwarden", "description": "Confirmation message for saving a login to Bitwarden" }, "spaceCharacterDescriptor": { @@ -5139,5 +5168,32 @@ }, "changeAtRiskPassword": { "message": "Change at-risk password" + }, + "introCarouselLabel": { + "message": "Welcome to Bitwarden" + }, + "securityPrioritized": { + "message": "Security, prioritized" + }, + "securityPrioritizedBody": { + "message": "Save logins, cards, and identities to your secure vault. Bitwarden uses zero-knowledge, end-to-end encryption to protect what’s important to you." + }, + "quickLogin": { + "message": "Quick and easy login" + }, + "quickLoginBody": { + "message": "Set up biometric unlock and autofill to log into your accounts without typing a single letter." + }, + "secureUser": { + "message": "Level up your logins" + }, + "secureUserBody": { + "message": "Use the generator to create and save strong, unique passwords for all your accounts." + }, + "secureDevices": { + "message": "Your data, when and where you need it" + }, + "secureDevicesBody": { + "message": "Save unlimited passwords across unlimited devices with Bitwarden mobile, browser, and desktop apps." } } diff --git a/apps/browser/src/_locales/sk/messages.json b/apps/browser/src/_locales/sk/messages.json index 897db9f3176..d00478ee69c 100644 --- a/apps/browser/src/_locales/sk/messages.json +++ b/apps/browser/src/_locales/sk/messages.json @@ -973,7 +973,7 @@ "message": "Pridaná položka" }, "editedItem": { - "message": "Upravená položka" + "message": "Položka upravená" }, "deleteItemConfirmation": { "message": "Naozaj chcete odstrániť túto položku?" @@ -1098,6 +1098,31 @@ "message": "Prihlasovacie údaje aktualizované", "description": "Message displayed when login details are successfully updated." }, + "loginUpdateTaskSuccess": { + "message": "Skvelá práca! Podnikli ste kroky, aby ste vy a $ORGANIZATION$ boli bezpečnejší.", + "placeholders": { + "organization": { + "content": "$1" + } + }, + "description": "Shown to user after login is updated." + }, + "loginUpdateTaskSuccessAdditional": { + "message": "Ďakujeme, že ste pre $ORGANIZATION$ zabezpečili väčšiu bezpečnosť. Máte ďalšie ($TASK_COUNT$) heslá na aktualizáciu.", + "placeholders": { + "organization": { + "content": "$1" + }, + "task_count": { + "content": "$2" + } + }, + "description": "Shown to user after login is updated." + }, + "nextSecurityTaskAction": { + "message": "Zmeniť ďalšie heslo", + "description": "Message prompting user to undertake completion of another security task." + }, "saveFailure": { "message": "Chyba pri ukladaní", "description": "Error message shown when the system fails to save login details." @@ -1391,24 +1416,12 @@ "premiumRequiredDesc": { "message": "Pre použitie tejto funkcie je potrebné prémiové členstvo." }, - "enterVerificationCodeApp": { - "message": "Zadajte 6-miestny verifikačný kód z vašej overovacej aplikácie." - }, "authenticationTimeout": { "message": "Časový limit overenia" }, "authenticationSessionTimedOut": { "message": "Relácia overovania skončila. Znovu spustite proces prihlásenia." }, - "enterVerificationCodeEmail": { - "message": "Zadajte 6-miestny verifikačný kód, ktorý vám bol zaslaný emailom", - "placeholders": { - "email": { - "content": "$1", - "example": "example@gmail.com" - } - } - }, "verificationCodeEmailSent": { "message": "Overovací e-mail odoslaný na $EMAIL$.", "placeholders": { @@ -1418,18 +1431,9 @@ } } }, - "rememberMe": { - "message": "Zapamätať si ma" - }, "dontAskAgainOnThisDeviceFor30Days": { "message": "Nepýtať sa znova na tomto zariadení 30 dní" }, - "sendVerificationCodeEmailAgain": { - "message": "Znovu zaslať overovací kód emailom" - }, - "useAnotherTwoStepMethod": { - "message": "Použiť inú dvojstupňovú metódu prihlásenia" - }, "selectAnotherMethod": { "message": "Vyberte iný spôsob", "description": "Select another two-step login method" @@ -1437,18 +1441,9 @@ "useYourRecoveryCode": { "message": "Použiť obnovovací kód" }, - "insertYubiKey": { - "message": "Vložte váš YubiKey do USB portu počítača a stlačte jeho tlačidlo." - }, "insertU2f": { "message": "Vložte váš bezpečnostný kľúč do USB portu počítača. Ak má tlačidlo, stlačte ho." }, - "webAuthnNewTab": { - "message": "V overovaní cez WebAuthn 2FA pokračujte na ďalšej záložke." - }, - "webAuthnNewTabOpen": { - "message": "Otvoriť v novej karte" - }, "openInNewTab": { "message": "Otvoriť v novej karte" }, @@ -2327,6 +2322,9 @@ "privacyPolicy": { "message": "Zásady ochrany osobných údajov" }, + "yourNewPasswordCannotBeTheSameAsYourCurrentPassword": { + "message": "Nové heslo nemôže byť rovnaké ako súčasné heslo." + }, "hintEqualsPassword": { "message": "Nápoveď k heslu nemôže byť rovnaká ako heslo." }, @@ -2534,15 +2532,15 @@ "message": "Heslá vašej organizácie sú v ohrození, pretože sú slabé, opakovane používané a/alebo uniknuté.", "description": "Description of the review at-risk login slide on the at-risk password page carousel" }, - "reviewAtRiskLoginSlideImgAlt": { - "message": "Príklady zoznamu prihlásení, ktoré sú ohrozené" + "reviewAtRiskLoginSlideImgAltPeriod": { + "message": "Príklady zoznamu prihlásení, ktoré sú ohrozené." }, "generatePasswordSlideDesc": { "message": "Rýchlo generujte silné, jedinečné heslo pomocu ponuky automatického vypĺňania Bitwardenu na ohrozených stránkach.", "description": "Description of the generate password slide on the at-risk password page carousel" }, - "generatePasswordSlideImgAlt": { - "message": "Príklad ponuky automatického vypĺňania Bitwardenu zobrazujúca vygenerované heslo" + "generatePasswordSlideImgAltPeriod": { + "message": "Príklad ponuky automatického vypĺňania Bitwardenu zobrazujúca vygenerované heslo." }, "updateInBitwarden": { "message": "Aktualizovať v Bitwardene" @@ -2551,8 +2549,8 @@ "message": "Bitwarden vás vyzve na aktualizáciu hesla v správcovi hesiel.", "description": "Description of the update in Bitwarden slide on the at-risk password page carousel" }, - "updateInBitwardenSlideImgAlt": { - "message": "Príklad upozornenia Bitwardenu na aktualizovanie prihlasovacích údajov" + "updateInBitwardenSlideImgAltPeriod": { + "message": "Príklad upozornenia Bitwardenu na aktualizovanie prihlasovacích údajov." }, "turnOnAutofill": { "message": "Zapnúť automatické vypĺňanie" @@ -3007,6 +3005,15 @@ } } }, + "exportingIndividualVaultWithAttachmentsDescription": { + "message": "Exportované budú iba položky osobného trezora spojené s $EMAIL$. Položky trezora organizácie nebudú zahrnuté v exporte", + "placeholders": { + "email": { + "content": "$1", + "example": "name@example.com" + } + } + }, "exportingOrganizationVaultTitle": { "message": "Exportovanie trezora organizácie" }, @@ -3839,15 +3846,9 @@ "duoHealthCheckResultsInNullAuthUrlError": { "message": "Chyba pri pripájaní k službe Duo. Použite inú metódu dvojstupňového prihlásenia alebo kontaktujte Duo a požiadajte o pomoc." }, - "launchDuoAndFollowStepsToFinishLoggingIn": { - "message": "Spustite DUO a postupujte podľa pokynov na dokončenie prihlásenia." - }, "duoRequiredForAccount": { "message": "Pre váš účet je potrebné dvojstupňové prihlásenie Duo." }, - "popoutTheExtensionToCompleteLogin": { - "message": "Ak chcete dokončiť prihlásenie, otvorte rozšírenie." - }, "popoutExtension": { "message": "Zobraziť rozšírenie v novom okne" }, @@ -4270,6 +4271,20 @@ } } }, + "viewItemTitleWithField": { + "message": "Zobraziť položku - $ITEMNAME$ - $FIELD$", + "description": "Title for a link that opens a view for an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + }, + "field": { + "content": "$2", + "example": "Username" + } + } + }, "autofillTitle": { "message": "Automatické vyplnenie - $ITEMNAME$", "description": "Title for a button that autofills a login item.", @@ -4280,6 +4295,20 @@ } } }, + "autofillTitleWithField": { + "message": "Automatické vyplnenie - $ITEMNAME$ - $FIELD$", + "description": "Title for a button that autofills a login item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + }, + "field": { + "content": "$2", + "example": "Username" + } + } + }, "copyFieldValue": { "message": "Kopírovať $FIELD$, $VALUE$", "description": "Title for a button that copies a field value to the clipboard.", @@ -4899,8 +4928,8 @@ "message": "Vygenerované nové heslo", "description": "Notification message for when a password has been regenerated" }, - "saveLoginToBitwarden": { - "message": "Uložiť prihlasovacie údaje do Bitwardenu?", + "saveToBitwarden": { + "message": "Uložiť do Bitwardenu", "description": "Confirmation message for saving a login to Bitwarden" }, "spaceCharacterDescriptor": { @@ -5139,5 +5168,32 @@ }, "changeAtRiskPassword": { "message": "Zmeniť rizikové heslá" + }, + "introCarouselLabel": { + "message": "Vitajte v Bitwardene" + }, + "securityPrioritized": { + "message": "Bezpečnosť na prvom mieste" + }, + "securityPrioritizedBody": { + "message": "Ukladajte prihlasovacie údaje, karty a identity do zabezpečeného trezoru. Bitwarden používa šifrovanie s nulovou znalosťou od začiatku do konca na ochranu toho, čo je pre vás dôležité." + }, + "quickLogin": { + "message": "Rýchle a jednoduché prihlásenie" + }, + "quickLoginBody": { + "message": "Nastavte si odomykanie biometrickými údajmi a automatické vypĺňanie na prihlasovanie do účtov bez zadávania jediného písmena." + }, + "secureUser": { + "message": "Posuňte prihlasovanie na vyššiu úroveň" + }, + "secureUserBody": { + "message": "Pomocou generátora vytvorte a uložte silné a jedinečné heslá pre všetky svoje účty." + }, + "secureDevices": { + "message": "Vaše údaje, kedykoľvek a kdekoľvek ich potrebujete" + }, + "secureDevicesBody": { + "message": "Ukladajte neobmedzený počet hesiel na neobmedzenom počte zariadení pomocou mobilných aplikácií, prehliadačov a desktopových aplikácií Bitwardenu." } } diff --git a/apps/browser/src/_locales/sl/messages.json b/apps/browser/src/_locales/sl/messages.json index f6a543ea5ea..1703fba36c5 100644 --- a/apps/browser/src/_locales/sl/messages.json +++ b/apps/browser/src/_locales/sl/messages.json @@ -1098,6 +1098,31 @@ "message": "Login updated", "description": "Message displayed when login details are successfully updated." }, + "loginUpdateTaskSuccess": { + "message": "Great job! You took the steps to make you and $ORGANIZATION$ more secure.", + "placeholders": { + "organization": { + "content": "$1" + } + }, + "description": "Shown to user after login is updated." + }, + "loginUpdateTaskSuccessAdditional": { + "message": "Thank you for making $ORGANIZATION$ more secure. You have $TASK_COUNT$ more passwords to update.", + "placeholders": { + "organization": { + "content": "$1" + }, + "task_count": { + "content": "$2" + } + }, + "description": "Shown to user after login is updated." + }, + "nextSecurityTaskAction": { + "message": "Change next password", + "description": "Message prompting user to undertake completion of another security task." + }, "saveFailure": { "message": "Error saving", "description": "Error message shown when the system fails to save login details." @@ -1391,24 +1416,12 @@ "premiumRequiredDesc": { "message": "Premium članstvo je potrebno za uporabo te funkcije." }, - "enterVerificationCodeApp": { - "message": "Vnesite 6-mestno verifikacijsko kodo iz svoje aplikacije za avtentikacijo." - }, "authenticationTimeout": { "message": "Authentication timeout" }, "authenticationSessionTimedOut": { "message": "The authentication session timed out. Please restart the login process." }, - "enterVerificationCodeEmail": { - "message": "Vnesite 6-mestno verifikacijsko kodo, ki vam je bila poslana na $EMAIL$.", - "placeholders": { - "email": { - "content": "$1", - "example": "example@gmail.com" - } - } - }, "verificationCodeEmailSent": { "message": "Potrditveno sporočilo poslano na $EMAIL$.", "placeholders": { @@ -1418,18 +1431,9 @@ } } }, - "rememberMe": { - "message": "Zapomni si me" - }, "dontAskAgainOnThisDeviceFor30Days": { "message": "Don't ask again on this device for 30 days" }, - "sendVerificationCodeEmailAgain": { - "message": "Ponovno pošlji verifikacijsko kodo na email" - }, - "useAnotherTwoStepMethod": { - "message": "Uporabi drugi način prijave v dveh korakih" - }, "selectAnotherMethod": { "message": "Select another method", "description": "Select another two-step login method" @@ -1437,18 +1441,9 @@ "useYourRecoveryCode": { "message": "Use your recovery code" }, - "insertYubiKey": { - "message": "Priključi svoj YubiKey v USB priključek, nato pa pritisni na njegovo tipko." - }, "insertU2f": { "message": "Priključi svoj varnostni ključ v USB priključek. Če ima tipko, se jo dotaknite." }, - "webAuthnNewTab": { - "message": "To start the WebAuthn 2FA verification. Click the button below to open a new tab and follow the instructions provided in the new tab." - }, - "webAuthnNewTabOpen": { - "message": "Odpri nov zavihek" - }, "openInNewTab": { "message": "Open in new tab" }, @@ -2327,6 +2322,9 @@ "privacyPolicy": { "message": "Pravilnik o zasebnosti" }, + "yourNewPasswordCannotBeTheSameAsYourCurrentPassword": { + "message": "Your new password cannot be the same as your current password." + }, "hintEqualsPassword": { "message": "Namig za geslo ne sme biti enak geslu." }, @@ -2534,15 +2532,15 @@ "message": "Your organization passwords are at-risk because they are weak, reused, and/or exposed.", "description": "Description of the review at-risk login slide on the at-risk password page carousel" }, - "reviewAtRiskLoginSlideImgAlt": { - "message": "Illustration of a list of logins that are at-risk" + "reviewAtRiskLoginSlideImgAltPeriod": { + "message": "Illustration of a list of logins that are at-risk." }, "generatePasswordSlideDesc": { "message": "Quickly generate a strong, unique password with the Bitwarden autofill menu on the at-risk site.", "description": "Description of the generate password slide on the at-risk password page carousel" }, - "generatePasswordSlideImgAlt": { - "message": "Illustration of the Bitwarden autofill menu displaying a generated password" + "generatePasswordSlideImgAltPeriod": { + "message": "Illustration of the Bitwarden autofill menu displaying a generated password." }, "updateInBitwarden": { "message": "Update in Bitwarden" @@ -2551,8 +2549,8 @@ "message": "Bitwarden will then prompt you to update the password in the password manager.", "description": "Description of the update in Bitwarden slide on the at-risk password page carousel" }, - "updateInBitwardenSlideImgAlt": { - "message": "Illustration of a Bitwarden’s notification prompting the user to update the login" + "updateInBitwardenSlideImgAltPeriod": { + "message": "Illustration of a Bitwarden’s notification prompting the user to update the login." }, "turnOnAutofill": { "message": "Turn on autofill" @@ -3007,6 +3005,15 @@ } } }, + "exportingIndividualVaultWithAttachmentsDescription": { + "message": "Only the individual vault items including attachments associated with $EMAIL$ will be exported. Organization vault items will not be included", + "placeholders": { + "email": { + "content": "$1", + "example": "name@example.com" + } + } + }, "exportingOrganizationVaultTitle": { "message": "Exporting organization vault" }, @@ -3839,15 +3846,9 @@ "duoHealthCheckResultsInNullAuthUrlError": { "message": "Error connecting with the Duo service. Use a different two-step login method or contact Duo for assistance." }, - "launchDuoAndFollowStepsToFinishLoggingIn": { - "message": "Launch Duo and follow the steps to finish logging in." - }, "duoRequiredForAccount": { "message": "Duo two-step login is required for your account." }, - "popoutTheExtensionToCompleteLogin": { - "message": "Popout the extension to complete login." - }, "popoutExtension": { "message": "Popout extension" }, @@ -4270,6 +4271,20 @@ } } }, + "viewItemTitleWithField": { + "message": "View item - $ITEMNAME$ - $FIELD$", + "description": "Title for a link that opens a view for an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + }, + "field": { + "content": "$2", + "example": "Username" + } + } + }, "autofillTitle": { "message": "Autofill - $ITEMNAME$", "description": "Title for a button that autofills a login item.", @@ -4280,6 +4295,20 @@ } } }, + "autofillTitleWithField": { + "message": "Autofill - $ITEMNAME$ - $FIELD$", + "description": "Title for a button that autofills a login item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + }, + "field": { + "content": "$2", + "example": "Username" + } + } + }, "copyFieldValue": { "message": "Copy $FIELD$, $VALUE$", "description": "Title for a button that copies a field value to the clipboard.", @@ -4899,8 +4928,8 @@ "message": "Password regenerated", "description": "Notification message for when a password has been regenerated" }, - "saveLoginToBitwarden": { - "message": "Save login to Bitwarden?", + "saveToBitwarden": { + "message": "Save to Bitwarden", "description": "Confirmation message for saving a login to Bitwarden" }, "spaceCharacterDescriptor": { @@ -5139,5 +5168,32 @@ }, "changeAtRiskPassword": { "message": "Change at-risk password" + }, + "introCarouselLabel": { + "message": "Welcome to Bitwarden" + }, + "securityPrioritized": { + "message": "Security, prioritized" + }, + "securityPrioritizedBody": { + "message": "Save logins, cards, and identities to your secure vault. Bitwarden uses zero-knowledge, end-to-end encryption to protect what’s important to you." + }, + "quickLogin": { + "message": "Quick and easy login" + }, + "quickLoginBody": { + "message": "Set up biometric unlock and autofill to log into your accounts without typing a single letter." + }, + "secureUser": { + "message": "Level up your logins" + }, + "secureUserBody": { + "message": "Use the generator to create and save strong, unique passwords for all your accounts." + }, + "secureDevices": { + "message": "Your data, when and where you need it" + }, + "secureDevicesBody": { + "message": "Save unlimited passwords across unlimited devices with Bitwarden mobile, browser, and desktop apps." } } diff --git a/apps/browser/src/_locales/sr/messages.json b/apps/browser/src/_locales/sr/messages.json index 3c7bef94c13..8c36a163039 100644 --- a/apps/browser/src/_locales/sr/messages.json +++ b/apps/browser/src/_locales/sr/messages.json @@ -1098,6 +1098,31 @@ "message": "Пријава ажурирана", "description": "Message displayed when login details are successfully updated." }, + "loginUpdateTaskSuccess": { + "message": "Great job! You took the steps to make you and $ORGANIZATION$ more secure.", + "placeholders": { + "organization": { + "content": "$1" + } + }, + "description": "Shown to user after login is updated." + }, + "loginUpdateTaskSuccessAdditional": { + "message": "Thank you for making $ORGANIZATION$ more secure. You have $TASK_COUNT$ more passwords to update.", + "placeholders": { + "organization": { + "content": "$1" + }, + "task_count": { + "content": "$2" + } + }, + "description": "Shown to user after login is updated." + }, + "nextSecurityTaskAction": { + "message": "Change next password", + "description": "Message prompting user to undertake completion of another security task." + }, "saveFailure": { "message": "Грешка при снимању", "description": "Error message shown when the system fails to save login details." @@ -1391,24 +1416,12 @@ "premiumRequiredDesc": { "message": "Премијум чланство је неопходно за употребу ове опције." }, - "enterVerificationCodeApp": { - "message": "Унесите шестоцифрени верификациони код из апликације за утврђивање аутентичности." - }, "authenticationTimeout": { "message": "Истекло је време аутентификације" }, "authenticationSessionTimedOut": { "message": "Истекло је време сесије за аутентификацију. Молим вас покрените процес пријаве поново." }, - "enterVerificationCodeEmail": { - "message": "Унесите шестоцифрени верификациони код који је послан на $EMAIL$.", - "placeholders": { - "email": { - "content": "$1", - "example": "example@gmail.com" - } - } - }, "verificationCodeEmailSent": { "message": "Провера имејла послата на $EMAIL$.", "placeholders": { @@ -1418,18 +1431,9 @@ } } }, - "rememberMe": { - "message": "Запамти ме" - }, "dontAskAgainOnThisDeviceFor30Days": { "message": "Не питајте поново на овом уређају 30 дана" }, - "sendVerificationCodeEmailAgain": { - "message": "Поново послати верификациони код на имејл" - }, - "useAnotherTwoStepMethod": { - "message": "Користите другу методу пријављивања у два корака" - }, "selectAnotherMethod": { "message": "Изаберите другу методу", "description": "Select another two-step login method" @@ -1437,18 +1441,9 @@ "useYourRecoveryCode": { "message": "Употребите шифру за опоравак" }, - "insertYubiKey": { - "message": "Убаците свој YubiKey у УСБ порт рачунара, а затим додирните његово дугме." - }, "insertU2f": { "message": "Убаците свој сигурносни кључ у УСБ порт рачунара, и ако има дугме , додирните га." }, - "webAuthnNewTab": { - "message": "Да бисте започели WebAuthn верификацију у два корака. Кликните на дугме испод за отваранје новог језичка и пратите упутства у нјему." - }, - "webAuthnNewTabOpen": { - "message": "Отвори нови језичак " - }, "openInNewTab": { "message": "Отвори у новом језичку" }, @@ -2327,6 +2322,9 @@ "privacyPolicy": { "message": "Политика приватности" }, + "yourNewPasswordCannotBeTheSameAsYourCurrentPassword": { + "message": "Your new password cannot be the same as your current password." + }, "hintEqualsPassword": { "message": "Ваш савет за лозинку не може да буде исти као лозинка." }, @@ -2534,15 +2532,15 @@ "message": "Ваше организационе лозинке су ризичне јер су слабе, поново употребљене и/или изложене.", "description": "Description of the review at-risk login slide on the at-risk password page carousel" }, - "reviewAtRiskLoginSlideImgAlt": { - "message": "Илустрација листе пријаве које су ризичне" + "reviewAtRiskLoginSlideImgAltPeriod": { + "message": "Илустрација листе пријаве које су ризичне." }, "generatePasswordSlideDesc": { "message": "Брзо генеришите снажну, јединствену лозинку са Bitwarden менијем аутопуњења за коришћење на ризичном сајту.", "description": "Description of the generate password slide on the at-risk password page carousel" }, - "generatePasswordSlideImgAlt": { - "message": "Илустрација Bitwarden-ског менија аутопуњења који приказују генерисану лозинку" + "generatePasswordSlideImgAltPeriod": { + "message": "Илустрација Bitwarden-ског менија аутопуњења који приказују генерисану лозинку." }, "updateInBitwarden": { "message": "Ажурирања у Bitwarden" @@ -2551,8 +2549,8 @@ "message": "Bitwarden ће тада затражити да ажурирате лозинку у менаџеру лозинке.", "description": "Description of the update in Bitwarden slide on the at-risk password page carousel" }, - "updateInBitwardenSlideImgAlt": { - "message": "Илустрација Bitwarden-ског обавештења за ажирриање пријаве" + "updateInBitwardenSlideImgAltPeriod": { + "message": "Илустрација Bitwarden-ског обавештења за ажирриање пријаве." }, "turnOnAutofill": { "message": "Омогућите ауто-пуњење" @@ -3007,6 +3005,15 @@ } } }, + "exportingIndividualVaultWithAttachmentsDescription": { + "message": "Извешће се само појединачни сеф, укључујући прилоге повезане са $EMAIL$. Организациони сефски предмети неће бити укључени", + "placeholders": { + "email": { + "content": "$1", + "example": "name@example.com" + } + } + }, "exportingOrganizationVaultTitle": { "message": "Извоз сефа организације" }, @@ -3839,15 +3846,9 @@ "duoHealthCheckResultsInNullAuthUrlError": { "message": "Грешка при повезивању са услугом Duo. Користите други метод пријаве у два корака или контактирајте Duo за помоћ." }, - "launchDuoAndFollowStepsToFinishLoggingIn": { - "message": "Покренути DUO и пратите кораке да бисте завршили пријављивање." - }, "duoRequiredForAccount": { "message": "Duo пријава у два корака је потребна за ваш налог." }, - "popoutTheExtensionToCompleteLogin": { - "message": "Искачући додатак да бисте довршили пријаву." - }, "popoutExtension": { "message": "Искачући додатак" }, @@ -4270,6 +4271,20 @@ } } }, + "viewItemTitleWithField": { + "message": "Видети ставку - $ITEMNAME$ - $FIELD$", + "description": "Title for a link that opens a view for an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + }, + "field": { + "content": "$2", + "example": "Username" + } + } + }, "autofillTitle": { "message": "Ауто-пуњење - $ITEMNAME$", "description": "Title for a button that autofills a login item.", @@ -4280,6 +4295,20 @@ } } }, + "autofillTitleWithField": { + "message": "Ауто-пуњење - $ITEMNAME$ - $FIELD$", + "description": "Title for a button that autofills a login item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + }, + "field": { + "content": "$2", + "example": "Username" + } + } + }, "copyFieldValue": { "message": "Копирај $FIELD$, $VALUE$", "description": "Title for a button that copies a field value to the clipboard.", @@ -4899,8 +4928,8 @@ "message": "Лозинка поново генерисана", "description": "Notification message for when a password has been regenerated" }, - "saveLoginToBitwarden": { - "message": "Сачувати пријаву на Bitwarden?", + "saveToBitwarden": { + "message": "Save to Bitwarden", "description": "Confirmation message for saving a login to Bitwarden" }, "spaceCharacterDescriptor": { @@ -5139,5 +5168,32 @@ }, "changeAtRiskPassword": { "message": "Променити ризичну лозинку" + }, + "introCarouselLabel": { + "message": "Welcome to Bitwarden" + }, + "securityPrioritized": { + "message": "Security, prioritized" + }, + "securityPrioritizedBody": { + "message": "Save logins, cards, and identities to your secure vault. Bitwarden uses zero-knowledge, end-to-end encryption to protect what’s important to you." + }, + "quickLogin": { + "message": "Quick and easy login" + }, + "quickLoginBody": { + "message": "Set up biometric unlock and autofill to log into your accounts without typing a single letter." + }, + "secureUser": { + "message": "Level up your logins" + }, + "secureUserBody": { + "message": "Use the generator to create and save strong, unique passwords for all your accounts." + }, + "secureDevices": { + "message": "Your data, when and where you need it" + }, + "secureDevicesBody": { + "message": "Save unlimited passwords across unlimited devices with Bitwarden mobile, browser, and desktop apps." } } diff --git a/apps/browser/src/_locales/sv/messages.json b/apps/browser/src/_locales/sv/messages.json index 6db7a22490e..0796b67cf0f 100644 --- a/apps/browser/src/_locales/sv/messages.json +++ b/apps/browser/src/_locales/sv/messages.json @@ -194,7 +194,7 @@ "description": "This string is used on the vault page to indicate autofilling. Horizontal space is limited in the interface here so try and keep translations as concise as possible." }, "autoFill": { - "message": "Fyll i automatiskt" + "message": "Autofyll" }, "autoFillLogin": { "message": "Autofyll inloggning" @@ -1098,6 +1098,31 @@ "message": "Login updated", "description": "Message displayed when login details are successfully updated." }, + "loginUpdateTaskSuccess": { + "message": "Great job! You took the steps to make you and $ORGANIZATION$ more secure.", + "placeholders": { + "organization": { + "content": "$1" + } + }, + "description": "Shown to user after login is updated." + }, + "loginUpdateTaskSuccessAdditional": { + "message": "Thank you for making $ORGANIZATION$ more secure. You have $TASK_COUNT$ more passwords to update.", + "placeholders": { + "organization": { + "content": "$1" + }, + "task_count": { + "content": "$2" + } + }, + "description": "Shown to user after login is updated." + }, + "nextSecurityTaskAction": { + "message": "Change next password", + "description": "Message prompting user to undertake completion of another security task." + }, "saveFailure": { "message": "Error saving", "description": "Error message shown when the system fails to save login details." @@ -1391,24 +1416,12 @@ "premiumRequiredDesc": { "message": "Ett premium-medlemskap krävs för att använda den här funktionen." }, - "enterVerificationCodeApp": { - "message": "Ange den 6-siffriga verifieringskoden från din autentiseringsapp." - }, "authenticationTimeout": { "message": "Authentication timeout" }, "authenticationSessionTimedOut": { "message": "The authentication session timed out. Please restart the login process." }, - "enterVerificationCodeEmail": { - "message": "Ange den 6-siffriga verifieringskoden som skickades till $EMAIL$.", - "placeholders": { - "email": { - "content": "$1", - "example": "example@gmail.com" - } - } - }, "verificationCodeEmailSent": { "message": "Verifieringsmeddelande har skickats till $EMAIL$.", "placeholders": { @@ -1418,18 +1431,9 @@ } } }, - "rememberMe": { - "message": "Kom ihåg mig" - }, "dontAskAgainOnThisDeviceFor30Days": { "message": "Don't ask again on this device for 30 days" }, - "sendVerificationCodeEmailAgain": { - "message": "Skicka e-postmeddelandet med verifieringskoden igen" - }, - "useAnotherTwoStepMethod": { - "message": "Använd en annan inloggningsmetod för tvåstegsverifiering" - }, "selectAnotherMethod": { "message": "Select another method", "description": "Select another two-step login method" @@ -1437,18 +1441,9 @@ "useYourRecoveryCode": { "message": "Use your recovery code" }, - "insertYubiKey": { - "message": "Sätt i din YubiKey i en av datorns USB-portar och sätt fingret på knappen." - }, "insertU2f": { "message": "Sätt i din säkerhetsnyckel i en av datorns USB-portar. Om nyckeln har en knapp, sätt fingret på den." }, - "webAuthnNewTab": { - "message": "För att påbörja verifieringen av WebAuthn 2FA. Klicka på knappen nedan för att öppna en ny flik och följ instruktionerna i den nya fliken." - }, - "webAuthnNewTabOpen": { - "message": "Öppna ny flik" - }, "openInNewTab": { "message": "Open in new tab" }, @@ -1560,10 +1555,10 @@ "description": "Represents the message for allowing the user to enable the autofill overlay" }, "autofillSuggestionsSectionTitle": { - "message": "Autofill suggestions" + "message": "Förslag för autofyll" }, "showInlineMenuLabel": { - "message": "Show autofill suggestions on form fields" + "message": "Visa förslag för autofyll i formulärfält" }, "showInlineMenuIdentitiesLabel": { "message": "Visa identiteter som förslag" @@ -1596,7 +1591,7 @@ "description": "Overlay appearance select option for showing the field on click of the overlay icon" }, "enableAutoFillOnPageLoadSectionTitle": { - "message": "Autofill on page load" + "message": "Autofyll vid sidladdning" }, "enableAutoFillOnPageLoad": { "message": "Aktivera automatisk ifyllnad vid sidhämtning" @@ -2327,6 +2322,9 @@ "privacyPolicy": { "message": "Integritetspolicy" }, + "yourNewPasswordCannotBeTheSameAsYourCurrentPassword": { + "message": "Your new password cannot be the same as your current password." + }, "hintEqualsPassword": { "message": "Din lösenordsledtråd får inte vara samma som ditt lösenord." }, @@ -2458,7 +2456,7 @@ "message": "Autofill is blocked for this website." }, "autofillBlockedNoticeGuidance": { - "message": "Change this in settings" + "message": "Ändra detta i inställningar" }, "change": { "message": "Change" @@ -2534,15 +2532,15 @@ "message": "Your organization passwords are at-risk because they are weak, reused, and/or exposed.", "description": "Description of the review at-risk login slide on the at-risk password page carousel" }, - "reviewAtRiskLoginSlideImgAlt": { - "message": "Illustration of a list of logins that are at-risk" + "reviewAtRiskLoginSlideImgAltPeriod": { + "message": "Illustration of a list of logins that are at-risk." }, "generatePasswordSlideDesc": { "message": "Quickly generate a strong, unique password with the Bitwarden autofill menu on the at-risk site.", "description": "Description of the generate password slide on the at-risk password page carousel" }, - "generatePasswordSlideImgAlt": { - "message": "Illustration of the Bitwarden autofill menu displaying a generated password" + "generatePasswordSlideImgAltPeriod": { + "message": "Illustration of the Bitwarden autofill menu displaying a generated password." }, "updateInBitwarden": { "message": "Update in Bitwarden" @@ -2551,14 +2549,14 @@ "message": "Bitwarden will then prompt you to update the password in the password manager.", "description": "Description of the update in Bitwarden slide on the at-risk password page carousel" }, - "updateInBitwardenSlideImgAlt": { - "message": "Illustration of a Bitwarden’s notification prompting the user to update the login" + "updateInBitwardenSlideImgAltPeriod": { + "message": "Illustration of a Bitwarden’s notification prompting the user to update the login." }, "turnOnAutofill": { - "message": "Turn on autofill" + "message": "Aktivera autofyll" }, "turnedOnAutofill": { - "message": "Turned on autofill" + "message": "Aktiverade autofyll" }, "dismiss": { "message": "Dismiss" @@ -3007,6 +3005,15 @@ } } }, + "exportingIndividualVaultWithAttachmentsDescription": { + "message": "Only the individual vault items including attachments associated with $EMAIL$ will be exported. Organization vault items will not be included", + "placeholders": { + "email": { + "content": "$1", + "example": "name@example.com" + } + } + }, "exportingOrganizationVaultTitle": { "message": "Exporting organization vault" }, @@ -3405,7 +3412,7 @@ "message": "Inställningar för automatisk ifyllnad" }, "autofillKeyboardShortcutSectionTitle": { - "message": "Autofill shortcut" + "message": "Kortkommando för autofyll" }, "autofillKeyboardShortcutUpdateLabel": { "message": "Ändra genväg" @@ -3417,7 +3424,7 @@ "message": "Tangentbordsgenväg för automatisk ifyllnad" }, "autofillLoginShortcutNotSet": { - "message": "The autofill login shortcut is not set. Change this in the browser's settings." + "message": "Kortkommandot för autofyll av inloggning är inte inställt. Du kan ändra det i webbläsarens inställningar." }, "autofillLoginShortcutText": { "message": "The autofill login shortcut is $COMMAND$. Manage all shortcuts in the browser's settings.", @@ -3839,15 +3846,9 @@ "duoHealthCheckResultsInNullAuthUrlError": { "message": "Error connecting with the Duo service. Use a different two-step login method or contact Duo for assistance." }, - "launchDuoAndFollowStepsToFinishLoggingIn": { - "message": "Starta Duo och följ stegen för att slutföra inloggningen." - }, "duoRequiredForAccount": { "message": "Duo two-step login is required for your account." }, - "popoutTheExtensionToCompleteLogin": { - "message": "Popout the extension to complete login." - }, "popoutExtension": { "message": "Popout extension" }, @@ -4270,6 +4271,20 @@ } } }, + "viewItemTitleWithField": { + "message": "View item - $ITEMNAME$ - $FIELD$", + "description": "Title for a link that opens a view for an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + }, + "field": { + "content": "$2", + "example": "Username" + } + } + }, "autofillTitle": { "message": "Autofill - $ITEMNAME$", "description": "Title for a button that autofills a login item.", @@ -4280,6 +4295,20 @@ } } }, + "autofillTitleWithField": { + "message": "Autofill - $ITEMNAME$ - $FIELD$", + "description": "Title for a button that autofills a login item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + }, + "field": { + "content": "$2", + "example": "Username" + } + } + }, "copyFieldValue": { "message": "Copy $FIELD$, $VALUE$", "description": "Title for a button that copies a field value to the clipboard.", @@ -4364,7 +4393,7 @@ "message": "Objekt utan mapp" }, "itemDetails": { - "message": "Item details" + "message": "Objektdetaljer" }, "itemName": { "message": "Objektnamn" @@ -4455,13 +4484,13 @@ } }, "personalDetails": { - "message": "Personal details" + "message": "Personuppgifter" }, "identification": { "message": "Identifikation" }, "contactInfo": { - "message": "Contact info" + "message": "Kontaktuppgifter" }, "downloadAttachment": { "message": "Download - $ITEMNAME$", @@ -4477,13 +4506,13 @@ "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": "Inloggningsuppgifter" }, "authenticatorKey": { "message": "Autentiseringsnyckel" }, "autofillOptions": { - "message": "Autofill options" + "message": "Alternativ för autofyll" }, "websiteUri": { "message": "Webbplats (URI)" @@ -4899,8 +4928,8 @@ "message": "Password regenerated", "description": "Notification message for when a password has been regenerated" }, - "saveLoginToBitwarden": { - "message": "Spara inloggning på Bitwarden?", + "saveToBitwarden": { + "message": "Save to Bitwarden", "description": "Confirmation message for saving a login to Bitwarden" }, "spaceCharacterDescriptor": { @@ -5139,5 +5168,32 @@ }, "changeAtRiskPassword": { "message": "Change at-risk password" + }, + "introCarouselLabel": { + "message": "Welcome to Bitwarden" + }, + "securityPrioritized": { + "message": "Security, prioritized" + }, + "securityPrioritizedBody": { + "message": "Save logins, cards, and identities to your secure vault. Bitwarden uses zero-knowledge, end-to-end encryption to protect what’s important to you." + }, + "quickLogin": { + "message": "Quick and easy login" + }, + "quickLoginBody": { + "message": "Set up biometric unlock and autofill to log into your accounts without typing a single letter." + }, + "secureUser": { + "message": "Level up your logins" + }, + "secureUserBody": { + "message": "Use the generator to create and save strong, unique passwords for all your accounts." + }, + "secureDevices": { + "message": "Your data, when and where you need it" + }, + "secureDevicesBody": { + "message": "Save unlimited passwords across unlimited devices with Bitwarden mobile, browser, and desktop apps." } } diff --git a/apps/browser/src/_locales/te/messages.json b/apps/browser/src/_locales/te/messages.json index c9c29611deb..61d21cc2987 100644 --- a/apps/browser/src/_locales/te/messages.json +++ b/apps/browser/src/_locales/te/messages.json @@ -1098,6 +1098,31 @@ "message": "Login updated", "description": "Message displayed when login details are successfully updated." }, + "loginUpdateTaskSuccess": { + "message": "Great job! You took the steps to make you and $ORGANIZATION$ more secure.", + "placeholders": { + "organization": { + "content": "$1" + } + }, + "description": "Shown to user after login is updated." + }, + "loginUpdateTaskSuccessAdditional": { + "message": "Thank you for making $ORGANIZATION$ more secure. You have $TASK_COUNT$ more passwords to update.", + "placeholders": { + "organization": { + "content": "$1" + }, + "task_count": { + "content": "$2" + } + }, + "description": "Shown to user after login is updated." + }, + "nextSecurityTaskAction": { + "message": "Change next password", + "description": "Message prompting user to undertake completion of another security task." + }, "saveFailure": { "message": "Error saving", "description": "Error message shown when the system fails to save login details." @@ -1391,24 +1416,12 @@ "premiumRequiredDesc": { "message": "A Premium membership is required to use this feature." }, - "enterVerificationCodeApp": { - "message": "Enter the 6 digit verification code from your authenticator app." - }, "authenticationTimeout": { "message": "Authentication timeout" }, "authenticationSessionTimedOut": { "message": "The authentication session timed out. Please restart the login process." }, - "enterVerificationCodeEmail": { - "message": "Enter the 6 digit verification code that was emailed to $EMAIL$.", - "placeholders": { - "email": { - "content": "$1", - "example": "example@gmail.com" - } - } - }, "verificationCodeEmailSent": { "message": "Verification email sent to $EMAIL$.", "placeholders": { @@ -1418,18 +1431,9 @@ } } }, - "rememberMe": { - "message": "Remember me" - }, "dontAskAgainOnThisDeviceFor30Days": { "message": "Don't ask again on this device for 30 days" }, - "sendVerificationCodeEmailAgain": { - "message": "Send verification code email again" - }, - "useAnotherTwoStepMethod": { - "message": "Use another two-step login method" - }, "selectAnotherMethod": { "message": "Select another method", "description": "Select another two-step login method" @@ -1437,18 +1441,9 @@ "useYourRecoveryCode": { "message": "Use your recovery code" }, - "insertYubiKey": { - "message": "Insert your YubiKey into your computer's USB port, then touch its button." - }, "insertU2f": { "message": "Insert your security key into your computer's USB port. If it has a button, touch it." }, - "webAuthnNewTab": { - "message": "To start the WebAuthn 2FA verification. Click the button below to open a new tab and follow the instructions provided in the new tab." - }, - "webAuthnNewTabOpen": { - "message": "Open new tab" - }, "openInNewTab": { "message": "Open in new tab" }, @@ -2327,6 +2322,9 @@ "privacyPolicy": { "message": "Privacy Policy" }, + "yourNewPasswordCannotBeTheSameAsYourCurrentPassword": { + "message": "Your new password cannot be the same as your current password." + }, "hintEqualsPassword": { "message": "Your password hint cannot be the same as your password." }, @@ -2534,15 +2532,15 @@ "message": "Your organization passwords are at-risk because they are weak, reused, and/or exposed.", "description": "Description of the review at-risk login slide on the at-risk password page carousel" }, - "reviewAtRiskLoginSlideImgAlt": { - "message": "Illustration of a list of logins that are at-risk" + "reviewAtRiskLoginSlideImgAltPeriod": { + "message": "Illustration of a list of logins that are at-risk." }, "generatePasswordSlideDesc": { "message": "Quickly generate a strong, unique password with the Bitwarden autofill menu on the at-risk site.", "description": "Description of the generate password slide on the at-risk password page carousel" }, - "generatePasswordSlideImgAlt": { - "message": "Illustration of the Bitwarden autofill menu displaying a generated password" + "generatePasswordSlideImgAltPeriod": { + "message": "Illustration of the Bitwarden autofill menu displaying a generated password." }, "updateInBitwarden": { "message": "Update in Bitwarden" @@ -2551,8 +2549,8 @@ "message": "Bitwarden will then prompt you to update the password in the password manager.", "description": "Description of the update in Bitwarden slide on the at-risk password page carousel" }, - "updateInBitwardenSlideImgAlt": { - "message": "Illustration of a Bitwarden’s notification prompting the user to update the login" + "updateInBitwardenSlideImgAltPeriod": { + "message": "Illustration of a Bitwarden’s notification prompting the user to update the login." }, "turnOnAutofill": { "message": "Turn on autofill" @@ -3007,6 +3005,15 @@ } } }, + "exportingIndividualVaultWithAttachmentsDescription": { + "message": "Only the individual vault items including attachments associated with $EMAIL$ will be exported. Organization vault items will not be included", + "placeholders": { + "email": { + "content": "$1", + "example": "name@example.com" + } + } + }, "exportingOrganizationVaultTitle": { "message": "Exporting organization vault" }, @@ -3839,15 +3846,9 @@ "duoHealthCheckResultsInNullAuthUrlError": { "message": "Error connecting with the Duo service. Use a different two-step login method or contact Duo for assistance." }, - "launchDuoAndFollowStepsToFinishLoggingIn": { - "message": "Launch Duo and follow the steps to finish logging in." - }, "duoRequiredForAccount": { "message": "Duo two-step login is required for your account." }, - "popoutTheExtensionToCompleteLogin": { - "message": "Popout the extension to complete login." - }, "popoutExtension": { "message": "Popout extension" }, @@ -4270,6 +4271,20 @@ } } }, + "viewItemTitleWithField": { + "message": "View item - $ITEMNAME$ - $FIELD$", + "description": "Title for a link that opens a view for an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + }, + "field": { + "content": "$2", + "example": "Username" + } + } + }, "autofillTitle": { "message": "Autofill - $ITEMNAME$", "description": "Title for a button that autofills a login item.", @@ -4280,6 +4295,20 @@ } } }, + "autofillTitleWithField": { + "message": "Autofill - $ITEMNAME$ - $FIELD$", + "description": "Title for a button that autofills a login item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + }, + "field": { + "content": "$2", + "example": "Username" + } + } + }, "copyFieldValue": { "message": "Copy $FIELD$, $VALUE$", "description": "Title for a button that copies a field value to the clipboard.", @@ -4899,8 +4928,8 @@ "message": "Password regenerated", "description": "Notification message for when a password has been regenerated" }, - "saveLoginToBitwarden": { - "message": "Save login to Bitwarden?", + "saveToBitwarden": { + "message": "Save to Bitwarden", "description": "Confirmation message for saving a login to Bitwarden" }, "spaceCharacterDescriptor": { @@ -5139,5 +5168,32 @@ }, "changeAtRiskPassword": { "message": "Change at-risk password" + }, + "introCarouselLabel": { + "message": "Welcome to Bitwarden" + }, + "securityPrioritized": { + "message": "Security, prioritized" + }, + "securityPrioritizedBody": { + "message": "Save logins, cards, and identities to your secure vault. Bitwarden uses zero-knowledge, end-to-end encryption to protect what’s important to you." + }, + "quickLogin": { + "message": "Quick and easy login" + }, + "quickLoginBody": { + "message": "Set up biometric unlock and autofill to log into your accounts without typing a single letter." + }, + "secureUser": { + "message": "Level up your logins" + }, + "secureUserBody": { + "message": "Use the generator to create and save strong, unique passwords for all your accounts." + }, + "secureDevices": { + "message": "Your data, when and where you need it" + }, + "secureDevicesBody": { + "message": "Save unlimited passwords across unlimited devices with Bitwarden mobile, browser, and desktop apps." } } diff --git a/apps/browser/src/_locales/th/messages.json b/apps/browser/src/_locales/th/messages.json index c545f802d64..e8e61d6bcb7 100644 --- a/apps/browser/src/_locales/th/messages.json +++ b/apps/browser/src/_locales/th/messages.json @@ -1098,6 +1098,31 @@ "message": "Login updated", "description": "Message displayed when login details are successfully updated." }, + "loginUpdateTaskSuccess": { + "message": "Great job! You took the steps to make you and $ORGANIZATION$ more secure.", + "placeholders": { + "organization": { + "content": "$1" + } + }, + "description": "Shown to user after login is updated." + }, + "loginUpdateTaskSuccessAdditional": { + "message": "Thank you for making $ORGANIZATION$ more secure. You have $TASK_COUNT$ more passwords to update.", + "placeholders": { + "organization": { + "content": "$1" + }, + "task_count": { + "content": "$2" + } + }, + "description": "Shown to user after login is updated." + }, + "nextSecurityTaskAction": { + "message": "Change next password", + "description": "Message prompting user to undertake completion of another security task." + }, "saveFailure": { "message": "Error saving", "description": "Error message shown when the system fails to save login details." @@ -1391,24 +1416,12 @@ "premiumRequiredDesc": { "message": "A Premium membership is required to use this feature." }, - "enterVerificationCodeApp": { - "message": "Enter the 6 digit verification code from your authenticator app." - }, "authenticationTimeout": { "message": "Authentication timeout" }, "authenticationSessionTimedOut": { "message": "The authentication session timed out. Please restart the login process." }, - "enterVerificationCodeEmail": { - "message": "Enter the 6 digit verification code that was emailed to $EMAIL$.", - "placeholders": { - "email": { - "content": "$1", - "example": "example@gmail.com" - } - } - }, "verificationCodeEmailSent": { "message": "ส่งโค้ดยืนยันไปยังอีเมล $EMAIL$ แล้ว", "placeholders": { @@ -1418,18 +1431,9 @@ } } }, - "rememberMe": { - "message": "Remember me" - }, "dontAskAgainOnThisDeviceFor30Days": { "message": "Don't ask again on this device for 30 days" }, - "sendVerificationCodeEmailAgain": { - "message": "ส่งโค้ดยืนยันไปยังอีเมลอีกครั้ง" - }, - "useAnotherTwoStepMethod": { - "message": "Use another two-step login method" - }, "selectAnotherMethod": { "message": "Select another method", "description": "Select another two-step login method" @@ -1437,18 +1441,9 @@ "useYourRecoveryCode": { "message": "Use your recovery code" }, - "insertYubiKey": { - "message": "Insert your YubiKey into your computer's USB port, then touch its button." - }, "insertU2f": { "message": "Insert your security key into your computer's USB port. If it has a button, touch it." }, - "webAuthnNewTab": { - "message": "To start the WebAuthn 2FA verification. Click the button below to open a new tab and follow the instructions provided in the new tab." - }, - "webAuthnNewTabOpen": { - "message": "Open new tab" - }, "openInNewTab": { "message": "Open in new tab" }, @@ -2327,6 +2322,9 @@ "privacyPolicy": { "message": "Privacy Policy" }, + "yourNewPasswordCannotBeTheSameAsYourCurrentPassword": { + "message": "Your new password cannot be the same as your current password." + }, "hintEqualsPassword": { "message": "Your password hint cannot be the same as your password." }, @@ -2534,15 +2532,15 @@ "message": "Your organization passwords are at-risk because they are weak, reused, and/or exposed.", "description": "Description of the review at-risk login slide on the at-risk password page carousel" }, - "reviewAtRiskLoginSlideImgAlt": { - "message": "Illustration of a list of logins that are at-risk" + "reviewAtRiskLoginSlideImgAltPeriod": { + "message": "Illustration of a list of logins that are at-risk." }, "generatePasswordSlideDesc": { "message": "Quickly generate a strong, unique password with the Bitwarden autofill menu on the at-risk site.", "description": "Description of the generate password slide on the at-risk password page carousel" }, - "generatePasswordSlideImgAlt": { - "message": "Illustration of the Bitwarden autofill menu displaying a generated password" + "generatePasswordSlideImgAltPeriod": { + "message": "Illustration of the Bitwarden autofill menu displaying a generated password." }, "updateInBitwarden": { "message": "Update in Bitwarden" @@ -2551,8 +2549,8 @@ "message": "Bitwarden will then prompt you to update the password in the password manager.", "description": "Description of the update in Bitwarden slide on the at-risk password page carousel" }, - "updateInBitwardenSlideImgAlt": { - "message": "Illustration of a Bitwarden’s notification prompting the user to update the login" + "updateInBitwardenSlideImgAltPeriod": { + "message": "Illustration of a Bitwarden’s notification prompting the user to update the login." }, "turnOnAutofill": { "message": "Turn on autofill" @@ -3007,6 +3005,15 @@ } } }, + "exportingIndividualVaultWithAttachmentsDescription": { + "message": "Only the individual vault items including attachments associated with $EMAIL$ will be exported. Organization vault items will not be included", + "placeholders": { + "email": { + "content": "$1", + "example": "name@example.com" + } + } + }, "exportingOrganizationVaultTitle": { "message": "Exporting organization vault" }, @@ -3839,15 +3846,9 @@ "duoHealthCheckResultsInNullAuthUrlError": { "message": "Error connecting with the Duo service. Use a different two-step login method or contact Duo for assistance." }, - "launchDuoAndFollowStepsToFinishLoggingIn": { - "message": "Launch Duo and follow the steps to finish logging in." - }, "duoRequiredForAccount": { "message": "Duo two-step login is required for your account." }, - "popoutTheExtensionToCompleteLogin": { - "message": "Popout the extension to complete login." - }, "popoutExtension": { "message": "Popout extension" }, @@ -4270,6 +4271,20 @@ } } }, + "viewItemTitleWithField": { + "message": "View item - $ITEMNAME$ - $FIELD$", + "description": "Title for a link that opens a view for an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + }, + "field": { + "content": "$2", + "example": "Username" + } + } + }, "autofillTitle": { "message": "Autofill - $ITEMNAME$", "description": "Title for a button that autofills a login item.", @@ -4280,6 +4295,20 @@ } } }, + "autofillTitleWithField": { + "message": "Autofill - $ITEMNAME$ - $FIELD$", + "description": "Title for a button that autofills a login item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + }, + "field": { + "content": "$2", + "example": "Username" + } + } + }, "copyFieldValue": { "message": "Copy $FIELD$, $VALUE$", "description": "Title for a button that copies a field value to the clipboard.", @@ -4899,8 +4928,8 @@ "message": "Password regenerated", "description": "Notification message for when a password has been regenerated" }, - "saveLoginToBitwarden": { - "message": "Save login to Bitwarden?", + "saveToBitwarden": { + "message": "Save to Bitwarden", "description": "Confirmation message for saving a login to Bitwarden" }, "spaceCharacterDescriptor": { @@ -5139,5 +5168,32 @@ }, "changeAtRiskPassword": { "message": "Change at-risk password" + }, + "introCarouselLabel": { + "message": "Welcome to Bitwarden" + }, + "securityPrioritized": { + "message": "Security, prioritized" + }, + "securityPrioritizedBody": { + "message": "Save logins, cards, and identities to your secure vault. Bitwarden uses zero-knowledge, end-to-end encryption to protect what’s important to you." + }, + "quickLogin": { + "message": "Quick and easy login" + }, + "quickLoginBody": { + "message": "Set up biometric unlock and autofill to log into your accounts without typing a single letter." + }, + "secureUser": { + "message": "Level up your logins" + }, + "secureUserBody": { + "message": "Use the generator to create and save strong, unique passwords for all your accounts." + }, + "secureDevices": { + "message": "Your data, when and where you need it" + }, + "secureDevicesBody": { + "message": "Save unlimited passwords across unlimited devices with Bitwarden mobile, browser, and desktop apps." } } diff --git a/apps/browser/src/_locales/tr/messages.json b/apps/browser/src/_locales/tr/messages.json index e69b33d63af..8038d415b64 100644 --- a/apps/browser/src/_locales/tr/messages.json +++ b/apps/browser/src/_locales/tr/messages.json @@ -881,7 +881,7 @@ "message": "Duo two-step login is required for your account. Follow the steps below to finish logging in." }, "followTheStepsBelowToFinishLoggingIn": { - "message": "Follow the steps below to finish logging in." + "message": "Girişi tamamlamak için aşağıdaki adımları izleyin." }, "restartRegistration": { "message": "Kaydı yeniden başlat" @@ -1098,6 +1098,31 @@ "message": "Hesap güncellendi", "description": "Message displayed when login details are successfully updated." }, + "loginUpdateTaskSuccess": { + "message": "Great job! You took the steps to make you and $ORGANIZATION$ more secure.", + "placeholders": { + "organization": { + "content": "$1" + } + }, + "description": "Shown to user after login is updated." + }, + "loginUpdateTaskSuccessAdditional": { + "message": "Thank you for making $ORGANIZATION$ more secure. You have $TASK_COUNT$ more passwords to update.", + "placeholders": { + "organization": { + "content": "$1" + }, + "task_count": { + "content": "$2" + } + }, + "description": "Shown to user after login is updated." + }, + "nextSecurityTaskAction": { + "message": "Change next password", + "description": "Message prompting user to undertake completion of another security task." + }, "saveFailure": { "message": "Kaydetme hatası", "description": "Error message shown when the system fails to save login details." @@ -1391,24 +1416,12 @@ "premiumRequiredDesc": { "message": "Bu özelliği kullanmak için premium üyelik gereklidir." }, - "enterVerificationCodeApp": { - "message": "Kimlik doğrulama uygulamanızdaki 6 haneli doğrulama kodunu girin." - }, "authenticationTimeout": { "message": "Kimlik doğrulama zaman aşımı" }, "authenticationSessionTimedOut": { "message": "Kimlik doğrulama oturumu zaman aşımına uğradı. Lütfen giriş sürecini yeniden başlatın." }, - "enterVerificationCodeEmail": { - "message": "$EMAIL$ adresine e-postayla gönderdiğimiz 6 haneli doğrulama kodunu girin.", - "placeholders": { - "email": { - "content": "$1", - "example": "example@gmail.com" - } - } - }, "verificationCodeEmailSent": { "message": "Doğrulama e-postası $EMAIL$ adresine gönderildi.", "placeholders": { @@ -1418,37 +1431,19 @@ } } }, - "rememberMe": { - "message": "Beni hatırla" - }, "dontAskAgainOnThisDeviceFor30Days": { - "message": "Don't ask again on this device for 30 days" - }, - "sendVerificationCodeEmailAgain": { - "message": "Doğrulama kodunu yeniden gönder" - }, - "useAnotherTwoStepMethod": { - "message": "Başka bir iki aşamalı giriş yöntemini kullan" + "message": "Bu cihazda 30 gün boyunca sorma" }, "selectAnotherMethod": { - "message": "Select another method", + "message": "Başka bir yöntem seç", "description": "Select another two-step login method" }, "useYourRecoveryCode": { - "message": "Use your recovery code" - }, - "insertYubiKey": { - "message": "YubiKey'i bilgisayarınızın USB portuna takın, ardından düğmesine dokunun." + "message": "Kurtarma kodu kullan" }, "insertU2f": { "message": "Güvenlik anahtarınızı bilgisayarınızın USB portuna takın. Düğmesi varsa dokunun." }, - "webAuthnNewTab": { - "message": "WebAuthn iki aşamalı doğrulamayı başlatmak için aşağıdaki düğmeye tıklayın ve açılan sekmedeki yönergeleri takip edin." - }, - "webAuthnNewTabOpen": { - "message": "Yeni sekme aç" - }, "openInNewTab": { "message": "Yeni sekmede aç" }, @@ -1456,7 +1451,7 @@ "message": "WebAutn ile doğrula" }, "readSecurityKey": { - "message": "Read security key" + "message": "Güvenlik anahtarını oku" }, "awaitingSecurityKeyInteraction": { "message": "Awaiting security key interaction..." @@ -1474,7 +1469,7 @@ "message": "İki aşamalı giriş seçenekleri" }, "selectTwoStepLoginMethod": { - "message": "Select two-step login method" + "message": "İki aşamalı giriş yöntemini seçin" }, "recoveryCodeDesc": { "message": "İki aşamalı doğrulama sağlayıcılarınıza ulaşamıyor musunuz? Kurtarma kodunuzu kullanarak hesabınızdaki tüm iki aşamalı giriş sağlayıcılarını devre dışı bırakabilirsiniz." @@ -2179,7 +2174,7 @@ "message": "Customize your vault experience with quick copy actions, compact mode, and more!" }, "newCustomizationOptionsCalloutLink": { - "message": "View all Appearance settings" + "message": "Görünüm ayarlarının hepsini göster" }, "lock": { "message": "Kilitle", @@ -2327,6 +2322,9 @@ "privacyPolicy": { "message": "Gizlilik Politikası" }, + "yourNewPasswordCannotBeTheSameAsYourCurrentPassword": { + "message": "Your new password cannot be the same as your current password." + }, "hintEqualsPassword": { "message": "Parola ipucunuz parolanızla aynı olamaz." }, @@ -2534,15 +2532,15 @@ "message": "Your organization passwords are at-risk because they are weak, reused, and/or exposed.", "description": "Description of the review at-risk login slide on the at-risk password page carousel" }, - "reviewAtRiskLoginSlideImgAlt": { - "message": "Illustration of a list of logins that are at-risk" + "reviewAtRiskLoginSlideImgAltPeriod": { + "message": "Illustration of a list of logins that are at-risk." }, "generatePasswordSlideDesc": { "message": "Quickly generate a strong, unique password with the Bitwarden autofill menu on the at-risk site.", "description": "Description of the generate password slide on the at-risk password page carousel" }, - "generatePasswordSlideImgAlt": { - "message": "Illustration of the Bitwarden autofill menu displaying a generated password" + "generatePasswordSlideImgAltPeriod": { + "message": "Illustration of the Bitwarden autofill menu displaying a generated password." }, "updateInBitwarden": { "message": "Update in Bitwarden" @@ -2551,8 +2549,8 @@ "message": "Bitwarden will then prompt you to update the password in the password manager.", "description": "Description of the update in Bitwarden slide on the at-risk password page carousel" }, - "updateInBitwardenSlideImgAlt": { - "message": "Illustration of a Bitwarden’s notification prompting the user to update the login" + "updateInBitwardenSlideImgAltPeriod": { + "message": "Illustration of a Bitwarden’s notification prompting the user to update the login." }, "turnOnAutofill": { "message": "Otomatik doldurmayı etkinleştir" @@ -3007,6 +3005,15 @@ } } }, + "exportingIndividualVaultWithAttachmentsDescription": { + "message": "Yalnızca $EMAIL$ ile ilişkili kişisel kasadaki kayıtlar ve dosyalar dışa aktarılacaktır. Kuruluş kasasındaki kayıtlar dahil edilmeyecektir", + "placeholders": { + "email": { + "content": "$1", + "example": "name@example.com" + } + } + }, "exportingOrganizationVaultTitle": { "message": "Kuruluş kasasını dışa aktarma" }, @@ -3839,15 +3846,9 @@ "duoHealthCheckResultsInNullAuthUrlError": { "message": "Error connecting with the Duo service. Use a different two-step login method or contact Duo for assistance." }, - "launchDuoAndFollowStepsToFinishLoggingIn": { - "message": "Duo'yu açın ve girişi tamamlamak için adımları izleyin." - }, "duoRequiredForAccount": { "message": "Hesabınız için Duo iki adımlı giriş gereklidir." }, - "popoutTheExtensionToCompleteLogin": { - "message": "Giriş işlemini tamamlamak için uzantıyı dışarı alın." - }, "popoutExtension": { "message": "Uzantıyı dışarı al" }, @@ -4270,6 +4271,20 @@ } } }, + "viewItemTitleWithField": { + "message": "Kaydı görüntüle - $ITEMNAME$ - $FIELD$", + "description": "Title for a link that opens a view for an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + }, + "field": { + "content": "$2", + "example": "Username" + } + } + }, "autofillTitle": { "message": "Otomatik doldur - $ITEMNAME$", "description": "Title for a button that autofills a login item.", @@ -4280,6 +4295,20 @@ } } }, + "autofillTitleWithField": { + "message": "Otomatik doldur - $ITEMNAME$ - $FIELD$", + "description": "Title for a button that autofills a login item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + }, + "field": { + "content": "$2", + "example": "Username" + } + } + }, "copyFieldValue": { "message": "Kopyala: $FIELD$, $VALUE$", "description": "Title for a button that copies a field value to the clipboard.", @@ -4899,8 +4928,8 @@ "message": "Parola yeniden üretildi", "description": "Notification message for when a password has been regenerated" }, - "saveLoginToBitwarden": { - "message": "Hesap Bitwarden'a kaydedilsin mi?", + "saveToBitwarden": { + "message": "Bitwarden’a kaydet", "description": "Confirmation message for saving a login to Bitwarden" }, "spaceCharacterDescriptor": { @@ -5139,5 +5168,32 @@ }, "changeAtRiskPassword": { "message": "Change at-risk password" + }, + "introCarouselLabel": { + "message": "Bitwarden’a hoş geldiniz" + }, + "securityPrioritized": { + "message": "Önce güvenlik" + }, + "securityPrioritizedBody": { + "message": "Hesaplarınızı, kartlarınızı ve kimliklerinizi güvenli kasanıza kaydedin. Bitwarden'ın sıfır bilgi ispatlı uçtan uca şifrelemesi sizin için önemli olan her şeyi korur." + }, + "quickLogin": { + "message": "Hızlı ve kolay giriş" + }, + "quickLoginBody": { + "message": "Hesaplarınıza parola yazmadan giriş yapmak için biyometrik kilit açmayı ayarlayabilirsiniz." + }, + "secureUser": { + "message": "Hesaplarınızı güçlendirin" + }, + "secureUserBody": { + "message": "Hesaplarınız için güçlü ve benzersiz parolalar oluşturmak amacıyla üreteci kullanabilirsiniz." + }, + "secureDevices": { + "message": "Verilerinize her zaman, her yerden ulaşın" + }, + "secureDevicesBody": { + "message": "Bitwarden mobil, tarayıcı ve masaüstü uygulamalarıyla istediğiniz kadar cihaza istediğiniz kadar parola kaydedebilirsiniz." } } diff --git a/apps/browser/src/_locales/uk/messages.json b/apps/browser/src/_locales/uk/messages.json index d18d90babff..9b8974cdf6b 100644 --- a/apps/browser/src/_locales/uk/messages.json +++ b/apps/browser/src/_locales/uk/messages.json @@ -1098,6 +1098,31 @@ "message": "Запис оновлено", "description": "Message displayed when login details are successfully updated." }, + "loginUpdateTaskSuccess": { + "message": "Чудова робота! Ви щойно підвищили рівень безпеки для себе та $ORGANIZATION$.", + "placeholders": { + "organization": { + "content": "$1" + } + }, + "description": "Shown to user after login is updated." + }, + "loginUpdateTaskSuccessAdditional": { + "message": "Дякуємо за підвищення рівня безпеки $ORGANIZATION$. Залишилося оновити ще $TASK_COUNT$ паролів.", + "placeholders": { + "organization": { + "content": "$1" + }, + "task_count": { + "content": "$2" + } + }, + "description": "Shown to user after login is updated." + }, + "nextSecurityTaskAction": { + "message": "Змінити наступний пароль", + "description": "Message prompting user to undertake completion of another security task." + }, "saveFailure": { "message": "Помилка збереження", "description": "Error message shown when the system fails to save login details." @@ -1391,24 +1416,12 @@ "premiumRequiredDesc": { "message": "Для використання цієї функції необхідна передплата преміум." }, - "enterVerificationCodeApp": { - "message": "Введіть 6-значний код підтвердження з програми автентифікації." - }, "authenticationTimeout": { "message": "Час очікування автентифікації" }, "authenticationSessionTimedOut": { "message": "Час очікування сеансу автентифікації завершився. Перезапустіть процес входу в систему." }, - "enterVerificationCodeEmail": { - "message": "Введіть 6-значний код підтвердження, надісланий на $EMAIL$.", - "placeholders": { - "email": { - "content": "$1", - "example": "example@gmail.com" - } - } - }, "verificationCodeEmailSent": { "message": "Код підтвердження надіслано на $EMAIL$.", "placeholders": { @@ -1418,18 +1431,9 @@ } } }, - "rememberMe": { - "message": "Запам'ятати мене" - }, "dontAskAgainOnThisDeviceFor30Days": { "message": "Більше не запитувати на цьому пристрої протягом 30 днів" }, - "sendVerificationCodeEmailAgain": { - "message": "Надіслати код підтвердження ще раз" - }, - "useAnotherTwoStepMethod": { - "message": "Інший спосіб двоетапної перевірки" - }, "selectAnotherMethod": { "message": "Обрати інший спосіб", "description": "Select another two-step login method" @@ -1437,18 +1441,9 @@ "useYourRecoveryCode": { "message": "Скористайтеся своїм кодом відновлення" }, - "insertYubiKey": { - "message": "Вставте свій YubiKey в USB порт комп'ютера, потім торкніться цієї кнопки." - }, "insertU2f": { "message": "Вставте свій ключ безпеки в USB порт комп'ютера. Якщо в нього є кнопка, натисніть її." }, - "webAuthnNewTab": { - "message": "Щоб почати перевірку WebAuthn 2FA, натисніть кнопку внизу для відкриття нової вкладки і дотримуйтесь зазначених на ній настанов." - }, - "webAuthnNewTabOpen": { - "message": "Відкрити нову вкладку" - }, "openInNewTab": { "message": "Відкрити в новій вкладці" }, @@ -2156,11 +2151,11 @@ "message": "Надійний пароль згенеровано! Обов'язково оновіть свій пароль на вебсайті." }, "useGeneratorHelpTextPartOne": { - "message": "Скористатися генератором", + "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": "для створення надійного, унікального пароля", + "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'" }, "vaultCustomization": { @@ -2327,8 +2322,11 @@ "privacyPolicy": { "message": "Політика приватності" }, + "yourNewPasswordCannotBeTheSameAsYourCurrentPassword": { + "message": "Новий пароль повинен відрізнятися від поточного." + }, "hintEqualsPassword": { - "message": "Підказка для пароля не може бути такою самою, як ваш пароль." + "message": "Підказка повинна відрізнятися від пароля." }, "ok": { "message": "Ok" @@ -2534,15 +2532,15 @@ "message": "Паролі вашої організації ризиковані, оскільки вони ненадійні, повторно використовуються, та/або викриті.", "description": "Description of the review at-risk login slide on the at-risk password page carousel" }, - "reviewAtRiskLoginSlideImgAlt": { - "message": "Ілюстрація списку ризикованих записів" + "reviewAtRiskLoginSlideImgAltPeriod": { + "message": "Ілюстрація списку ризикованих записів." }, "generatePasswordSlideDesc": { "message": "Швидко згенеруйте надійний, унікальний пароль через меню автозаповнення Bitwarden на сайті з ризикованим паролем.", "description": "Description of the generate password slide on the at-risk password page carousel" }, - "generatePasswordSlideImgAlt": { - "message": "Ілюстрація меню автозаповнення Bitwarden, що показує згенерований пароль" + "generatePasswordSlideImgAltPeriod": { + "message": "Ілюстрація меню автозаповнення Bitwarden, що показує згенерований пароль." }, "updateInBitwarden": { "message": "Оновити в Bitwarden" @@ -2551,8 +2549,8 @@ "message": "Потім Bitwarden запропонує вам оновити пароль у менеджері паролів.", "description": "Description of the update in Bitwarden slide on the at-risk password page carousel" }, - "updateInBitwardenSlideImgAlt": { - "message": "Ілюстрація сповіщення Bitwarden, що спонукає користувача оновити пароль" + "updateInBitwardenSlideImgAltPeriod": { + "message": "Ілюстрація сповіщення Bitwarden, що спонукає користувача оновити пароль." }, "turnOnAutofill": { "message": "Увімкніть автозаповнення" @@ -3007,6 +3005,15 @@ } } }, + "exportingIndividualVaultWithAttachmentsDescription": { + "message": "Будуть експортовані лише записи особистого сховища, включно з вкладеннями, пов'язані з $EMAIL$. Записи сховища організації не експортуватимуться.", + "placeholders": { + "email": { + "content": "$1", + "example": "name@example.com" + } + } + }, "exportingOrganizationVaultTitle": { "message": "Експортування сховища організації" }, @@ -3839,15 +3846,9 @@ "duoHealthCheckResultsInNullAuthUrlError": { "message": "Помилка під'єднання до служби Duo. Скористайтеся іншим способом двоетапної перевірки або зверніться до служби підтримки Duo по допомогу." }, - "launchDuoAndFollowStepsToFinishLoggingIn": { - "message": "Запустіть Duo і виконайте дії для завершення входу." - }, "duoRequiredForAccount": { "message": "Для вашого облікового запису необхідна двоетапна перевірка з Duo." }, - "popoutTheExtensionToCompleteLogin": { - "message": "Відкріпіть розширення для завершення входу." - }, "popoutExtension": { "message": "Відкріпити вікно розширення" }, @@ -4270,6 +4271,20 @@ } } }, + "viewItemTitleWithField": { + "message": "Перегляд запису – $ITEMNAME$ – $FIELD$", + "description": "Title for a link that opens a view for an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + }, + "field": { + "content": "$2", + "example": "Username" + } + } + }, "autofillTitle": { "message": "Автозаповнення – $ITEMNAME$", "description": "Title for a button that autofills a login item.", @@ -4280,6 +4295,20 @@ } } }, + "autofillTitleWithField": { + "message": "Автозаповнення – $ITEMNAME$ – $FIELD$", + "description": "Title for a button that autofills a login item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + }, + "field": { + "content": "$2", + "example": "Username" + } + } + }, "copyFieldValue": { "message": "Копіювати $FIELD$, $VALUE$", "description": "Title for a button that copies a field value to the clipboard.", @@ -4899,8 +4928,8 @@ "message": "Пароль згенеровано повторно", "description": "Notification message for when a password has been regenerated" }, - "saveLoginToBitwarden": { - "message": "Зберегти запис у Bitwarden?", + "saveToBitwarden": { + "message": "Save to Bitwarden", "description": "Confirmation message for saving a login to Bitwarden" }, "spaceCharacterDescriptor": { @@ -5139,5 +5168,32 @@ }, "changeAtRiskPassword": { "message": "Змінити ризикований пароль" + }, + "introCarouselLabel": { + "message": "Вітаємо в Bitwarden" + }, + "securityPrioritized": { + "message": "Безпека понад усе" + }, + "securityPrioritizedBody": { + "message": "Зберігайте записи входу, картки та посвідчення в захищеному сховищі. Для захисту ваших даних Bitwarden використовує наскрізне шифрування з нульовим рівнем доступу." + }, + "quickLogin": { + "message": "Швидкий і легкий вхід" + }, + "quickLoginBody": { + "message": "Налаштуйте біометричне розблокування та автозаповнення, щоб миттєво входити в облікові записи." + }, + "secureUser": { + "message": "Вдоскональте свої паролі" + }, + "secureUserBody": { + "message": "Використовуйте генератор, щоб створювати й зберігати надійні, унікальні паролі для всіх облікових записів." + }, + "secureDevices": { + "message": "Ваші дані завжди з вами" + }, + "secureDevicesBody": { + "message": "Зберігайте скільки завгодно паролів на необмеженій кількості пристроїв, використовуючи Bitwarden для мобільних пристроїв, браузерів та комп'ютерів." } } diff --git a/apps/browser/src/_locales/vi/messages.json b/apps/browser/src/_locales/vi/messages.json index db0da3b5874..3a226681fb1 100644 --- a/apps/browser/src/_locales/vi/messages.json +++ b/apps/browser/src/_locales/vi/messages.json @@ -1098,6 +1098,31 @@ "message": "Login updated", "description": "Message displayed when login details are successfully updated." }, + "loginUpdateTaskSuccess": { + "message": "Great job! You took the steps to make you and $ORGANIZATION$ more secure.", + "placeholders": { + "organization": { + "content": "$1" + } + }, + "description": "Shown to user after login is updated." + }, + "loginUpdateTaskSuccessAdditional": { + "message": "Thank you for making $ORGANIZATION$ more secure. You have $TASK_COUNT$ more passwords to update.", + "placeholders": { + "organization": { + "content": "$1" + }, + "task_count": { + "content": "$2" + } + }, + "description": "Shown to user after login is updated." + }, + "nextSecurityTaskAction": { + "message": "Change next password", + "description": "Message prompting user to undertake completion of another security task." + }, "saveFailure": { "message": "Error saving", "description": "Error message shown when the system fails to save login details." @@ -1391,24 +1416,12 @@ "premiumRequiredDesc": { "message": "Cần là thành viên cao cấp để sử dụng tính năng này." }, - "enterVerificationCodeApp": { - "message": "Nhập mã xác nhận 6 chữ số từ ứng dụng xác thực của bạn." - }, "authenticationTimeout": { "message": "Authentication timeout" }, "authenticationSessionTimedOut": { "message": "The authentication session timed out. Please restart the login process." }, - "enterVerificationCodeEmail": { - "message": "Nhập mã xác nhận 6 chữ số đã được gửi tới email", - "placeholders": { - "email": { - "content": "$1", - "example": "example@gmail.com" - } - } - }, "verificationCodeEmailSent": { "message": "Email xác minh đã được gửi tới $EMAIL$.", "placeholders": { @@ -1418,18 +1431,9 @@ } } }, - "rememberMe": { - "message": "Ghi nhớ đăng nhập" - }, "dontAskAgainOnThisDeviceFor30Days": { "message": "Don't ask again on this device for 30 days" }, - "sendVerificationCodeEmailAgain": { - "message": "Gửi lại email chứa mã xác nhận" - }, - "useAnotherTwoStepMethod": { - "message": "Sử dụng phương pháp đăng nhập 2 bước khác" - }, "selectAnotherMethod": { "message": "Select another method", "description": "Select another two-step login method" @@ -1437,18 +1441,9 @@ "useYourRecoveryCode": { "message": "Use your recovery code" }, - "insertYubiKey": { - "message": "Lắp YubiKey vào cổng USB máy tính của bạn, sau đó chạm vào nút trên nó." - }, "insertU2f": { "message": "Lắp khóa bảo mật vào cổng USB máy tính của bạn. Nếu nó có một nút, hãy nhấn vào nó." }, - "webAuthnNewTab": { - "message": "Để bắt đầu xác minh WebAuthn 2FA. Nhấp vào nút bên dưới để mở tab mới và làm theo hướng dẫn được cung cấp trong tab mới." - }, - "webAuthnNewTabOpen": { - "message": "Mở thẻ mới" - }, "openInNewTab": { "message": "Open in new tab" }, @@ -2327,6 +2322,9 @@ "privacyPolicy": { "message": "Chính sách quyền riêng tư" }, + "yourNewPasswordCannotBeTheSameAsYourCurrentPassword": { + "message": "Your new password cannot be the same as your current password." + }, "hintEqualsPassword": { "message": "Lời nhắc mật khẩu không được giống mật khẩu của bạn" }, @@ -2534,15 +2532,15 @@ "message": "Your organization passwords are at-risk because they are weak, reused, and/or exposed.", "description": "Description of the review at-risk login slide on the at-risk password page carousel" }, - "reviewAtRiskLoginSlideImgAlt": { - "message": "Illustration of a list of logins that are at-risk" + "reviewAtRiskLoginSlideImgAltPeriod": { + "message": "Illustration of a list of logins that are at-risk." }, "generatePasswordSlideDesc": { "message": "Quickly generate a strong, unique password with the Bitwarden autofill menu on the at-risk site.", "description": "Description of the generate password slide on the at-risk password page carousel" }, - "generatePasswordSlideImgAlt": { - "message": "Illustration of the Bitwarden autofill menu displaying a generated password" + "generatePasswordSlideImgAltPeriod": { + "message": "Illustration of the Bitwarden autofill menu displaying a generated password." }, "updateInBitwarden": { "message": "Update in Bitwarden" @@ -2551,8 +2549,8 @@ "message": "Bitwarden will then prompt you to update the password in the password manager.", "description": "Description of the update in Bitwarden slide on the at-risk password page carousel" }, - "updateInBitwardenSlideImgAlt": { - "message": "Illustration of a Bitwarden’s notification prompting the user to update the login" + "updateInBitwardenSlideImgAltPeriod": { + "message": "Illustration of a Bitwarden’s notification prompting the user to update the login." }, "turnOnAutofill": { "message": "Turn on autofill" @@ -3007,6 +3005,15 @@ } } }, + "exportingIndividualVaultWithAttachmentsDescription": { + "message": "Only the individual vault items including attachments associated with $EMAIL$ will be exported. Organization vault items will not be included", + "placeholders": { + "email": { + "content": "$1", + "example": "name@example.com" + } + } + }, "exportingOrganizationVaultTitle": { "message": "Đang xuất dữ liệu kho tổ chức" }, @@ -3839,15 +3846,9 @@ "duoHealthCheckResultsInNullAuthUrlError": { "message": "Lỗi kết nối với dịch vụ Duo. Sử dụng phương thức đăng nhập hai bước khác hoặc liên hệ với Duo để được hỗ trợ." }, - "launchDuoAndFollowStepsToFinishLoggingIn": { - "message": "Khởi chạy Duo và làm theo các bước để hoàn tất đăng nhập." - }, "duoRequiredForAccount": { "message": "Tài khoản của bạn yêu cầu xác minh hai bước với Duo." }, - "popoutTheExtensionToCompleteLogin": { - "message": "Bật tiện ích mở rộng để hoàn tất đăng nhập." - }, "popoutExtension": { "message": "Tiện ích mở rộng dạng cửa sổ bật lên" }, @@ -4270,6 +4271,20 @@ } } }, + "viewItemTitleWithField": { + "message": "View item - $ITEMNAME$ - $FIELD$", + "description": "Title for a link that opens a view for an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + }, + "field": { + "content": "$2", + "example": "Username" + } + } + }, "autofillTitle": { "message": "Tự động điền - $ITEMNAME$", "description": "Title for a button that autofills a login item.", @@ -4280,6 +4295,20 @@ } } }, + "autofillTitleWithField": { + "message": "Autofill - $ITEMNAME$ - $FIELD$", + "description": "Title for a button that autofills a login item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + }, + "field": { + "content": "$2", + "example": "Username" + } + } + }, "copyFieldValue": { "message": "Copy $FIELD$, $VALUE$", "description": "Title for a button that copies a field value to the clipboard.", @@ -4899,8 +4928,8 @@ "message": "Password regenerated", "description": "Notification message for when a password has been regenerated" }, - "saveLoginToBitwarden": { - "message": "Save login to Bitwarden?", + "saveToBitwarden": { + "message": "Save to Bitwarden", "description": "Confirmation message for saving a login to Bitwarden" }, "spaceCharacterDescriptor": { @@ -5139,5 +5168,32 @@ }, "changeAtRiskPassword": { "message": "Change at-risk password" + }, + "introCarouselLabel": { + "message": "Welcome to Bitwarden" + }, + "securityPrioritized": { + "message": "Security, prioritized" + }, + "securityPrioritizedBody": { + "message": "Save logins, cards, and identities to your secure vault. Bitwarden uses zero-knowledge, end-to-end encryption to protect what’s important to you." + }, + "quickLogin": { + "message": "Quick and easy login" + }, + "quickLoginBody": { + "message": "Set up biometric unlock and autofill to log into your accounts without typing a single letter." + }, + "secureUser": { + "message": "Level up your logins" + }, + "secureUserBody": { + "message": "Use the generator to create and save strong, unique passwords for all your accounts." + }, + "secureDevices": { + "message": "Your data, when and where you need it" + }, + "secureDevicesBody": { + "message": "Save unlimited passwords across unlimited devices with Bitwarden mobile, browser, and desktop apps." } } diff --git a/apps/browser/src/_locales/zh_CN/messages.json b/apps/browser/src/_locales/zh_CN/messages.json index bdfaeb92531..633f65c6c72 100644 --- a/apps/browser/src/_locales/zh_CN/messages.json +++ b/apps/browser/src/_locales/zh_CN/messages.json @@ -219,7 +219,7 @@ "message": "复制自定义字段名称" }, "noMatchingLogins": { - "message": "无匹配的登录项目" + "message": "没有匹配的登录" }, "noCards": { "message": "无支付卡" @@ -1003,7 +1003,7 @@ "message": "搜索类型" }, "noneFolder": { - "message": "默认文件夹", + "message": "无文件夹", "description": "This is the folder for uncategorized items" }, "enableAddLoginNotification": { @@ -1019,7 +1019,7 @@ "message": "在密码库中找不到匹配项目时询问添加一个。适用于所有已登录的账户。" }, "showCardsInVaultViewV2": { - "message": "在密码库视图中将支付卡始终显示为自动填充建议" + "message": "在密码库视图中始终将支付卡显示为自动填充建议" }, "showCardsCurrentTab": { "message": "在标签页上显示支付卡" @@ -1028,7 +1028,7 @@ "message": "在标签页上列出支付卡项目,以便于自动填充。" }, "showIdentitiesInVaultViewV2": { - "message": "在密码库视图中将身份始终显示为自动填充建议" + "message": "在密码库视图中始终将身份显示为自动填充建议" }, "showIdentitiesCurrentTab": { "message": "在标签页上显示身份" @@ -1098,6 +1098,31 @@ "message": "登录已更新", "description": "Message displayed when login details are successfully updated." }, + "loginUpdateTaskSuccess": { + "message": "干得好!您采取了使您和 $ORGANIZATION$ 更加安全的措施。", + "placeholders": { + "organization": { + "content": "$1" + } + }, + "description": "Shown to user after login is updated." + }, + "loginUpdateTaskSuccessAdditional": { + "message": "感谢您使 $ORGANIZATION$ 更加安全。您还有 $TASK_COUNT$ 个密码需要更新。", + "placeholders": { + "organization": { + "content": "$1" + }, + "task_count": { + "content": "$2" + } + }, + "description": "Shown to user after login is updated." + }, + "nextSecurityTaskAction": { + "message": "更改下一个密码", + "description": "Message prompting user to undertake completion of another security task." + }, "saveFailure": { "message": "保存时出错", "description": "Error message shown when the system fails to save login details." @@ -1188,16 +1213,16 @@ "message": "此密码将用于导出和导入此文件" }, "accountRestrictedOptionDescription": { - "message": "使用衍生自您账户的用户名和主密码的账户加密密钥,以加密此导出并限制只能导入到当前的 Bitwarden 账户。" + "message": "使用衍生自您账户用户名和主密码的加密密钥以加密此导出,并限制只能导入到当前 Bitwarden 账户。" }, "passwordProtectedOptionDescription": { - "message": "设置一个文件密码用来加密此导出,并使用此密码解密以导入到任意 Bitwarden 账户。" + "message": "设置一个文件密码以加密此导出,并使用此密码解密以导入到任意 Bitwarden 账户。" }, "exportTypeHeading": { "message": "导出类型" }, "accountRestricted": { - "message": "账户受限" + "message": "账户限制" }, "filePasswordAndConfirmFilePasswordDoNotMatch": { "message": "「文件密码」与「确认文件密码」不一致。" @@ -1391,24 +1416,12 @@ "premiumRequiredDesc": { "message": "使用此功能需要高级会员资格。" }, - "enterVerificationCodeApp": { - "message": "请输入您的验证器 App 中的 6 位数验证码。" - }, "authenticationTimeout": { "message": "身份验证超时" }, "authenticationSessionTimedOut": { "message": "身份验证会话超时。请重新启动登录过程。" }, - "enterVerificationCodeEmail": { - "message": "请输入发送给 $EMAIL$ 的 6 位数验证码。", - "placeholders": { - "email": { - "content": "$1", - "example": "example@gmail.com" - } - } - }, "verificationCodeEmailSent": { "message": "验证邮件已发送到 $EMAIL$。", "placeholders": { @@ -1418,18 +1431,9 @@ } } }, - "rememberMe": { - "message": "记住我" - }, "dontAskAgainOnThisDeviceFor30Days": { "message": "30 天内在此设备上不再询问" }, - "sendVerificationCodeEmailAgain": { - "message": "再次发送验证码电子邮件" - }, - "useAnotherTwoStepMethod": { - "message": "使用其他两步登录方式" - }, "selectAnotherMethod": { "message": "选择其他方式", "description": "Select another two-step login method" @@ -1437,18 +1441,9 @@ "useYourRecoveryCode": { "message": "使用您的恢复代码" }, - "insertYubiKey": { - "message": "将您的 YubiKey 插入计算机的 USB 端口,然后触摸其按钮。" - }, "insertU2f": { "message": "将您的安全密钥插入计算机的 USB 端口。如果它有按钮,请触摸它。" }, - "webAuthnNewTab": { - "message": "要开始 WebAuthn 2FA 验证,请点击下面的按钮打开一个新标签页,并按照新标签页中提供的说明操作。" - }, - "webAuthnNewTabOpen": { - "message": "打开新标签页" - }, "openInNewTab": { "message": "在新标签页中打开" }, @@ -1477,7 +1472,7 @@ "message": "选择两步登录方式" }, "recoveryCodeDesc": { - "message": "无法访问您所有的双重身份提供程序吗?请使用您的恢复代码来关闭您账户中所有的双重身份提供程序。" + "message": "无法访问您所有的双重身份提供程序吗?请使用您的恢复代码来停用您账户中所有的双重身份提供程序。" }, "recoveryCodeTitle": { "message": "恢复代码" @@ -1578,7 +1573,7 @@ "message": "适用于所有已登录的账户。" }, "turnOffBrowserBuiltInPasswordManagerSettings": { - "message": "关闭您浏览器内置的密码管理器设置以避免冲突。" + "message": "停用您浏览器内置的密码管理器设置以避免冲突。" }, "turnOffBrowserBuiltInPasswordManagerSettingsLink": { "message": "编辑浏览器设置。" @@ -1617,7 +1612,7 @@ "message": "登录项目的默认自动填充设置" }, "defaultAutoFillOnPageLoadDesc": { - "message": "您可以从项目编辑视图中为单个登录项目关闭页面加载时自动填充。" + "message": "您可以从项目编辑视图中为单个登录项目停用页面加载时自动填充。" }, "itemAutoFillOnPageLoad": { "message": "页面加载时自动填充(如果选项中已设置)" @@ -2310,7 +2305,7 @@ "message": "随时。" }, "byContinuingYouAgreeToThe": { - "message": "若继续,代表您同意" + "message": "若继续,表示您同意" }, "and": { "message": "和" @@ -2327,6 +2322,9 @@ "privacyPolicy": { "message": "隐私政策" }, + "yourNewPasswordCannotBeTheSameAsYourCurrentPassword": { + "message": "您的新密码不能与当前密码相同。" + }, "hintEqualsPassword": { "message": "您的密码提示不能与您的密码相同。" }, @@ -2534,15 +2532,15 @@ "message": "您的组织密码存在风险,因为它们过于简单、被重复使用和/或已暴露。", "description": "Description of the review at-risk login slide on the at-risk password page carousel" }, - "reviewAtRiskLoginSlideImgAlt": { - "message": "存在风险的登录列表示意图" + "reviewAtRiskLoginSlideImgAltPeriod": { + "message": "存在风险的登录列表示意图。" }, "generatePasswordSlideDesc": { "message": "在存在风险的网站上,使用 Bitwarden 自动填充菜单快速生成强大且唯一的密码。", "description": "Description of the generate password slide on the at-risk password page carousel" }, - "generatePasswordSlideImgAlt": { - "message": "Bitwarden 自动填充菜单显示生成的密码示意图" + "generatePasswordSlideImgAltPeriod": { + "message": "显示生成的密码的 Bitwarden 自动填充菜单示意图。" }, "updateInBitwarden": { "message": "在 Bitwarden 中更新" @@ -2551,14 +2549,14 @@ "message": "然后,Bitwarden 会提示您更新密码管理器中的密码。", "description": "Description of the update in Bitwarden slide on the at-risk password page carousel" }, - "updateInBitwardenSlideImgAlt": { - "message": "提示用户更新登录的 Bitwarden 通知示意图" + "updateInBitwardenSlideImgAltPeriod": { + "message": "提示用户更新登录的 Bitwarden 通知示意图。" }, "turnOnAutofill": { - "message": "开启自动填充" + "message": "启用自动填充" }, "turnedOnAutofill": { - "message": "已开启自动填充" + "message": "已启用自动填充" }, "dismiss": { "message": "忽略" @@ -2852,7 +2850,7 @@ "message": "选择文件夹..." }, "noFoldersFound": { - "message": "找不到文件夹", + "message": "未找到任何文件夹", "description": "Used as a message within the notification bar when no folders are found" }, "orgPermissionsUpdatedMustSetPassword": { @@ -3007,6 +3005,15 @@ } } }, + "exportingIndividualVaultWithAttachmentsDescription": { + "message": "仅会导出与 $EMAIL$ 关联的个人密码库项目(包括附件)。不包括组织密码库项目。", + "placeholders": { + "email": { + "content": "$1", + "example": "name@example.com" + } + } + }, "exportingOrganizationVaultTitle": { "message": "正在导出组织密码库" }, @@ -3327,13 +3334,13 @@ "message": "通知已发送到您的设备。" }, "notificationSentDevicePart1": { - "message": "Unlock Bitwarden on your device or on the" + "message": "解锁您设备上的 Bitwarden 或通过" }, "notificationSentDeviceAnchor": { "message": "网页 App" }, "notificationSentDevicePart2": { - "message": "在批准前,请确保指纹短语与下面的相匹配。" + "message": "批准前,请确保指纹短语与下面的相匹配。" }, "aNotificationWasSentToYourDevice": { "message": "通知已发送到您的设备" @@ -3363,7 +3370,7 @@ "message": "识别到弱密码且其出现在数据泄露中。请使用一个强且唯一的密码以保护您的账户。确定要使用这个密码吗?" }, "checkForBreaches": { - "message": "检查已知的数据泄露是否包含此密码。" + "message": "检查已知的数据泄露是否包含此密码" }, "important": { "message": "重要:" @@ -3381,7 +3388,7 @@ } }, "autofillPageLoadPolicyActivated": { - "message": "您的组织策略已开启页面加载时自动填充。" + "message": "您的组织策略已启用页面加载时自动填充。" }, "howToAutofill": { "message": "如何自动填充" @@ -3653,7 +3660,7 @@ "message": "别名域" }, "passwordRepromptDisabledAutofillOnPageLoad": { - "message": "具有主密码重新提示的项目无法在页面加载时自动填充。页面加载时的自动填充功能已关闭。", + "message": "具有主密码重新提示的项目无法在页面加载时自动填充。页面加载时的自动填充功能已停用。", "description": "Toast message for describing that master password re-prompt cannot be autofilled on page load." }, "autofillOnPageLoadSetToDefault": { @@ -3661,7 +3668,7 @@ "description": "Toast message for informing the user that autofill on page load has been set to the default setting." }, "turnOffMasterPasswordPromptToEditField": { - "message": "关闭主密码重新提示以编辑此字段", + "message": "停用主密码重新提示以编辑此字段", "description": "Message appearing below the autofill on load message when master password reprompt is set for a vault item." }, "toggleSideNavigation": { @@ -3755,7 +3762,7 @@ "description": "Screen reader text for announcing when the overlay opens on the page" }, "turnOn": { - "message": "开启" + "message": "启用" }, "ignore": { "message": "忽略" @@ -3839,15 +3846,9 @@ "duoHealthCheckResultsInNullAuthUrlError": { "message": "与 Duo 服务连接时出错。请使用其他两步登录方式或联系 Duo 寻求帮助。" }, - "launchDuoAndFollowStepsToFinishLoggingIn": { - "message": "启动 DUO 并按照步骤完成登录。" - }, "duoRequiredForAccount": { "message": "您的账户要求使用 Duo 两步登录。" }, - "popoutTheExtensionToCompleteLogin": { - "message": "弹出扩展以完成登录。" - }, "popoutExtension": { "message": "弹出扩展" }, @@ -3953,13 +3954,13 @@ "message": "此应用程序已存在一个通行密钥。" }, "noPasskeysFoundForThisApplication": { - "message": "没有找到此应用程序的通行密钥。" + "message": "未找到此应用程序的通行密钥。" }, "noMatchingPasskeyLogin": { - "message": "不存在匹配此站点的登录项目。" + "message": "您没有匹配此站点的登录。" }, "noMatchingLoginsForSite": { - "message": "此站点没有匹配的登录项目" + "message": "此站点没有匹配的登录" }, "searchSavePasskeyNewLogin": { "message": "搜索或将通行密钥保存为一个新的登录" @@ -4270,6 +4271,20 @@ } } }, + "viewItemTitleWithField": { + "message": "查看项目 - $ITEMNAME$ - $FIELD$", + "description": "Title for a link that opens a view for an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + }, + "field": { + "content": "$2", + "example": "Username" + } + } + }, "autofillTitle": { "message": "自动填充 - $ITEMNAME$", "description": "Title for a button that autofills a login item.", @@ -4280,6 +4295,20 @@ } } }, + "autofillTitleWithField": { + "message": "自动填充 - $ITEMNAME$ - $FIELD$", + "description": "Title for a button that autofills a login item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + }, + "field": { + "content": "$2", + "example": "Username" + } + } + }, "copyFieldValue": { "message": "复制 $FIELD$,$VALUE$", "description": "Title for a button that copies a field value to the clipboard.", @@ -4899,8 +4928,8 @@ "message": "密码已重新生成", "description": "Notification message for when a password has been regenerated" }, - "saveLoginToBitwarden": { - "message": "将登录保存到 Bitwarden 吗?", + "saveToBitwarden": { + "message": "保存到 Bitwarden", "description": "Confirmation message for saving a login to Bitwarden" }, "spaceCharacterDescriptor": { @@ -5081,7 +5110,7 @@ "message": "是的,我可以正常访问我的电子邮箱" }, "turnOnTwoStepLogin": { - "message": "开启两步登录" + "message": "启用两步登录" }, "changeAcctEmail": { "message": "更改账户电子邮箱" @@ -5139,5 +5168,32 @@ }, "changeAtRiskPassword": { "message": "更改有风险的密码" + }, + "introCarouselLabel": { + "message": "欢迎使用 Bitwarden" + }, + "securityPrioritized": { + "message": "安全优先" + }, + "securityPrioritizedBody": { + "message": "将登录、支付卡和身份保存到您的安全密码库。Bitwarden 使用零知识、端到端的加密来保护您的重要信息。" + }, + "quickLogin": { + "message": "快速便捷的登录" + }, + "quickLoginBody": { + "message": "设置生物识别解锁和自动填充,无需输入任何字符即可登录您的账户。" + }, + "secureUser": { + "message": "提升您的登录体验" + }, + "secureUserBody": { + "message": "使用生成器创建并保存强大且唯一的密码,以保护您的所有账户。" + }, + "secureDevices": { + "message": "随时随地在您需要时获取您的数据" + }, + "secureDevicesBody": { + "message": "使用 Bitwarden 移动端、浏览器和桌面 App 在无限制的设备上保存无限数量的密码。" } } diff --git a/apps/browser/src/_locales/zh_TW/messages.json b/apps/browser/src/_locales/zh_TW/messages.json index 37e450c8fd2..91797d314b2 100644 --- a/apps/browser/src/_locales/zh_TW/messages.json +++ b/apps/browser/src/_locales/zh_TW/messages.json @@ -1098,6 +1098,31 @@ "message": "Login updated", "description": "Message displayed when login details are successfully updated." }, + "loginUpdateTaskSuccess": { + "message": "Great job! You took the steps to make you and $ORGANIZATION$ more secure.", + "placeholders": { + "organization": { + "content": "$1" + } + }, + "description": "Shown to user after login is updated." + }, + "loginUpdateTaskSuccessAdditional": { + "message": "Thank you for making $ORGANIZATION$ more secure. You have $TASK_COUNT$ more passwords to update.", + "placeholders": { + "organization": { + "content": "$1" + }, + "task_count": { + "content": "$2" + } + }, + "description": "Shown to user after login is updated." + }, + "nextSecurityTaskAction": { + "message": "Change next password", + "description": "Message prompting user to undertake completion of another security task." + }, "saveFailure": { "message": "Error saving", "description": "Error message shown when the system fails to save login details." @@ -1391,24 +1416,12 @@ "premiumRequiredDesc": { "message": "進階會員才可使用此功能。" }, - "enterVerificationCodeApp": { - "message": "輸入驗證器應用程式提供的 6 位數驗證碼。" - }, "authenticationTimeout": { "message": "驗證逾時" }, "authenticationSessionTimedOut": { "message": "驗證工作階段因時間過久已逾時。請重試登入。" }, - "enterVerificationCodeEmail": { - "message": "輸入已傳送至 $EMAIL$ 的 6 位數驗證碼。", - "placeholders": { - "email": { - "content": "$1", - "example": "example@gmail.com" - } - } - }, "verificationCodeEmailSent": { "message": "已傳送驗證電子郵件至 $EMAIL$。", "placeholders": { @@ -1418,18 +1431,9 @@ } } }, - "rememberMe": { - "message": "記住我" - }, "dontAskAgainOnThisDeviceFor30Days": { "message": "Don't ask again on this device for 30 days" }, - "sendVerificationCodeEmailAgain": { - "message": "再次傳送​​包含驗證碼的電子郵件" - }, - "useAnotherTwoStepMethod": { - "message": "使用另一種兩步驟登入方法" - }, "selectAnotherMethod": { "message": "Select another method", "description": "Select another two-step login method" @@ -1437,18 +1441,9 @@ "useYourRecoveryCode": { "message": "Use your recovery code" }, - "insertYubiKey": { - "message": "將您的 YubiKey 插入電腦的 USB 連接埠,然後按一下它的按鈕。" - }, "insertU2f": { "message": "將您的安全鑰匙插入電腦的 USB 連接埠,然後觸摸其按鈕(如有的話)。" }, - "webAuthnNewTab": { - "message": "要開始 WebAuthn 2FA 驗證,請點選下面的按鈕開啟一個新分頁,並依照新分頁中提供的說明操作。" - }, - "webAuthnNewTabOpen": { - "message": "開啟新分頁" - }, "openInNewTab": { "message": "Open in new tab" }, @@ -2327,6 +2322,9 @@ "privacyPolicy": { "message": "隱私權政策" }, + "yourNewPasswordCannotBeTheSameAsYourCurrentPassword": { + "message": "Your new password cannot be the same as your current password." + }, "hintEqualsPassword": { "message": "密碼提示不能與您的密碼相同。" }, @@ -2534,15 +2532,15 @@ "message": "Your organization passwords are at-risk because they are weak, reused, and/or exposed.", "description": "Description of the review at-risk login slide on the at-risk password page carousel" }, - "reviewAtRiskLoginSlideImgAlt": { - "message": "Illustration of a list of logins that are at-risk" + "reviewAtRiskLoginSlideImgAltPeriod": { + "message": "Illustration of a list of logins that are at-risk." }, "generatePasswordSlideDesc": { "message": "Quickly generate a strong, unique password with the Bitwarden autofill menu on the at-risk site.", "description": "Description of the generate password slide on the at-risk password page carousel" }, - "generatePasswordSlideImgAlt": { - "message": "Illustration of the Bitwarden autofill menu displaying a generated password" + "generatePasswordSlideImgAltPeriod": { + "message": "Illustration of the Bitwarden autofill menu displaying a generated password." }, "updateInBitwarden": { "message": "Update in Bitwarden" @@ -2551,8 +2549,8 @@ "message": "Bitwarden will then prompt you to update the password in the password manager.", "description": "Description of the update in Bitwarden slide on the at-risk password page carousel" }, - "updateInBitwardenSlideImgAlt": { - "message": "Illustration of a Bitwarden’s notification prompting the user to update the login" + "updateInBitwardenSlideImgAltPeriod": { + "message": "Illustration of a Bitwarden’s notification prompting the user to update the login." }, "turnOnAutofill": { "message": "Turn on autofill" @@ -3007,6 +3005,15 @@ } } }, + "exportingIndividualVaultWithAttachmentsDescription": { + "message": "Only the individual vault items including attachments associated with $EMAIL$ will be exported. Organization vault items will not be included", + "placeholders": { + "email": { + "content": "$1", + "example": "name@example.com" + } + } + }, "exportingOrganizationVaultTitle": { "message": "正在匯出組織密碼庫" }, @@ -3839,15 +3846,9 @@ "duoHealthCheckResultsInNullAuthUrlError": { "message": "連接到 Duo 服務時發生錯誤。使用不同的兩階段認證或聯繫 Duo 來獲得支援。" }, - "launchDuoAndFollowStepsToFinishLoggingIn": { - "message": "啟動 Duo 並依照步驟完成登入。" - }, "duoRequiredForAccount": { "message": "您的帳號要求使用 Duo 兩步驟驗證登入。" }, - "popoutTheExtensionToCompleteLogin": { - "message": "彈出擴充套件視窗來完成登入。" - }, "popoutExtension": { "message": "彈出擴充套件視窗" }, @@ -4270,6 +4271,20 @@ } } }, + "viewItemTitleWithField": { + "message": "View item - $ITEMNAME$ - $FIELD$", + "description": "Title for a link that opens a view for an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + }, + "field": { + "content": "$2", + "example": "Username" + } + } + }, "autofillTitle": { "message": "自動填入 - $ITEMNAME$", "description": "Title for a button that autofills a login item.", @@ -4280,6 +4295,20 @@ } } }, + "autofillTitleWithField": { + "message": "Autofill - $ITEMNAME$ - $FIELD$", + "description": "Title for a button that autofills a login item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + }, + "field": { + "content": "$2", + "example": "Username" + } + } + }, "copyFieldValue": { "message": "Copy $FIELD$, $VALUE$", "description": "Title for a button that copies a field value to the clipboard.", @@ -4899,8 +4928,8 @@ "message": "密碼已重新產生", "description": "Notification message for when a password has been regenerated" }, - "saveLoginToBitwarden": { - "message": "在 Bitwarden 中儲存登入資訊?", + "saveToBitwarden": { + "message": "Save to Bitwarden", "description": "Confirmation message for saving a login to Bitwarden" }, "spaceCharacterDescriptor": { @@ -5139,5 +5168,32 @@ }, "changeAtRiskPassword": { "message": "Change at-risk password" + }, + "introCarouselLabel": { + "message": "Welcome to Bitwarden" + }, + "securityPrioritized": { + "message": "Security, prioritized" + }, + "securityPrioritizedBody": { + "message": "Save logins, cards, and identities to your secure vault. Bitwarden uses zero-knowledge, end-to-end encryption to protect what’s important to you." + }, + "quickLogin": { + "message": "Quick and easy login" + }, + "quickLoginBody": { + "message": "Set up biometric unlock and autofill to log into your accounts without typing a single letter." + }, + "secureUser": { + "message": "Level up your logins" + }, + "secureUserBody": { + "message": "Use the generator to create and save strong, unique passwords for all your accounts." + }, + "secureDevices": { + "message": "Your data, when and where you need it" + }, + "secureDevicesBody": { + "message": "Save unlimited passwords across unlimited devices with Bitwarden mobile, browser, and desktop apps." } } diff --git a/apps/browser/src/auth/popup/components/set-pin.component.html b/apps/browser/src/auth/popup/components/set-pin.component.html index 80e1b63c7d7..58cb42456ee 100644 --- a/apps/browser/src/auth/popup/components/set-pin.component.html +++ b/apps/browser/src/auth/popup/components/set-pin.component.html @@ -25,13 +25,13 @@ {{ "lockWithMasterPassOnRestart1" | i18n }} -
+ -
+ diff --git a/apps/browser/src/auth/popup/extension-anon-layout-wrapper/extension-anon-layout-wrapper.component.html b/apps/browser/src/auth/popup/extension-anon-layout-wrapper/extension-anon-layout-wrapper.component.html index 88a3b1c3076..bd2886dacf0 100644 --- a/apps/browser/src/auth/popup/extension-anon-layout-wrapper/extension-anon-layout-wrapper.component.html +++ b/apps/browser/src/auth/popup/extension-anon-layout-wrapper/extension-anon-layout-wrapper.component.html @@ -5,7 +5,12 @@ [showBackButton]="showBackButton" [pageTitle]="''" > - + @@ -21,6 +26,7 @@ [hideLogo]="true" [maxWidth]="maxWidth" [hideFooter]="hideFooter" + [hideIcon]="hideIcon" > diff --git a/apps/browser/src/auth/popup/extension-anon-layout-wrapper/extension-anon-layout-wrapper.component.ts b/apps/browser/src/auth/popup/extension-anon-layout-wrapper/extension-anon-layout-wrapper.component.ts index 10ef65d0654..d6cccf31bb4 100644 --- a/apps/browser/src/auth/popup/extension-anon-layout-wrapper/extension-anon-layout-wrapper.component.ts +++ b/apps/browser/src/auth/popup/extension-anon-layout-wrapper/extension-anon-layout-wrapper.component.ts @@ -12,6 +12,7 @@ import { } from "@bitwarden/auth/angular"; import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; import { Icon, IconModule, Translation } from "@bitwarden/components"; +import { I18nPipe } from "@bitwarden/ui-common"; import { PopOutComponent } from "../../../platform/popup/components/pop-out.component"; import { PopupHeaderComponent } from "../../../platform/popup/layout/popup-header.component"; @@ -26,6 +27,7 @@ export interface ExtensionAnonLayoutWrapperData extends AnonLayoutWrapperData { showBackButton?: boolean; showLogo?: boolean; hideFooter?: boolean; + hideIcon?: boolean; } @Component({ @@ -35,6 +37,7 @@ export interface ExtensionAnonLayoutWrapperData extends AnonLayoutWrapperData { AnonLayoutComponent, CommonModule, CurrentAccountComponent, + I18nPipe, IconModule, PopOutComponent, PopupPageComponent, @@ -48,6 +51,7 @@ export class ExtensionAnonLayoutWrapperComponent implements OnInit, OnDestroy { protected showAcctSwitcher: boolean; protected showBackButton: boolean; protected showLogo: boolean = true; + protected hideIcon: boolean = false; protected pageTitle: string; protected pageSubtitle: string; @@ -129,6 +133,10 @@ export class ExtensionAnonLayoutWrapperComponent implements OnInit, OnDestroy { if (firstChildRouteData["showLogo"] !== undefined) { this.showLogo = Boolean(firstChildRouteData["showLogo"]); } + + if (firstChildRouteData["hideIcon"] !== undefined) { + this.hideIcon = Boolean(firstChildRouteData["hideIcon"]); + } } private listenForServiceDataChanges() { @@ -180,6 +188,10 @@ export class ExtensionAnonLayoutWrapperComponent implements OnInit, OnDestroy { if (data.showLogo !== undefined) { this.showLogo = data.showLogo; } + + if (data.hideIcon !== undefined) { + this.hideIcon = data.hideIcon; + } } private handleStringOrTranslation(value: string | Translation): string { diff --git a/apps/browser/src/auth/popup/extension-anon-layout-wrapper/extension-anon-layout-wrapper.stories.ts b/apps/browser/src/auth/popup/extension-anon-layout-wrapper/extension-anon-layout-wrapper.stories.ts index 841eefda0ad..a0990485d49 100644 --- a/apps/browser/src/auth/popup/extension-anon-layout-wrapper/extension-anon-layout-wrapper.stories.ts +++ b/apps/browser/src/auth/popup/extension-anon-layout-wrapper/extension-anon-layout-wrapper.stories.ts @@ -242,6 +242,7 @@ const initialData: ExtensionAnonLayoutWrapperData = { showAcctSwitcher: true, showBackButton: true, showLogo: true, + hideIcon: false, }; const changedData: ExtensionAnonLayoutWrapperData = { @@ -255,6 +256,7 @@ const changedData: ExtensionAnonLayoutWrapperData = { showAcctSwitcher: false, showBackButton: false, showLogo: false, + hideIcon: false, }; @Component({ diff --git a/apps/browser/src/auth/popup/login/extension-login-component.service.spec.ts b/apps/browser/src/auth/popup/login/extension-login-component.service.spec.ts index ee940952852..6d1f0571ae7 100644 --- a/apps/browser/src/auth/popup/login/extension-login-component.service.spec.ts +++ b/apps/browser/src/auth/popup/login/extension-login-component.service.spec.ts @@ -6,7 +6,7 @@ import { DefaultLoginComponentService } from "@bitwarden/auth/angular"; import { SsoUrlService } from "@bitwarden/auth/common"; import { SsoLoginServiceAbstraction } from "@bitwarden/common/auth/abstractions/sso-login.service.abstraction"; import { ClientType } from "@bitwarden/common/enums"; -import { CryptoFunctionService } from "@bitwarden/common/platform/abstractions/crypto-function.service"; +import { CryptoFunctionService } from "@bitwarden/common/key-management/crypto/abstractions/crypto-function.service"; import { Environment, EnvironmentService, diff --git a/apps/browser/src/auth/popup/login/extension-login-component.service.ts b/apps/browser/src/auth/popup/login/extension-login-component.service.ts index 9ed727ade33..49ed0635b7a 100644 --- a/apps/browser/src/auth/popup/login/extension-login-component.service.ts +++ b/apps/browser/src/auth/popup/login/extension-login-component.service.ts @@ -6,7 +6,7 @@ import { firstValueFrom } from "rxjs"; import { DefaultLoginComponentService, LoginComponentService } from "@bitwarden/auth/angular"; import { SsoUrlService } from "@bitwarden/auth/common"; import { SsoLoginServiceAbstraction } from "@bitwarden/common/auth/abstractions/sso-login.service.abstraction"; -import { CryptoFunctionService } from "@bitwarden/common/platform/abstractions/crypto-function.service"; +import { CryptoFunctionService } from "@bitwarden/common/key-management/crypto/abstractions/crypto-function.service"; import { EnvironmentService } from "@bitwarden/common/platform/abstractions/environment.service"; import { PlatformUtilsService } from "@bitwarden/common/platform/abstractions/platform-utils.service"; import { PasswordGenerationServiceAbstraction } from "@bitwarden/generator-legacy"; diff --git a/apps/browser/src/auth/popup/settings/account-security.component.html b/apps/browser/src/auth/popup/settings/account-security.component.html index 3c5fd7a6af8..ebf79af644c 100644 --- a/apps/browser/src/auth/popup/settings/account-security.component.html +++ b/apps/browser/src/auth/popup/settings/account-security.component.html @@ -23,7 +23,7 @@ - +

{{ "otherOptions" | i18n }}

diff --git a/apps/browser/src/auth/popup/settings/account-security.component.spec.ts b/apps/browser/src/auth/popup/settings/account-security.component.spec.ts index 60b38570482..abe642970bb 100644 --- a/apps/browser/src/auth/popup/settings/account-security.component.spec.ts +++ b/apps/browser/src/auth/popup/settings/account-security.component.spec.ts @@ -99,7 +99,7 @@ describe("AccountSecurityComponent", () => { it("pin enabled when RemoveUnlockWithPin policy is not set", async () => { // @ts-strict-ignore - policyService.get$.mockReturnValue(of(null)); + policyService.policiesByType$.mockReturnValue(of([null])); await component.ngOnInit(); @@ -111,7 +111,7 @@ describe("AccountSecurityComponent", () => { policy.type = PolicyType.RemoveUnlockWithPin; policy.enabled = false; - policyService.get$.mockReturnValue(of(policy)); + policyService.policiesByType$.mockReturnValue(of([policy])); await component.ngOnInit(); @@ -129,7 +129,7 @@ describe("AccountSecurityComponent", () => { policy.type = PolicyType.RemoveUnlockWithPin; policy.enabled = true; - policyService.get$.mockReturnValue(of(policy)); + policyService.policiesByType$.mockReturnValue(of([policy])); await component.ngOnInit(); @@ -143,7 +143,7 @@ describe("AccountSecurityComponent", () => { it("pin visible when RemoveUnlockWithPin policy is not set", async () => { // @ts-strict-ignore - policyService.get$.mockReturnValue(of(null)); + policyService.policiesByType$.mockReturnValue(of([null])); await component.ngOnInit(); fixture.detectChanges(); @@ -158,7 +158,7 @@ describe("AccountSecurityComponent", () => { policy.type = PolicyType.RemoveUnlockWithPin; policy.enabled = false; - policyService.get$.mockReturnValue(of(policy)); + policyService.policiesByType$.mockReturnValue(of([policy])); await component.ngOnInit(); fixture.detectChanges(); @@ -173,7 +173,7 @@ describe("AccountSecurityComponent", () => { policy.type = PolicyType.RemoveUnlockWithPin; policy.enabled = true; - policyService.get$.mockReturnValue(of(policy)); + policyService.policiesByType$.mockReturnValue(of([policy])); pinServiceAbstraction.isPinSet.mockResolvedValue(true); @@ -190,7 +190,7 @@ describe("AccountSecurityComponent", () => { policy.type = PolicyType.RemoveUnlockWithPin; policy.enabled = true; - policyService.get$.mockReturnValue(of(policy)); + policyService.policiesByType$.mockReturnValue(of([policy])); await component.ngOnInit(); fixture.detectChanges(); diff --git a/apps/browser/src/auth/popup/settings/account-security.component.ts b/apps/browser/src/auth/popup/settings/account-security.component.ts index 8cdfdab9524..ede044b21de 100644 --- a/apps/browser/src/auth/popup/settings/account-security.component.ts +++ b/apps/browser/src/auth/popup/settings/account-security.component.ts @@ -1,6 +1,5 @@ // FIXME: Update this file to be type safe and remove this and next line // @ts-strict-ignore -import { DialogRef } from "@angular/cdk/dialog"; import { CommonModule } from "@angular/common"; import { ChangeDetectorRef, Component, OnDestroy, OnInit } from "@angular/core"; import { FormBuilder, FormsModule, ReactiveFormsModule } from "@angular/forms"; @@ -27,9 +26,10 @@ import { FingerprintDialogComponent, VaultTimeoutInputComponent } from "@bitward import { PinServiceAbstraction } from "@bitwarden/auth/common"; import { PolicyService } from "@bitwarden/common/admin-console/abstractions/policy/policy.service.abstraction"; import { PolicyType } from "@bitwarden/common/admin-console/enums"; +import { getFirstPolicy } from "@bitwarden/common/admin-console/services/policy/default-policy.service"; import { AccountService } from "@bitwarden/common/auth/abstractions/account.service"; import { UserVerificationService } from "@bitwarden/common/auth/abstractions/user-verification/user-verification.service.abstraction"; -import { DeviceType } from "@bitwarden/common/enums"; +import { getUserId } from "@bitwarden/common/auth/services/account.service"; import { VaultTimeout, VaultTimeoutAction, @@ -44,6 +44,7 @@ import { MessagingService } from "@bitwarden/common/platform/abstractions/messag import { PlatformUtilsService } from "@bitwarden/common/platform/abstractions/platform-utils.service"; import { StateService } from "@bitwarden/common/platform/abstractions/state.service"; import { + DialogRef, CardComponent, CheckboxModule, DialogService, @@ -108,7 +109,6 @@ export class AccountSecurityComponent implements OnInit, OnDestroy { hasVaultTimeoutPolicy = false; biometricUnavailabilityReason: string; showChangeMasterPass = true; - showAutoPrompt = true; pinEnabled$: Observable = of(true); form = this.formBuilder.group({ @@ -145,15 +145,16 @@ export class AccountSecurityComponent implements OnInit, OnDestroy { ) {} async ngOnInit() { - // Firefox popup closes when unfocused by biometrics, blocking all unlock methods - if (this.platformUtilsService.getDevice() === DeviceType.FirefoxExtension) { - this.showAutoPrompt = false; - } - const hasMasterPassword = await this.userVerificationService.hasMasterPassword(); this.showMasterPasswordOnClientRestartOption = hasMasterPassword; - const maximumVaultTimeoutPolicy = this.policyService.get$(PolicyType.MaximumVaultTimeout); - if ((await firstValueFrom(this.policyService.get$(PolicyType.MaximumVaultTimeout))) != null) { + const maximumVaultTimeoutPolicy = this.accountService.activeAccount$.pipe( + getUserId, + switchMap((userId) => + this.policyService.policiesByType$(PolicyType.MaximumVaultTimeout, userId), + ), + getFirstPolicy, + ); + if ((await firstValueFrom(maximumVaultTimeoutPolicy)) != null) { this.hasVaultTimeoutPolicy = true; } @@ -195,7 +196,12 @@ export class AccountSecurityComponent implements OnInit, OnDestroy { timeout = VaultTimeoutStringType.OnRestart; } - this.pinEnabled$ = this.policyService.get$(PolicyType.RemoveUnlockWithPin).pipe( + this.pinEnabled$ = this.accountService.activeAccount$.pipe( + getUserId, + switchMap((userId) => + this.policyService.policiesByType$(PolicyType.RemoveUnlockWithPin, userId), + ), + getFirstPolicy, map((policy) => { return policy == null || !policy.enabled; }), @@ -220,11 +226,7 @@ export class AccountSecurityComponent implements OnInit, OnDestroy { .pipe( switchMap(async () => { const status = await this.biometricsService.getBiometricsStatusForUser(activeAccount.id); - const biometricSettingAvailable = - !(await BrowserApi.permissionsGranted(["nativeMessaging"])) || - (status !== BiometricsStatus.DesktopDisconnected && - status !== BiometricsStatus.NotEnabledInConnectedDesktopApp) || - (await this.vaultTimeoutSettingsService.isBiometricLockSet()); + const biometricSettingAvailable = await this.biometricsService.canEnableBiometricUnlock(); if (!biometricSettingAvailable) { this.form.controls.biometric.disable({ emitEvent: false }); } else { @@ -243,6 +245,13 @@ export class AccountSecurityComponent implements OnInit, OnDestroy { "biometricsStatusHelptextNotEnabledInDesktop", activeAccount.email, ); + } else if ( + status === BiometricsStatus.HardwareUnavailable && + !biometricSettingAvailable + ) { + this.biometricUnavailabilityReason = this.i18nService.t( + "biometricsStatusHelptextHardwareUnavailable", + ); } else { this.biometricUnavailabilityReason = ""; } diff --git a/apps/browser/src/auth/popup/sso-v1.component.html b/apps/browser/src/auth/popup/sso-v1.component.html deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/apps/browser/src/auth/popup/sso-v1.component.ts b/apps/browser/src/auth/popup/sso-v1.component.ts deleted file mode 100644 index f56fe697e70..00000000000 --- a/apps/browser/src/auth/popup/sso-v1.component.ts +++ /dev/null @@ -1,105 +0,0 @@ -import { Component, Inject } from "@angular/core"; -import { takeUntilDestroyed } from "@angular/core/rxjs-interop"; -import { ActivatedRoute, Router } from "@angular/router"; - -import { SsoComponent as BaseSsoComponent } from "@bitwarden/angular/auth/components/sso.component"; -import { WINDOW } from "@bitwarden/angular/services/injection-tokens"; -import { - LoginStrategyServiceAbstraction, - UserDecryptionOptionsServiceAbstraction, -} from "@bitwarden/auth/common"; -import { ApiService } from "@bitwarden/common/abstractions/api.service"; -import { AccountService } from "@bitwarden/common/auth/abstractions/account.service"; -import { AuthService } from "@bitwarden/common/auth/abstractions/auth.service"; -import { SsoLoginServiceAbstraction } from "@bitwarden/common/auth/abstractions/sso-login.service.abstraction"; -import { AuthenticationStatus } from "@bitwarden/common/auth/enums/authentication-status"; -import { InternalMasterPasswordServiceAbstraction } from "@bitwarden/common/key-management/master-password/abstractions/master-password.service.abstraction"; -import { ConfigService } from "@bitwarden/common/platform/abstractions/config/config.service"; -import { CryptoFunctionService } from "@bitwarden/common/platform/abstractions/crypto-function.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 { StateService } from "@bitwarden/common/platform/abstractions/state.service"; -import { SyncService } from "@bitwarden/common/vault/abstractions/sync/sync.service.abstraction"; -import { ToastService } from "@bitwarden/components"; -import { PasswordGenerationServiceAbstraction } from "@bitwarden/generator-legacy"; - -import { BrowserApi } from "../../platform/browser/browser-api"; - -@Component({ - selector: "app-sso", - templateUrl: "sso-v1.component.html", -}) -export class SsoComponentV1 extends BaseSsoComponent { - constructor( - ssoLoginService: SsoLoginServiceAbstraction, - loginStrategyService: LoginStrategyServiceAbstraction, - router: Router, - i18nService: I18nService, - route: ActivatedRoute, - stateService: StateService, - platformUtilsService: PlatformUtilsService, - apiService: ApiService, - cryptoFunctionService: CryptoFunctionService, - passwordGenerationService: PasswordGenerationServiceAbstraction, - syncService: SyncService, - environmentService: EnvironmentService, - logService: LogService, - userDecryptionOptionsService: UserDecryptionOptionsServiceAbstraction, - configService: ConfigService, - masterPasswordService: InternalMasterPasswordServiceAbstraction, - accountService: AccountService, - private authService: AuthService, - @Inject(WINDOW) private win: Window, - toastService: ToastService, - ) { - super( - ssoLoginService, - loginStrategyService, - router, - i18nService, - route, - stateService, - platformUtilsService, - apiService, - cryptoFunctionService, - environmentService, - passwordGenerationService, - logService, - userDecryptionOptionsService, - configService, - masterPasswordService, - accountService, - toastService, - ); - - environmentService.environment$.pipe(takeUntilDestroyed()).subscribe((env) => { - this.redirectUri = env.getWebVaultUrl() + "/sso-connector.html"; - }); - this.clientId = "browser"; - - this.onSuccessfulLogin = async () => { - // 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 - syncService.fullSync(true); - - // If the vault is unlocked then this will clear keys from memory, which we don't want to do - if ((await this.authService.getAuthStatus()) !== AuthenticationStatus.Unlocked) { - BrowserApi.reloadOpenWindows(); - } - - this.win.close(); - }; - - this.onSuccessfulLoginTde = async () => { - // 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 - syncService.fullSync(true); - }; - - this.onSuccessfulLoginTdeNavigate = async () => { - this.win.close(); - }; - } -} diff --git a/apps/browser/src/auth/popup/two-factor-options-v1.component.html b/apps/browser/src/auth/popup/two-factor-options-v1.component.html deleted file mode 100644 index f25944aba65..00000000000 --- a/apps/browser/src/auth/popup/two-factor-options-v1.component.html +++ /dev/null @@ -1,29 +0,0 @@ -
-
- -
-

- {{ "twoStepOptions" | i18n }} -

-
-
-
-
-
- - -
-
-
diff --git a/apps/browser/src/auth/popup/two-factor-options-v1.component.ts b/apps/browser/src/auth/popup/two-factor-options-v1.component.ts deleted file mode 100644 index 0c71421fc04..00000000000 --- a/apps/browser/src/auth/popup/two-factor-options-v1.component.ts +++ /dev/null @@ -1,56 +0,0 @@ -import { Component } from "@angular/core"; -import { ActivatedRoute, Router } from "@angular/router"; - -import { TwoFactorOptionsComponentV1 as BaseTwoFactorOptionsComponent } from "@bitwarden/angular/auth/components/two-factor-options-v1.component"; -import { - TwoFactorProviderDetails, - TwoFactorService, -} from "@bitwarden/common/auth/abstractions/two-factor.service"; -import { EnvironmentService } from "@bitwarden/common/platform/abstractions/environment.service"; -import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; -import { PlatformUtilsService } from "@bitwarden/common/platform/abstractions/platform-utils.service"; - -@Component({ - selector: "app-two-factor-options", - templateUrl: "two-factor-options-v1.component.html", -}) -export class TwoFactorOptionsComponentV1 extends BaseTwoFactorOptionsComponent { - constructor( - twoFactorService: TwoFactorService, - router: Router, - i18nService: I18nService, - platformUtilsService: PlatformUtilsService, - environmentService: EnvironmentService, - private activatedRoute: ActivatedRoute, - ) { - super(twoFactorService, router, i18nService, platformUtilsService, window, environmentService); - } - - close() { - this.navigateTo2FA(); - } - - override async choose(p: TwoFactorProviderDetails) { - await super.choose(p); - await this.twoFactorService.setSelectedProvider(p.type); - - this.navigateTo2FA(); - } - - navigateTo2FA() { - const sso = this.activatedRoute.snapshot.queryParamMap.get("sso") === "true"; - - if (sso) { - // Persist SSO flag back to the 2FA comp if it exists - // in order for successful login logic to work properly for - // SSO + 2FA in browser extension - // FIXME: Verify that this floating promise is intentional. If it is, add an explanatory comment and ensure there is proper error handling. - // eslint-disable-next-line @typescript-eslint/no-floating-promises - this.router.navigate(["2fa"], { queryParams: { sso: true } }); - } else { - // FIXME: Verify that this floating promise is intentional. If it is, add an explanatory comment and ensure there is proper error handling. - // eslint-disable-next-line @typescript-eslint/no-floating-promises - this.router.navigate(["2fa"]); - } - } -} diff --git a/apps/browser/src/auth/popup/two-factor-v1.component.html b/apps/browser/src/auth/popup/two-factor-v1.component.html deleted file mode 100644 index 126b0ea5a99..00000000000 --- a/apps/browser/src/auth/popup/two-factor-v1.component.html +++ /dev/null @@ -1,196 +0,0 @@ -
-
-
- -
-

- {{ title }} -

-
- -
-
-
- - -
- - {{ "enterVerificationCodeApp" | i18n }} - - - {{ "enterVerificationCodeEmail" | i18n: twoFactorEmail }} - -
-
-
-
- - -
-
- - -
-
-
-
- - -
-

{{ "insertYubiKey" | i18n }}

- -
-
-
-
- - -
-
- - -
-
-
-
- - -
- -
-
-
-
- - -
-
-
-
- - -
-

{{ "webAuthnNewTab" | i18n }}

- -
-
- - -
-

- {{ "duoRequiredForAccount" | i18n }} -

- -

- {{ "popoutTheExtensionToCompleteLogin" | i18n }} -

- - -

{{ "launchDuoAndFollowStepsToFinishLoggingIn" | i18n }}

- - -
-
- - -
-
-
- - -
-
-
-
-
-
- -
-
-

{{ "noTwoStepProviders" | i18n }}

-

{{ "noTwoStepProviders2" | i18n }}

-
- -
- - - - - - - - -

- -

-
-
-
diff --git a/apps/browser/src/auth/popup/two-factor-v1.component.ts b/apps/browser/src/auth/popup/two-factor-v1.component.ts deleted file mode 100644 index 884e42bf73a..00000000000 --- a/apps/browser/src/auth/popup/two-factor-v1.component.ts +++ /dev/null @@ -1,260 +0,0 @@ -// FIXME: Update this file to be type safe and remove this and next line -// @ts-strict-ignore -import { Component, Inject, OnDestroy, OnInit } from "@angular/core"; -import { ActivatedRoute, Router } from "@angular/router"; -import { Subject, Subscription, firstValueFrom } from "rxjs"; -import { filter, first, takeUntil } from "rxjs/operators"; - -import { TwoFactorComponentV1 as BaseTwoFactorComponent } from "@bitwarden/angular/auth/components/two-factor-v1.component"; -import { WINDOW } from "@bitwarden/angular/services/injection-tokens"; -import { - LoginStrategyServiceAbstraction, - LoginEmailServiceAbstraction, - UserDecryptionOptionsServiceAbstraction, -} from "@bitwarden/auth/common"; -import { ApiService } from "@bitwarden/common/abstractions/api.service"; -import { AccountService } from "@bitwarden/common/auth/abstractions/account.service"; -import { SsoLoginServiceAbstraction } from "@bitwarden/common/auth/abstractions/sso-login.service.abstraction"; -import { TwoFactorService } from "@bitwarden/common/auth/abstractions/two-factor.service"; -import { TwoFactorProviderType } from "@bitwarden/common/auth/enums/two-factor-provider-type"; -import { InternalMasterPasswordServiceAbstraction } from "@bitwarden/common/key-management/master-password/abstractions/master-password.service.abstraction"; -import { AppIdService } from "@bitwarden/common/platform/abstractions/app-id.service"; -import { ConfigService } from "@bitwarden/common/platform/abstractions/config/config.service"; -import { EnvironmentService } from "@bitwarden/common/platform/abstractions/environment.service"; -import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; -import { LogService } from "@bitwarden/common/platform/abstractions/log.service"; -import { MessagingService } from "@bitwarden/common/platform/abstractions/messaging.service"; -import { PlatformUtilsService } from "@bitwarden/common/platform/abstractions/platform-utils.service"; -import { StateService } from "@bitwarden/common/platform/abstractions/state.service"; -import { SyncService } from "@bitwarden/common/vault/abstractions/sync/sync.service.abstraction"; -import { DialogService, ToastService } from "@bitwarden/components"; - -import { BrowserApi } from "../../platform/browser/browser-api"; -import { ZonedMessageListenerService } from "../../platform/browser/zoned-message-listener.service"; -import BrowserPopupUtils from "../../platform/popup/browser-popup-utils"; - -import { closeTwoFactorAuthWebAuthnPopout } from "./utils/auth-popout-window"; - -@Component({ - selector: "app-two-factor", - templateUrl: "two-factor-v1.component.html", -}) -export class TwoFactorComponentV1 extends BaseTwoFactorComponent implements OnInit, OnDestroy { - private destroy$ = new Subject(); - inPopout = BrowserPopupUtils.inPopout(window); - - constructor( - loginStrategyService: LoginStrategyServiceAbstraction, - router: Router, - i18nService: I18nService, - apiService: ApiService, - platformUtilsService: PlatformUtilsService, - private syncService: SyncService, - environmentService: EnvironmentService, - stateService: StateService, - route: ActivatedRoute, - private messagingService: MessagingService, - logService: LogService, - twoFactorService: TwoFactorService, - appIdService: AppIdService, - loginEmailService: LoginEmailServiceAbstraction, - userDecryptionOptionsService: UserDecryptionOptionsServiceAbstraction, - configService: ConfigService, - ssoLoginService: SsoLoginServiceAbstraction, - private dialogService: DialogService, - masterPasswordService: InternalMasterPasswordServiceAbstraction, - accountService: AccountService, - toastService: ToastService, - @Inject(WINDOW) protected win: Window, - private browserMessagingApi: ZonedMessageListenerService, - ) { - super( - loginStrategyService, - router, - i18nService, - apiService, - platformUtilsService, - win, - environmentService, - stateService, - route, - logService, - twoFactorService, - appIdService, - loginEmailService, - userDecryptionOptionsService, - ssoLoginService, - configService, - masterPasswordService, - accountService, - toastService, - ); - this.onSuccessfulLogin = async () => { - // 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 - syncService.fullSync(true); - }; - - this.onSuccessfulLoginTde = async () => { - // 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 - syncService.fullSync(true); - }; - - this.onSuccessfulLoginTdeNavigate = async () => { - this.win.close(); - }; - - this.successRoute = "/tabs/vault"; - // FIXME: Chromium 110 has broken WebAuthn support in extensions via an iframe - this.webAuthnNewTab = true; - } - - async ngOnInit() { - if (this.route.snapshot.paramMap.has("webAuthnResponse")) { - // WebAuthn fallback response - this.selectedProviderType = TwoFactorProviderType.WebAuthn; - this.token = this.route.snapshot.paramMap.get("webAuthnResponse"); - this.onSuccessfulLogin = async () => { - // 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.syncService.fullSync(true); - this.messagingService.send("reloadPopup"); - window.close(); - }; - this.remember = this.route.snapshot.paramMap.get("remember") === "true"; - await this.doSubmit(); - return; - } - - await super.ngOnInit(); - if (this.selectedProviderType == null) { - return; - } - - // WebAuthn prompt appears inside the popup on linux, and requires a larger popup width - // than usual to avoid cutting off the dialog. - if (this.selectedProviderType === TwoFactorProviderType.WebAuthn && (await this.isLinux())) { - document.body.classList.add("linux-webauthn"); - } - - if ( - this.selectedProviderType === TwoFactorProviderType.Email && - BrowserPopupUtils.inPopup(window) - ) { - const confirmed = await this.dialogService.openSimpleDialog({ - title: { key: "warning" }, - content: { key: "popup2faCloseMessage" }, - type: "warning", - }); - if (confirmed) { - // 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 - BrowserPopupUtils.openCurrentPagePopout(window); - } - } - - // eslint-disable-next-line rxjs-angular/prefer-takeuntil, rxjs/no-async-subscribe - this.route.queryParams.pipe(first()).subscribe(async (qParams) => { - if (qParams.sso === "true") { - this.onSuccessfulLogin = async () => { - // This is not awaited so we don't pause the application while the sync is happening. - // This call is executed by the service that lives in the background script so it will continue - // the sync even if this tab closes. - // 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.syncService.fullSync(true); - - // Force sidebars (FF && Opera) to reload while exempting current window - // because we are just going to close the current window. - BrowserApi.reloadOpenWindows(true); - - // We don't need this window anymore because the intent is for the user to be left - // on the web vault screen which tells them to continue in the browser extension (sidebar or popup) - await closeTwoFactorAuthWebAuthnPopout(); - }; - } - }); - } - - async ngOnDestroy() { - this.destroy$.next(); - this.destroy$.complete(); - - if (this.selectedProviderType === TwoFactorProviderType.WebAuthn && (await this.isLinux())) { - document.body.classList.remove("linux-webauthn"); - } - super.ngOnDestroy(); - } - - anotherMethod() { - const sso = this.route.snapshot.queryParamMap.get("sso") === "true"; - - if (sso) { - // We must persist this so when the user returns to the 2FA comp, the - // proper onSuccessfulLogin logic is executed. - // FIXME: Verify that this floating promise is intentional. If it is, add an explanatory comment and ensure there is proper error handling. - // eslint-disable-next-line @typescript-eslint/no-floating-promises - this.router.navigate(["2fa-options"], { queryParams: { sso: true } }); - } else { - // FIXME: Verify that this floating promise is intentional. If it is, add an explanatory comment and ensure there is proper error handling. - // eslint-disable-next-line @typescript-eslint/no-floating-promises - this.router.navigate(["2fa-options"]); - } - } - - async popoutCurrentPage() { - await BrowserPopupUtils.openCurrentPagePopout(window); - } - - async isLinux() { - return (await BrowserApi.getPlatformInfo()).os === "linux"; - } - - duoResultSubscription: Subscription; - protected override setupDuoResultListener() { - if (!this.duoResultSubscription) { - this.duoResultSubscription = this.browserMessagingApi - .messageListener$() - .pipe( - filter((msg: any) => msg.command === "duoResult"), - takeUntil(this.destroy$), - ) - .subscribe((msg: { command: string; code: string; state: string }) => { - this.token = msg.code + "|" + msg.state; - // This floating promise is intentional. We don't need to await the submit + awaiting in a subscription is not recommended. - // eslint-disable-next-line @typescript-eslint/no-floating-promises - this.submit(); - }); - } - } - - override async launchDuoFrameless() { - if (this.duoFramelessUrl === null) { - this.toastService.showToast({ - variant: "error", - title: null, - message: this.i18nService.t("duoHealthCheckResultsInNullAuthUrlError"), - }); - return; - } - - const duoHandOffMessage = { - title: this.i18nService.t("youSuccessfullyLoggedIn"), - message: this.i18nService.t("youMayCloseThisWindow"), - isCountdown: false, - }; - - // we're using the connector here as a way to set a cookie with translations - // before continuing to the duo frameless url - const env = await firstValueFrom(this.environmentService.environment$); - const launchUrl = - env.getWebVaultUrl() + - "/duo-redirect-connector.html" + - "?duoFramelessUrl=" + - encodeURIComponent(this.duoFramelessUrl) + - "&handOffMessage=" + - encodeURIComponent(JSON.stringify(duoHandOffMessage)); - this.platformUtilsService.launchUri(launchUrl); - } -} diff --git a/apps/browser/src/autofill/background/abstractions/notification.background.ts b/apps/browser/src/autofill/background/abstractions/notification.background.ts index 851f07576dd..6b3c91a109c 100644 --- a/apps/browser/src/autofill/background/abstractions/notification.background.ts +++ b/apps/browser/src/autofill/background/abstractions/notification.background.ts @@ -95,6 +95,7 @@ type NotificationBackgroundExtensionMessageHandlers = { unlockCompleted: ({ message, sender }: BackgroundOnMessageHandlerParams) => Promise; bgGetFolderData: ({ message, sender }: BackgroundOnMessageHandlerParams) => Promise; bgCloseNotificationBar: ({ message, sender }: BackgroundOnMessageHandlerParams) => Promise; + bgOpenAtRisksPasswords: ({ message, sender }: BackgroundOnMessageHandlerParams) => Promise; bgAdjustNotificationBar: ({ message, sender }: BackgroundOnMessageHandlerParams) => Promise; bgAddLogin: ({ message, sender }: BackgroundOnMessageHandlerParams) => Promise; bgChangedPassword: ({ message, sender }: BackgroundOnMessageHandlerParams) => Promise; diff --git a/apps/browser/src/autofill/background/auto-submit-login.background.spec.ts b/apps/browser/src/autofill/background/auto-submit-login.background.spec.ts index a300ac08660..9f197b02193 100644 --- a/apps/browser/src/autofill/background/auto-submit-login.background.spec.ts +++ b/apps/browser/src/autofill/background/auto-submit-login.background.spec.ts @@ -8,6 +8,9 @@ import { AuthenticationStatus } from "@bitwarden/common/auth/enums/authenticatio import { ConfigService } from "@bitwarden/common/platform/abstractions/config/config.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 { FakeAccountService, mockAccountServiceWith } from "@bitwarden/common/spec"; +import { UserId } from "@bitwarden/common/types/guid"; import { BrowserApi } from "../../platform/browser/browser-api"; import { ScriptInjectorService } from "../../platform/services/abstractions/script-injector.service"; @@ -35,10 +38,12 @@ describe("AutoSubmitLoginBackground", () => { let configService: MockProxy; let platformUtilsService: MockProxy; let policyDetails: MockProxy; - let automaticAppLogInPolicy$: BehaviorSubject; - let policyAppliesToActiveUser$: BehaviorSubject; + let automaticAppLogInPolicy$: BehaviorSubject; + let policyAppliesToUser$: BehaviorSubject; let policyService: MockProxy; let autoSubmitLoginBackground: AutoSubmitLoginBackground; + let accountService: FakeAccountService; + const mockUserId = Utils.newGuid() as UserId; const validIpdUrl1 = "https://example.com"; const validIpdUrl2 = "https://subdomain.example3.com"; const validAutoSubmitHost = "some-valid-url.com"; @@ -61,12 +66,13 @@ describe("AutoSubmitLoginBackground", () => { idpHost: `${validIpdUrl1} , https://example2.com/some/sub-route ,${validIpdUrl2}, [invalidValue] ,,`, }, }); - automaticAppLogInPolicy$ = new BehaviorSubject(policyDetails); - policyAppliesToActiveUser$ = new BehaviorSubject(true); + automaticAppLogInPolicy$ = new BehaviorSubject([policyDetails]); + policyAppliesToUser$ = new BehaviorSubject(true); policyService = mock({ - get$: jest.fn().mockReturnValue(automaticAppLogInPolicy$), - policyAppliesToActiveUser$: jest.fn().mockReturnValue(policyAppliesToActiveUser$), + policiesByType$: jest.fn().mockReturnValue(automaticAppLogInPolicy$), + policyAppliesToUser$: jest.fn().mockReturnValue(policyAppliesToUser$), }); + accountService = mockAccountServiceWith(mockUserId); autoSubmitLoginBackground = new AutoSubmitLoginBackground( logService, autofillService, @@ -75,6 +81,7 @@ describe("AutoSubmitLoginBackground", () => { configService, platformUtilsService, policyService, + accountService, ); }); @@ -84,7 +91,7 @@ describe("AutoSubmitLoginBackground", () => { describe("when the AutoSubmitLoginBackground feature is disabled", () => { it("destroys all event listeners when the AutomaticAppLogIn policy is not enabled", async () => { - automaticAppLogInPolicy$.next(mock({ ...policyDetails, enabled: false })); + automaticAppLogInPolicy$.next([mock({ ...policyDetails, enabled: false })]); await autoSubmitLoginBackground.init(); @@ -92,7 +99,7 @@ describe("AutoSubmitLoginBackground", () => { }); it("destroys all event listeners when the AutomaticAppLogIn policy does not apply to the current user", async () => { - policyAppliesToActiveUser$.next(false); + policyAppliesToUser$.next(false); await autoSubmitLoginBackground.init(); @@ -100,7 +107,7 @@ describe("AutoSubmitLoginBackground", () => { }); it("destroys all event listeners when the idpHost is not specified in the AutomaticAppLogIn policy", async () => { - automaticAppLogInPolicy$.next(mock({ ...policyDetails, data: { idpHost: "" } })); + automaticAppLogInPolicy$.next([mock({ ...policyDetails, data: { idpHost: "" } })]); await autoSubmitLoginBackground.init(); @@ -264,6 +271,7 @@ describe("AutoSubmitLoginBackground", () => { configService, platformUtilsService, policyService, + accountService, ); jest.spyOn(BrowserApi, "getTabFromCurrentWindow").mockResolvedValue(tab); }); diff --git a/apps/browser/src/autofill/background/auto-submit-login.background.ts b/apps/browser/src/autofill/background/auto-submit-login.background.ts index 034938ca521..bce876e8f82 100644 --- a/apps/browser/src/autofill/background/auto-submit-login.background.ts +++ b/apps/browser/src/autofill/background/auto-submit-login.background.ts @@ -1,12 +1,15 @@ // FIXME: Update this file to be type safe and remove this and next line // @ts-strict-ignore -import { firstValueFrom } from "rxjs"; +import { firstValueFrom, switchMap } from "rxjs"; import { PolicyService } from "@bitwarden/common/admin-console/abstractions/policy/policy.service.abstraction"; import { PolicyType } from "@bitwarden/common/admin-console/enums"; import { Policy } from "@bitwarden/common/admin-console/models/domain/policy"; +import { getFirstPolicy } from "@bitwarden/common/admin-console/services/policy/default-policy.service"; +import { AccountService } from "@bitwarden/common/auth/abstractions/account.service"; import { 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 { FeatureFlag } from "@bitwarden/common/enums/feature-flag.enum"; import { ConfigService } from "@bitwarden/common/platform/abstractions/config/config.service"; import { LogService } from "@bitwarden/common/platform/abstractions/log.service"; @@ -42,6 +45,7 @@ export class AutoSubmitLoginBackground implements AutoSubmitLoginBackgroundAbstr private configService: ConfigService, private platformUtilsService: PlatformUtilsService, private policyService: PolicyService, + private accountService: AccountService, ) { this.isSafariBrowser = this.platformUtilsService.isSafari(); } @@ -56,8 +60,14 @@ export class AutoSubmitLoginBackground implements AutoSubmitLoginBackgroundAbstr FeatureFlag.IdpAutoSubmitLogin, ); if (featureFlagEnabled) { - this.policyService - .get$(PolicyType.AutomaticAppLogIn) + this.accountService.activeAccount$ + .pipe( + getUserId, + switchMap((userId) => + this.policyService.policiesByType$(PolicyType.AutomaticAppLogIn, userId), + ), + getFirstPolicy, + ) .subscribe(this.handleAutoSubmitLoginPolicySubscription.bind(this)); } } @@ -86,7 +96,12 @@ export class AutoSubmitLoginBackground implements AutoSubmitLoginBackgroundAbstr */ private applyPolicyToActiveUser = async (policy: Policy) => { const policyAppliesToUser = await firstValueFrom( - this.policyService.policyAppliesToActiveUser$(PolicyType.AutomaticAppLogIn), + this.accountService.activeAccount$.pipe( + getUserId, + switchMap((userId) => + this.policyService.policyAppliesToUser$(PolicyType.AutomaticAppLogIn, userId), + ), + ), ); if (!policyAppliesToUser) { diff --git a/apps/browser/src/autofill/background/notification.background.spec.ts b/apps/browser/src/autofill/background/notification.background.spec.ts index d474e303336..ffc416ab62a 100644 --- a/apps/browser/src/autofill/background/notification.background.spec.ts +++ b/apps/browser/src/autofill/background/notification.background.spec.ts @@ -1,8 +1,8 @@ import { mock, MockProxy } from "jest-mock-extended"; -import { BehaviorSubject, firstValueFrom } from "rxjs"; +import { BehaviorSubject, firstValueFrom, of } from "rxjs"; import { OrganizationService } from "@bitwarden/common/admin-console/abstractions/organization/organization.service.abstraction"; -import { PolicyService } from "@bitwarden/common/admin-console/services/policy/policy.service"; +import { DefaultPolicyService } from "@bitwarden/common/admin-console/services/policy/default-policy.service"; import { AccountInfo, AccountService } from "@bitwarden/common/auth/abstractions/account.service"; import { AuthenticationStatus } from "@bitwarden/common/auth/enums/authentication-status"; import { AuthService } from "@bitwarden/common/auth/services/auth.service"; @@ -12,6 +12,7 @@ import { UserNotificationSettingsService } from "@bitwarden/common/autofill/serv import { ConfigService } from "@bitwarden/common/platform/abstractions/config/config.service"; import { EnvironmentService } from "@bitwarden/common/platform/abstractions/environment.service"; import { LogService } from "@bitwarden/common/platform/abstractions/log.service"; +import { MessagingService } from "@bitwarden/common/platform/abstractions/messaging.service"; import { SelfHostedEnvironment } from "@bitwarden/common/platform/services/default-environment.service"; import { ThemeStateService } from "@bitwarden/common/platform/theming/theme-state.service"; import { UserId } from "@bitwarden/common/types/guid"; @@ -19,6 +20,7 @@ import { CipherView } from "@bitwarden/common/vault/models/view/cipher.view"; import { FolderView } from "@bitwarden/common/vault/models/view/folder.view"; import { CipherService } from "@bitwarden/common/vault/services/cipher.service"; import { FolderService } from "@bitwarden/common/vault/services/folder/folder.service"; +import { TaskService, SecurityTask } from "@bitwarden/common/vault/tasks"; import { BrowserApi } from "../../platform/browser/browser-api"; import { NotificationQueueMessageType } from "../enums/notification-queue-message-type.enum"; @@ -46,12 +48,14 @@ jest.mock("rxjs", () => { }); describe("NotificationBackground", () => { + const messagingService = mock(); + const taskService = mock(); let notificationBackground: NotificationBackground; const autofillService = mock(); const cipherService = mock(); let activeAccountStatusMock$: BehaviorSubject; let authService: MockProxy; - const policyService = mock(); + const policyService = mock(); const folderService = mock(); const userNotificationSettingsService = mock(); const domainSettingsService = mock(); @@ -88,6 +92,8 @@ describe("NotificationBackground", () => { policyService, themeStateService, userNotificationSettingsService, + taskService, + messagingService, ); }); @@ -201,8 +207,8 @@ describe("NotificationBackground", () => { await flushPromises(); expect(notificationBackground["handleSaveCipherMessage"]).toHaveBeenCalledWith( - message.data.commandToRetry.message, - message.data.commandToRetry.sender, + message.data?.commandToRetry?.message, + message.data?.commandToRetry?.sender, ); }); }); @@ -498,7 +504,7 @@ describe("NotificationBackground", () => { expect(pushChangePasswordToQueueSpy).toHaveBeenCalledWith( null, "example.com", - message.data.newPassword, + message.data?.newPassword, sender.tab, true, ); @@ -570,7 +576,7 @@ describe("NotificationBackground", () => { expect(pushChangePasswordToQueueSpy).toHaveBeenCalledWith( "cipher-id", "example.com", - message.data.newPassword, + message.data?.newPassword, sender.tab, ); }); @@ -618,7 +624,7 @@ describe("NotificationBackground", () => { expect(pushChangePasswordToQueueSpy).toHaveBeenCalledWith( "cipher-id", "example.com", - message.data.newPassword, + message.data?.newPassword, sender.tab, ); }); @@ -844,6 +850,86 @@ describe("NotificationBackground", () => { ); }); + it("completes password update notification with a security task notice if any are present for the cipher, and dismisses tasks for the updated cipher", async () => { + const mockCipherId = "testId"; + const mockOrgId = "testOrgId"; + const mockSecurityTask = { + id: "testTaskId", + organizationId: mockOrgId, + cipherId: mockCipherId, + type: 0, + status: 0, + creationDate: new Date(), + revisionDate: new Date(), + } as SecurityTask; + const mockSecurityTask2 = { + ...mockSecurityTask, + id: "testTaskId2", + cipherId: "testId2", + } as SecurityTask; + taskService.tasksEnabled$.mockImplementation(() => of(true)); + taskService.pendingTasks$.mockImplementation(() => + of([mockSecurityTask, mockSecurityTask2]), + ); + jest + .spyOn(notificationBackground as any, "getNotificationFlag") + .mockResolvedValueOnce(true); + jest.spyOn(notificationBackground as any, "getOrgData").mockResolvedValueOnce([ + { + id: mockOrgId, + name: "Org Name, LLC", + productTierType: 3, + }, + ]); + + const tab = createChromeTabMock({ id: 1, url: "https://example.com" }); + const sender = mock({ tab }); + const message: NotificationBackgroundExtensionMessage = { + command: "bgSaveCipher", + edit: false, + folder: "folder-id", + }; + const queueMessage = mock({ + type: NotificationQueueMessageType.ChangePassword, + tab, + domain: "example.com", + newPassword: "newPassword", + }); + notificationBackground["notificationQueue"] = [queueMessage]; + const cipherView = mock({ + id: mockCipherId, + organizationId: mockOrgId, + login: { username: "testUser" }, + }); + getDecryptedCipherByIdSpy.mockResolvedValueOnce(cipherView); + + sendMockExtensionMessage(message, sender); + await flushPromises(); + + expect(editItemSpy).not.toHaveBeenCalled(); + expect(createWithServerSpy).not.toHaveBeenCalled(); + expect(updatePasswordSpy).toHaveBeenCalledWith( + cipherView, + queueMessage.newPassword, + message.edit, + sender.tab, + mockCipherId, + ); + expect(updateWithServerSpy).toHaveBeenCalled(); + expect(tabSendMessageDataSpy).toHaveBeenCalledWith( + sender.tab, + "saveCipherAttemptCompleted", + { + cipherId: "testId", + task: { + orgName: "Org Name, LLC", + remainingTasksCount: 1, + }, + username: "testUser", + }, + ); + }); + it("updates the cipher password if the queue message was locked and an existing cipher has the same username as the message", async () => { const tab = createChromeTabMock({ id: 1, url: "https://example.com" }); const sender = mock({ tab }); diff --git a/apps/browser/src/autofill/background/notification.background.ts b/apps/browser/src/autofill/background/notification.background.ts index 50e0ee0aa75..6589252d94b 100644 --- a/apps/browser/src/autofill/background/notification.background.ts +++ b/apps/browser/src/autofill/background/notification.background.ts @@ -1,6 +1,6 @@ // FIXME: Update this file to be type safe and remove this and next line // @ts-strict-ignore -import { firstValueFrom } from "rxjs"; +import { firstValueFrom, switchMap, map } from "rxjs"; import { OrganizationService } from "@bitwarden/common/admin-console/abstractions/organization/organization.service.abstraction"; import { PolicyService } from "@bitwarden/common/admin-console/abstractions/policy/policy.service.abstraction"; @@ -8,7 +8,7 @@ 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 { getOptionalUserId, getUserId } from "@bitwarden/common/auth/services/account.service"; import { ExtensionCommand, ExtensionCommandType, @@ -16,27 +16,37 @@ import { } from "@bitwarden/common/autofill/constants"; import { DomainSettingsService } from "@bitwarden/common/autofill/services/domain-settings.service"; import { UserNotificationSettingsServiceAbstraction } from "@bitwarden/common/autofill/services/user-notification-settings.service"; +import { ProductTierType } from "@bitwarden/common/billing/enums/product-tier-type.enum"; import { FeatureFlag } from "@bitwarden/common/enums/feature-flag.enum"; import { NeverDomains } from "@bitwarden/common/models/domain/domain-service"; import { ConfigService } from "@bitwarden/common/platform/abstractions/config/config.service"; import { ServerConfig } from "@bitwarden/common/platform/abstractions/config/server-config"; import { EnvironmentService } from "@bitwarden/common/platform/abstractions/environment.service"; import { LogService } from "@bitwarden/common/platform/abstractions/log.service"; +import { MessagingService } from "@bitwarden/common/platform/abstractions/messaging.service"; import { 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"; +import { VaultMessages } from "@bitwarden/common/vault/enums/vault-messages.enum"; import { buildCipherIcon } from "@bitwarden/common/vault/icon/build-cipher-icon"; import { CipherView } from "@bitwarden/common/vault/models/view/cipher.view"; import { LoginUriView } from "@bitwarden/common/vault/models/view/login-uri.view"; import { LoginView } from "@bitwarden/common/vault/models/view/login.view"; +import { TaskService } from "@bitwarden/common/vault/tasks"; +import { SecurityTaskType } from "@bitwarden/common/vault/tasks/enums"; +import { SecurityTask } from "@bitwarden/common/vault/tasks/models/security-task"; import { openUnlockPopout } from "../../auth/popup/utils/auth-popout-window"; import { BrowserApi } from "../../platform/browser/browser-api"; import { openAddEditVaultItemPopout } from "../../vault/popup/utils/vault-popout-window"; -import { NotificationCipherData } from "../content/components/cipher/types"; +import { + OrganizationCategory, + OrganizationCategories, + NotificationCipherData, +} from "../content/components/cipher/types"; import { NotificationQueueMessageType } from "../enums/notification-queue-message-type.enum"; import { AutofillService } from "../services/abstractions/autofill.service"; @@ -70,6 +80,8 @@ export default class NotificationBackground { bgChangedPassword: ({ message, sender }) => this.changedPassword(message, sender), bgCloseNotificationBar: ({ message, sender }) => this.handleCloseNotificationBarMessage(message, sender), + bgOpenAtRisksPasswords: ({ message, sender }) => + this.handleOpenAtRisksPasswordsMessage(message, sender), bgGetActiveUserServerConfig: () => this.getActiveUserServerConfig(), bgGetDecryptedCiphers: () => this.getNotificationCipherData(), bgGetEnableChangedPasswordPrompt: () => this.getEnableChangedPasswordPrompt(), @@ -106,6 +118,8 @@ export default class NotificationBackground { private policyService: PolicyService, private themeStateService: ThemeStateService, private userNotificationSettingsService: UserNotificationSettingsServiceAbstraction, + private taskService: TaskService, + protected messagingService: MessagingService, ) {} init() { @@ -154,23 +168,48 @@ export default class NotificationBackground { firstValueFrom(this.domainSettingsService.showFavicons$), firstValueFrom(this.environmentService.environment$), ]); + const iconsServerUrl = env.getIconsUrl(); const activeUserId = await firstValueFrom( this.accountService.activeAccount$.pipe(getOptionalUserId), ); + const decryptedCiphers = await this.cipherService.getAllDecryptedForUrl( - currentTab.url, + currentTab?.url, activeUserId, ); + const organizations = await firstValueFrom( + this.organizationService.organizations$(activeUserId), + ); + return decryptedCiphers.map((view) => { - const { id, name, reprompt, favorite, login } = view; + const { id, name, reprompt, favorite, login, organizationId } = view; + + const organizationType = organizationId + ? organizations.find((org) => org.id === organizationId)?.productTierType + : null; + + const organizationCategories: OrganizationCategory[] = []; + + if ( + [ProductTierType.Teams, ProductTierType.Enterprise, ProductTierType.TeamsStarter].includes( + organizationType, + ) + ) { + organizationCategories.push(OrganizationCategories.business); + } + if ([ProductTierType.Families, ProductTierType.Free].includes(organizationType)) { + organizationCategories.push(OrganizationCategories.family); + } + return { id, name, type: CipherType.Login, reprompt, favorite, + ...(organizationCategories.length ? { organizationCategories } : {}), icon: buildCipherIcon(iconsServerUrl, view, showFavicons), login: login && { username: login.username, @@ -599,13 +638,13 @@ export default class NotificationBackground { try { await this.cipherService.createWithServer(cipher); await BrowserApi.tabSendMessageData(tab, "saveCipherAttemptCompleted", { - username: String(queueMessage?.username), - cipherId: String(cipher?.id), + username: queueMessage?.username && String(queueMessage.username), + cipherId: cipher?.id && String(cipher.id), }); await BrowserApi.tabSendMessage(tab, { command: "addedCipher" }); } catch (error) { await BrowserApi.tabSendMessageData(tab, "saveCipherAttemptCompleted", { - error: String(error.message), + error: error?.message && String(error.message), }); } } @@ -638,15 +677,49 @@ export default class NotificationBackground { return; } const cipher = await this.cipherService.encrypt(cipherView, userId); + + const shouldGetTasks = await this.getNotificationFlag(); + try { + const tasks = shouldGetTasks ? await this.getSecurityTasks(userId) : []; + const updatedCipherTask = tasks.find((task) => task.cipherId === cipherView?.id); + const cipherHasTask = !!updatedCipherTask?.id; + + let taskOrgName: string; + if (cipherHasTask && updatedCipherTask?.organizationId) { + const userOrgs = await this.getOrgData(); + taskOrgName = userOrgs.find(({ id }) => id === updatedCipherTask.organizationId)?.name; + } + + const taskData = cipherHasTask + ? { + remainingTasksCount: tasks.length - 1, + orgName: taskOrgName, + } + : undefined; + await this.cipherService.updateWithServer(cipher); + await BrowserApi.tabSendMessageData(tab, "saveCipherAttemptCompleted", { - username: String(cipherView?.login?.username), - cipherId: String(cipherView?.id), + username: cipherView?.login?.username && String(cipherView.login.username), + cipherId: cipherView?.id && String(cipherView.id), + task: taskData, }); + + // If the cipher had a security task, mark it as complete + if (cipherHasTask) { + // guard against multiple (redundant) security tasks per cipher + await Promise.all( + tasks.map((task) => { + if (task.cipherId === cipherView?.id) { + return this.taskService.markAsComplete(task.id, userId); + } + }), + ); + } } catch (error) { await BrowserApi.tabSendMessageData(tab, "saveCipherAttemptCompleted", { - error: String(error?.message), + error: error?.message && String(error.message), }); } } @@ -699,6 +772,32 @@ export default class NotificationBackground { return null; } + private async getSecurityTasks(userId: UserId) { + let tasks: SecurityTask[] = []; + + if (userId) { + tasks = await firstValueFrom( + this.taskService.tasksEnabled$(userId).pipe( + switchMap((tasksEnabled) => { + if (!tasksEnabled) { + return []; + } + + return this.taskService + .pendingTasks$(userId) + .pipe( + map((tasks) => + tasks.filter(({ type }) => type === SecurityTaskType.UpdateAtRiskCredential), + ), + ); + }), + ), + ); + } + + return tasks; + } + /** * Saves the current tab's domain to the never save list. * @@ -743,7 +842,12 @@ export default class NotificationBackground { private async removeIndividualVault(): Promise { return await firstValueFrom( - this.policyService.policyAppliesToActiveUser$(PolicyType.PersonalOwnership), + this.accountService.activeAccount$.pipe( + getUserId, + switchMap((userId) => + this.policyService.policyAppliesToUser$(PolicyType.PersonalOwnership, userId), + ), + ), ); } @@ -814,6 +918,41 @@ export default class NotificationBackground { }); } + /** + * Sends a message to the background to open the + * at-risk passwords extension view. Triggers + * notification closure as a side-effect. + * + * @param message - The extension message + * @param sender - The contextual sender of the message + */ + private async handleOpenAtRisksPasswordsMessage( + message: NotificationBackgroundExtensionMessage, + sender: chrome.runtime.MessageSender, + ) { + const browserAction = BrowserApi.getBrowserAction(); + + try { + // Set route of the popup before attempting to open it. + // If the vault is locked, this won't have an effect as the auth guards will + // redirect the user to the login page. + await browserAction.setPopup({ popup: "popup/index.html#/at-risk-passwords" }); + + await Promise.all([ + this.messagingService.send(VaultMessages.OpenAtRiskPasswords), + BrowserApi.tabSendMessageData(sender.tab, "closeNotificationBar", { + fadeOutNotification: !!message.fadeOutNotification, + }), + ]); + } finally { + // Reset the popup route to the default route so any subsequent + // popup openings will not open to the at-risk-passwords page. + await browserAction.setPopup({ + popup: "popup/index.html#/", + }); + } + } + /** * Sends a message back to the sender tab which triggers * an CSS adjustment of the notification bar. diff --git a/apps/browser/src/autofill/background/overlay-notifications.background.spec.ts b/apps/browser/src/autofill/background/overlay-notifications.background.spec.ts index 57930496978..a51757dabea 100644 --- a/apps/browser/src/autofill/background/overlay-notifications.background.spec.ts +++ b/apps/browser/src/autofill/background/overlay-notifications.background.spec.ts @@ -1,8 +1,6 @@ import { mock, MockProxy } from "jest-mock-extended"; -import { BehaviorSubject } from "rxjs"; import { CLEAR_NOTIFICATION_LOGIN_DATA_DURATION } from "@bitwarden/common/autofill/constants"; -import { ConfigService } from "@bitwarden/common/platform/abstractions/config/config.service"; import { ServerConfig } from "@bitwarden/common/platform/abstractions/config/server-config"; import { LogService } from "@bitwarden/common/platform/abstractions/log.service"; import { EnvironmentServerConfigData } from "@bitwarden/common/platform/models/data/server-config.data"; @@ -25,8 +23,6 @@ import { OverlayNotificationsBackground } from "./overlay-notifications.backgrou describe("OverlayNotificationsBackground", () => { let logService: MockProxy; - let getFeatureFlagMock$: BehaviorSubject; - let configService: MockProxy; let notificationBackground: NotificationBackground; let getEnableChangedPasswordPromptSpy: jest.SpyInstance; let getEnableAddedLoginPromptSpy: jest.SpyInstance; @@ -35,10 +31,6 @@ describe("OverlayNotificationsBackground", () => { beforeEach(async () => { jest.useFakeTimers(); logService = mock(); - getFeatureFlagMock$ = new BehaviorSubject(true); - configService = mock({ - getFeatureFlag$: jest.fn().mockReturnValue(getFeatureFlagMock$), - }); notificationBackground = mock(); getEnableChangedPasswordPromptSpy = jest .spyOn(notificationBackground, "getEnableChangedPasswordPrompt") @@ -48,10 +40,8 @@ describe("OverlayNotificationsBackground", () => { .mockResolvedValue(true); overlayNotificationsBackground = new OverlayNotificationsBackground( logService, - configService, notificationBackground, ); - configService.getFeatureFlag.mockResolvedValue(true); await overlayNotificationsBackground.init(); }); @@ -60,27 +50,6 @@ describe("OverlayNotificationsBackground", () => { jest.clearAllTimers(); }); - describe("feature flag behavior", () => { - let runtimeRemoveListenerSpy: jest.SpyInstance; - - beforeEach(() => { - runtimeRemoveListenerSpy = jest.spyOn(chrome.runtime.onMessage, "removeListener"); - }); - - it("removes the extension listeners if the current flag value is set to `false`", () => { - getFeatureFlagMock$.next(false); - - expect(runtimeRemoveListenerSpy).toHaveBeenCalled(); - }); - - it("ignores the feature flag change if the previous flag value is equal to the current flag value", () => { - getFeatureFlagMock$.next(false); - getFeatureFlagMock$.next(false); - - expect(runtimeRemoveListenerSpy).toHaveBeenCalledTimes(1); - }); - }); - describe("setting up the form submission listeners", () => { let fields: MockProxy[]; let details: MockProxy; diff --git a/apps/browser/src/autofill/background/overlay-notifications.background.ts b/apps/browser/src/autofill/background/overlay-notifications.background.ts index ce30dd462b3..5c85ce132d7 100644 --- a/apps/browser/src/autofill/background/overlay-notifications.background.ts +++ b/apps/browser/src/autofill/background/overlay-notifications.background.ts @@ -1,11 +1,8 @@ // FIXME: Update this file to be type safe and remove this and next line // @ts-strict-ignore -import { startWith, Subject, Subscription, switchMap, timer } from "rxjs"; -import { pairwise } from "rxjs/operators"; +import { Subject, switchMap, timer } from "rxjs"; import { CLEAR_NOTIFICATION_LOGIN_DATA_DURATION } from "@bitwarden/common/autofill/constants"; -import { FeatureFlag } from "@bitwarden/common/enums/feature-flag.enum"; -import { ConfigService } from "@bitwarden/common/platform/abstractions/config/config.service"; import { LogService } from "@bitwarden/common/platform/abstractions/log.service"; import { BrowserApi } from "../../platform/browser/browser-api"; @@ -26,7 +23,6 @@ export class OverlayNotificationsBackground implements OverlayNotificationsBackg private websiteOriginsWithFields: WebsiteOriginsWithFields = new Map(); private activeFormSubmissionRequests: ActiveFormSubmissionRequests = new Set(); private modifyLoginCipherFormData: ModifyLoginCipherFormDataForTab = new Map(); - private featureFlagState$: Subscription; private clearLoginCipherFormDataSubject: Subject = new Subject(); private notificationFallbackTimeout: number | NodeJS.Timeout | null; private readonly formSubmissionRequestMethods: Set = new Set(["POST", "PUT", "PATCH"]); @@ -38,7 +34,6 @@ export class OverlayNotificationsBackground implements OverlayNotificationsBackg constructor( private logService: LogService, - private configService: ConfigService, private notificationBackground: NotificationBackground, ) {} @@ -46,35 +41,13 @@ export class OverlayNotificationsBackground implements OverlayNotificationsBackg * Initialize the overlay notifications background service. */ async init() { - this.featureFlagState$ = this.configService - .getFeatureFlag$(FeatureFlag.NotificationBarAddLoginImprovements) - .pipe(startWith(undefined), pairwise()) - .subscribe(([prev, current]) => this.handleInitFeatureFlagChange(prev, current)); + this.setupExtensionListeners(); + this.clearLoginCipherFormDataSubject .pipe(switchMap(() => timer(CLEAR_NOTIFICATION_LOGIN_DATA_DURATION))) .subscribe(() => this.modifyLoginCipherFormData.clear()); } - /** - * Handles enabling/disabling the extension listeners that trigger the - * overlay notifications based on the feature flag state. - * - * @param previousValue - The previous value of the feature flag - * @param currentValue - The current value of the feature flag - */ - private handleInitFeatureFlagChange = (previousValue: boolean, currentValue: boolean) => { - if (previousValue === currentValue) { - return; - } - - if (currentValue) { - this.setupExtensionListeners(); - return; - } - - this.removeExtensionListeners(); - }; - /** * Handles the response from the content script with the page details. Triggers an initialization * of the add login or change password notification if the conditions are met. @@ -520,15 +493,6 @@ export class OverlayNotificationsBackground implements OverlayNotificationsBackg chrome.tabs.onUpdated.addListener(this.handleTabUpdated); } - /** - * Removes the listeners for the extension messages and the tab events. - */ - private removeExtensionListeners() { - BrowserApi.removeListener(chrome.runtime.onMessage, this.handleExtensionMessage); - chrome.tabs.onRemoved.removeListener(this.handleTabRemoved); - chrome.tabs.onUpdated.removeListener(this.handleTabUpdated); - } - /** * Handles messages that are sent to the extension background. * diff --git a/apps/browser/src/autofill/background/overlay.background.spec.ts b/apps/browser/src/autofill/background/overlay.background.spec.ts index 3085dbc2f8d..0fe4a459048 100644 --- a/apps/browser/src/autofill/background/overlay.background.spec.ts +++ b/apps/browser/src/autofill/background/overlay.background.spec.ts @@ -117,7 +117,6 @@ describe("OverlayBackground", () => { let getFrameDetailsSpy: jest.SpyInstance; let tabsSendMessageSpy: jest.SpyInstance; let tabSendMessageDataSpy: jest.SpyInstance; - let sendMessageSpy: jest.SpyInstance; let getTabFromCurrentWindowIdSpy: jest.SpyInstance; let getTabSpy: jest.SpyInstance; let openUnlockPopoutSpy: jest.SpyInstance; @@ -228,7 +227,6 @@ describe("OverlayBackground", () => { tabSendMessageDataSpy = jest .spyOn(BrowserApi, "tabSendMessageData") .mockImplementation(() => Promise.resolve()); - sendMessageSpy = jest.spyOn(BrowserApi, "sendMessage"); getTabFromCurrentWindowIdSpy = jest.spyOn(BrowserApi, "getTabFromCurrentWindowId"); getTabSpy = jest.spyOn(BrowserApi, "getTab"); openUnlockPopoutSpy = jest.spyOn(overlayBackground as any, "openUnlockPopout"); @@ -1553,7 +1551,6 @@ describe("OverlayBackground", () => { await flushPromises(); expect(cipherService.setAddEditCipherInfo).toHaveBeenCalled(); - expect(sendMessageSpy).toHaveBeenCalledWith("inlineAutofillMenuRefreshAddEditCipher"); expect(openAddEditVaultItemPopoutSpy).toHaveBeenCalled(); }); @@ -1579,7 +1576,6 @@ describe("OverlayBackground", () => { await flushPromises(); expect(cipherService.setAddEditCipherInfo).toHaveBeenCalled(); - expect(sendMessageSpy).toHaveBeenCalledWith("inlineAutofillMenuRefreshAddEditCipher"); expect(openAddEditVaultItemPopoutSpy).toHaveBeenCalled(); }); @@ -1618,7 +1614,6 @@ describe("OverlayBackground", () => { await flushPromises(); expect(cipherService.setAddEditCipherInfo).toHaveBeenCalled(); - expect(sendMessageSpy).toHaveBeenCalledWith("inlineAutofillMenuRefreshAddEditCipher"); expect(openAddEditVaultItemPopoutSpy).toHaveBeenCalled(); }); diff --git a/apps/browser/src/autofill/background/overlay.background.ts b/apps/browser/src/autofill/background/overlay.background.ts index 454b12cdcea..4e2e773a0c7 100644 --- a/apps/browser/src/autofill/background/overlay.background.ts +++ b/apps/browser/src/autofill/background/overlay.background.ts @@ -1852,7 +1852,7 @@ export class OverlayBackground implements OverlayBackgroundInterface { /** * Verifies whether the save login inline menu view should be shown. This requires that - * the login data on the page contains a username and either a current or new password. + * the login data on the page contains either a current or new password. * * @param tab - The tab to check for login data */ @@ -1869,7 +1869,7 @@ export class OverlayBackground implements OverlayBackgroundInterface { return ( (this.shouldShowInlineMenuAccountCreation() || this.focusedFieldMatchesFillType(InlineMenuFillType.PasswordGeneration)) && - !!(loginData.username && (loginData.password || loginData.newPassword)) + !!(loginData.password || loginData.newPassword) ); } @@ -2100,6 +2100,7 @@ export class OverlayBackground implements OverlayBackgroundInterface { } this.closeInlineMenu(sender); + await this.openViewVaultItemPopout(sender.tab, { cipherId: cipher.id, action: SHOW_AUTOFILL_BUTTON, @@ -2156,7 +2157,7 @@ export class OverlayBackground implements OverlayBackgroundInterface { "passwordRegenerated", "passwords", "regeneratePassword", - "saveLoginToBitwarden", + "saveToBitwarden", "toggleBitwardenVaultOverlay", "totpCodeAria", "totpSecondsSpanAria", @@ -2433,7 +2434,6 @@ export class OverlayBackground implements OverlayBackgroundInterface { cipherId: cipherView.id, cipherType: addNewCipherType, }); - await BrowserApi.sendMessage("inlineAutofillMenuRefreshAddEditCipher"); } catch (error) { this.logService.error("Error building cipher and opening add/edit vault item popout", error); } diff --git a/apps/browser/src/autofill/background/tabs.background.ts b/apps/browser/src/autofill/background/tabs.background.ts index b07e06234d3..c093f1a3b00 100644 --- a/apps/browser/src/autofill/background/tabs.background.ts +++ b/apps/browser/src/autofill/background/tabs.background.ts @@ -1,7 +1,3 @@ -// FIXME: Update this file to be type safe and remove this and next line -// @ts-strict-ignore -import { FeatureFlag } from "@bitwarden/common/enums/feature-flag.enum"; - import MainBackground from "../../background/main.background"; import { OverlayBackground } from "./abstractions/overlay.background"; @@ -14,7 +10,7 @@ export default class TabsBackground { private overlayBackground: OverlayBackground, ) {} - private focusedWindowId: number; + private focusedWindowId: number = -1; /** * Initializes the window and tab listeners. @@ -90,14 +86,6 @@ export default class TabsBackground { changeInfo: chrome.tabs.TabChangeInfo, tab: chrome.tabs.Tab, ) => { - const overlayImprovementsFlag = await this.main.configService.getFeatureFlag( - FeatureFlag.InlineMenuPositioningImprovements, - ); - const removePageDetailsStatus = new Set(["loading", "unloaded"]); - if (!overlayImprovementsFlag && removePageDetailsStatus.has(changeInfo.status)) { - this.overlayBackground.removePageDetails(tabId); - } - if (this.focusedWindowId > 0 && tab.windowId !== this.focusedWindowId) { return; } diff --git a/apps/browser/src/autofill/content/components/buttons/action-button.ts b/apps/browser/src/autofill/content/components/buttons/action-button.ts index f0642d4233a..881b44b4785 100644 --- a/apps/browser/src/autofill/content/components/buttons/action-button.ts +++ b/apps/browser/src/autofill/content/components/buttons/action-button.ts @@ -1,5 +1,5 @@ import { css } from "@emotion/css"; -import { html } from "lit"; +import { html, TemplateResult } from "lit"; import { Theme } from "@bitwarden/common/platform/enums"; @@ -11,7 +11,7 @@ export function ActionButton({ theme, handleClick, }: { - buttonText: string; + buttonText: string | TemplateResult; disabled?: boolean; theme: Theme; handleClick: (e: Event) => void; @@ -63,4 +63,9 @@ const actionButtonStyles = ({ disabled, theme }: { disabled: boolean; theme: The color: ${themes[theme].text.contrast}; } `} + + svg { + width: fit-content; + height: 16px; + } `; diff --git a/apps/browser/src/autofill/content/components/buttons/close-button.ts b/apps/browser/src/autofill/content/components/buttons/close-button.ts index c32d0c130e3..05a12d4f453 100644 --- a/apps/browser/src/autofill/content/components/buttons/close-button.ts +++ b/apps/browser/src/autofill/content/components/buttons/close-button.ts @@ -35,5 +35,6 @@ const closeButtonStyles = (theme: Theme) => css` > svg { width: 20px; height: 20px; + vertical-align: middle; } `; diff --git a/apps/browser/src/autofill/content/components/buttons/option-selection-button.ts b/apps/browser/src/autofill/content/components/buttons/option-selection-button.ts index cf9a561ee39..e3c7e0d54e6 100644 --- a/apps/browser/src/autofill/content/components/buttons/option-selection-button.ts +++ b/apps/browser/src/autofill/content/components/buttons/option-selection-button.ts @@ -44,7 +44,7 @@ export function OptionSelectionButton({ `; } -const iconSize = "15px"; +const iconSize = "16px"; const selectionButtonStyles = ({ disabled, @@ -94,7 +94,8 @@ const selectionButtonStyles = ({ > svg { max-width: ${iconSize}; - height: fit-content; + max-height: ${iconSize}; + height: auto; } `; diff --git a/apps/browser/src/autofill/content/components/cipher/cipher-action.ts b/apps/browser/src/autofill/content/components/cipher/cipher-action.ts index 2d386d34d6a..aaa4b11d8a2 100644 --- a/apps/browser/src/autofill/content/components/cipher/cipher-action.ts +++ b/apps/browser/src/autofill/content/components/cipher/cipher-action.ts @@ -19,13 +19,13 @@ export function CipherAction({ ? BadgeButton({ buttonAction: handleAction, // @TODO localize - buttonText: "Update item", + buttonText: "Update", theme, }) : EditButton({ buttonAction: handleAction, // @TODO localize - buttonText: "Edit item", + buttonText: "Edit", theme, }); } diff --git a/apps/browser/src/autofill/content/components/cipher/cipher-indicator-icons.ts b/apps/browser/src/autofill/content/components/cipher/cipher-indicator-icons.ts index 39d4dd28f24..5e78fd5658a 100644 --- a/apps/browser/src/autofill/content/components/cipher/cipher-indicator-icons.ts +++ b/apps/browser/src/autofill/content/components/cipher/cipher-indicator-icons.ts @@ -1,30 +1,35 @@ import { css } from "@emotion/css"; -import { html } from "lit"; +import { html, TemplateResult } from "lit"; import { Theme } from "@bitwarden/common/platform/enums"; import { themes } from "../../../content/components/constants/styles"; import { Business, Family } from "../../../content/components/icons"; -// @TODO connect data source to icon checks -// @TODO support other indicator types (attachments, etc) +import { OrganizationCategories, OrganizationCategory } from "./types"; + +const cipherIndicatorIconsMap: Record< + OrganizationCategory, + (args: { color: string; theme: Theme }) => TemplateResult +> = { + [OrganizationCategories.business]: Business, + [OrganizationCategories.family]: Family, +}; + export function CipherInfoIndicatorIcons({ - showBusinessIcon, - showFamilyIcon, + organizationCategories = [], theme, }: { - showBusinessIcon?: boolean; - showFamilyIcon?: boolean; + organizationCategories?: OrganizationCategory[]; theme: Theme; }) { - const indicatorIcons = [ - ...(showBusinessIcon ? [Business({ color: themes[theme].text.muted, theme })] : []), - ...(showFamilyIcon ? [Family({ color: themes[theme].text.muted, theme })] : []), - ]; - - return indicatorIcons.length - ? html` ${indicatorIcons} ` - : null; // @TODO null case should be handled by parent + return html` + + ${organizationCategories.map((name) => + cipherIndicatorIconsMap[name]?.({ color: themes[theme].text.muted, theme }), + )} + + `; } const cipherInfoIndicatorIconsStyles = css` diff --git a/apps/browser/src/autofill/content/components/cipher/cipher-info.ts b/apps/browser/src/autofill/content/components/cipher/cipher-info.ts index 6ff32353938..e3d237b9bc6 100644 --- a/apps/browser/src/autofill/content/components/cipher/cipher-info.ts +++ b/apps/browser/src/autofill/content/components/cipher/cipher-info.ts @@ -1,5 +1,5 @@ import { css } from "@emotion/css"; -import { html } from "lit"; +import { html, nothing } from "lit"; import { Theme } from "@bitwarden/common/platform/enums"; @@ -8,14 +8,22 @@ import { themes, typography } from "../../../content/components/constants/styles import { CipherInfoIndicatorIcons } from "./cipher-indicator-icons"; import { NotificationCipherData } from "./types"; -// @TODO support other cipher types (card, identity, notes, etc) export function CipherInfo({ cipher, theme }: { cipher: NotificationCipherData; theme: Theme }) { - const { name, login } = cipher; + const { name, login, organizationCategories } = cipher; + const hasIndicatorIcons = organizationCategories?.length; return html`
- ${[name, CipherInfoIndicatorIcons({ theme })]} + ${[ + name, + hasIndicatorIcons + ? CipherInfoIndicatorIcons({ + theme, + organizationCategories, + }) + : nothing, + ]} ${login?.username diff --git a/apps/browser/src/autofill/content/components/cipher/types.ts b/apps/browser/src/autofill/content/components/cipher/types.ts index ff29f9b559f..590311682bf 100644 --- a/apps/browser/src/autofill/content/components/cipher/types.ts +++ b/apps/browser/src/autofill/content/components/cipher/types.ts @@ -14,6 +14,14 @@ export const CipherRepromptTypes = { type CipherRepromptType = (typeof CipherRepromptTypes)[keyof typeof CipherRepromptTypes]; +export type OrganizationCategory = + (typeof OrganizationCategories)[keyof typeof OrganizationCategories]; + +export const OrganizationCategories = { + business: "business", + family: "family", +} as const; + export type WebsiteIconData = { imageEnabled: boolean; image: string; @@ -50,4 +58,5 @@ export type NotificationCipherData = BaseCipherData & login?: { username: string; }; + organizationCategories?: OrganizationCategory[]; }; diff --git a/apps/browser/src/autofill/content/components/icons/angle-down.ts b/apps/browser/src/autofill/content/components/icons/angle-down.ts index db5275aafa9..27cd5ab81c5 100644 --- a/apps/browser/src/autofill/content/components/icons/angle-down.ts +++ b/apps/browser/src/autofill/content/components/icons/angle-down.ts @@ -8,10 +8,10 @@ export function AngleDown({ color, disabled, theme }: IconProps) { const shapeColor = disabled ? themes[theme].secondary["300"] : color || themes[theme].text.main; return html` - + `; diff --git a/apps/browser/src/autofill/content/components/icons/angle-up.ts b/apps/browser/src/autofill/content/components/icons/angle-up.ts index 7344123d5ad..f8bda632285 100644 --- a/apps/browser/src/autofill/content/components/icons/angle-up.ts +++ b/apps/browser/src/autofill/content/components/icons/angle-up.ts @@ -8,15 +8,10 @@ export function AngleUp({ color, disabled, theme }: IconProps) { const shapeColor = disabled ? themes[theme].secondary["300"] : color || themes[theme].text.main; return html` - + `; diff --git a/apps/browser/src/autofill/content/components/icons/brand-icon-container.ts b/apps/browser/src/autofill/content/components/icons/brand-icon-container.ts index 8df68d79b6e..1b08f261eb6 100644 --- a/apps/browser/src/autofill/content/components/icons/brand-icon-container.ts +++ b/apps/browser/src/autofill/content/components/icons/brand-icon-container.ts @@ -12,8 +12,13 @@ export function BrandIconContainer({ iconLink, theme }: { iconLink?: URL; theme: } const brandIconContainerStyles = css` + display: flex; + justify-content: center; + width: 24px; + height: 24px; + > svg { - width: 20px; - height: fit-content; + width: auto; + height: 100%; } `; diff --git a/apps/browser/src/autofill/content/components/icons/business.ts b/apps/browser/src/autofill/content/components/icons/business.ts index ef8e082c21f..79e64a0a1f9 100644 --- a/apps/browser/src/autofill/content/components/icons/business.ts +++ b/apps/browser/src/autofill/content/components/icons/business.ts @@ -8,30 +8,17 @@ export function Business({ color, disabled, theme }: IconProps) { const shapeColor = disabled ? themes[theme].secondary["300"] : color || themes[theme].text.main; return html` - + - - `; } diff --git a/apps/browser/src/autofill/content/components/icons/close.ts b/apps/browser/src/autofill/content/components/icons/close.ts index c9d9286ca3f..27610bc7773 100644 --- a/apps/browser/src/autofill/content/components/icons/close.ts +++ b/apps/browser/src/autofill/content/components/icons/close.ts @@ -8,10 +8,10 @@ export function Close({ color, disabled, theme }: IconProps) { const shapeColor = disabled ? themes[theme].secondary["300"] : color || themes[theme].text.main; return html` - + `; diff --git a/apps/browser/src/autofill/content/components/icons/collection-shared.ts b/apps/browser/src/autofill/content/components/icons/collection-shared.ts new file mode 100644 index 00000000000..de366b88e92 --- /dev/null +++ b/apps/browser/src/autofill/content/components/icons/collection-shared.ts @@ -0,0 +1,23 @@ +import { css } from "@emotion/css"; +import { html } from "lit"; + +import { IconProps } from "../common-types"; +import { buildIconColorRule, ruleNames, themes } from "../constants/styles"; + +export function CollectionShared({ color, disabled, theme }: IconProps) { + const shapeColor = disabled ? themes[theme].secondary["300"] : color || themes[theme].text.main; + + return html` + + + + + `; +} diff --git a/apps/browser/src/autofill/content/components/icons/exclamation-triangle.ts b/apps/browser/src/autofill/content/components/icons/exclamation-triangle.ts index d87d5621e30..c4f587b2d7b 100644 --- a/apps/browser/src/autofill/content/components/icons/exclamation-triangle.ts +++ b/apps/browser/src/autofill/content/components/icons/exclamation-triangle.ts @@ -8,10 +8,20 @@ export function ExclamationTriangle({ color, disabled, theme }: IconProps) { const shapeColor = disabled ? themes[theme].secondary["300"] : color || themes[theme].text.main; return html` - + + + `; diff --git a/apps/browser/src/autofill/content/components/icons/external-link.ts b/apps/browser/src/autofill/content/components/icons/external-link.ts new file mode 100644 index 00000000000..10c6d831025 --- /dev/null +++ b/apps/browser/src/autofill/content/components/icons/external-link.ts @@ -0,0 +1,22 @@ +import { css } from "@emotion/css"; +import { html } from "lit"; + +import { IconProps } from "../common-types"; +import { buildIconColorRule, ruleNames, themes } from "../constants/styles"; + +export function ExternalLink({ color, disabled, theme }: IconProps) { + const shapeColor = disabled ? themes[theme].secondary["300"] : color || themes[theme].text.main; + + return html` + + + + + `; +} diff --git a/apps/browser/src/autofill/content/components/icons/family.ts b/apps/browser/src/autofill/content/components/icons/family.ts index 9870c5d37c0..4a9db91f43a 100644 --- a/apps/browser/src/autofill/content/components/icons/family.ts +++ b/apps/browser/src/autofill/content/components/icons/family.ts @@ -8,10 +8,11 @@ export function Family({ color, disabled, theme }: IconProps) { const shapeColor = disabled ? themes[theme].secondary["300"] : color || themes[theme].text.main; return html` - + `; diff --git a/apps/browser/src/autofill/content/components/icons/folder.ts b/apps/browser/src/autofill/content/components/icons/folder.ts index 84577aef820..1b93d2d32ea 100644 --- a/apps/browser/src/autofill/content/components/icons/folder.ts +++ b/apps/browser/src/autofill/content/components/icons/folder.ts @@ -8,10 +8,11 @@ export function Folder({ color, disabled, theme }: IconProps) { const shapeColor = disabled ? themes[theme].secondary["300"] : color || themes[theme].text.main; return html` - + `; diff --git a/apps/browser/src/autofill/content/components/icons/globe.ts b/apps/browser/src/autofill/content/components/icons/globe.ts index fc0a975284d..936fd8d2802 100644 --- a/apps/browser/src/autofill/content/components/icons/globe.ts +++ b/apps/browser/src/autofill/content/components/icons/globe.ts @@ -8,11 +8,10 @@ export function Globe({ color, disabled, theme }: IconProps) { const shapeColor = disabled ? themes[theme].secondary["300"] : color || themes[theme].text.main; return html` - + `; diff --git a/apps/browser/src/autofill/content/components/icons/index.ts b/apps/browser/src/autofill/content/components/icons/index.ts index c4769a0e69d..65ec6301ac4 100644 --- a/apps/browser/src/autofill/content/components/icons/index.ts +++ b/apps/browser/src/autofill/content/components/icons/index.ts @@ -3,12 +3,12 @@ export { AngleUp } from "./angle-up"; export { BrandIconContainer } from "./brand-icon-container"; export { Business } from "./business"; export { Close } from "./close"; +export { CollectionShared } from "./collection-shared"; export { ExclamationTriangle } from "./exclamation-triangle"; +export { ExternalLink } from "./external-link"; export { Family } from "./family"; export { Folder } from "./folder"; export { Globe } from "./globe"; -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/pencil-square.ts b/apps/browser/src/autofill/content/components/icons/pencil-square.ts index f41ab927809..11366f2631a 100644 --- a/apps/browser/src/autofill/content/components/icons/pencil-square.ts +++ b/apps/browser/src/autofill/content/components/icons/pencil-square.ts @@ -8,10 +8,14 @@ export function PencilSquare({ color, disabled, theme }: IconProps) { const shapeColor = disabled ? themes[theme].secondary["300"] : color || themes[theme].text.main; return html` - + + `; diff --git a/apps/browser/src/autofill/content/components/icons/shield.ts b/apps/browser/src/autofill/content/components/icons/shield.ts index 5a2d7d39d58..a027dd3e113 100644 --- a/apps/browser/src/autofill/content/components/icons/shield.ts +++ b/apps/browser/src/autofill/content/components/icons/shield.ts @@ -8,10 +8,10 @@ export function Shield({ color, theme }: IconProps) { const shapeColor = color || themes[theme].brandLogo; return html` - + `; diff --git a/apps/browser/src/autofill/content/components/icons/user.ts b/apps/browser/src/autofill/content/components/icons/user.ts index 32ccd3a2031..b59204a0ad8 100644 --- a/apps/browser/src/autofill/content/components/icons/user.ts +++ b/apps/browser/src/autofill/content/components/icons/user.ts @@ -8,10 +8,10 @@ export function User({ color, disabled, theme }: IconProps) { const shapeColor = disabled ? themes[theme].secondary["300"] : color || themes[theme].text.main; return html` - + `; diff --git a/apps/browser/src/autofill/content/components/icons/warning.ts b/apps/browser/src/autofill/content/components/icons/warning.ts deleted file mode 100644 index 9ae9aeca352..00000000000 --- a/apps/browser/src/autofill/content/components/icons/warning.ts +++ /dev/null @@ -1,23 +0,0 @@ -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/icons/party-horn.ts b/apps/browser/src/autofill/content/components/illustrations/celebrate.ts similarity index 98% rename from apps/browser/src/autofill/content/components/icons/party-horn.ts rename to apps/browser/src/autofill/content/components/illustrations/celebrate.ts index 439d60a79de..30b3743004f 100644 --- a/apps/browser/src/autofill/content/components/icons/party-horn.ts +++ b/apps/browser/src/autofill/content/components/illustrations/celebrate.ts @@ -5,16 +5,10 @@ import { ThemeTypes } from "@bitwarden/common/platform/enums"; import { IconProps } from "../common-types"; // This icon has static multi-colors for each theme -export function PartyHorn({ theme }: IconProps) { +export function Celebrate({ theme }: IconProps) { if (theme === ThemeTypes.Dark) { return html` - + + + + + + + + + + + + + + + + + + + + + + + `; + } + + return html` + + + + + + + + + + + + + + + + + + + + + + `; +} diff --git a/apps/browser/src/autofill/content/components/illustrations/warning.ts b/apps/browser/src/autofill/content/components/illustrations/warning.ts new file mode 100644 index 00000000000..4e15a09839a --- /dev/null +++ b/apps/browser/src/autofill/content/components/illustrations/warning.ts @@ -0,0 +1,22 @@ +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/.lit-docs/icons.mdx b/apps/browser/src/autofill/content/components/lit-stories/.lit-docs/icons.mdx index f85cf3ae90f..571ed10285a 100644 --- a/apps/browser/src/autofill/content/components/lit-stories/.lit-docs/icons.mdx +++ b/apps/browser/src/autofill/content/components/lit-stories/.lit-docs/icons.mdx @@ -2,7 +2,7 @@ import { Meta, Controls } from "@storybook/addon-docs"; import * as stories from "./icons.lit-stories"; - + ## Icon Stories @@ -14,12 +14,12 @@ like size, color, and theme. Each story is an example of how a specific icon can | | | | ------------------------- | ------------------ | -| `AngleDownIcon` | `FolderIcon` | -| `BusinessIcon` | `GlobeIcon` | -| `BrandIcon` | `PartyHornIcon` | +| `AngleDownIcon` | `AngleUpIcon` | +| `BusinessIcon` | `FolderIcon` | +| `BrandIcon` | `GlobeIcon` | | `CloseIcon` | `PencilSquareIcon` | | `ExclamationTriangleIcon` | `ShieldIcon` | -| `FamilyIcon` | `UserIcon` | +| `UsersIcon` | `UserIcon` | ## Props diff --git a/apps/browser/src/autofill/content/components/lit-stories/ciphers/cipher-indicator-icon.lit-stories.ts b/apps/browser/src/autofill/content/components/lit-stories/ciphers/cipher-indicator-icons.lit-stories.ts similarity index 94% rename from apps/browser/src/autofill/content/components/lit-stories/ciphers/cipher-indicator-icon.lit-stories.ts rename to apps/browser/src/autofill/content/components/lit-stories/ciphers/cipher-indicator-icons.lit-stories.ts index 89c3ecbcb1c..08530452730 100644 --- a/apps/browser/src/autofill/content/components/lit-stories/ciphers/cipher-indicator-icon.lit-stories.ts +++ b/apps/browser/src/autofill/content/components/lit-stories/ciphers/cipher-indicator-icons.lit-stories.ts @@ -12,7 +12,7 @@ type Args = { }; export default { - title: "Components/Ciphers/Cipher Indicator Icon", + title: "Components/Ciphers/Cipher Indicator Icons", argTypes: { showBusinessIcon: { control: "boolean" }, showFamilyIcon: { control: "boolean" }, diff --git a/apps/browser/src/autofill/content/components/lit-stories/icons/icons.lit-stories.ts b/apps/browser/src/autofill/content/components/lit-stories/icons/icons.lit-stories.ts index 20c88a59246..c74895e1dea 100644 --- a/apps/browser/src/autofill/content/components/lit-stories/icons/icons.lit-stories.ts +++ b/apps/browser/src/autofill/content/components/lit-stories/icons/icons.lit-stories.ts @@ -14,7 +14,7 @@ type Args = { }; export default { - title: "Components/Icons/Icons", + title: "Components/Icons", argTypes: { iconLink: { control: "text" }, color: { control: "color" }, @@ -43,24 +43,23 @@ const createIconStory = (iconName: keyof typeof Icons): StoryObj => { render: (args) => Template(args, Icons[iconName]), } as StoryObj; - if (iconName !== "BrandIconContainer") { - story.argTypes = { - iconLink: { table: { disable: true } }, - }; - } + story.argTypes = { + iconLink: { table: { disable: true } }, + }; return story; }; export const AngleDownIcon = createIconStory("AngleDown"); +export const AngleUpIcon = createIconStory("AngleUp"); export const BusinessIcon = createIconStory("Business"); -export const BrandIcon = createIconStory("BrandIconContainer"); export const CloseIcon = createIconStory("Close"); +export const CollectionSharedIcon = createIconStory("CollectionShared"); export const ExclamationTriangleIcon = createIconStory("ExclamationTriangle"); +export const ExternalLinkIcon = createIconStory("ExternalLink"); export const FamilyIcon = createIconStory("Family"); export const FolderIcon = createIconStory("Folder"); export const GlobeIcon = createIconStory("Globe"); -export const PartyHornIcon = createIconStory("PartyHorn"); export const PencilSquareIcon = createIconStory("PencilSquare"); export const ShieldIcon = createIconStory("Shield"); export const UserIcon = createIconStory("User"); diff --git a/apps/browser/src/autofill/content/components/lit-stories/illustrations/illustrations.lit-stories.ts b/apps/browser/src/autofill/content/components/lit-stories/illustrations/illustrations.lit-stories.ts new file mode 100644 index 00000000000..86d55f2f795 --- /dev/null +++ b/apps/browser/src/autofill/content/components/lit-stories/illustrations/illustrations.lit-stories.ts @@ -0,0 +1,44 @@ +import { Meta, StoryObj } from "@storybook/web-components"; +import { html } from "lit"; + +import { Theme, ThemeTypes } from "@bitwarden/common/platform/enums/theme-type.enum"; + +import * as Illustrations from "../../illustrations"; + +type Args = { + theme: Theme; + size: number; +}; + +export default { + title: "Components/Illustrations", + argTypes: { + theme: { control: "select", options: [...Object.values(ThemeTypes)] }, + size: { control: "number", min: 10, max: 100, step: 1 }, + }, + args: { + theme: ThemeTypes.Light, + size: 50, + }, +} as Meta; + +const Template = ( + args: Args, + IllustrationComponent: (props: Args) => ReturnType, +) => html` +
+ ${IllustrationComponent({ ...args })} +
+`; + +const createIllustrationStory = (illustrationName: keyof typeof Illustrations): StoryObj => { + return { + render: (args) => Template(args, Illustrations[illustrationName]), + } as StoryObj; +}; + +export const KeyholeIllustration = createIllustrationStory("Keyhole"); +export const CelebrateIllustration = createIllustrationStory("Celebrate"); +export const WarningIllustration = createIllustrationStory("Warning"); diff --git a/apps/browser/src/autofill/content/components/lit-stories/notification/body.lit-stories.ts b/apps/browser/src/autofill/content/components/lit-stories/notification/body.lit-stories.ts index e43bc08b920..32b4170d1da 100644 --- a/apps/browser/src/autofill/content/components/lit-stories/notification/body.lit-stories.ts +++ b/apps/browser/src/autofill/content/components/lit-stories/notification/body.lit-stories.ts @@ -16,7 +16,7 @@ type Args = { }; export default { - title: "Components/Notifications/Notification Body", + title: "Components/Notifications/Body", argTypes: { ciphers: { control: "object" }, theme: { control: "select", options: [...Object.values(ThemeTypes)] }, 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/body.lit-stories.ts similarity index 53% rename from apps/browser/src/autofill/content/components/lit-stories/notification/confirmation.lit-stories.ts rename to apps/browser/src/autofill/content/components/lit-stories/notification/confirmation/body.lit-stories.ts index b3dee95efd0..4d9be06fd7e 100644 --- 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/body.lit-stories.ts @@ -1,29 +1,26 @@ import { Meta, StoryObj } from "@storybook/web-components"; -import { Theme, ThemeTypes } from "@bitwarden/common/platform/enums"; +import { ThemeTypes } from "@bitwarden/common/platform/enums"; -import { NotificationConfirmationBody } from "../../notification/confirmation"; - -type Args = { - buttonText: string; - confirmationMessage: string; - handleOpenVault: () => void; - theme: Theme; - error: string; -}; +import { + NotificationConfirmationBody, + NotificationConfirmationBodyProps, +} from "../../../notification/confirmation/body"; export default { - title: "Components/Notifications/Notification Confirmation Body", + title: "Components/Notifications/Confirmation/Body", argTypes: { error: { control: "text" }, buttonText: { control: "text" }, confirmationMessage: { control: "text" }, + messageDetails: { control: "text" }, theme: { control: "select", options: [...Object.values(ThemeTypes)] }, }, args: { error: "", buttonText: "View", confirmationMessage: "[item name] updated in Bitwarden.", + messageDetails: "You can view it in your vault.", theme: ThemeTypes.Light, }, parameters: { @@ -32,10 +29,11 @@ export default { url: "https://www.figma.com/design/LEhqLAcBPY8uDKRfU99n9W/Autofill-notification-redesign?node-id=485-20160&m=dev", }, }, -} as Meta; +} as Meta; -const Template = (args: Args) => NotificationConfirmationBody({ ...args }); +const Template = (args: NotificationConfirmationBodyProps) => + NotificationConfirmationBody({ ...args }); -export const Default: StoryObj = { +export const Default: StoryObj = { render: Template, }; diff --git a/apps/browser/src/autofill/content/components/lit-stories/notification/confirmation/container.lit-stories.ts b/apps/browser/src/autofill/content/components/lit-stories/notification/confirmation/container.lit-stories.ts new file mode 100644 index 00000000000..ec7194004d8 --- /dev/null +++ b/apps/browser/src/autofill/content/components/lit-stories/notification/confirmation/container.lit-stories.ts @@ -0,0 +1,55 @@ +import { Meta, StoryObj } from "@storybook/web-components"; + +import { ThemeTypes } from "@bitwarden/common/platform/enums"; + +import { NotificationTypes } from "../../../../../notification/abstractions/notification-bar"; +import { + NotificationConfirmationContainer, + NotificationConfirmationContainerProps, +} from "../../../notification/confirmation/container"; + +export default { + title: "Components/Notifications/Confirmation", + argTypes: { + error: { control: "text" }, + theme: { control: "select", options: [...Object.values(ThemeTypes)] }, + type: { control: "select", options: [NotificationTypes.Change, NotificationTypes.Add] }, + }, + args: { + error: "", + task: { + orgName: "Acme, Inc.", + remainingTasksCount: 0, + }, + handleCloseNotification: () => alert("Close notification action triggered"), + handleOpenTasks: () => alert("Open tasks action triggered"), + i18n: { + loginSaveSuccess: "Login saved", + loginUpdateSuccess: "Login updated", + loginUpdateTaskSuccessAdditional: + "Thank you for making your organization more secure. You have 3 more passwords to update.", + loginUpdateTaskSuccess: + "Great job! You took the steps to make you and your organization more secure.", + nextSecurityTaskAction: "Change next password", + saveFailure: "Error saving", + saveFailureDetails: "Oh no! We couldn't save this. Try entering the details manually.", + view: "View", + }, + type: NotificationTypes.Change, + username: "Acme, Inc. Login", + 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: NotificationConfirmationContainerProps) => + NotificationConfirmationContainer({ ...args }); + +export const Default: StoryObj = { + render: Template, +}; diff --git a/apps/browser/src/autofill/content/components/lit-stories/notification/confirmation/footer.lit-stories.ts b/apps/browser/src/autofill/content/components/lit-stories/notification/confirmation/footer.lit-stories.ts new file mode 100644 index 00000000000..953fb90d067 --- /dev/null +++ b/apps/browser/src/autofill/content/components/lit-stories/notification/confirmation/footer.lit-stories.ts @@ -0,0 +1,36 @@ +import { Meta, StoryObj } from "@storybook/web-components"; +import { html } from "lit"; + +import { ThemeTypes } from "@bitwarden/common/platform/enums/theme-type.enum"; + +import { + NotificationConfirmationFooter, + NotificationConfirmationFooterProps, +} from "../../../notification/confirmation/footer"; + +export default { + title: "Components/Notifications/Confirmation/Footer", + argTypes: { + theme: { control: "select", options: [...Object.values(ThemeTypes)] }, + }, + args: { + handleButtonClick: () => alert("Action button triggered"), + i18n: { + nextSecurityTaskAction: "Change next password", + }, + theme: ThemeTypes.Light, + }, + parameters: { + design: { + type: "figma", + url: "https://www.figma.com/design/LEhqLAcBPY8uDKRfU99n9W/Autofill-notification-redesign?node-id=32-4949&m=dev", + }, + }, +} as Meta; + +const Template = (args: NotificationConfirmationFooterProps) => + html`
${NotificationConfirmationFooter({ ...args })}
`; + +export const Default: StoryObj = { + render: Template, +}; diff --git a/apps/browser/src/autofill/content/components/lit-stories/notification/confirmation/message.lit-stories.ts b/apps/browser/src/autofill/content/components/lit-stories/notification/confirmation/message.lit-stories.ts new file mode 100644 index 00000000000..f01503b331f --- /dev/null +++ b/apps/browser/src/autofill/content/components/lit-stories/notification/confirmation/message.lit-stories.ts @@ -0,0 +1,37 @@ +import { Meta, StoryObj } from "@storybook/web-components"; + +import { ThemeTypes } from "@bitwarden/common/platform/enums"; + +import { + NotificationConfirmationMessage, + NotificationConfirmationMessageProps, +} from "../../../notification/confirmation/message"; + +export default { + title: "Components/Notifications/Confirmation/Message", + argTypes: { + buttonText: { control: "text" }, + message: { control: "text" }, + messageDetails: { control: "text" }, + theme: { control: "select", options: [...Object.values(ThemeTypes)] }, + }, + args: { + buttonText: "View", + message: "[item name] updated in Bitwarden.", + messageDetails: "It was added to your vault.", + 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: NotificationConfirmationMessageProps) => + NotificationConfirmationMessage({ ...args }); + +export const Default: StoryObj = { + render: Template, +}; diff --git a/apps/browser/src/autofill/content/components/lit-stories/notification/container.lit-stories.ts b/apps/browser/src/autofill/content/components/lit-stories/notification/container.lit-stories.ts new file mode 100644 index 00000000000..351c971ec0e --- /dev/null +++ b/apps/browser/src/autofill/content/components/lit-stories/notification/container.lit-stories.ts @@ -0,0 +1,61 @@ +import { Meta, StoryObj } from "@storybook/web-components"; + +import { ThemeTypes } from "@bitwarden/common/platform/enums"; +import { CipherType } from "@bitwarden/common/vault/enums"; +import { CipherRepromptType } from "@bitwarden/common/vault/enums/cipher-reprompt-type"; + +import { NotificationTypes } from "../../../../notification/abstractions/notification-bar"; +import { NotificationContainer, NotificationContainerProps } from "../../notification/container"; + +export default { + title: "Components/Notifications", + argTypes: { + error: { control: "text" }, + theme: { control: "select", options: [...Object.values(ThemeTypes)] }, + type: { control: "select", options: [...Object.values(NotificationTypes)] }, + }, + args: { + error: "", + ciphers: [ + { + id: "1", + name: "Example Cipher", + type: CipherType.Login, + favorite: false, + reprompt: CipherRepromptType.None, + icon: { + imageEnabled: true, + image: "", + fallbackImage: "https://example.com/fallback.png", + icon: "icon-class", + }, + login: { username: "user@example.com" }, + }, + ], + i18n: { + loginSaveSuccess: "Login saved", + loginUpdateSuccess: "Login updated", + saveAction: "Save", + saveAsNewLoginAction: "Save as new login", + saveFailure: "Error saving", + saveFailureDetails: "Oh no! We couldn't save this. Try entering the details manually.", + updateLoginPrompt: "Update existing login?", + view: "View", + }, + type: NotificationTypes.Change, + username: "mockUsername", + 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: NotificationContainerProps) => NotificationContainer({ ...args }); + +export const Default: StoryObj = { + render: Template, +}; diff --git a/apps/browser/src/autofill/content/components/lit-stories/notification/footer.lit-stories.ts b/apps/browser/src/autofill/content/components/lit-stories/notification/footer.lit-stories.ts index ea2bbdc2e15..29d9955ec64 100644 --- a/apps/browser/src/autofill/content/components/lit-stories/notification/footer.lit-stories.ts +++ b/apps/browser/src/autofill/content/components/lit-stories/notification/footer.lit-stories.ts @@ -7,7 +7,7 @@ import { NotificationFooter, NotificationFooterProps } from "../../notification/ import { mockFolderData, mockOrganizationData } from "../mock-data"; export default { - title: "Components/Notifications/Notification Footer", + title: "Components/Notifications/Footer", argTypes: { notificationType: { control: "select", diff --git a/apps/browser/src/autofill/content/components/lit-stories/notification/header.lit-stories.ts b/apps/browser/src/autofill/content/components/lit-stories/notification/header.lit-stories.ts index 49cc1e6bd8d..0857c99130e 100644 --- a/apps/browser/src/autofill/content/components/lit-stories/notification/header.lit-stories.ts +++ b/apps/browser/src/autofill/content/components/lit-stories/notification/header.lit-stories.ts @@ -12,7 +12,7 @@ type Args = { }; export default { - title: "Components/Notifications/Notification Header", + title: "Components/Notifications/Header", argTypes: { message: { control: "text" }, standalone: { control: "boolean" }, diff --git a/apps/browser/src/autofill/content/components/notification/confirmation-message.ts b/apps/browser/src/autofill/content/components/notification/confirmation-message.ts deleted file mode 100644 index d6f7ba3024d..00000000000 --- a/apps/browser/src/autofill/content/components/notification/confirmation-message.ts +++ /dev/null @@ -1,53 +0,0 @@ -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; - 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/body.ts similarity index 63% rename from apps/browser/src/autofill/content/components/notification/confirmation.ts rename to apps/browser/src/autofill/content/components/notification/confirmation/body.ts index 8c213a7663f..d2ac7f36277 100644 --- a/apps/browser/src/autofill/content/components/notification/confirmation.ts +++ b/apps/browser/src/autofill/content/components/notification/confirmation/body.ts @@ -1,12 +1,12 @@ import createEmotion from "@emotion/css/create-instance"; -import { html } from "lit"; +import { html, nothing } from "lit"; import { Theme } from "@bitwarden/common/platform/enums"; -import { themes } from "../constants/styles"; -import { PartyHorn, Warning } from "../icons"; +import { themes } from "../../constants/styles"; +import { Celebrate, Keyhole, Warning } from "../../illustrations"; -import { NotificationConfirmationMessage } from "./confirmation-message"; +import { NotificationConfirmationMessage } from "./message"; export const componentClassPrefix = "notification-confirmation-body"; @@ -14,31 +14,41 @@ const { css } = createEmotion({ key: componentClassPrefix, }); -export function NotificationConfirmationBody({ - buttonText, - error, - confirmationMessage, - theme, - handleOpenVault, -}: { - error?: string; +export type NotificationConfirmationBodyProps = { buttonText: string; confirmationMessage: string; + error?: string; + messageDetails?: string; + tasksAreComplete?: boolean; theme: Theme; handleOpenVault: (e: Event) => void; -}) { - const IconComponent = !error ? PartyHorn : Warning; +}; + +export function NotificationConfirmationBody({ + buttonText, + confirmationMessage, + error, + messageDetails, + tasksAreComplete, + theme, + handleOpenVault, +}: NotificationConfirmationBodyProps) { + const IconComponent = tasksAreComplete ? Keyhole : !error ? Celebrate : Warning; + + const showConfirmationMessage = confirmationMessage || buttonText || messageDetails; + return html`
${IconComponent({ theme })}
- ${confirmationMessage && buttonText + ${showConfirmationMessage ? NotificationConfirmationMessage({ - handleClick: handleOpenVault, - confirmationMessage, - theme, buttonText, + message: confirmationMessage, + messageDetails, + theme, + handleClick: handleOpenVault, }) - : null} + : nothing}
`; } diff --git a/apps/browser/src/autofill/content/components/notification/confirmation-container.ts b/apps/browser/src/autofill/content/components/notification/confirmation/container.ts similarity index 66% rename from apps/browser/src/autofill/content/components/notification/confirmation-container.ts rename to apps/browser/src/autofill/content/components/notification/confirmation/container.ts index 0666859ac44..a071338af9a 100644 --- a/apps/browser/src/autofill/content/components/notification/confirmation-container.ts +++ b/apps/browser/src/autofill/content/components/notification/confirmation/container.ts @@ -1,42 +1,67 @@ import { css } from "@emotion/css"; -import { html } from "lit"; +import { html, nothing } from "lit"; import { Theme, ThemeTypes } from "@bitwarden/common/platform/enums"; import { NotificationBarIframeInitData, - NotificationTypes, + NotificationTaskInfo, NotificationType, -} from "../../../notification/abstractions/notification-bar"; -import { themes, spacing } from "../constants/styles"; - -import { NotificationConfirmationBody } from "./confirmation"; + NotificationTypes, +} from "../../../../notification/abstractions/notification-bar"; +import { themes, spacing } from "../../constants/styles"; import { NotificationHeader, componentClassPrefix as notificationHeaderClassPrefix, -} from "./header"; +} from "../header"; + +import { NotificationConfirmationBody } from "./body"; +import { NotificationConfirmationFooter } from "./footer"; + +export type NotificationConfirmationContainerProps = NotificationBarIframeInitData & { + handleCloseNotification: (e: Event) => void; + handleOpenVault: (e: Event) => void; + handleOpenTasks: (e: Event) => void; +} & { + error?: string; + i18n: { [key: string]: string }; + task?: NotificationTaskInfo; + type: NotificationType; + username: string; +}; export function NotificationConfirmationContainer({ error, handleCloseNotification, handleOpenVault, + handleOpenTasks, i18n, + task, theme = ThemeTypes.Light, type, username, -}: NotificationBarIframeInitData & { - handleCloseNotification: (e: Event) => void; - handleOpenVault: (e: Event) => void; -} & { - error?: string; - i18n: { [key: string]: string }; - type: NotificationType; - username: string; -}) { +}: NotificationConfirmationContainerProps) { const headerMessage = getHeaderMessage(i18n, type, error); const confirmationMessage = getConfirmationMessage(i18n, username, type, error); const buttonText = error ? i18n.newItem : i18n.view; + let messageDetails: string | undefined; + let remainingTasksCount: number | undefined; + let tasksAreComplete: boolean = false; + + if (task) { + remainingTasksCount = task.remainingTasksCount || 0; + tasksAreComplete = remainingTasksCount === 0; + + messageDetails = + remainingTasksCount > 0 + ? chrome.i18n.getMessage("loginUpdateTaskSuccessAdditional", [ + task.orgName, + `${remainingTasksCount}`, + ]) + : chrome.i18n.getMessage("loginUpdateTaskSuccess", [task.orgName]); + } + return html`
${NotificationHeader({ @@ -47,10 +72,18 @@ export function NotificationConfirmationContainer({ ${NotificationConfirmationBody({ buttonText, confirmationMessage, - error: error, - handleOpenVault, + tasksAreComplete, + messageDetails, theme, + handleOpenVault, })} + ${remainingTasksCount + ? NotificationConfirmationFooter({ + i18n, + theme, + handleButtonClick: handleOpenTasks, + }) + : nothing}
`; } diff --git a/apps/browser/src/autofill/content/components/notification/confirmation/footer.ts b/apps/browser/src/autofill/content/components/notification/confirmation/footer.ts new file mode 100644 index 00000000000..e245d22c8e8 --- /dev/null +++ b/apps/browser/src/autofill/content/components/notification/confirmation/footer.ts @@ -0,0 +1,59 @@ +import { css } from "@emotion/css"; +import { html } from "lit"; + +import { Theme } from "@bitwarden/common/platform/enums"; + +import { ActionButton } from "../../buttons/action-button"; +import { spacing, themes } from "../../constants/styles"; +import { ExternalLink } from "../../icons"; + +export type NotificationConfirmationFooterProps = { + i18n: { [key: string]: string }; + theme: Theme; + handleButtonClick: (event: Event) => void; +}; + +export function NotificationConfirmationFooter({ + i18n, + theme, + handleButtonClick, +}: NotificationConfirmationFooterProps) { + const primaryButtonText = i18n.nextSecurityTaskAction; + + return html` +
+ ${ActionButton({ + handleClick: handleButtonClick, + buttonText: AdditionalTasksButtonContent({ buttonText: primaryButtonText, theme }), + theme, + })} +
+ `; +} + +const notificationConfirmationFooterStyles = ({ theme }: { theme: Theme }) => css` + background-color: ${themes[theme].background.alt}; + padding: 0 ${spacing[3]} ${spacing[3]} ${spacing[3]}; + max-width: min-content; + + :last-child { + border-radius: 0 0 ${spacing["4"]} ${spacing["4"]}; + padding-bottom: ${spacing[4]}; + } +`; + +function AdditionalTasksButtonContent({ buttonText, theme }: { buttonText: string; theme: Theme }) { + return html` +
+ ${buttonText} + ${ExternalLink({ theme, color: themes[theme].text.contrast })} +
+ `; +} + +const additionalTasksButtonContentStyles = ({ theme }: { theme: Theme }) => css` + gap: ${spacing[2]}; + display: flex; + align-items: center; + white-space: nowrap; +`; diff --git a/apps/browser/src/autofill/content/components/notification/confirmation/message.ts b/apps/browser/src/autofill/content/components/notification/confirmation/message.ts new file mode 100644 index 00000000000..c018371caff --- /dev/null +++ b/apps/browser/src/autofill/content/components/notification/confirmation/message.ts @@ -0,0 +1,83 @@ +import { css } from "@emotion/css"; +import { html, nothing } from "lit"; + +import { Theme } from "@bitwarden/common/platform/enums"; + +import { themes, typography } from "../../constants/styles"; + +export type NotificationConfirmationMessageProps = { + buttonText?: string; + message?: string; + messageDetails?: string; + handleClick: (e: Event) => void; + theme: Theme; +}; + +export function NotificationConfirmationMessage({ + buttonText, + message, + messageDetails, + handleClick, + theme, +}: NotificationConfirmationMessageProps) { + return html` +
+ ${message || buttonText + ? html` + + ${message || nothing} + ${buttonText + ? html` + + ${buttonText} + + ` + : nothing} + + ` + : nothing} + ${messageDetails + ? html`
${messageDetails}
` + : nothing} +
+ `; +} + +const baseTextStyles = css` + flex-grow: 1; + overflow-x: hidden; + text-align: left; + text-overflow: ellipsis; + line-height: 24px; + 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; +`; + +const AdditionalMessageStyles = ({ theme }: { theme: Theme }) => css` + ${typography.body2} + + font-size: 14px; + color: ${themes[theme].text.muted}; +`; diff --git a/apps/browser/src/autofill/content/components/notification/container.ts b/apps/browser/src/autofill/content/components/notification/container.ts index 8d80dc9fb50..c29f58e116b 100644 --- a/apps/browser/src/autofill/content/components/notification/container.ts +++ b/apps/browser/src/autofill/content/components/notification/container.ts @@ -19,6 +19,18 @@ import { componentClassPrefix as notificationHeaderClassPrefix, } from "./header"; +export type NotificationContainerProps = NotificationBarIframeInitData & { + handleCloseNotification: (e: Event) => void; + handleSaveAction: (e: Event) => void; + handleEditOrUpdateAction: (e: Event) => void; +} & { + ciphers?: NotificationCipherData[]; + folders?: FolderView[]; + i18n: { [key: string]: string }; + organizations?: OrgView[]; + type: NotificationType; // @TODO typing override for generic `NotificationBarIframeInitData.type` +}; + export function NotificationContainer({ handleCloseNotification, handleEditOrUpdateAction, @@ -29,17 +41,7 @@ export function NotificationContainer({ organizations, theme = ThemeTypes.Light, type, -}: NotificationBarIframeInitData & { - handleCloseNotification: (e: Event) => void; - handleSaveAction: (e: Event) => void; - handleEditOrUpdateAction: (e: Event) => void; -} & { - ciphers?: NotificationCipherData[]; - folders?: FolderView[]; - i18n: { [key: string]: string }; - organizations?: OrgView[]; - type: NotificationType; // @TODO typing override for generic `NotificationBarIframeInitData.type` -}) { +}: NotificationContainerProps) { const headerMessage = getHeaderMessage(i18n, type); const showBody = true; diff --git a/apps/browser/src/autofill/content/components/notification/header.ts b/apps/browser/src/autofill/content/components/notification/header.ts index 50c2c629942..d6cedf6a85a 100644 --- a/apps/browser/src/autofill/content/components/notification/header.ts +++ b/apps/browser/src/autofill/content/components/notification/header.ts @@ -49,7 +49,7 @@ const notificationHeaderStyles = ({ display: flex; align-items: center; justify-content: flex-start; - background-color: ${themes[theme].background}; + background-color: ${themes[theme].background.DEFAULT}; padding: 12px 16px 8px 16px; white-space: nowrap; diff --git a/apps/browser/src/autofill/content/components/option-selection/option-item.ts b/apps/browser/src/autofill/content/components/option-selection/option-item.ts index 619d77e63d3..e8a293e2c3f 100644 --- a/apps/browser/src/autofill/content/components/option-selection/option-item.ts +++ b/apps/browser/src/autofill/content/components/option-selection/option-item.ts @@ -62,14 +62,15 @@ const optionItemStyles = css` `; const optionItemIconContainerStyles = css` + display: flex; flex-grow: 1; flex-shrink: 1; - width: ${optionItemIconWidth}px; - height: ${optionItemIconWidth}px; + max-width: ${optionItemIconWidth}px; + max-height: ${optionItemIconWidth}px; > svg { width: 100%; - height: fit-content; + height: auto; } `; diff --git a/apps/browser/src/autofill/content/content-message-handler.ts b/apps/browser/src/autofill/content/content-message-handler.ts index 55e0c071a55..60f093f8c10 100644 --- a/apps/browser/src/autofill/content/content-message-handler.ts +++ b/apps/browser/src/autofill/content/content-message-handler.ts @@ -17,7 +17,7 @@ const windowMessageHandlers: ContentMessageWindowEventHandlers = { [VaultMessages.checkBwInstalled]: () => handleExtensionInstallCheck(), duoResult: ({ data, referrer }: { data: any; referrer: string }) => handleDuoResultMessage(data, referrer), - [VaultMessages.OpenPopup]: () => handleOpenPopupMessage(), + [VaultMessages.OpenAtRiskPasswords]: () => handleOpenAtRiskPasswordsMessage(), }; /** @@ -73,8 +73,8 @@ function handleWebAuthnResultMessage(data: ContentMessageWindowData, referrer: s sendExtensionRuntimeMessage({ command, data: data.data, remember, referrer }); } -function handleOpenPopupMessage() { - sendExtensionRuntimeMessage({ command: VaultMessages.OpenPopup }); +function handleOpenAtRiskPasswordsMessage() { + sendExtensionRuntimeMessage({ command: VaultMessages.OpenAtRiskPasswords }); } /** diff --git a/apps/browser/src/autofill/content/notification-bar.ts b/apps/browser/src/autofill/content/notification-bar.ts deleted file mode 100644 index bf3d562a0ef..00000000000 --- a/apps/browser/src/autofill/content/notification-bar.ts +++ /dev/null @@ -1,1082 +0,0 @@ -// FIXME: Update this file to be type safe and remove this and next line -// @ts-strict-ignore -import { ServerConfig } from "@bitwarden/common/platform/abstractions/config/server-config"; - -import { - AddLoginMessageData, - ChangePasswordMessageData, -} from "../background/abstractions/notification.background"; -import AutofillField from "../models/autofill-field"; -import { WatchedForm } from "../models/watched-form"; -import { NotificationBarIframeInitData } from "../notification/abstractions/notification-bar"; -import { NotificationTypeData } from "../overlay/notifications/abstractions/overlay-notifications-content.service"; -import { FormData } from "../services/abstractions/autofill.service"; -import { sendExtensionMessage, setupExtensionDisconnectAction } from "../utils"; - -interface HTMLElementWithFormOpId extends HTMLElement { - formOpId: string; -} - -/** - * @fileoverview This file contains the code for the Bitwarden Notification Bar content script. - * The notification bar is used to notify logged in users that they can - * save a new login, change a existing password on a password change screen, - * or update an existing login after detecting a different password on login. - * - * Note: content scripts are reloaded on non-SPA page change. - */ - -/* - * Run content script when the DOM is fully loaded - * - * The DOMContentLoaded event fires when the HTML document has been completely parsed, - * and all deferred scripts (