diff --git a/.github/workflows/build-browser.yml b/.github/workflows/build-browser.yml index 3c99f610ce..a8660bad18 100644 --- a/.github/workflows/build-browser.yml +++ b/.github/workflows/build-browser.yml @@ -382,7 +382,7 @@ jobs: secrets: "crowdin-api-token" - name: Upload Sources - uses: crowdin/github-action@c953b17499daa6be3e5afbf7a63616fb02d8b18d # v1.19.0 + uses: crowdin/github-action@6ed209d411599a981ccb978df3be9dc9b8a81699 # v2.1.1 env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} CROWDIN_API_TOKEN: ${{ steps.retrieve-secrets.outputs.crowdin-api-token }} diff --git a/.github/workflows/build-cli.yml b/.github/workflows/build-cli.yml index ad2ac53971..1f1b9936bf 100644 --- a/.github/workflows/build-cli.yml +++ b/.github/workflows/build-cli.yml @@ -65,15 +65,15 @@ jobs: strategy: matrix: os: - [ - { base: "linux", distro: "ubuntu-22.04" }, - { base: "mac", distro: "macos-13" } - ] + [ + { base: "linux", distro: "ubuntu-22.04" }, + { base: "mac", distro: "macos-13" } + ] license_type: - [ - { build_prefix: "oss", artifact_prefix: "-oss", readable: "open source license" }, - { build_prefix: "bit", artifact_prefix: "", readable: "commercial license"} - ] + [ + { build_prefix: "oss", artifact_prefix: "-oss", readable: "open source license" }, + { build_prefix: "bit", artifact_prefix: "", readable: "commercial license" } + ] runs-on: ${{ matrix.os.distro }} needs: - setup @@ -148,10 +148,10 @@ jobs: strategy: matrix: license_type: - [ - { build_prefix: "oss", artifact_prefix: "-oss", readable: "open source license" }, - { build_prefix: "bit", artifact_prefix: "", readable: "commercial license"} - ] + [ + { build_prefix: "oss", artifact_prefix: "-oss", readable: "open source license" }, + { build_prefix: "bit", artifact_prefix: "", readable: "commercial license" } + ] runs-on: windows-2022 needs: - setup @@ -241,7 +241,7 @@ jobs: - name: Package Chocolatey shell: pwsh - if: ${{ matrix.license_type.build_prefix }} == 'bit' + if: ${{ matrix.license_type.build_prefix == 'bit' }} run: | Copy-Item -Path stores/chocolatey -Destination dist/chocolatey -Recurse Copy-Item dist/${{ matrix.license_type.build_prefix }}/windows/bw.exe -Destination dist/chocolatey/tools diff --git a/.github/workflows/build-desktop.yml b/.github/workflows/build-desktop.yml index a8ee1091a2..c933ea304c 100644 --- a/.github/workflows/build-desktop.yml +++ b/.github/workflows/build-desktop.yml @@ -1248,7 +1248,7 @@ jobs: secrets: "crowdin-api-token" - name: Upload Sources - uses: crowdin/github-action@c953b17499daa6be3e5afbf7a63616fb02d8b18d # v1.19.0 + uses: crowdin/github-action@6ed209d411599a981ccb978df3be9dc9b8a81699 # v2.1.1 env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} CROWDIN_API_TOKEN: ${{ steps.retrieve-secrets.outputs.crowdin-api-token }} diff --git a/.github/workflows/build-web.yml b/.github/workflows/build-web.yml index 8576fb6760..46e65e8924 100644 --- a/.github/workflows/build-web.yml +++ b/.github/workflows/build-web.yml @@ -234,7 +234,7 @@ jobs: run: echo "name=$_AZ_REGISTRY/${PROJECT_NAME}:${IMAGE_TAG}" >> $GITHUB_OUTPUT - name: Build Docker image - uses: docker/build-push-action@4a13e500e55cf31b7a5d59a38ab2040ab0f42f56 # v5.1.0 + uses: docker/build-push-action@5cd11c3a4ced054e52742c5fd54dca954e0edd85 # v6.7.0 with: context: apps/web file: apps/web/Dockerfile @@ -270,7 +270,7 @@ jobs: secrets: "crowdin-api-token" - name: Upload Sources - uses: crowdin/github-action@c953b17499daa6be3e5afbf7a63616fb02d8b18d # v1.19.0 + uses: crowdin/github-action@6ed209d411599a981ccb978df3be9dc9b8a81699 # v2.1.1 env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} CROWDIN_API_TOKEN: ${{ steps.retrieve-secrets.outputs.crowdin-api-token }} diff --git a/.github/workflows/chromatic.yml b/.github/workflows/chromatic.yml index f422c3560e..6a02c2d124 100644 --- a/.github/workflows/chromatic.yml +++ b/.github/workflows/chromatic.yml @@ -1,3 +1,4 @@ +--- name: Chromatic on: @@ -13,7 +14,7 @@ jobs: check-run: name: Check PR run uses: bitwarden/gh-actions/.github/workflows/check-run.yml@main - + chromatic: name: Chromatic runs-on: ubuntu-22.04 @@ -56,7 +57,7 @@ jobs: run: npm run build-storybook:ci - name: Publish to Chromatic - uses: chromaui/action@c9067691aca4a28d6fbb40d9eea6e144369fbcae # v10.9.5 + uses: chromaui/action@b984808b772126a9f44b2b7737b131b68a2ede32 # v11.7.1 with: token: ${{ secrets.GITHUB_TOKEN }} projectToken: ${{ secrets.CHROMATIC_PROJECT_TOKEN }} diff --git a/.github/workflows/crowdin-pull.yml b/.github/workflows/crowdin-pull.yml index b6c2e27646..1f5df5a66c 100644 --- a/.github/workflows/crowdin-pull.yml +++ b/.github/workflows/crowdin-pull.yml @@ -59,4 +59,3 @@ jobs: working_directory: apps/${{ matrix.app_name }} gpg_private_key: ${{ steps.retrieve-secrets.outputs.github-gpg-private-key }} gpg_passphrase: ${{ steps.retrieve-secrets.outputs.github-gpg-private-key-passphrase }} - diff --git a/.github/workflows/deploy-web.yml b/.github/workflows/deploy-web.yml index 5aa92c4dd8..7551538b3a 100644 --- a/.github/workflows/deploy-web.yml +++ b/.github/workflows/deploy-web.yml @@ -7,7 +7,7 @@ on: inputs: environment: description: 'Environment' - default: 'QA' + default: 'USQA' type: choice options: - USQA @@ -256,7 +256,7 @@ jobs: - setup - artifact-check runs-on: ubuntu-22.04 - if: ${{ always() && contains( inputs.environment , 'QA' ) }} + if: ${{ always() && ( contains( inputs.environment , 'QA' ) || contains( inputs.environment , 'DEV' ) ) }} outputs: channel_id: ${{ steps.slack-message.outputs.channel_id }} ts: ${{ steps.slack-message.outputs.ts }} @@ -407,7 +407,7 @@ jobs: notify: name: Notify Slack with result runs-on: ubuntu-22.04 - if: ${{ always() && contains( inputs.environment , 'QA' ) }} + if: ${{ always() && ( contains( inputs.environment , 'QA' ) || contains( inputs.environment , 'DEV' ) ) }} needs: - setup - notify-start diff --git a/.github/workflows/publish-cli.yml b/.github/workflows/publish-cli.yml index 3f9eb7b2e4..09b6b53e58 100644 --- a/.github/workflows/publish-cli.yml +++ b/.github/workflows/publish-cli.yml @@ -35,7 +35,6 @@ on: default: true type: boolean - defaults: run: working-directory: apps/cli @@ -46,29 +45,42 @@ jobs: runs-on: ubuntu-22.04 outputs: release-version: ${{ steps.version-output.outputs.version }} - deployment-id: ${{ steps.deployment.outputs.deployment-id }} + deployment-id: ${{ steps.deployment.outputs.deployment_id }} + defaults: + run: + working-directory: . steps: + - name: Branch check + if: ${{ inputs.publish_type != 'Dry Run' }} + run: | + if [[ "$GITHUB_REF" != "refs/heads/rc" ]] && [[ "$GITHUB_REF" != "refs/heads/hotfix-rc-cli" ]]; then + echo "===================================" + echo "[!] Can only publish from the 'rc' or 'hotfix-rc-cli' branches" + echo "===================================" + exit 1 + fi + - name: Version output id: version-output run: | - if [[ "${{ github.event.inputs.version }}" == "latest" || "${{ github.event.inputs.version }}" == "" ]]; then + if [[ "${{ inputs.version }}" == "latest" || "${{ inputs.version }}" == "" ]]; then VERSION=$(curl "https://api.github.com/repos/bitwarden/clients/releases" | jq -c '.[] | select(.tag_name | contains("cli")) | .tag_name' | head -1 | grep -ohE '20[0-9]{2}\.([1-9]|1[0-2])\.[0-9]+') echo "Latest Released Version: $VERSION" - echo "::set-output name=version::$VERSION" + echo "version=$VERSION" >> $GITHUB_OUTPUT else - echo "Release Version: ${{ github.event.inputs.version }}" - echo "::set-output name=version::${{ github.event.inputs.version }}" + echo "Release Version: ${{ inputs.version }}" + echo "version=${{ inputs.version }}" >> $GITHUB_OUTPUT fi - name: Create GitHub deployment - if: ${{ github.event.inputs.release_type != 'Dry Run' }} + if: ${{ inputs.publish_type != 'Dry Run' }} uses: chrnorm/deployment-action@55729fcebec3d284f60f5bcabbd8376437d696b1 # v2.0.7 id: deployment with: token: '${{ secrets.GITHUB_TOKEN }}' initial-status: 'in_progress' environment: 'CLI - Production' - description: 'Deployment ${{ steps.version.outputs.version }} from branch ${{ github.ref_name }}' + description: 'Deployment ${{ steps.version-output.outputs.version }} from branch ${{ github.ref_name }}' task: release snap: @@ -98,10 +110,10 @@ jobs: uses: samuelmeuli/action-snapcraft@d33c176a9b784876d966f80fb1b461808edc0641 # v2.1.1 - name: Download artifacts - run: wget https://github.com/bitwarden/clients/releases/cli-v${{ env._PKG_VERSION }}/download/bw_${{ env._PKG_VERSION }}_amd64.snap + run: wget https://github.com/bitwarden/clients/releases/download/cli-v${{ env._PKG_VERSION }}/bw_${{ env._PKG_VERSION }}_amd64.snap - name: Publish Snap & logout - if: ${{ github.event.inputs.publish_type != 'Dry Run' }} + if: ${{ inputs.publish_type != 'Dry Run' }} env: SNAPCRAFT_STORE_CREDENTIALS: ${{ steps.retrieve-secrets.outputs.snapcraft-store-token }} run: | @@ -137,18 +149,16 @@ jobs: CHOCO_API_KEY: ${{ steps.retrieve-secrets.outputs.cli-choco-api-key }} - name: Make dist dir - shell: pwsh run: New-Item -ItemType directory -Path ./dist - name: Download artifacts - run: wget https://github.com/bitwarden/clients/releases/cli-v${{ env._PKG_VERSION }}/download/bitwarden-cli.${{ env._PKG_VERSION }}.nupkg + run: Invoke-WebRequest -Uri "https://github.com/bitwarden/clients/releases/download/cli-v${{ env._PKG_VERSION }}/bitwarden-cli.${{ env._PKG_VERSION }}.nupkg" -OutFile bitwarden-cli.${{ env._PKG_VERSION }}.nupkg + working-directory: apps/cli/dist - name: Push to Chocolatey - if: ${{ github.event.inputs.publish_type != 'Dry Run' }} - shell: pwsh - run: | - cd dist - choco push --source=https://push.chocolatey.org/ + if: ${{ inputs.publish_type != 'Dry Run' }} + run: choco push --source=https://push.chocolatey.org/ + working-directory: apps/cli/dist npm: name: Publish NPM @@ -174,7 +184,7 @@ jobs: secrets: "npm-api-key" - name: Download artifacts - run: wget https://github.com/bitwarden/clients/releases/cli-v${{ env._PKG_VERSION }}/download/bitwarden-cli-${{ env._PKG_VERSION }}-npm-build.zip + run: wget https://github.com/bitwarden/clients/releases/download/cli-v${{ env._PKG_VERSION }}/bitwarden-cli-${{ env._PKG_VERSION }}-npm-build.zip - name: Setup NPM run: | @@ -187,7 +197,7 @@ jobs: run: npm install -g husky - name: Publish NPM - if: ${{ github.event.inputs.publish_type != 'Dry Run' }} + if: ${{ inputs.publish_type != 'Dry Run' }} run: npm publish --access public --regsitry=https://registry.npmjs.org/ --userconfig=./.npmrc update-deployment: @@ -198,14 +208,14 @@ jobs: - npm - snap - choco - if: ${{ always() && github.event.inputs.publish_type != 'Dry Run' }} + if: ${{ always() && inputs.publish_type != 'Dry Run' }} steps: - name: Check if any job failed if: contains(needs.*.result, 'failure') run: exit 1 - name: Update deployment status to Success - if: ${{ github.event.inputs.release_type != 'Dry Run' && success() }} + if: ${{ inputs.publish_type != 'Dry Run' && success() }} uses: chrnorm/deployment-status@9a72af4586197112e0491ea843682b5dc280d806 # v2.0.3 with: token: '${{ secrets.GITHUB_TOKEN }}' @@ -213,9 +223,9 @@ jobs: deployment-id: ${{ needs.setup.outputs.deployment-id }} - name: Update deployment status to Failure - if: ${{ github.event.inputs.release_type != 'Dry Run' && failure() }} + if: ${{ inputs.publish_type != 'Dry Run' && failure() }} uses: chrnorm/deployment-status@9a72af4586197112e0491ea843682b5dc280d806 # v2.0.3 with: token: '${{ secrets.GITHUB_TOKEN }}' state: 'failure' - deployment-id: ${{ needs.setup.outputs.deployment-id }} \ No newline at end of file + deployment-id: ${{ needs.setup.outputs.deployment-id }} diff --git a/.github/workflows/publish-desktop.yml b/.github/workflows/publish-desktop.yml index 2c4e467bc2..c03697fc80 100644 --- a/.github/workflows/publish-desktop.yml +++ b/.github/workflows/publish-desktop.yml @@ -15,7 +15,7 @@ on: - Republish - Dry Run version: - description: 'Version to publish (default: latest cli release)' + description: 'Version to publish (default: latest desktop release)' required: true type: string default: latest @@ -35,10 +35,6 @@ on: default: true type: boolean -defaults: - run: - shell: bash - jobs: setup: name: Setup @@ -49,25 +45,35 @@ jobs: tag-name: ${{ steps.version.outputs.tag_name }} deployment-id: ${{ steps.deployment.outputs.deployment_id }} steps: + - name: Branch check + if: ${{ inputs.publish_type != 'Dry Run' }} + run: | + if [[ "$GITHUB_REF" != "refs/heads/rc" ]] && [[ "$GITHUB_REF" != "refs/heads/hotfix-rc-desktop" ]]; then + echo "===================================" + echo "[!] Can only publish from the 'rc' or 'hotfix-rc-desktop' branches" + echo "===================================" + exit 1 + fi + - name: Check Publish Version id: version run: | - if [[ "${{ github.event.inputs.version }}" == "latest" || "${{ github.event.inputs.version }}" == "" ]]; then + if [[ "${{ inputs.version }}" == "latest" || "${{ inputs.version }}" == "" ]]; then TAG_NAME=$(curl "https://api.github.com/repos/bitwarden/clients/releases" | jq -c '.[] | select(.tag_name | contains("desktop")) | .tag_name' | head -1 | cut -d '"' -f 2) VERSION=$(echo $TAG_NAME | sed "s/desktop-v//") echo "Latest Released Version: $VERSION" - echo "::set-output name=version::$VERSION" + echo "version=$VERSION" >> $GITHUB_OUTPUT echo "Tag name: $TAG_NAME" - echo "::set-output name=tag_name::$TAG_NAME" + echo "tag_name=$TAG_NAME" >> $GITHUB_OUTPUT else - echo "Release Version: ${{ github.event.inputs.version }}" - echo "::set-output name=version::${{ github.event.inputs.version }}" + echo "Release Version: ${{ inputs.version }}" + echo "version=${{ inputs.version }}" - $TAG_NAME="desktop-v${{ github.event.inputs.version }}" + $TAG_NAME="desktop-v${{ inputs.version }}" echo "Tag name: $TAG_NAME" - echo "::set-output name=tag_name::$TAG_NAME" + echo "tag_name=$TAG_NAME" >> $GITHUB_OUTPUT fi - name: Get Version Channel @@ -88,7 +94,7 @@ jobs: esac - name: Create GitHub deployment - if: ${{ github.event.inputs.publish_type != 'Dry Run' }} + if: ${{ inputs.publish_type != 'Dry Run' }} uses: chrnorm/deployment-action@55729fcebec3d284f60f5bcabbd8376437d696b1 # v2.0.7 id: deployment with: @@ -101,6 +107,7 @@ jobs: electron-blob: name: Electron blob publish runs-on: ubuntu-22.04 + needs: setup env: _PKG_VERSION: ${{ needs.setup.outputs.release-version }} _RELEASE_TAG: ${{ needs.setup.outputs.tag-name }} @@ -118,23 +125,19 @@ jobs: secrets: "aws-electron-access-id, aws-electron-access-key, aws-electron-bucket-name" - - - name: Download all artifacts - if: ${{ github.event.inputs.publish_type != 'Dry Run' }} - uses: bitwarden/gh-actions/download-artifacts@main - with: - workflow: build-desktop.yml - workflow_conclusion: success - branch: ${{ github.ref_name }} - path: apps/desktop/artifacts + + - name: Create artifacts directory + run: mkdir -p apps/desktop/artifacts - name: Download artifacts + env: + GH_TOKEN: ${{ github.token }} working-directory: apps/desktop/artifacts - run: gh release download ${{ env._RELEASE_TAG }} -R bitwarden/desktop + run: gh release download ${{ env._RELEASE_TAG }} -R bitwarden/clients - name: Set staged rollout percentage env: - RELEASE_CHANNEL: ${{ steps.release-channel.outputs.channel }} + RELEASE_CHANNEL: ${{ needs.setup.outputs.release-channel }} ROLLOUT_PCT: ${{ inputs.rollout_percentage }} run: | echo "stagingPercentage: ${ROLLOUT_PCT}" >> apps/desktop/artifacts/${RELEASE_CHANNEL}.yml @@ -142,7 +145,7 @@ jobs: echo "stagingPercentage: ${ROLLOUT_PCT}" >> apps/desktop/artifacts/${RELEASE_CHANNEL}-mac.yml - name: Publish artifacts to S3 - if: ${{ github.event.inputs.publish_type != 'Dry Run' }} + if: ${{ inputs.publish_type != 'Dry Run' }} env: AWS_ACCESS_KEY_ID: ${{ steps.retrieve-secrets.outputs.aws-electron-access-id }} AWS_SECRET_ACCESS_KEY: ${{ steps.retrieve-secrets.outputs.aws-electron-access-key }} @@ -156,26 +159,26 @@ jobs: --quiet - name: Update deployment status to Success - if: ${{ github.event.inputs.publish_type != 'Dry Run' && success() }} + if: ${{ inputs.publish_type != 'Dry Run' && success() }} uses: chrnorm/deployment-status@9a72af4586197112e0491ea843682b5dc280d806 # v2.0.3 with: token: '${{ secrets.GITHUB_TOKEN }}' state: 'success' - deployment-id: ${{ steps.deployment.outputs.deployment_id }} + deployment-id: ${{ needs.setup.outputs.deployment-id }} - name: Update deployment status to Failure - if: ${{ github.event.inputs.publish_type != 'Dry Run' && failure() }} + if: ${{ inputs.publish_type != 'Dry Run' && failure() }} uses: chrnorm/deployment-status@9a72af4586197112e0491ea843682b5dc280d806 # v2.0.3 with: token: '${{ secrets.GITHUB_TOKEN }}' state: 'failure' - deployment-id: ${{ steps.deployment.outputs.deployment_id }} + deployment-id: ${{ needs.setup.outputs.deployment-id }} snap: name: Deploy Snap runs-on: ubuntu-22.04 needs: setup - if: ${{ github.event.inputs.snap_publish == 'true' }} + if: inputs.snap_publish env: _PKG_VERSION: ${{ needs.setup.outputs.release-version }} _RELEASE_TAG: ${{ needs.setup.outputs.tag-name }} @@ -204,10 +207,10 @@ jobs: - name: Download artifacts working-directory: apps/desktop/dist - run: wget https://github.com/bitwarden/clients/releases/${{ env._RELEASE_TAG }}/download/bitwarden_${{ env._PKG_VERSION }}_amd64.snap + run: wget https://github.com/bitwarden/clients/releases/download/${{ env._RELEASE_TAG }}/bitwarden_${{ env._PKG_VERSION }}_amd64.snap - name: Deploy to Snap Store - if: ${{ github.event.inputs.publish_type != 'Dry Run' }} + if: ${{ inputs.publish_type != 'Dry Run' }} env: SNAPCRAFT_STORE_CREDENTIALS: ${{ steps.retrieve-secrets.outputs.snapcraft-store-token }} run: | @@ -219,7 +222,7 @@ jobs: name: Deploy Choco runs-on: windows-2022 needs: setup - if: ${{ github.event.inputs.choco_publish == 'true' }} + if: inputs.choco_publish env: _PKG_VERSION: ${{ needs.setup.outputs.release-version }} _RELEASE_TAG: ${{ needs.setup.outputs.tag-name }} @@ -245,23 +248,20 @@ jobs: secrets: "cli-choco-api-key" - name: Setup Chocolatey - shell: pwsh run: choco apikey --key $env:CHOCO_API_KEY --source https://push.chocolatey.org/ env: CHOCO_API_KEY: ${{ steps.retrieve-secrets.outputs.cli-choco-api-key }} - name: Make dist dir - shell: pwsh run: New-Item -ItemType directory -Path ./dist working-directory: apps/desktop - name: Download artifacts working-directory: apps/desktop/dist - run: wget https://github.com/bitwarden/clients/releases/${{ env._RELEASE_TAG }}/download/bitwarden.${{ env._PKG_VERSION }}.nupkg + run: Invoke-WebRequest -Uri "https://github.com/bitwarden/clients/releases/download/${{ env._RELEASE_TAG }}/bitwarden.${{ env._PKG_VERSION }}.nupkg" -OutFile bitwarden.${{ env._PKG_VERSION }}.nupkg - name: Push to Chocolatey - if: ${{ github.event.inputs.publish_type != 'Dry Run' }} - shell: pwsh + if: ${{ inputs.publish_type != 'Dry Run' }} run: choco push --source=https://push.chocolatey.org/ working-directory: apps/desktop/dist @@ -273,14 +273,14 @@ jobs: - electron-blob - snap - choco - if: ${{ always() && github.event.inputs.publish_type != 'Dry Run' }} + if: ${{ always() && inputs.publish_type != 'Dry Run' }} steps: - name: Check if any job failed if: contains(needs.*.result, 'failure') run: exit 1 - name: Update deployment status to Success - if: ${{ github.event.inputs.release_type != 'Dry Run' && success() }} + if: ${{ inputs.publish_type != 'Dry Run' && success() }} uses: chrnorm/deployment-status@9a72af4586197112e0491ea843682b5dc280d806 # v2.0.3 with: token: '${{ secrets.GITHUB_TOKEN }}' @@ -288,7 +288,7 @@ jobs: deployment-id: ${{ needs.setup.outputs.deployment-id }} - name: Update deployment status to Failure - if: ${{ github.event.inputs.release_type != 'Dry Run' && failure() }} + if: ${{ inputs.publish_type != 'Dry Run' && failure() }} uses: chrnorm/deployment-status@9a72af4586197112e0491ea843682b5dc280d806 # v2.0.3 with: token: '${{ secrets.GITHUB_TOKEN }}' diff --git a/.github/workflows/publish-web.yml b/.github/workflows/publish-web.yml index 733e3945e5..b7ea849859 100644 --- a/.github/workflows/publish-web.yml +++ b/.github/workflows/publish-web.yml @@ -8,10 +8,10 @@ on: publish_type: description: 'Publish Options' required: true - default: 'Initial Publish' + default: 'Initial Release' type: choice options: - - Initial Publish + - Initial Release - Redeploy - Dry Run @@ -30,11 +30,11 @@ jobs: uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 - name: Branch check - if: ${{ github.event.inputs.publish_type != 'Dry Run' }} + if: ${{ inputs.publish_type != 'Dry Run' }} run: | if [[ "$GITHUB_REF" != "refs/heads/rc" ]] && [[ "$GITHUB_REF" != "refs/heads/hotfix-rc-web" ]]; then echo "===================================" - echo "[!] Can only release from the 'rc' or 'hotfix-rc-web' branches" + echo "[!] Can only publish from the 'rc' or 'hotfix-rc-web' branches" echo "===================================" exit 1 fi @@ -43,7 +43,7 @@ jobs: id: version uses: bitwarden/gh-actions/release-version-check@main with: - release-type: ${{ github.event.inputs.publish_type }} + release-type: ${{ inputs.publish_type }} project-type: ts file: apps/web/package.json monorepo: true @@ -56,7 +56,7 @@ jobs: env: _BRANCH_NAME: ${{ github.ref_name }} _RELEASE_VERSION: ${{ needs.setup.outputs.release_version }} - _RELEASE_OPTION: ${{ github.event.inputs.publish_type }} + _RELEASE_OPTION: ${{ inputs.publish_type }} steps: - name: Print environment run: | @@ -79,7 +79,7 @@ jobs: run: az acr login -n bitwardenprod - name: Create GitHub deployment - if: ${{ github.event.inputs.publish_type != 'Dry Run' }} + if: ${{ inputs.publish_type != 'Dry Run' }} uses: chrnorm/deployment-action@55729fcebec3d284f60f5bcabbd8376437d696b1 # v2.0.7 id: deployment with: @@ -92,7 +92,7 @@ jobs: - name: Pull branch image run: | - if [[ "${{ github.event.inputs.publish_type }}" == "Dry Run" ]]; then + if [[ "${{ inputs.publish_type }}" == "Dry Run" ]]; then docker pull $_AZ_REGISTRY/web:latest else docker pull $_AZ_REGISTRY/web:$_BRANCH_NAME @@ -100,7 +100,7 @@ jobs: - name: Tag version run: | - if [[ "${{ github.event.inputs.publish_type }}" == "Dry Run" ]]; then + if [[ "${{ inputs.publish_type }}" == "Dry Run" ]]; then docker tag $_AZ_REGISTRY/web:latest $_AZ_REGISTRY/web:dryrun docker tag $_AZ_REGISTRY/web:latest $_AZ_REGISTRY/web-sh:dryrun else @@ -112,7 +112,7 @@ jobs: - name: Push version run: | - if [[ "${{ github.event.inputs.publish_type }}" == "Dry Run" ]]; then + if [[ "${{ inputs.publish_type }}" == "Dry Run" ]]; then docker push $_AZ_REGISTRY/web:dryrun docker push $_AZ_REGISTRY/web-sh:dryrun else @@ -123,7 +123,7 @@ jobs: fi - name: Update deployment status to Success - if: ${{ github.event.inputs.publish_type != 'Dry Run' && success() }} + if: ${{ inputs.publish_type != 'Dry Run' && success() }} uses: chrnorm/deployment-status@9a72af4586197112e0491ea843682b5dc280d806 # v2.0.3 with: token: '${{ secrets.GITHUB_TOKEN }}' @@ -132,7 +132,7 @@ jobs: deployment-id: ${{ steps.deployment.outputs.deployment_id }} - name: Update deployment status to Failure - if: ${{ github.event.inputs.publish_type != 'Dry Run' && failure() }} + if: ${{ inputs.publish_type != 'Dry Run' && failure() }} uses: chrnorm/deployment-status@9a72af4586197112e0491ea843682b5dc280d806 # v2.0.3 with: token: '${{ secrets.GITHUB_TOKEN }}' diff --git a/.github/workflows/release-cli.yml b/.github/workflows/release-cli.yml index fe402e7a8f..ddcdb4e904 100644 --- a/.github/workflows/release-cli.yml +++ b/.github/workflows/release-cli.yml @@ -30,7 +30,7 @@ jobs: uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 - name: Branch check - if: ${{ github.event.inputs.release_type != 'Dry Run' }} + if: ${{ inputs.release_type != 'Dry Run' }} run: | if [[ "$GITHUB_REF" != "refs/heads/rc" ]] && [[ "$GITHUB_REF" != "refs/heads/hotfix-rc-cli" ]]; then echo "===================================" @@ -43,7 +43,7 @@ jobs: id: version uses: bitwarden/gh-actions/release-version-check@main with: - release-type: ${{ github.event.inputs.release_type }} + release-type: ${{ inputs.release_type }} project-type: ts file: apps/cli/package.json monorepo: true @@ -55,7 +55,7 @@ jobs: needs: setup steps: - name: Download all Release artifacts - if: ${{ github.event.inputs.release_type != 'Dry Run' }} + if: ${{ inputs.release_type != 'Dry Run' }} uses: bitwarden/gh-actions/download-artifacts@main with: workflow: build-cli.yml @@ -64,7 +64,7 @@ jobs: branch: ${{ github.ref_name }} - name: Dry Run - Download all artifacts - if: ${{ github.event.inputs.release_type == 'Dry Run' }} + if: ${{ inputs.release_type == 'Dry Run' }} uses: bitwarden/gh-actions/download-artifacts@main with: workflow: build-cli.yml @@ -73,10 +73,10 @@ jobs: branch: main - name: Create release - if: ${{ github.event.inputs.release_type != 'Dry Run' }} + if: ${{ inputs.release_type != 'Dry Run' }} uses: ncipollo/release-action@2c591bcc8ecdcd2db72b97d6147f871fcd833ba5 # v1.14.0 env: - PKG_VERSION: ${{ steps.version.outputs.version }} + PKG_VERSION: ${{ needs.setup.outputs.release-version }} with: artifacts: "apps/cli/bw-oss-windows-${{ env.PKG_VERSION }}.zip, apps/cli/bw-oss-windows-sha256-${{ env.PKG_VERSION }}.txt, @@ -92,7 +92,8 @@ jobs: apps/cli/bw-linux-sha256-${{ env.PKG_VERSION }}.txt, apps/cli/bitwarden-cli.${{ env.PKG_VERSION }}.nupkg, apps/cli/bw_${{ env.PKG_VERSION }}_amd64.snap, - apps/cli/bw-snap-sha256-${{ env.PKG_VERSION }}.txt" + apps/cli/bw-snap-sha256-${{ env.PKG_VERSION }}.txt, + apps/cli/bitwarden-cli-${{ env.PKG_VERSION }}-npm-build.zip" commit: ${{ github.sha }} tag: cli-v${{ env.PKG_VERSION }} name: CLI v${{ env.PKG_VERSION }} diff --git a/.github/workflows/release-desktop.yml b/.github/workflows/release-desktop.yml index c9e1df9402..2fe7cb2b7a 100644 --- a/.github/workflows/release-desktop.yml +++ b/.github/workflows/release-desktop.yml @@ -98,7 +98,7 @@ jobs: - name: Create Release uses: ncipollo/release-action@2c591bcc8ecdcd2db72b97d6147f871fcd833ba5 # v1.14.0 - if: ${{ steps.release-channel.outputs.channel == 'latest' && github.event.inputs.release_type != 'Dry Run' && github.event.inputs.github_release == 'true' }} + if: ${{ steps.release-channel.outputs.channel == 'latest' && github.event.inputs.release_type != 'Dry Run' }} env: PKG_VERSION: ${{ steps.version.outputs.version }} RELEASE_CHANNEL: ${{ steps.release-channel.outputs.channel }} diff --git a/.github/workflows/scan.yml b/.github/workflows/scan.yml index f7d2004474..212795d3a2 100644 --- a/.github/workflows/scan.yml +++ b/.github/workflows/scan.yml @@ -1,3 +1,4 @@ +--- name: Scan on: @@ -31,7 +32,7 @@ jobs: ref: ${{ github.event.pull_request.head.sha }} - name: Scan with Checkmarx - uses: checkmarx/ast-github-action@749fec53e0db0f6404a97e2e0807c3e80e3583a7 #2.0.23 + uses: checkmarx/ast-github-action@749fec53e0db0f6404a97e2e0807c3e80e3583a7 # v2.0.23 env: INCREMENTAL: "${{ contains(github.event_name, 'pull_request') && '--sast-incremental' || '' }}" with: diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index a4aa94a2ed..52928e9a04 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -1,3 +1,4 @@ +--- name: Testing on: @@ -37,7 +38,7 @@ jobs: checks: write contents: read pull-requests: write - + steps: - name: Check out repo uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 diff --git a/apps/browser/src/_locales/ar/messages.json b/apps/browser/src/_locales/ar/messages.json index d57fed94c1..2b523a788b 100644 --- a/apps/browser/src/_locales/ar/messages.json +++ b/apps/browser/src/_locales/ar/messages.json @@ -25,9 +25,6 @@ "finishCreatingYourAccountBySettingAPassword": { "message": "Finish creating your account by setting a password" }, - "login": { - "message": "تسجيل الدخول" - }, "enterpriseSingleSignOn": { "message": "تسجيل الدخول الأُحادي للمؤسسات – SSO" }, @@ -1083,7 +1080,7 @@ "message": "1 جيغابايت وحدة تخزين مشفرة لمرفقات الملفات." }, "premiumSignUpEmergency": { - "message": "Emergency access" + "message": "Emergency access." }, "premiumSignUpTwoStepOptions": { "message": "خيارات تسجيل الدخول بخطوتين المملوكة لجهات اخرى مثل YubiKey و Duo." @@ -1115,6 +1112,9 @@ "premiumCurrentMemberThanks": { "message": "شكرا لك على دعم Bitwarden." }, + "premiumFeatures": { + "message": "Upgrade to premium and receive:" + }, "premiumPrice": { "message": "الكل فقط بـ $PRICE$ /سنة!", "placeholders": { @@ -1124,6 +1124,15 @@ } } }, + "premiumPriceV2": { + "message": "All for just $PRICE$ per year!", + "placeholders": { + "price": { + "content": "$1", + "example": "$10" + } + } + }, "refreshComplete": { "message": "اكتمل التحديث" }, @@ -3960,6 +3969,12 @@ "autoFillOnPageLoad": { "message": "Autofill on page load?" }, + "cardExpiredTitle": { + "message": "Expired card" + }, + "cardExpiredMessage": { + "message": "If you've renewed it, update the card's information" + }, "cardDetails": { "message": "Card details" }, @@ -3972,6 +3987,9 @@ } } }, + "enableAnimations": { + "message": "Enable animations" + }, "addAccount": { "message": "Add account" }, diff --git a/apps/browser/src/_locales/az/messages.json b/apps/browser/src/_locales/az/messages.json index 0c181277ce..90327c8542 100644 --- a/apps/browser/src/_locales/az/messages.json +++ b/apps/browser/src/_locales/az/messages.json @@ -25,9 +25,6 @@ "finishCreatingYourAccountBySettingAPassword": { "message": "Bir parol təyin edərək hesabınızı yaratmağı başa çatdırın" }, - "login": { - "message": "Giriş et" - }, "enterpriseSingleSignOn": { "message": "Müəssisə üçün tək daxil olma" }, @@ -1083,7 +1080,7 @@ "message": "Fayl qoşmaları üçün 1 GB şifrələnmiş saxlama sahəsi" }, "premiumSignUpEmergency": { - "message": "Emergency access" + "message": "Fövqəladə hal müraciəti" }, "premiumSignUpTwoStepOptions": { "message": "YubiKey və Duo kimi mülkiyyətçi iki addımlı giriş seçimləri." @@ -1107,7 +1104,7 @@ "message": "Premium üzvlüyü bitwarden.com veb anbarında satın ala bilərsiniz. İndi saytı ziyarət etmək istəyirsiniz?" }, "premiumPurchaseAlertV2": { - "message": "You can purchase Premium from your account settings on the Bitwarden web app." + "message": "Bitwarden veb tətbiqindəki hesab ayarlarınızda Premium satın ala bilərsiniz." }, "premiumCurrentMember": { "message": "Premium üzvsünüz!" @@ -1115,6 +1112,9 @@ "premiumCurrentMemberThanks": { "message": "Bitwarden-i dəstəklədiyiniz üçün təşəkkürlər!" }, + "premiumFeatures": { + "message": "Premium-a yüksəlt və bunları əldə et:" + }, "premiumPrice": { "message": "Hamısı sadəcə ildə $PRICE$!", "placeholders": { @@ -1124,6 +1124,15 @@ } } }, + "premiumPriceV2": { + "message": "Hamısı sadəcə ildə $PRICE$!", + "placeholders": { + "price": { + "content": "$1", + "example": "$10" + } + } + }, "refreshComplete": { "message": "Təzələmə tamamlandı" }, @@ -2305,11 +2314,11 @@ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "createdSendSuccessfully": { - "message": "Send created successfully!", + "message": "Send uğurla yaradıldı!", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendAvailability": { - "message": "The Send will be available to anyone with the link for the next $DAYS$ days.", + "message": "Send, növbəti $DAYS$ ərzində keçidə sahib olan hər kəsə əlçatan olacaq.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated.", "placeholders": { "days": { @@ -2319,7 +2328,7 @@ } }, "sendLinkCopied": { - "message": "Send link copied", + "message": "Send keçidi kopyalandı", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "editedSend": { @@ -3960,6 +3969,12 @@ "autoFillOnPageLoad": { "message": "Səhifə yüklənəndə avto-doldurulsun?" }, + "cardExpiredTitle": { + "message": "Vaxtı bitmiş kart" + }, + "cardExpiredMessage": { + "message": "Yeniləmisinizsə, kart məlumatlarınızı güncəlləyin" + }, "cardDetails": { "message": "Kart detalları" }, @@ -3972,6 +3987,9 @@ } } }, + "enableAnimations": { + "message": "Animasiyaları fəallaşdır" + }, "addAccount": { "message": "Hesab əlavə et" }, diff --git a/apps/browser/src/_locales/be/messages.json b/apps/browser/src/_locales/be/messages.json index dcf5c21eed..e06960c6b7 100644 --- a/apps/browser/src/_locales/be/messages.json +++ b/apps/browser/src/_locales/be/messages.json @@ -25,9 +25,6 @@ "finishCreatingYourAccountBySettingAPassword": { "message": "Finish creating your account by setting a password" }, - "login": { - "message": "Увайсці" - }, "enterpriseSingleSignOn": { "message": "Адзіны ўваход прадпрыемства (SSO)" }, @@ -1083,7 +1080,7 @@ "message": "1 ГБ зашыфраванага сховішча для далучаных файлаў." }, "premiumSignUpEmergency": { - "message": "Emergency access" + "message": "Emergency access." }, "premiumSignUpTwoStepOptions": { "message": "Proprietary two-step login options such as YubiKey and Duo." @@ -1115,6 +1112,9 @@ "premiumCurrentMemberThanks": { "message": "Дзякуй за падтрымку Bitwarden." }, + "premiumFeatures": { + "message": "Upgrade to premium and receive:" + }, "premiumPrice": { "message": "Усяго за $PRICE$ у год!", "placeholders": { @@ -1124,6 +1124,15 @@ } } }, + "premiumPriceV2": { + "message": "All for just $PRICE$ per year!", + "placeholders": { + "price": { + "content": "$1", + "example": "$10" + } + } + }, "refreshComplete": { "message": "Абнаўленне завершана" }, @@ -3960,6 +3969,12 @@ "autoFillOnPageLoad": { "message": "Autofill on page load?" }, + "cardExpiredTitle": { + "message": "Expired card" + }, + "cardExpiredMessage": { + "message": "If you've renewed it, update the card's information" + }, "cardDetails": { "message": "Card details" }, @@ -3972,6 +3987,9 @@ } } }, + "enableAnimations": { + "message": "Enable animations" + }, "addAccount": { "message": "Add account" }, diff --git a/apps/browser/src/_locales/bg/messages.json b/apps/browser/src/_locales/bg/messages.json index 87f0a53a3e..de9686623d 100644 --- a/apps/browser/src/_locales/bg/messages.json +++ b/apps/browser/src/_locales/bg/messages.json @@ -25,9 +25,6 @@ "finishCreatingYourAccountBySettingAPassword": { "message": "Завършете регистрацията си като зададете парола" }, - "login": { - "message": "Вписване" - }, "enterpriseSingleSignOn": { "message": "Еднократна идентификация (SSO)" }, @@ -1083,7 +1080,7 @@ "message": "1 GB пространство за файлове, които се шифрират." }, "premiumSignUpEmergency": { - "message": "Emergency access" + "message": "Авариен достъп" }, "premiumSignUpTwoStepOptions": { "message": "Частно двустепенно удостоверяване чрез YubiKey и Duo." @@ -1107,7 +1104,7 @@ "message": "Може да платите абонамента си през сайта bitwarden.com. Искате ли да го посетите сега?" }, "premiumPurchaseAlertV2": { - "message": "You can purchase Premium from your account settings on the Bitwarden web app." + "message": "Можете да закупите платената версия от настройките на регистрацията си, в приложението по уеб на Битуорден." }, "premiumCurrentMember": { "message": "Честито, ползвате платен абонамент!" @@ -1115,6 +1112,9 @@ "premiumCurrentMemberThanks": { "message": "Благодарим ви за подкрепата на Bitwarden." }, + "premiumFeatures": { + "message": "Преминете към платената версия и ще получите:" + }, "premiumPrice": { "message": "И това само за $PRICE$ на година!", "placeholders": { @@ -1124,6 +1124,15 @@ } } }, + "premiumPriceV2": { + "message": "И това само за $PRICE$ на година!", + "placeholders": { + "price": { + "content": "$1", + "example": "$10" + } + } + }, "refreshComplete": { "message": "Абонаментът е опреснен" }, @@ -3960,6 +3969,12 @@ "autoFillOnPageLoad": { "message": "Автоматично попълване при зареждане на страницата?" }, + "cardExpiredTitle": { + "message": "Изтекла карта" + }, + "cardExpiredMessage": { + "message": "Ако сте я подновили, актуализирайте информацията за картата" + }, "cardDetails": { "message": "Данни за картата" }, @@ -3972,6 +3987,9 @@ } } }, + "enableAnimations": { + "message": "Включване на анимациите" + }, "addAccount": { "message": "Добавяне на регистрация" }, diff --git a/apps/browser/src/_locales/bn/messages.json b/apps/browser/src/_locales/bn/messages.json index 7881e0658d..8bb46b60ab 100644 --- a/apps/browser/src/_locales/bn/messages.json +++ b/apps/browser/src/_locales/bn/messages.json @@ -25,9 +25,6 @@ "finishCreatingYourAccountBySettingAPassword": { "message": "Finish creating your account by setting a password" }, - "login": { - "message": "প্রবেশ করুন" - }, "enterpriseSingleSignOn": { "message": "এন্টারপ্রাইজ একক সাইন-অন" }, @@ -1083,7 +1080,7 @@ "message": "ফাইল সংযুক্তির জন্য ১ জিবি এনক্রিপ্টেড স্থান।" }, "premiumSignUpEmergency": { - "message": "Emergency access" + "message": "Emergency access." }, "premiumSignUpTwoStepOptions": { "message": "Proprietary two-step login options such as YubiKey and Duo." @@ -1115,6 +1112,9 @@ "premiumCurrentMemberThanks": { "message": "Bitwarden কে সমর্থন করার জন্য আপনাকে ধন্যবাদ।" }, + "premiumFeatures": { + "message": "Upgrade to premium and receive:" + }, "premiumPrice": { "message": "সমস্ত মাত্র $PRICE$ / বছরের জন্য!", "placeholders": { @@ -1124,6 +1124,15 @@ } } }, + "premiumPriceV2": { + "message": "All for just $PRICE$ per year!", + "placeholders": { + "price": { + "content": "$1", + "example": "$10" + } + } + }, "refreshComplete": { "message": "পুনঃসতেজ সম্পূর্ণ" }, @@ -3960,6 +3969,12 @@ "autoFillOnPageLoad": { "message": "Autofill on page load?" }, + "cardExpiredTitle": { + "message": "Expired card" + }, + "cardExpiredMessage": { + "message": "If you've renewed it, update the card's information" + }, "cardDetails": { "message": "Card details" }, @@ -3972,6 +3987,9 @@ } } }, + "enableAnimations": { + "message": "Enable animations" + }, "addAccount": { "message": "Add account" }, diff --git a/apps/browser/src/_locales/bs/messages.json b/apps/browser/src/_locales/bs/messages.json index 0a72dbfa47..9d53f1e0fd 100644 --- a/apps/browser/src/_locales/bs/messages.json +++ b/apps/browser/src/_locales/bs/messages.json @@ -25,9 +25,6 @@ "finishCreatingYourAccountBySettingAPassword": { "message": "Finish creating your account by setting a password" }, - "login": { - "message": "Prijavite se" - }, "enterpriseSingleSignOn": { "message": "Enterprise single sign-on" }, @@ -1083,7 +1080,7 @@ "message": "1 GB encrypted storage for file attachments." }, "premiumSignUpEmergency": { - "message": "Emergency access" + "message": "Emergency access." }, "premiumSignUpTwoStepOptions": { "message": "Proprietary two-step login options such as YubiKey and Duo." @@ -1115,6 +1112,9 @@ "premiumCurrentMemberThanks": { "message": "Thank you for supporting Bitwarden." }, + "premiumFeatures": { + "message": "Upgrade to premium and receive:" + }, "premiumPrice": { "message": "All for just $PRICE$ /year!", "placeholders": { @@ -1124,6 +1124,15 @@ } } }, + "premiumPriceV2": { + "message": "All for just $PRICE$ per year!", + "placeholders": { + "price": { + "content": "$1", + "example": "$10" + } + } + }, "refreshComplete": { "message": "Refresh complete" }, @@ -3960,6 +3969,12 @@ "autoFillOnPageLoad": { "message": "Autofill on page load?" }, + "cardExpiredTitle": { + "message": "Expired card" + }, + "cardExpiredMessage": { + "message": "If you've renewed it, update the card's information" + }, "cardDetails": { "message": "Card details" }, @@ -3972,6 +3987,9 @@ } } }, + "enableAnimations": { + "message": "Enable animations" + }, "addAccount": { "message": "Add account" }, diff --git a/apps/browser/src/_locales/ca/messages.json b/apps/browser/src/_locales/ca/messages.json index 3b961fa004..88f04d0b51 100644 --- a/apps/browser/src/_locales/ca/messages.json +++ b/apps/browser/src/_locales/ca/messages.json @@ -25,9 +25,6 @@ "finishCreatingYourAccountBySettingAPassword": { "message": "Acabeu de crear el vostre compte establint una contrasenya" }, - "login": { - "message": "Inicia sessió" - }, "enterpriseSingleSignOn": { "message": "Inici de sessió únic d'empresa" }, @@ -305,16 +302,16 @@ "message": "Edita la carpeta" }, "newFolder": { - "message": "New folder" + "message": "Carpeta nova" }, "folderName": { - "message": "Folder name" + "message": "Nom de la carpeta" }, "folderHintText": { - "message": "Nest a folder by adding the parent folder's name followed by a “/”. Example: Social/Forums" + "message": "Imbriqueu una carpeta afegint el nom de la carpeta principal seguit d'una \"/\". Exemple: Social/Fòrums" }, "noFoldersAdded": { - "message": "No folders added" + "message": "No s'ha afegit cap carpeta" }, "createFoldersToOrganize": { "message": "Create folders to organize your vault items" @@ -451,7 +448,7 @@ "message": "Preferit" }, "unfavorite": { - "message": "Suprimeix de Preferits" + "message": "Trau dels preferits" }, "itemAddedToFavorites": { "message": "Element afegit als preferits" @@ -850,7 +847,7 @@ "message": "Mostra les identitats a la pàgina de pestanya" }, "showIdentitiesCurrentTabDesc": { - "message": "Llista els elements d'identitat de la pàgina de pestanya per facilitar l'autoemplenat." + "message": "Llista els elements d'identitat de la pestanya de la pàgina per facilitar l'autoemplenat." }, "clearClipboard": { "message": "Buida el porta-retalls", @@ -1083,7 +1080,7 @@ "message": "1 GB d'emmagatzematge xifrat per als fitxers adjunts." }, "premiumSignUpEmergency": { - "message": "Emergency access" + "message": "Emergency access." }, "premiumSignUpTwoStepOptions": { "message": "Opcions propietàries de doble factor com ara YubiKey i Duo." @@ -1115,6 +1112,9 @@ "premiumCurrentMemberThanks": { "message": "Gràcies per donar suport a Bitwarden." }, + "premiumFeatures": { + "message": "Upgrade to premium and receive:" + }, "premiumPrice": { "message": "Tot per només $PRICE$ / any!", "placeholders": { @@ -1124,6 +1124,15 @@ } } }, + "premiumPriceV2": { + "message": "All for just $PRICE$ per year!", + "placeholders": { + "price": { + "content": "$1", + "example": "$10" + } + } + }, "refreshComplete": { "message": "Actualització completa" }, @@ -3132,11 +3141,11 @@ "message": "Alies de domini" }, "passwordRepromptDisabledAutofillOnPageLoad": { - "message": "Els elements amb una nova sol·licitud de contrasenya mestra no es poden omplir automàticament en carregar la pàgina. L'emplenament automàtic en carregar de la pàgina està desactivat.", + "message": "Els elements amb una nova sol·licitud de contrasenya mestra no es poden omplir automàticament en carregar la pàgina. L'emplenament automàtic en carregar la pàgina està desactivat.", "description": "Toast message for describing that master password re-prompt cannot be autofilled on page load." }, "autofillOnPageLoadSetToDefault": { - "message": "S'ha configurat l'emplenament automàtic en carregar la pàgina per que utilitze la configuració predeterminada.", + "message": "S'ha configurat l'emplenament automàtic en carregar la pàgina perquè utilitze la configuració predeterminada.", "description": "Toast message for informing the user that autofill on page load has been set to the default setting." }, "turnOffMasterPasswordPromptToEditField": { @@ -3960,6 +3969,12 @@ "autoFillOnPageLoad": { "message": "Autofill on page load?" }, + "cardExpiredTitle": { + "message": "Expired card" + }, + "cardExpiredMessage": { + "message": "If you've renewed it, update the card's information" + }, "cardDetails": { "message": "Card details" }, @@ -3972,6 +3987,9 @@ } } }, + "enableAnimations": { + "message": "Enable animations" + }, "addAccount": { "message": "Afig compte" }, diff --git a/apps/browser/src/_locales/cs/messages.json b/apps/browser/src/_locales/cs/messages.json index b22f6ff55f..b16040f327 100644 --- a/apps/browser/src/_locales/cs/messages.json +++ b/apps/browser/src/_locales/cs/messages.json @@ -25,9 +25,6 @@ "finishCreatingYourAccountBySettingAPassword": { "message": "Dokončete vytváření účtu nastavením hesla" }, - "login": { - "message": "Přihlásit se" - }, "enterpriseSingleSignOn": { "message": "Jednotné podnikové přihlášení" }, @@ -1115,6 +1112,9 @@ "premiumCurrentMemberThanks": { "message": "Děkujeme za podporu Bitwardenu." }, + "premiumFeatures": { + "message": "Přejděte na Premium a získáte:" + }, "premiumPrice": { "message": "Vše jen za $PRICE$ ročně!", "placeholders": { @@ -1124,6 +1124,15 @@ } } }, + "premiumPriceV2": { + "message": "Vše jen za $PRICE$ ročně!", + "placeholders": { + "price": { + "content": "$1", + "example": "$10" + } + } + }, "refreshComplete": { "message": "Obnova je dokončena" }, @@ -3960,6 +3969,12 @@ "autoFillOnPageLoad": { "message": "Automaticky vyplnit při načtení stránky?" }, + "cardExpiredTitle": { + "message": "Prošlá karta" + }, + "cardExpiredMessage": { + "message": "Pokud jste ji obnovili, aktualizujte informace o kartě" + }, "cardDetails": { "message": "Podrobnosti karty" }, @@ -3972,6 +3987,9 @@ } } }, + "enableAnimations": { + "message": "Povolit animace" + }, "addAccount": { "message": "Přidat účet" }, diff --git a/apps/browser/src/_locales/cy/messages.json b/apps/browser/src/_locales/cy/messages.json index 4d3f9a9b49..295f970b18 100644 --- a/apps/browser/src/_locales/cy/messages.json +++ b/apps/browser/src/_locales/cy/messages.json @@ -25,9 +25,6 @@ "finishCreatingYourAccountBySettingAPassword": { "message": "Finish creating your account by setting a password" }, - "login": { - "message": "Mewngofnodi" - }, "enterpriseSingleSignOn": { "message": "Enterprise single sign-on" }, @@ -1083,7 +1080,7 @@ "message": "Storfa 1GB wedi'i hamgryptio ar gyfer atodiadau ffeiliau." }, "premiumSignUpEmergency": { - "message": "Emergency access" + "message": "Emergency access." }, "premiumSignUpTwoStepOptions": { "message": "Dewisiadau mewngofnodi dau gam perchenogol megis YubiKey a Duo." @@ -1115,6 +1112,9 @@ "premiumCurrentMemberThanks": { "message": "Diolch am gefnogi Bitwarden." }, + "premiumFeatures": { + "message": "Upgrade to premium and receive:" + }, "premiumPrice": { "message": "Hyn oll am $PRICE$ y flwyddyn!", "placeholders": { @@ -1124,6 +1124,15 @@ } } }, + "premiumPriceV2": { + "message": "All for just $PRICE$ per year!", + "placeholders": { + "price": { + "content": "$1", + "example": "$10" + } + } + }, "refreshComplete": { "message": "Refresh complete" }, @@ -3960,6 +3969,12 @@ "autoFillOnPageLoad": { "message": "Autofill on page load?" }, + "cardExpiredTitle": { + "message": "Expired card" + }, + "cardExpiredMessage": { + "message": "If you've renewed it, update the card's information" + }, "cardDetails": { "message": "Card details" }, @@ -3972,6 +3987,9 @@ } } }, + "enableAnimations": { + "message": "Enable animations" + }, "addAccount": { "message": "Ychwanegu cyfrif" }, diff --git a/apps/browser/src/_locales/da/messages.json b/apps/browser/src/_locales/da/messages.json index 8f35a21bb1..ea5d1eae3c 100644 --- a/apps/browser/src/_locales/da/messages.json +++ b/apps/browser/src/_locales/da/messages.json @@ -25,9 +25,6 @@ "finishCreatingYourAccountBySettingAPassword": { "message": "Afslut kontooprettelsen med at indstille en adgangskode" }, - "login": { - "message": "Log ind" - }, "enterpriseSingleSignOn": { "message": "Virksomheds Single-Sign-On" }, @@ -1115,6 +1112,9 @@ "premiumCurrentMemberThanks": { "message": "Tak fordi du støtter Bitwarden." }, + "premiumFeatures": { + "message": "Opgradér til Premium og modtag:" + }, "premiumPrice": { "message": "Alt dette for kun $PRICE$ /år!", "placeholders": { @@ -1124,6 +1124,15 @@ } } }, + "premiumPriceV2": { + "message": "Alt dette for kun $PRICE$ pr. år!", + "placeholders": { + "price": { + "content": "$1", + "example": "$10" + } + } + }, "refreshComplete": { "message": "Opdatering færdig" }, @@ -3960,6 +3969,12 @@ "autoFillOnPageLoad": { "message": "Autofill on page load?" }, + "cardExpiredTitle": { + "message": "Udløbet kort" + }, + "cardExpiredMessage": { + "message": "Er det blevet fornyet, opdatér venligst kortoplysningerne" + }, "cardDetails": { "message": "Kortoplysninger" }, @@ -3972,6 +3987,9 @@ } } }, + "enableAnimations": { + "message": "Aktivér animationer" + }, "addAccount": { "message": "Tilføj konto" }, diff --git a/apps/browser/src/_locales/de/messages.json b/apps/browser/src/_locales/de/messages.json index 2c68a9e6db..658b95e5e0 100644 --- a/apps/browser/src/_locales/de/messages.json +++ b/apps/browser/src/_locales/de/messages.json @@ -25,9 +25,6 @@ "finishCreatingYourAccountBySettingAPassword": { "message": "Schließe die Erstellung deines Kontos ab, indem du ein Passwort festlegst" }, - "login": { - "message": "Anmelden" - }, "enterpriseSingleSignOn": { "message": "Enterprise Single-Sign-On" }, @@ -1083,7 +1080,7 @@ "message": "1 GB verschlüsselter Speicherplatz für Dateianhänge." }, "premiumSignUpEmergency": { - "message": "Emergency access" + "message": "Notfallzugriff." }, "premiumSignUpTwoStepOptions": { "message": "Proprietäre Optionen für die Zwei-Faktor Authentifizierung wie YubiKey und Duo." @@ -1107,7 +1104,7 @@ "message": "Du kannst deine Premium-Mitgliedschaft im Bitwarden.com Web-Tresor kaufen. Möchtest du die Website jetzt besuchen?" }, "premiumPurchaseAlertV2": { - "message": "You can purchase Premium from your account settings on the Bitwarden web app." + "message": "Du kannst Premium über deine Kontoeinstellungen in der Bitwarden Web-App kaufen." }, "premiumCurrentMember": { "message": "Du bist jetzt Premium-Mitglied!" @@ -1115,6 +1112,9 @@ "premiumCurrentMemberThanks": { "message": "Vielen Dank, dass du Bitwarden unterstützt." }, + "premiumFeatures": { + "message": "Upgrade auf Premium und erhalte:" + }, "premiumPrice": { "message": "Das alles für %price% pro Jahr!", "placeholders": { @@ -1124,6 +1124,15 @@ } } }, + "premiumPriceV2": { + "message": "Alles für nur $PRICE$ pro Jahr!", + "placeholders": { + "price": { + "content": "$1", + "example": "$10" + } + } + }, "refreshComplete": { "message": "Aktualisierung abgeschlossen" }, @@ -2305,11 +2314,11 @@ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "createdSendSuccessfully": { - "message": "Send created successfully!", + "message": "Send erfolgreich erstellt!", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendAvailability": { - "message": "The Send will be available to anyone with the link for the next $DAYS$ days.", + "message": "Das Send wird jedem mit dem Link für die nächsten $DAYS$ Tage zur Verfügung stehen.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated.", "placeholders": { "days": { @@ -2319,7 +2328,7 @@ } }, "sendLinkCopied": { - "message": "Send link copied", + "message": "Send-Link kopiert", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "editedSend": { @@ -3960,6 +3969,12 @@ "autoFillOnPageLoad": { "message": "Auto-Ausfüllen beim Laden einer Seite?" }, + "cardExpiredTitle": { + "message": "Abgelaufene Karte" + }, + "cardExpiredMessage": { + "message": "Wenn du die Karte erneuert hast, aktualisiere die Angaben zur Karte" + }, "cardDetails": { "message": "Kartendetails" }, @@ -3972,6 +3987,9 @@ } } }, + "enableAnimations": { + "message": "Enable animations" + }, "addAccount": { "message": "Konto hinzufügen" }, diff --git a/apps/browser/src/_locales/el/messages.json b/apps/browser/src/_locales/el/messages.json index 2811dcf1b5..83a77c6b38 100644 --- a/apps/browser/src/_locales/el/messages.json +++ b/apps/browser/src/_locales/el/messages.json @@ -25,9 +25,6 @@ "finishCreatingYourAccountBySettingAPassword": { "message": "Ολοκληρώστε τη δημιουργία του λογαριασμού σας ορίζοντας έναν κωδικό πρόσβασης" }, - "login": { - "message": "Σύνδεση" - }, "enterpriseSingleSignOn": { "message": "Ενιαία είσοδος για επιχειρήσεις" }, @@ -1083,7 +1080,7 @@ "message": "1 GB κρυπτογραφημένο αποθηκευτικό χώρο για συνημμένα αρχεία." }, "premiumSignUpEmergency": { - "message": "Πρόσβαση έκτακτης ανάγκης" + "message": "Emergency access." }, "premiumSignUpTwoStepOptions": { "message": "Πρόσθετες επιλογές σύνδεσης δύο βημάτων, όπως το YubiKey και το Duo." @@ -1107,7 +1104,7 @@ "message": "Μπορείτε να αγοράσετε συνδρομή Premium στο διαδικτυακό θησαυ/κιο του bitwarden.com. Θέλετε να επισκεφθείτε την ιστοσελίδα τώρα;" }, "premiumPurchaseAlertV2": { - "message": "Μπορείτε να αγοράσετε το Premium από τις ρυθμίσεις λογαριασμού σας στην διαδικτυακή εφαρμογή Bitwarden." + "message": "You can purchase Premium from your account settings on the Bitwarden web app." }, "premiumCurrentMember": { "message": "Είστε Premium μέλος!" @@ -1115,6 +1112,9 @@ "premiumCurrentMemberThanks": { "message": "Ευχαριστούμε που υποστηρίζετε το Bitwarden." }, + "premiumFeatures": { + "message": "Upgrade to premium and receive:" + }, "premiumPrice": { "message": "Όλα για μόνο $PRICE$ /έτος!", "placeholders": { @@ -1124,6 +1124,15 @@ } } }, + "premiumPriceV2": { + "message": "All for just $PRICE$ per year!", + "placeholders": { + "price": { + "content": "$1", + "example": "$10" + } + } + }, "refreshComplete": { "message": "Επιτυχής ανανέωση" }, @@ -2305,7 +2314,7 @@ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "createdSendSuccessfully": { - "message": "Το Send δημιουργήθηκε επιτυχώς!", + "message": "Send created successfully!", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendAvailability": { @@ -2319,7 +2328,7 @@ } }, "sendLinkCopied": { - "message": "Ο σύνδεσμος Send αντιγράφηκε", + "message": "Send link copied", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "editedSend": { @@ -3960,6 +3969,12 @@ "autoFillOnPageLoad": { "message": "Αυτόματη συμπλήρωση κατά τη φόρτωση της σελίδας;" }, + "cardExpiredTitle": { + "message": "Expired card" + }, + "cardExpiredMessage": { + "message": "If you've renewed it, update the card's information" + }, "cardDetails": { "message": "Στοιχεία κάρτας" }, @@ -3972,6 +3987,9 @@ } } }, + "enableAnimations": { + "message": "Enable animations" + }, "addAccount": { "message": "Προσθήκη λογαριασμού" }, diff --git a/apps/browser/src/_locales/en/messages.json b/apps/browser/src/_locales/en/messages.json index 6dc0a93059..1e8fd03ade 100644 --- a/apps/browser/src/_locales/en/messages.json +++ b/apps/browser/src/_locales/en/messages.json @@ -25,9 +25,6 @@ "finishCreatingYourAccountBySettingAPassword": { "message": "Finish creating your account by setting a password" }, - "login": { - "message": "Log in" - }, "enterpriseSingleSignOn": { "message": "Enterprise single sign-on" }, @@ -3990,6 +3987,9 @@ } } }, + "enableAnimations": { + "message": "Enable animations" + }, "addAccount": { "message": "Add account" }, diff --git a/apps/browser/src/_locales/en_GB/messages.json b/apps/browser/src/_locales/en_GB/messages.json index 5146e6151d..49a2f0d3f3 100644 --- a/apps/browser/src/_locales/en_GB/messages.json +++ b/apps/browser/src/_locales/en_GB/messages.json @@ -25,9 +25,6 @@ "finishCreatingYourAccountBySettingAPassword": { "message": "Finish creating your account by setting a password" }, - "login": { - "message": "Log in" - }, "enterpriseSingleSignOn": { "message": "Enterprise single sign-on" }, @@ -1115,6 +1112,9 @@ "premiumCurrentMemberThanks": { "message": "Thank you for supporting Bitwarden." }, + "premiumFeatures": { + "message": "Upgrade to premium and receive:" + }, "premiumPrice": { "message": "All for just $PRICE$ /year!", "placeholders": { @@ -1124,6 +1124,15 @@ } } }, + "premiumPriceV2": { + "message": "All for just $PRICE$ per year!", + "placeholders": { + "price": { + "content": "$1", + "example": "$10" + } + } + }, "refreshComplete": { "message": "Refresh complete" }, @@ -3960,6 +3969,12 @@ "autoFillOnPageLoad": { "message": "Autofill on page load?" }, + "cardExpiredTitle": { + "message": "Expired card" + }, + "cardExpiredMessage": { + "message": "If you've renewed it, update the card's information" + }, "cardDetails": { "message": "Card details" }, @@ -3972,6 +3987,9 @@ } } }, + "enableAnimations": { + "message": "Enable animations" + }, "addAccount": { "message": "Add account" }, diff --git a/apps/browser/src/_locales/en_IN/messages.json b/apps/browser/src/_locales/en_IN/messages.json index 8cb0875739..97288cb696 100644 --- a/apps/browser/src/_locales/en_IN/messages.json +++ b/apps/browser/src/_locales/en_IN/messages.json @@ -25,9 +25,6 @@ "finishCreatingYourAccountBySettingAPassword": { "message": "Finish creating your account by setting a password" }, - "login": { - "message": "Log in" - }, "enterpriseSingleSignOn": { "message": "Enterprise single sign-on" }, @@ -1115,6 +1112,9 @@ "premiumCurrentMemberThanks": { "message": "Thank you for supporting Bitwarden." }, + "premiumFeatures": { + "message": "Upgrade to premium and receive:" + }, "premiumPrice": { "message": "All for just $PRICE$ /year!", "placeholders": { @@ -1124,6 +1124,15 @@ } } }, + "premiumPriceV2": { + "message": "All for just $PRICE$ per year!", + "placeholders": { + "price": { + "content": "$1", + "example": "$10" + } + } + }, "refreshComplete": { "message": "Refresh complete" }, @@ -3960,6 +3969,12 @@ "autoFillOnPageLoad": { "message": "Autofill on page load?" }, + "cardExpiredTitle": { + "message": "Expired card" + }, + "cardExpiredMessage": { + "message": "If you've renewed it, update the card's information" + }, "cardDetails": { "message": "Card details" }, @@ -3972,6 +3987,9 @@ } } }, + "enableAnimations": { + "message": "Enable animations" + }, "addAccount": { "message": "Add account" }, diff --git a/apps/browser/src/_locales/es/messages.json b/apps/browser/src/_locales/es/messages.json index 2ab3499784..a3eb6c468c 100644 --- a/apps/browser/src/_locales/es/messages.json +++ b/apps/browser/src/_locales/es/messages.json @@ -25,9 +25,6 @@ "finishCreatingYourAccountBySettingAPassword": { "message": "Termina de crear tu cuenta estableciendo una contraseña" }, - "login": { - "message": "Iniciar sesión" - }, "enterpriseSingleSignOn": { "message": "Inicio de sesión único empresarial" }, @@ -1083,7 +1080,7 @@ "message": "1 GB de espacio cifrado en disco para adjuntos." }, "premiumSignUpEmergency": { - "message": "Emergency access" + "message": "Emergency access." }, "premiumSignUpTwoStepOptions": { "message": "Opciones de inicio de sesión con autenticación de dos pasos propietarios como YubiKey y Duo." @@ -1115,6 +1112,9 @@ "premiumCurrentMemberThanks": { "message": "Gracias por apoyar el desarrollo de Bitwarden." }, + "premiumFeatures": { + "message": "Upgrade to premium and receive:" + }, "premiumPrice": { "message": "¡Todo por solo %price% /año!", "placeholders": { @@ -1124,6 +1124,15 @@ } } }, + "premiumPriceV2": { + "message": "All for just $PRICE$ per year!", + "placeholders": { + "price": { + "content": "$1", + "example": "$10" + } + } + }, "refreshComplete": { "message": "Actualización completada" }, @@ -3960,6 +3969,12 @@ "autoFillOnPageLoad": { "message": "Autofill on page load?" }, + "cardExpiredTitle": { + "message": "Expired card" + }, + "cardExpiredMessage": { + "message": "If you've renewed it, update the card's information" + }, "cardDetails": { "message": "Datos de la tarjeta" }, @@ -3972,6 +3987,9 @@ } } }, + "enableAnimations": { + "message": "Enable animations" + }, "addAccount": { "message": "Añadir cuenta" }, diff --git a/apps/browser/src/_locales/et/messages.json b/apps/browser/src/_locales/et/messages.json index d707cd5108..ee717416ac 100644 --- a/apps/browser/src/_locales/et/messages.json +++ b/apps/browser/src/_locales/et/messages.json @@ -25,9 +25,6 @@ "finishCreatingYourAccountBySettingAPassword": { "message": "Lõpeta konto loomine parooli luues" }, - "login": { - "message": "Logi sisse" - }, "enterpriseSingleSignOn": { "message": "Ettevõtte ühekordne sisselogimine" }, @@ -1083,7 +1080,7 @@ "message": "1 GB ulatuses krüpteeritud salvestusruum." }, "premiumSignUpEmergency": { - "message": "Emergency access" + "message": "Emergency access." }, "premiumSignUpTwoStepOptions": { "message": "Proprietary two-step login options such as YubiKey and Duo." @@ -1115,6 +1112,9 @@ "premiumCurrentMemberThanks": { "message": "Täname, et toetad Bitwardenit." }, + "premiumFeatures": { + "message": "Upgrade to premium and receive:" + }, "premiumPrice": { "message": "Kõik see ainult $PRICE$ / aastas!", "placeholders": { @@ -1124,6 +1124,15 @@ } } }, + "premiumPriceV2": { + "message": "All for just $PRICE$ per year!", + "placeholders": { + "price": { + "content": "$1", + "example": "$10" + } + } + }, "refreshComplete": { "message": "Uuendamine lõpetatud" }, @@ -3960,6 +3969,12 @@ "autoFillOnPageLoad": { "message": "Autofill on page load?" }, + "cardExpiredTitle": { + "message": "Expired card" + }, + "cardExpiredMessage": { + "message": "If you've renewed it, update the card's information" + }, "cardDetails": { "message": "Card details" }, @@ -3972,6 +3987,9 @@ } } }, + "enableAnimations": { + "message": "Enable animations" + }, "addAccount": { "message": "Add account" }, diff --git a/apps/browser/src/_locales/eu/messages.json b/apps/browser/src/_locales/eu/messages.json index c407fcd74e..e04be28270 100644 --- a/apps/browser/src/_locales/eu/messages.json +++ b/apps/browser/src/_locales/eu/messages.json @@ -25,9 +25,6 @@ "finishCreatingYourAccountBySettingAPassword": { "message": "Finish creating your account by setting a password" }, - "login": { - "message": "Hasi saioa" - }, "enterpriseSingleSignOn": { "message": "Enpresentzako saio hasiera bakarra" }, @@ -1083,7 +1080,7 @@ "message": "Eranskinentzako 1GB-eko zifratutako biltegia." }, "premiumSignUpEmergency": { - "message": "Emergency access" + "message": "Emergency access." }, "premiumSignUpTwoStepOptions": { "message": "Proprietary two-step login options such as YubiKey and Duo." @@ -1115,6 +1112,9 @@ "premiumCurrentMemberThanks": { "message": "Eskerrik asko Bitwarden babesteagatik." }, + "premiumFeatures": { + "message": "Upgrade to premium and receive:" + }, "premiumPrice": { "message": "Dena, urtean $PRICE$gatik!", "placeholders": { @@ -1124,6 +1124,15 @@ } } }, + "premiumPriceV2": { + "message": "All for just $PRICE$ per year!", + "placeholders": { + "price": { + "content": "$1", + "example": "$10" + } + } + }, "refreshComplete": { "message": "Eguneratzea eginda" }, @@ -3960,6 +3969,12 @@ "autoFillOnPageLoad": { "message": "Autofill on page load?" }, + "cardExpiredTitle": { + "message": "Expired card" + }, + "cardExpiredMessage": { + "message": "If you've renewed it, update the card's information" + }, "cardDetails": { "message": "Card details" }, @@ -3972,6 +3987,9 @@ } } }, + "enableAnimations": { + "message": "Enable animations" + }, "addAccount": { "message": "Add account" }, diff --git a/apps/browser/src/_locales/fa/messages.json b/apps/browser/src/_locales/fa/messages.json index fa178ccbd8..159a7f49e9 100644 --- a/apps/browser/src/_locales/fa/messages.json +++ b/apps/browser/src/_locales/fa/messages.json @@ -25,9 +25,6 @@ "finishCreatingYourAccountBySettingAPassword": { "message": "ایجاد حساب خود را با تنظیم رمز عبور تکمیل کنید" }, - "login": { - "message": "ورود" - }, "enterpriseSingleSignOn": { "message": "ورود به سیستم پروژه" }, @@ -1083,7 +1080,7 @@ "message": "۱ گیگابایت فضای ذخیره سازی رمزگذاری شده برای پیوست های پرونده." }, "premiumSignUpEmergency": { - "message": "Emergency access" + "message": "Emergency access." }, "premiumSignUpTwoStepOptions": { "message": "گزینه های ورود اضافی دو مرحله ای مانند YubiKey و Duo." @@ -1115,6 +1112,9 @@ "premiumCurrentMemberThanks": { "message": "برای حمایتتان از Bitwarden سپاسگزاریم." }, + "premiumFeatures": { + "message": "Upgrade to premium and receive:" + }, "premiumPrice": { "message": "تمامش فقط $PRICE$ در سال!", "placeholders": { @@ -1124,6 +1124,15 @@ } } }, + "premiumPriceV2": { + "message": "All for just $PRICE$ per year!", + "placeholders": { + "price": { + "content": "$1", + "example": "$10" + } + } + }, "refreshComplete": { "message": "نوسازی کامل شد" }, @@ -3960,6 +3969,12 @@ "autoFillOnPageLoad": { "message": "Autofill on page load?" }, + "cardExpiredTitle": { + "message": "Expired card" + }, + "cardExpiredMessage": { + "message": "If you've renewed it, update the card's information" + }, "cardDetails": { "message": "Card details" }, @@ -3972,6 +3987,9 @@ } } }, + "enableAnimations": { + "message": "Enable animations" + }, "addAccount": { "message": "Add account" }, diff --git a/apps/browser/src/_locales/fi/messages.json b/apps/browser/src/_locales/fi/messages.json index 5aa1a0d138..b9f3df94e4 100644 --- a/apps/browser/src/_locales/fi/messages.json +++ b/apps/browser/src/_locales/fi/messages.json @@ -7,7 +7,7 @@ "description": "Extension name, MUST be less than 40 characters (Safari restriction)" }, "extDesc": { - "message": "Kotona, töissä tai reissussa, Bitwarden suojaa salasanasi, suojausavaimesi ja arkaluonteiset tietosi helposti.", + "message": "Kotona, töissä tai reissussa, Bitwarden suojaa salasanasi, pääsyavaimesi ja arkaluonteiset tietosi helposti.", "description": "Extension description, MUST be less than 112 characters (Safari restriction)" }, "loginOrCreateNewAccount": { @@ -25,9 +25,6 @@ "finishCreatingYourAccountBySettingAPassword": { "message": "Viimeistele tilin luonti asettamalla salasana" }, - "login": { - "message": "Kirjaudu" - }, "enterpriseSingleSignOn": { "message": "Yrityksen kertakirjautuminen (SSO)" }, @@ -311,13 +308,13 @@ "message": "Kansion nimi" }, "folderHintText": { - "message": "Luo alikansioita lisäämällä olemassa olevan kansion nimi merkin “/” jälkeen. Esim: Some/Foorumit" + "message": "Luo alikansio lisäämällä olemassa olevan kansion nimi \"/\"-merkin jälkeen. Esim: Some/Foorumit." }, "noFoldersAdded": { "message": "Kansioita ei ole lisätty" }, "createFoldersToOrganize": { - "message": "Luo kansioita järjestääksesi holvisi kohteita" + "message": "Lajittele holvisi kohteita luomalla kansioita" }, "deleteFolderPermanently": { "message": "Haluatko varmasti poistaa kansion pysyvästi?" @@ -718,7 +715,7 @@ "message": "Aloita rekisteröityminen alusta tai yritä kirjautua sisään uudelleen." }, "youMayAlreadyHaveAnAccount": { - "message": "Sinulla saattaa olla jo tili" + "message": "Sinulla saattaa jo olla tili" }, "logOutConfirmation": { "message": "Haluatko varmasti kirjautua ulos?" @@ -739,7 +736,7 @@ "message": "Kansio lisätty" }, "twoStepLoginConfirmation": { - "message": "Kaksivaiheinen kirjautuminen parantaa tilisi suojausta vaatimalla kirjautumisen vahvistuksen salasanan lisäksi todennuslaitteen, ‑sovelluksen, tekstiviestin, puhelun tai sähköpostin avulla. Voit ottaa kaksivaiheisen kirjautumisen käyttöön bitwarden.com‑verkkoholvissa. Haluatko avata sen nyt?" + "message": "Kaksivaiheinen kirjautuminen parantaa tilisi suojausta vaatimalla kirjautumisen vahvistuksen salasanan lisäksi suojausavaimen, ‑sovelluksen, tekstiviestin, puhelun tai sähköpostin avulla. Voit ottaa kaksivaiheisen kirjautumisen käyttöön bitwarden.com‑verkkoholvissa. Haluatko avata sen nyt?" }, "editedFolder": { "message": "Kansio tallennettiin" @@ -876,10 +873,10 @@ "message": "Tarjoa kirjautumistiedon salasanan päivitystä, kun verkkosivustolla havaitaan uusi salasana. Koskee kaikkia kirjautuneita tilejä." }, "enableUsePasskeys": { - "message": "Tarjoa suojausvainten tallennusta ja käyttöä" + "message": "Tarjoa pääsyavainten tallennusta ja käyttöä" }, "usePasskeysDesc": { - "message": "Tarjoa tallennusta uusille suojausavaimille tai kirjautumista holvissasi olevilla salausavaimilla. Koskee kaikkia kirjautuneita tilejä." + "message": "Tarjoa uusien pääsyavainten tallennusta sekä kirjautumista holvissasi olevilla pääsyavaimilla. Koskee kaikkia kirjautuneita tilejä." }, "notificationChangeDesc": { "message": "Haluatko päivittää salasanan Bitwardeniin?" @@ -1083,7 +1080,7 @@ "message": "1 Gt salattua tallennustilaa tiedostoliitteille." }, "premiumSignUpEmergency": { - "message": "Emergency access" + "message": "Varmuuskäyttö" }, "premiumSignUpTwoStepOptions": { "message": "Omisteiset kaksivaiheisen kirjautumisen vaihtoehdot, kuten YubiKey ja Duo." @@ -1107,7 +1104,7 @@ "message": "Voit ostaa Premium-jäsenyyden bitwarden.com-verkkoholvista. Haluatko avata sivuston nyt?" }, "premiumPurchaseAlertV2": { - "message": "You can purchase Premium from your account settings on the Bitwarden web app." + "message": "Voit ostaa Premiumin tiliasetuksistasi Bitwardenin verkkosovelluksen kautta." }, "premiumCurrentMember": { "message": "Olet Premium-jäsen!" @@ -1115,6 +1112,9 @@ "premiumCurrentMemberThanks": { "message": "Kiitos kun tuet Bitwardenia." }, + "premiumFeatures": { + "message": "Päivitä premium-tilaukseen ja saat:" + }, "premiumPrice": { "message": "Kaikki tämä vain $PRICE$/vuosi!", "placeholders": { @@ -1124,6 +1124,15 @@ } } }, + "premiumPriceV2": { + "message": "Kaikki tämä vain $PRICE$/vuosi!", + "placeholders": { + "price": { + "content": "$1", + "example": "$10" + } + } + }, "refreshComplete": { "message": "Päivitys valmistui" }, @@ -1143,10 +1152,10 @@ "message": "Tämä ominaisuus edellyttää Premium-jäsenyyttä." }, "enterVerificationCodeApp": { - "message": "Syötä 6-numeroinen todennuskoodi todennussovelluksestasi." + "message": "Syötä todennussovelluksesi näyttämä kuusinumeroinen todennuskoodi." }, "enterVerificationCodeEmail": { - "message": "Syötä 6-numeroinen todennuskoodi, joka lähetettiin sähköpostitse osoitteeseen $EMAIL$.", + "message": "Syötä osoitteeseen $EMAIL$ lähetetty kuusinumeroinen todennuskoodi.", "placeholders": { "email": { "content": "$1", @@ -1176,7 +1185,7 @@ "message": "Kytke YubiKey-todennuslaitteesi tietokoneen USB-porttiin ja paina sen painiketta." }, "insertU2f": { - "message": "Kytke todennuslaitteesi tietokoneen USB-porttiin. Jos laitteessa on painike, paina sitä." + "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." @@ -1213,7 +1222,7 @@ "description": "'Bitwarden Authenticator' is a product name and should not be translated." }, "yubiKeyTitleV2": { - "message": "Yubico OTP -todennuslaite" + "message": "Yubico OTP -suojausavain" }, "yubiKeyDesc": { "message": "Käytä YubiKey-todennuslaitetta tilisi avaukseen. Toimii YubiKey 4, 4 Nano, 4C sekä NEO -laitteiden kanssa." @@ -1223,14 +1232,14 @@ "description": "'Duo Security' and 'Duo Mobile' are product names and should not be translated." }, "duoOrganizationDesc": { - "message": "Vahvista organisaatiollesi Duo Securityn avulla käyttäen Duo Mobile ‑sovellusta, tekstiviestiä, puhelua tai U2F-todennuslaitetta.", + "message": "Vahvista organisaatiollesi Duo Securityn avulla käyttäen Duo Mobile ‑sovellusta, tekstiviestiä, puhelua tai U2F-suojausavainta.", "description": "'Duo Security' and 'Duo Mobile' are product names and should not be translated." }, "webAuthnTitle": { "message": "FIDO2 WebAuthn" }, "webAuthnDesc": { - "message": "Käytä mitä tahansa WebAuthn‑yhteensopivaa todennuslaitetta päästäksesi käsiksi tiliisi." + "message": "Käytä mitä tahansa WebAuthn‑yhteensopivaa suojausavainta päästäksesi tilillesi." }, "emailTitle": { "message": "Sähköposti" @@ -1843,7 +1852,7 @@ "message": "Käytä tätä käyttäjätunnusta" }, "securePasswordGenerated": { - "message": "Turvallinen salasana luotu! Muista myös päivittää salasana verkkosivustolla." + "message": "Turvallinen salasana luotiin! Muista päivittää salasana myös verkkosivustolla." }, "useGeneratorHelpTextPartOne": { "message": "Käytä generaattoria", @@ -2305,11 +2314,11 @@ "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": "Sendin luonti onnistui!", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendAvailability": { - "message": "The Send will be available to anyone with the link for the next $DAYS$ days.", + "message": "Tämän linkin välityksellä Send on kenen tahansa avattavissa seuraavien $DAYS$ päivän ajan.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated.", "placeholders": { "days": { @@ -2319,7 +2328,7 @@ } }, "sendLinkCopied": { - "message": "Send link copied", + "message": "Send-linkki kopioitiin", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "editedSend": { @@ -3054,7 +3063,7 @@ } }, "singleFieldNeedsAttention": { - "message": "1 kenttä vaatii huomiotasi." + "message": "Yksi kenttä vaatii huomiotasi." }, "multipleFieldsNeedAttention": { "message": "$COUNT$ kenttää vaatii huomiotasi.", @@ -3400,25 +3409,25 @@ "message": "Holvin tiedot on viety" }, "typePasskey": { - "message": "Suojausavain" + "message": "Pääsyavain" }, "passkeyNotCopied": { - "message": "Suojausavainta ei kopioida" + "message": "Pääsyavainta ei kopioida" }, "passkeyNotCopiedAlert": { - "message": "Suojausavain ei kopioidu kloonattuun kohteeseen. Haluatko jatkaa kloonausta?" + "message": "Pääsyavain ei kopioidu kloonattuun kohteeseen. Haluatko jatkaa kloonausta?" }, "passkeyFeatureIsNotImplementedForAccountsWithoutMasterPassword": { - "message": "Käynnistävä sivusto edellyttää todennusta. Ominaisuutta ei ole vielä toteutettu tileille, joilla ei ole pääsalasanaa." + "message": "Käynnistänyt sivusto edellyttää vahvistusta. Ominaisuutta ei ole vielä toteutettu tileille, joilla ei ole pääsalasanaa." }, "logInWithPasskey": { - "message": "Kirjaudutaanko suojausavaimella?" + "message": "Kirjaudutaanko pääsyavaimella?" }, "passkeyAlreadyExists": { - "message": "Tälle sovellukselle on jo tallennettu suojausavain." + "message": "Tälle sovellukselle on jo tallennettu pääsyavain." }, "noPasskeysFoundForThisApplication": { - "message": "Tälle sovellukselle ei löytynyt suojausavaimia." + "message": "Tälle sovellukselle ei löytynyt pääsyavaimia." }, "noMatchingPasskeyLogin": { "message": "Holvissasi ei ole tälle sivustolle sopivaa kirjautumistietoa." @@ -3427,28 +3436,28 @@ "message": "Vahvista" }, "savePasskey": { - "message": "Tallenna suojausavain" + "message": "Tallenna pääsyavain" }, "savePasskeyNewLogin": { - "message": "Tallenna suojausavain uuteen kirjautumistietoon" + "message": "Tallenna pääsyavain uuteen kirjautumistietoon" }, "choosePasskey": { - "message": "Valitse kirjautumistieto, johon suojausavain tallennetaan" + "message": "Valitse kirjautumistieto, johon pääsyavain tallennetaan" }, "passkeyItem": { - "message": "Suojausavainkohde" + "message": "Pääsyavainkohde" }, "overwritePasskey": { - "message": "Korvataanko suojausavain?" + "message": "Korvataanko pääsyavain?" }, "overwritePasskeyAlert": { - "message": "Kohde sisältää jo suojausavaimen. Haluatko varmasti korvata nykyisen suojausavaimen?" + "message": "Kohde sisältää jo pääsyavaimen. Haluatko varmasti korvata nykyisen avaimen?" }, "featureNotSupported": { "message": "Ominaisuutta ei vielä tueta" }, "yourPasskeyIsLocked": { - "message": "Salausavaimen käyttö edellyttää todennusta. Jatka vahvistamalla henkilöllisyytesi." + "message": "Pääsyavaimen käyttö edellyttää tunnistautumista. Jatka vahvistamalla henkilöllisyytesi." }, "multifactorAuthenticationCancelled": { "message": "Monivaiheinen todennus peruttiin" @@ -3642,10 +3651,10 @@ "message": "Onnistui" }, "removePasskey": { - "message": "Poista suojausavain" + "message": "Poista pääsyavain" }, "passkeyRemoved": { - "message": "Suojausavain poistettiin" + "message": "Pääsyavain poistettiin" }, "autofillSuggestions": { "message": "Automaattitäytä ehdotukset" @@ -3960,6 +3969,12 @@ "autoFillOnPageLoad": { "message": "Automaattitäytetäänkö sivun avautuessa?" }, + "cardExpiredTitle": { + "message": "Kortti on vanhentunut" + }, + "cardExpiredMessage": { + "message": "Jos olet uusinut sen, päivitä kortin tiedot" + }, "cardDetails": { "message": "Kortin tiedot" }, @@ -3972,6 +3987,9 @@ } } }, + "enableAnimations": { + "message": "Käytä animaatioita" + }, "addAccount": { "message": "Lisää tili" }, @@ -3982,7 +4000,7 @@ "message": "Tiedot" }, "passkeys": { - "message": "Avainkoodit", + "message": "Pääsyavaimet", "description": "A section header for a list of passkeys." }, "passwords": { @@ -3990,7 +4008,7 @@ "description": "A section header for a list of passwords." }, "logInWithPasskeyAriaLabel": { - "message": "Kirjaudu avainkoodilla", + "message": "Kirjaudu pääsyavaimella", "description": "ARIA label for the inline menu button that logs in with a passkey." }, "assign": { @@ -4150,7 +4168,7 @@ } }, "itemsMovedToOrg": { - "message": "Kohteet siirrettiin organisaatioon $ORGNAME$", + "message": "Kohteet siirrettiin organisaatiolle $ORGNAME$", "placeholders": { "orgname": { "content": "$1", @@ -4159,7 +4177,7 @@ } }, "itemMovedToOrg": { - "message": "Kohde siirrettiin organisaatioon $ORGNAME$", + "message": "Kohde siirrettiin organisaatiolle $ORGNAME$", "placeholders": { "orgname": { "content": "$1", @@ -4203,7 +4221,7 @@ "message": "Tilitoiminnot" }, "showNumberOfAutofillSuggestions": { - "message": "Näytä kirjautumisen automaattitäytön ehtotusten määrä laajennuksen kuvakkeessa" + "message": "Näytä automaattitäytön kirjautumistietoehdotusten määrä laajennuksen kuvakkeessa" }, "systemDefault": { "message": "Järjestelmän oletus" diff --git a/apps/browser/src/_locales/fil/messages.json b/apps/browser/src/_locales/fil/messages.json index e2f32ae5d9..bfe541fc36 100644 --- a/apps/browser/src/_locales/fil/messages.json +++ b/apps/browser/src/_locales/fil/messages.json @@ -25,9 +25,6 @@ "finishCreatingYourAccountBySettingAPassword": { "message": "Finish creating your account by setting a password" }, - "login": { - "message": "Mag-login" - }, "enterpriseSingleSignOn": { "message": "Enterprise Single Sign-On sa Filipino ay Isang Sign-On na Enterprise" }, @@ -1083,7 +1080,7 @@ "message": "1 GB encrypted storage para sa mga file attachment." }, "premiumSignUpEmergency": { - "message": "Emergency access" + "message": "Emergency access." }, "premiumSignUpTwoStepOptions": { "message": "Pagmamay-ari na dalawang hakbang na opsyon sa pag-log in gaya ng YubiKey at Duo." @@ -1115,6 +1112,9 @@ "premiumCurrentMemberThanks": { "message": "Salamat sa pagsuporta sa Bitwarden." }, + "premiumFeatures": { + "message": "Upgrade to premium and receive:" + }, "premiumPrice": { "message": "Lahat para lamang sa $PRICE$ /taon!", "placeholders": { @@ -1124,6 +1124,15 @@ } } }, + "premiumPriceV2": { + "message": "All for just $PRICE$ per year!", + "placeholders": { + "price": { + "content": "$1", + "example": "$10" + } + } + }, "refreshComplete": { "message": "I-refresh ang lahat" }, @@ -3960,6 +3969,12 @@ "autoFillOnPageLoad": { "message": "Autofill on page load?" }, + "cardExpiredTitle": { + "message": "Expired card" + }, + "cardExpiredMessage": { + "message": "If you've renewed it, update the card's information" + }, "cardDetails": { "message": "Card details" }, @@ -3972,6 +3987,9 @@ } } }, + "enableAnimations": { + "message": "Enable animations" + }, "addAccount": { "message": "Add account" }, diff --git a/apps/browser/src/_locales/fr/messages.json b/apps/browser/src/_locales/fr/messages.json index bd799815c3..dd25eddfcc 100644 --- a/apps/browser/src/_locales/fr/messages.json +++ b/apps/browser/src/_locales/fr/messages.json @@ -14,7 +14,7 @@ "message": "Identifiez-vous ou créez un nouveau compte pour accéder à votre coffre sécurisé." }, "inviteAccepted": { - "message": "Invitation accepted" + "message": "Invitation acceptée" }, "createAccount": { "message": "Créer un compte" @@ -25,9 +25,6 @@ "finishCreatingYourAccountBySettingAPassword": { "message": "Terminer la création de votre compte en définissant un mot de passe" }, - "login": { - "message": "Se connecter" - }, "enterpriseSingleSignOn": { "message": "Portail de connexion unique d'entreprise" }, @@ -72,10 +69,10 @@ "message": "Indice du mot de passe principal (facultatif)" }, "joinOrganization": { - "message": "Join organization" + "message": "Rejoindre l'organisation" }, "finishJoiningThisOrganizationBySettingAMasterPassword": { - "message": "Finish joining this organization by setting a master password." + "message": "Terminer de rejoindre cette organisation en configurant un mot de passe principal." }, "tab": { "message": "Onglet" @@ -117,19 +114,19 @@ "message": "Copier le code de sécurité" }, "copyName": { - "message": "Copy name" + "message": "Copier le nom" }, "copyCompany": { - "message": "Copy company" + "message": "Copier l'entreprise" }, "copySSN": { - "message": "Copy Social Security number" + "message": "Copier le numéro de sécurité sociale" }, "copyPassportNumber": { - "message": "Copy passport number" + "message": "Copier le numéro de passeport" }, "copyLicenseNumber": { - "message": "Copy license number" + "message": "Copier la plaque d'immatriculation" }, "autoFill": { "message": "Saisie automatique" @@ -305,22 +302,22 @@ "message": "Modifier le dossier" }, "newFolder": { - "message": "New folder" + "message": "Nouveau dossier" }, "folderName": { - "message": "Folder name" + "message": "Nom de dossier" }, "folderHintText": { - "message": "Nest a folder by adding the parent folder's name followed by a “/”. Example: Social/Forums" + "message": "Imbriquer un dossier en ajoutant le nom du dossier parent suivi d'un \"/\". Par exemple : Social/Forums" }, "noFoldersAdded": { - "message": "No folders added" + "message": "Pas de dossier ajouté" }, "createFoldersToOrganize": { - "message": "Create folders to organize your vault items" + "message": "Créer des dossiers pour organiser les éléments de votre coffre" }, "deleteFolderPermanently": { - "message": "Are you sure you want to permanently delete this folder?" + "message": "Êtes-vous sûr de vouloir supprimer définitivement ce dossier ?" }, "deleteFolder": { "message": "Supprimer le dossier" @@ -691,7 +688,7 @@ "message": "Bitwarden peut stocker et remplir des codes de vérification en 2 étapes. Sélectionnez l'icône caméra pour prendre une capture d'écran du code QR de l'authentificateur de ce site Web, ou copiez et collez la clé dans ce champ." }, "learnMoreAboutAuthenticators": { - "message": "Learn more about authenticators" + "message": "En savoir plus sur les authentificateurs" }, "copyTOTP": { "message": "Copier la clé Authenticator (TOTP)" @@ -826,7 +823,7 @@ "message": "Demander d'ajouter un identifiant" }, "vaultSaveOptionsTitle": { - "message": "Save to vault options" + "message": "Enregistrer dans les options de coffre" }, "addLoginNotificationDesc": { "message": "Demander d'ajouter un élément si aucun n'est trouvé dans votre coffre." @@ -835,7 +832,7 @@ "message": "Demande l'ajout d'un élément si celui-ci n'est pas trouvé dans votre coffre. S'applique à tous les comptes connectés." }, "showCardsInVaultView": { - "message": "Show cards as Autofill suggestions on Vault view" + "message": "Afficher les cartes de paiement en tant que suggestions de saisie automatique dans la vue du coffre" }, "showCardsCurrentTab": { "message": "Afficher les cartes de paiement sur la Page d'onglet" @@ -844,7 +841,7 @@ "message": "Liste les éléments des cartes de paiement sur la Page d'onglet pour faciliter la saisie automatique." }, "showIdentitiesInVaultView": { - "message": "Show identifies as Autofill suggestions on Vault view" + "message": "Afficher les identités en tant que suggestions de saisie automatique dans la vue du coffre" }, "showIdentitiesCurrentTab": { "message": "Afficher les identités sur la Page d'onglet" @@ -1083,7 +1080,7 @@ "message": "1 Go de stockage chiffré pour les fichiers joints." }, "premiumSignUpEmergency": { - "message": "Emergency access" + "message": "Accès d'urgence." }, "premiumSignUpTwoStepOptions": { "message": "Options de connexion propriétaires à deux facteurs telles que YubiKey et Duo." @@ -1107,7 +1104,7 @@ "message": "Vous pouvez acheter une adhésion Premium sur le coffre web de bitwarden.com. Voulez-vous visiter le site web maintenant ?" }, "premiumPurchaseAlertV2": { - "message": "You can purchase Premium from your account settings on the Bitwarden web app." + "message": "Vous pouvez acheter la version Premium depuis les paramètres de votre compte dans l'application web Bitwarden." }, "premiumCurrentMember": { "message": "Vous êtes un membre Premium !" @@ -1115,6 +1112,9 @@ "premiumCurrentMemberThanks": { "message": "Merci de soutenir Bitwarden." }, + "premiumFeatures": { + "message": "Mettre à niveau à la version Premium et recevez :" + }, "premiumPrice": { "message": "Tout pour seulement $PRICE$/an !", "placeholders": { @@ -1124,6 +1124,15 @@ } } }, + "premiumPriceV2": { + "message": "Tout pour seulement $PRICE$ /an !", + "placeholders": { + "price": { + "content": "$1", + "example": "$10" + } + } + }, "refreshComplete": { "message": "Actualisation terminée" }, @@ -1209,17 +1218,17 @@ "message": "Application d'authentification" }, "authenticatorAppDescV2": { - "message": "Enter a code generated by an authenticator app like Bitwarden Authenticator.", + "message": "Entrez un code généré par une application d'authentification comme Bitwarden Authenticator.", "description": "'Bitwarden Authenticator' is a product name and should not be translated." }, "yubiKeyTitleV2": { - "message": "Yubico OTP Security Key" + "message": "Clé de sécurité OTP de Yubico" }, "yubiKeyDesc": { "message": "Utiliser une YubiKey pour accéder à votre compte. Fonctionne avec les appareils YubiKey 4, 4 Nano, 4C et NEO." }, "duoDescV2": { - "message": "Enter a code generated by Duo Security.", + "message": "Entrez un code généré par Duo Security.", "description": "'Duo Security' and 'Duo Mobile' are product names and should not be translated." }, "duoOrganizationDesc": { @@ -1236,7 +1245,7 @@ "message": "Courriel" }, "emailDescV2": { - "message": "Enter a code sent to your email." + "message": "Entrez le code envoyé à votre adresse courriel." }, "selfHostedEnvironment": { "message": "Environnement auto-hébergé" @@ -1285,16 +1294,16 @@ "description": "Represents the message for allowing the user to enable the autofill overlay" }, "autofillSuggestionsSectionTitle": { - "message": "Autofill suggestions" + "message": "Suggestions de saisie automatique" }, "showInlineMenuLabel": { - "message": "Show autofill suggestions on form fields" + "message": "Afficher les suggestions de saisie automatique dans les champs d'un formulaire" }, "showInlineMenuOnIconSelectionLabel": { - "message": "Display suggestions when icon is selected" + "message": "Afficher les suggestions lorsque l'icône est sélectionnée" }, "showInlineMenuOnFormFieldsDescAlt": { - "message": "Applies to all logged in accounts." + "message": "S'applique à tous les comptes connectés." }, "turnOffBrowserBuiltInPasswordManagerSettings": { "message": "Désactivez les paramètres du gestionnaire de mots de passe intégré à votre navigateur pour éviter les conflits." @@ -1315,7 +1324,7 @@ "description": "Overlay appearance select option for showing the field on click of the overlay icon" }, "enableAutoFillOnPageLoadSectionTitle": { - "message": "Autofill on page load" + "message": "Saisie automatique lors du chargement de la page" }, "enableAutoFillOnPageLoad": { "message": "Saisir automatiquement au chargement de la page" @@ -1324,7 +1333,7 @@ "message": "Si un formulaire de connexion est détecté, il sera saisi automatiquement lors du chargement de la page web." }, "autofillOnPageLoadWarning": { - "message": "$OPENTAG$Warning:$CLOSETAG$ Compromised or untrusted websites can exploit autofill on page load.", + "message": "$OPENTAG$Attention :$CLOSETAG$ Les sites web compromis ou non fiables peuvent exploiter la saisie automatique lors du chargement de la page.", "placeholders": { "openTag": { "content": "$1", @@ -1340,7 +1349,7 @@ "message": "les sites web compromis ou non fiables peuvent exploiter la saisie automatique au chargement de la page." }, "learnMoreAboutAutofillOnPageLoadLinkText": { - "message": "Learn more about risks" + "message": "En savoir plus sur les risques" }, "learnMoreAboutAutofill": { "message": "En savoir plus sur la saisie automatique" @@ -1370,13 +1379,13 @@ "message": "Ouvrir le coffre dans la barre latérale" }, "commandAutofillLoginDesc": { - "message": "Autofill the last used login for the current website" + "message": "Saisir automatiquement le dernier identifiant utilisé pour le site web actuel" }, "commandAutofillCardDesc": { - "message": "Autofill the last used card for the current website" + "message": "Saisir automatiquement la dernière carte utilisée pour le site web actuel" }, "commandAutofillIdentityDesc": { - "message": "Autofill the last used identity for the current website" + "message": "Saisir automatiquement la dernière identité utilisée pour le site web actuel" }, "commandGeneratePasswordDesc": { "message": "Générer et copier un nouveau mot de passe aléatoire dans le presse-papiers." @@ -1409,7 +1418,7 @@ "message": "Booléen" }, "cfTypeCheckbox": { - "message": "Checkbox" + "message": "Case à cocher" }, "cfTypeLinked": { "message": "Lié", @@ -1612,7 +1621,7 @@ } }, "viewItemHeader": { - "message": "View $TYPE$", + "message": "Voir les $TYPE$", "placeholders": { "type": { "content": "$1", @@ -1683,7 +1692,7 @@ "description": "Domain name. Ex. website.com" }, "baseDomainOptionRecommended": { - "message": "Base domain (recommended)", + "message": "Domaine de base (recommandé)", "description": "Domain name. Ex. website.com" }, "domainName": { @@ -1831,26 +1840,26 @@ "message": "Une ou plusieurs politiques de sécurité de l'organisation affectent les paramètres de votre générateur." }, "passwordGenerator": { - "message": "Password generator" + "message": "Générateur de mot de passe" }, "usernameGenerator": { - "message": "Username generator" + "message": "Générateur de nom d'utilisateur" }, "useThisPassword": { - "message": "Use this password" + "message": "Utiliser ce mot de passe" }, "useThisUsername": { - "message": "Use this username" + "message": "Utiliser ce nom d'utilisateur" }, "securePasswordGenerated": { - "message": "Secure password generated! Don't forget to also update your password on the website." + "message": "Mot de passe sécurisé généré ! N'oubliez pas aussi de mettre à jour votre mot de passe sur le site Web." }, "useGeneratorHelpTextPartOne": { - "message": "Use the generator", + "message": "Utiliser le générateur", "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": "pour créer un mot de passe fort unique", "description": "This will be used as part of a larger sentence, broken up to include the generator icon. The full sentence will read 'Use the generator [GENERATOR_ICON] to create a strong unique password'" }, "vaultTimeoutAction": { @@ -1976,7 +1985,7 @@ "message": "Votre nouveau mot de passe principal ne répond pas aux exigences de politique de sécurité." }, "receiveMarketingEmailsV2": { - "message": "Get advice, announcements, and research opportunities from Bitwarden in your inbox." + "message": "Obtenez des conseils, des annonces et des opportunités de recherche de la part de Bitwarden dans votre boîte de réception." }, "unsubscribe": { "message": "Se désabonner" @@ -2051,7 +2060,7 @@ "message": "Erreur de correspondance entre les comptes" }, "nativeMessagingWrongUserKeyDesc": { - "message": "Biometric unlock failed. The biometric secret key failed to unlock the vault. Please try to set up biometrics again." + "message": "Le déverrouillage biométrique a échoué. La clé secrète biométrique n'a pas réussi à déverrouiller le coffre. Veuillez essayer de configurer à nouveau la biométrie." }, "nativeMessagingWrongUserKeyTitle": { "message": "Biometric key missmatch" @@ -2102,7 +2111,7 @@ "message": "Une politique d'organisation a bloqué l'import d'éléments dans votre coffre personel." }, "domainsTitle": { - "message": "Domains", + "message": "Domaines", "description": "A category title describing the concept of web domains" }, "excludedDomains": { @@ -2115,7 +2124,7 @@ "message": "Bitwarden ne demandera pas d'enregistrer les détails de connexion pour ces domaines pour tous les comptes connectés. Vous devez actualiser la page pour que les modifications prennent effet." }, "websiteItemLabel": { - "message": "Website $number$ (URI)", + "message": "Site web $number$ (URI)", "placeholders": { "number": { "content": "$1", @@ -2133,7 +2142,7 @@ } }, "excludedDomainsSavedSuccess": { - "message": "Excluded domain changes saved" + "message": "Changements de domaines exclus enregistrés" }, "send": { "message": "Send", @@ -2171,7 +2180,7 @@ "message": "Protégé par un mot de passe" }, "copyLink": { - "message": "Copy link" + "message": "Copier le lien" }, "copySendLink": { "message": "Copier le lien du Send", @@ -2305,11 +2314,11 @@ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "createdSendSuccessfully": { - "message": "Send created successfully!", + "message": "Send créé avec succès !", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendAvailability": { - "message": "The Send will be available to anyone with the link for the next $DAYS$ days.", + "message": "Le Send est disponible à toute personne ayant le lien durant les $DAYS$ prochains jours.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated.", "placeholders": { "days": { @@ -2319,7 +2328,7 @@ } }, "sendLinkCopied": { - "message": "Send link copied", + "message": "Lien Send copié", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "editedSend": { @@ -2384,7 +2393,7 @@ "message": "Vérification de courriel requise" }, "emailVerifiedV2": { - "message": "Email verified" + "message": "Courriel vérifié" }, "emailVerificationRequiredDesc": { "message": "Vous devez vérifier votre courriel pour utiliser cette fonctionnalité. Vous pouvez vérifier votre courriel dans le coffre web." @@ -2402,7 +2411,7 @@ "message": "Votre mot de passe principal ne répond pas aux exigences de politique de sécurité de cette organisation. Pour accéder au coffre, vous devez mettre à jour votre mot de passe principal dès maintenant. En poursuivant, vous serez déconnecté de votre session actuelle et vous devrez vous reconnecter. Les sessions actives sur d'autres appareils peuver rester actives pendant encore une heure." }, "tdeDisabledMasterPasswordRequired": { - "message": "Your organization has disabled trusted device encryption. Please set a master password to access your vault." + "message": "Votre organisation a désactivé le déchiffrement de votre appareil de confiance. Veuillez configurer un mot de passe principal pour accéder à votre coffre." }, "resetPasswordPolicyAutoEnroll": { "message": "Inscription automatique" @@ -2855,22 +2864,22 @@ "message": "Paramètres de saisie automatique" }, "autofillKeyboardShortcutSectionTitle": { - "message": "Autofill shortcut" + "message": "Raccourci de saisie automatique" }, "autofillKeyboardShortcutUpdateLabel": { - "message": "Change shortcut" + "message": "Modifier le raccourci" }, "autofillKeyboardManagerShortcutsLabel": { - "message": "Manage shortcuts" + "message": "Gérer les raccourcis" }, "autofillShortcut": { "message": "Raccourci clavier de saisie automatique" }, "autofillLoginShortcutNotSet": { - "message": "The autofill login shortcut is not set. Change this in the browser's settings." + "message": "Le raccourci de saisie automatique de l'identifiant n'est pas configuré. Changez-le dans les paramètres du navigateur." }, "autofillLoginShortcutText": { - "message": "The autofill login shortcut is $COMMAND$. Manage all shortcuts in the browser's settings.", + "message": "Le raccourci de saisie automatique de l'identifiant est $COMMAND$. Gérez tous les raccourcis dans les paramètres du navigateur.", "placeholders": { "command": { "content": "$1", @@ -2973,11 +2982,11 @@ "message": "Appareil de confiance" }, "sendsNoItemsTitle": { - "message": "No active Sends", + "message": "Pas de Send actif", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendsNoItemsMessage": { - "message": "Use Send to securely share encrypted information with anyone.", + "message": "Utilisez Send pour partager en toute sécurité des informations chiffrées avec tout le monde.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "inputRequired": { @@ -3054,10 +3063,10 @@ } }, "singleFieldNeedsAttention": { - "message": "1 field needs your attention." + "message": "1 champ nécessite votre attention." }, "multipleFieldsNeedAttention": { - "message": "$COUNT$ fields need your attention.", + "message": "$COUNT$ champs nécessitent votre attention.", "placeholders": { "count": { "content": "$1", @@ -3144,7 +3153,7 @@ "description": "Message appearing below the autofill on load message when master password reprompt is set for a vault item." }, "toggleSideNavigation": { - "message": "Toggle side navigation" + "message": "Basculer la navigation latérale" }, "skipToContent": { "message": "Accéder directement au contenu" @@ -3166,7 +3175,7 @@ "description": "Text to display in overlay when the account is locked." }, "unlockYourAccountToViewAutofillSuggestions": { - "message": "Unlock your account to view autofill suggestions", + "message": "Déverrouillez votre compte pour afficher les suggestions de saisie automatique", "description": "Text to display in overlay when the account is locked." }, "unlockAccount": { @@ -3174,7 +3183,7 @@ "description": "Button text to display in overlay when the account is locked." }, "unlockAccountAria": { - "message": "Unlock your account, opens in a new window", + "message": "Déverrouiller votre compte, s'ouvre dans une nouvelle fenêtre", "description": "Screen reader text (aria-label) for unlock account button in overlay" }, "fillCredentialsFor": { @@ -3198,7 +3207,7 @@ "description": "Screen reader text (aria-label) for new item button in overlay" }, "newLogin": { - "message": "New login", + "message": "Nouvel identifiant", "description": "Button text to display within inline menu when there are no matching items on a login field" }, "addNewLoginItemAria": { @@ -3206,7 +3215,7 @@ "description": "Screen reader text (aria-label) for new login button within inline menu" }, "newCard": { - "message": "New card", + "message": "Nouvelle carte de paiement", "description": "Button text to display within inline menu when there are no matching items on a credit card field" }, "addNewCardItemAria": { @@ -3214,7 +3223,7 @@ "description": "Screen reader text (aria-label) for new card button within inline menu" }, "newIdentity": { - "message": "New identity", + "message": "Nouvelle identité", "description": "Button text to display within inline menu when there are no matching items on an identity field" }, "addNewIdentityItemAria": { @@ -3397,7 +3406,7 @@ "message": "Confirmez le mot de passe du fichier" }, "exportSuccess": { - "message": "Vault data exported" + "message": "Données du coffre exportées" }, "typePasskey": { "message": "Clé d'identification (passkey)" @@ -3579,27 +3588,27 @@ "description": "Label indicating the most common import formats" }, "confirmContinueToBrowserSettingsTitle": { - "message": "Continue to browser settings?", + "message": "Continuer vers les paramètres du navigateur ?", "description": "Title for dialog which asks if the user wants to proceed to a relevant browser settings page" }, "confirmContinueToHelpCenter": { - "message": "Continue to Help Center?", + "message": "Continuer vers le centre d'aide ?", "description": "Title for dialog which asks if the user wants to proceed to a relevant Help Center page" }, "confirmContinueToHelpCenterPasswordManagementContent": { - "message": "Change your browser's autofill and password management settings.", + "message": "Modifiez les paramètres de saisie automatique et de gestion des mots de passe de votre navigateur.", "description": "Body content for dialog which asks if the user wants to proceed to the Help Center's page about browser password management settings" }, "confirmContinueToHelpCenterKeyboardShortcutsContent": { - "message": "You can view and set extension shortcuts in your browser's settings.", + "message": "Vous pouvez afficher et définir les raccourcis d'extension dans les paramètres de votre navigateur.", "description": "Body content for dialog which asks if the user wants to proceed to the Help Center's page about browser keyboard shortcut settings" }, "confirmContinueToBrowserPasswordManagementSettingsContent": { - "message": "Change your browser's autofill and password management settings.", + "message": "Modifiez les paramètres de saisie automatique et de gestion des mots de passe de votre navigateur.", "description": "Body content for dialog which asks if the user wants to proceed to the browser's password management settings page" }, "confirmContinueToBrowserKeyboardShortcutSettingsContent": { - "message": "You can view and set extension shortcuts in your browser's settings.", + "message": "Vous pouvez afficher et définir les raccourcis d'extension dans les paramètres de votre navigateur.", "description": "Body content for dialog which asks if the user wants to proceed to the browser's keyboard shortcut settings page" }, "overrideDefaultBrowserAutofillTitle": { @@ -3713,7 +3722,7 @@ } }, "autofillTitle": { - "message": "Autofill - $ITEMNAME$", + "message": "Saisie automatique - $ITEMNAME$", "description": "Title for a button that autofills a login item.", "placeholders": { "itemname": { @@ -3726,7 +3735,7 @@ "message": "Aucune valeur à copier" }, "assignToCollections": { - "message": "Assign to collections" + "message": "Assigner aux collections" }, "copyEmail": { "message": "Copier l'email" @@ -3792,13 +3801,13 @@ "message": "Eléments sans dossier" }, "itemDetails": { - "message": "Item details" + "message": "Détails de l'élément" }, "itemName": { - "message": "Item name" + "message": "Nom de l’élément" }, "cannotRemoveViewOnlyCollections": { - "message": "You cannot remove collections with View only permissions: $COLLECTIONS$", + "message": "Vous ne pouvez pas supprimer des collections avec les autorisations d'affichage uniquement : $COLLECTIONS$", "placeholders": { "collections": { "content": "$1", @@ -3810,44 +3819,44 @@ "message": "L'organisation est désactivée" }, "owner": { - "message": "Owner" + "message": "Propriétaire" }, "selfOwnershipLabel": { - "message": "You", + "message": "Vous", "description": "Used as a label to indicate that the user is the owner of an item." }, "contactYourOrgAdmin": { "message": "Les éléments des Organisations désactivées ne sont pas accessibles. Contactez le propriétaire de votre Organisation pour obtenir de l'aide." }, "additionalInformation": { - "message": "Additional information" + "message": "Informations supplémentaires" }, "itemHistory": { - "message": "Item history" + "message": "Historique de l'élément" }, "lastEdited": { - "message": "Last edited" + "message": "Dernière modification" }, "ownerYou": { - "message": "Owner: You" + "message": "Propriétaire : Vous" }, "linked": { - "message": "Linked" + "message": "Lié" }, "copySuccessful": { - "message": "Copy Successful" + "message": "Copié avec succès" }, "upload": { - "message": "Upload" + "message": "Téléverser" }, "addAttachment": { - "message": "Add attachment" + "message": "Ajouter une pièce jointe" }, "maxFileSizeSansPunctuation": { - "message": "Maximum file size is 500 MB" + "message": "La taille maximale du fichier est de 500 Mo" }, "deleteAttachmentName": { - "message": "Delete attachment $NAME$", + "message": "Supprimer la pièce jointe $NAME$", "placeholders": { "name": { "content": "$1", @@ -3856,7 +3865,7 @@ } }, "downloadAttachmentName": { - "message": "Download $NAME$", + "message": "Télécharger $NAME$", "placeholders": { "name": { "content": "$1", @@ -3871,22 +3880,22 @@ "message": "Premium" }, "freeOrgsCannotUseAttachments": { - "message": "Free organizations cannot use attachments" + "message": "Les organisations gratuites ne peuvent pas utiliser de pièces jointes" }, "filters": { "message": "Filtres" }, "personalDetails": { - "message": "Personal details" + "message": "Données personnelles" }, "identification": { "message": "Identification" }, "contactInfo": { - "message": "Contact info" + "message": "Informations de contact" }, "downloadAttachment": { - "message": "Download - $ITEMNAME$", + "message": "Télécharger - $ITEMNAME$", "placeholders": { "itemname": { "content": "$1", @@ -3895,23 +3904,23 @@ } }, "cardNumberEndsWith": { - "message": "card number ends with", + "message": "numéro de la carte se termine par", "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": "Identifiants de connexion" }, "authenticatorKey": { - "message": "Authenticator key" + "message": "Clé d'authentification" }, "autofillOptions": { - "message": "Autofill options" + "message": "Options de saisie automatique" }, "websiteUri": { - "message": "Website (URI)" + "message": "Site web (URI)" }, "websiteUriCount": { - "message": "Website (URI) $COUNT$", + "message": "Site 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": { @@ -3921,16 +3930,16 @@ } }, "websiteAdded": { - "message": "Website added" + "message": "Site web ajouté" }, "addWebsite": { - "message": "Add website" + "message": "Ajouter le site web" }, "deleteWebsite": { - "message": "Delete website" + "message": "Supprimer le site web" }, "defaultLabel": { - "message": "Default ($VALUE$)", + "message": "Par défaut ($VALUE$)", "description": "A label that indicates the default value for a field with the current default value in parentheses.", "placeholders": { "value": { @@ -3958,10 +3967,16 @@ } }, "autoFillOnPageLoad": { - "message": "Autofill on page load?" + "message": "Saisir automatiquement lors du chargement de la page ?" + }, + "cardExpiredTitle": { + "message": "Carte de paiement expirée" + }, + "cardExpiredMessage": { + "message": "Si vous l'avez renouvelée, mettez à jour les informations de la carte de paiement" }, "cardDetails": { - "message": "Card details" + "message": "Détails de la carte de paiement" }, "cardBrandDetails": { "message": "$BRAND$ details", @@ -3972,38 +3987,41 @@ } } }, + "enableAnimations": { + "message": "Activer les animations" + }, "addAccount": { - "message": "Add account" + "message": "Ajouter un compte" }, "loading": { - "message": "Loading" + "message": "Chargement" }, "data": { - "message": "Data" + "message": "Données" }, "passkeys": { - "message": "Passkeys", + "message": "Clés d'accès", "description": "A section header for a list of passkeys." }, "passwords": { - "message": "Passwords", + "message": "Mots de passe", "description": "A section header for a list of passwords." }, "logInWithPasskeyAriaLabel": { - "message": "Log in with passkey", + "message": "Se connecter avec une clé d'accès", "description": "ARIA label for the inline menu button that logs in with a passkey." }, "assign": { - "message": "Assign" + "message": "Assigner" }, "bulkCollectionAssignmentDialogDescriptionSingular": { - "message": "Only organization members with access to these collections will be able to see the item." + "message": "Seuls les membres de l'organisation ayant accès à ces collections pourront voir l'élément." }, "bulkCollectionAssignmentDialogDescriptionPlural": { - "message": "Only organization members with access to these collections will be able to see the items." + "message": "Seuls les membres de l'organisation ayant accès à ces collections pourront voir les éléments." }, "bulkCollectionAssignmentWarning": { - "message": "You have selected $TOTAL_COUNT$ items. You cannot update $READONLY_COUNT$ of the items because you do not have edit permissions.", + "message": "Vous avez sélectionné $TOTAL_COUNT$ éléments. Vous ne pouvez pas mettre à jour $READONLY_COUNT$ de ces éléments parce que vous n'avez pas les autorisations pour les éditer.", "placeholders": { "total_count": { "content": "$1", @@ -4015,37 +4033,37 @@ } }, "addField": { - "message": "Add field" + "message": "Ajouter un champ" }, "add": { - "message": "Add" + "message": "Ajouter" }, "fieldType": { - "message": "Field type" + "message": "Type du champ" }, "fieldLabel": { - "message": "Field label" + "message": "Intitulé du champ" }, "textHelpText": { - "message": "Use text fields for data like security questions" + "message": "Utiliser des champs de texte pour les données telles que les questions de sécurité" }, "hiddenHelpText": { - "message": "Use hidden fields for sensitive data like a password" + "message": "Utiliser des champs cachés pour des données sensibles telles qu'un mot de passe" }, "checkBoxHelpText": { - "message": "Use checkboxes if you'd like to autofill a form's checkbox, like a remember email" + "message": "Utilisez les cases à cocher si vous souhaitez saisir automatiquement la case à cocher d'un formulaire, tel qu'un courriel de rappel" }, "linkedHelpText": { - "message": "Use a linked field when you are experiencing autofill issues for a specific website." + "message": "Utilisez un champ lié lorsque vous rencontrez des problèmes de saisie automatique pour un site Web spécifique." }, "linkedLabelHelpText": { "message": "Enter the the field's html id, name, aria-label, or placeholder." }, "editField": { - "message": "Edit field" + "message": "Éditer le champ" }, "editFieldLabel": { - "message": "Edit $LABEL$", + "message": "Éditer $LABEL$", "placeholders": { "label": { "content": "$1", @@ -4054,7 +4072,7 @@ } }, "deleteCustomField": { - "message": "Delete $LABEL$", + "message": "Supprimer $LABEL$", "placeholders": { "label": { "content": "$1", @@ -4063,7 +4081,7 @@ } }, "fieldAdded": { - "message": "$LABEL$ added", + "message": "$LABEL$ ajouté", "placeholders": { "label": { "content": "$1", @@ -4072,7 +4090,7 @@ } }, "reorderToggleButton": { - "message": "Reorder $LABEL$. Use arrow key to move item up or down.", + "message": "Réorganiser $LABEL$. Utilisez les flèches de votre clavier pour déplacer l'élément vers le haut ou vers le bas.", "placeholders": { "label": { "content": "$1", @@ -4098,13 +4116,13 @@ } }, "selectCollectionsToAssign": { - "message": "Select collections to assign" + "message": "Sélectionnez les collections à assigner" }, "personalItemTransferWarningSingular": { - "message": "1 item will be permanently transferred to the selected organization. You will no longer own this item." + "message": "1 élément sera transféré définitivement à l'organisation sélectionnée. Vous ne serez plus le propriétaire de cet élément." }, "personalItemsTransferWarningPlural": { - "message": "$PERSONAL_ITEMS_COUNT$ items will be permanently transferred to the selected organization. You will no longer own these items.", + "message": "Les éléments $PERSONAL_ITEMS_COUNT$ seront transférés de façon permanente à l'organisation sélectionnée. Vous ne serez plus le propriétaire de ces éléments.", "placeholders": { "personal_items_count": { "content": "$1", @@ -4113,7 +4131,7 @@ } }, "personalItemWithOrgTransferWarningSingular": { - "message": "1 item will be permanently transferred to $ORG$. You will no longer own this item.", + "message": "1 élément sera transféré définitivement à $ORG$. Vous ne serez plus le propriétaire de cet élément.", "placeholders": { "org": { "content": "$1", @@ -4122,7 +4140,7 @@ } }, "personalItemsWithOrgTransferWarningPlural": { - "message": "$PERSONAL_ITEMS_COUNT$ items will be permanently transferred to $ORG$. You will no longer own these items.", + "message": "Les éléments $PERSONAL_ITEMS_COUNT$ seront transférés à $ORG$ de façon permanente. Vous ne serez plus propriétaire de ces éléments.", "placeholders": { "personal_items_count": { "content": "$1", @@ -4135,13 +4153,13 @@ } }, "successfullyAssignedCollections": { - "message": "Successfully assigned collections" + "message": "Collections assignées avec succès" }, "nothingSelected": { - "message": "You have not selected anything." + "message": "Vous n'avez rien sélectionné." }, "movedItemsToOrg": { - "message": "Selected items moved to $ORGNAME$", + "message": "Les éléments sélectionnés ont été déplacés vers $ORGNAME$", "placeholders": { "orgname": { "content": "$1", @@ -4150,7 +4168,7 @@ } }, "itemsMovedToOrg": { - "message": "Items moved to $ORGNAME$", + "message": "Éléments déplacés vers $ORGNAME$", "placeholders": { "orgname": { "content": "$1", @@ -4159,7 +4177,7 @@ } }, "itemMovedToOrg": { - "message": "Item moved to $ORGNAME$", + "message": "Élément déplacé vers $ORGNAME$", "placeholders": { "orgname": { "content": "$1", @@ -4185,7 +4203,7 @@ } }, "itemLocation": { - "message": "Item Location" + "message": "Emplacement de l'élément" }, "fileSends": { "message": "File Sends" @@ -4194,7 +4212,7 @@ "message": "Text Sends" }, "bitwardenNewLook": { - "message": "Bitwarden has a new look!" + "message": "Bitwarden a un nouveau look !" }, "bitwardenNewLookDesc": { "message": "It's easier and more intuitive than ever to autofill and search from the Vault tab. Take a look around!" @@ -4203,7 +4221,7 @@ "message": "Account actions" }, "showNumberOfAutofillSuggestions": { - "message": "Show number of login autofill suggestions on extension icon" + "message": "Afficher le nombre de suggestions de saisie automatique d'identifiant sur l'icône d'extension" }, "systemDefault": { "message": "System default" diff --git a/apps/browser/src/_locales/gl/messages.json b/apps/browser/src/_locales/gl/messages.json index 6084adadfe..91cd72fbc9 100644 --- a/apps/browser/src/_locales/gl/messages.json +++ b/apps/browser/src/_locales/gl/messages.json @@ -25,9 +25,6 @@ "finishCreatingYourAccountBySettingAPassword": { "message": "Finish creating your account by setting a password" }, - "login": { - "message": "Iniciar sesión" - }, "enterpriseSingleSignOn": { "message": "Inicio de sesión único empresarial" }, @@ -1083,7 +1080,7 @@ "message": "1 GB encrypted storage for file attachments." }, "premiumSignUpEmergency": { - "message": "Emergency access" + "message": "Emergency access." }, "premiumSignUpTwoStepOptions": { "message": "Proprietary two-step login options such as YubiKey and Duo." @@ -1115,6 +1112,9 @@ "premiumCurrentMemberThanks": { "message": "Thank you for supporting Bitwarden." }, + "premiumFeatures": { + "message": "Upgrade to premium and receive:" + }, "premiumPrice": { "message": "All for just $PRICE$ /year!", "placeholders": { @@ -1124,6 +1124,15 @@ } } }, + "premiumPriceV2": { + "message": "All for just $PRICE$ per year!", + "placeholders": { + "price": { + "content": "$1", + "example": "$10" + } + } + }, "refreshComplete": { "message": "Refresh complete" }, @@ -3960,6 +3969,12 @@ "autoFillOnPageLoad": { "message": "Autofill on page load?" }, + "cardExpiredTitle": { + "message": "Expired card" + }, + "cardExpiredMessage": { + "message": "If you've renewed it, update the card's information" + }, "cardDetails": { "message": "Card details" }, @@ -3972,6 +3987,9 @@ } } }, + "enableAnimations": { + "message": "Enable animations" + }, "addAccount": { "message": "Add account" }, diff --git a/apps/browser/src/_locales/he/messages.json b/apps/browser/src/_locales/he/messages.json index 82a1c59f7f..3df3937a1d 100644 --- a/apps/browser/src/_locales/he/messages.json +++ b/apps/browser/src/_locales/he/messages.json @@ -25,9 +25,6 @@ "finishCreatingYourAccountBySettingAPassword": { "message": "Finish creating your account by setting a password" }, - "login": { - "message": "התחבר" - }, "enterpriseSingleSignOn": { "message": "כניסה ארגונית אחידה" }, @@ -1083,7 +1080,7 @@ "message": "1 ג'יגה של מקום אחסון עבור קבצים מצורפים." }, "premiumSignUpEmergency": { - "message": "Emergency access" + "message": "Emergency access." }, "premiumSignUpTwoStepOptions": { "message": "Proprietary two-step login options such as YubiKey and Duo." @@ -1115,6 +1112,9 @@ "premiumCurrentMemberThanks": { "message": "תודה על תמיכתך בBitwarden." }, + "premiumFeatures": { + "message": "Upgrade to premium and receive:" + }, "premiumPrice": { "message": "הכל רק ב$PRICE$ לשנה!", "placeholders": { @@ -1124,6 +1124,15 @@ } } }, + "premiumPriceV2": { + "message": "All for just $PRICE$ per year!", + "placeholders": { + "price": { + "content": "$1", + "example": "$10" + } + } + }, "refreshComplete": { "message": "הרענון הושלם" }, @@ -3960,6 +3969,12 @@ "autoFillOnPageLoad": { "message": "Autofill on page load?" }, + "cardExpiredTitle": { + "message": "Expired card" + }, + "cardExpiredMessage": { + "message": "If you've renewed it, update the card's information" + }, "cardDetails": { "message": "Card details" }, @@ -3972,6 +3987,9 @@ } } }, + "enableAnimations": { + "message": "Enable animations" + }, "addAccount": { "message": "Add account" }, diff --git a/apps/browser/src/_locales/hi/messages.json b/apps/browser/src/_locales/hi/messages.json index 3ec9630e47..109b3c8b06 100644 --- a/apps/browser/src/_locales/hi/messages.json +++ b/apps/browser/src/_locales/hi/messages.json @@ -25,9 +25,6 @@ "finishCreatingYourAccountBySettingAPassword": { "message": "पासवर्ड सेट करके अपना खाता निर्माण पूरा करें" }, - "login": { - "message": "Log In" - }, "enterpriseSingleSignOn": { "message": "उद्यम एकल साइन-ऑन" }, @@ -1083,7 +1080,7 @@ "message": "1 GB of encrypted file storage." }, "premiumSignUpEmergency": { - "message": "Emergency access" + "message": "Emergency access." }, "premiumSignUpTwoStepOptions": { "message": "Proprietary two-step login options such as YubiKey and Duo." @@ -1115,6 +1112,9 @@ "premiumCurrentMemberThanks": { "message": "Thank you for supporting bitwarden." }, + "premiumFeatures": { + "message": "Upgrade to premium and receive:" + }, "premiumPrice": { "message": "All for just $PRICE$ /year!", "placeholders": { @@ -1124,6 +1124,15 @@ } } }, + "premiumPriceV2": { + "message": "All for just $PRICE$ per year!", + "placeholders": { + "price": { + "content": "$1", + "example": "$10" + } + } + }, "refreshComplete": { "message": "ताज़ा पूरा" }, @@ -3960,6 +3969,12 @@ "autoFillOnPageLoad": { "message": "Autofill on page load?" }, + "cardExpiredTitle": { + "message": "Expired card" + }, + "cardExpiredMessage": { + "message": "If you've renewed it, update the card's information" + }, "cardDetails": { "message": "Card details" }, @@ -3972,6 +3987,9 @@ } } }, + "enableAnimations": { + "message": "Enable animations" + }, "addAccount": { "message": "Add account" }, diff --git a/apps/browser/src/_locales/hr/messages.json b/apps/browser/src/_locales/hr/messages.json index 857310e21b..0d931cb510 100644 --- a/apps/browser/src/_locales/hr/messages.json +++ b/apps/browser/src/_locales/hr/messages.json @@ -25,9 +25,6 @@ "finishCreatingYourAccountBySettingAPassword": { "message": "Dovrši stvaranje svog računa postavljanjem lozinke" }, - "login": { - "message": "Prijava" - }, "enterpriseSingleSignOn": { "message": "Jedinstvena prijava na razini tvrtke (SSO)" }, @@ -1083,7 +1080,7 @@ "message": "1 GB šifriranog prostora za pohranu podataka." }, "premiumSignUpEmergency": { - "message": "Emergency access" + "message": "Emergency access." }, "premiumSignUpTwoStepOptions": { "message": "Mogućnosti za prijavu u dva koraka kao što su YubiKey i Duo." @@ -1115,6 +1112,9 @@ "premiumCurrentMemberThanks": { "message": "Hvala ti što podupireš Bitwarden." }, + "premiumFeatures": { + "message": "Upgrade to premium and receive:" + }, "premiumPrice": { "message": "Sve za samo $PRICE$ /godišnje!", "placeholders": { @@ -1124,6 +1124,15 @@ } } }, + "premiumPriceV2": { + "message": "All for just $PRICE$ per year!", + "placeholders": { + "price": { + "content": "$1", + "example": "$10" + } + } + }, "refreshComplete": { "message": "Osvježavanje završeno" }, @@ -2305,11 +2314,11 @@ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "createdSendSuccessfully": { - "message": "Send je uspješno stvoren!", + "message": "Send created successfully!", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendAvailability": { - "message": "Send će biti dostupan svakome s poveznicom ovoliko dana: $DAYS$.", + "message": "The Send will be available to anyone with the link for the next $DAYS$ days.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated.", "placeholders": { "days": { @@ -2319,7 +2328,7 @@ } }, "sendLinkCopied": { - "message": "Kopirana poveznica Senda", + "message": "Send link copied", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "editedSend": { @@ -3960,6 +3969,12 @@ "autoFillOnPageLoad": { "message": "Auto-ispuna kod učitavanja?" }, + "cardExpiredTitle": { + "message": "Expired card" + }, + "cardExpiredMessage": { + "message": "If you've renewed it, update the card's information" + }, "cardDetails": { "message": "Detalji kartice" }, @@ -3972,6 +3987,9 @@ } } }, + "enableAnimations": { + "message": "Enable animations" + }, "addAccount": { "message": "Dodaj račun" }, diff --git a/apps/browser/src/_locales/hu/messages.json b/apps/browser/src/_locales/hu/messages.json index 3cdbadfffd..dfcfe51ab2 100644 --- a/apps/browser/src/_locales/hu/messages.json +++ b/apps/browser/src/_locales/hu/messages.json @@ -25,9 +25,6 @@ "finishCreatingYourAccountBySettingAPassword": { "message": "A fiók létrehozásának befejezése jelszó beállításával" }, - "login": { - "message": "Bejelentkezés" - }, "enterpriseSingleSignOn": { "message": "Vállalati önálló bejelentkezés" }, @@ -1083,7 +1080,7 @@ "message": "1 GB titkosított tárhely a fájlmellékleteknek." }, "premiumSignUpEmergency": { - "message": "Emergency access" + "message": "Sürgősségi hozzáférés" }, "premiumSignUpTwoStepOptions": { "message": "Saját kétlépcsős bejelentkezési lehetőségek mint a YubiKey és a Duo." @@ -1107,7 +1104,7 @@ "message": "A prémium tagság megvásárolható a bitwarden.com webes széfben. Szeretnénk felkeresni a webhelyet most?" }, "premiumPurchaseAlertV2": { - "message": "You can purchase Premium from your account settings on the Bitwarden web app." + "message": "Prémium szolgáltatást vásárolhatunk a Bitwarden webalkalmazás fiókbeállításai között." }, "premiumCurrentMember": { "message": "Prémium tag vagyunk!" @@ -1115,6 +1112,9 @@ "premiumCurrentMemberThanks": { "message": "Köszönjük a Bitwarden támogatását." }, + "premiumFeatures": { + "message": "Áttérés prémium verzióra és fogadás:" + }, "premiumPrice": { "message": "Mindez csak $PRICE$ /év.", "placeholders": { @@ -1124,6 +1124,15 @@ } } }, + "premiumPriceV2": { + "message": "Mindez csak $PRICE$ /év!", + "placeholders": { + "price": { + "content": "$1", + "example": "$10" + } + } + }, "refreshComplete": { "message": "Frissítés megtörtént" }, @@ -3960,6 +3969,12 @@ "autoFillOnPageLoad": { "message": "Automatikus kitöltés oldalbetöltésnél?" }, + "cardExpiredTitle": { + "message": "Lejárt kártya" + }, + "cardExpiredMessage": { + "message": "Ha megújítottuk, frissítsük a kártya adatait." + }, "cardDetails": { "message": "Kártyaadatok" }, @@ -3972,6 +3987,9 @@ } } }, + "enableAnimations": { + "message": "Animációk engedélyezése" + }, "addAccount": { "message": "Fiók hozzáadása" }, diff --git a/apps/browser/src/_locales/id/messages.json b/apps/browser/src/_locales/id/messages.json index 2eb1c089b9..75dcf04a58 100644 --- a/apps/browser/src/_locales/id/messages.json +++ b/apps/browser/src/_locales/id/messages.json @@ -25,9 +25,6 @@ "finishCreatingYourAccountBySettingAPassword": { "message": "Finish creating your account by setting a password" }, - "login": { - "message": "Masuk" - }, "enterpriseSingleSignOn": { "message": "SSO Perusahaan" }, @@ -1083,7 +1080,7 @@ "message": "1 GB penyimpanan berkas yang dienkripsi." }, "premiumSignUpEmergency": { - "message": "Emergency access" + "message": "Emergency access." }, "premiumSignUpTwoStepOptions": { "message": "Proprietary two-step login options such as YubiKey and Duo." @@ -1115,6 +1112,9 @@ "premiumCurrentMemberThanks": { "message": "Terima kasih telah mendukung Bitwarden." }, + "premiumFeatures": { + "message": "Upgrade to premium and receive:" + }, "premiumPrice": { "message": "Semua itu hanya $PRICE$ /tahun!", "placeholders": { @@ -1124,6 +1124,15 @@ } } }, + "premiumPriceV2": { + "message": "All for just $PRICE$ per year!", + "placeholders": { + "price": { + "content": "$1", + "example": "$10" + } + } + }, "refreshComplete": { "message": "Penyegaran selesai" }, @@ -3960,6 +3969,12 @@ "autoFillOnPageLoad": { "message": "Autofill on page load?" }, + "cardExpiredTitle": { + "message": "Expired card" + }, + "cardExpiredMessage": { + "message": "If you've renewed it, update the card's information" + }, "cardDetails": { "message": "Card details" }, @@ -3972,6 +3987,9 @@ } } }, + "enableAnimations": { + "message": "Enable animations" + }, "addAccount": { "message": "Add account" }, diff --git a/apps/browser/src/_locales/it/messages.json b/apps/browser/src/_locales/it/messages.json index 0c1eb9ef4f..59c4091c1a 100644 --- a/apps/browser/src/_locales/it/messages.json +++ b/apps/browser/src/_locales/it/messages.json @@ -25,9 +25,6 @@ "finishCreatingYourAccountBySettingAPassword": { "message": "Finish creating your account by setting a password" }, - "login": { - "message": "Accedi" - }, "enterpriseSingleSignOn": { "message": "Single Sign-On aziendale" }, @@ -1083,7 +1080,7 @@ "message": "1 GB di spazio di archiviazione crittografato per gli allegati." }, "premiumSignUpEmergency": { - "message": "Emergency access" + "message": "Emergency access." }, "premiumSignUpTwoStepOptions": { "message": "Opzioni di verifica in due passaggi proprietarie come YubiKey e Duo." @@ -1115,6 +1112,9 @@ "premiumCurrentMemberThanks": { "message": "Grazie per il tuo supporto a Bitwarden." }, + "premiumFeatures": { + "message": "Upgrade to premium and receive:" + }, "premiumPrice": { "message": "Il tutto per soli $PRICE$ all'anno!", "placeholders": { @@ -1124,6 +1124,15 @@ } } }, + "premiumPriceV2": { + "message": "All for just $PRICE$ per year!", + "placeholders": { + "price": { + "content": "$1", + "example": "$10" + } + } + }, "refreshComplete": { "message": "Aggiornamento completato" }, @@ -3960,6 +3969,12 @@ "autoFillOnPageLoad": { "message": "Autofill on page load?" }, + "cardExpiredTitle": { + "message": "Expired card" + }, + "cardExpiredMessage": { + "message": "If you've renewed it, update the card's information" + }, "cardDetails": { "message": "Card details" }, @@ -3972,6 +3987,9 @@ } } }, + "enableAnimations": { + "message": "Enable animations" + }, "addAccount": { "message": "Add account" }, diff --git a/apps/browser/src/_locales/ja/messages.json b/apps/browser/src/_locales/ja/messages.json index 9cf7d556a0..8c729136d9 100644 --- a/apps/browser/src/_locales/ja/messages.json +++ b/apps/browser/src/_locales/ja/messages.json @@ -25,9 +25,6 @@ "finishCreatingYourAccountBySettingAPassword": { "message": "パスワードを設定してアカウントの作成を完了してください" }, - "login": { - "message": "ログイン" - }, "enterpriseSingleSignOn": { "message": "組織のシングルサインオン" }, @@ -1083,7 +1080,7 @@ "message": "1GB の暗号化されたファイルストレージ" }, "premiumSignUpEmergency": { - "message": "Emergency access" + "message": "緊急アクセス" }, "premiumSignUpTwoStepOptions": { "message": "YubiKey、Duo などのプロプライエタリな2段階認証オプション。" @@ -1107,7 +1104,7 @@ "message": "プレミアム会員権は bitwarden.com ウェブ保管庫で購入できます。ウェブサイトを開きますか?" }, "premiumPurchaseAlertV2": { - "message": "You can purchase Premium from your account settings on the Bitwarden web app." + "message": "Bitwarden ウェブアプリでアカウント設定からプレミアムを購入できます。" }, "premiumCurrentMember": { "message": "あなたはプレミアム会員です!" @@ -1115,6 +1112,9 @@ "premiumCurrentMemberThanks": { "message": "Bitwarden を支援いただき、ありがとうございます。" }, + "premiumFeatures": { + "message": "プレミアムにアップグレードして受け取る:" + }, "premiumPrice": { "message": "全部でなんと$PRICE$/年だけ!", "placeholders": { @@ -1124,6 +1124,15 @@ } } }, + "premiumPriceV2": { + "message": "すべて込みで年間たったの$PRICE$!", + "placeholders": { + "price": { + "content": "$1", + "example": "$10" + } + } + }, "refreshComplete": { "message": "更新完了" }, @@ -2305,11 +2314,11 @@ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "createdSendSuccessfully": { - "message": "Send created successfully!", + "message": "Send を作成しました!", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendAvailability": { - "message": "The Send will be available to anyone with the link for the next $DAYS$ days.", + "message": "Send は、次の $DAYS$ 日間はリンクを知っている人全員が利用できます。", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated.", "placeholders": { "days": { @@ -2319,7 +2328,7 @@ } }, "sendLinkCopied": { - "message": "Send link copied", + "message": "Send リンクをコピーしました", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "editedSend": { @@ -3960,6 +3969,12 @@ "autoFillOnPageLoad": { "message": "ページ読み込み時に自動入力する" }, + "cardExpiredTitle": { + "message": "期限切れのカード" + }, + "cardExpiredMessage": { + "message": "カードの更新があった場合、カード情報を更新してください" + }, "cardDetails": { "message": "カード情報" }, @@ -3972,6 +3987,9 @@ } } }, + "enableAnimations": { + "message": "アニメーションを有効化" + }, "addAccount": { "message": "アカウントを追加" }, diff --git a/apps/browser/src/_locales/ka/messages.json b/apps/browser/src/_locales/ka/messages.json index a55860c8ff..109ceb35ea 100644 --- a/apps/browser/src/_locales/ka/messages.json +++ b/apps/browser/src/_locales/ka/messages.json @@ -25,9 +25,6 @@ "finishCreatingYourAccountBySettingAPassword": { "message": "Finish creating your account by setting a password" }, - "login": { - "message": "ავტორიზაცია" - }, "enterpriseSingleSignOn": { "message": "Enterprise single sign-on" }, @@ -1083,7 +1080,7 @@ "message": "1 GB encrypted storage for file attachments." }, "premiumSignUpEmergency": { - "message": "Emergency access" + "message": "Emergency access." }, "premiumSignUpTwoStepOptions": { "message": "Proprietary two-step login options such as YubiKey and Duo." @@ -1115,6 +1112,9 @@ "premiumCurrentMemberThanks": { "message": "Thank you for supporting Bitwarden." }, + "premiumFeatures": { + "message": "Upgrade to premium and receive:" + }, "premiumPrice": { "message": "All for just $PRICE$ /year!", "placeholders": { @@ -1124,6 +1124,15 @@ } } }, + "premiumPriceV2": { + "message": "All for just $PRICE$ per year!", + "placeholders": { + "price": { + "content": "$1", + "example": "$10" + } + } + }, "refreshComplete": { "message": "Refresh complete" }, @@ -3960,6 +3969,12 @@ "autoFillOnPageLoad": { "message": "Autofill on page load?" }, + "cardExpiredTitle": { + "message": "Expired card" + }, + "cardExpiredMessage": { + "message": "If you've renewed it, update the card's information" + }, "cardDetails": { "message": "Card details" }, @@ -3972,6 +3987,9 @@ } } }, + "enableAnimations": { + "message": "Enable animations" + }, "addAccount": { "message": "Add account" }, diff --git a/apps/browser/src/_locales/km/messages.json b/apps/browser/src/_locales/km/messages.json index 5503227cba..a580b3372a 100644 --- a/apps/browser/src/_locales/km/messages.json +++ b/apps/browser/src/_locales/km/messages.json @@ -25,9 +25,6 @@ "finishCreatingYourAccountBySettingAPassword": { "message": "Finish creating your account by setting a password" }, - "login": { - "message": "Log in" - }, "enterpriseSingleSignOn": { "message": "Enterprise single sign-on" }, @@ -1083,7 +1080,7 @@ "message": "1 GB encrypted storage for file attachments." }, "premiumSignUpEmergency": { - "message": "Emergency access" + "message": "Emergency access." }, "premiumSignUpTwoStepOptions": { "message": "Proprietary two-step login options such as YubiKey and Duo." @@ -1115,6 +1112,9 @@ "premiumCurrentMemberThanks": { "message": "Thank you for supporting Bitwarden." }, + "premiumFeatures": { + "message": "Upgrade to premium and receive:" + }, "premiumPrice": { "message": "All for just $PRICE$ /year!", "placeholders": { @@ -1124,6 +1124,15 @@ } } }, + "premiumPriceV2": { + "message": "All for just $PRICE$ per year!", + "placeholders": { + "price": { + "content": "$1", + "example": "$10" + } + } + }, "refreshComplete": { "message": "Refresh complete" }, @@ -3960,6 +3969,12 @@ "autoFillOnPageLoad": { "message": "Autofill on page load?" }, + "cardExpiredTitle": { + "message": "Expired card" + }, + "cardExpiredMessage": { + "message": "If you've renewed it, update the card's information" + }, "cardDetails": { "message": "Card details" }, @@ -3972,6 +3987,9 @@ } } }, + "enableAnimations": { + "message": "Enable animations" + }, "addAccount": { "message": "Add account" }, diff --git a/apps/browser/src/_locales/kn/messages.json b/apps/browser/src/_locales/kn/messages.json index 6c398b6aeb..99de615387 100644 --- a/apps/browser/src/_locales/kn/messages.json +++ b/apps/browser/src/_locales/kn/messages.json @@ -25,9 +25,6 @@ "finishCreatingYourAccountBySettingAPassword": { "message": "Finish creating your account by setting a password" }, - "login": { - "message": "ಲಾಗಿನ್" - }, "enterpriseSingleSignOn": { "message": "ಎಂಟರ್‌ಪ್ರೈಸ್ ಏಕ ಸೈನ್-ಆನ್" }, @@ -1083,7 +1080,7 @@ "message": "ಫೈಲ್ ಲಗತ್ತುಗಳಿಗಾಗಿ 1 ಜಿಬಿ ಎನ್‌ಕ್ರಿಪ್ಟ್ ಮಾಡಿದ ಸಂಗ್ರಹ." }, "premiumSignUpEmergency": { - "message": "Emergency access" + "message": "Emergency access." }, "premiumSignUpTwoStepOptions": { "message": "Proprietary two-step login options such as YubiKey and Duo." @@ -1115,6 +1112,9 @@ "premiumCurrentMemberThanks": { "message": "ಬಿಟ್ವಾರ್ಡೆನ್ ಅವರನ್ನು ಬೆಂಬಲಿಸಿದ್ದಕ್ಕಾಗಿ ಧನ್ಯವಾದಗಳು." }, + "premiumFeatures": { + "message": "Upgrade to premium and receive:" + }, "premiumPrice": { "message": "ಎಲ್ಲವೂ ಕೇವಲ $PRICE$ / ವರ್ಷಕ್ಕೆ!", "placeholders": { @@ -1124,6 +1124,15 @@ } } }, + "premiumPriceV2": { + "message": "All for just $PRICE$ per year!", + "placeholders": { + "price": { + "content": "$1", + "example": "$10" + } + } + }, "refreshComplete": { "message": "ರಿಫ್ರೆಶ್ ಪೂರ್ಣಗೊಂಡಿದೆ" }, @@ -3960,6 +3969,12 @@ "autoFillOnPageLoad": { "message": "Autofill on page load?" }, + "cardExpiredTitle": { + "message": "Expired card" + }, + "cardExpiredMessage": { + "message": "If you've renewed it, update the card's information" + }, "cardDetails": { "message": "Card details" }, @@ -3972,6 +3987,9 @@ } } }, + "enableAnimations": { + "message": "Enable animations" + }, "addAccount": { "message": "Add account" }, diff --git a/apps/browser/src/_locales/ko/messages.json b/apps/browser/src/_locales/ko/messages.json index 3b07fa8607..6d01dc6ea9 100644 --- a/apps/browser/src/_locales/ko/messages.json +++ b/apps/browser/src/_locales/ko/messages.json @@ -25,9 +25,6 @@ "finishCreatingYourAccountBySettingAPassword": { "message": "Finish creating your account by setting a password" }, - "login": { - "message": "로그인" - }, "enterpriseSingleSignOn": { "message": "엔터프라이즈 통합 인증 (SSO)" }, @@ -1083,7 +1080,7 @@ "message": "1GB의 암호화된 파일 저장소." }, "premiumSignUpEmergency": { - "message": "Emergency access" + "message": "Emergency access." }, "premiumSignUpTwoStepOptions": { "message": "Proprietary two-step login options such as YubiKey and Duo." @@ -1115,6 +1112,9 @@ "premiumCurrentMemberThanks": { "message": "Bitwarden을 지원해 주셔서 감사합니다." }, + "premiumFeatures": { + "message": "Upgrade to premium and receive:" + }, "premiumPrice": { "message": "이 모든 기능을 연 $PRICE$에 이용하실 수 있습니다!", "placeholders": { @@ -1124,6 +1124,15 @@ } } }, + "premiumPriceV2": { + "message": "All for just $PRICE$ per year!", + "placeholders": { + "price": { + "content": "$1", + "example": "$10" + } + } + }, "refreshComplete": { "message": "새로 고침 완료" }, @@ -3960,6 +3969,12 @@ "autoFillOnPageLoad": { "message": "Autofill on page load?" }, + "cardExpiredTitle": { + "message": "Expired card" + }, + "cardExpiredMessage": { + "message": "If you've renewed it, update the card's information" + }, "cardDetails": { "message": "Card details" }, @@ -3972,6 +3987,9 @@ } } }, + "enableAnimations": { + "message": "Enable animations" + }, "addAccount": { "message": "Add account" }, diff --git a/apps/browser/src/_locales/lt/messages.json b/apps/browser/src/_locales/lt/messages.json index ac58c6df12..a894feb5eb 100644 --- a/apps/browser/src/_locales/lt/messages.json +++ b/apps/browser/src/_locales/lt/messages.json @@ -25,9 +25,6 @@ "finishCreatingYourAccountBySettingAPassword": { "message": "Baigkite kurti paskyrą nustatydami slaptažodį" }, - "login": { - "message": "Prisijungti" - }, "enterpriseSingleSignOn": { "message": "Vienkartinis įmonės prisijungimas" }, @@ -1083,7 +1080,7 @@ "message": "1 GB užšifruotos vietos diske bylų prisegimams." }, "premiumSignUpEmergency": { - "message": "Emergency access" + "message": "Emergency access." }, "premiumSignUpTwoStepOptions": { "message": "Patentuotos dviejų žingsnių prisijungimo parinktys, tokios kaip YubiKey ir Duo." @@ -1115,6 +1112,9 @@ "premiumCurrentMemberThanks": { "message": "Dėkojame, kad palaikote „Bitwarden“." }, + "premiumFeatures": { + "message": "Upgrade to premium and receive:" + }, "premiumPrice": { "message": "Visa tai tik už $PRICE$ / metus!", "placeholders": { @@ -1124,6 +1124,15 @@ } } }, + "premiumPriceV2": { + "message": "All for just $PRICE$ per year!", + "placeholders": { + "price": { + "content": "$1", + "example": "$10" + } + } + }, "refreshComplete": { "message": "Atnaujinimas įvykdytas" }, @@ -3960,6 +3969,12 @@ "autoFillOnPageLoad": { "message": "Autofill on page load?" }, + "cardExpiredTitle": { + "message": "Expired card" + }, + "cardExpiredMessage": { + "message": "If you've renewed it, update the card's information" + }, "cardDetails": { "message": "Kortelės duomenys" }, @@ -3972,6 +3987,9 @@ } } }, + "enableAnimations": { + "message": "Enable animations" + }, "addAccount": { "message": "Pridėti paskyrą" }, diff --git a/apps/browser/src/_locales/lv/messages.json b/apps/browser/src/_locales/lv/messages.json index f43955f7a6..dc7100f3fd 100644 --- a/apps/browser/src/_locales/lv/messages.json +++ b/apps/browser/src/_locales/lv/messages.json @@ -25,9 +25,6 @@ "finishCreatingYourAccountBySettingAPassword": { "message": "Sava konta izveidošana jāpabeidz ar paroles iestatīšanu" }, - "login": { - "message": "Pieteikties" - }, "enterpriseSingleSignOn": { "message": "Uzņēmuma vienotā pieteikšanās" }, @@ -1083,7 +1080,7 @@ "message": "1 GB šifrētas krātuves datņu pielikumiem." }, "premiumSignUpEmergency": { - "message": "Emergency access" + "message": "Ārkārtas piekļuve" }, "premiumSignUpTwoStepOptions": { "message": "Tādas slēgtā pirmavota divpakāpju pieteikšanās iespējas kā YubiKey un Duo." @@ -1107,7 +1104,7 @@ "message": "Premium dalību ir iespējams iegādāties bitwarden.com tīmekļa glabātavā. Vai tagad apmeklēt tīmekļvietni?" }, "premiumPurchaseAlertV2": { - "message": "You can purchase Premium from your account settings on the Bitwarden web app." + "message": "Premium var iegādāties Bitwarden tīmekļa lietotnē sava konta iestatījumos." }, "premiumCurrentMember": { "message": "Tu esi Premium dalībnieks!" @@ -1115,6 +1112,9 @@ "premiumCurrentMemberThanks": { "message": "Paldies, ka atbalsti Bitwarden!" }, + "premiumFeatures": { + "message": "Uzlabo uz \"Premium\" un saņem:" + }, "premiumPrice": { "message": "Viss par tikai $PRICE$ gadā!", "placeholders": { @@ -1124,6 +1124,15 @@ } } }, + "premiumPriceV2": { + "message": "Viss par tikai $PRICE$ gadā.", + "placeholders": { + "price": { + "content": "$1", + "example": "$10" + } + } + }, "refreshComplete": { "message": "Atsvaidzināšana pabeigta" }, @@ -1370,13 +1379,13 @@ "message": "Atvērt glabātavu sānu joslā" }, "commandAutofillLoginDesc": { - "message": "Autofill the last used login for the current website" + "message": "Automātiski aizpildīt ar iepriekš izmantoto pieteikšanās vienumu pašreizējā tīmekļvietnē" }, "commandAutofillCardDesc": { - "message": "Autofill the last used card for the current website" + "message": "Automātiski aizpildīt ar iepriekš izmantoto karti pašreizējā tīmekļvietnē" }, "commandAutofillIdentityDesc": { - "message": "Autofill the last used identity for the current website" + "message": "Automātiski aizpildīt ar iepriekš izmantoto identitāti pašreizējā tīmekļvietnē" }, "commandGeneratePasswordDesc": { "message": "Izveidot jaunu nejaušu paroli un ievietot to starpliktuvē" @@ -1683,7 +1692,7 @@ "description": "Domain name. Ex. website.com" }, "baseDomainOptionRecommended": { - "message": "Base domain (recommended)", + "message": "Pamata domēns (ieteicams)", "description": "Domain name. Ex. website.com" }, "domainName": { @@ -2305,11 +2314,11 @@ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "createdSendSuccessfully": { - "message": "Send created successfully!", + "message": "Send tika veiksmīgi izveidots.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendAvailability": { - "message": "The Send will be available to anyone with the link for the next $DAYS$ days.", + "message": "Send būs pieejams nākamās $DAYS$ dienas ikvienam, kuram ir saite.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated.", "placeholders": { "days": { @@ -2319,7 +2328,7 @@ } }, "sendLinkCopied": { - "message": "Send link copied", + "message": "Send saite ievietota starpliktuvē", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "editedSend": { @@ -2861,16 +2870,16 @@ "message": "Mainīt īsinājumtaustiņus" }, "autofillKeyboardManagerShortcutsLabel": { - "message": "Manage shortcuts" + "message": "Pārvaldīt saīsnes" }, "autofillShortcut": { "message": "Automātiskās aizpildes īsinājumtaustiņi" }, "autofillLoginShortcutNotSet": { - "message": "The autofill login shortcut is not set. Change this in the browser's settings." + "message": "Automātiskās aizpildes īsceļš pieteikšanās vienumiem nav uzstādīts. To var izdarīt pārlūka iestatījumos." }, "autofillLoginShortcutText": { - "message": "The autofill login shortcut is $COMMAND$. Manage all shortcuts in the browser's settings.", + "message": "Automātiskās aizpildes īsceļš pieteikšanās vienumiem ir: $COMMAND$. Visus īsinājumtaustiņus var pārvaldīt pārlūka iestatījumos.", "placeholders": { "command": { "content": "$1", @@ -3960,6 +3969,12 @@ "autoFillOnPageLoad": { "message": "Automātiski aizpildīt lapas ielādes brīdī?" }, + "cardExpiredTitle": { + "message": "Beidzies kartes derīgums" + }, + "cardExpiredMessage": { + "message": "Ja atjaunoji to, jāatjaunina kartes informācija" + }, "cardDetails": { "message": "Kartes dati" }, @@ -3972,6 +3987,9 @@ } } }, + "enableAnimations": { + "message": "Iespējot animācijas" + }, "addAccount": { "message": "Pievienot kontu" }, diff --git a/apps/browser/src/_locales/ml/messages.json b/apps/browser/src/_locales/ml/messages.json index aa9247fb37..80f13845ad 100644 --- a/apps/browser/src/_locales/ml/messages.json +++ b/apps/browser/src/_locales/ml/messages.json @@ -25,9 +25,6 @@ "finishCreatingYourAccountBySettingAPassword": { "message": "Finish creating your account by setting a password" }, - "login": { - "message": "ലോഗിൻ" - }, "enterpriseSingleSignOn": { "message": "എന്റർപ്രൈസ് സിംഗിൾ സൈൻ-ഓൺ" }, @@ -1083,7 +1080,7 @@ "message": "ഫയൽ അറ്റാച്ചുമെന്റുകൾക്കായി 1 ജിബി എൻക്രിപ്റ്റുചെയ്‌ത സംഭരണം." }, "premiumSignUpEmergency": { - "message": "Emergency access" + "message": "Emergency access." }, "premiumSignUpTwoStepOptions": { "message": "Proprietary two-step login options such as YubiKey and Duo." @@ -1115,6 +1112,9 @@ "premiumCurrentMemberThanks": { "message": "Bitwardenനെ പിന്തുണച്ചതിന് നന്ദി." }, + "premiumFeatures": { + "message": "Upgrade to premium and receive:" + }, "premiumPrice": { "message": "എല്ലാം വെറും $PRICE$/ വർഷത്തേക്ക്!", "placeholders": { @@ -1124,6 +1124,15 @@ } } }, + "premiumPriceV2": { + "message": "All for just $PRICE$ per year!", + "placeholders": { + "price": { + "content": "$1", + "example": "$10" + } + } + }, "refreshComplete": { "message": "റിഫ്രഷ് പൂർത്തിയായി" }, @@ -3960,6 +3969,12 @@ "autoFillOnPageLoad": { "message": "Autofill on page load?" }, + "cardExpiredTitle": { + "message": "Expired card" + }, + "cardExpiredMessage": { + "message": "If you've renewed it, update the card's information" + }, "cardDetails": { "message": "Card details" }, @@ -3972,6 +3987,9 @@ } } }, + "enableAnimations": { + "message": "Enable animations" + }, "addAccount": { "message": "Add account" }, diff --git a/apps/browser/src/_locales/mr/messages.json b/apps/browser/src/_locales/mr/messages.json index 0dd108a577..7d1a3b668c 100644 --- a/apps/browser/src/_locales/mr/messages.json +++ b/apps/browser/src/_locales/mr/messages.json @@ -25,9 +25,6 @@ "finishCreatingYourAccountBySettingAPassword": { "message": "Finish creating your account by setting a password" }, - "login": { - "message": "प्रवेश करा" - }, "enterpriseSingleSignOn": { "message": "Enterprise single sign-on" }, @@ -1083,7 +1080,7 @@ "message": "1 GB encrypted storage for file attachments." }, "premiumSignUpEmergency": { - "message": "Emergency access" + "message": "Emergency access." }, "premiumSignUpTwoStepOptions": { "message": "Proprietary two-step login options such as YubiKey and Duo." @@ -1115,6 +1112,9 @@ "premiumCurrentMemberThanks": { "message": "Thank you for supporting Bitwarden." }, + "premiumFeatures": { + "message": "Upgrade to premium and receive:" + }, "premiumPrice": { "message": "All for just $PRICE$ /year!", "placeholders": { @@ -1124,6 +1124,15 @@ } } }, + "premiumPriceV2": { + "message": "All for just $PRICE$ per year!", + "placeholders": { + "price": { + "content": "$1", + "example": "$10" + } + } + }, "refreshComplete": { "message": "Refresh complete" }, @@ -3960,6 +3969,12 @@ "autoFillOnPageLoad": { "message": "Autofill on page load?" }, + "cardExpiredTitle": { + "message": "Expired card" + }, + "cardExpiredMessage": { + "message": "If you've renewed it, update the card's information" + }, "cardDetails": { "message": "Card details" }, @@ -3972,6 +3987,9 @@ } } }, + "enableAnimations": { + "message": "Enable animations" + }, "addAccount": { "message": "Add account" }, diff --git a/apps/browser/src/_locales/my/messages.json b/apps/browser/src/_locales/my/messages.json index 5503227cba..a580b3372a 100644 --- a/apps/browser/src/_locales/my/messages.json +++ b/apps/browser/src/_locales/my/messages.json @@ -25,9 +25,6 @@ "finishCreatingYourAccountBySettingAPassword": { "message": "Finish creating your account by setting a password" }, - "login": { - "message": "Log in" - }, "enterpriseSingleSignOn": { "message": "Enterprise single sign-on" }, @@ -1083,7 +1080,7 @@ "message": "1 GB encrypted storage for file attachments." }, "premiumSignUpEmergency": { - "message": "Emergency access" + "message": "Emergency access." }, "premiumSignUpTwoStepOptions": { "message": "Proprietary two-step login options such as YubiKey and Duo." @@ -1115,6 +1112,9 @@ "premiumCurrentMemberThanks": { "message": "Thank you for supporting Bitwarden." }, + "premiumFeatures": { + "message": "Upgrade to premium and receive:" + }, "premiumPrice": { "message": "All for just $PRICE$ /year!", "placeholders": { @@ -1124,6 +1124,15 @@ } } }, + "premiumPriceV2": { + "message": "All for just $PRICE$ per year!", + "placeholders": { + "price": { + "content": "$1", + "example": "$10" + } + } + }, "refreshComplete": { "message": "Refresh complete" }, @@ -3960,6 +3969,12 @@ "autoFillOnPageLoad": { "message": "Autofill on page load?" }, + "cardExpiredTitle": { + "message": "Expired card" + }, + "cardExpiredMessage": { + "message": "If you've renewed it, update the card's information" + }, "cardDetails": { "message": "Card details" }, @@ -3972,6 +3987,9 @@ } } }, + "enableAnimations": { + "message": "Enable animations" + }, "addAccount": { "message": "Add account" }, diff --git a/apps/browser/src/_locales/nb/messages.json b/apps/browser/src/_locales/nb/messages.json index 6f9a8eacb2..b76b824d2b 100644 --- a/apps/browser/src/_locales/nb/messages.json +++ b/apps/browser/src/_locales/nb/messages.json @@ -25,9 +25,6 @@ "finishCreatingYourAccountBySettingAPassword": { "message": "Finish creating your account by setting a password" }, - "login": { - "message": "Logg inn" - }, "enterpriseSingleSignOn": { "message": "Bedriftsinnlogging (SSO)" }, @@ -1083,7 +1080,7 @@ "message": "1 GB med kryptert fillagring for filvedlegg." }, "premiumSignUpEmergency": { - "message": "Emergency access" + "message": "Emergency access." }, "premiumSignUpTwoStepOptions": { "message": "Proprietary two-step login options such as YubiKey and Duo." @@ -1115,6 +1112,9 @@ "premiumCurrentMemberThanks": { "message": "Takk for at du støtter Bitwarden." }, + "premiumFeatures": { + "message": "Upgrade to premium and receive:" + }, "premiumPrice": { "message": "Og alt det for %price%/år!", "placeholders": { @@ -1124,6 +1124,15 @@ } } }, + "premiumPriceV2": { + "message": "All for just $PRICE$ per year!", + "placeholders": { + "price": { + "content": "$1", + "example": "$10" + } + } + }, "refreshComplete": { "message": "Oppfriskning fullført" }, @@ -3960,6 +3969,12 @@ "autoFillOnPageLoad": { "message": "Autofill on page load?" }, + "cardExpiredTitle": { + "message": "Expired card" + }, + "cardExpiredMessage": { + "message": "If you've renewed it, update the card's information" + }, "cardDetails": { "message": "Card details" }, @@ -3972,6 +3987,9 @@ } } }, + "enableAnimations": { + "message": "Enable animations" + }, "addAccount": { "message": "Add account" }, diff --git a/apps/browser/src/_locales/ne/messages.json b/apps/browser/src/_locales/ne/messages.json index 5503227cba..a580b3372a 100644 --- a/apps/browser/src/_locales/ne/messages.json +++ b/apps/browser/src/_locales/ne/messages.json @@ -25,9 +25,6 @@ "finishCreatingYourAccountBySettingAPassword": { "message": "Finish creating your account by setting a password" }, - "login": { - "message": "Log in" - }, "enterpriseSingleSignOn": { "message": "Enterprise single sign-on" }, @@ -1083,7 +1080,7 @@ "message": "1 GB encrypted storage for file attachments." }, "premiumSignUpEmergency": { - "message": "Emergency access" + "message": "Emergency access." }, "premiumSignUpTwoStepOptions": { "message": "Proprietary two-step login options such as YubiKey and Duo." @@ -1115,6 +1112,9 @@ "premiumCurrentMemberThanks": { "message": "Thank you for supporting Bitwarden." }, + "premiumFeatures": { + "message": "Upgrade to premium and receive:" + }, "premiumPrice": { "message": "All for just $PRICE$ /year!", "placeholders": { @@ -1124,6 +1124,15 @@ } } }, + "premiumPriceV2": { + "message": "All for just $PRICE$ per year!", + "placeholders": { + "price": { + "content": "$1", + "example": "$10" + } + } + }, "refreshComplete": { "message": "Refresh complete" }, @@ -3960,6 +3969,12 @@ "autoFillOnPageLoad": { "message": "Autofill on page load?" }, + "cardExpiredTitle": { + "message": "Expired card" + }, + "cardExpiredMessage": { + "message": "If you've renewed it, update the card's information" + }, "cardDetails": { "message": "Card details" }, @@ -3972,6 +3987,9 @@ } } }, + "enableAnimations": { + "message": "Enable animations" + }, "addAccount": { "message": "Add account" }, diff --git a/apps/browser/src/_locales/nl/messages.json b/apps/browser/src/_locales/nl/messages.json index 9f4cfc9888..39683ed769 100644 --- a/apps/browser/src/_locales/nl/messages.json +++ b/apps/browser/src/_locales/nl/messages.json @@ -25,9 +25,6 @@ "finishCreatingYourAccountBySettingAPassword": { "message": "Rond het aanmaken van je account af met het instellen van een wachtwoord" }, - "login": { - "message": "Inloggen" - }, "enterpriseSingleSignOn": { "message": "Single sign-on voor bedrijven" }, @@ -1083,7 +1080,7 @@ "message": "1 GB versleutelde opslag voor bijlagen." }, "premiumSignUpEmergency": { - "message": "Emergency access" + "message": "Noodtoegang" }, "premiumSignUpTwoStepOptions": { "message": "Eigen opties voor tweestapsaanmelding zoals YubiKey en Duo." @@ -1107,7 +1104,7 @@ "message": "Je kunt een Premium-abonnement aanschaffen in de webkluis op bitwarden.com. Wil je de website nu bezoeken?" }, "premiumPurchaseAlertV2": { - "message": "You can purchase Premium from your account settings on the Bitwarden web app." + "message": "Je kunt Premium via je accountinstellingen in de Bitwarden-webapp kopen." }, "premiumCurrentMember": { "message": "Je bent Premium-lid!" @@ -1115,6 +1112,9 @@ "premiumCurrentMemberThanks": { "message": "Bedankt voor het ondersteunen van Bitwarden." }, + "premiumFeatures": { + "message": "Upgrade naar premium en ontvang:" + }, "premiumPrice": { "message": "Dit alles voor slechts $PRICE$ per jaar!", "placeholders": { @@ -1124,6 +1124,15 @@ } } }, + "premiumPriceV2": { + "message": "Dit alles voor slechts $PRICE$ per jaar!", + "placeholders": { + "price": { + "content": "$1", + "example": "$10" + } + } + }, "refreshComplete": { "message": "Bijwerken voltooid" }, @@ -2305,11 +2314,11 @@ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "createdSendSuccessfully": { - "message": "Send created successfully!", + "message": "Send succesvol aangemaakt!", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendAvailability": { - "message": "The Send will be available to anyone with the link for the next $DAYS$ days.", + "message": "De Send is de komende $DAYS$ dagen beschikbaar voor iedereen met de link.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated.", "placeholders": { "days": { @@ -2319,7 +2328,7 @@ } }, "sendLinkCopied": { - "message": "Send link copied", + "message": "Send-link gekopieerd", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "editedSend": { @@ -3960,6 +3969,12 @@ "autoFillOnPageLoad": { "message": "Automatisch invullen bij laden van pagina?" }, + "cardExpiredTitle": { + "message": "Verlopen kaart" + }, + "cardExpiredMessage": { + "message": "Als je het hebt vernieuwd, werk dan de informatie van de kaart bij" + }, "cardDetails": { "message": "Kaartgegevens" }, @@ -3972,6 +3987,9 @@ } } }, + "enableAnimations": { + "message": "Animaties inschakelen" + }, "addAccount": { "message": "Account toevoegen" }, diff --git a/apps/browser/src/_locales/nn/messages.json b/apps/browser/src/_locales/nn/messages.json index 5503227cba..a580b3372a 100644 --- a/apps/browser/src/_locales/nn/messages.json +++ b/apps/browser/src/_locales/nn/messages.json @@ -25,9 +25,6 @@ "finishCreatingYourAccountBySettingAPassword": { "message": "Finish creating your account by setting a password" }, - "login": { - "message": "Log in" - }, "enterpriseSingleSignOn": { "message": "Enterprise single sign-on" }, @@ -1083,7 +1080,7 @@ "message": "1 GB encrypted storage for file attachments." }, "premiumSignUpEmergency": { - "message": "Emergency access" + "message": "Emergency access." }, "premiumSignUpTwoStepOptions": { "message": "Proprietary two-step login options such as YubiKey and Duo." @@ -1115,6 +1112,9 @@ "premiumCurrentMemberThanks": { "message": "Thank you for supporting Bitwarden." }, + "premiumFeatures": { + "message": "Upgrade to premium and receive:" + }, "premiumPrice": { "message": "All for just $PRICE$ /year!", "placeholders": { @@ -1124,6 +1124,15 @@ } } }, + "premiumPriceV2": { + "message": "All for just $PRICE$ per year!", + "placeholders": { + "price": { + "content": "$1", + "example": "$10" + } + } + }, "refreshComplete": { "message": "Refresh complete" }, @@ -3960,6 +3969,12 @@ "autoFillOnPageLoad": { "message": "Autofill on page load?" }, + "cardExpiredTitle": { + "message": "Expired card" + }, + "cardExpiredMessage": { + "message": "If you've renewed it, update the card's information" + }, "cardDetails": { "message": "Card details" }, @@ -3972,6 +3987,9 @@ } } }, + "enableAnimations": { + "message": "Enable animations" + }, "addAccount": { "message": "Add account" }, diff --git a/apps/browser/src/_locales/or/messages.json b/apps/browser/src/_locales/or/messages.json index 5503227cba..a580b3372a 100644 --- a/apps/browser/src/_locales/or/messages.json +++ b/apps/browser/src/_locales/or/messages.json @@ -25,9 +25,6 @@ "finishCreatingYourAccountBySettingAPassword": { "message": "Finish creating your account by setting a password" }, - "login": { - "message": "Log in" - }, "enterpriseSingleSignOn": { "message": "Enterprise single sign-on" }, @@ -1083,7 +1080,7 @@ "message": "1 GB encrypted storage for file attachments." }, "premiumSignUpEmergency": { - "message": "Emergency access" + "message": "Emergency access." }, "premiumSignUpTwoStepOptions": { "message": "Proprietary two-step login options such as YubiKey and Duo." @@ -1115,6 +1112,9 @@ "premiumCurrentMemberThanks": { "message": "Thank you for supporting Bitwarden." }, + "premiumFeatures": { + "message": "Upgrade to premium and receive:" + }, "premiumPrice": { "message": "All for just $PRICE$ /year!", "placeholders": { @@ -1124,6 +1124,15 @@ } } }, + "premiumPriceV2": { + "message": "All for just $PRICE$ per year!", + "placeholders": { + "price": { + "content": "$1", + "example": "$10" + } + } + }, "refreshComplete": { "message": "Refresh complete" }, @@ -3960,6 +3969,12 @@ "autoFillOnPageLoad": { "message": "Autofill on page load?" }, + "cardExpiredTitle": { + "message": "Expired card" + }, + "cardExpiredMessage": { + "message": "If you've renewed it, update the card's information" + }, "cardDetails": { "message": "Card details" }, @@ -3972,6 +3987,9 @@ } } }, + "enableAnimations": { + "message": "Enable animations" + }, "addAccount": { "message": "Add account" }, diff --git a/apps/browser/src/_locales/pl/messages.json b/apps/browser/src/_locales/pl/messages.json index 482f07671c..d1d77df71a 100644 --- a/apps/browser/src/_locales/pl/messages.json +++ b/apps/browser/src/_locales/pl/messages.json @@ -25,9 +25,6 @@ "finishCreatingYourAccountBySettingAPassword": { "message": "Ukończ tworzenie konta poprzez ustawienie hasła" }, - "login": { - "message": "Zaloguj się" - }, "enterpriseSingleSignOn": { "message": "Logowanie jednokrotne" }, @@ -1083,7 +1080,7 @@ "message": "1 GB miejsca na zaszyfrowane załączniki." }, "premiumSignUpEmergency": { - "message": "Emergency access" + "message": "Emergency access." }, "premiumSignUpTwoStepOptions": { "message": "Własnościowe opcje logowania dwuetapowego, takie jak YubiKey i Duo." @@ -1115,6 +1112,9 @@ "premiumCurrentMemberThanks": { "message": "Dziękujemy za wspieranie Bitwarden." }, + "premiumFeatures": { + "message": "Upgrade to premium and receive:" + }, "premiumPrice": { "message": "Wszystko to jedynie za $PRICE$ /rok!", "placeholders": { @@ -1124,6 +1124,15 @@ } } }, + "premiumPriceV2": { + "message": "All for just $PRICE$ per year!", + "placeholders": { + "price": { + "content": "$1", + "example": "$10" + } + } + }, "refreshComplete": { "message": "Odświeżanie zostało zakończone" }, @@ -3960,6 +3969,12 @@ "autoFillOnPageLoad": { "message": "Włącz autouzupełnianie po załadowaniu strony?" }, + "cardExpiredTitle": { + "message": "Expired card" + }, + "cardExpiredMessage": { + "message": "If you've renewed it, update the card's information" + }, "cardDetails": { "message": "Szczegóły karty" }, @@ -3972,6 +3987,9 @@ } } }, + "enableAnimations": { + "message": "Enable animations" + }, "addAccount": { "message": "Dodaj konto" }, diff --git a/apps/browser/src/_locales/pt_BR/messages.json b/apps/browser/src/_locales/pt_BR/messages.json index e7d20057c9..f15f3eb922 100644 --- a/apps/browser/src/_locales/pt_BR/messages.json +++ b/apps/browser/src/_locales/pt_BR/messages.json @@ -25,9 +25,6 @@ "finishCreatingYourAccountBySettingAPassword": { "message": "Termine de criar a sua conta definindo uma senha" }, - "login": { - "message": "Iniciar Sessão" - }, "enterpriseSingleSignOn": { "message": "Iniciar Sessão Empresarial Única" }, @@ -1083,7 +1080,7 @@ "message": "1 GB de armazenamento de arquivos encriptados." }, "premiumSignUpEmergency": { - "message": "Emergency access" + "message": "Emergency access." }, "premiumSignUpTwoStepOptions": { "message": "Opções de login em duas etapas como YubiKey e Duo." @@ -1115,6 +1112,9 @@ "premiumCurrentMemberThanks": { "message": "Obrigado por apoiar o Bitwarden." }, + "premiumFeatures": { + "message": "Upgrade to premium and receive:" + }, "premiumPrice": { "message": "Tudo por apenas %price% /ano!", "placeholders": { @@ -1124,6 +1124,15 @@ } } }, + "premiumPriceV2": { + "message": "All for just $PRICE$ per year!", + "placeholders": { + "price": { + "content": "$1", + "example": "$10" + } + } + }, "refreshComplete": { "message": "Atualização completa" }, @@ -3960,6 +3969,12 @@ "autoFillOnPageLoad": { "message": "Preenchimento automático ao carregar a página?" }, + "cardExpiredTitle": { + "message": "Expired card" + }, + "cardExpiredMessage": { + "message": "If you've renewed it, update the card's information" + }, "cardDetails": { "message": "Detalhes do cartão" }, @@ -3972,6 +3987,9 @@ } } }, + "enableAnimations": { + "message": "Enable animations" + }, "addAccount": { "message": "Adicionar conta" }, diff --git a/apps/browser/src/_locales/pt_PT/messages.json b/apps/browser/src/_locales/pt_PT/messages.json index f08f0875a9..75c0d12f9e 100644 --- a/apps/browser/src/_locales/pt_PT/messages.json +++ b/apps/browser/src/_locales/pt_PT/messages.json @@ -25,9 +25,6 @@ "finishCreatingYourAccountBySettingAPassword": { "message": "Termine a criação da sua conta definindo uma palavra-passe" }, - "login": { - "message": "Iniciar sessão" - }, "enterpriseSingleSignOn": { "message": "Início de sessão único para empresas" }, @@ -1083,7 +1080,7 @@ "message": "1 GB de armazenamento encriptado para anexos de ficheiros." }, "premiumSignUpEmergency": { - "message": "Acesso de emergência" + "message": "Acesso de emergência." }, "premiumSignUpTwoStepOptions": { "message": "Opções proprietárias de verificação de dois passos, como YubiKey e Duo." @@ -1115,6 +1112,9 @@ "premiumCurrentMemberThanks": { "message": "Obrigado por apoiar o Bitwarden." }, + "premiumFeatures": { + "message": "Atualize para o Premium e receba:" + }, "premiumPrice": { "message": "Tudo por apenas $PRICE$ /ano!", "placeholders": { @@ -1124,6 +1124,15 @@ } } }, + "premiumPriceV2": { + "message": "Tudo por apenas $PRICE$ por ano!", + "placeholders": { + "price": { + "content": "$1", + "example": "$10" + } + } + }, "refreshComplete": { "message": "Atualização concluída" }, @@ -3960,6 +3969,12 @@ "autoFillOnPageLoad": { "message": "Preencher automaticamente ao carregar a página?" }, + "cardExpiredTitle": { + "message": "Cartão expirado" + }, + "cardExpiredMessage": { + "message": "Se o renovou, atualize as informações do cartão" + }, "cardDetails": { "message": "Detalhes do cartão" }, @@ -3972,6 +3987,9 @@ } } }, + "enableAnimations": { + "message": "Ativar animações" + }, "addAccount": { "message": "Adicionar conta" }, diff --git a/apps/browser/src/_locales/ro/messages.json b/apps/browser/src/_locales/ro/messages.json index 2359101274..90dbfd33d2 100644 --- a/apps/browser/src/_locales/ro/messages.json +++ b/apps/browser/src/_locales/ro/messages.json @@ -25,9 +25,6 @@ "finishCreatingYourAccountBySettingAPassword": { "message": "Finalizați crearea contului prin setarea unei parole" }, - "login": { - "message": "Conectare" - }, "enterpriseSingleSignOn": { "message": "Conectare unică organizație" }, @@ -1083,7 +1080,7 @@ "message": "1 GB spațiu de stocare criptat pentru atașamente de fișiere." }, "premiumSignUpEmergency": { - "message": "Emergency access" + "message": "Emergency access." }, "premiumSignUpTwoStepOptions": { "message": "Opțiuni brevetate de conectare cu doi factori, cum ar fi YubiKey și Duo." @@ -1115,6 +1112,9 @@ "premiumCurrentMemberThanks": { "message": "Vă mulțumim pentru susținerea Bitwarden." }, + "premiumFeatures": { + "message": "Upgrade to premium and receive:" + }, "premiumPrice": { "message": "Totul pentru doar %price% /an!", "placeholders": { @@ -1124,6 +1124,15 @@ } } }, + "premiumPriceV2": { + "message": "All for just $PRICE$ per year!", + "placeholders": { + "price": { + "content": "$1", + "example": "$10" + } + } + }, "refreshComplete": { "message": "Actualizare completă" }, @@ -3960,6 +3969,12 @@ "autoFillOnPageLoad": { "message": "Autofill on page load?" }, + "cardExpiredTitle": { + "message": "Expired card" + }, + "cardExpiredMessage": { + "message": "If you've renewed it, update the card's information" + }, "cardDetails": { "message": "Card details" }, @@ -3972,6 +3987,9 @@ } } }, + "enableAnimations": { + "message": "Enable animations" + }, "addAccount": { "message": "Add account" }, diff --git a/apps/browser/src/_locales/ru/messages.json b/apps/browser/src/_locales/ru/messages.json index 67bbdb3f43..5002161e96 100644 --- a/apps/browser/src/_locales/ru/messages.json +++ b/apps/browser/src/_locales/ru/messages.json @@ -25,9 +25,6 @@ "finishCreatingYourAccountBySettingAPassword": { "message": "Завершите создание аккаунта, задав пароль" }, - "login": { - "message": "Войти" - }, "enterpriseSingleSignOn": { "message": "Единая корпоративная авторизация" }, @@ -1115,6 +1112,9 @@ "premiumCurrentMemberThanks": { "message": "Благодарим вас за поддержку Bitwarden." }, + "premiumFeatures": { + "message": "Перейдите на Премиум и получите:" + }, "premiumPrice": { "message": "Всего лишь $PRICE$ в год!", "placeholders": { @@ -1124,6 +1124,15 @@ } } }, + "premiumPriceV2": { + "message": "Всего лишь $PRICE$ в год!", + "placeholders": { + "price": { + "content": "$1", + "example": "$10" + } + } + }, "refreshComplete": { "message": "Обновление завершено" }, @@ -3960,6 +3969,12 @@ "autoFillOnPageLoad": { "message": "Автозаполнение при загрузке страницы?" }, + "cardExpiredTitle": { + "message": "Истек срок действия карты" + }, + "cardExpiredMessage": { + "message": "Если вы заменили карту, обновите информацию о ней" + }, "cardDetails": { "message": "Реквизиты карты" }, @@ -3972,6 +3987,9 @@ } } }, + "enableAnimations": { + "message": "Включить анимацию" + }, "addAccount": { "message": "Добавить аккаунт" }, diff --git a/apps/browser/src/_locales/si/messages.json b/apps/browser/src/_locales/si/messages.json index 5c5cb238ab..edffa75671 100644 --- a/apps/browser/src/_locales/si/messages.json +++ b/apps/browser/src/_locales/si/messages.json @@ -25,9 +25,6 @@ "finishCreatingYourAccountBySettingAPassword": { "message": "Finish creating your account by setting a password" }, - "login": { - "message": "පිවිසෙන්න" - }, "enterpriseSingleSignOn": { "message": "ව්යවසාය තනි සංඥා මත" }, @@ -1083,7 +1080,7 @@ "message": "ගොනු ඇමුණුම් සඳහා 1 GB සංකේතාත්මක ගබඩා." }, "premiumSignUpEmergency": { - "message": "Emergency access" + "message": "Emergency access." }, "premiumSignUpTwoStepOptions": { "message": "Proprietary two-step login options such as YubiKey and Duo." @@ -1115,6 +1112,9 @@ "premiumCurrentMemberThanks": { "message": "බිට්වර්ඩන්ට සහාය වීම ගැන ස්තූතියි." }, + "premiumFeatures": { + "message": "Upgrade to premium and receive:" + }, "premiumPrice": { "message": "සියල්ල $PRICE$ /අවුරුද්ද සඳහා!", "placeholders": { @@ -1124,6 +1124,15 @@ } } }, + "premiumPriceV2": { + "message": "All for just $PRICE$ per year!", + "placeholders": { + "price": { + "content": "$1", + "example": "$10" + } + } + }, "refreshComplete": { "message": "සම්පූර්ණ නැවුම් කරන්න" }, @@ -3960,6 +3969,12 @@ "autoFillOnPageLoad": { "message": "Autofill on page load?" }, + "cardExpiredTitle": { + "message": "Expired card" + }, + "cardExpiredMessage": { + "message": "If you've renewed it, update the card's information" + }, "cardDetails": { "message": "Card details" }, @@ -3972,6 +3987,9 @@ } } }, + "enableAnimations": { + "message": "Enable animations" + }, "addAccount": { "message": "Add account" }, diff --git a/apps/browser/src/_locales/sk/messages.json b/apps/browser/src/_locales/sk/messages.json index 85e80156e6..03d1eaf38a 100644 --- a/apps/browser/src/_locales/sk/messages.json +++ b/apps/browser/src/_locales/sk/messages.json @@ -25,9 +25,6 @@ "finishCreatingYourAccountBySettingAPassword": { "message": "Zdajte heslo na vytvorenie účtu" }, - "login": { - "message": "Prihlásiť sa" - }, "enterpriseSingleSignOn": { "message": "Jednotné prihlásenie pre podniky (SSO)" }, @@ -1115,6 +1112,9 @@ "premiumCurrentMemberThanks": { "message": "Ďakujeme, že podporujete Bitwarden." }, + "premiumFeatures": { + "message": "Povýšte na premium a získajte:" + }, "premiumPrice": { "message": "Všetko len za %price% /rok!", "placeholders": { @@ -1124,6 +1124,15 @@ } } }, + "premiumPriceV2": { + "message": "Všetko len za $PRICE$ ročne!", + "placeholders": { + "price": { + "content": "$1", + "example": "$10" + } + } + }, "refreshComplete": { "message": "Obnova kompletná" }, @@ -2309,7 +2318,7 @@ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendAvailability": { - "message": "Send bude k dispozícii každemu s odkazom po dobu $DAYS$ dní.", + "message": "Send bude k dispozícii každému s odkazom po dobu $DAYS$ dní.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated.", "placeholders": { "days": { @@ -3960,6 +3969,12 @@ "autoFillOnPageLoad": { "message": "Automaticky vyplniť pri načítaní stránky?" }, + "cardExpiredTitle": { + "message": "Exspirovaná karta" + }, + "cardExpiredMessage": { + "message": "Ak ste kartu obnovili, aktualizujte jej údaje" + }, "cardDetails": { "message": "Podrobnosti o karte" }, @@ -3972,6 +3987,9 @@ } } }, + "enableAnimations": { + "message": "Povoliť animácie" + }, "addAccount": { "message": "Pridať účet" }, diff --git a/apps/browser/src/_locales/sl/messages.json b/apps/browser/src/_locales/sl/messages.json index 19fb63eca7..4a4bb31d9b 100644 --- a/apps/browser/src/_locales/sl/messages.json +++ b/apps/browser/src/_locales/sl/messages.json @@ -25,9 +25,6 @@ "finishCreatingYourAccountBySettingAPassword": { "message": "Finish creating your account by setting a password" }, - "login": { - "message": "Prijavi se" - }, "enterpriseSingleSignOn": { "message": "Enkratna podjetniška prijava." }, @@ -1083,7 +1080,7 @@ "message": "1 GB šifriranega prostora za shrambo podatkov." }, "premiumSignUpEmergency": { - "message": "Emergency access" + "message": "Emergency access." }, "premiumSignUpTwoStepOptions": { "message": "Proprietary two-step login options such as YubiKey and Duo." @@ -1115,6 +1112,9 @@ "premiumCurrentMemberThanks": { "message": "Hvala, ker podpirate Bitwarden." }, + "premiumFeatures": { + "message": "Upgrade to premium and receive:" + }, "premiumPrice": { "message": "Vse za samo $PRICE$ /leto!", "placeholders": { @@ -1124,6 +1124,15 @@ } } }, + "premiumPriceV2": { + "message": "All for just $PRICE$ per year!", + "placeholders": { + "price": { + "content": "$1", + "example": "$10" + } + } + }, "refreshComplete": { "message": "Osveževanje zaključeno" }, @@ -3960,6 +3969,12 @@ "autoFillOnPageLoad": { "message": "Autofill on page load?" }, + "cardExpiredTitle": { + "message": "Expired card" + }, + "cardExpiredMessage": { + "message": "If you've renewed it, update the card's information" + }, "cardDetails": { "message": "Card details" }, @@ -3972,6 +3987,9 @@ } } }, + "enableAnimations": { + "message": "Enable animations" + }, "addAccount": { "message": "Add account" }, diff --git a/apps/browser/src/_locales/sr/messages.json b/apps/browser/src/_locales/sr/messages.json index ec6b5e98b8..eaf7a732e8 100644 --- a/apps/browser/src/_locales/sr/messages.json +++ b/apps/browser/src/_locales/sr/messages.json @@ -25,9 +25,6 @@ "finishCreatingYourAccountBySettingAPassword": { "message": "Завршите креирање налога постављањем лозинке" }, - "login": { - "message": "Пријавите се" - }, "enterpriseSingleSignOn": { "message": "Enterprise Једна Пријава" }, @@ -1083,7 +1080,7 @@ "message": "1ГБ шифровано складиште за прилоге." }, "premiumSignUpEmergency": { - "message": "Emergency access" + "message": "Хитан приступ." }, "premiumSignUpTwoStepOptions": { "message": "Приоритарне опције пријаве у два корака као што су YubiKey и Duo." @@ -1107,7 +1104,7 @@ "message": "Можете купити премијум претплату на bitwarden.com. Да ли желите да посетите веб сајт сада?" }, "premiumPurchaseAlertV2": { - "message": "You can purchase Premium from your account settings on the Bitwarden web app." + "message": "Можете да купите Премиум у подешавањима налога у веб апликацији Bitwarden." }, "premiumCurrentMember": { "message": "Ви сте премијум члан!" @@ -1115,6 +1112,9 @@ "premiumCurrentMemberThanks": { "message": "Хвала Вам за подршку Bitwarden-а." }, + "premiumFeatures": { + "message": "Надоградите на премиум и добијте:" + }, "premiumPrice": { "message": "Све за само $PRICE$ годишње!", "placeholders": { @@ -1124,6 +1124,15 @@ } } }, + "premiumPriceV2": { + "message": "Све то за само $PRICE$ годишње!", + "placeholders": { + "price": { + "content": "$1", + "example": "$10" + } + } + }, "refreshComplete": { "message": "Освежавање је завршено" }, @@ -2305,7 +2314,7 @@ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "createdSendSuccessfully": { - "message": "Send created successfully!", + "message": "Send је успешно направљен!", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendAvailability": { @@ -2319,7 +2328,7 @@ } }, "sendLinkCopied": { - "message": "Send link copied", + "message": "Send линк је копиран", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "editedSend": { @@ -3960,6 +3969,12 @@ "autoFillOnPageLoad": { "message": "Ауто-попуњавање при учитавању странице?" }, + "cardExpiredTitle": { + "message": "Картица је истекла" + }, + "cardExpiredMessage": { + "message": "Ако сте је обновили, ажурирајте податке о картици" + }, "cardDetails": { "message": "Детаљи картице" }, @@ -3972,6 +3987,9 @@ } } }, + "enableAnimations": { + "message": "Омогући анимације" + }, "addAccount": { "message": "Додај налог" }, diff --git a/apps/browser/src/_locales/sv/messages.json b/apps/browser/src/_locales/sv/messages.json index e0265494f1..f885a489b0 100644 --- a/apps/browser/src/_locales/sv/messages.json +++ b/apps/browser/src/_locales/sv/messages.json @@ -25,9 +25,6 @@ "finishCreatingYourAccountBySettingAPassword": { "message": "Finish creating your account by setting a password" }, - "login": { - "message": "Logga in" - }, "enterpriseSingleSignOn": { "message": "Single Sign-On för företag" }, @@ -1083,7 +1080,7 @@ "message": "1 GB lagring av krypterade filer." }, "premiumSignUpEmergency": { - "message": "Emergency access" + "message": "Nödåtkomst" }, "premiumSignUpTwoStepOptions": { "message": "Premium-alternativ för tvåstegsverifiering, såsom YubiKey och Duo." @@ -1115,6 +1112,9 @@ "premiumCurrentMemberThanks": { "message": "Tack för att du stödjer Bitwarden." }, + "premiumFeatures": { + "message": "Uppgradera till Premium och få:" + }, "premiumPrice": { "message": "Allt för endast $PRICE$/år!", "placeholders": { @@ -1124,6 +1124,15 @@ } } }, + "premiumPriceV2": { + "message": "Allt för endast $PRICE$ per år!", + "placeholders": { + "price": { + "content": "$1", + "example": "$10" + } + } + }, "refreshComplete": { "message": "Uppdatering färdig" }, @@ -3960,6 +3969,12 @@ "autoFillOnPageLoad": { "message": "Autofill on page load?" }, + "cardExpiredTitle": { + "message": "Expired card" + }, + "cardExpiredMessage": { + "message": "If you've renewed it, update the card's information" + }, "cardDetails": { "message": "Card details" }, @@ -3972,6 +3987,9 @@ } } }, + "enableAnimations": { + "message": "Aktivera animationer" + }, "addAccount": { "message": "Lägg till konto" }, diff --git a/apps/browser/src/_locales/te/messages.json b/apps/browser/src/_locales/te/messages.json index 5503227cba..a580b3372a 100644 --- a/apps/browser/src/_locales/te/messages.json +++ b/apps/browser/src/_locales/te/messages.json @@ -25,9 +25,6 @@ "finishCreatingYourAccountBySettingAPassword": { "message": "Finish creating your account by setting a password" }, - "login": { - "message": "Log in" - }, "enterpriseSingleSignOn": { "message": "Enterprise single sign-on" }, @@ -1083,7 +1080,7 @@ "message": "1 GB encrypted storage for file attachments." }, "premiumSignUpEmergency": { - "message": "Emergency access" + "message": "Emergency access." }, "premiumSignUpTwoStepOptions": { "message": "Proprietary two-step login options such as YubiKey and Duo." @@ -1115,6 +1112,9 @@ "premiumCurrentMemberThanks": { "message": "Thank you for supporting Bitwarden." }, + "premiumFeatures": { + "message": "Upgrade to premium and receive:" + }, "premiumPrice": { "message": "All for just $PRICE$ /year!", "placeholders": { @@ -1124,6 +1124,15 @@ } } }, + "premiumPriceV2": { + "message": "All for just $PRICE$ per year!", + "placeholders": { + "price": { + "content": "$1", + "example": "$10" + } + } + }, "refreshComplete": { "message": "Refresh complete" }, @@ -3960,6 +3969,12 @@ "autoFillOnPageLoad": { "message": "Autofill on page load?" }, + "cardExpiredTitle": { + "message": "Expired card" + }, + "cardExpiredMessage": { + "message": "If you've renewed it, update the card's information" + }, "cardDetails": { "message": "Card details" }, @@ -3972,6 +3987,9 @@ } } }, + "enableAnimations": { + "message": "Enable animations" + }, "addAccount": { "message": "Add account" }, diff --git a/apps/browser/src/_locales/th/messages.json b/apps/browser/src/_locales/th/messages.json index 3ce8155e8e..490aa27d73 100644 --- a/apps/browser/src/_locales/th/messages.json +++ b/apps/browser/src/_locales/th/messages.json @@ -25,9 +25,6 @@ "finishCreatingYourAccountBySettingAPassword": { "message": "Finish creating your account by setting a password" }, - "login": { - "message": "เข้าสู่ระบบ" - }, "enterpriseSingleSignOn": { "message": "Enterprise Single Sign-On" }, @@ -1083,7 +1080,7 @@ "message": "1 GB of encrypted file storage." }, "premiumSignUpEmergency": { - "message": "Emergency access" + "message": "Emergency access." }, "premiumSignUpTwoStepOptions": { "message": "Proprietary two-step login options such as YubiKey and Duo." @@ -1115,6 +1112,9 @@ "premiumCurrentMemberThanks": { "message": "Thank you for supporting bitwarden." }, + "premiumFeatures": { + "message": "Upgrade to premium and receive:" + }, "premiumPrice": { "message": "All for just $PRICE$ /year!", "placeholders": { @@ -1124,6 +1124,15 @@ } } }, + "premiumPriceV2": { + "message": "All for just $PRICE$ per year!", + "placeholders": { + "price": { + "content": "$1", + "example": "$10" + } + } + }, "refreshComplete": { "message": "Refresh complete" }, @@ -3960,6 +3969,12 @@ "autoFillOnPageLoad": { "message": "Autofill on page load?" }, + "cardExpiredTitle": { + "message": "Expired card" + }, + "cardExpiredMessage": { + "message": "If you've renewed it, update the card's information" + }, "cardDetails": { "message": "Card details" }, @@ -3972,6 +3987,9 @@ } } }, + "enableAnimations": { + "message": "Enable animations" + }, "addAccount": { "message": "Add account" }, diff --git a/apps/browser/src/_locales/tr/messages.json b/apps/browser/src/_locales/tr/messages.json index 045ca1057f..9ecaf18c28 100644 --- a/apps/browser/src/_locales/tr/messages.json +++ b/apps/browser/src/_locales/tr/messages.json @@ -25,9 +25,6 @@ "finishCreatingYourAccountBySettingAPassword": { "message": "Parolanızı belirleyerek hesabınızı oluşturmayı tamamlayın" }, - "login": { - "message": "Giriş yap" - }, "enterpriseSingleSignOn": { "message": "Kurumsal tek oturum açma (SSO)" }, @@ -1083,7 +1080,7 @@ "message": "Dosya ekleri için 1 GB şifrelenmiş depolama." }, "premiumSignUpEmergency": { - "message": "Emergency access" + "message": "Acil durum erişimi" }, "premiumSignUpTwoStepOptions": { "message": "YubiKey ve Duo gibi marka bazlı iki aşamalı giriş seçenekleri." @@ -1115,6 +1112,9 @@ "premiumCurrentMemberThanks": { "message": "Bitwarden'ı desteklediğiniz için teşekkür ederiz." }, + "premiumFeatures": { + "message": "Upgrade to premium and receive:" + }, "premiumPrice": { "message": "Bunların hepsi sadece yılda $PRICE$!", "placeholders": { @@ -1124,6 +1124,15 @@ } } }, + "premiumPriceV2": { + "message": "Bunların hepsi yılda sadece $PRICE$!", + "placeholders": { + "price": { + "content": "$1", + "example": "$10" + } + } + }, "refreshComplete": { "message": "Yenileme tamamlandı" }, @@ -1843,14 +1852,14 @@ "message": "Bu kullanıcı adını kullan" }, "securePasswordGenerated": { - "message": "Secure password generated! Don't forget to also update your password on the website." + "message": "Güvenli parola üretildi. Web sitesindeki parolanızı da güncellemeyi unutmayın." }, "useGeneratorHelpTextPartOne": { - "message": "Use the generator", + "message": "Güçlü ve benzersiz bir parola üretmek için", "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": "üreteci kullanabilirsiniz", "description": "This will be used as part of a larger sentence, broken up to include the generator icon. The full sentence will read 'Use the generator [GENERATOR_ICON] to create a strong unique password'" }, "vaultTimeoutAction": { @@ -3311,7 +3320,7 @@ "message": "Error connecting with the Duo service. Use a different two-step login method or contact Duo for assistance." }, "launchDuoAndFollowStepsToFinishLoggingIn": { - "message": "Duo'yu başlatın ve oturum açmayı tamamlamak için adımları izleyin." + "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." @@ -3323,7 +3332,7 @@ "message": "Uzantıyı dışarı al" }, "launchDuo": { - "message": "Duo'yu başlat" + "message": "Duo'yu aç" }, "importFormatError": { "message": "Veriler doğru biçimlendirilmemiş. Lütfen içe aktarma dosyanızı kontrol edin ve tekrar deneyin." @@ -3557,7 +3566,7 @@ "message": "konum" }, "useDeviceOrHardwareKey": { - "message": "Cihazınızı veya donanımsal anahtarınızı kullanın" + "message": "Cihazımı veya anahtar donanımımı kullanacağım" }, "justOnce": { "message": "Yalnızca bir defa" @@ -3960,6 +3969,12 @@ "autoFillOnPageLoad": { "message": "Sayfa yüklendiğinde otomatik doldur" }, + "cardExpiredTitle": { + "message": "Kartın süresi dolmuş" + }, + "cardExpiredMessage": { + "message": "Kartı yenilediyseniz kart bilgilerini güncelleyin" + }, "cardDetails": { "message": "Kart bilgileri" }, @@ -3972,6 +3987,9 @@ } } }, + "enableAnimations": { + "message": "Animasyonları etkinleştir" + }, "addAccount": { "message": "Hesap ekle" }, diff --git a/apps/browser/src/_locales/uk/messages.json b/apps/browser/src/_locales/uk/messages.json index b351a39bfa..de2f5d1853 100644 --- a/apps/browser/src/_locales/uk/messages.json +++ b/apps/browser/src/_locales/uk/messages.json @@ -25,9 +25,6 @@ "finishCreatingYourAccountBySettingAPassword": { "message": "Завершіть створення облікового запису, встановивши пароль" }, - "login": { - "message": "Увійти" - }, "enterpriseSingleSignOn": { "message": "Єдиний корпоративний вхід (SSO)" }, @@ -1083,7 +1080,7 @@ "message": "1 ГБ зашифрованого сховища для файлів." }, "premiumSignUpEmergency": { - "message": "Екстрений доступ" + "message": "Екстрений доступ." }, "premiumSignUpTwoStepOptions": { "message": "Додаткові можливості двоетапної авторизації, як-от YubiKey та Duo." @@ -1115,6 +1112,9 @@ "premiumCurrentMemberThanks": { "message": "Дякуємо за підтримку Bitwarden." }, + "premiumFeatures": { + "message": "Передплатіть преміум та отримайте:" + }, "premiumPrice": { "message": "Всього лише $PRICE$ / за рік!", "placeholders": { @@ -1124,6 +1124,15 @@ } } }, + "premiumPriceV2": { + "message": "Усе лише за $PRICE$ на рік!", + "placeholders": { + "price": { + "content": "$1", + "example": "$10" + } + } + }, "refreshComplete": { "message": "Оновлення завершено" }, @@ -3960,6 +3969,12 @@ "autoFillOnPageLoad": { "message": "Автоматично заповнювати під час завантаження сторінки?" }, + "cardExpiredTitle": { + "message": "Протермінована картка" + }, + "cardExpiredMessage": { + "message": "Якщо ви її поновили, оновіть інформацію" + }, "cardDetails": { "message": "Подробиці картки" }, @@ -3972,6 +3987,9 @@ } } }, + "enableAnimations": { + "message": "Увімкнути анімацію" + }, "addAccount": { "message": "Додати обліковий запис" }, diff --git a/apps/browser/src/_locales/vi/messages.json b/apps/browser/src/_locales/vi/messages.json index d61e8941ee..eb1ac1037d 100644 --- a/apps/browser/src/_locales/vi/messages.json +++ b/apps/browser/src/_locales/vi/messages.json @@ -25,9 +25,6 @@ "finishCreatingYourAccountBySettingAPassword": { "message": "Hoàn thành việc tạo tài khoản của bạn bằng cách đặt mật khẩu" }, - "login": { - "message": "Đăng nhập" - }, "enterpriseSingleSignOn": { "message": "Đăng nhập bằng tài khoản tổ chức" }, @@ -234,11 +231,11 @@ "message": "Bạn có thể thay đổi mật khẩu chính của mình trên Bitwarden bản web." }, "fingerprintPhrase": { - "message": "Fingerprint Phrase", + "message": "Cụm vân tay", "description": "A 'fingerprint phrase' is a unique word phrase (similar to a passphrase) that a user can use to authenticate their public key with another user, for the purposes of sharing." }, "yourAccountsFingerprint": { - "message": "Cụm từ mật khẩu của tài khoản của bạn", + "message": "Cụm vân tay của tài khoản của bạn", "description": "A 'fingerprint phrase' is a unique word phrase (similar to a passphrase) that a user can use to authenticate their public key with another user, for the purposes of sharing." }, "twoStepLogin": { @@ -545,7 +542,7 @@ "message": "Mật khẩu chính không hợp lệ" }, "vaultTimeout": { - "message": "Thời gian chờ của kho lưu trữ" + "message": "Thời gian chờ của kho" }, "lockNow": { "message": "Khóa ngay" @@ -937,7 +934,7 @@ "message": "Xuất từ" }, "exportVault": { - "message": "Xuất kho lưu trữ" + "message": "Xuất kho" }, "fileFormat": { "message": "Định dạng tập tin" @@ -971,7 +968,7 @@ "description": "WARNING (should stay in capitalized letters if the language permits)" }, "confirmVaultExport": { - "message": "Xác nhận xuất kho lưu trữ" + "message": "Xác nhận xuất kho" }, "exportWarningDesc": { "message": "Bản xuất này chứa dữ liệu kho bạn và không được mã hóa. Bạn không nên lưu trữ hay gửi tập tin đã xuất thông qua phương thức rủi ro (như email). Vui lòng xóa nó ngay lập tức khi bạn đã sử dụng xong." @@ -983,7 +980,7 @@ "message": "Khóa mã hóa tài khoản là duy nhất cho mỗi tài khoản Bitwarden, vì vậy bạn không thể nhập tệp xuất được mã hóa vào một tài khoản khác." }, "exportMasterPassword": { - "message": "Nhập mật khẩu chính để xuất kho lưu trữ của bạn." + "message": "Nhập mật khẩu chính để xuất kho của bạn." }, "shared": { "message": "Đã chia sẻ" @@ -1083,7 +1080,7 @@ "message": "1GB bộ nhớ lưu trữ được mã hóa cho các tệp đính kèm." }, "premiumSignUpEmergency": { - "message": "Emergency access" + "message": "Emergency access." }, "premiumSignUpTwoStepOptions": { "message": "Các tùy chọn xác minh hai bước như YubiKey và Duo." @@ -1115,6 +1112,9 @@ "premiumCurrentMemberThanks": { "message": "Cảm ơn bạn vì đã hỗ trợ Bitwarden." }, + "premiumFeatures": { + "message": "Upgrade to premium and receive:" + }, "premiumPrice": { "message": "Tất cả chỉ với $PRICE$/năm!", "placeholders": { @@ -1124,6 +1124,15 @@ } } }, + "premiumPriceV2": { + "message": "All for just $PRICE$ per year!", + "placeholders": { + "price": { + "content": "$1", + "example": "$10" + } + } + }, "refreshComplete": { "message": "Làm mới hoàn tất" }, @@ -1382,7 +1391,7 @@ "message": "Tạo và sao chép một mật khẩu ngẫu nhiên mới vào khay nhớ tạm" }, "commandLockVaultDesc": { - "message": "Khoá kho lưu trữ" + "message": "Khoá kho" }, "customFields": { "message": "Trường tùy chỉnh" @@ -1438,7 +1447,7 @@ "message": "Hiển thị biểu tượng bộ đếm" }, "badgeCounterDesc": { - "message": "Cho biết bạn có bao nhiêu lần đăng nhập cho trang web hiện tại." + "message": "Cho biết bạn có bao nhiêu thông tin đăng nhập cho trang web hiện tại." }, "cardholderName": { "message": "Tên chủ thẻ" @@ -1450,7 +1459,7 @@ "message": "Thương hiệu" }, "expirationMonth": { - "message": "Tháng Hết Hạn" + "message": "Tháng hết hạn" }, "expirationYear": { "message": "Năm hết hạn" @@ -1886,7 +1895,7 @@ "message": "Bạn đã có tài khoản?" }, "vaultTimeoutLogOutConfirmation": { - "message": "Việc đăng xuất sẽ loại bỏ tất cả truy cập vào kho lưu trữ của bạn và yêu cầu xác minh trực tuyến sau khi hết giai đoạn thời gian chờ. Bạn có chắc chắn muốn dùng cài đặt này không?" + "message": "Đăng xuất sẽ xóa tất cả quyền truy cập vào kho của bạn và yêu cầu xác minh trực tuyến sau khi hết thời gian chờ. Bạn có chắc chắn muốn sử dụng cài đặt này không?" }, "vaultTimeoutLogOutConfirmationTitle": { "message": "Xác nhận hành động khi hết thời gian chờ" @@ -1976,16 +1985,16 @@ "message": "Mật khẩu chính bạn chọn không đáp ứng yêu cầu." }, "receiveMarketingEmailsV2": { - "message": "Nhận lời khuyên, thông báo và cơ hội nghiên cứu từ Bitwarden trong hộp thư đến của bạn." + "message": "Nhận đề xuất, thông báo và cơ hội nghiên cứu từ Bitwarden trong hộp thư đến của bạn." }, "unsubscribe": { - "message": "Huỷ đăng ký" + "message": "Hủy đăng ký" }, "atAnyTime": { "message": "bất cứ lúc nào." }, "byContinuingYouAgreeToThe": { - "message": "Bằng cách tiếp tục, bạn đồng ý" + "message": "Nếu tiếp tục, bạn đồng ý" }, "and": { "message": "và" @@ -2018,7 +2027,7 @@ "message": "Xác minh đồng bộ máy tính" }, "desktopIntegrationVerificationText": { - "message": "Vui lòng xác minh rằng ứng dụng trên máy tính thấy vân tay này:" + "message": "Vui lòng xác minh ứng dụng trên máy tính hiển thị cụm vân tay này: " }, "desktopIntegrationDisabledTitle": { "message": "Tích hợp trình duyệt chưa được kích hoạt" @@ -2478,7 +2487,7 @@ "message": "Thời gian mở kho vượt quá giới hạn do tổ chức của bạn đặt ra." }, "vaultExportDisabled": { - "message": "Xuất kho lưu trữ không có sẵn" + "message": "Xuất kho không có sẵn" }, "personalVaultExportPolicyInEffect": { "message": "Các chính sách của tổ chức ngăn cản bạn xuất kho lưu trữ cá nhân của mình." @@ -2490,7 +2499,7 @@ "message": "Không tìm thấy danh tính duy nhất." }, "convertOrganizationEncryptionDesc": { - "message": "$ORGANIZATION$ hiện đang dùng SSO với khoá máy chủ tự lưu trữ. Từ giờ không cần mật khẩu chính để đăng nhập vào tổ chức này nữa.", + "message": "$ORGANIZATION$ đang sử dụng SSO với khóa máy chủ tự lưu trữ. Mật khẩu chính không còn cần để đăng nhập cho các thành viên của tổ chức này.", "placeholders": { "organization": { "content": "$1", @@ -2768,7 +2777,7 @@ "message": "Đang đăng nhập với tên" }, "notYou": { - "message": "Không phải bạn sao?" + "message": "Không phải bạn?" }, "newAroundHere": { "message": "Bạn mới tới đây sao?" @@ -2783,10 +2792,10 @@ "message": "Đăng nhập bằng thiết bị phải được thiết lập trong cài đặt của ứng dụng Bitwarden. Dùng cách khác?" }, "fingerprintPhraseHeader": { - "message": "Cụm từ dấu vân tay" + "message": "Cụm vân tay" }, "fingerprintMatchInfo": { - "message": "Vui lòng đảm bảo rằng bạn đã mở khoá kho và cụm từ mật khẩu khớp trên thiết bị khác." + "message": "Vui lòng đảm bảo rằng bạn đã mở khoá kho và cụm vân tay khớp trên thiết bị khác." }, "resendNotification": { "message": "Gửi lại thông báo" @@ -3611,7 +3620,7 @@ "description": "Dialog message facilitating the ability to override a chrome browser's default autofill behavior" }, "overrideDefaultBrowserAutoFillSettings": { - "message": "Đặt Bitwarden làm trình quản lý mật khẩu mặc định của bạn", + "message": "Bitwarden làm trình quản lý mật khẩu mặc định", "description": "Label for the setting that allows overriding the default browser autofill settings" }, "privacyPermissionAdditionNotGrantedTitle": { @@ -3960,6 +3969,12 @@ "autoFillOnPageLoad": { "message": "Autofill on page load?" }, + "cardExpiredTitle": { + "message": "Expired card" + }, + "cardExpiredMessage": { + "message": "If you've renewed it, update the card's information" + }, "cardDetails": { "message": "Thông tin thẻ" }, @@ -3972,6 +3987,9 @@ } } }, + "enableAnimations": { + "message": "Enable animations" + }, "addAccount": { "message": "Thêm tài khoản" }, diff --git a/apps/browser/src/_locales/zh_CN/messages.json b/apps/browser/src/_locales/zh_CN/messages.json index 5ae7d2cd2d..c2ed27b25a 100644 --- a/apps/browser/src/_locales/zh_CN/messages.json +++ b/apps/browser/src/_locales/zh_CN/messages.json @@ -25,9 +25,6 @@ "finishCreatingYourAccountBySettingAPassword": { "message": "设置密码以完成账户的创建" }, - "login": { - "message": "登录" - }, "enterpriseSingleSignOn": { "message": "企业单点登录" }, @@ -1083,7 +1080,7 @@ "message": "1 GB 文件附件加密存储。" }, "premiumSignUpEmergency": { - "message": "Emergency access" + "message": "紧急访问。" }, "premiumSignUpTwoStepOptions": { "message": "专有的两步登录选项,如 YubiKey 和 Duo。" @@ -1098,7 +1095,7 @@ "message": "优先客户支持。" }, "ppremiumSignUpFuture": { - "message": "未来会增加更多高级功能。敬请期待!" + "message": "未来的更多高级功能。敬请期待!" }, "premiumPurchase": { "message": "购买高级版" @@ -1107,7 +1104,7 @@ "message": "您可以在 bitwarden.com 网页版密码库购买高级会员。现在要访问吗?" }, "premiumPurchaseAlertV2": { - "message": "You can purchase Premium from your account settings on the Bitwarden web app." + "message": "您可以在 Bitwarden 网页 App 的账户设置中购买高级版。" }, "premiumCurrentMember": { "message": "您目前是高级会员!" @@ -1115,8 +1112,20 @@ "premiumCurrentMemberThanks": { "message": "感谢您支持 Bitwarden。" }, + "premiumFeatures": { + "message": "升级到高级版并接收:" + }, "premiumPrice": { - "message": "只需 $PRICE$ /年!", + "message": "全部仅需 $PRICE$ /年!", + "placeholders": { + "price": { + "content": "$1", + "example": "$10" + } + } + }, + "premiumPriceV2": { + "message": "全部仅需 $PRICE$ 每年!", "placeholders": { "price": { "content": "$1", @@ -2305,11 +2314,11 @@ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "createdSendSuccessfully": { - "message": "Send created successfully!", + "message": "Send 创建成功!", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendAvailability": { - "message": "The Send will be available to anyone with the link for the next $DAYS$ days.", + "message": "在接下来的 $DAYS$ 天内,任何拥有链接的人都可以访问此 Send。", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated.", "placeholders": { "days": { @@ -2319,7 +2328,7 @@ } }, "sendLinkCopied": { - "message": "Send link copied", + "message": "Send 链接已复制", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "editedSend": { @@ -3960,6 +3969,12 @@ "autoFillOnPageLoad": { "message": "页面加载时自动填充吗?" }, + "cardExpiredTitle": { + "message": "过期的支付卡" + }, + "cardExpiredMessage": { + "message": "如果您的支付卡已续期,请更新该卡的信息。" + }, "cardDetails": { "message": "支付卡详情" }, @@ -3972,6 +3987,9 @@ } } }, + "enableAnimations": { + "message": "启用动画" + }, "addAccount": { "message": "添加账户" }, diff --git a/apps/browser/src/_locales/zh_TW/messages.json b/apps/browser/src/_locales/zh_TW/messages.json index 945b712eef..470fd45d2d 100644 --- a/apps/browser/src/_locales/zh_TW/messages.json +++ b/apps/browser/src/_locales/zh_TW/messages.json @@ -25,9 +25,6 @@ "finishCreatingYourAccountBySettingAPassword": { "message": "Finish creating your account by setting a password" }, - "login": { - "message": "登入" - }, "enterpriseSingleSignOn": { "message": "企業單一登入" }, @@ -1083,7 +1080,7 @@ "message": "用於檔案附件的 1 GB 加密儲存空間。" }, "premiumSignUpEmergency": { - "message": "Emergency access" + "message": "Emergency access." }, "premiumSignUpTwoStepOptions": { "message": "專有的兩步驟登入選項,例如 YubiKey 和 Duo。" @@ -1115,6 +1112,9 @@ "premiumCurrentMemberThanks": { "message": "感謝您支持 Bitwarden 。" }, + "premiumFeatures": { + "message": "Upgrade to premium and receive:" + }, "premiumPrice": { "message": "每年只需 $PRICE$!", "placeholders": { @@ -1124,6 +1124,15 @@ } } }, + "premiumPriceV2": { + "message": "All for just $PRICE$ per year!", + "placeholders": { + "price": { + "content": "$1", + "example": "$10" + } + } + }, "refreshComplete": { "message": "狀態更新完成" }, @@ -3960,6 +3969,12 @@ "autoFillOnPageLoad": { "message": "Autofill on page load?" }, + "cardExpiredTitle": { + "message": "Expired card" + }, + "cardExpiredMessage": { + "message": "If you've renewed it, update the card's information" + }, "cardDetails": { "message": "Card details" }, @@ -3972,6 +3987,9 @@ } } }, + "enableAnimations": { + "message": "Enable animations" + }, "addAccount": { "message": "Add account" }, diff --git a/apps/browser/src/autofill/background/abstractions/overlay.background.ts b/apps/browser/src/autofill/background/abstractions/overlay.background.ts index 950f3b8e27..5d2d2a3898 100644 --- a/apps/browser/src/autofill/background/abstractions/overlay.background.ts +++ b/apps/browser/src/autofill/background/abstractions/overlay.background.ts @@ -40,6 +40,7 @@ export type FocusedFieldData = { frameId?: number; accountCreationFieldType?: string; showInlineMenuAccountCreation?: boolean; + showPasskeys?: boolean; }; export type InlineMenuElementPosition = { @@ -211,6 +212,7 @@ export type OverlayBackgroundExtensionMessageHandlers = { }: BackgroundOnMessageHandlerParams) => void; collectPageDetailsResponse: ({ message, sender }: BackgroundOnMessageHandlerParams) => void; unlockCompleted: ({ message }: BackgroundMessageParam) => void; + doFullSync: () => void; addedCipher: () => void; addEditCipherSubmitted: () => void; editedCipher: () => void; diff --git a/apps/browser/src/autofill/background/overlay.background.spec.ts b/apps/browser/src/autofill/background/overlay.background.spec.ts index b2ad7128b6..5ac94582ce 100644 --- a/apps/browser/src/autofill/background/overlay.background.spec.ts +++ b/apps/browser/src/autofill/background/overlay.background.spec.ts @@ -717,7 +717,7 @@ describe("OverlayBackground", () => { localData: { lastUsedDate: 222 }, name: "name-1", type: CipherType.Login, - login: { username: "username-1", uri: url }, + login: { username: "username-1", password: "password", uri: url }, }); const cardCipher = mock({ id: "id-2", @@ -752,6 +752,7 @@ describe("OverlayBackground", () => { type: CipherType.Login, login: { username: "username-5", + password: "password", uri: url, fido2Credentials: [ mock({ @@ -1116,6 +1117,7 @@ describe("OverlayBackground", () => { overlayBackground["focusedFieldData"] = createFocusedFieldDataMock({ tabId: tab.id, filledByCipherType: CipherType.Login, + showPasskeys: true, }); cipherService.getAllDecryptedForUrl.mockResolvedValue([loginCipher1, passkeyCipher]); cipherService.sortCiphersByLastUsedThenName.mockReturnValue(-1); @@ -2517,6 +2519,7 @@ describe("OverlayBackground", () => { describe("extension messages that trigger an update of the inline menu ciphers", () => { const extensionMessages = [ + "doFullSync", "addedCipher", "addEditCipherSubmitted", "editedCipher", diff --git a/apps/browser/src/autofill/background/overlay.background.ts b/apps/browser/src/autofill/background/overlay.background.ts index 6e7db21a6d..a209523dc7 100644 --- a/apps/browser/src/autofill/background/overlay.background.ts +++ b/apps/browser/src/autofill/background/overlay.background.ts @@ -139,6 +139,7 @@ export class OverlayBackground implements OverlayBackgroundInterface { this.triggerDestroyInlineMenuListeners(sender.tab, message.subFrameData.frameId), collectPageDetailsResponse: ({ message, sender }) => this.storePageDetails(message, sender), unlockCompleted: ({ message }) => this.unlockCompleted(message), + doFullSync: () => this.updateOverlayCiphers(true), addedCipher: () => this.updateOverlayCiphers(), addEditCipherSubmitted: () => this.updateOverlayCiphers(), editedCipher: () => this.updateOverlayCiphers(), @@ -455,18 +456,27 @@ export class OverlayBackground implements OverlayBackgroundInterface { continue; } - if (this.showCipherAsPasskey(cipher, domainExclusionsSet)) { - passkeyCipherData.push( - this.buildCipherData({ - inlineMenuCipherId, - cipher, - showFavicons, - hasPasskey: true, - }), + if (!this.showCipherAsPasskey(cipher, domainExclusionsSet)) { + inlineMenuCipherData.push( + this.buildCipherData({ inlineMenuCipherId, cipher, showFavicons }), ); + continue; } - inlineMenuCipherData.push(this.buildCipherData({ inlineMenuCipherId, cipher, showFavicons })); + passkeyCipherData.push( + this.buildCipherData({ + inlineMenuCipherId, + cipher, + showFavicons, + hasPasskey: true, + }), + ); + + if (cipher.login?.password && cipher.login.username) { + inlineMenuCipherData.push( + this.buildCipherData({ inlineMenuCipherId, cipher, showFavicons }), + ); + } } if (passkeyCipherData.length) { @@ -485,7 +495,7 @@ export class OverlayBackground implements OverlayBackgroundInterface { * @param domainExclusions - The domain exclusions to check against */ private showCipherAsPasskey(cipher: CipherView, domainExclusions: Set | null): boolean { - if (cipher.type !== CipherType.Login) { + if (cipher.type !== CipherType.Login || !this.focusedFieldData?.showPasskeys) { return false; } diff --git a/apps/browser/src/autofill/fido2/services/browser-fido2-user-interface.service.ts b/apps/browser/src/autofill/fido2/services/browser-fido2-user-interface.service.ts index f373494d52..1e5e880c67 100644 --- a/apps/browser/src/autofill/fido2/services/browser-fido2-user-interface.service.ts +++ b/apps/browser/src/autofill/fido2/services/browser-fido2-user-interface.service.ts @@ -241,7 +241,16 @@ export class BrowserFido2UserInterfaceSession implements Fido2UserInterfaceSessi async pickCredential({ cipherIds, userVerification, + assumeUserPresence, }: PickCredentialParams): Promise<{ cipherId: string; userVerified: boolean }> { + // NOTE: For now, we are defaulting to a userVerified status of `true` when the request + // is for a conditionally mediated authentication. This will allow for mediated conditional + // authentication to function without requiring user interaction. This is a product + // decision, rather than a decision based on the expected technical specifications. + if (assumeUserPresence && cipherIds.length === 1) { + return { cipherId: cipherIds[0], userVerified: userVerification }; + } + const data: BrowserFido2Message = { type: BrowserFido2MessageTypes.PickCredentialRequest, cipherIds, diff --git a/apps/browser/src/autofill/models/autofill-field.ts b/apps/browser/src/autofill/models/autofill-field.ts index 5a95b92899..0701ef5f65 100644 --- a/apps/browser/src/autofill/models/autofill-field.ts +++ b/apps/browser/src/autofill/models/autofill-field.ts @@ -115,5 +115,7 @@ export default class AutofillField { showInlineMenuAccountCreation?: boolean; + showPasskeys?: boolean; + fieldQualifier?: AutofillFieldQualifierType; } diff --git a/apps/browser/src/autofill/popup/settings/autofill.component.ts b/apps/browser/src/autofill/popup/settings/autofill.component.ts index dc6a4a0880..a03a37a5d0 100644 --- a/apps/browser/src/autofill/popup/settings/autofill.component.ts +++ b/apps/browser/src/autofill/popup/settings/autofill.component.ts @@ -78,8 +78,8 @@ export class AutofillComponent implements OnInit { * Default values set here are used in component state operations * until corresponding stored settings have loaded on init. */ - protected canOverrideBrowserAutofillSetting = false; - protected defaultBrowserAutofillDisabled = false; + protected canOverrideBrowserAutofillSetting: boolean = false; + protected defaultBrowserAutofillDisabled: boolean = false; protected inlineMenuVisibility: InlineMenuVisibilitySetting = AutofillOverlayVisibility.OnFieldFocus; protected browserClientVendor: BrowserClientVendor = BrowserClientVendors.Unknown; @@ -90,21 +90,21 @@ export class AutofillComponent implements OnInit { protected autofillOnPageLoadFromPolicy$ = this.autofillSettingsService.activateAutofillOnPageLoadFromPolicy$; - enableAutofillOnPageLoad = false; - enableInlineMenu = false; - enableInlineMenuOnIconSelect = false; - autofillOnPageLoadDefault = false; + enableAutofillOnPageLoad: boolean = false; + enableInlineMenu: boolean = false; + enableInlineMenuOnIconSelect: boolean = false; + autofillOnPageLoadDefault: boolean = false; autofillOnPageLoadOptions: { name: string; value: boolean }[]; - enableContextMenuItem = false; - enableAutoTotpCopy = false; + enableContextMenuItem: boolean = false; + enableAutoTotpCopy: boolean = false; clearClipboard: ClearClipboardDelaySetting; clearClipboardOptions: { name: string; value: ClearClipboardDelaySetting }[]; defaultUriMatch: UriMatchStrategySetting = UriMatchStrategy.Domain; uriMatchOptions: { name: string; value: UriMatchStrategySetting }[]; - showCardsCurrentTab = true; - showIdentitiesCurrentTab = true; + showCardsCurrentTab: boolean = true; + showIdentitiesCurrentTab: boolean = true; autofillKeyboardHelperText: string; - accountSwitcherEnabled = false; + accountSwitcherEnabled: boolean = false; constructor( private i18nService: I18nService, diff --git a/apps/browser/src/autofill/popup/settings/excluded-domains.component.html b/apps/browser/src/autofill/popup/settings/excluded-domains.component.html index d3c76a653e..62d8bc5997 100644 --- a/apps/browser/src/autofill/popup/settings/excluded-domains.component.html +++ b/apps/browser/src/autofill/popup/settings/excluded-domains.component.html @@ -27,6 +27,7 @@ }} >; + accountSwitcherEnabled = false; dataIsPristine = true; excludedDomainsState: string[] = []; @@ -63,6 +65,8 @@ export class ExcludedDomainsComponent implements OnInit, OnDestroy { // How many fields should be non-editable before editable fields fieldsEditThreshold: number = 0; + private destroy$ = new Subject(); + constructor( private domainSettingsService: DomainSettingsService, private i18nService: I18nService, @@ -84,10 +88,22 @@ export class ExcludedDomainsComponent implements OnInit, OnDestroy { // Do not allow the first x (pre-existing) fields to be edited this.fieldsEditThreshold = this.storedExcludedDomains.length; + + this.uriInputElements.changes.pipe(takeUntil(this.destroy$)).subscribe(({ last }) => { + this.focusNewUriInput(last); + }); } ngOnDestroy() { this.broadcasterService.unsubscribe(BroadcasterSubscriptionId); + this.destroy$.next(); + this.destroy$.complete(); + } + + focusNewUriInput(elementRef: ElementRef) { + if (elementRef?.nativeElement) { + elementRef.nativeElement.focus(); + } } async addNewDomain() { diff --git a/apps/browser/src/autofill/services/autofill-overlay-content.service.ts b/apps/browser/src/autofill/services/autofill-overlay-content.service.ts index 5b641e46c1..d0d1a79e29 100644 --- a/apps/browser/src/autofill/services/autofill-overlay-content.service.ts +++ b/apps/browser/src/autofill/services/autofill-overlay-content.service.ts @@ -792,6 +792,7 @@ export class AutofillOverlayContentService implements AutofillOverlayContentServ focusedFieldRects: { width, height, top, left }, filledByCipherType: autofillFieldData?.filledByCipherType, showInlineMenuAccountCreation: autofillFieldData?.showInlineMenuAccountCreation, + showPasskeys: !!autofillFieldData?.showPasskeys, accountCreationFieldType, }; @@ -874,6 +875,7 @@ export class AutofillOverlayContentService implements AutofillOverlayContentServ this.inlineMenuFieldQualificationService.isFieldForLoginForm(autofillFieldData, pageDetails) ) { autofillFieldData.filledByCipherType = CipherType.Login; + autofillFieldData.showPasskeys = autofillFieldData.autoCompleteType.includes("webauthn"); return false; } diff --git a/apps/browser/src/platform/popup/layout/popup-page.component.html b/apps/browser/src/platform/popup/layout/popup-page.component.html index cef86a3849..8a7bedf088 100644 --- a/apps/browser/src/platform/popup/layout/popup-page.component.html +++ b/apps/browser/src/platform/popup/layout/popup-page.component.html @@ -17,7 +17,8 @@ [ngClass]="{ 'tw-invisible': loading }" >
diff --git a/apps/browser/src/platform/popup/layout/popup-page.component.ts b/apps/browser/src/platform/popup/layout/popup-page.component.ts index 50db3e370f..7b4665040f 100644 --- a/apps/browser/src/platform/popup/layout/popup-page.component.ts +++ b/apps/browser/src/platform/popup/layout/popup-page.component.ts @@ -1,5 +1,5 @@ import { CommonModule } from "@angular/common"; -import { Component, Input, inject, signal } from "@angular/core"; +import { booleanAttribute, Component, inject, Input, signal } from "@angular/core"; import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; @@ -17,6 +17,9 @@ export class PopupPageComponent { @Input() loading = false; + @Input({ transform: booleanAttribute }) + disablePadding = false; + protected scrolled = signal(false); isScrolled = this.scrolled.asReadonly(); diff --git a/apps/browser/src/popup/app.component.ts b/apps/browser/src/popup/app.component.ts index 7ac3e02160..27fc868a9b 100644 --- a/apps/browser/src/popup/app.component.ts +++ b/apps/browser/src/popup/app.component.ts @@ -6,6 +6,7 @@ import { LogoutReason } from "@bitwarden/auth/common"; import { AccountService } from "@bitwarden/common/auth/abstractions/account.service"; import { AuthService } from "@bitwarden/common/auth/abstractions/auth.service"; import { AuthenticationStatus } from "@bitwarden/common/auth/enums/authentication-status"; +import { AnimationControlService } from "@bitwarden/common/platform/abstractions/animation-control.service"; import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; import { PlatformUtilsService } from "@bitwarden/common/platform/abstractions/platform-utils.service"; import { StateService } from "@bitwarden/common/platform/abstractions/state.service"; @@ -39,6 +40,7 @@ export class AppComponent implements OnInit, OnDestroy { private lastActivity: Date; private activeUserId: UserId; private recordActivitySubject = new Subject(); + private routerAnimations = false; private destroy$ = new Subject(); @@ -57,6 +59,7 @@ export class AppComponent implements OnInit, OnDestroy { private messageListener: MessageListener, private toastService: ToastService, private accountService: AccountService, + private animationControlService: AnimationControlService, ) {} async ngOnInit() { @@ -173,6 +176,12 @@ export class AppComponent implements OnInit, OnDestroy { } } }); + + this.animationControlService.enableRoutingAnimation$ + .pipe(takeUntil(this.destroy$)) + .subscribe((state) => { + this.routerAnimations = state; + }); } ngOnDestroy(): void { @@ -181,7 +190,9 @@ export class AppComponent implements OnInit, OnDestroy { } getState(outlet: RouterOutlet) { - if (outlet.activatedRouteData.state === "ciphers") { + if (!this.routerAnimations) { + return; + } else if (outlet.activatedRouteData.state === "ciphers") { const routeDirection = (window as any).routeDirection != null ? (window as any).routeDirection : ""; return ( diff --git a/apps/browser/src/popup/services/services.module.ts b/apps/browser/src/popup/services/services.module.ts index f6f3bf732b..7c5e49e741 100644 --- a/apps/browser/src/popup/services/services.module.ts +++ b/apps/browser/src/popup/services/services.module.ts @@ -41,6 +41,10 @@ import { } from "@bitwarden/common/autofill/services/user-notification-settings.service"; import { BillingAccountProfileStateService } from "@bitwarden/common/billing/abstractions/account/billing-account-profile-state.service"; import { ClientType } from "@bitwarden/common/enums"; +import { + AnimationControlService, + DefaultAnimationControlService, +} from "@bitwarden/common/platform/abstractions/animation-control.service"; import { ConfigService } from "@bitwarden/common/platform/abstractions/config/config.service"; import { CryptoFunctionService } from "@bitwarden/common/platform/abstractions/crypto-function.service"; import { CryptoService } from "@bitwarden/common/platform/abstractions/crypto.service"; @@ -527,6 +531,11 @@ const safeProviders: SafeProvider[] = [ useClass: Fido2UserVerificationService, deps: [PasswordRepromptService, UserVerificationService, DialogService], }), + safeProvider({ + provide: AnimationControlService, + useClass: DefaultAnimationControlService, + deps: [GlobalStateProvider], + }), safeProvider({ provide: TaskSchedulerService, useExisting: ForegroundTaskSchedulerService, diff --git a/apps/browser/src/vault/popup/components/vault-v2/item-more-options/item-more-options.component.ts b/apps/browser/src/vault/popup/components/vault-v2/item-more-options/item-more-options.component.ts index 161a68043f..2bc3fcea2f 100644 --- a/apps/browser/src/vault/popup/components/vault-v2/item-more-options/item-more-options.component.ts +++ b/apps/browser/src/vault/popup/components/vault-v2/item-more-options/item-more-options.component.ts @@ -79,7 +79,7 @@ export class ItemMoreOptionsComponent { } async doAutofillAndSave() { - await this.vaultPopupAutofillService.doAutofillAndSave(this.cipher); + await this.vaultPopupAutofillService.doAutofillAndSave(this.cipher, false); } /** diff --git a/apps/browser/src/vault/popup/components/vault-v2/vault-list-items-container/vault-list-items-container.component.html b/apps/browser/src/vault/popup/components/vault-v2/vault-list-items-container/vault-list-items-container.component.html index 6ac793e4d4..e24723d583 100644 --- a/apps/browser/src/vault/popup/components/vault-v2/vault-list-items-container/vault-list-items-container.component.html +++ b/apps/browser/src/vault/popup/components/vault-v2/vault-list-items-container/vault-list-items-container.component.html @@ -17,47 +17,50 @@ {{ description }} - - - - {{ cipher.name }} - - - {{ cipher.subTitle }} - - - - - - - - - + + + + + {{ cipher.name }} + + + {{ cipher.subTitle }} + + + + + + + + + + diff --git a/apps/browser/src/vault/popup/components/vault-v2/vault-list-items-container/vault-list-items-container.component.ts b/apps/browser/src/vault/popup/components/vault-v2/vault-list-items-container/vault-list-items-container.component.ts index 0f5287af34..615d37cb60 100644 --- a/apps/browser/src/vault/popup/components/vault-v2/vault-list-items-container/vault-list-items-container.component.ts +++ b/apps/browser/src/vault/popup/components/vault-v2/vault-list-items-container/vault-list-items-container.component.ts @@ -1,3 +1,4 @@ +import { ScrollingModule } from "@angular/cdk/scrolling"; import { CommonModule } from "@angular/common"; import { booleanAttribute, Component, EventEmitter, Input, Output } from "@angular/core"; import { Router, RouterLink } from "@angular/router"; @@ -6,6 +7,8 @@ import { JslibModule } from "@bitwarden/angular/jslib.module"; import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; import { BadgeModule, + BitItemHeight, + BitItemHeightClass, ButtonModule, IconButtonModule, ItemModule, @@ -35,12 +38,16 @@ import { ItemMoreOptionsComponent } from "../item-more-options/item-more-options ItemCopyActionsComponent, ItemMoreOptionsComponent, OrgIconDirective, + ScrollingModule, ], selector: "app-vault-list-items-container", templateUrl: "vault-list-items-container.component.html", standalone: true, }) export class VaultListItemsContainerComponent { + protected ItemHeightClass = BitItemHeightClass; + protected ItemHeight = BitItemHeight; + /** * The list of ciphers to display. */ diff --git a/apps/browser/src/vault/popup/components/vault-v2/view-v2/view-v2.component.spec.ts b/apps/browser/src/vault/popup/components/vault-v2/view-v2/view-v2.component.spec.ts index 9943046b1c..9851b16aa4 100644 --- a/apps/browser/src/vault/popup/components/vault-v2/view-v2/view-v2.component.spec.ts +++ b/apps/browser/src/vault/popup/components/vault-v2/view-v2/view-v2.component.spec.ts @@ -16,6 +16,7 @@ import { CipherType } from "@bitwarden/common/vault/enums"; import { PopupRouterCacheService } from "../../../../../platform/popup/view-cache/popup-router-cache.service"; +import { VaultPopupAutofillService } from "./../../../services/vault-popup-autofill.service"; import { ViewV2Component } from "./view-v2.component"; // 'qrcode-parser' is used by `BrowserTotpCaptureService` but is an es6 module that jest can't compile. @@ -34,6 +35,9 @@ describe("ViewV2Component", () => { type: CipherType.Login, }; + const mockVaultPopupAutofillService = { + doAutofill: jest.fn(), + }; const mockUserId = Utils.newGuid() as UserId; const accountService: FakeAccountService = mockAccountServiceWith(mockUserId); @@ -66,6 +70,7 @@ describe("ViewV2Component", () => { }, }, }, + { provide: VaultPopupAutofillService, useValue: mockVaultPopupAutofillService }, { provide: AccountService, useValue: accountService, diff --git a/apps/browser/src/vault/popup/components/vault-v2/view-v2/view-v2.component.ts b/apps/browser/src/vault/popup/components/vault-v2/view-v2/view-v2.component.ts index 9b8403cd31..dbdf7287dd 100644 --- a/apps/browser/src/vault/popup/components/vault-v2/view-v2/view-v2.component.ts +++ b/apps/browser/src/vault/popup/components/vault-v2/view-v2/view-v2.component.ts @@ -8,6 +8,7 @@ import { firstValueFrom, map, Observable, switchMap } from "rxjs"; import { JslibModule } from "@bitwarden/angular/jslib.module"; import { Organization } from "@bitwarden/common/admin-console/models/domain/organization"; import { AccountService } from "@bitwarden/common/auth/abstractions/account.service"; +import { AUTOFILL_ID, SHOW_AUTOFILL_BUTTON } from "@bitwarden/common/autofill/constants"; import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; import { LogService } from "@bitwarden/common/platform/abstractions/log.service"; import { CipherService } from "@bitwarden/common/vault/abstractions/cipher.service"; @@ -32,6 +33,7 @@ import { BrowserTotpCaptureService } from "../../../services/browser-totp-captur import { PopupFooterComponent } from "./../../../../../platform/popup/layout/popup-footer.component"; import { PopupHeaderComponent } from "./../../../../../platform/popup/layout/popup-header.component"; import { PopupPageComponent } from "./../../../../../platform/popup/layout/popup-page.component"; +import { VaultPopupAutofillService } from "./../../../services/vault-popup-autofill.service"; @Component({ selector: "app-view-v2", @@ -59,6 +61,7 @@ export class ViewV2Component { organization$: Observable; folder$: Observable; collections$: Observable; + loadAction: typeof AUTOFILL_ID | typeof SHOW_AUTOFILL_BUTTON; constructor( private route: ActivatedRoute, @@ -68,6 +71,7 @@ export class ViewV2Component { private dialogService: DialogService, private logService: LogService, private toastService: ToastService, + private vaultPopupAutofillService: VaultPopupAutofillService, private accountService: AccountService, ) { this.subscribeToParams(); @@ -77,14 +81,19 @@ export class ViewV2Component { this.route.queryParams .pipe( switchMap(async (params): Promise => { + this.loadAction = params.action; return await this.getCipherData(params.cipherId); }), + switchMap(async (cipher) => { + this.cipher = cipher; + this.headerText = this.setHeader(cipher.type); + if (this.loadAction === AUTOFILL_ID || this.loadAction === SHOW_AUTOFILL_BUTTON) { + await this.vaultPopupAutofillService.doAutofill(this.cipher); + } + }), takeUntilDestroyed(), ) - .subscribe((cipher) => { - this.cipher = cipher; - this.headerText = this.setHeader(cipher.type); - }); + .subscribe(); } setHeader(type: CipherType) { diff --git a/apps/browser/src/vault/popup/components/vault/vault-v2.component.html b/apps/browser/src/vault/popup/components/vault/vault-v2.component.html index 3279d28e93..e402e13143 100644 --- a/apps/browser/src/vault/popup/components/vault/vault-v2.component.html +++ b/apps/browser/src/vault/popup/components/vault/vault-v2.component.html @@ -1,4 +1,4 @@ - + @@ -54,7 +54,7 @@ - +
- +
diff --git a/apps/browser/src/vault/popup/components/vault/vault-v2.component.ts b/apps/browser/src/vault/popup/components/vault/vault-v2.component.ts index a2b778984d..c088626487 100644 --- a/apps/browser/src/vault/popup/components/vault/vault-v2.component.ts +++ b/apps/browser/src/vault/popup/components/vault/vault-v2.component.ts @@ -1,3 +1,4 @@ +import { ScrollingModule } from "@angular/cdk/scrolling"; import { CommonModule } from "@angular/common"; import { Component, OnDestroy, OnInit } from "@angular/core"; import { takeUntilDestroyed } from "@angular/core/rxjs-interop"; @@ -51,6 +52,7 @@ enum VaultState { RouterLink, VaultV2SearchComponent, NewItemDropdownV2Component, + ScrollingModule, ], providers: [VaultUiOnboardingService], }) diff --git a/apps/browser/src/vault/popup/services/vault-popup-autofill.service.spec.ts b/apps/browser/src/vault/popup/services/vault-popup-autofill.service.spec.ts index 2df52e6b55..effadad07f 100644 --- a/apps/browser/src/vault/popup/services/vault-popup-autofill.service.spec.ts +++ b/apps/browser/src/vault/popup/services/vault-popup-autofill.service.spec.ts @@ -1,6 +1,7 @@ import { TestBed } from "@angular/core/testing"; +import { ActivatedRoute } from "@angular/router"; import { mock } from "jest-mock-extended"; -import { BehaviorSubject } from "rxjs"; +import { BehaviorSubject, of } from "rxjs"; import { AccountService } from "@bitwarden/common/auth/abstractions/account.service"; import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; @@ -33,6 +34,9 @@ describe("VaultPopupAutofillService", () => { let service: VaultPopupAutofillService; const mockCurrentTab = { url: "https://example.com" } as chrome.tabs.Tab; + const mockActivatedRoute = { + queryParams: of({}), + } as any; // Create mocks for VaultPopupAutofillService const mockAutofillService = mock(); @@ -61,6 +65,7 @@ describe("VaultPopupAutofillService", () => { { provide: PasswordRepromptService, useValue: mockPasswordRepromptService }, { provide: CipherService, useValue: mockCipherService }, { provide: MessagingService, useValue: mockMessagingService }, + { provide: ActivatedRoute, useValue: mockActivatedRoute }, { provide: AccountService, useValue: accountService, @@ -258,6 +263,17 @@ describe("VaultPopupAutofillService", () => { expect(setTimeout).toHaveBeenCalledTimes(1); expect(BrowserApi.closePopup).toHaveBeenCalled(); }); + + it("should show a successful toast message if login form is populated", async () => { + jest.spyOn(BrowserPopupUtils, "inSingleActionPopout").mockReturnValue(true); + (service as any).currentAutofillTab$ = of({ id: 1234 }); + await service.doAutofill(mockCipher); + expect(mockToastService.showToast).toHaveBeenCalledWith({ + variant: "success", + title: null, + message: mockI18nService.t("autoFillSuccess"), + }); + }); }); }); diff --git a/apps/browser/src/vault/popup/services/vault-popup-autofill.service.ts b/apps/browser/src/vault/popup/services/vault-popup-autofill.service.ts index 66a432efe6..a2e032a54f 100644 --- a/apps/browser/src/vault/popup/services/vault-popup-autofill.service.ts +++ b/apps/browser/src/vault/popup/services/vault-popup-autofill.service.ts @@ -1,5 +1,7 @@ import { Injectable } from "@angular/core"; +import { ActivatedRoute } from "@angular/router"; import { + combineLatest, firstValueFrom, map, Observable, @@ -27,20 +29,30 @@ import { } from "../../../autofill/services/abstractions/autofill.service"; import { BrowserApi } from "../../../platform/browser/browser-api"; import BrowserPopupUtils from "../../../platform/popup/browser-popup-utils"; +import { closeViewVaultItemPopout, VaultPopoutType } from "../utils/vault-popout-window"; @Injectable({ providedIn: "root", }) export class VaultPopupAutofillService { private _refreshCurrentTab$ = new Subject(); - + private senderTabId$: Observable = this.route.queryParams.pipe( + map((params) => (params?.senderTabId ? parseInt(params.senderTabId, 10) : undefined)), + ); /** - * Observable that contains the current tab to be considered for autofill. If there is no current tab - * or the popup is in a popout window, this will be null. + * Observable that contains the current tab to be considered for autofill. + * This can be the tab from the current window if opened in a Popup OR + * the sending tab when opened the single action Popout (specified by the senderTabId route query parameter) */ - currentAutofillTab$: Observable = this._refreshCurrentTab$.pipe( - startWith(null), - switchMap(async () => { + currentAutofillTab$: Observable = combineLatest([ + this.senderTabId$, + this._refreshCurrentTab$.pipe(startWith(null)), + ]).pipe( + switchMap(async ([senderTabId]) => { + if (senderTabId) { + return await BrowserApi.getTab(senderTabId); + } + if (BrowserPopupUtils.inPopout(window)) { return null; } @@ -73,6 +85,7 @@ export class VaultPopupAutofillService { private passwordRepromptService: PasswordRepromptService, private cipherService: CipherService, private messagingService: MessagingService, + private route: ActivatedRoute, private accountService: AccountService, ) { this._currentPageDetails$.subscribe(); @@ -124,7 +137,21 @@ export class VaultPopupAutofillService { return true; } - private _closePopup() { + private async _closePopup(cipher: CipherView, tab: chrome.tabs.Tab | null) { + if (BrowserPopupUtils.inSingleActionPopout(window, VaultPopoutType.viewVaultItem) && tab.id) { + this.toastService.showToast({ + variant: "success", + title: null, + message: this.i18nService.t("autoFillSuccess"), + }); + setTimeout(async () => { + await BrowserApi.focusTab(tab.id); + await closeViewVaultItemPopout(`${VaultPopoutType.viewVaultItem}_${cipher.id}`); + }, 1000); + + return; + } + if (!BrowserPopupUtils.inPopup(window)) { return; } @@ -158,7 +185,7 @@ export class VaultPopupAutofillService { const didAutofill = await this._internalDoAutofill(cipher, tab, pageDetails); if (didAutofill && closePopup) { - this._closePopup(); + await this._closePopup(cipher, tab); } return didAutofill; @@ -193,7 +220,7 @@ export class VaultPopupAutofillService { } if (closePopup) { - this._closePopup(); + await this._closePopup(cipher, tab); } else { this.toastService.showToast({ variant: "success", diff --git a/apps/browser/src/vault/popup/services/vault-popup-items.service.spec.ts b/apps/browser/src/vault/popup/services/vault-popup-items.service.spec.ts index 2ead93e512..03e37fb71c 100644 --- a/apps/browser/src/vault/popup/services/vault-popup-items.service.spec.ts +++ b/apps/browser/src/vault/popup/services/vault-popup-items.service.spec.ts @@ -30,6 +30,7 @@ describe("VaultPopupItemsService", () => { let mockOrg: Organization; let mockCollections: CollectionView[]; + let activeUserLastSync$: BehaviorSubject; const cipherServiceMock = mock(); const vaultSettingsServiceMock = mock(); @@ -92,7 +93,8 @@ describe("VaultPopupItemsService", () => { organizationServiceMock.organizations$ = new BehaviorSubject([mockOrg]); collectionService.decryptedCollections$ = new BehaviorSubject(mockCollections); - syncServiceMock.getLastSync.mockResolvedValue(new Date()); + activeUserLastSync$ = new BehaviorSubject(new Date()); + syncServiceMock.activeUserLastSync$.mockReturnValue(activeUserLastSync$); testBed = TestBed.configureTestingModule({ providers: [ @@ -161,7 +163,7 @@ describe("VaultPopupItemsService", () => { }); it("should not emit cipher list if syncService.getLastSync returns null", async () => { - syncServiceMock.getLastSync.mockResolvedValue(null); + activeUserLastSync$.next(null); const obs$ = service.autoFillCiphers$.pipe(timeout(50)); diff --git a/apps/browser/src/vault/popup/services/vault-popup-items.service.ts b/apps/browser/src/vault/popup/services/vault-popup-items.service.ts index e78e289c75..be5c908731 100644 --- a/apps/browser/src/vault/popup/services/vault-popup-items.service.ts +++ b/apps/browser/src/vault/popup/services/vault-popup-items.service.ts @@ -9,6 +9,7 @@ import { from, map, merge, + MonoTypeOperatorFunction, Observable, of, shareReplay, @@ -31,6 +32,7 @@ import { CipherType } from "@bitwarden/common/vault/enums"; import { CipherView } from "@bitwarden/common/vault/models/view/cipher.view"; import { runInsideAngular } from "../../../platform/browser/run-inside-angular.operator"; +import { waitUntil } from "../../util"; import { PopupCipherView } from "../views/popup-cipher.view"; import { VaultPopupAutofillService } from "./vault-popup-autofill.service"; @@ -80,8 +82,7 @@ export class VaultPopupItemsService { ).pipe( runInsideAngular(inject(NgZone)), // Workaround to ensure cipher$ state provider emissions are run inside Angular tap(() => this._ciphersLoading$.next()), - switchMap(() => Utils.asyncToObservable(() => this.syncService.getLastSync())), - filter((lastSync) => lastSync !== null), // Only attempt to load ciphers if we performed a sync + waitUntilSync(this.syncService), switchMap(() => Utils.asyncToObservable(() => this.cipherService.getAllDecrypted())), switchMap((ciphers) => combineLatest([ @@ -270,3 +271,11 @@ export class VaultPopupItemsService { return this.cipherService.sortCiphersByLastUsedThenName(a, b); } } + +/** + * Operator that waits until the active account has synced at least once before allowing the source to continue emission. + * @param syncService + */ +const waitUntilSync = (syncService: SyncService): MonoTypeOperatorFunction => { + return waitUntil(syncService.activeUserLastSync$().pipe(filter((lastSync) => lastSync != null))); +}; diff --git a/apps/browser/src/vault/popup/settings/appearance.component.html b/apps/browser/src/vault/popup/settings/appearance.component.html index 36b2190512..a431fc72a1 100644 --- a/apps/browser/src/vault/popup/settings/appearance.component.html +++ b/apps/browser/src/vault/popup/settings/appearance.component.html @@ -64,4 +64,17 @@ {{ accountSwitcherEnabled ? ("faviconDescAlt" | i18n) : ("faviconDesc" | i18n) }} +
+
+
+ + +
+
+
diff --git a/apps/browser/src/vault/popup/settings/appearance.component.ts b/apps/browser/src/vault/popup/settings/appearance.component.ts index 154d4e426d..1095b56a75 100644 --- a/apps/browser/src/vault/popup/settings/appearance.component.ts +++ b/apps/browser/src/vault/popup/settings/appearance.component.ts @@ -3,6 +3,7 @@ import { firstValueFrom } from "rxjs"; import { BadgeSettingsServiceAbstraction } from "@bitwarden/common/autofill/services/badge-settings.service"; import { DomainSettingsService } from "@bitwarden/common/autofill/services/domain-settings.service"; +import { AnimationControlService } from "@bitwarden/common/platform/abstractions/animation-control.service"; import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; import { MessagingService } from "@bitwarden/common/platform/abstractions/messaging.service"; import { ThemeType } from "@bitwarden/common/platform/enums"; @@ -20,6 +21,7 @@ export class AppearanceComponent implements OnInit { theme: ThemeType; themeOptions: any[]; accountSwitcherEnabled = false; + enableRoutingAnimation: boolean; constructor( private messagingService: MessagingService, @@ -27,6 +29,7 @@ export class AppearanceComponent implements OnInit { private badgeSettingsService: BadgeSettingsServiceAbstraction, i18nService: I18nService, private themeStateService: ThemeStateService, + private animationControlService: AnimationControlService, ) { this.themeOptions = [ { name: i18nService.t("default"), value: ThemeType.System }, @@ -40,6 +43,10 @@ export class AppearanceComponent implements OnInit { } async ngOnInit() { + this.enableRoutingAnimation = await firstValueFrom( + this.animationControlService.enableRoutingAnimation$, + ); + this.enableFavicon = await firstValueFrom(this.domainSettingsService.showFavicons$); this.enableBadgeCounter = await firstValueFrom(this.badgeSettingsService.enableBadgeCounter$); @@ -47,6 +54,10 @@ export class AppearanceComponent implements OnInit { this.theme = await firstValueFrom(this.themeStateService.selectedTheme$); } + async updateRoutingAnimation() { + await this.animationControlService.setEnableRoutingAnimation(this.enableRoutingAnimation); + } + async updateFavicon() { await this.domainSettingsService.setShowFavicons(this.enableFavicon); } diff --git a/apps/browser/src/vault/util.ts b/apps/browser/src/vault/util.ts new file mode 100644 index 0000000000..f410375aa4 --- /dev/null +++ b/apps/browser/src/vault/util.ts @@ -0,0 +1,30 @@ +import { + merge, + MonoTypeOperatorFunction, + Observable, + ObservableInput, + sample, + share, + skipUntil, + take, +} from "rxjs"; + +/** + * Operator that waits until the trigger observable emits before allowing the source to continue emission. + * @param trigger$ The observable that will trigger the source to continue emission. + * + * ``` + * source$ a-----b-----c-----d-----e + * trigger$ ---------------X--------- + * output$ ---------------c--d-----e + * ``` + */ +export const waitUntil = (trigger$: ObservableInput): MonoTypeOperatorFunction => { + return (source: Observable) => { + const sharedSource$ = source.pipe(share()); + return merge( + sharedSource$.pipe(sample(trigger$), take(1)), + sharedSource$.pipe(skipUntil(trigger$)), + ); + }; +}; diff --git a/apps/browser/store/locales/fi/copy.resx b/apps/browser/store/locales/fi/copy.resx index 076a724bdf..3056b71f87 100644 --- a/apps/browser/store/locales/fi/copy.resx +++ b/apps/browser/store/locales/fi/copy.resx @@ -121,7 +121,7 @@ Bitwarden Salasanahallinta - Kotona, töissä tai reissussa, Bitwarden suojaa helposti salasanasi, suojausavaimesi ja arkaluonteiset tietosi. + Kotona, töissä tai reissussa, Bitwarden suojaa salasanasi, pääsyavaimesi ja arkaluonteiset tietosi helposti. Muun muassa PCMag, WIRED, The Verge, CNET sekä G2 ovat nimenneet Bitwardenin parhaaksi salasanahallinnaksi! @@ -147,10 +147,10 @@ Maailmanluoka salaus: Salasanat on suojattu edistyneellä päästä päähän salauksella (AES-256 bit, suolattu hajautus sekä PBKDF2 SHA-256), joten tietosi pysyvät turvassa ja yksityisinä. Riippumattomat auditoinnit -Bitwarden teetättää säännöllisesti tunnettujen tietoturvayritysten suorittamia kattavia riippumattomia tietoturva-arviointeja. Näissä vuotuisissa auditoinneissa arvioidaan lähdekoodia ja suoritetaan murtotestausta Bitwardenin IP-osoittelle, palvelimille ja verkkosovelluksille. +Bitwarden teetättää säännöllisesti kattavia riippumattomia tietoturva-arviointeja tunnettuilla tietoturvayrityksillä. Näissä vuotuisissa auditoinneissa arvioidaan lähdekoodia ja suoritetaan murtotestausta Bitwardenin IP-osoitteille, palvelimille ja verkkosovelluksille. Edistynyt kaksivaiheinen tunnistautuminen -Suojaa kirjautumistietosi riippumattomalla todennussovelluksella, sähköpostikoodeilla tai FIDO2 WEBAuthn -standardin mukaisilla fyysisillä tai ohjelmallisilla suojausavaimilla. +Suojaa kirjautumistietosi riippumattomalla todennussovelluksella, sähköpostikoodeilla, tai FIDO2 WEBAuthn -standardin mukaisilla tunnistustavoilla kuten fyysisillä suojausavaimilla tai pääsyavaimilla. Bitwarden Send Välitä tietoja muille suoraan, päästä päähän salausta menettämättä ja rajoitaen niiden näkyvyyttä. @@ -169,7 +169,7 @@ Bitwardenin päästä päähän salatut käyttäjätietojen hallintaratkaisut ta - Kotona, töissä tai reissussa, Bitwarden suojaa helposti salasanasi, suojausavaimesi ja arkaluonteiset tietosi. + Kotona, töissä tai reissussa, Bitwarden suojaa salasanasi, pääsyavaimesi ja arkaluonteiset tietosi helposti. Synkronoi ja hallitse holviasi useilla laitteilla diff --git a/apps/desktop/desktop_native/napi/index.d.ts b/apps/desktop/desktop_native/napi/index.d.ts index dc3cc7ec0b..deaf6b8e57 100644 --- a/apps/desktop/desktop_native/napi/index.d.ts +++ b/apps/desktop/desktop_native/napi/index.d.ts @@ -47,7 +47,6 @@ export namespace processisolations { export function isCoreDumpingDisabled(): Promise export function disableMemoryAccess(): Promise } - export namespace powermonitors { export function onLock(callback: (err: Error | null, ) => any): Promise export function isLockMonitorAvailable(): Promise diff --git a/apps/desktop/electron-builder.json b/apps/desktop/electron-builder.json index 15139a9929..aded8cc391 100644 --- a/apps/desktop/electron-builder.json +++ b/apps/desktop/electron-builder.json @@ -234,7 +234,7 @@ "autoStart": true, "base": "core22", "confinement": "strict", - "plugs": ["default", "password-manager-service"], + "plugs": ["default", "network", "network-bind", "password-manager-service"], "stagePackages": ["default"] }, "protocols": [ diff --git a/apps/desktop/package.json b/apps/desktop/package.json index 977a00b04d..0056673a5a 100644 --- a/apps/desktop/package.json +++ b/apps/desktop/package.json @@ -1,7 +1,7 @@ { "name": "@bitwarden/desktop", "description": "A secure and free password manager for all of your devices.", - "version": "2024.8.0", + "version": "2024.8.1", "keywords": [ "bitwarden", "password", diff --git a/apps/desktop/src/app/app.component.ts b/apps/desktop/src/app/app.component.ts index a311ed2b86..089eb1c027 100644 --- a/apps/desktop/src/app/app.component.ts +++ b/apps/desktop/src/app/app.component.ts @@ -300,13 +300,19 @@ export class AppComponent implements OnInit, OnDestroy { this.systemService.clearClipboard(message.clipboardValue, message.clearMs); } break; - case "ssoCallback": + case "ssoCallback": { + const queryParams = { + code: message.code, + state: message.state, + redirectUri: message.redirectUri ?? "bitwarden://sso-callback", + }; // 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(["sso"], { - queryParams: { code: message.code, state: message.state }, + queryParams: queryParams, }); break; + } case "premiumRequired": { const premiumConfirmed = await this.dialogService.openSimpleDialog({ title: { key: "premiumRequired" }, @@ -455,6 +461,9 @@ export class AppComponent implements OnInit, OnDestroy { case "deepLink": this.processDeepLink(message.urlString); break; + case "launchUri": + this.platformUtilsService.launchUri(message.url); + break; } }); }); diff --git a/apps/desktop/src/app/tools/import/import-desktop.component.html b/apps/desktop/src/app/tools/import/import-desktop.component.html index 9fe2ee47c2..2bb715b5a4 100644 --- a/apps/desktop/src/app/tools/import/import-desktop.component.html +++ b/apps/desktop/src/app/tools/import/import-desktop.component.html @@ -1,4 +1,4 @@ - + {{ "importData" | i18n }} { + this.logService.info("Reloading render process"); // User might have changed theme, ensure the window is updated. this.win.setBackgroundColor(await this.getBackgroundColor()); @@ -65,6 +66,7 @@ export class WindowMain { // 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.session.clearCache(); + this.logService.info("Render process reloaded"); }); return new Promise((resolve, reject) => { diff --git a/apps/desktop/src/package-lock.json b/apps/desktop/src/package-lock.json index 59cbea3910..ba7b14a054 100644 --- a/apps/desktop/src/package-lock.json +++ b/apps/desktop/src/package-lock.json @@ -1,12 +1,12 @@ { "name": "@bitwarden/desktop", - "version": "2024.8.0", + "version": "2024.8.1", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@bitwarden/desktop", - "version": "2024.8.0", + "version": "2024.8.1", "license": "GPL-3.0", "dependencies": { "@bitwarden/desktop-napi": "file:../desktop_native", diff --git a/apps/desktop/src/package.json b/apps/desktop/src/package.json index bed3b631da..2987d5ec74 100644 --- a/apps/desktop/src/package.json +++ b/apps/desktop/src/package.json @@ -2,7 +2,7 @@ "name": "@bitwarden/desktop", "productName": "Bitwarden", "description": "A secure and free password manager for all of your devices.", - "version": "2024.8.0", + "version": "2024.8.1", "author": "Bitwarden Inc. (https://bitwarden.com)", "homepage": "https://bitwarden.com", "license": "GPL-3.0", diff --git a/apps/desktop/src/platform/preload.ts b/apps/desktop/src/platform/preload.ts index 163ef9ae22..c1c56c5522 100644 --- a/apps/desktop/src/platform/preload.ts +++ b/apps/desktop/src/platform/preload.ts @@ -11,7 +11,7 @@ import { UnencryptedMessageResponse, } from "../models/native-messaging"; import { BiometricMessage, BiometricAction } from "../types/biometric-message"; -import { isDev, isFlatpak, isMacAppStore, isSnapStore, isWindowsStore } from "../utils"; +import { isAppImage, isDev, isFlatpak, isMacAppStore, isSnapStore, isWindowsStore } from "../utils"; import { ClipboardWriteMessage } from "./types/clipboard"; @@ -119,6 +119,12 @@ const ephemeralStore = { ipcRenderer.invoke("deleteEphemeralValue", key), }; +const localhostCallbackService = { + openSsoPrompt: (codeChallenge: string, state: string): Promise => { + return ipcRenderer.invoke("openSsoPrompt", { codeChallenge, state }); + }, +}; + export default { versions: { app: (): Promise => ipcRenderer.invoke("appVersion"), @@ -129,6 +135,7 @@ export default { isWindowsStore: isWindowsStore(), isFlatpak: isFlatpak(), isSnapStore: isSnapStore(), + isAppImage: isAppImage(), reloadProcess: () => ipcRenderer.send("reload-process"), log: (level: LogLevelType, message?: any, ...optionalParams: any[]) => ipcRenderer.invoke("ipc.log", { level, message, optionalParams }), @@ -179,6 +186,7 @@ export default { nativeMessaging, crypto, ephemeralStore, + localhostCallbackService, }; function deviceType(): DeviceType { diff --git a/apps/desktop/src/platform/services/sso-localhost-callback.service.ts b/apps/desktop/src/platform/services/sso-localhost-callback.service.ts new file mode 100644 index 0000000000..5efe73e2ad --- /dev/null +++ b/apps/desktop/src/platform/services/sso-localhost-callback.service.ts @@ -0,0 +1,129 @@ +import * as http from "http"; + +import { ipcMain } from "electron"; +import { firstValueFrom } from "rxjs"; + +import { EnvironmentService } from "@bitwarden/common/platform/abstractions/environment.service"; +import { MessageSender } from "@bitwarden/common/platform/messaging"; + +/** + * The SSO Localhost login service uses a local host listener as fallback in case scheme handling deeplinks does not work. + * This way it is possible to log in with SSO on appimage, snap, and electron dev using the same methods that the cli uses. + */ +export class SSOLocalhostCallbackService { + private ssoRedirectUri = ""; + + constructor( + private environmentService: EnvironmentService, + private messagingService: MessageSender, + ) { + ipcMain.handle("openSsoPrompt", async (event, { codeChallenge, state }) => { + const { ssoCode } = await this.openSsoPrompt(codeChallenge, state); + this.messagingService.send("ssoCallback", { + code: ssoCode, + state: state, + redirectUri: this.ssoRedirectUri, + }); + }); + } + + private async openSsoPrompt( + codeChallenge: string, + state: string, + ): Promise<{ ssoCode: string; orgIdentifier: string }> { + const env = await firstValueFrom(this.environmentService.environment$); + + return new Promise((resolve, reject) => { + const callbackServer = http.createServer((req, res) => { + // after 5 minutes, close the server + setTimeout( + () => { + callbackServer.close(() => reject()); + }, + 5 * 60 * 1000, + ); + + const urlString = "http://localhost" + req.url; + const url = new URL(urlString); + const code = url.searchParams.get("code"); + const receivedState = url.searchParams.get("state"); + const orgIdentifier = this.getOrgIdentifierFromState(receivedState); + res.setHeader("Content-Type", "text/html"); + if (code != null && receivedState != null && this.checkState(receivedState, state)) { + res.writeHead(200); + res.end( + "Success | Bitwarden Desktop" + + "

Successfully authenticated with the Bitwarden desktop app

" + + "

You may now close this tab and return to the app.

" + + "", + ); + callbackServer.close(() => + resolve({ + ssoCode: code, + orgIdentifier: orgIdentifier, + }), + ); + } else { + res.writeHead(400); + res.end( + "Failed | Bitwarden Desktop" + + "

Something went wrong logging into the Bitwarden desktop app

" + + "

You may now close this tab and return to the app.

" + + "", + ); + callbackServer.close(() => reject()); + } + }); + let foundPort = false; + const webUrl = env.getWebVaultUrl(); + for (let port = 8065; port <= 8070; port++) { + try { + this.ssoRedirectUri = "http://localhost:" + port; + callbackServer.listen(port, () => { + this.messagingService.send("launchUri", { + url: + webUrl + + "/#/sso?clientId=" + + "desktop" + + "&redirectUri=" + + encodeURIComponent(this.ssoRedirectUri) + + "&state=" + + state + + "&codeChallenge=" + + codeChallenge, + }); + }); + foundPort = true; + break; + } catch { + // Ignore error since we run the same command up to 5 times. + } + } + if (!foundPort) { + reject(); + } + }); + } + + private getOrgIdentifierFromState(state: string): string { + if (state === null || state === undefined) { + return null; + } + + const stateSplit = state.split("_identifier="); + return stateSplit.length > 1 ? stateSplit[1] : null; + } + + private checkState(state: string, checkState: string): boolean { + if (state === null || state === undefined) { + return false; + } + if (checkState === null || checkState === undefined) { + return false; + } + + const stateSplit = state.split("_identifier="); + const checkStateSplit = checkState.split("_identifier="); + return stateSplit[0] === checkStateSplit[0]; + } +} diff --git a/apps/web/src/app/auth/settings/account/profile.component.ts b/apps/web/src/app/auth/settings/account/profile.component.ts index fa111c9fa6..a960adfe5d 100644 --- a/apps/web/src/app/auth/settings/account/profile.component.ts +++ b/apps/web/src/app/auth/settings/account/profile.component.ts @@ -62,10 +62,7 @@ export class ProfileComponent implements OnInit, OnDestroy { } submit = async () => { - const request = new UpdateProfileRequest( - this.formGroup.get("name").value, - this.profile.masterPasswordHint, - ); + const request = new UpdateProfileRequest(this.formGroup.get("name").value); await this.apiService.putProfile(request); this.platformUtilsService.showToast("success", null, this.i18nService.t("accountUpdated")); }; diff --git a/apps/web/src/app/auth/settings/change-password.component.html b/apps/web/src/app/auth/settings/change-password.component.html index 7c3c22b3d7..b5c8677405 100644 --- a/apps/web/src/app/auth/settings/change-password.component.html +++ b/apps/web/src/app/auth/settings/change-password.component.html @@ -111,7 +111,7 @@
- +

{{ "upgradePlan" | i18n }}

-
+
{{ "selectAPlan" | i18n }} - - + {{ + "upgradeDiscount" + | i18n + : (this.discountPercentageFromSub > 0 + ? discountPercentageFromSub + : this.discountPercentage) + }} - - - {{ planInterval.name }} {{ - "upgradeDiscount" - | i18n - : (this.discountPercentageFromSub > 0 - ? discountPercentageFromSub - : this.discountPercentage) - }} + - - + + {{ planInterval.name }} + + +
+
-
- {{ "selected" | i18n }} -
-

- {{ selectableProduct.nameLocalizationKey | i18n }} +

+ {{ + selectableProduct.nameLocalizationKey | i18n + }} + + {{ "current" | i18n }}

+

+ {{ "bitwardenPasswordManager" | i18n }} +

{{ "upgradeEnterpriseMessage" | i18n }}

-

{{ "includeAllTeamsFeatures" | i18n }}

-
    -
  • + +
      +
    • + {{ "includeEnterprisePolicies" | i18n }}
    • -
    • - {{ "includeSsoAuthenticationMessage" | i18n }} +
    • + + {{ "passwordLessSso" | i18n }} +
    • +
    • + + {{ "accountRecovery" | i18n }} +
    • +
    • + + {{ "customRoles" | i18n }} +
    • +
    + +

    + {{ "bitwardenSecretsManager" | i18n }} +

    +
      +
    • + + {{ "unlimitedSecretsStorage" | i18n }} +
    • +
    • + + {{ "unlimitedUsers" | i18n }} +
    • +
    • + + {{ "unlimitedProjects" | i18n }} +
    • +
    • + + {{ "UpTo50MachineAccounts" | i18n }}
    • -
    • {{ "optionalOnPremHosting" | i18n }}
    @@ -153,6 +186,12 @@
+

+ {{ "bitwardenPasswordManager" | i18n }} +

{{ "upgradeFamilyMessage" | i18n }}

-
    -
  • - {{ "limitedUsers" | i18n: selectableProduct.PasswordManager.maxSeats }} +
      +
    • + + {{ "premiumAccounts" | i18n }}
    • -
    • - {{ "teamsInviteMessage" | i18n }} +
    • + + {{ "unlimitedSharing" | i18n }}
    • -
    • - {{ - "chooseMonthlyOrAnnualBilling" - | i18n: selectableProduct.PasswordManager.maxCollections - }} +
    • + + {{ "unlimitedCollections" | i18n }}
    • -
    • - {{ "createUnlimitedCollections" | i18n }} +
    +
      +
    • + + {{ "secureDataSharing" | i18n }}
    • -
    • - {{ "accessToCreateGroups" | i18n }} +
    • + + {{ "eventLogMonitoring" | i18n }}
    • -
    • - {{ "syncGroupsAndUsersFromDirectory" | i18n }} +
    • + + {{ "directoryIntegration" | i18n }}
    • -
    • - {{ "accessToPremiumFeatures" | i18n }} +
    +

    + {{ "bitwardenSecretsManager" | i18n }} +

    +
      +
    • + + {{ "unlimitedSecretsStorage" | i18n }}
    • -
    • - {{ "priorityCustomerSupport" | i18n }} +
    • + + {{ "unlimitedProjects" | i18n }}
    • -
    • - {{ "optionalOnPremHosting" | i18n }} +
    • + + {{ "UpTo20MachineAccounts" | i18n }}
+
+ + {{ "secretsManagerSubInfo" | i18n }} + + + {{ "secretsManagerWithFreePasswordManagerInfo" | i18n }} + +
-

{{ "paymentMethod" | i18n }}

@@ -237,16 +322,327 @@ >

- -
+ +
+

+ {{ "passwordManager" | i18n }} +

+

+ + {{ passwordManagerSeats }} + {{ "members" | i18n }} × + {{ + (selectedPlan.isAnnual + ? selectedPlan.PasswordManager.basePrice / 12 + : selectedPlan.PasswordManager.basePrice + ) | currency: "$" + }} + /{{ "year" | i18n }} + + + + {{ + selectedPlan.PasswordManager.basePrice | currency: "$" + }} + {{ "freeWithSponsorship" | i18n }} + + + {{ selectedPlan.PasswordManager.basePrice | currency: "$" }} + + +

+

+ + {{ "additionalUsers" | i18n }}: + {{ passwordManagerSeats || 0 }}  + {{ "members" | i18n }} + × + {{ selectedPlan.PasswordManager.seatPrice | currency: "$" }} + /{{ "year" | i18n }} + + + + {{ passwordManagerSeatTotal(selectedPlan) | currency: "$" }} + +

+

+ + {{ 0 }} + {{ "additionalStorageGbMessage" | i18n }} + × + {{ selectedPlan.PasswordManager.additionalStoragePricePerGb | currency: "$" }} + /{{ "year" | i18n }} + + {{ 0 | currency: "$" }} +

+ +

+ {{ "secretsManager" | i18n }} +

+

+ + {{ sub?.smSeats }} + {{ "members" | i18n }} × + {{ + (selectedPlan.isAnnual + ? selectedPlan.SecretsManager.basePrice / 12 + : selectedPlan.SecretsManager.basePrice + ) | currency: "$" + }} + /{{ "year" | i18n }} + +

+

+ + {{ "additionalUsers" | i18n }}: + {{ sub?.smSeats || 0 }}  + {{ "members" | i18n }} + × + {{ selectedPlan.SecretsManager.seatPrice | currency: "$" }} + /{{ "year" | i18n }} + + + + {{ secretsManagerSeatTotal(selectedPlan, sub.smSeats) | currency: "$" }} + +

+

+ + {{ additionalServiceAccount }} + {{ "additionalStorageGbMessage" | i18n }} + × + {{ selectedPlan?.SecretsManager?.additionalPricePerServiceAccount | currency: "$" }} + /{{ "month" | i18n }} + + {{ additionalServiceAccountTotal(selectedPlan) | currency: "$" }} +

+
+ +

+ {{ "passwordManager" | i18n }} +

- {{ selectedPlan.PasswordManager.baseSeats }} + {{ "basePrice" | i18n }}: + {{ selectedPlan.PasswordManager.basePrice | currency: "$" }} + {{ "monthAbbr" | i18n }} + + + {{ selectedPlan.PasswordManager.basePrice | currency: "$" }} + +

+

+ + {{ "additionalUsers" | i18n }}: + {{ passwordManagerSeats }}  + {{ "members" | i18n }} + × + {{ selectedPlan.PasswordManager.seatPrice | currency: "$" }} + /{{ "month" | i18n }} + + + {{ passwordManagerSeatTotal(selectedPlan) | currency: "$" }} + +

+

+ + {{ 0 }} + {{ "additionalStorageGbMessage" | i18n }} + × + {{ selectedPlan.PasswordManager.additionalStoragePricePerGb | currency: "$" }} + /{{ "month" | i18n }} + + {{ 0 | currency: "$" }} +

+ +

+ {{ "secretsManager" | i18n }} +

+

+ + {{ "basePrice" | i18n }}: + {{ selectedPlan.SecretsManager.basePrice | currency: "$" }} + {{ "monthAbbr" | i18n }} + + + {{ selectedPlan.SecretsManager.basePrice | currency: "$" }} + +

+

+ + {{ "additionalUsers" | i18n }}: + {{ sub?.smSeats }}  + {{ "members" | i18n }} + × + {{ selectedPlan.SecretsManager.seatPrice | currency: "$" }} + /{{ "month" | i18n }} + + + {{ secretsManagerSeatTotal(selectedPlan, sub?.smSeats) | currency: "$" }} + +

+

+ + {{ additionalServiceAccount }} + {{ "additionalStorageGbMessage" | i18n }} + × + {{ selectedPlan.SecretsManager.additionalPricePerServiceAccount | currency: "$" }} + /{{ "month" | i18n }} + + {{ additionalServiceAccountTotal(selectedPlan) | currency: "$" }} +

+
+
+ +
+ + +

+ {{ "secretsManager" | i18n }} +

+

+ + {{ sub?.smSeats }} + {{ "members" | i18n }} × + {{ + (selectedPlan.isAnnual + ? selectedPlan.SecretsManager.basePrice / 12 + : selectedPlan.SecretsManager.basePrice + ) | currency: "$" + }} + /{{ "year" | i18n }} + +

+

+ + {{ "additionalUsers" | i18n }}: + {{ sub?.smSeats || 0 }}  + {{ "members" | i18n }} + × + {{ selectedPlan.SecretsManager.seatPrice | currency: "$" }} + /{{ "year" | i18n }} + + + + {{ secretsManagerSeatTotal(selectedPlan, sub.smSeats) | currency: "$" }} + +

+

+ + {{ additionalServiceAccount }} + {{ "additionalStorageGbMessage" | i18n }} + × + {{ selectedPlan.SecretsManager.additionalPricePerServiceAccount | currency: "$" }} + /{{ "month" | i18n }} + + {{ additionalServiceAccountTotal(selectedPlan) | currency: "$" }} +

+ +

+ {{ "passwordManager" | i18n }} +

+

+ + {{ organization.seats }} {{ "members" | i18n }} × {{ (selectedPlan.isAnnual @@ -284,26 +680,77 @@ /{{ "year" | i18n }} - + + {{ "freeForOneYear" | i18n }} + + + {{ passwordManagerSeatTotal(selectedPlan) | currency: "$" }}

+
+ + +

+ {{ "secretsManager" | i18n }} +

+

+ + {{ "basePrice" | i18n }}: + {{ selectedPlan.SecretsManager.basePrice | currency: "$" }} + {{ "monthAbbr" | i18n }} + + + {{ selectedPlan.SecretsManager.basePrice | currency: "$" }} + +

- {{ 0 }} + {{ "additionalUsers" | i18n }}: + {{ sub?.smSeats }}  + {{ "members" | i18n }} + × + {{ selectedPlan.SecretsManager.seatPrice | currency: "$" }} + /{{ "month" | i18n }} + + + {{ secretsManagerSeatTotal(selectedPlan, sub?.smSeats) | currency: "$" }} + +

+

+ + {{ additionalServiceAccount }} {{ "additionalStorageGbMessage" | i18n }} × - {{ selectedPlan.PasswordManager.additionalStoragePricePerGb | currency: "$" }} - /{{ "year" | i18n }} + {{ selectedPlan.SecretsManager.additionalPricePerServiceAccount | currency: "$" }} + /{{ "month" | i18n }} - {{ 0 | currency: "$" }} + {{ additionalServiceAccountTotal(selectedPlan) | currency: "$" }} +

+ +

+ {{ "passwordManager" | i18n }}

-
-

{{ "additionalUsers" | i18n }}: - {{ formGroup.controls["additionalSeats"].value || 0 }}  + {{ organization.seats }}  {{ "members" | i18n }} × {{ selectedPlan.PasswordManager.seatPrice | currency: "$" }} /{{ "month" | i18n }} - + + {{ "freeForOneYear" | i18n }} + + + {{ passwordManagerSeatTotal(selectedPlan) | currency: "$" }}

-

- - {{ 0 }} - {{ "additionalStorageGbMessage" | i18n }} - × - {{ selectedPlan.PasswordManager.additionalStoragePricePerGb | currency: "$" }} - /{{ "month" | i18n }} - - {{ 0 | currency: "$" }} -

-

diff --git a/libs/vault/src/cipher-view/login-credentials/login-credentials-view.component.html b/libs/vault/src/cipher-view/login-credentials/login-credentials-view.component.html index 6aeb58c985..10b0a1a07c 100644 --- a/libs/vault/src/cipher-view/login-credentials/login-credentials-view.component.html +++ b/libs/vault/src/cipher-view/login-credentials/login-credentials-view.component.html @@ -2,8 +2,8 @@

{{ "loginCredentials" | i18n }}

- - + + {{ "username" | i18n }} @@ -23,10 +23,10 @@ [valueLabel]="'username' | i18n" showToast [appA11yTitle]="'copyValue' | i18n" - data-testid="toggle-username" + data-testid="copy-username" > - + {{ "password" | i18n }} - +
- - +
+ + {{ "typePasskey" | i18n }} + + + {{ "verificationCodeTotp" | i18n }} =15.0.0 < 19.0.0", "@angular/platform-browser-dynamic": ">=15.0.0 < 19.0.0", "rxjs": "^6.0.0 || ^7.4.0", - "storybook": "^8.2.6", + "storybook": "^8.2.9", "typescript": "^4.0.0 || ^5.0.0", "zone.js": ">= 0.11.1 < 1.0.0" }, @@ -7366,19 +7380,21 @@ } }, "node_modules/@storybook/angular/node_modules/@types/node": { - "version": "18.19.42", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.42.tgz", - "integrity": "sha512-d2ZFc/3lnK2YCYhos8iaNIYu9Vfhr92nHiyJHRltXWjXUBjEE+A4I58Tdbnw4VhggSW+2j5y5gTrLs4biNnubg==", + "version": "18.19.44", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.44.tgz", + "integrity": "sha512-ZsbGerYg72WMXUIE9fYxtvfzLEuq6q8mKERdWFnqTmOvudMxnz+CBNRoOwJ2kNpFOncrKjT1hZwxjlFgQ9qvQA==", "dev": true, + "license": "MIT", "dependencies": { "undici-types": "~5.26.4" } }, "node_modules/@storybook/blocks": { - "version": "8.2.6", - "resolved": "https://registry.npmjs.org/@storybook/blocks/-/blocks-8.2.6.tgz", - "integrity": "sha512-nMlZJjVTyfOJ6xwORptsNuS1AZZlDbJUVXc2R8uukGd5GIXxxCdrPk4NvUsjfQslMT9LhYuFld3z62FATsM2rw==", + "version": "8.2.9", + "resolved": "https://registry.npmjs.org/@storybook/blocks/-/blocks-8.2.9.tgz", + "integrity": "sha512-5276q/s/UL8arwftuBXovUNHqYo/HPQFMGXEmjVVAMXUyFjzEAfKj3+xU897J6AuL+7XVZG32WnqA+X6LJMrcQ==", "dev": true, + "license": "MIT", "dependencies": { "@storybook/csf": "0.1.11", "@storybook/global": "^5.0.0", @@ -7402,7 +7418,7 @@ "peerDependencies": { "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta", "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta", - "storybook": "^8.2.6" + "storybook": "^8.2.9" }, "peerDependenciesMeta": { "react": { @@ -7414,12 +7430,13 @@ } }, "node_modules/@storybook/builder-webpack5": { - "version": "8.2.6", - "resolved": "https://registry.npmjs.org/@storybook/builder-webpack5/-/builder-webpack5-8.2.6.tgz", - "integrity": "sha512-ba25XOXifbAxUYprw5WWcrYq/2DJODFoOHdv7YZqzjKeDDbg1Us8F+72zlBCdr38wY4V9084Sd8EBVXV5bxzRQ==", + "version": "8.2.9", + "resolved": "https://registry.npmjs.org/@storybook/builder-webpack5/-/builder-webpack5-8.2.9.tgz", + "integrity": "sha512-D3oYk4LkteWZ3QLcdUTu/0rUvVNUp/bWwEKAycZDr2uFCOhv8VoS2/l/TaHjn3wpyWpVVKS6GgdP72K++YVufg==", "dev": true, + "license": "MIT", "dependencies": { - "@storybook/core-webpack": "8.2.6", + "@storybook/core-webpack": "8.2.9", "@types/node": "^18.0.0", "@types/semver": "^7.3.4", "browser-assert": "^1.2.1", @@ -7452,7 +7469,7 @@ "url": "https://opencollective.com/storybook" }, "peerDependencies": { - "storybook": "^8.2.6" + "storybook": "^8.2.9" }, "peerDependenciesMeta": { "typescript": { @@ -7479,15 +7496,16 @@ } }, "node_modules/@storybook/codemod": { - "version": "8.2.6", - "resolved": "https://registry.npmjs.org/@storybook/codemod/-/codemod-8.2.6.tgz", - "integrity": "sha512-+mFJ6R+JhJLpU7VPDlXU5Yn6nqIBq745GaEosnIiFOdNo3jaxJ58wq/sGhbQvoCHPUxMA+sDQvR7pS62YFoLRQ==", + "version": "8.2.9", + "resolved": "https://registry.npmjs.org/@storybook/codemod/-/codemod-8.2.9.tgz", + "integrity": "sha512-3yRx1lFMm1FXWVv+CKDiYM4gOQPEfpcZAQrjfcumxSDUrB091pnU1PeI92Prj3vCdi4+0oPNuN4yDGNUYTMP/A==", "dev": true, + "license": "MIT", "dependencies": { "@babel/core": "^7.24.4", "@babel/preset-env": "^7.24.4", "@babel/types": "^7.24.0", - "@storybook/core": "8.2.6", + "@storybook/core": "8.2.9", "@storybook/csf": "0.1.11", "@types/cross-spawn": "^6.0.2", "cross-spawn": "^7.0.3", @@ -7564,23 +7582,25 @@ } }, "node_modules/@storybook/components": { - "version": "8.2.6", - "resolved": "https://registry.npmjs.org/@storybook/components/-/components-8.2.6.tgz", - "integrity": "sha512-H8ckH1AnLkHtMtvJ3J8LxnmDtHxkJ7NJacGctHMRrsBIvdKTVwlT4su5nAVVJlan/PrEou+jESfw+OjjBYE5PA==", + "version": "8.2.9", + "resolved": "https://registry.npmjs.org/@storybook/components/-/components-8.2.9.tgz", + "integrity": "sha512-OkkcZ/f/6o3GdFEEK9ZHKIGHWUHmavZUYs5xaSgU64bOrA2aqEFtfeWWitZYTv3Euhk8MVLWfyEMDfez0AlvDg==", "dev": true, + "license": "MIT", "funding": { "type": "opencollective", "url": "https://opencollective.com/storybook" }, "peerDependencies": { - "storybook": "^8.2.6" + "storybook": "^8.2.9" } }, "node_modules/@storybook/core": { - "version": "8.2.6", - "resolved": "https://registry.npmjs.org/@storybook/core/-/core-8.2.6.tgz", - "integrity": "sha512-XY71g3AcpD6IiER9k9Lt+vlUMYfPIYgWekd7e0Ggzz2gJkPuLunKEdQccLGDSHf5OFAobHhrTJc7ZsvWhmDMag==", + "version": "8.2.9", + "resolved": "https://registry.npmjs.org/@storybook/core/-/core-8.2.9.tgz", + "integrity": "sha512-wSER8FpA6Il/jPyDfKm3yohxDtuhisNPTonMVzd3ulNWR4zERLddyO3HrHJJwdqYHLNk4SBFzwMGpQZVws1y0w==", "dev": true, + "license": "MIT", "dependencies": { "@storybook/csf": "0.1.11", "@types/express": "^4.17.21", @@ -7600,10 +7620,11 @@ } }, "node_modules/@storybook/core-webpack": { - "version": "8.2.6", - "resolved": "https://registry.npmjs.org/@storybook/core-webpack/-/core-webpack-8.2.6.tgz", - "integrity": "sha512-RSqRVNrxrp2pKoQeSmaiHMz7GvAzQ7BV+qPi9gDRDDCuAPrjpY8a17KyqmCJ617asDAb+OEQNBks802xM3pEQw==", + "version": "8.2.9", + "resolved": "https://registry.npmjs.org/@storybook/core-webpack/-/core-webpack-8.2.9.tgz", + "integrity": "sha512-6yL1su+d8IOTU+UkZqM9SeBcVc/G6vUHLsMdlWNyVtRus2JTMmT0K0/ll56jrm/ym0y98cxUOA1jsImkBubP2Q==", "dev": true, + "license": "MIT", "dependencies": { "@types/node": "^18.0.0", "ts-dedent": "^2.0.0" @@ -7613,23 +7634,25 @@ "url": "https://opencollective.com/storybook" }, "peerDependencies": { - "storybook": "^8.2.6" + "storybook": "^8.2.9" } }, "node_modules/@storybook/core-webpack/node_modules/@types/node": { - "version": "18.19.42", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.42.tgz", - "integrity": "sha512-d2ZFc/3lnK2YCYhos8iaNIYu9Vfhr92nHiyJHRltXWjXUBjEE+A4I58Tdbnw4VhggSW+2j5y5gTrLs4biNnubg==", + "version": "18.19.44", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.44.tgz", + "integrity": "sha512-ZsbGerYg72WMXUIE9fYxtvfzLEuq6q8mKERdWFnqTmOvudMxnz+CBNRoOwJ2kNpFOncrKjT1hZwxjlFgQ9qvQA==", "dev": true, + "license": "MIT", "dependencies": { "undici-types": "~5.26.4" } }, "node_modules/@storybook/core/node_modules/@types/node": { - "version": "18.19.42", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.42.tgz", - "integrity": "sha512-d2ZFc/3lnK2YCYhos8iaNIYu9Vfhr92nHiyJHRltXWjXUBjEE+A4I58Tdbnw4VhggSW+2j5y5gTrLs4biNnubg==", + "version": "18.19.44", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.44.tgz", + "integrity": "sha512-ZsbGerYg72WMXUIE9fYxtvfzLEuq6q8mKERdWFnqTmOvudMxnz+CBNRoOwJ2kNpFOncrKjT1hZwxjlFgQ9qvQA==", "dev": true, + "license": "MIT", "dependencies": { "undici-types": "~5.26.4" } @@ -7644,10 +7667,11 @@ } }, "node_modules/@storybook/csf-plugin": { - "version": "8.2.6", - "resolved": "https://registry.npmjs.org/@storybook/csf-plugin/-/csf-plugin-8.2.6.tgz", - "integrity": "sha512-USn7E/bMQYVqvFBuW6d9rKoSuCImjk0BAmc/0wIOuMQ/yQNp2Xze0m8eVkNHUIUDokyx0TXDjRjwq10Xxk16ag==", + "version": "8.2.9", + "resolved": "https://registry.npmjs.org/@storybook/csf-plugin/-/csf-plugin-8.2.9.tgz", + "integrity": "sha512-QQCFb3g12VQQEraDV1UfCmniGhQZKyT6oEt1Im6dzzPJj9NQk+6BjWoDep33CZhBHWoLryrMQd2fjuHxnFRNEA==", "dev": true, + "license": "MIT", "dependencies": { "unplugin": "^1.3.1" }, @@ -7656,7 +7680,7 @@ "url": "https://opencollective.com/storybook" }, "peerDependencies": { - "storybook": "^8.2.6" + "storybook": "^8.2.9" } }, "node_modules/@storybook/global": { @@ -7679,10 +7703,11 @@ } }, "node_modules/@storybook/instrumenter": { - "version": "8.2.6", - "resolved": "https://registry.npmjs.org/@storybook/instrumenter/-/instrumenter-8.2.6.tgz", - "integrity": "sha512-RxtpcMTUSq8/wPM6cR6EXVrPEiNuRbC71cIFVFZagOFYvnnOKwSPV+GOLPK0wxMbGB4c5/+Xe8ADefmZTvxOsA==", + "version": "8.2.9", + "resolved": "https://registry.npmjs.org/@storybook/instrumenter/-/instrumenter-8.2.9.tgz", + "integrity": "sha512-+DNjTbsMzlDggsvkhRuOy7aGvQJ4oLCPgunP5Se/3yBjG+M2bYDa0EmC5jC2nwZ3ffpuvbzaVe7fWf7R8W9F2Q==", "dev": true, + "license": "MIT", "dependencies": { "@storybook/global": "^5.0.0", "@vitest/utils": "^1.3.1", @@ -7693,40 +7718,43 @@ "url": "https://opencollective.com/storybook" }, "peerDependencies": { - "storybook": "^8.2.6" + "storybook": "^8.2.9" } }, "node_modules/@storybook/manager-api": { - "version": "8.2.6", - "resolved": "https://registry.npmjs.org/@storybook/manager-api/-/manager-api-8.2.6.tgz", - "integrity": "sha512-uv36h/b5RhlajWtEg4cVPBYV8gZs6juux0nIE+6G9i7vt8Ild6gM9tW1KNabgZcaHFiyWJYCNWxJZoKjgUmXDg==", + "version": "8.2.9", + "resolved": "https://registry.npmjs.org/@storybook/manager-api/-/manager-api-8.2.9.tgz", + "integrity": "sha512-mkYvUlfqDw+0WbxIynh5TcrotmoXlumEsOA4+45zuNea8XpEgj5cNBUCnmfEO6yQ85swqkS8YYbMpg1cZyu/Vw==", "dev": true, + "license": "MIT", "funding": { "type": "opencollective", "url": "https://opencollective.com/storybook" }, "peerDependencies": { - "storybook": "^8.2.6" + "storybook": "^8.2.9" } }, "node_modules/@storybook/preview-api": { - "version": "8.2.6", - "resolved": "https://registry.npmjs.org/@storybook/preview-api/-/preview-api-8.2.6.tgz", - "integrity": "sha512-5vTj2ndX5ng4nDntZYe+r8UwLjCIGFymhq5/r2adAvRKL+Bo4zQDWGO7bhvGJk16do2THb2JvPz49ComW9LLZw==", + "version": "8.2.9", + "resolved": "https://registry.npmjs.org/@storybook/preview-api/-/preview-api-8.2.9.tgz", + "integrity": "sha512-D8/t+a78OJqQAcT/ABa1C4YM/OaLGQ9IvCsp3Q9ruUqDCwuZBj8bG3D4477dlY4owX2ycC0rWYu3VvuK0EmJjA==", "dev": true, + "license": "MIT", "funding": { "type": "opencollective", "url": "https://opencollective.com/storybook" }, "peerDependencies": { - "storybook": "^8.2.6" + "storybook": "^8.2.9" } }, "node_modules/@storybook/react-dom-shim": { - "version": "8.2.6", - "resolved": "https://registry.npmjs.org/@storybook/react-dom-shim/-/react-dom-shim-8.2.6.tgz", - "integrity": "sha512-B+x8UAEQPDp1yhN3tMh09NvSL38QNfJB7PAyLgKrfE7xIAzvewq+RLW2DfGkoZCy+Zr7QSHm1p7NOgud8+sQCg==", + "version": "8.2.9", + "resolved": "https://registry.npmjs.org/@storybook/react-dom-shim/-/react-dom-shim-8.2.9.tgz", + "integrity": "sha512-uCAjSQEsNk8somVn1j/I1G9G/uUax5byHseIIV0Eq3gVXttGd7gaWcP+TDHtqIaenWHx4l+hCSuCesxiLWmx4Q==", "dev": true, + "license": "MIT", "funding": { "type": "opencollective", "url": "https://opencollective.com/storybook" @@ -7734,17 +7762,18 @@ "peerDependencies": { "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta", "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta", - "storybook": "^8.2.6" + "storybook": "^8.2.9" } }, "node_modules/@storybook/test": { - "version": "8.2.6", - "resolved": "https://registry.npmjs.org/@storybook/test/-/test-8.2.6.tgz", - "integrity": "sha512-nTzNxReBcMRlX1+8PNU/MuA9ArFbeQhfZXMBIwJJoHOhnNe1knYpyn1++xINxAHKOh0BBhQ0NIMoKdcGmW3V6w==", + "version": "8.2.9", + "resolved": "https://registry.npmjs.org/@storybook/test/-/test-8.2.9.tgz", + "integrity": "sha512-O5JZ5S8UVVR7V0ru5AiF/uRO+srAVwji0Iik7ihy8gw3V91WQNMmJh2KkdhG0R1enYeBsYZlipOm+AW7f/MmOA==", "dev": true, + "license": "MIT", "dependencies": { "@storybook/csf": "0.1.11", - "@storybook/instrumenter": "8.2.6", + "@storybook/instrumenter": "8.2.9", "@testing-library/dom": "10.1.0", "@testing-library/jest-dom": "6.4.5", "@testing-library/user-event": "14.5.2", @@ -7757,20 +7786,21 @@ "url": "https://opencollective.com/storybook" }, "peerDependencies": { - "storybook": "^8.2.6" + "storybook": "^8.2.9" } }, "node_modules/@storybook/theming": { - "version": "8.2.6", - "resolved": "https://registry.npmjs.org/@storybook/theming/-/theming-8.2.6.tgz", - "integrity": "sha512-ICnYuLIVsYifVCMQljdHgrp+5vAquNybHxDGWiPeOxBicotwHF8rLhTckD2CdVQbMp0jk6r6jetvjXbFJ2MbvQ==", + "version": "8.2.9", + "resolved": "https://registry.npmjs.org/@storybook/theming/-/theming-8.2.9.tgz", + "integrity": "sha512-OL0NFvowPX85N5zIYdgeKKaFm7V4Vgtci093vL3cDZT13LGH6GuEzJKkUFGuUGNPFlJc+EgTj0o6PYKrOLyQ6w==", "dev": true, + "license": "MIT", "funding": { "type": "opencollective", "url": "https://opencollective.com/storybook" }, "peerDependencies": { - "storybook": "^8.2.6" + "storybook": "^8.2.9" } }, "node_modules/@szmarczak/http-timer": { @@ -8073,10 +8103,11 @@ } }, "node_modules/@types/chrome": { - "version": "0.0.262", - "resolved": "https://registry.npmjs.org/@types/chrome/-/chrome-0.0.262.tgz", - "integrity": "sha512-TOoj3dqSYE13PD2fRuMQ6X6pggEvL9rRk/yOYOyWE6sfqRWxsJm4VoVm+wr9pkr4Sht/M5t7FFL4vXato8d1gA==", + "version": "0.0.270", + "resolved": "https://registry.npmjs.org/@types/chrome/-/chrome-0.0.270.tgz", + "integrity": "sha512-ADvkowV7YnJfycZZxL2brluZ6STGW+9oKG37B422UePf2PCXuFA/XdERI0T18wtuWPx0tmFeZqq6MOXVk1IC+Q==", "dev": true, + "license": "MIT", "dependencies": { "@types/filesystem": "*", "@types/har-format": "*" @@ -12644,18 +12675,19 @@ } }, "node_modules/chromatic": { - "version": "10.9.6", - "resolved": "https://registry.npmjs.org/chromatic/-/chromatic-10.9.6.tgz", - "integrity": "sha512-1MoT+/U+vQwEiq2GuehPyStbqhxqHmM1B9pdpVU1dKh26userQg1FyOFYifkTgy+9reo2w2p7sAbc0JRd2kzlA==", + "version": "11.7.1", + "resolved": "https://registry.npmjs.org/chromatic/-/chromatic-11.7.1.tgz", + "integrity": "sha512-LvgPimdQdnQB07ZDxLEC2KtxgYeqTw0X71GA7fi3zhgtKLxZcE+BSZ/5I9rrQp1V8ydmfElfw0ZwnUH4fVgUAQ==", "dev": true, + "license": "MIT", "bin": { "chroma": "dist/bin.js", "chromatic": "dist/bin.js", "chromatic-cli": "dist/bin.js" }, "peerDependencies": { - "@chromatic-com/cypress": "^0.5.2 || ^1.0.0", - "@chromatic-com/playwright": "^0.5.2 || ^1.0.0" + "@chromatic-com/cypress": "^0.*.* || ^1.0.0", + "@chromatic-com/playwright": "^0.*.* || ^1.0.0" }, "peerDependenciesMeta": { "@chromatic-com/cypress": { @@ -15609,6 +15641,7 @@ "resolved": "https://registry.npmjs.org/esbuild-register/-/esbuild-register-3.6.0.tgz", "integrity": "sha512-H2/S7Pm8a9CL1uhp9OvjwrBh5Pvx0H8qVOxNu8Wed9Y7qv56MPtq+GGM8RJpq6glYJn9Wspr8uw7l55uyinNeg==", "dev": true, + "license": "MIT", "dependencies": { "debug": "^4.3.4" }, @@ -32176,15 +32209,16 @@ } }, "node_modules/storybook": { - "version": "8.2.6", - "resolved": "https://registry.npmjs.org/storybook/-/storybook-8.2.6.tgz", - "integrity": "sha512-8j30wDxQmkcqI0fWcSYFsUCjErsY1yTWbTW+yjbwM8DyW18Cud6CwbFRCxjFsH+2M0CjP6Pqs/m1PGI0vcQscQ==", + "version": "8.2.9", + "resolved": "https://registry.npmjs.org/storybook/-/storybook-8.2.9.tgz", + "integrity": "sha512-S7Q/Yt4A+nu1O23rg39lQvBqL2Vg+PKXbserDWUR4LFJtfmoZ2xGO8oFIhJmvvhjUBvolw1q7QDeswPq2i0sGw==", "dev": true, + "license": "MIT", "dependencies": { "@babel/core": "^7.24.4", "@babel/types": "^7.24.0", - "@storybook/codemod": "8.2.6", - "@storybook/core": "8.2.6", + "@storybook/codemod": "8.2.9", + "@storybook/core": "8.2.9", "@types/semver": "^7.3.4", "@yarnpkg/fslib": "2.10.3", "@yarnpkg/libzip": "2.3.0", @@ -32225,6 +32259,7 @@ "resolved": "https://registry.npmjs.org/commander/-/commander-6.2.1.tgz", "integrity": "sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA==", "dev": true, + "license": "MIT", "engines": { "node": ">= 6" } @@ -32234,6 +32269,7 @@ "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", "dev": true, + "license": "MIT", "dependencies": { "@nodelib/fs.stat": "^2.0.2", "@nodelib/fs.walk": "^1.2.3", @@ -32250,6 +32286,7 @@ "resolved": "https://registry.npmjs.org/globby/-/globby-14.0.2.tgz", "integrity": "sha512-s3Fq41ZVh7vbbe2PN3nrW7yC7U7MFVc5c98/iTl9c2GawNMKx/J648KQRW6WKkuU8GIbbh2IXfIRQjOZnXcTnw==", "dev": true, + "license": "MIT", "dependencies": { "@sindresorhus/merge-streams": "^2.1.0", "fast-glob": "^3.3.2", @@ -32270,6 +32307,7 @@ "resolved": "https://registry.npmjs.org/path-type/-/path-type-5.0.0.tgz", "integrity": "sha512-5HviZNaZcfqP95rwpv+1HDgUamezbqdSYTyzjTvwtJSnIH+3vnbmWsItli8OFEndS984VT55M3jduxZbX351gg==", "dev": true, + "license": "MIT", "engines": { "node": ">=12" }, @@ -32282,6 +32320,7 @@ "resolved": "https://registry.npmjs.org/slash/-/slash-5.1.0.tgz", "integrity": "sha512-ZA6oR3T/pEyuqwMgAKT0/hAv8oAXckzbkmR0UkUosQ+Mc4RxGoJkRmwHgHufaenlyAgE1Mxgpdcrf75y6XcnDg==", "dev": true, + "license": "MIT", "engines": { "node": ">=14.16" }, @@ -34638,10 +34677,11 @@ } }, "node_modules/unplugin": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/unplugin/-/unplugin-1.12.0.tgz", - "integrity": "sha512-KeczzHl2sATPQUx1gzo+EnUkmN4VmGBYRRVOZSGvGITE9rGHRDGqft6ONceP3vgXcyJ2XjX5axG5jMWUwNCYLw==", + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/unplugin/-/unplugin-1.12.2.tgz", + "integrity": "sha512-bEqQxeC7rxtxPZ3M5V4Djcc4lQqKPgGe3mAWZvxcSmX5jhGxll19NliaRzQSQPrk4xJZSGniK3puLWpRuZN7VQ==", "dev": true, + "license": "MIT", "dependencies": { "acorn": "^8.12.1", "chokidar": "^3.6.0", @@ -34657,6 +34697,7 @@ "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", "dev": true, + "license": "MIT", "dependencies": { "anymatch": "~3.1.2", "braces": "~3.0.2", diff --git a/package.json b/package.json index 89d216ee7a..99fd8a4049 100644 --- a/package.json +++ b/package.json @@ -47,17 +47,17 @@ "@electron/notarize": "2.4.0", "@electron/rebuild": "3.6.0", "@ngtools/webpack": "16.2.14", - "@storybook/addon-a11y": "8.2.6", - "@storybook/addon-actions": "8.2.6", + "@storybook/addon-a11y": "8.2.9", + "@storybook/addon-actions": "8.2.9", "@storybook/addon-designs": "8.0.3", - "@storybook/addon-essentials": "8.2.6", - "@storybook/addon-interactions": "8.2.6", - "@storybook/addon-links": "8.2.6", - "@storybook/angular": "8.2.6", - "@storybook/manager-api": "8.2.6", - "@storybook/theming": "8.2.6", + "@storybook/addon-essentials": "8.2.9", + "@storybook/addon-interactions": "8.2.9", + "@storybook/addon-links": "8.2.9", + "@storybook/angular": "8.2.9", + "@storybook/manager-api": "8.2.9", + "@storybook/theming": "8.2.9", "@types/argon2-browser": "1.18.4", - "@types/chrome": "0.0.262", + "@types/chrome": "0.0.270", "@types/firefox-webext-browser": "111.0.5", "@types/inquirer": "8.2.10", "@types/jest": "29.5.12", @@ -86,7 +86,7 @@ "babel-loader": "9.1.3", "base64-loader": "1.0.0", "browserslist": "4.23.2", - "chromatic": "10.9.6", + "chromatic": "11.7.1", "concurrently": "8.2.2", "copy-webpack-plugin": "12.0.2", "cross-env": "7.0.3", @@ -131,7 +131,7 @@ "rimraf": "6.0.1", "sass": "1.74.1", "sass-loader": "14.2.1", - "storybook": "8.2.6", + "storybook": "8.2.9", "style-loader": "3.3.4", "tailwindcss": "3.4.10", "ts-jest": "29.2.2",