diff --git a/.github/workflows/build-desktop.yml b/.github/workflows/build-desktop.yml index b6ca6833f36..ee571b2592a 100644 --- a/.github/workflows/build-desktop.yml +++ b/.github/workflows/build-desktop.yml @@ -16,7 +16,7 @@ on: branches: - 'master' - 'rc' - - 'hotfix-rc/**' + - 'hotfix-rc' paths: - 'apps/desktop/**' - 'libs/**' diff --git a/.github/workflows/release-browser.yml b/.github/workflows/release-browser.yml index b18002f1d46..da8780599c9 100644 --- a/.github/workflows/release-browser.yml +++ b/.github/workflows/release-browser.yml @@ -90,7 +90,8 @@ jobs: - setup - locales-test steps: - - name: Download latest RC build artifacts + - name: Download latest Release build artifacts + if: ${{ github.event.inputs.release_type != 'Dry Run' }} uses: bitwarden/gh-actions/download-artifacts@c1fa8e09871a860862d6bbe36184b06d2c7e35a8 with: workflow: build-browser.yml @@ -102,6 +103,19 @@ jobs: dist-firefox-*.zip, dist-edge-*.zip' + - name: Download latest master build artifacts + if: ${{ github.event.inputs.release_type == 'Dry Run' }} + uses: bitwarden/gh-actions/download-artifacts@c1fa8e09871a860862d6bbe36184b06d2c7e35a8 + with: + workflow: build-browser.yml + workflow_conclusion: success + branch: master + artifacts: 'browser-source-*.zip, + dist-chrome-*.zip, + dist-opera-*.zip, + dist-firefox-*.zip, + dist-edge-*.zip' + - name: Rename build artifacts env: PACKAGE_VERSION: ${{ needs.setup.outputs.release-version }} diff --git a/.github/workflows/release-cli.yml b/.github/workflows/release-cli.yml index fe9b02f2a75..31b5f058c8f 100644 --- a/.github/workflows/release-cli.yml +++ b/.github/workflows/release-cli.yml @@ -13,6 +13,22 @@ on: - Initial Release - Redeploy - Dry Run + snap_publish: + description: 'Publish to snap store' + required: true + default: true + type: boolean + choco_publish: + description: 'Publish to chocolatey store' + required: true + default: true + type: boolean + npm_publish: + description: 'Publish to npm registry' + required: true + default: true + type: boolean + defaults: run: @@ -48,7 +64,8 @@ jobs: monorepo: true monorepo-project: cli - - name: Download all artifacts + - name: Download all Release artifacts + if: ${{ github.event.inputs.release_type != 'Dry Run' }} uses: bitwarden/gh-actions/download-artifacts@c1fa8e09871a860862d6bbe36184b06d2c7e35a8 with: workflow: build-cli.yml @@ -56,6 +73,15 @@ jobs: workflow_conclusion: success branch: ${{ github.ref_name }} + - name: Download all artifacts + if: ${{ github.event.inputs.release_type == 'Dry Run' }} + uses: bitwarden/gh-actions/download-artifacts@c1fa8e09871a860862d6bbe36184b06d2c7e35a8 + with: + workflow: build-cli.yml + path: apps/cli + workflow_conclusion: success + branch: master + - name: Create release if: ${{ github.event.inputs.release_type != 'Dry Run' }} uses: ncipollo/release-action@58ae73b360456532aafd58ee170c045abbeaee37 # v1.10.0 @@ -83,6 +109,7 @@ jobs: name: Deploy Snap runs-on: ubuntu-20.04 needs: setup + if: inputs.snap_publish env: _PKG_VERSION: ${{ needs.setup.outputs.release-version }} steps: @@ -107,6 +134,7 @@ jobs: snapcraft_token: ${{ steps.retrieve-secrets.outputs.snapcraft-store-token }} - name: Download artifacts + if: ${{ github.event.inputs.release_type != 'Dry Run' }} uses: bitwarden/gh-actions/download-artifacts@c1fa8e09871a860862d6bbe36184b06d2c7e35a8 with: workflow: build-cli.yml @@ -115,6 +143,16 @@ jobs: branch: ${{ github.ref_name }} artifacts: bw_${{ env._PKG_VERSION }}_amd64.snap + - name: Download artifacts + if: ${{ github.event.inputs.release_type == 'Dry Run' }} + uses: bitwarden/gh-actions/download-artifacts@c1fa8e09871a860862d6bbe36184b06d2c7e35a8 + with: + workflow: build-cli.yml + path: apps/cli + workflow_conclusion: success + branch: master + artifacts: bw_${{ env._PKG_VERSION }}_amd64.snap + - name: Publish Snap & logout if: ${{ github.event.inputs.release_type != 'Dry Run' }} run: | @@ -126,6 +164,7 @@ jobs: name: Deploy Choco runs-on: windows-2019 needs: setup + if: inputs.choco_publish env: _PKG_VERSION: ${{ needs.setup.outputs.release-version }} steps: @@ -154,14 +193,25 @@ jobs: run: New-Item -ItemType directory -Path ./dist - name: Download artifacts + if: ${{ github.event.inputs.release_type != 'Dry Run' }} uses: bitwarden/gh-actions/download-artifacts@c1fa8e09871a860862d6bbe36184b06d2c7e35a8 with: workflow: build-cli.yml - path: apps/cli + path: apps/cli/dist workflow_conclusion: success branch: ${{ github.ref_name }} artifacts: bitwarden-cli.${{ env._PKG_VERSION }}.nupkg + - name: Download artifacts + if: ${{ github.event.inputs.release_type == 'Dry Run' }} + uses: bitwarden/gh-actions/download-artifacts@c1fa8e09871a860862d6bbe36184b06d2c7e35a8 + with: + workflow: build-cli.yml + path: apps/cli/dist + workflow_conclusion: success + branch: master + artifacts: bitwarden-cli.${{ env._PKG_VERSION }}.nupkg + - name: Push to Chocolatey if: ${{ github.event.inputs.release_type != 'Dry Run' }} shell: pwsh @@ -174,25 +224,49 @@ jobs: name: Publish NPM runs-on: ubuntu-20.04 needs: setup + if: inputs.npm_publish env: _PKG_VERSION: ${{ needs.setup.outputs.release-version }} steps: - name: Checkout repo uses: actions/checkout@2541b1294d2704b0964813337f33b291d3f8596b # v3.0.2 + - name: Login to Azure + uses: Azure/login@24848bc889cfc0a8313c2b3e378ac0d625b9bc16 + with: + creds: ${{ secrets.AZURE_PROD_KV_CREDENTIALS }} + + - name: Retrieve secrets + id: retrieve-secrets + uses: Azure/get-keyvault-secrets@b5c723b9ac7870c022b8c35befe620b7009b336f + with: + keyvault: "bitwarden-prod-kv" + secrets: "cli-npm-api-key" + - name: Download artifacts + if: ${{ github.event.inputs.release_type != 'Dry Run' }} uses: bitwarden/gh-actions/download-artifacts@c1fa8e09871a860862d6bbe36184b06d2c7e35a8 with: workflow: build-cli.yml - path: apps/cli + path: apps/cli/build workflow_conclusion: success branch: ${{ github.ref_name }} artifacts: bitwarden-cli-${{ env._PKG_VERSION }}-npm-build.zip + - name: Download artifacts + if: ${{ github.event.inputs.release_type == 'Dry Run' }} + uses: bitwarden/gh-actions/download-artifacts@c1fa8e09871a860862d6bbe36184b06d2c7e35a8 + with: + workflow: build-cli.yml + path: apps/cli/build + workflow_conclusion: success + branch: master + artifacts: bitwarden-cli-${{ env._PKG_VERSION }}-npm-build.zip + - name: Setup NPM run: echo "//registry.npmjs.org/:_authToken=$NPM_TOKEN" > .npmrc env: - NPM_TOKEN: ${{ secrets.NPM_TOKEN }} + NPM_TOKEN: ${{ steps.retrieve-secrets.outputs.cli-npm-api-key }} - name: Install Husky run: npm install -g husky diff --git a/.github/workflows/release-desktop-beta.yml b/.github/workflows/release-desktop-beta.yml new file mode 100644 index 00000000000..b898955709b --- /dev/null +++ b/.github/workflows/release-desktop-beta.yml @@ -0,0 +1,920 @@ +--- +name: Release Desktop Beta + +on: + workflow_dispatch: + inputs: + version_number: + description: "New Beta Version" + required: true + +defaults: + run: + shell: bash + +jobs: + setup: + name: Setup + runs-on: ubuntu-20.04 + outputs: + release-version: ${{ steps.version.outputs.version }} + release-channel: ${{ steps.release-channel.outputs.channel }} + steps: + - name: Checkout repo + uses: actions/checkout@2541b1294d2704b0964813337f33b291d3f8596b # v3.0.2 + + # - name: Branch check + # run: | + # if [[ "$GITHUB_REF" != "refs/heads/master" ]] && [[ "$GITHUB_REF" != "refs/heads/rc" ]] && [[ $GITHUB_REF != refs/heads/hotfix-rc/* ]]; then + # echo "===================================" + # echo "[!] Can only release from the 'master', 'rc' or 'hotfix-rc/*' branches" + # echo "===================================" + # exit 1 + # fi + + - name: Bump Desktop Version - Root + env: + VERSION: ${{ github.event.inputs.version_number }} + run: npm version --workspace=@bitwarden/desktop ${VERSION}-beta + + - name: Bump Desktop Version - App + env: + VERSION: ${{ github.event.inputs.version_number }} + run: npm version ${VERSION}-beta + working-directory: "apps/desktop/src" + + - name: Check Release Version + id: version + uses: bitwarden/gh-actions/release-version-check@ea9fab01d76940267b4147cc1c4542431246b9f6 + with: + release-type: ${{ github.event.inputs.release_type }} + project-type: ts + file: apps/desktop/src/package.json + monorepo: true + monorepo-project: desktop + + - name: Get Version Channel + id: release-channel + run: | + case "${{ steps.version.outputs.version }}" in + *"alpha"*) + echo "::set-output name=channel::alpha" + echo "[!] We do not yet support 'alpha'" + exit 1 + ;; + *"beta"*) + echo "::set-output name=channel::beta" + ;; + *) + echo "::set-output name=channel::latest" + ;; + esac + + linux: + name: Linux Build + runs-on: ubuntu-20.04 + needs: setup + env: + _PACKAGE_VERSION: ${{ needs.setup.outputs.package_version }} + defaults: + run: + working-directory: apps/desktop + steps: + - name: Checkout repo + uses: actions/checkout@a12a3943b4bdde767164f792f33f40b04645d846 + + - name: Set up Node + uses: actions/setup-node@9ced9a43a244f3ac94f13bfd896db8c8f30da67a # v3.0.0 + with: + cache: 'npm' + cache-dependency-path: '**/package-lock.json' + node-version: '16' + + - name: Set Node options + run: echo "NODE_OPTIONS=--max_old_space_size=4096" >> $GITHUB_ENV + + - name: Install node-gyp + run: | + npm install -g node-gyp + node-gyp install $(node -v) + + - name: Set up environment + run: | + sudo apt-get update + sudo apt-get -y install pkg-config libxss-dev libsecret-1-dev rpm + + - name: Set up Snap + run: sudo snap install snapcraft --classic + + - name: Print environment + run: | + node --version + npm --version + snap --version + snapcraft --version || echo 'snapcraft unavailable' + + - name: Install Node dependencies + run: npm ci + working-directory: ./ + + - name: Build application + run: npm run dist:lin + + - name: Upload .deb artifact + uses: actions/upload-artifact@6673cd052c4cd6fcf4b4e6e60ea986c889389535 + with: + name: Bitwarden-${{ env._PACKAGE_VERSION }}-amd64.deb + path: apps/desktop/dist/Bitwarden-${{ env._PACKAGE_VERSION }}-amd64.deb + if-no-files-found: error + + - name: Upload .rpm artifact + uses: actions/upload-artifact@6673cd052c4cd6fcf4b4e6e60ea986c889389535 + with: + name: Bitwarden-${{ env._PACKAGE_VERSION }}-x86_64.rpm + path: apps/desktop/dist/Bitwarden-${{ env._PACKAGE_VERSION }}-x86_64.rpm + if-no-files-found: error + + - name: Upload .freebsd artifact + uses: actions/upload-artifact@6673cd052c4cd6fcf4b4e6e60ea986c889389535 + with: + name: Bitwarden-${{ env._PACKAGE_VERSION }}-x64.freebsd + path: apps/desktop/dist/Bitwarden-${{ env._PACKAGE_VERSION }}-x64.freebsd + if-no-files-found: error + + - name: Upload .snap artifact + uses: actions/upload-artifact@6673cd052c4cd6fcf4b4e6e60ea986c889389535 + with: + name: bitwarden_${{ env._PACKAGE_VERSION }}_amd64.snap + path: apps/desktop/dist/bitwarden_${{ env._PACKAGE_VERSION }}_amd64.snap + if-no-files-found: error + + - name: Upload .AppImage artifact + uses: actions/upload-artifact@6673cd052c4cd6fcf4b4e6e60ea986c889389535 + with: + name: Bitwarden-${{ env._PACKAGE_VERSION }}-x86_64.AppImage + path: apps/desktop/dist/Bitwarden-${{ env._PACKAGE_VERSION }}-x86_64.AppImage + if-no-files-found: error + + - name: Upload auto-update artifact + uses: actions/upload-artifact@6673cd052c4cd6fcf4b4e6e60ea986c889389535 + with: + name: ${{ needs.setup.outputs.release_channel }}-linux.yml + path: apps/desktop/dist/${{ needs.setup.outputs.release_channel }}-linux.yml + if-no-files-found: error + + + windows: + name: Windows Build + runs-on: windows-2019 + needs: setup + defaults: + run: + shell: pwsh + working-directory: apps/desktop + env: + _PACKAGE_VERSION: ${{ needs.setup.outputs.package_version }} + steps: + - name: Checkout repo + uses: actions/checkout@a12a3943b4bdde767164f792f33f40b04645d846 + + - name: Set up Node + uses: actions/setup-node@9ced9a43a244f3ac94f13bfd896db8c8f30da67a # v3.0.0 + with: + cache: 'npm' + cache-dependency-path: '**/package-lock.json' + node-version: '16' + + - name: Set Node options + run: echo "NODE_OPTIONS=--max_old_space_size=4096" | Out-File -FilePath $env:GITHUB_ENV -Encoding utf8 -Append + + - name: Install node-gyp + run: | + npm install -g node-gyp + node-gyp install $(node -v) + + - name: Install AST + uses: bitwarden/gh-actions/install-ast@f135c42c8596cb535c5bcb7523c0b2eef89709ac + + - name: Set up environment + run: choco install checksum --no-progress + + - name: Print environment + run: | + node --version + npm --version + choco --version + + - name: Login to Azure + uses: Azure/login@1f63701bf3e6892515f1b7ce2d2bf1708b46beaf + with: + creds: ${{ secrets.AZURE_PROD_KV_CREDENTIALS }} + + - name: Retrieve secrets + id: retrieve-secrets + uses: Azure/get-keyvault-secrets@b5c723b9ac7870c022b8c35befe620b7009b336f + with: + keyvault: "bitwarden-prod-kv" + secrets: "code-signing-vault-url, + code-signing-client-id, + code-signing-tenant-id, + code-signing-client-secret, + code-signing-cert-name" + + - name: Install Node dependencies + run: npm ci + working-directory: ./ + + - name: Build & Sign (dev) + env: + ELECTRON_BUILDER_SIGN: 1 + SIGNING_VAULT_URL: ${{ steps.retrieve-secrets.outputs.code-signing-vault-url }} + SIGNING_CLIENT_ID: ${{ steps.retrieve-secrets.outputs.code-signing-client-id }} + SIGNING_TENANT_ID: ${{ steps.retrieve-secrets.outputs.code-signing-tenant-id }} + SIGNING_CLIENT_SECRET: ${{ steps.retrieve-secrets.outputs.code-signing-client-secret }} + SIGNING_CERT_NAME: ${{ steps.retrieve-secrets.outputs.code-signing-cert-name }} + run: | + npm run build + npm run pack:win + + - name: Rename appx files for store + run: | + Copy-Item "./dist/Bitwarden-${{ env._PACKAGE_VERSION }}-ia32.appx" ` + -Destination "./dist/Bitwarden-${{ env._PACKAGE_VERSION }}-ia32-store.appx" + Copy-Item "./dist/Bitwarden-${{ env._PACKAGE_VERSION }}-x64.appx" ` + -Destination "./dist/Bitwarden-${{ env._PACKAGE_VERSION }}-x64-store.appx" + Copy-Item "./dist/Bitwarden-${{ env._PACKAGE_VERSION }}-arm64.appx" ` + -Destination "./dist/Bitwarden-${{ env._PACKAGE_VERSION }}-arm64-store.appx" + + - name: Package for Chocolatey + run: | + Copy-Item -Path ./stores/chocolatey -Destination ./dist/chocolatey -Recurse + Copy-Item -Path ./dist/nsis-web/Bitwarden-Installer-${{ env._PACKAGE_VERSION }}.exe ` + -Destination ./dist/chocolatey + + $checksum = checksum -t sha256 ./dist/chocolatey/Bitwarden-Installer-${{ env._PACKAGE_VERSION }}.exe + $chocoInstall = "./dist/chocolatey/tools/chocolateyinstall.ps1" + (Get-Content $chocoInstall).replace('__version__', "$env:_PACKAGE_VERSION").replace('__checksum__', $checksum) | Set-Content $chocoInstall + choco pack ./dist/chocolatey/bitwarden.nuspec --version "$env:_PACKAGE_VERSION" --out ./dist/chocolatey + + - name: Fix NSIS artifact names for auto-updater + run: | + Rename-Item -Path .\dist\nsis-web\Bitwarden-${{ env._PACKAGE_VERSION }}-ia32.nsis.7z ` + -NewName bitwarden-${{ env._PACKAGE_VERSION }}-ia32.nsis.7z + Rename-Item -Path .\dist\nsis-web\Bitwarden-${{ env._PACKAGE_VERSION }}-x64.nsis.7z ` + -NewName bitwarden-${{ env._PACKAGE_VERSION }}-x64.nsis.7z + Rename-Item -Path .\dist\nsis-web\Bitwarden-${{ env._PACKAGE_VERSION }}-arm64.nsis.7z ` + -NewName bitwarden-${{ env._PACKAGE_VERSION }}-arm64.nsis.7z + + - name: Upload portable exe artifact + uses: actions/upload-artifact@6673cd052c4cd6fcf4b4e6e60ea986c889389535 + with: + name: Bitwarden-Portable-${{ env._PACKAGE_VERSION }}.exe + path: apps/desktop/dist/Bitwarden-Portable-${{ env._PACKAGE_VERSION }}.exe + if-no-files-found: error + + - name: Upload installer exe artifact + uses: actions/upload-artifact@6673cd052c4cd6fcf4b4e6e60ea986c889389535 + with: + name: Bitwarden-Installer-${{ env._PACKAGE_VERSION }}.exe + path: apps/desktop/dist/nsis-web/Bitwarden-Installer-${{ env._PACKAGE_VERSION }}.exe + if-no-files-found: error + + - name: Upload appx ia32 artifact + uses: actions/upload-artifact@6673cd052c4cd6fcf4b4e6e60ea986c889389535 + with: + name: Bitwarden-${{ env._PACKAGE_VERSION }}-ia32.appx + path: apps/desktop/dist/Bitwarden-${{ env._PACKAGE_VERSION }}-ia32.appx + if-no-files-found: error + + - name: Upload store appx ia32 artifact + uses: actions/upload-artifact@6673cd052c4cd6fcf4b4e6e60ea986c889389535 + with: + name: Bitwarden-${{ env._PACKAGE_VERSION }}-ia32-store.appx + path: apps/desktop/dist/Bitwarden-${{ env._PACKAGE_VERSION }}-ia32-store.appx + if-no-files-found: error + + - name: Upload NSIS ia32 artifact + uses: actions/upload-artifact@6673cd052c4cd6fcf4b4e6e60ea986c889389535 + with: + name: bitwarden-${{ env._PACKAGE_VERSION }}-ia32.nsis.7z + path: apps/desktop/dist/nsis-web/bitwarden-${{ env._PACKAGE_VERSION }}-ia32.nsis.7z + if-no-files-found: error + + - name: Upload appx x64 artifact + uses: actions/upload-artifact@6673cd052c4cd6fcf4b4e6e60ea986c889389535 + with: + name: Bitwarden-${{ env._PACKAGE_VERSION }}-x64.appx + path: apps/desktop/dist/Bitwarden-${{ env._PACKAGE_VERSION }}-x64.appx + if-no-files-found: error + + - name: Upload store appx x64 artifact + uses: actions/upload-artifact@6673cd052c4cd6fcf4b4e6e60ea986c889389535 + with: + name: Bitwarden-${{ env._PACKAGE_VERSION }}-x64-store.appx + path: apps/desktop/dist/Bitwarden-${{ env._PACKAGE_VERSION }}-x64-store.appx + if-no-files-found: error + + - name: Upload NSIS x64 artifact + uses: actions/upload-artifact@6673cd052c4cd6fcf4b4e6e60ea986c889389535 + with: + name: bitwarden-${{ env._PACKAGE_VERSION }}-x64.nsis.7z + path: apps/desktop/dist/nsis-web/bitwarden-${{ env._PACKAGE_VERSION }}-x64.nsis.7z + if-no-files-found: error + + - name: Upload appx ARM64 artifact + uses: actions/upload-artifact@6673cd052c4cd6fcf4b4e6e60ea986c889389535 + with: + name: Bitwarden-${{ env._PACKAGE_VERSION }}-arm64.appx + path: apps/desktop/dist/Bitwarden-${{ env._PACKAGE_VERSION }}-arm64.appx + if-no-files-found: error + + - name: Upload store appx ARM64 artifact + uses: actions/upload-artifact@6673cd052c4cd6fcf4b4e6e60ea986c889389535 + with: + name: Bitwarden-${{ env._PACKAGE_VERSION }}-arm64-store.appx + path: apps/desktop/dist/Bitwarden-${{ env._PACKAGE_VERSION }}-arm64-store.appx + if-no-files-found: error + + - name: Upload NSIS ARM64 artifact + uses: actions/upload-artifact@6673cd052c4cd6fcf4b4e6e60ea986c889389535 + with: + name: bitwarden-${{ env._PACKAGE_VERSION }}-arm64.nsis.7z + path: apps/desktop/dist/nsis-web/bitwarden-${{ env._PACKAGE_VERSION }}-arm64.nsis.7z + if-no-files-found: error + + - name: Upload nupkg artifact + uses: actions/upload-artifact@6673cd052c4cd6fcf4b4e6e60ea986c889389535 + with: + name: bitwarden.${{ env._PACKAGE_VERSION }}.nupkg + path: apps/desktop/dist/chocolatey/bitwarden.${{ env._PACKAGE_VERSION }}.nupkg + if-no-files-found: error + + - name: Upload auto-update artifact + uses: actions/upload-artifact@6673cd052c4cd6fcf4b4e6e60ea986c889389535 + with: + name: ${{ needs.setup.outputs.release_channel }}.yml + path: apps/desktop/dist/nsis-web/${{ needs.setup.outputs.release_channel }}.yml + if-no-files-found: error + + + macos-build: + name: MacOS Build + runs-on: macos-11 + needs: setup + env: + _PACKAGE_VERSION: ${{ needs.setup.outputs.package_version }} + defaults: + run: + working-directory: apps/desktop + steps: + - name: Checkout repo + uses: actions/checkout@a12a3943b4bdde767164f792f33f40b04645d846 + + - name: Set up Node + uses: actions/setup-node@9ced9a43a244f3ac94f13bfd896db8c8f30da67a # v3.0.0 + with: + cache: 'npm' + cache-dependency-path: '**/package-lock.json' + node-version: '16' + + - name: Set Node options + run: echo "NODE_OPTIONS=--max_old_space_size=4096" >> $GITHUB_ENV + + - name: Install node-gyp + run: | + npm install -g node-gyp + node-gyp install $(node -v) + + - name: Print environment + run: | + node --version + npm --version + echo "GitHub ref: $GITHUB_REF" + echo "GitHub event: $GITHUB_EVENT" + + - name: Cache Build + id: build-cache + uses: actions/cache@937d24475381cd9c75ae6db12cb4e79714b926ed + with: + path: apps/desktop/build + key: ${{ runner.os }}-${{ github.run_id }}-build + + - name: Cache Safari + id: safari-cache + uses: actions/cache@937d24475381cd9c75ae6db12cb4e79714b926ed + with: + path: apps/browser/dist/Safari + key: ${{ runner.os }}-${{ github.run_id }}-safari-extension + + - name: Decrypt secrets + env: + DECRYPT_FILE_PASSWORD: ${{ secrets.DECRYPT_FILE_PASSWORD }} + run: | + mkdir -p $HOME/secrets + gpg --quiet --batch --yes --decrypt --passphrase="$DECRYPT_FILE_PASSWORD" \ + --output "$HOME/secrets/bitwarden-desktop-key.p12" \ + "$GITHUB_WORKSPACE/.github/secrets/bitwarden-desktop-key.p12.gpg" + gpg --quiet --batch --yes --decrypt --passphrase="$DECRYPT_FILE_PASSWORD" \ + --output "$HOME/secrets/appstore-app-cert.p12" \ + "$GITHUB_WORKSPACE/.github/secrets/appstore-app-cert.p12.gpg" + gpg --quiet --batch --yes --decrypt --passphrase="$DECRYPT_FILE_PASSWORD" \ + --output "$HOME/secrets/appstore-installer-cert.p12" \ + "$GITHUB_WORKSPACE/.github/secrets/appstore-installer-cert.p12.gpg" + gpg --quiet --batch --yes --decrypt --passphrase="$DECRYPT_FILE_PASSWORD" \ + --output "$HOME/secrets/devid-app-cert.p12" \ + "$GITHUB_WORKSPACE/.github/secrets/devid-app-cert.p12.gpg" + gpg --quiet --batch --yes --decrypt --passphrase="$DECRYPT_FILE_PASSWORD" \ + --output "$HOME/secrets/devid-installer-cert.p12" \ + "$GITHUB_WORKSPACE/.github/secrets/devid-installer-cert.p12.gpg" + gpg --quiet --batch --yes --decrypt --passphrase="$DECRYPT_FILE_PASSWORD" \ + --output "$HOME/secrets/macdev-cert.p12" \ + "$GITHUB_WORKSPACE/.github/secrets/macdev-cert.p12.gpg" + gpg --quiet --batch --yes --decrypt --passphrase="$DECRYPT_FILE_PASSWORD" \ + --output "$HOME/secrets/bitwarden_desktop_appstore.provisionprofile" \ + "$GITHUB_WORKSPACE/.github/secrets/bitwarden_desktop_appstore.provisionprofile.gpg" + + - name: Set up keychain + env: + KEYCHAIN_PASSWORD: ${{ secrets.KEYCHAIN_PASSWORD }} + DESKTOP_KEY_PASSWORD: ${{ secrets.DESKTOP_KEY_PASSWORD }} + DEVID_CERT_PASSWORD: ${{ secrets.DEVID_CERT_PASSWORD }} + APPSTORE_CERT_PASSWORD: ${{ secrets.APPSTORE_CERT_PASSWORD }} + MACDEV_CERT_PASSWORD: ${{ secrets.MACDEV_CERT_PASSWORD }} + APPLE_ID_PASSWORD: ${{ secrets.APPLE_ID_PASSWORD }} + run: | + security create-keychain -p $KEYCHAIN_PASSWORD build.keychain + security default-keychain -s build.keychain + security unlock-keychain -p $KEYCHAIN_PASSWORD build.keychain + security set-keychain-settings -lut 1200 build.keychain + security import "$HOME/secrets/bitwarden-desktop-key.p12" -k build.keychain -P $DESKTOP_KEY_PASSWORD \ + -T /usr/bin/codesign -T /usr/bin/security -T /usr/bin/productbuild + security import "$HOME/secrets/devid-app-cert.p12" -k build.keychain -P $DEVID_CERT_PASSWORD \ + -T /usr/bin/codesign -T /usr/bin/security -T /usr/bin/productbuild + security import "$HOME/secrets/devid-installer-cert.p12" -k build.keychain -P $DEVID_CERT_PASSWORD \ + -T /usr/bin/codesign -T /usr/bin/security -T /usr/bin/productbuild + security import "$HOME/secrets/appstore-app-cert.p12" -k build.keychain -P $APPSTORE_CERT_PASSWORD \ + -T /usr/bin/codesign -T /usr/bin/security -T /usr/bin/productbuild + security import "$HOME/secrets/appstore-installer-cert.p12" -k build.keychain -P $APPSTORE_CERT_PASSWORD \ + -T /usr/bin/codesign -T /usr/bin/security -T /usr/bin/productbuild + security import "$HOME/secrets/macdev-cert.p12" -k build.keychain -P $MACDEV_CERT_PASSWORD \ + -T /usr/bin/codesign -T /usr/bin/security -T /usr/bin/productbuild + security set-key-partition-list -S apple-tool:,apple:,codesign: -s -k $KEYCHAIN_PASSWORD build.keychain + + - name: Set up provisioning profiles + run: | + cp $HOME/secrets/bitwarden_desktop_appstore.provisionprofile \ + $GITHUB_WORKSPACE/apps/desktop/bitwarden_desktop_appstore.provisionprofile + + - name: Increment version + shell: pwsh + env: + BUILD_NUMBER: ${{ needs.setup.outputs.build_number }} + run: | + $package = Get-Content -Raw -Path electron-builder.json | ConvertFrom-Json + $package | Add-Member -MemberType NoteProperty -Name buildVersion -Value "$env:BUILD_NUMBER" + $package | ConvertTo-Json -Depth 32 | Set-Content -Path electron-builder.json + + - name: Install Node dependencies + run: npm ci + working-directory: ./ + + - name: Build application (dev) + run: npm run build + + + macos-package-github: + name: MacOS Package GitHub Release Assets + runs-on: macos-11 + needs: + - setup + - macos-build + env: + _PACKAGE_VERSION: ${{ needs.setup.outputs.package_version }} + defaults: + run: + working-directory: apps/desktop + steps: + - name: Checkout repo + uses: actions/checkout@a12a3943b4bdde767164f792f33f40b04645d846 + + - name: Set up Node + uses: actions/setup-node@9ced9a43a244f3ac94f13bfd896db8c8f30da67a # v3.0.0 + with: + cache: 'npm' + cache-dependency-path: '**/package-lock.json' + node-version: '16' + + - name: Set Node options + run: echo "NODE_OPTIONS=--max_old_space_size=4096" >> $GITHUB_ENV + + - name: Install node-gyp + run: | + npm install -g node-gyp + node-gyp install $(node -v) + + - name: Print environment + run: | + node --version + npm --version + echo "GitHub ref: $GITHUB_REF" + echo "GitHub event: $GITHUB_EVENT" + + - name: Get Build Cache + id: build-cache + uses: actions/cache@937d24475381cd9c75ae6db12cb4e79714b926ed + with: + path: apps/desktop/build + key: ${{ runner.os }}-${{ github.run_id }}-build + + - name: Setup Safari Cache + id: safari-cache + uses: actions/cache@937d24475381cd9c75ae6db12cb4e79714b926ed + with: + path: apps/browser/dist/Safari + key: ${{ runner.os }}-${{ github.run_id }}-safari-extension + + - name: Decrypt secrets + env: + DECRYPT_FILE_PASSWORD: ${{ secrets.DECRYPT_FILE_PASSWORD }} + run: | + mkdir -p $HOME/secrets + gpg --quiet --batch --yes --decrypt --passphrase="$DECRYPT_FILE_PASSWORD" \ + --output "$HOME/secrets/bitwarden-desktop-key.p12" \ + "$GITHUB_WORKSPACE/.github/secrets/bitwarden-desktop-key.p12.gpg" + gpg --quiet --batch --yes --decrypt --passphrase="$DECRYPT_FILE_PASSWORD" \ + --output "$HOME/secrets/appstore-app-cert.p12" \ + "$GITHUB_WORKSPACE/.github/secrets/appstore-app-cert.p12.gpg" + gpg --quiet --batch --yes --decrypt --passphrase="$DECRYPT_FILE_PASSWORD" \ + --output "$HOME/secrets/appstore-installer-cert.p12" \ + "$GITHUB_WORKSPACE/.github/secrets/appstore-installer-cert.p12.gpg" + gpg --quiet --batch --yes --decrypt --passphrase="$DECRYPT_FILE_PASSWORD" \ + --output "$HOME/secrets/devid-app-cert.p12" \ + "$GITHUB_WORKSPACE/.github/secrets/devid-app-cert.p12.gpg" + gpg --quiet --batch --yes --decrypt --passphrase="$DECRYPT_FILE_PASSWORD" \ + --output "$HOME/secrets/devid-installer-cert.p12" \ + "$GITHUB_WORKSPACE/.github/secrets/devid-installer-cert.p12.gpg" + gpg --quiet --batch --yes --decrypt --passphrase="$DECRYPT_FILE_PASSWORD" \ + --output "$HOME/secrets/macdev-cert.p12" \ + "$GITHUB_WORKSPACE/.github/secrets/macdev-cert.p12.gpg" + gpg --quiet --batch --yes --decrypt --passphrase="$DECRYPT_FILE_PASSWORD" \ + --output "$HOME/secrets/bitwarden_desktop_appstore.provisionprofile" \ + "$GITHUB_WORKSPACE/.github/secrets/bitwarden_desktop_appstore.provisionprofile.gpg" + + - name: Set up keychain + env: + KEYCHAIN_PASSWORD: ${{ secrets.KEYCHAIN_PASSWORD }} + DESKTOP_KEY_PASSWORD: ${{ secrets.DESKTOP_KEY_PASSWORD }} + DEVID_CERT_PASSWORD: ${{ secrets.DEVID_CERT_PASSWORD }} + APPSTORE_CERT_PASSWORD: ${{ secrets.APPSTORE_CERT_PASSWORD }} + MACDEV_CERT_PASSWORD: ${{ secrets.MACDEV_CERT_PASSWORD }} + APPLE_ID_PASSWORD: ${{ secrets.APPLE_ID_PASSWORD }} + run: | + security create-keychain -p $KEYCHAIN_PASSWORD build.keychain + security default-keychain -s build.keychain + security unlock-keychain -p $KEYCHAIN_PASSWORD build.keychain + security set-keychain-settings -lut 1200 build.keychain + security import "$HOME/secrets/bitwarden-desktop-key.p12" -k build.keychain -P $DESKTOP_KEY_PASSWORD \ + -T /usr/bin/codesign -T /usr/bin/security -T /usr/bin/productbuild + security import "$HOME/secrets/devid-app-cert.p12" -k build.keychain -P $DEVID_CERT_PASSWORD \ + -T /usr/bin/codesign -T /usr/bin/security -T /usr/bin/productbuild + security import "$HOME/secrets/devid-installer-cert.p12" -k build.keychain -P $DEVID_CERT_PASSWORD \ + -T /usr/bin/codesign -T /usr/bin/security -T /usr/bin/productbuild + security import "$HOME/secrets/appstore-app-cert.p12" -k build.keychain -P $APPSTORE_CERT_PASSWORD \ + -T /usr/bin/codesign -T /usr/bin/security -T /usr/bin/productbuild + security import "$HOME/secrets/appstore-installer-cert.p12" -k build.keychain -P $APPSTORE_CERT_PASSWORD \ + -T /usr/bin/codesign -T /usr/bin/security -T /usr/bin/productbuild + security import "$HOME/secrets/macdev-cert.p12" -k build.keychain -P $MACDEV_CERT_PASSWORD \ + -T /usr/bin/codesign -T /usr/bin/security -T /usr/bin/productbuild + security set-key-partition-list -S apple-tool:,apple:,codesign: -s -k $KEYCHAIN_PASSWORD build.keychain + + - name: Set up provisioning profiles + run: | + cp $HOME/secrets/bitwarden_desktop_appstore.provisionprofile \ + $GITHUB_WORKSPACE/apps/desktop/bitwarden_desktop_appstore.provisionprofile + + - name: Increment version + shell: pwsh + env: + BUILD_NUMBER: ${{ needs.setup.outputs.build_number }} + run: | + $package = Get-Content -Raw -Path electron-builder.json | ConvertFrom-Json + $package | Add-Member -MemberType NoteProperty -Name buildVersion -Value "$env:BUILD_NUMBER" + $package | ConvertTo-Json -Depth 32 | Set-Content -Path electron-builder.json + + - name: Install Node dependencies + run: npm ci + working-directory: ./ + + - name: Build + if: steps.build-cache.outputs.cache-hit != 'true' + run: npm run build + + - name: Extract branch name + if: contains(github.ref, 'hotfix-rc') + id: extract_branch + shell: bash + run: echo "##[set-output name=branch;]$(echo ${GITHUB_REF#refs/heads/})" + + - name: Download artifact from hotfix-rc + if: contains(github.ref, 'hotfix-rc') + uses: dawidd6/action-download-artifact@b2abf1705491048a2d7074f7d90513044fd25d39 # v2.19.0 + with: + workflow: build-browser.yml + workflow_conclusion: success + branch: ${{ steps.extract_branch.outputs.branch }} + path: ${{ github.workspace }}/browser-build-artifacts + + - name: Download artifact from rc + if: github.ref == 'refs/heads/rc' + uses: dawidd6/action-download-artifact@b2abf1705491048a2d7074f7d90513044fd25d39 # v2.19.0 + with: + workflow: build-browser.yml + workflow_conclusion: success + branch: rc + path: ${{ github.workspace }}/browser-build-artifacts + + - name: Download artifact from master + if: ${{ github.ref != 'refs/heads/rc' && !contains(github.ref, 'hotfix-rc') }} + uses: dawidd6/action-download-artifact@b2abf1705491048a2d7074f7d90513044fd25d39 # v2.19.0 + with: + workflow: build-browser.yml + workflow_conclusion: success + branch: master + path: ${{ github.workspace }}/browser-build-artifacts + + - name: Unzip Safari artifact + run: | + SAFARI_DIR=$(find $GITHUB_WORKSPACE/browser-build-artifacts -name 'dist-safari-*.zip') + echo $SAFARI_DIR + unzip $SAFARI_DIR/dist-safari.zip -d $GITHUB_WORKSPACE/browser-build-artifacts + + - name: Load Safari extension for .dmg + run: | + mkdir PlugIns + cp -r $GITHUB_WORKSPACE/browser-build-artifacts/Safari/dmg/build/Release/safari.appex PlugIns/safari.appex + + - name: Build application (dist) + env: + APPLE_ID_USERNAME: ${{ secrets.APPLE_ID_USERNAME }} + APPLE_ID_PASSWORD: ${{ secrets.APPLE_ID_PASSWORD }} + run: npm run pack:mac + + - name: Upload .zip artifact + uses: actions/upload-artifact@6673cd052c4cd6fcf4b4e6e60ea986c889389535 + with: + name: Bitwarden-${{ env._PACKAGE_VERSION }}-universal-mac.zip + path: apps/desktop/dist/Bitwarden-${{ env._PACKAGE_VERSION }}-universal-mac.zip + if-no-files-found: error + + - name: Upload .dmg artifact + uses: actions/upload-artifact@6673cd052c4cd6fcf4b4e6e60ea986c889389535 + with: + name: Bitwarden-${{ env._PACKAGE_VERSION }}-universal.dmg + path: apps/desktop/dist/Bitwarden-${{ env._PACKAGE_VERSION }}-universal.dmg + if-no-files-found: error + + - name: Upload .dmg blockmap artifact + uses: actions/upload-artifact@6673cd052c4cd6fcf4b4e6e60ea986c889389535 + with: + name: Bitwarden-${{ env._PACKAGE_VERSION }}-universal.dmg.blockmap + path: apps/desktop/dist/Bitwarden-${{ env._PACKAGE_VERSION }}-universal.dmg.blockmap + if-no-files-found: error + + - name: Upload auto-update artifact + uses: actions/upload-artifact@6673cd052c4cd6fcf4b4e6e60ea986c889389535 + with: + name: ${{ needs.setup.outputs.release_channel }}-mac.yml + path: apps/desktop/dist/${{ needs.setup.outputs.release_channel }}-mac.yml + if-no-files-found: error + + + macos-package-mas: + name: MacOS Package Prod Release Asset + runs-on: macos-11 + needs: + - setup + - macos-build + env: + _PACKAGE_VERSION: ${{ needs.setup.outputs.package_version }} + defaults: + run: + working-directory: apps/desktop + steps: + - name: Checkout repo + uses: actions/checkout@a12a3943b4bdde767164f792f33f40b04645d846 + + - name: Set up Node + uses: actions/setup-node@9ced9a43a244f3ac94f13bfd896db8c8f30da67a # v3.0.0 + with: + cache: 'npm' + cache-dependency-path: '**/package-lock.json' + node-version: '16' + + - name: Set Node options + run: echo "NODE_OPTIONS=--max_old_space_size=4096" >> $GITHUB_ENV + + - name: Install node-gyp + run: | + npm install -g node-gyp + node-gyp install $(node -v) + + - name: Print environment + run: | + node --version + npm --version + echo "GitHub ref: $GITHUB_REF" + echo "GitHub event: $GITHUB_EVENT" + + - name: Get Build Cache + id: build-cache + uses: actions/cache@937d24475381cd9c75ae6db12cb4e79714b926ed + with: + path: apps/desktop/build + key: ${{ runner.os }}-${{ github.run_id }}-build + + - name: Setup Safari Cache + id: safari-cache + uses: actions/cache@937d24475381cd9c75ae6db12cb4e79714b926ed + with: + path: apps/browser/dist/Safari + key: ${{ runner.os }}-${{ github.run_id }}-safari-extension + + - name: Decrypt secrets + env: + DECRYPT_FILE_PASSWORD: ${{ secrets.DECRYPT_FILE_PASSWORD }} + run: | + mkdir -p $HOME/secrets + gpg --quiet --batch --yes --decrypt --passphrase="$DECRYPT_FILE_PASSWORD" \ + --output "$HOME/secrets/bitwarden-desktop-key.p12" \ + "$GITHUB_WORKSPACE/.github/secrets/bitwarden-desktop-key.p12.gpg" + gpg --quiet --batch --yes --decrypt --passphrase="$DECRYPT_FILE_PASSWORD" \ + --output "$HOME/secrets/appstore-app-cert.p12" \ + "$GITHUB_WORKSPACE/.github/secrets/appstore-app-cert.p12.gpg" + gpg --quiet --batch --yes --decrypt --passphrase="$DECRYPT_FILE_PASSWORD" \ + --output "$HOME/secrets/appstore-installer-cert.p12" \ + "$GITHUB_WORKSPACE/.github/secrets/appstore-installer-cert.p12.gpg" + gpg --quiet --batch --yes --decrypt --passphrase="$DECRYPT_FILE_PASSWORD" \ + --output "$HOME/secrets/devid-app-cert.p12" \ + "$GITHUB_WORKSPACE/.github/secrets/devid-app-cert.p12.gpg" + gpg --quiet --batch --yes --decrypt --passphrase="$DECRYPT_FILE_PASSWORD" \ + --output "$HOME/secrets/devid-installer-cert.p12" \ + "$GITHUB_WORKSPACE/.github/secrets/devid-installer-cert.p12.gpg" + gpg --quiet --batch --yes --decrypt --passphrase="$DECRYPT_FILE_PASSWORD" \ + --output "$HOME/secrets/macdev-cert.p12" \ + "$GITHUB_WORKSPACE/.github/secrets/macdev-cert.p12.gpg" + gpg --quiet --batch --yes --decrypt --passphrase="$DECRYPT_FILE_PASSWORD" \ + --output "$HOME/secrets/bitwarden_desktop_appstore.provisionprofile" \ + "$GITHUB_WORKSPACE/.github/secrets/bitwarden_desktop_appstore.provisionprofile.gpg" + + - name: Set up keychain + env: + KEYCHAIN_PASSWORD: ${{ secrets.KEYCHAIN_PASSWORD }} + DESKTOP_KEY_PASSWORD: ${{ secrets.DESKTOP_KEY_PASSWORD }} + DEVID_CERT_PASSWORD: ${{ secrets.DEVID_CERT_PASSWORD }} + APPSTORE_CERT_PASSWORD: ${{ secrets.APPSTORE_CERT_PASSWORD }} + MACDEV_CERT_PASSWORD: ${{ secrets.MACDEV_CERT_PASSWORD }} + APPLE_ID_PASSWORD: ${{ secrets.APPLE_ID_PASSWORD }} + run: | + security create-keychain -p $KEYCHAIN_PASSWORD build.keychain + security default-keychain -s build.keychain + security unlock-keychain -p $KEYCHAIN_PASSWORD build.keychain + security set-keychain-settings -lut 1200 build.keychain + security import "$HOME/secrets/bitwarden-desktop-key.p12" -k build.keychain -P $DESKTOP_KEY_PASSWORD \ + -T /usr/bin/codesign -T /usr/bin/security -T /usr/bin/productbuild + security import "$HOME/secrets/devid-app-cert.p12" -k build.keychain -P $DEVID_CERT_PASSWORD \ + -T /usr/bin/codesign -T /usr/bin/security -T /usr/bin/productbuild + security import "$HOME/secrets/devid-installer-cert.p12" -k build.keychain -P $DEVID_CERT_PASSWORD \ + -T /usr/bin/codesign -T /usr/bin/security -T /usr/bin/productbuild + security import "$HOME/secrets/appstore-app-cert.p12" -k build.keychain -P $APPSTORE_CERT_PASSWORD \ + -T /usr/bin/codesign -T /usr/bin/security -T /usr/bin/productbuild + security import "$HOME/secrets/appstore-installer-cert.p12" -k build.keychain -P $APPSTORE_CERT_PASSWORD \ + -T /usr/bin/codesign -T /usr/bin/security -T /usr/bin/productbuild + security import "$HOME/secrets/macdev-cert.p12" -k build.keychain -P $MACDEV_CERT_PASSWORD \ + -T /usr/bin/codesign -T /usr/bin/security -T /usr/bin/productbuild + security set-key-partition-list -S apple-tool:,apple:,codesign: -s -k $KEYCHAIN_PASSWORD build.keychain + + - name: Set up provisioning profiles + run: | + cp $HOME/secrets/bitwarden_desktop_appstore.provisionprofile \ + $GITHUB_WORKSPACE/apps/desktop/bitwarden_desktop_appstore.provisionprofile + + - name: Increment version + shell: pwsh + env: + BUILD_NUMBER: ${{ needs.setup.outputs.build_number }} + run: | + $package = Get-Content -Raw -Path electron-builder.json | ConvertFrom-Json + $package | Add-Member -MemberType NoteProperty -Name buildVersion -Value "$env:BUILD_NUMBER" + $package | ConvertTo-Json -Depth 32 | Set-Content -Path electron-builder.json + + - name: Install Node dependencies + run: npm ci + working-directory: ./ + + - name: Build + if: steps.build-cache.outputs.cache-hit != 'true' + run: npm run build + + - name: Extract branch name + if: contains(github.ref, 'hotfix-rc') + id: extract_branch + shell: bash + run: echo "##[set-output name=branch;]$(echo ${GITHUB_REF#refs/heads/})" + + - name: Download artifact from hotfix-rc + if: contains(github.ref, 'hotfix-rc') + uses: dawidd6/action-download-artifact@b2abf1705491048a2d7074f7d90513044fd25d39 # v2.19.0 + with: + workflow: build-browser.yml + workflow_conclusion: success + branch: ${{ steps.extract_branch.outputs.branch }} + path: ${{ github.workspace }}/browser-build-artifacts + + - name: Download artifact from rc + if: github.ref == 'refs/heads/rc' + uses: dawidd6/action-download-artifact@b2abf1705491048a2d7074f7d90513044fd25d39 # v2.19.0 + with: + workflow: build-browser.yml + workflow_conclusion: success + branch: rc + path: ${{ github.workspace }}/browser-build-artifacts + + - name: Download artifact from master + if: ${{ github.ref != 'refs/heads/rc' && !contains(github.ref, 'hotfix-rc') }} + uses: dawidd6/action-download-artifact@b2abf1705491048a2d7074f7d90513044fd25d39 # v2.19.0 + with: + workflow: build-browser.yml + workflow_conclusion: success + branch: master + path: ${{ github.workspace }}/browser-build-artifacts + + - name: Unzip Safari artifact + run: | + SAFARI_DIR=$(find $GITHUB_WORKSPACE/browser-build-artifacts -name 'dist-safari-*.zip') + echo $SAFARI_DIR + unzip $SAFARI_DIR/dist-safari.zip -d $GITHUB_WORKSPACE/browser-build-artifacts + + - name: Load Safari extension for App Store + run: | + mkdir PlugIns + cp -r $GITHUB_WORKSPACE/browser-build-artifacts/Safari/mas/build/Release/safari.appex PlugIns/safari.appex + + - name: Build application for App Store + run: npm run pack:mac:mas + env: + APPLE_ID_USERNAME: ${{ secrets.APPLE_ID_USERNAME }} + APPLE_ID_PASSWORD: ${{ secrets.APPLE_ID_PASSWORD }} + + - name: Upload .pkg artifact + uses: actions/upload-artifact@6673cd052c4cd6fcf4b4e6e60ea986c889389535 + with: + name: Bitwarden-${{ env._PACKAGE_VERSION }}-universal.pkg + path: apps/desktop/dist/mas-universal/Bitwarden-${{ env._PACKAGE_VERSION }}-universal.pkg + if-no-files-found: error + + release: + name: MacOS Package Prod Release Asset + runs-on: ubuntu-20.04 + needs: + - setup + - linux + - windows + - macos-build + - macos-package-github + - macos-package-mas + steps: + - name: Login to Azure + uses: Azure/login@ec3c14589bd3e9312b3cc8c41e6860e258df9010 + with: + creds: ${{ secrets.AZURE_PROD_KV_CREDENTIALS }} + + - name: Retrieve secrets + id: retrieve-secrets + uses: Azure/get-keyvault-secrets@b5c723b9ac7870c022b8c35befe620b7009b336f + with: + keyvault: "bitwarden-prod-kv" + secrets: "aws-electron-access-id, aws-electron-access-key, aws-electron-bucket-name" + + - name: Download all artifacts + uses: bitwarden/gh-actions/download-artifacts@23433be15ed6fd046ce12b6889c5184a8d9c8783 + with: + path: apps/desktop/artifacts + + - name: Rename .pkg to .pkg.archive + env: + PKG_VERSION: ${{ steps.version.outputs.version }} + working-directory: apps/desktop/artifacts + run: mv Bitwarden-${{ env.PKG_VERSION }}-universal.pkg Bitwarden-${{ env.PKG_VERSION }}-universal.pkg.archive + + # - name: Publish artifacts to S3 + # 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 }} + # AWS_DEFAULT_REGION: 'us-west-2' + # AWS_S3_BUCKET_NAME: ${{ steps.retrieve-secrets.outputs.aws-electron-bucket-name }} + # working-directory: apps/desktop/artifacts + # run: | + # aws s3 cp ./ $AWS_S3_BUCKET_NAME/desktop/ \ + # --acl "public-read" \ + # --recursive \ + # --quiet \ No newline at end of file diff --git a/.github/workflows/release-desktop.yml b/.github/workflows/release-desktop.yml index 189f6a59578..f6fd411a24a 100644 --- a/.github/workflows/release-desktop.yml +++ b/.github/workflows/release-desktop.yml @@ -13,6 +13,17 @@ on: - Initial Release - Redeploy - Dry Run + snap_publish: + description: 'Publish to snap store' + required: true + default: true + type: boolean + choco_publish: + description: 'Publish to chocolatey store' + required: true + default: true + type: boolean + defaults: run: shell: bash @@ -78,6 +89,7 @@ jobs: secrets: "aws-electron-access-id, aws-electron-access-key, aws-electron-bucket-name" - name: Download all artifacts + if: ${{ github.event.inputs.release_type != 'Dry Run' }} uses: bitwarden/gh-actions/download-artifacts@23433be15ed6fd046ce12b6889c5184a8d9c8783 with: workflow: build-desktop.yml @@ -85,6 +97,15 @@ jobs: branch: ${{ github.ref_name }} path: apps/desktop/artifacts + - name: Download all artifacts + if: ${{ github.event.inputs.release_type == 'Dry Run' }} + uses: bitwarden/gh-actions/download-artifacts@23433be15ed6fd046ce12b6889c5184a8d9c8783 + with: + workflow: build-desktop.yml + workflow_conclusion: success + branch: master + path: apps/desktop/artifacts + - name: Rename .pkg to .pkg.archive env: PKG_VERSION: ${{ steps.version.outputs.version }} @@ -92,6 +113,7 @@ jobs: run: mv Bitwarden-${{ env.PKG_VERSION }}-universal.pkg Bitwarden-${{ env.PKG_VERSION }}-universal.pkg.archive - name: Publish artifacts to S3 + if: ${{ github.event.inputs.release_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 }} @@ -106,7 +128,7 @@ jobs: - name: Create release uses: ncipollo/release-action@95215a3cb6e6a1908b3c44e00b4fdb15548b1e09 # v2.8.5 - if: ${{ steps.release-channel.outputs.channel }} == "latest" + 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 }} @@ -147,6 +169,7 @@ jobs: name: Deploy Snap runs-on: ubuntu-20.04 needs: setup + if: inputs.snap_publish env: _PKG_VERSION: ${{ needs.setup.outputs.release-version }} steps: @@ -175,6 +198,7 @@ jobs: working-directory: apps/desktop - name: Download Snap artifact + if: ${{ github.event.inputs.release_type != 'Dry Run' }} uses: bitwarden/gh-actions/download-artifacts@23433be15ed6fd046ce12b6889c5184a8d9c8783 with: workflow: build-desktop.yml @@ -183,6 +207,16 @@ jobs: artifacts: bitwarden_${{ env._PKG_VERSION }}_amd64.snap path: apps/desktop/dist + - name: Download Snap artifact + if: ${{ github.event.inputs.release_type == 'Dry Run' }} + uses: bitwarden/gh-actions/download-artifacts@23433be15ed6fd046ce12b6889c5184a8d9c8783 + with: + workflow: build-desktop.yml + workflow_conclusion: success + branch: master + artifacts: bitwarden_${{ env._PKG_VERSION }}_amd64.snap + path: apps/desktop/dist + - name: Deploy to Snap Store if: ${{ github.event.inputs.release_type != 'Dry Run' }} run: | @@ -194,12 +228,18 @@ jobs: name: Deploy Choco runs-on: windows-2019 needs: setup + if: inputs.choco_publish env: _PKG_VERSION: ${{ needs.setup.outputs.release-version }} steps: - name: Checkout Repo uses: actions/checkout@5a4ac9002d0be2fb38bd78e4b4dbde5606d7042f # v2.3.4 + - name: Print Environment + run: | + dotnet --version + dotnet nuget --version + - name: Login to Azure uses: Azure/login@24848bc889cfc0a8313c2b3e378ac0d625b9bc16 with: @@ -213,6 +253,7 @@ 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 }} @@ -223,6 +264,7 @@ jobs: working-directory: apps/desktop - name: Download choco artifact + if: ${{ github.event.inputs.release_type != 'Dry Run' }} uses: bitwarden/gh-actions/download-artifacts@23433be15ed6fd046ce12b6889c5184a8d9c8783 with: workflow: build-desktop.yml @@ -231,6 +273,16 @@ jobs: artifacts: bitwarden.${{ env._PKG_VERSION }}.nupkg path: apps/desktop/dist + - name: Download choco artifact + if: ${{ github.event.inputs.release_type == 'Dry Run' }} + uses: bitwarden/gh-actions/download-artifacts@23433be15ed6fd046ce12b6889c5184a8d9c8783 + with: + workflow: build-desktop.yml + workflow_conclusion: success + branch: master + artifacts: bitwarden.${{ env._PKG_VERSION }}.nupkg + path: apps/desktop/dist + - name: Push to Chocolatey if: ${{ github.event.inputs.release_type != 'Dry Run' }} shell: pwsh diff --git a/.github/workflows/release-qa-web.yml b/.github/workflows/release-qa-web.yml index 8f8dfa31d59..d72783ec48a 100644 --- a/.github/workflows/release-qa-web.yml +++ b/.github/workflows/release-qa-web.yml @@ -67,3 +67,54 @@ jobs: kubectl set image -n $_QA_K8S_NAMESPACE deployment/web web=bitwardenqa.azurecr.io/web:$IMAGE_TAG --record kubectl rollout restart -n $_QA_K8S_NAMESPACE deployment/web kubectl rollout status deployment/web -n $_QA_K8S_NAMESPACE + + cfpages-deploy: + name: Deploy Web Vault to QA CloudFlare Pages branch + runs-on: ubuntu-20.04 + steps: + - name: Checkout Repo + uses: actions/checkout@2541b1294d2704b0964813337f33b291d3f8596b # v3.0.2 + + - name: Download latest cloud asset + uses: bitwarden/gh-actions/download-artifacts@c1fa8e09871a860862d6bbe36184b06d2c7e35a8 + with: + workflow: build-web.yml + path: apps/web + workflow_conclusion: success + branch: ${{ github.ref_name }} + artifacts: web-*-cloud-COMMERCIAL.zip + + # This should result in a build directory in the current working directory + - name: Unzip build asset + working-directory: apps/web + run: unzip web-*-cloud-COMMERCIAL.zip + + - name: Checkout Repo + uses: actions/checkout@2541b1294d2704b0964813337f33b291d3f8596b # v3.0.2 + with: + ref: cf-pages-qa + path: deployment + + - name: Setup git config + run: | + git config --global user.name "GitHub Action Bot" + git config --global user.email "41898282+github-actions[bot]@users.noreply.github.com" + git config --global url."https://github.com/".insteadOf ssh://git@github.com/ + git config --global url."https://".insteadOf ssh:// + + - name: Deploy CloudFlare Pages + run: | + rm -rf ./* + cp -R ../apps/web/build/* . + working-directory: deployment + + - name: Push new ver to cf-pages-qa + run: | + if [ -n "$(git status --porcelain)" ]; then + git add . + git commit -m "Deploy ${{ github.ref_name }} to QA Cloudflare pages" + git push -u origin cf-pages-qa + else + echo "No changes to commit!"; + fi + working-directory: deployment diff --git a/.github/workflows/release-web.yml b/.github/workflows/release-web.yml index 3dd5971c90e..1db2b6dbe2a 100644 --- a/.github/workflows/release-web.yml +++ b/.github/workflows/release-web.yml @@ -88,7 +88,6 @@ jobs: docker tag bitwarden/web:latest bitwarden/web:$_RELEASE_VERSION else docker tag bitwarden/web:$_BRANCH_NAME bitwarden/web:$_RELEASE_VERSION - docker tag bitwarden/web:$_BRANCH_NAME bitwarden/web:latest fi - name: Docker Push version and latest image @@ -98,7 +97,6 @@ jobs: DOCKER_CONTENT_TRUST_REPOSITORY_PASSPHRASE: ${{ steps.setup-dct.outputs.dct-delegate-repo-passphrase }} run: | docker push bitwarden/web:$_RELEASE_VERSION - docker push bitwarden/web:latest - name: Log out of Docker and disable Docker Notary run: | @@ -120,16 +118,12 @@ jobs: run: | if [[ "${{ github.event.inputs.release_type }}" == "Dry Run" ]]; then docker tag bitwarden/web:latest $REGISTRY/web:$_RELEASE_VERSION - docker tag bitwarden/web:latest $REGISTRY/web:latest docker tag bitwarden/web:latest $REGISTRY/web-sh:$_RELEASE_VERSION - docker tag bitwarden/web:latest $REGISTRY/web-sh:latest else docker tag bitwarden/web:$_BRANCH_NAME $REGISTRY/web:$_RELEASE_VERSION - docker tag bitwarden/web:$_BRANCH_NAME $REGISTRY/web:latest docker tag bitwarden/web:$_BRANCH_NAME $REGISTRY/web-sh:$_RELEASE_VERSION - docker tag bitwarden/web:$_BRANCH_NAME $REGISTRY/web-sh:latest fi - name: Push version and latest image @@ -138,10 +132,8 @@ jobs: REGISTRY: bitwardenqa.azurecr.io run: | docker push $REGISTRY/web:$_RELEASE_VERSION - docker push $REGISTRY/web:latest docker push $REGISTRY/web-sh:$_RELEASE_VERSION - docker push $REGISTRY/web-sh:latest - name: Log out of Docker run: docker logout @@ -161,6 +153,7 @@ jobs: uses: actions/checkout@2541b1294d2704b0964813337f33b291d3f8596b # v3.0.2 - name: Download latest cloud asset + if: ${{ github.event.inputs.release_type != 'Dry Run' }} uses: bitwarden/gh-actions/download-artifacts@c1fa8e09871a860862d6bbe36184b06d2c7e35a8 with: workflow: build-web.yml @@ -169,6 +162,16 @@ jobs: branch: ${{ github.ref_name }} artifacts: web-*-cloud-COMMERCIAL.zip + - name: Download latest cloud asset + if: ${{ github.event.inputs.release_type == 'Dry Run' }} + uses: bitwarden/gh-actions/download-artifacts@c1fa8e09871a860862d6bbe36184b06d2c7e35a8 + with: + workflow: build-web.yml + path: apps/web + workflow_conclusion: success + branch: master + artifacts: web-*-cloud-COMMERCIAL.zip + # This should result in a build directory in the current working directory - name: Unzip build asset working-directory: apps/web @@ -198,7 +201,10 @@ jobs: git switch -c cf-pages-deploy-$_TAG_VERSION git add . git commit -m "Staging deploy ${{ needs.setup.outputs.release_version }}" - git push -u origin cf-pages-deploy-$_TAG_VERSION + + if [[ "${{ github.event.inputs.release_type }}" != "Dry Run" ]]; then + git push -u origin cf-pages-deploy-$_TAG_VERSION + fi working-directory: deployment - name: Create CloudFlare Pages Deploy PR @@ -222,6 +228,7 @@ jobs: - cfpages-deploy steps: - name: Download latest build artifacts + if: ${{ github.event.inputs.release_type != 'Dry Run' }} uses: bitwarden/gh-actions/download-artifacts@c1fa8e09871a860862d6bbe36184b06d2c7e35a8 with: workflow: build-web.yml @@ -231,6 +238,17 @@ jobs: artifacts: "web-*-selfhosted-COMMERCIAL.zip, web-*-selfhosted-open-source.zip" + - name: Download latest build artifacts + if: ${{ github.event.inputs.release_type == 'Dry Run' }} + uses: bitwarden/gh-actions/download-artifacts@c1fa8e09871a860862d6bbe36184b06d2c7e35a8 + with: + workflow: build-web.yml + path: apps/web/artifacts + workflow_conclusion: success + branch: master + artifacts: "web-*-selfhosted-COMMERCIAL.zip, + web-*-selfhosted-open-source.zip" + - name: Rename assets working-directory: apps/web/artifacts run: | @@ -249,20 +267,3 @@ jobs: apps/web/artifacts/web-${{ needs.setup.outputs.release_version }}-selfhosted-open-source.zip" token: ${{ secrets.GITHUB_TOKEN }} draft: true - - - dry-run: - name: Dry Run Cleanup - runs-on: ubuntu-20.04 - if: ${{ github.event.inputs.release_type == 'Dry Run' }} - env: - _TAG_VERSION: ${{ needs.setup.outputs.tag_version }} - needs: - - setup - - release - steps: - - name: Checkout repo - uses: actions/checkout@2541b1294d2704b0964813337f33b291d3f8596b # v3.0.2 - - - name: Remove cf-pages-deploy branch - run: git push origin --delete cf-pages-deploy-$_TAG_VERSION diff --git a/.github/workflows/version-bump.yml b/.github/workflows/version-bump.yml index 8c657475b4f..1fc0fde1bb3 100644 --- a/.github/workflows/version-bump.yml +++ b/.github/workflows/version-bump.yml @@ -33,23 +33,24 @@ jobs: id: branch env: CLIENT_NAME: ${{ github.event.inputs.client }} + VERSION: ${{ github.event.inputs.version_number }} run: | CLIENT=$(python -c "print('$CLIENT_NAME'.lower())") echo "::set-output name=client::$CLIENT" - git switch -c ${CLIENT}_version_bump_${{ github.event.inputs.version_number }} - git push -u origin ${CLIENT}_version_bump_${{ github.event.inputs.version_number }} - - - name: Checkout Version Branch - uses: actions/checkout@ec3a7ce113134d7a93b817d10a8272cb61118579 - with: - ref: ${{ steps.branch.outputs.client }}_version_bump_${{ github.event.inputs.version_number }} + git switch -c ${CLIENT}_version_bump_${VERSION} ######################## # VERSION BUMP SECTION # ######################## ### Browser + - name: Bump Browser Version + if: ${{ github.event.inputs.client == 'Browser' }} + env: + VERSION: ${{ github.event.inputs.version_number }} + run: npm version --workspace=@bitwarden/browser ${VERSION} + - name: Bump Browser Version - Manifest if: ${{ github.event.inputs.client == 'Browser' }} uses: bitwarden/gh-actions/version-bump@03ad9a873c39cdc95dd8d77dbbda67f84db43945 @@ -57,66 +58,82 @@ jobs: version: ${{ github.event.inputs.version_number }} file_path: "apps/browser/src/manifest.json" + - name: Bump Browser Version - Manifest v3 + if: ${{ github.event.inputs.client == 'Browser' }} + uses: bitwarden/gh-actions/version-bump@03ad9a873c39cdc95dd8d77dbbda67f84db43945 + with: + version: ${{ github.event.inputs.version_number }} + file_path: "apps/browser/src/manifest.v3.json" + - name: Run Prettier after Browser Version Bump if: ${{ github.event.inputs.client == 'Browser' }} run: | npm install -g prettier prettier --write apps/browser/src/manifest.json + prettier --write apps/browser/src/manifest.v3.json ### CLI - - name: Bump CLI Version - Package + - name: Bump CLI Version if: ${{ github.event.inputs.client == 'CLI' }} - uses: bitwarden/gh-actions/version-bump@03ad9a873c39cdc95dd8d77dbbda67f84db43945 - with: - version: ${{ github.event.inputs.version_number }} - file_path: "apps/cli/package.json" - - - name: Bump CLI Version - Package-lock - if: ${{ github.event.inputs.client == 'CLI' }} - uses: bitwarden/gh-actions/version-bump@03ad9a873c39cdc95dd8d77dbbda67f84db43945 - with: - version: ${{ github.event.inputs.version_number }} - file_path: "apps/cli/package-lock.json" + env: + VERSION: ${{ github.event.inputs.version_number }} + run: npm version --workspace=@bitwarden/cli ${VERSION} ### Desktop - - name: Bump Desktop Version - Package + - name: Bump Desktop Version - Root if: ${{ github.event.inputs.client == 'Desktop' }} - uses: bitwarden/gh-actions/version-bump@03ad9a873c39cdc95dd8d77dbbda67f84db43945 - with: - version: ${{ github.event.inputs.version_number }} - file_path: "apps/desktop/src/package.json" + env: + VERSION: ${{ github.event.inputs.version_number }} + run: npm version --workspace=@bitwarden/desktop ${VERSION} + + - name: Bump Desktop Version - App + if: ${{ github.event.inputs.client == 'Desktop' }} + env: + VERSION: ${{ github.event.inputs.version_number }} + run: npm version ${VERSION} + working-directory: "apps/desktop/src" ### Web - - name: Bump Web Version - package.json + - name: Bump Web Version if: ${{ github.event.inputs.client == 'Web' }} - uses: bitwarden/gh-actions/version-bump@03ad9a873c39cdc95dd8d77dbbda67f84db43945 - with: - version: ${{ github.event.inputs.version_number }} - file_path: "apps/web/package.json" - - - name: Bump Web Version - package-lock.json - if: ${{ github.event.inputs.client == 'Web' }} - uses: bitwarden/gh-actions/version-bump@03ad9a873c39cdc95dd8d77dbbda67f84db43945 - with: - version: ${{ github.event.inputs.version_number }} - file_path: "apps/web/package-lock.json" + env: + VERSION: ${{ github.event.inputs.version_number }} + run: npm version --workspace=@bitwarden/web-vault ${VERSION} ######################## - - name: Commit files - env: - CLIENT: ${{ steps.branch.outputs.client }} + - name: Setup git run: | git config --local user.email "41898282+github-actions[bot]@users.noreply.github.com" git config --local user.name "github-actions[bot]" - git commit -m "Bumped ${CLIENT} version to ${{ github.event.inputs.version_number }}" -a - - name: Push changes + - name: Check if version changed + id: version-changed + run: | + if [ -n "$(git status --porcelain)" ]; then + echo "::set-output name=changes_to_commit::TRUE" + else + echo "::set-output name=changes_to_commit::FALSE" + echo "No changes to commit!"; + fi + + - name: Commit files + if: ${{ steps.version-changed.outputs.changes_to_commit == 'TRUE' }} env: CLIENT: ${{ steps.branch.outputs.client }} - run: git push -u origin ${CLIENT}_version_bump_${{ github.event.inputs.version_number }} + VERSION: ${{ github.event.inputs.version_number }} + run: | + git commit -m "Bumped ${CLIENT} version to ${VERSION}" -a + + - name: Push changes + if: ${{ steps.version-changed.outputs.changes_to_commit == 'TRUE' }} + env: + CLIENT: ${{ steps.branch.outputs.client }} + VERSION: ${{ github.event.inputs.version_number }} + run: git push -u origin ${CLIENT}_version_bump_${VERSION} - name: Create Bump Version PR + if: ${{ steps.version-changed.outputs.changes_to_commit == 'TRUE' }} env: PR_BRANCH: "${{ steps.branch.outputs.client }}_version_bump_${{ github.event.inputs.version_number }}" GITHUB_TOKEN: "${{ secrets.GITHUB_TOKEN }}" diff --git a/apps/browser/src/_locales/ar/messages.json b/apps/browser/src/_locales/ar/messages.json index 8fcb5822a75..4f15d3ae058 100644 --- a/apps/browser/src/_locales/ar/messages.json +++ b/apps/browser/src/_locales/ar/messages.json @@ -423,10 +423,13 @@ "invalidEmail": { "message": "Invalid email address." }, - "masterPassRequired": { + "masterPasswordRequired": { "message": "Master password is required." }, - "masterPassLength": { + "confirmMasterPasswordRequired": { + "message": "Master password retype is required." + }, + "masterPasswordMinlength": { "message": "Master password must be at least 8 characters long." }, "masterPassDoesntMatch": { @@ -1480,7 +1483,7 @@ "acceptPolicies": { "message": "By checking this box you agree to the following:" }, - "acceptPoliciesError": { + "acceptPoliciesRequired": { "message": "Terms of Service and Privacy Policy have not been acknowledged." }, "termsOfService": { @@ -1846,7 +1849,7 @@ } } }, - "vaultTimeoutToLarge": { + "vaultTimeoutTooLarge": { "message": "Your vault timeout exceeds the restrictions set by your organization." }, "vaultExportDisabled": { @@ -1964,5 +1967,11 @@ }, "ssoKeyConnectorError": { "message": "Key Connector error: make sure Key Connector is available and working correctly." + }, + "organizationIsDisabled": { + "message": "Organization is disabled." + }, + "disabledOrganizationFilterError": { + "message": "Items in disabled Organizations cannot be accessed. Contact your Organization owner for assistance." } } diff --git a/apps/browser/src/_locales/az/messages.json b/apps/browser/src/_locales/az/messages.json index e5bf3c3de01..7211ea2c44b 100644 --- a/apps/browser/src/_locales/az/messages.json +++ b/apps/browser/src/_locales/az/messages.json @@ -423,10 +423,13 @@ "invalidEmail": { "message": "Etibarsız e-poçt ünvanı." }, - "masterPassRequired": { + "masterPasswordRequired": { "message": "Ana parol lazımdır." }, - "masterPassLength": { + "confirmMasterPasswordRequired": { + "message": "Ana parolun yenidən yazılması lazımdır." + }, + "masterPasswordMinlength": { "message": "Ana parol ən azı 8 simvol uzunluğunda olmalıdır." }, "masterPassDoesntMatch": { @@ -615,7 +618,7 @@ "message": "Konteks menyu seçimlərini göstər" }, "contextMenuItemDesc": { - "message": "Use a secondary click to access password generation and matching logins for the website. " + "message": "Veb sayt üçün parol yaratmaq və uyğunlaşan giriş məlumatlarına müraciət etmək üçün ikinci klikləməni istifadə edin. " }, "defaultUriMatchDetection": { "message": "İlkin URI uyğunluq aşkarlaması", @@ -807,13 +810,13 @@ "message": "Təzələmə tamamlandı" }, "enableAutoTotpCopy": { - "message": "Copy TOTP automatically" + "message": "TOTP-ni avtomatik kopyala" }, "disableAutoTotpCopyDesc": { "message": "Hesabınıza əlavə edilən kimlik təsdiqləyici açarı varsa, giriş məlumatları avto-doldurulanda TOTP təsdiqləmə kodu da avtomatik olaraq lövhəyə kopyalanacaq." }, "enableAutoBiometricsPrompt": { - "message": "Ask for biometrics on launch" + "message": "Açılışda biometrik təsdiqləmə soruş" }, "premiumRequired": { "message": "Premium üzvlük lazımdır" @@ -1034,16 +1037,16 @@ "message": "Bu səyyah bu açılan pəncərədə U2F tələblərini emal edə bilmir. U2F istifadə edərək giriş etmək üçün bu açılan pəncərəni yeni bir pəncərədə açmaq istəyirsiniz?" }, "enableFavicon": { - "message": "Show website icons" + "message": "Veb sayt nişanlarını göstər" }, "faviconDesc": { - "message": "Show a recognizable image next to each login." + "message": "Hər girişin yanında tanına bilən təsvir göstər." }, "enableBadgeCounter": { - "message": "Show badge counter" + "message": "Nişan sayğacını göstər" }, "badgeCounterDesc": { - "message": "Indicate how many logins you have for the current web page." + "message": "Hazırkı veb səhifə üçün neçə giriş olduğunu göstərir." }, "cardholderName": { "message": "Kart sahibinin adı" @@ -1480,7 +1483,7 @@ "acceptPolicies": { "message": "Bu qutunu işarələyərək aşağıdakılarla razılaşırsınız:" }, - "acceptPoliciesError": { + "acceptPoliciesRequired": { "message": "Xidmət Şərtləri və Gizlilik Siyasəti qəbul edilməyib." }, "termsOfService": { @@ -1846,7 +1849,7 @@ } } }, - "vaultTimeoutToLarge": { + "vaultTimeoutTooLarge": { "message": "Anbar vaxt bitişi, təşkilatınız tərəfindən tənzimlənən məhdudiyyətləri aşır." }, "vaultExportDisabled": { @@ -1963,6 +1966,12 @@ "message": "API açar" }, "ssoKeyConnectorError": { - "message": "Key Connector error: make sure Key Connector is available and working correctly." + "message": "Açar bağlayıcı xətası: Açar Bağlayıcının mövcud olduğuna və düzgün işlədiyinə əmin olun." + }, + "organizationIsDisabled": { + "message": "Təşkilat sıradan çıxarıldı." + }, + "disabledOrganizationFilterError": { + "message": "Sıradan çıxarılmış Təşkilatlardakı elementlərə müraciət edilə bilmir. Kömək üçün Təşkilatınızın sahibi ilə əlaqə saxlayın." } } diff --git a/apps/browser/src/_locales/be/messages.json b/apps/browser/src/_locales/be/messages.json index 061897a2a9b..5b957b69c03 100644 --- a/apps/browser/src/_locales/be/messages.json +++ b/apps/browser/src/_locales/be/messages.json @@ -423,11 +423,14 @@ "invalidEmail": { "message": "Памылковы адрас электроннай пошты." }, - "masterPassRequired": { - "message": "Патрабуецца асноўны пароль." + "masterPasswordRequired": { + "message": "Master password is required." }, - "masterPassLength": { - "message": "Асноўны пароль павінен быць даўжынёй не менш за 8 сімвалаў." + "confirmMasterPasswordRequired": { + "message": "Master password retype is required." + }, + "masterPasswordMinlength": { + "message": "Master password must be at least 8 characters long." }, "masterPassDoesntMatch": { "message": "Асноўныя паролі не супадаюць." @@ -1480,8 +1483,8 @@ "acceptPolicies": { "message": "Ставіўшы гэты сцяжок вы пагаджаецеся з наступным:" }, - "acceptPoliciesError": { - "message": "Умовы выкарыстання і Палітыка прыватнасці не былі пацверджаны." + "acceptPoliciesRequired": { + "message": "Terms of Service and Privacy Policy have not been acknowledged." }, "termsOfService": { "message": "Умовы выкарыстання" @@ -1846,7 +1849,7 @@ } } }, - "vaultTimeoutToLarge": { + "vaultTimeoutTooLarge": { "message": "Your vault timeout exceeds the restrictions set by your organization." }, "vaultExportDisabled": { @@ -1964,5 +1967,11 @@ }, "ssoKeyConnectorError": { "message": "Key Connector error: make sure Key Connector is available and working correctly." + }, + "organizationIsDisabled": { + "message": "Organization is disabled." + }, + "disabledOrganizationFilterError": { + "message": "Items in disabled Organizations cannot be accessed. Contact your Organization owner for assistance." } } diff --git a/apps/browser/src/_locales/bg/messages.json b/apps/browser/src/_locales/bg/messages.json index 0ddfe08b3cf..3a514154722 100644 --- a/apps/browser/src/_locales/bg/messages.json +++ b/apps/browser/src/_locales/bg/messages.json @@ -423,11 +423,14 @@ "invalidEmail": { "message": "Недействителна електронна поща." }, - "masterPassRequired": { + "masterPasswordRequired": { "message": "Главната парола е задължителна." }, - "masterPassLength": { - "message": "Главната парола трябва да съдържа поне 8 знака." + "confirmMasterPasswordRequired": { + "message": "Повторното въвеждане на главната парола е задължително." + }, + "masterPasswordMinlength": { + "message": "Master password must be at least 8 characters long." }, "masterPassDoesntMatch": { "message": "Главната парола и потвърждението ѝ не съвпадат." @@ -1480,7 +1483,7 @@ "acceptPolicies": { "message": "Чрез тази отметка вие се съгласявате със следното:" }, - "acceptPoliciesError": { + "acceptPoliciesRequired": { "message": "Условията за използване и политиката за поверителност не бяха приети." }, "termsOfService": { @@ -1846,7 +1849,7 @@ } } }, - "vaultTimeoutToLarge": { + "vaultTimeoutTooLarge": { "message": "Времето за достъп до трезора Ви превишава ограничението, определено от организацията Ви." }, "vaultExportDisabled": { @@ -1964,5 +1967,11 @@ }, "ssoKeyConnectorError": { "message": "Грешка с конектора за ключове: уверете се, че конекторът за ключове е наличен и работи правилно." + }, + "organizationIsDisabled": { + "message": "Organization is disabled." + }, + "disabledOrganizationFilterError": { + "message": "Items in disabled Organizations cannot be accessed. Contact your Organization owner for assistance." } } diff --git a/apps/browser/src/_locales/bn/messages.json b/apps/browser/src/_locales/bn/messages.json index 1e301072251..a9162bb87a2 100644 --- a/apps/browser/src/_locales/bn/messages.json +++ b/apps/browser/src/_locales/bn/messages.json @@ -423,11 +423,14 @@ "invalidEmail": { "message": "অকার্যকর ইমেইল ঠিকানা।" }, - "masterPassRequired": { - "message": "মূল পাসওয়ার্ড প্রয়োজন।" + "masterPasswordRequired": { + "message": "Master password is required." }, - "masterPassLength": { - "message": "মূল পাসওয়ার্ড কমপক্ষে ৮ অক্ষর দীর্ঘ হওয়া উচিত।" + "confirmMasterPasswordRequired": { + "message": "Master password retype is required." + }, + "masterPasswordMinlength": { + "message": "Master password must be at least 8 characters long." }, "masterPassDoesntMatch": { "message": "মূল পাসওয়ার্ড নিশ্চিতকরণ মেলেনি।" @@ -1480,8 +1483,8 @@ "acceptPolicies": { "message": "এই বাক্সটি টিক করে আপনি নিম্নলিখিতগুলিতে সম্মত হন:" }, - "acceptPoliciesError": { - "message": "পরিষেবার শর্তাদি এবং গোপনীয়তা নীতি স্বীকার করা হয়নি।" + "acceptPoliciesRequired": { + "message": "Terms of Service and Privacy Policy have not been acknowledged." }, "termsOfService": { "message": "সেবা পাবার শর্ত" @@ -1846,7 +1849,7 @@ } } }, - "vaultTimeoutToLarge": { + "vaultTimeoutTooLarge": { "message": "Your vault timeout exceeds the restrictions set by your organization." }, "vaultExportDisabled": { @@ -1964,5 +1967,11 @@ }, "ssoKeyConnectorError": { "message": "Key Connector error: make sure Key Connector is available and working correctly." + }, + "organizationIsDisabled": { + "message": "Organization is disabled." + }, + "disabledOrganizationFilterError": { + "message": "Items in disabled Organizations cannot be accessed. Contact your Organization owner for assistance." } } diff --git a/apps/browser/src/_locales/bs/messages.json b/apps/browser/src/_locales/bs/messages.json index 8fcb5822a75..4f15d3ae058 100644 --- a/apps/browser/src/_locales/bs/messages.json +++ b/apps/browser/src/_locales/bs/messages.json @@ -423,10 +423,13 @@ "invalidEmail": { "message": "Invalid email address." }, - "masterPassRequired": { + "masterPasswordRequired": { "message": "Master password is required." }, - "masterPassLength": { + "confirmMasterPasswordRequired": { + "message": "Master password retype is required." + }, + "masterPasswordMinlength": { "message": "Master password must be at least 8 characters long." }, "masterPassDoesntMatch": { @@ -1480,7 +1483,7 @@ "acceptPolicies": { "message": "By checking this box you agree to the following:" }, - "acceptPoliciesError": { + "acceptPoliciesRequired": { "message": "Terms of Service and Privacy Policy have not been acknowledged." }, "termsOfService": { @@ -1846,7 +1849,7 @@ } } }, - "vaultTimeoutToLarge": { + "vaultTimeoutTooLarge": { "message": "Your vault timeout exceeds the restrictions set by your organization." }, "vaultExportDisabled": { @@ -1964,5 +1967,11 @@ }, "ssoKeyConnectorError": { "message": "Key Connector error: make sure Key Connector is available and working correctly." + }, + "organizationIsDisabled": { + "message": "Organization is disabled." + }, + "disabledOrganizationFilterError": { + "message": "Items in disabled Organizations cannot be accessed. Contact your Organization owner for assistance." } } diff --git a/apps/browser/src/_locales/ca/messages.json b/apps/browser/src/_locales/ca/messages.json index 8b1860cd025..94513e302b1 100644 --- a/apps/browser/src/_locales/ca/messages.json +++ b/apps/browser/src/_locales/ca/messages.json @@ -423,11 +423,14 @@ "invalidEmail": { "message": "L'adreça de correu electrònic no és vàlida." }, - "masterPassRequired": { - "message": "La contrasenya mestra és obligatòria." + "masterPasswordRequired": { + "message": "Es requereix la contrasenya mestra." }, - "masterPassLength": { - "message": "La contrasenya mestra ha de contenir almenys 8 caràcters." + "confirmMasterPasswordRequired": { + "message": "Cal tornar a escriure la contrasenya mestra." + }, + "masterPasswordMinlength": { + "message": "La contrasenya ha de contenir almenys 8 caràcters." }, "masterPassDoesntMatch": { "message": "La confirmació de la contrasenya mestra no coincideix." @@ -568,25 +571,25 @@ "description": "This is the folder for uncategorized items" }, "enableAddLoginNotification": { - "message": "Ask to add login" + "message": "Demana d'afegir els inicis de sessió" }, "addLoginNotificationDesc": { "message": "La \"Notificació per afegir inicis de sessió\" demana automàticament que guardeu els nous inicis de sessió a la vostra caixa forta quan inicieu la sessió per primera vegada." }, "showCardsCurrentTab": { - "message": "Show cards on Tab page" + "message": "Mostra les targetes a la pàgina de pestanya" }, "showCardsCurrentTabDesc": { - "message": "List card items on the Tab page for easy auto-fill." + "message": "Llista els elements de la targeta a la pàgina de pestanya per facilitar l'autoemplenat." }, "showIdentitiesCurrentTab": { - "message": "Show identities on Tab page" + "message": "Mostra les identitats a la pàgina de pestanya" }, "showIdentitiesCurrentTabDesc": { - "message": "List identity items on the Tab page for easy auto-fill." + "message": "Llista els elements d'identitat de la pàgina de pestanya per facilitar l'autoemplenat." }, "clearClipboard": { - "message": "Neteja el porta-retalls", + "message": "Buida el porta-retalls", "description": "Clipboard is the operating system thing where you copy/paste data to on your device." }, "clearClipboardDesc": { @@ -600,10 +603,10 @@ "message": "Guarda" }, "enableChangedPasswordNotification": { - "message": "Ask to update existing login" + "message": "Demana d'actualitzar els inicis de sessió existents" }, "changedPasswordNotificationDesc": { - "message": "Ask to update a login's password when a change is detected on a website." + "message": "Demana actualitzar la contrasenya d'inici de sessió quan es detecte un canvi en un lloc web." }, "notificationChangeDesc": { "message": "Voleu actualitzar aquesta contrasenya a Bitwarden?" @@ -612,10 +615,10 @@ "message": "Actualitza" }, "enableContextMenuItem": { - "message": "Show context menu options" + "message": "Mostra les opcions del menú contextual" }, "contextMenuItemDesc": { - "message": "Use a secondary click to access password generation and matching logins for the website. " + "message": "Utilitza un clic secundari per accedir a la generació de contrasenyes i als inicis de sessió coincidents per al lloc web. " }, "defaultUriMatchDetection": { "message": "Detecció de coincidències URI per defecte", @@ -807,13 +810,13 @@ "message": "Actualització completa" }, "enableAutoTotpCopy": { - "message": "Copy TOTP automatically" + "message": "Copia TOTP automaticament" }, "disableAutoTotpCopyDesc": { "message": "Si el vostre inici de sessió té una clau d'autenticació associada, el codi de verificació TOTP es copiarà al vostre porta-retalls quan s'òmpliga automàticament l'inici de sessió." }, "enableAutoBiometricsPrompt": { - "message": "Ask for biometrics on launch" + "message": "Demaneu dades biometriques en iniciar" }, "premiumRequired": { "message": "Premium requerit" @@ -1034,16 +1037,16 @@ "message": "Aquest navegador no pot processar sol·licituds U2F en aquesta finestra emergent. Voleu obrir l'emergent en una finestra nova per poder iniciar la sessió mitjançant U2F?" }, "enableFavicon": { - "message": "Show website icons" + "message": "Mostra les icones dels llocs web" }, "faviconDesc": { - "message": "Show a recognizable image next to each login." + "message": "Mostra una imatge reconeixible al costat de cada inici de sessió." }, "enableBadgeCounter": { - "message": "Show badge counter" + "message": "Mostra el comptador insígnia" }, "badgeCounterDesc": { - "message": "Indicate how many logins you have for the current web page." + "message": "Indiqueu quants inicis de sessió teniu per a la pàgina web actual." }, "cardholderName": { "message": "Nom del titular de la targeta" @@ -1480,7 +1483,7 @@ "acceptPolicies": { "message": "Si activeu aquesta casella, indiqueu que esteu d’acord amb el següent:" }, - "acceptPoliciesError": { + "acceptPoliciesRequired": { "message": "No s’han reconegut les condicions del servei i la declaració de privadesa." }, "termsOfService": { @@ -1846,7 +1849,7 @@ } } }, - "vaultTimeoutToLarge": { + "vaultTimeoutTooLarge": { "message": "El temps d'espera de la caixa forta supera les restriccions establertes per la vostra organització." }, "vaultExportDisabled": { @@ -1964,5 +1967,11 @@ }, "ssoKeyConnectorError": { "message": "Error del connector de claus: assegureu-vos que el connector de claus està disponible i funcionant correctament." + }, + "organizationIsDisabled": { + "message": "Organization is disabled." + }, + "disabledOrganizationFilterError": { + "message": "Items in disabled Organizations cannot be accessed. Contact your Organization owner for assistance." } } diff --git a/apps/browser/src/_locales/cs/messages.json b/apps/browser/src/_locales/cs/messages.json index 21376841a65..c9abaa4e2a5 100644 --- a/apps/browser/src/_locales/cs/messages.json +++ b/apps/browser/src/_locales/cs/messages.json @@ -423,11 +423,14 @@ "invalidEmail": { "message": "Neplatná e-mailová adresa." }, - "masterPassRequired": { - "message": "Hlavní heslo je povinné." + "masterPasswordRequired": { + "message": "Master password is required." }, - "masterPassLength": { - "message": "Hlavní heslo musí obsahovat alespoň 8 znaků." + "confirmMasterPasswordRequired": { + "message": "Master password retype is required." + }, + "masterPasswordMinlength": { + "message": "Master password must be at least 8 characters long." }, "masterPassDoesntMatch": { "message": "Potvrzení hlavního hesla se neshoduje." @@ -1480,8 +1483,8 @@ "acceptPolicies": { "message": "Zaškrtnutím tohoto políčka souhlasím s následujícím:" }, - "acceptPoliciesError": { - "message": "Podmínky použití a zásady ochrany osobních údajů nebyly odsouhlaseny." + "acceptPoliciesRequired": { + "message": "Terms of Service and Privacy Policy have not been acknowledged." }, "termsOfService": { "message": "Podmínky použití" @@ -1846,8 +1849,8 @@ } } }, - "vaultTimeoutToLarge": { - "message": "Časový limit vašeho trezoru překračuje omezení stanovená vaší organizací." + "vaultTimeoutTooLarge": { + "message": "Your vault timeout exceeds the restrictions set by your organization." }, "vaultExportDisabled": { "message": "Export trezoru zakázán" @@ -1950,19 +1953,25 @@ "message": "Forwarded Email Alias" }, "forwardedEmailDesc": { - "message": "Generate an email alias with an external forwarding service." + "message": "Vygenerovat e-mailový alias pomocí externí služby pro přesměrování." }, "hostname": { "message": "Hostname", "description": "Part of a URL." }, "apiAccessToken": { - "message": "API Access Token" + "message": "Přístupový token" }, "apiKey": { - "message": "API Key" + "message": "API klíč" }, "ssoKeyConnectorError": { "message": "Key Connector error: make sure Key Connector is available and working correctly." + }, + "organizationIsDisabled": { + "message": "Organization is disabled." + }, + "disabledOrganizationFilterError": { + "message": "Items in disabled Organizations cannot be accessed. Contact your Organization owner for assistance." } } diff --git a/apps/browser/src/_locales/da/messages.json b/apps/browser/src/_locales/da/messages.json index b852955131e..f113322b475 100644 --- a/apps/browser/src/_locales/da/messages.json +++ b/apps/browser/src/_locales/da/messages.json @@ -218,7 +218,7 @@ "message": "Bitwarden web-boks" }, "importItems": { - "message": "Importer elementer" + "message": "Importér elementer" }, "select": { "message": "Vælg" @@ -423,11 +423,14 @@ "invalidEmail": { "message": "Ugyldig e-mailadresse." }, - "masterPassRequired": { - "message": "Hovedadgangskode er påkrævet." + "masterPasswordRequired": { + "message": "Master password is required." }, - "masterPassLength": { - "message": "Hovedadgangskoden skal være på mindst 8 tegn." + "confirmMasterPasswordRequired": { + "message": "Master password retype is required." + }, + "masterPasswordMinlength": { + "message": "Master password must be at least 8 characters long." }, "masterPassDoesntMatch": { "message": "De to adgangskoder matcher ikke." @@ -568,22 +571,22 @@ "description": "This is the folder for uncategorized items" }, "enableAddLoginNotification": { - "message": "Ask to add login" + "message": "Bed om at tilføje login" }, "addLoginNotificationDesc": { - "message": "\"Tilføj login notifikation\" spørger dig automatisk om du vil gemme nye logins til din boks, når du logger ind med dem for første gang." + "message": "Bed om at tilføje et element, hvis et ikke findes i din boks." }, "showCardsCurrentTab": { - "message": "Show cards on Tab page" + "message": "Vis kort på fanebladet" }, "showCardsCurrentTabDesc": { - "message": "List card items on the Tab page for easy auto-fill." + "message": "Vis kortelementer på fanebladet for nem auto-udfyldning." }, "showIdentitiesCurrentTab": { - "message": "Show identities on Tab page" + "message": "Vis identiteter på fanebladet" }, "showIdentitiesCurrentTabDesc": { - "message": "List identity items on the Tab page for easy auto-fill." + "message": "Vis identitetselementer på fanebladet for nem auto-udfyldning." }, "clearClipboard": { "message": "Ryd udklipsholder", @@ -600,10 +603,10 @@ "message": "Gem" }, "enableChangedPasswordNotification": { - "message": "Ask to update existing login" + "message": "Bed om at opdatere eksisterende login" }, "changedPasswordNotificationDesc": { - "message": "Ask to update a login's password when a change is detected on a website." + "message": "Bed om at opdatere et logins adgangskode, når der registreres en ændring på en hjemmeside." }, "notificationChangeDesc": { "message": "Vil du opdatere denne adgangskode i Bitwarden?" @@ -612,10 +615,10 @@ "message": "Opdatér" }, "enableContextMenuItem": { - "message": "Show context menu options" + "message": "Vis indstillinger i kontekstmenuen" }, "contextMenuItemDesc": { - "message": "Use a secondary click to access password generation and matching logins for the website. " + "message": "Brug et sekundært klik for at få adgang til adgangskodegenerering og matchende logins til hjemmesiden." }, "defaultUriMatchDetection": { "message": "Standard URI matchmetode", @@ -807,13 +810,13 @@ "message": "Opdatering færdig" }, "enableAutoTotpCopy": { - "message": "Copy TOTP automatically" + "message": "Kopiér TOTP automatisk" }, "disableAutoTotpCopyDesc": { - "message": "Hvis dit login har en autentificeringsnøgle tilknyttet, kopieres TOTP verifikationskoden automatisk til din udklipsholder når du auto-udfylder login." + "message": "Hvis et login har en autentificeringsnøgle, så kopiér TOTP-bekræftelseskoden til din udklipsholder, når du auto-udfylder login." }, "enableAutoBiometricsPrompt": { - "message": "Ask for biometrics on launch" + "message": "Bed om biometri ved start" }, "premiumRequired": { "message": "Premium påkrævet" @@ -951,10 +954,10 @@ "message": "Miljøets URLs er blevet gemt." }, "enableAutoFillOnPageLoad": { - "message": "Aktivér Auto-udfyld ved sideindlæsning" + "message": "Auto-udfyld ved sideindlæsning" }, "enableAutoFillOnPageLoadDesc": { - "message": "Hvis en login-formular er opdaget, så udfør automatisk en auto-udfyld når hjemmesiden indlæses." + "message": "Hvis der registreres en loginformular, så auto-udfyld, når websiden indlæses." }, "experimentalFeature": { "message": "Dette er i øjeblikket en eksperimentel funktion. Brug på egen risiko." @@ -963,7 +966,7 @@ "message": "Standardindstilling for autofyld for loginelementer" }, "defaultAutoFillOnPageLoadDesc": { - "message": "Når du har aktiveret auto-udfyldning ved sideindlæsning, kan du aktivere eller deaktivere funktionen for individuelle loginelementer. Dette er standardindstillingen for loginelementer, der ikke er konfigureret separat." + "message": "Du kan deaktivere auto-udfyld ved sideindlæsning for individuelle login-elementer fra elementets redigeringsvisning." }, "itemAutoFillOnPageLoad": { "message": "Auto-udfyld ved sideindlæsning (hvis aktiveret i Indstillinger)" @@ -1034,16 +1037,16 @@ "message": "Denne browser kan ikke behandle U2F-anmodninger i dette popup-vindue. Vil du åbne denne popup i et nyt vindue, så du kan logge ind ved hjælp af U2F?" }, "enableFavicon": { - "message": "Show website icons" + "message": "Vis webstedsikoner" }, "faviconDesc": { - "message": "Show a recognizable image next to each login." + "message": "Vis et genkendeligt billede ud for hvert login." }, "enableBadgeCounter": { - "message": "Show badge counter" + "message": "Vis badge-tæller" }, "badgeCounterDesc": { - "message": "Indicate how many logins you have for the current web page." + "message": "Vis hvor mange logins du har til den aktuelle webside." }, "cardholderName": { "message": "Kortindehaverens navn" @@ -1480,8 +1483,8 @@ "acceptPolicies": { "message": "Ved at markere dette felt accepterer du følgende:" }, - "acceptPoliciesError": { - "message": "Servicevilkår og fortrolighedspolitik er ikke blevet bekræftet." + "acceptPoliciesRequired": { + "message": "Terms of Service and Privacy Policy have not been acknowledged." }, "termsOfService": { "message": "Servicevilkår" @@ -1846,7 +1849,7 @@ } } }, - "vaultTimeoutToLarge": { + "vaultTimeoutTooLarge": { "message": "Din boks-timeout overskrider de begrænsninger, der er fastsat af din organisation." }, "vaultExportDisabled": { @@ -1964,5 +1967,11 @@ }, "ssoKeyConnectorError": { "message": "Key Connector-fejl: Sørg for, at Key Connector er tilgængelig og fungerer korrekt." + }, + "organizationIsDisabled": { + "message": "Organization is disabled." + }, + "disabledOrganizationFilterError": { + "message": "Items in disabled Organizations cannot be accessed. Contact your Organization owner for assistance." } } diff --git a/apps/browser/src/_locales/de/messages.json b/apps/browser/src/_locales/de/messages.json index deb394e192d..72ad4910457 100644 --- a/apps/browser/src/_locales/de/messages.json +++ b/apps/browser/src/_locales/de/messages.json @@ -423,10 +423,13 @@ "invalidEmail": { "message": "Ungültige E-Mail Adresse." }, - "masterPassRequired": { - "message": "Das Master-Passwort wird benötigt." + "masterPasswordRequired": { + "message": "Das Master-Passwort ist erforderlich." }, - "masterPassLength": { + "confirmMasterPasswordRequired": { + "message": "Erneute Eingabe des Master-Passworts ist erforderlich." + }, + "masterPasswordMinlength": { "message": "Das Master-Passwort muss mindestens 8 Zeichen lang sein." }, "masterPassDoesntMatch": { @@ -1253,7 +1256,7 @@ "description": "Domain name. Ex. website.com" }, "host": { - "message": "Server", + "message": "Host", "description": "A URL's host value. For example, the host of https://sub.domain.com:443 is 'sub.domain.com:443'." }, "exact": { @@ -1480,7 +1483,7 @@ "acceptPolicies": { "message": "Durch Anwählen dieses Kästchens erklären Sie sich mit folgendem einverstanden:" }, - "acceptPoliciesError": { + "acceptPoliciesRequired": { "message": "Die Nutzungsbedingungen und Datenschutzerklärung wurden nicht akzeptiert." }, "termsOfService": { @@ -1846,7 +1849,7 @@ } } }, - "vaultTimeoutToLarge": { + "vaultTimeoutTooLarge": { "message": "Dein Tresor-Timeout überschreitet die von deinem Unternehmen festgelegten Beschränkungen." }, "vaultExportDisabled": { @@ -1964,5 +1967,11 @@ }, "ssoKeyConnectorError": { "message": "Key Connector Fehler: Stelle sicher, dass der Key Connector verfügbar ist und einwandfrei funktioniert." + }, + "organizationIsDisabled": { + "message": "Organisation ist deaktiviert." + }, + "disabledOrganizationFilterError": { + "message": "Auf Einträge in deaktivierten Organisationen kann nicht zugegriffen werden. Kontaktiere deinen Organisationseigentümer für Unterstützung." } } diff --git a/apps/browser/src/_locales/el/messages.json b/apps/browser/src/_locales/el/messages.json index a0cb192ad7b..0c35736ac98 100644 --- a/apps/browser/src/_locales/el/messages.json +++ b/apps/browser/src/_locales/el/messages.json @@ -423,11 +423,14 @@ "invalidEmail": { "message": "Μη έγκυρη διεύθυνση e-mail." }, - "masterPassRequired": { - "message": "Απαιτείται κύριος κωδικός πρόσβασης." + "masterPasswordRequired": { + "message": "Master password is required." }, - "masterPassLength": { - "message": "Ο κύριος κωδικός πρέπει να έχει μήκος τουλάχιστον 8 χαρακτήρες." + "confirmMasterPasswordRequired": { + "message": "Master password retype is required." + }, + "masterPasswordMinlength": { + "message": "Master password must be at least 8 characters long." }, "masterPassDoesntMatch": { "message": "Η επιβεβαίωση κύριου κωδικού δεν ταιριάζει." @@ -1480,8 +1483,8 @@ "acceptPolicies": { "message": "Επιλέγοντας αυτό το πλαίσιο, συμφωνείτε με τα εξής:" }, - "acceptPoliciesError": { - "message": "Οι Όροι Παροχής Υπηρεσιών και η Πολιτική Απορρήτου δεν έχουν αναγνωριστεί." + "acceptPoliciesRequired": { + "message": "Terms of Service and Privacy Policy have not been acknowledged." }, "termsOfService": { "message": "Όροι Χρήσης" @@ -1846,8 +1849,8 @@ } } }, - "vaultTimeoutToLarge": { - "message": "Το χρονικό όριο του vault σας υπερβαίνει τους περιορισμούς που έχει ορίσει ο οργανισμός σας." + "vaultTimeoutTooLarge": { + "message": "Your vault timeout exceeds the restrictions set by your organization." }, "vaultExportDisabled": { "message": "Εξαγωγή vault Απενεργοποιημένη" @@ -1964,5 +1967,11 @@ }, "ssoKeyConnectorError": { "message": "Σφάλμα Key Connector: βεβαιωθείτε ότι το Key Connector είναι διαθέσιμο και λειτουργεί σωστά." + }, + "organizationIsDisabled": { + "message": "Organization is disabled." + }, + "disabledOrganizationFilterError": { + "message": "Items in disabled Organizations cannot be accessed. Contact your Organization owner for assistance." } } diff --git a/apps/browser/src/_locales/en/messages.json b/apps/browser/src/_locales/en/messages.json index 63464b4de8f..4592e295b8f 100644 --- a/apps/browser/src/_locales/en/messages.json +++ b/apps/browser/src/_locales/en/messages.json @@ -423,10 +423,13 @@ "invalidEmail": { "message": "Invalid email address." }, - "masterPassRequired": { + "masterPasswordRequired": { "message": "Master password is required." }, - "masterPassLength": { + "confirmMasterPasswordRequired": { + "message": "Master password retype is required." + }, + "masterPasswordMinlength": { "message": "Master password must be at least 8 characters long." }, "masterPassDoesntMatch": { @@ -1480,7 +1483,7 @@ "acceptPolicies": { "message": "By checking this box you agree to the following:" }, - "acceptPoliciesError": { + "acceptPoliciesRequired": { "message": "Terms of Service and Privacy Policy have not been acknowledged." }, "termsOfService": { @@ -1964,5 +1967,14 @@ }, "ssoKeyConnectorError": { "message": "Key Connector error: make sure Key Connector is available and working correctly." + }, + "organizationIsDisabled": { + "message": "Organization is disabled." + }, + "disabledOrganizationFilterError" : { + "message" : "Items in disabled Organizations cannot be accessed. Contact your Organization owner for assistance." + }, + "cardBrandMir": { + "message": "Mir" } } diff --git a/apps/browser/src/_locales/en_GB/messages.json b/apps/browser/src/_locales/en_GB/messages.json index 8e8dd1a1d27..1c9762b9dcb 100644 --- a/apps/browser/src/_locales/en_GB/messages.json +++ b/apps/browser/src/_locales/en_GB/messages.json @@ -423,10 +423,13 @@ "invalidEmail": { "message": "Invalid email address." }, - "masterPassRequired": { + "masterPasswordRequired": { "message": "Master password is required." }, - "masterPassLength": { + "confirmMasterPasswordRequired": { + "message": "Master password retype is required." + }, + "masterPasswordMinlength": { "message": "Master password must be at least 8 characters long." }, "masterPassDoesntMatch": { @@ -1480,8 +1483,8 @@ "acceptPolicies": { "message": "By checking this box you agree to the following:" }, - "acceptPoliciesError": { - "message": "Terms of service and privacy policy have not been acknowledged." + "acceptPoliciesRequired": { + "message": "Terms of Service and Privacy Policy have not been acknowledged." }, "termsOfService": { "message": "Terms of service" @@ -1846,7 +1849,7 @@ } } }, - "vaultTimeoutToLarge": { + "vaultTimeoutTooLarge": { "message": "Your vault timeout exceeds the restrictions set by your organisation." }, "vaultExportDisabled": { @@ -1964,5 +1967,11 @@ }, "ssoKeyConnectorError": { "message": "Key Connector error: make sure Key Connector is available and working correctly." + }, + "organizationIsDisabled": { + "message": "Organisation is disabled." + }, + "disabledOrganizationFilterError": { + "message": "Items in disabled Organisations cannot be accessed. Contact your Organisation owner for assistance." } } diff --git a/apps/browser/src/_locales/en_IN/messages.json b/apps/browser/src/_locales/en_IN/messages.json index f5f8847096e..0bd32b98111 100644 --- a/apps/browser/src/_locales/en_IN/messages.json +++ b/apps/browser/src/_locales/en_IN/messages.json @@ -423,10 +423,13 @@ "invalidEmail": { "message": "Invalid email address." }, - "masterPassRequired": { + "masterPasswordRequired": { "message": "Master password is required." }, - "masterPassLength": { + "confirmMasterPasswordRequired": { + "message": "Master password retype is required." + }, + "masterPasswordMinlength": { "message": "Master password must be at least 8 characters long." }, "masterPassDoesntMatch": { @@ -1480,7 +1483,7 @@ "acceptPolicies": { "message": "By checking this box you agree to the following:" }, - "acceptPoliciesError": { + "acceptPoliciesRequired": { "message": "Terms of Service and Privacy Policy have not been acknowledged." }, "termsOfService": { @@ -1846,7 +1849,7 @@ } } }, - "vaultTimeoutToLarge": { + "vaultTimeoutTooLarge": { "message": "Your vault timeout exceeds the restrictions set by your organization." }, "vaultExportDisabled": { @@ -1964,5 +1967,11 @@ }, "ssoKeyConnectorError": { "message": "Key Connector error: make sure Key Connector is available and working correctly." + }, + "organizationIsDisabled": { + "message": "Organization is disabled." + }, + "disabledOrganizationFilterError": { + "message": "Items in disabled Organizations cannot be accessed. Contact your Organization owner for assistance." } } diff --git a/apps/browser/src/_locales/es/messages.json b/apps/browser/src/_locales/es/messages.json index 7c7be429c62..e4794ed2407 100644 --- a/apps/browser/src/_locales/es/messages.json +++ b/apps/browser/src/_locales/es/messages.json @@ -245,7 +245,7 @@ "message": "Números (0-9)" }, "specialCharacters": { - "message": "Carácteres especiales (!@#$%^&*)" + "message": "Caracteres especiales (!@#$%^&*)" }, "numWords": { "message": "Número de palabras" @@ -423,11 +423,14 @@ "invalidEmail": { "message": "Correo electrónico no válido." }, - "masterPassRequired": { - "message": "Contraseña maestra requerida." + "masterPasswordRequired": { + "message": "Se requiere una contraseña maestra." }, - "masterPassLength": { - "message": "La contraseña maestra debe tener al menos 8 caracteres." + "confirmMasterPasswordRequired": { + "message": "Se requiere volver a teclear la contraseña maestra." + }, + "masterPasswordMinlength": { + "message": "Master password must be at least 8 characters long." }, "masterPassDoesntMatch": { "message": "La confirmación de contraseña maestra no coincide." @@ -537,7 +540,7 @@ "message": "Elemento editado" }, "deleteItemConfirmation": { - "message": "¿Seguro que quieres enviarlo a la papelera?" + "message": "¿Estás seguro de que quieres eliminar este elemento?" }, "deletedItem": { "message": "Elemento enviado a la papelera" @@ -549,7 +552,7 @@ "message": "¿Estás seguro de que quieres sobreescribir la contraseña actual?" }, "overwriteUsername": { - "message": "Reemplazar nombre de usuario" + "message": "Sobrescribir nombre de usuario" }, "overwriteUsernameConfirmation": { "message": "¿Estás seguro de que quieres reemplazar el nombre de usuario actual?" @@ -568,22 +571,22 @@ "description": "This is the folder for uncategorized items" }, "enableAddLoginNotification": { - "message": "Ask to add login" + "message": "Pedir que se añada el inicio de sesión" }, "addLoginNotificationDesc": { "message": "La opción \"Notificación para añadir entradas\" pregunta automáticamente si quieres guardar nuevas entradas en tu caja fuerte cuando te identificas en un sitio web por primera vez." }, "showCardsCurrentTab": { - "message": "Show cards on Tab page" + "message": "Mostrar las tarjetas en la pestaña" }, "showCardsCurrentTabDesc": { - "message": "List card items on the Tab page for easy auto-fill." + "message": "Listar los elementos de tarjetas en la página para facilitar el auto-rellenado." }, "showIdentitiesCurrentTab": { - "message": "Show identities on Tab page" + "message": "Mostrar las identidades en la página" }, "showIdentitiesCurrentTabDesc": { - "message": "List identity items on the Tab page for easy auto-fill." + "message": "Listar los elementos de identidad en la página para facilitar el auto-rellenado." }, "clearClipboard": { "message": "Vaciar portapapeles", @@ -600,22 +603,22 @@ "message": "Sí, guardar ahora" }, "enableChangedPasswordNotification": { - "message": "Ask to update existing login" + "message": "Solicitar la actualización de los datos de iniciode sesión existentes" }, "changedPasswordNotificationDesc": { - "message": "Ask to update a login's password when a change is detected on a website." + "message": "Solicitar la actualización de los datos de iniciode sesión existentes cuuando se detecte un cambio en un sitio web." }, "notificationChangeDesc": { "message": "¿Desea actualizar esta contraseña en Bitwarden?" }, "notificationChangeSave": { - "message": "Actualizado" + "message": "Actualizar" }, "enableContextMenuItem": { - "message": "Show context menu options" + "message": "Mostrar las opciones de menú contextuales" }, "contextMenuItemDesc": { - "message": "Use a secondary click to access password generation and matching logins for the website. " + "message": "Haga clic con el botón secundario para acceder a la generación de contraseñas y a los inicios de sesión correspondientes al sitio web. " }, "defaultUriMatchDetection": { "message": "Detección por defecto de coincidencia de URI", @@ -807,13 +810,13 @@ "message": "Actualización completada" }, "enableAutoTotpCopy": { - "message": "Copy TOTP automatically" + "message": "Copiar TOTP automáticamente" }, "disableAutoTotpCopyDesc": { "message": "Si tu entrada tiene una clave de autenticación adjunta, el código de verificación TOTP es copiado automáticamente al portapapeles cuando autorellenas una entrada." }, "enableAutoBiometricsPrompt": { - "message": "Ask for biometrics on launch" + "message": "Pedir datos biométricos al ejecutar" }, "premiumRequired": { "message": "Premium requerido" @@ -1034,16 +1037,16 @@ "message": "Este navegador no puede procesar las peticiones U2F en esta ventana emergente. ¿Desea abrir esta ventana emergente en una nueva ventana para que pueda iniciar sesión usando U2F?" }, "enableFavicon": { - "message": "Show website icons" + "message": "Mostrar los iconos del sitio web" }, "faviconDesc": { - "message": "Show a recognizable image next to each login." + "message": "Mostrar una imagen reconocible junto a cada inicio de sesión." }, "enableBadgeCounter": { - "message": "Show badge counter" + "message": "Mostrar el contador numérico" }, "badgeCounterDesc": { - "message": "Indicate how many logins you have for the current web page." + "message": "Indique cuántos inicios de sesión tiene para la página web actual." }, "cardholderName": { "message": "Nombre en la tarjeta" @@ -1480,8 +1483,8 @@ "acceptPolicies": { "message": "Al seleccionar esta casilla, acepta lo siguiente:" }, - "acceptPoliciesError": { - "message": "Todavía no has aceptado los términos del servicio y la política de privacidad." + "acceptPoliciesRequired": { + "message": "No ha aceptado los términos del servicio y la política de privacidad." }, "termsOfService": { "message": "Términos y condiciones del servicio" @@ -1846,7 +1849,7 @@ } } }, - "vaultTimeoutToLarge": { + "vaultTimeoutTooLarge": { "message": "El tiempo de espera de tu caja fuerte excede las restricciones establecidas por tu organización." }, "vaultExportDisabled": { @@ -1964,5 +1967,11 @@ }, "ssoKeyConnectorError": { "message": "Error en el conector de claves: asegúrate de que el conector de claves está disponible y que funciona correctamente." + }, + "organizationIsDisabled": { + "message": "Organization is disabled." + }, + "disabledOrganizationFilterError": { + "message": "Items in disabled Organizations cannot be accessed. Contact your Organization owner for assistance." } } diff --git a/apps/browser/src/_locales/et/messages.json b/apps/browser/src/_locales/et/messages.json index a1be1609b7b..c079b17f7ee 100644 --- a/apps/browser/src/_locales/et/messages.json +++ b/apps/browser/src/_locales/et/messages.json @@ -423,10 +423,13 @@ "invalidEmail": { "message": "Vigane e-posti aadress." }, - "masterPassRequired": { + "masterPasswordRequired": { "message": "Vajalik on ülemparooli sisestamine." }, - "masterPassLength": { + "confirmMasterPasswordRequired": { + "message": "Vajalik on ülemparooli uuesti sisestamine." + }, + "masterPasswordMinlength": { "message": "Ülemparool peab olema vähemalt 8 tähemärgi pikkune." }, "masterPassDoesntMatch": { @@ -574,16 +577,16 @@ "message": "\"Lisa konto andmed\" teavitus ilmub pärast esimest sisselogimist ning võimaldab kontoandmeid automaatselt Bitwardenisse lisada." }, "showCardsCurrentTab": { - "message": "Kuva kaardiandmed hoidla vaates" + "message": "Kuva \"Kaart\" vaates kaardiandmed" }, "showCardsCurrentTabDesc": { - "message": "Kuvab hoidla lehel kaardiandmed, et neid saaks kiiresti sisestada" + "message": "Kuvab \"Kaart\" vaates kaardiandmeid, et neid saaks kiiresti sisestada" }, "showIdentitiesCurrentTab": { - "message": "Kuva hoidla vaates identiteete" + "message": "Kuva \"Kaart\" vaates identiteete" }, "showIdentitiesCurrentTabDesc": { - "message": "List identity items on the Tab page for easy auto-fill." + "message": "Kuvab \"Kaart\" vaates identiteete, et neid saaks kiiresti sisestada" }, "clearClipboard": { "message": "Lõikelaua sisu kustutamine", @@ -1480,7 +1483,7 @@ "acceptPolicies": { "message": "Märkeruudu markeerimisel nõustud järgnevaga:" }, - "acceptPoliciesError": { + "acceptPoliciesRequired": { "message": "Kasutustingimuste ja Privaatsuspoliitikaga pole nõustutud." }, "termsOfService": { @@ -1846,8 +1849,8 @@ } } }, - "vaultTimeoutToLarge": { - "message": "Valitud hoidla ajalõpp ei ole organisatsiooni poolt määratud reeglitega kooskõlas. " + "vaultTimeoutTooLarge": { + "message": "Valitud hoidla ajalõpp ei ole organisatsiooni poolt määratud reeglitega kooskõlas." }, "vaultExportDisabled": { "message": "Hoidla eksportimine on väljalülitatud" @@ -1964,5 +1967,11 @@ }, "ssoKeyConnectorError": { "message": "Key Connectori viga: veendu, et Key Connector on saadaval ja töötab korrektselt." + }, + "organizationIsDisabled": { + "message": "Organisatsiooni ligipääs on keelatud." + }, + "disabledOrganizationFilterError": { + "message": "Organisatsiooni alla kuuluvatele kirjetele ei ole ligipääsu. Kontakteeru oma organisatsiooni omanikuga." } } diff --git a/apps/browser/src/_locales/eu/messages.json b/apps/browser/src/_locales/eu/messages.json index cb7ecda5b7d..453ba87bebe 100644 --- a/apps/browser/src/_locales/eu/messages.json +++ b/apps/browser/src/_locales/eu/messages.json @@ -11,7 +11,7 @@ "description": "Extension description" }, "loginOrCreateNewAccount": { - "message": "Identifika zaitez edo sortu kontu berri bat zure kutxa gotorrera sartzeko." + "message": "Saioa hasi edo sortu kontu berri bat zure kutxa gotorrera sartzeko." }, "createAccount": { "message": "Sortu kontua" @@ -89,7 +89,7 @@ "message": "Kopiatu segurtasun kodea (CVV)" }, "autoFill": { - "message": "Osatze automatikoa" + "message": "Auto-betetzea" }, "generatePasswordCopied": { "message": "Sortu pasahitza (kopiatuta)" @@ -98,7 +98,7 @@ "message": "Eremu pertsonalizatuaren izena kopiatu" }, "noMatchingLogins": { - "message": "Bat datozen sarrerarik gabe" + "message": "Bat datozen saio-hasierarik gabe" }, "unlockVaultMenu": { "message": "Desblokeatu kutxa gotorra" @@ -107,10 +107,10 @@ "message": "Hasi saioa zure kutxa gotorrean" }, "autoFillInfo": { - "message": "Ez dago automatikoki betetzeko sarrerarik nabigatzailearen uneko fitxan." + "message": "Ez dago auto-betetzeko saio-hasierarik nabigatzailearen uneko fitxan." }, "addLogin": { - "message": "Sarrera gehitu" + "message": "Saio-hasiera gehitu" }, "addItem": { "message": "Gehitu elementua" @@ -140,7 +140,7 @@ "message": "Egiaztatze-kodea" }, "confirmIdentity": { - "message": "Jarraitzeko, berretsi zure nortasuna." + "message": "Jarraitzeko, berretsi zure identitatea." }, "account": { "message": "Kontua" @@ -157,7 +157,7 @@ "description": "A 'fingerprint phrase' is a unique word phrase (similar to a passphrase) that a user can use to authenticate their public key with another user, for the purposes of sharing." }, "twoStepLogin": { - "message": "Bi pausoko saio hasiera" + "message": "Bi urratseko egiaztatzea" }, "logOut": { "message": "Itxi saioa" @@ -212,7 +212,7 @@ "description": "Short for 'Password Generator'." }, "passGenInfo": { - "message": "Pasahitz sendoak eta bakarrak sortzen ditu automatikoki zure sarbideetarako." + "message": "Automatikoki pasahitz sendo eta bakarrak sortzen ditu zure saio-hasieratarako." }, "bitWebVault": { "message": "Bitwarden kutxa gotorra" @@ -339,10 +339,10 @@ "message": "Zure web nabigatzaileak ez du onartzen arbelean erraz kopiatzea. Eskuz kopiatu." }, "verifyIdentity": { - "message": "Zure nortasuna egiaztatu" + "message": "Zure identitatea egiaztatu" }, "yourVaultIsLocked": { - "message": "Zure kutxa gotorra blokeatuta dago. Egiaztatu zure nortasuna jarraitzeko." + "message": "Zure kutxa gotorra blokeatuta dago. Egiaztatu zure identitatea jarraitzeko." }, "unlock": { "message": "Desblokeatu" @@ -423,10 +423,13 @@ "invalidEmail": { "message": "Email helbide baliogabea" }, - "masterPassRequired": { + "masterPasswordRequired": { "message": "Pasahitz nagusia derrigorrezkoa da." }, - "masterPassLength": { + "confirmMasterPasswordRequired": { + "message": "Pasahitz nagusia berridaztea derrigorrezkoa da." + }, + "masterPasswordMinlength": { "message": "Pasahitz nagusiak gutxienez 8 karaktere izan behar ditu." }, "masterPassDoesntMatch": { @@ -439,10 +442,10 @@ "message": "Mezu elektroniko bat bidali dizugu zure pasahitz nagusiaren pistarekin." }, "verificationCodeRequired": { - "message": "Egiaztapen-kodea behar da." + "message": "Egiaztatze-kodea behar da." }, "invalidVerificationCode": { - "message": "Egiaztapen-kodea ez da baliozkoa" + "message": "Egiaztatze-kodea ez da baliozkoa" }, "valueCopied": { "message": "$VALUE$ kopiatuta", @@ -455,7 +458,7 @@ } }, "autofillError": { - "message": "Ezin izan da orri honetan hautatutako elementua automatikoki bete. Kopiatu eta itsatsi informazioa dagokion tokian." + "message": "Ezin izan da orri honetan hautatutako elementua auto-bete. Kopiatu eta itsatsi informazioa dagokion tokian." }, "loggedOut": { "message": "Saioa itxita" @@ -485,34 +488,34 @@ "message": "Aldatu pasahitz nagusia" }, "changeMasterPasswordConfirmation": { - "message": "You can change your master password on the bitwarden.com web vault. Do you want to visit the website now?" + "message": "Zure pasahitz nagusia alda dezakezu bitwarden.com webgunean. Orain joan nahi duzu webgunera?" }, "twoStepLoginConfirmation": { - "message": "Two-step login makes your account more secure by requiring you to verify your login with another device such as a security key, authenticator app, SMS, phone call, or email. Two-step login can be enabled on the bitwarden.com web vault. Do you want to visit the website now?" + "message": "Bi urratseko egiaztatzea dela eta, zure kontua seguruagoa da, beste aplikazio/gailu batekin saioa hastea eskatzen baitizu; adibidez, segurtasun kode, baimentze aplikazio, SMS, telefono dei edo posta elektroniko bidez. Bi urratseko egiaztatzea bitwarden.com webgunean aktibatu daiteke. Orain joan nahi duzu webgunera?" }, "editedFolder": { - "message": "Edited folder" + "message": "Karpeta editatuta" }, "deleteFolderConfirmation": { - "message": "Are you sure you want to delete this folder?" + "message": "Ziur al zaude karpeta hau ezabatu nahi duzula?" }, "deletedFolder": { - "message": "Deleted folder" + "message": "Karpeta ezabatuta" }, "gettingStartedTutorial": { - "message": "Getting Started Tutorial" + "message": "Lehen urratsetako tutoriala" }, "gettingStartedTutorialVideo": { - "message": "Watch our getting started tutorial to learn how to get the most out of the browser extension." + "message": "Ikusi lehen urratsetako tutoriala nabigatzailearen gehigarriari ahalik eta etekin handiena nola atera ikasteko." }, "syncingComplete": { - "message": "Syncing complete" + "message": "Sinkronizatu da" }, "syncingFailed": { - "message": "Syncing failed" + "message": "Sinkronizazioak huts egin du" }, "passwordCopied": { - "message": "Password copied" + "message": "Pasahitza kopiatuta" }, "uri": { "message": "URI" @@ -528,162 +531,162 @@ } }, "newUri": { - "message": "New URI" + "message": "IRI berria" }, "addedItem": { - "message": "Added item" + "message": "Elementua gehituta" }, "editedItem": { - "message": "Edited item" + "message": "Elementua editatuta" }, "deleteItemConfirmation": { - "message": "Do you really want to send to the trash?" + "message": "Ziur zaude elementu hau zakarrontzira bidali nahi duzula?" }, "deletedItem": { - "message": "Sent item to trash" + "message": "Elementua zakarrontzira bidalia" }, "overwritePassword": { - "message": "Overwrite Password" + "message": "Berridatzi pasahitza" }, "overwritePasswordConfirmation": { - "message": "Are you sure you want to overwrite the current password?" + "message": "Ziur al zaude pasahitza berridatzi nahi duzula?" }, "overwriteUsername": { - "message": "Overwrite Username" + "message": "Erabiltzaile-izena berridatzi" }, "overwriteUsernameConfirmation": { - "message": "Are you sure you want to overwrite the current username?" + "message": "Ziur al zaude erabiltzaile-izena berridatzi nahi duzula?" }, "searchFolder": { - "message": "Search folder" + "message": "Bilatu karpeta" }, "searchCollection": { - "message": "Search collection" + "message": "Bilatu bilduma" }, "searchType": { - "message": "Search type" + "message": "Bilaketa mota" }, "noneFolder": { - "message": "No Folder", + "message": "Karpetarik ez", "description": "This is the folder for uncategorized items" }, "enableAddLoginNotification": { - "message": "Ask to add login" + "message": "Galdetu saio-hasiera gehitzeko" }, "addLoginNotificationDesc": { - "message": "Ask to add an item if one isn't found in your vault." + "message": "Elementu bat gehitu nahi duzun galdetu, elementu hau zure kutxa gotorrean ez badago." }, "showCardsCurrentTab": { - "message": "Show cards on Tab page" + "message": "Erakutsi txartelak fitxa orrian" }, "showCardsCurrentTabDesc": { - "message": "List card items on the Tab page for easy auto-fill." + "message": "Erakutsi elementuen txartelak fitxa orrian, erraz auto-betetzeko." }, "showIdentitiesCurrentTab": { - "message": "Show identities on Tab page" + "message": "Erakutsi identitateak fitxa orrian" }, "showIdentitiesCurrentTabDesc": { - "message": "List identity items on the Tab page for easy auto-fill." + "message": "Erakutsi identitateak fitxa orrian, erraz auto-betetzeko." }, "clearClipboard": { - "message": "Clear clipboard", + "message": "Hustu arbela", "description": "Clipboard is the operating system thing where you copy/paste data to on your device." }, "clearClipboardDesc": { - "message": "Automatically clear copied values from your clipboard.", + "message": "Ezabatu automatikoki arbelean kopiatutako balioak.", "description": "Clipboard is the operating system thing where you copy/paste data to on your device." }, "notificationAddDesc": { - "message": "Should Bitwarden remember this password for you?" + "message": "Bitwardenek pasahitz hau gogoratu beharko lizuke?" }, "notificationAddSave": { - "message": "Save" + "message": "Gorde" }, "enableChangedPasswordNotification": { - "message": "Ask to update existing login" + "message": "Galdetu uneko saio-hasiera eguneratzeko" }, "changedPasswordNotificationDesc": { - "message": "Ask to update a login's password when a change is detected on a website." + "message": "Galdetu saio-hasiera baten pasahitza eguneratzeko, webgune batean aldaketaren bat atzematen denean." }, "notificationChangeDesc": { - "message": "Do you want to update this password in Bitwarden?" + "message": "Bitwardenen pasahitz hau eguneratu nahi duzu?" }, "notificationChangeSave": { - "message": "Update" + "message": "Eguneratu" }, "enableContextMenuItem": { - "message": "Show context menu options" + "message": "Erakutsi laster-menuko aukerak" }, "contextMenuItemDesc": { - "message": "Use a secondary click to access password generation and matching logins for the website. " + "message": "Erabili bigarren mailako klika webgunerako pasahitzak eta saio-hasierak sortzeko." }, "defaultUriMatchDetection": { - "message": "Default URI match detection", + "message": "Lehenetsitako detekzioa URI kointzidentziarako", "description": "Default URI match detection for auto-fill." }, "defaultUriMatchDetectionDesc": { - "message": "Choose the default way that URI match detection is handled for logins when performing actions such as auto-fill." + "message": "Hautatu auto-betetzea bezalako saio-hasierako ekintzetarako erabiliko den URI kointzidentzia detektatzeko modu lehenetsia." }, "theme": { - "message": "Theme" + "message": "Gaia" }, "themeDesc": { - "message": "Change the application's color theme." + "message": "Aldatu aplikaziorako kolore gaia." }, "dark": { - "message": "Dark", + "message": "Iluna", "description": "Dark color" }, "light": { - "message": "Light", + "message": "Argia", "description": "Light color" }, "solarizedDark": { - "message": "Solarized dark", + "message": "Solarized iluna", "description": "'Solarized' is a noun and the name of a color scheme. It should not be translated." }, "exportVault": { - "message": "Export vault" + "message": "Esportatu kutxa gotorra" }, "fileFormat": { - "message": "File Format" + "message": "Fitxategiaren formatua" }, "warning": { - "message": "WARNING", + "message": "KONTUZ", "description": "WARNING (should stay in capitalized letters if the language permits)" }, "confirmVaultExport": { - "message": "Confirm Vault Export" + "message": "Baieztatu kutxa gotorra esportatzea" }, "exportWarningDesc": { - "message": "This export contains your vault data in an unencrypted format. You should not store or send the exported file over unsecure channels (such as email). Delete it immediately after you are done using it." + "message": "Esportazio honek kutxa gotorraren datuak zifratu gabeko formatuan biltzen ditu. Ez zenuke gorde edo kanal ez-seguruetaik (posta elektronikoa, adibidez) bidali behar. Erabili eta berehala ezabatu." }, "encExportKeyWarningDesc": { - "message": "This export encrypts your data using your account's encryption key. If you ever rotate your account's encryption key you should export again since you will not be able to decrypt this export file." + "message": "Esportazio honek zure datuak enkriptatzen ditu zure kontuaren zifratze-kodea erabiliz. Inoiz zure kontuko zifratze-gakoa aldatuz gero, berriro esportatu beharko duzu, ezin izango baituzu fitxategi hori deszifratu." }, "encExportAccountWarningDesc": { - "message": "Account encryption keys are unique to each Bitwarden user account, so you can't import an encrypted export into a different account." + "message": "Kontua zifratzeko gakoak Bitwarden erabiltzaile bakoitzarentzako bakarrik dira; beraz, ezin da inportatu beste kontu batean zifratutako esportazio bat." }, "exportMasterPassword": { - "message": "Enter your master password to export your vault data." + "message": "Sartu pasahitz nagusia kutxa gotorreko datuak esportatzeko." }, "shared": { - "message": "Shared" + "message": "Partekatua" }, "learnOrg": { - "message": "Learn about organizations" + "message": "Erakundeak ezagutu" }, "learnOrgConfirmation": { - "message": "Bitwarden allows you to share your vault items with others by using an organization. Would you like to visit the bitwarden.com website to learn more?" + "message": "Bitwardek kutxa gotorreko elementuak beste batzuekin partekatzeko aukera ematen dizu erakunde bat erabiliz. Gehiago jakiteko, bitwarden.com webgunea bisitatu nahi duzu?" }, "moveToOrganization": { - "message": "Move to Organization" + "message": "Mugitu erakundera" }, "share": { - "message": "Share" + "message": "Partekatu" }, "movedItemToOrg": { - "message": "$ITEMNAME$ moved to $ORGNAME$", + "message": "$ITEMNAME$ $ORGNAME$-ra mugituta", "placeholders": { "itemname": { "content": "$1", @@ -696,106 +699,106 @@ } }, "moveToOrgDesc": { - "message": "Choose an organization that you wish to move this item to. Moving to an organization transfers ownership of the item to that organization. You will no longer be the direct owner of this item once it has been moved." + "message": "Aukeratu elementu hau zein erakundetara eraman nahi duzun. Erakunde batera pasatzeak elementuaren jabetza erakunde horretara transferitzen du. Zu ez zara elementu honen jabe zuzena izango mugitzen duzunean." }, "learnMore": { - "message": "Learn more" + "message": "Gehiago ikasi" }, "authenticatorKeyTotp": { - "message": "Authenticator Key (TOTP)" + "message": "Baimentze kodea (TOTP)" }, "verificationCodeTotp": { - "message": "Verification Code (TOTP)" + "message": "Egiaztatze kodea" }, "copyVerificationCode": { - "message": "Copy Verification Code" + "message": "Kopiatu egiaztatze-kodea" }, "attachments": { - "message": "Attachments" + "message": "Eranskinak" }, "deleteAttachment": { - "message": "Delete attachment" + "message": "Ezabatu eranskinak" }, "deleteAttachmentConfirmation": { - "message": "Are you sure you want to delete this attachment?" + "message": "Ziur zaude eranskina ezabatu nahi duzula?" }, "deletedAttachment": { - "message": "Deleted attachment" + "message": "Eranskina ezabatuta" }, "newAttachment": { - "message": "Add New Attachment" + "message": "Gehitu eranskin berria" }, "noAttachments": { - "message": "No attachments." + "message": "Ez dago eranskinik" }, "attachmentSaved": { - "message": "The attachment has been saved." + "message": "Eranskina gorde da." }, "file": { - "message": "File" + "message": "Fitxategia" }, "selectFile": { - "message": "Select a file." + "message": "Hautatu fitxategia." }, "maxFileSize": { - "message": "Maximum file size is 500 MB." + "message": "Eranskinaren gehienezko tamaina 500MB." }, "featureUnavailable": { - "message": "Feature Unavailable" + "message": "Ezaugarria ez dago erabilgarri" }, "updateKey": { - "message": "You cannot use this feature until you update your encryption key." + "message": "Ezin duzu ezaugarri hau erabili enkriptazio kodea eguneratu arte." }, "premiumMembership": { - "message": "Premium membership" + "message": "Premium bazkidea" }, "premiumManage": { - "message": "Manage Membership" + "message": "Bazkidetza kudeatu" }, "premiumManageAlert": { - "message": "You can manage your membership on the bitwarden.com web vault. Do you want to visit the website now?" + "message": "Zure bazkidetza bitwarden.com webguneko kutxa gotorrean kudeatu dezakezu. Orain bisitatu nahi duzu webgunea?" }, "premiumRefresh": { - "message": "Refresh Membership" + "message": "Eguneratu bazkidetza" }, "premiumNotCurrentMember": { - "message": "You are not currently a premium member." + "message": "Orain ez zara premium bazkide." }, "premiumSignUpAndGet": { - "message": "Sign up for a premium membership and get:" + "message": "Erregistra zaitez premium bazkide gisa eta honakoa lortu:" }, "ppremiumSignUpStorage": { - "message": "1 GB encrypted storage for file attachments." + "message": "Eranskinentzako 1GB-eko enkriptatutako biltegia." }, "ppremiumSignUpTwoStep": { - "message": "Additional two-step login options such as YubiKey, FIDO U2F, and Duo." + "message": "YubiKey, FIDO U2F eta Duo bezalako saio-hasieratarako bi urratseko egiaztatze aukerak." }, "ppremiumSignUpReports": { - "message": "Password hygiene, account health, and data breach reports to keep your vault safe." + "message": "Pasahitzaren higienea, kontuaren egoera eta datu-bortxaketen txostenak, kutxa gotorra seguru mantentzeko." }, "ppremiumSignUpTotp": { - "message": "TOTP verification code (2FA) generator for logins in your vault." + "message": "TOTP (2FA) egiaztatze-kode sortzailea gotor kutxako erregistroetarako." }, "ppremiumSignUpSupport": { - "message": "Priority customer support." + "message": "Lehentasunezko bezeroarentzako arreta." }, "ppremiumSignUpFuture": { - "message": "All future premium features. More coming soon!" + "message": "Etorkizuneko premium ezaugarri guztiak. Laister gehiago!" }, "premiumPurchase": { - "message": "Purchase Premium" + "message": "Premium erosi" }, "premiumPurchaseAlert": { - "message": "You can purchase premium membership on the bitwarden.com web vault. Do you want to visit the website now?" + "message": "Zure premium bazkidetza bitwarden.com webguneko kutxa gotorrean ordaindu dezakezu. Orain bisitatu nahi duzu webgunea?" }, "premiumCurrentMember": { - "message": "You are a premium member!" + "message": "Premium bazkide zara!" }, "premiumCurrentMemberThanks": { - "message": "Thank you for supporting Bitwarden." + "message": "Eskerrik asko Bitwarden babesteagatik." }, "premiumPrice": { - "message": "All for just $PRICE$ /year!", + "message": "Dena, urtean $PRICE$gatik!", "placeholders": { "price": { "content": "$1", @@ -804,28 +807,28 @@ } }, "refreshComplete": { - "message": "Refresh complete" + "message": "Eguneratzea eginda" }, "enableAutoTotpCopy": { - "message": "Copy TOTP automatically" + "message": "Kopiatu TOTO automatikoki" }, "disableAutoTotpCopyDesc": { - "message": "If a login has an authenticator key, copy the TOTP verification code to your clip-board when you auto-fill the login." + "message": "Saio-hasiera batek baimentze-kodea badu, TOTP egiaztatze-kodea arbelean automatikoki kopiatuko da saio-hasiera bat auto-betetzean." }, "enableAutoBiometricsPrompt": { - "message": "Ask for biometrics on launch" + "message": "Biometria eskatu saioa hastean" }, "premiumRequired": { - "message": "Premium Required" + "message": "Premium izatea beharrezkoa da" }, "premiumRequiredDesc": { - "message": "A premium membership is required to use this feature." + "message": "Premium bazkidetza beharrezkoa da ezaugarri hau erabiltzeko." }, "enterVerificationCodeApp": { - "message": "Enter the 6 digit verification code from your authenticator app." + "message": "Sartu zure baimentze-aplikazioaren 6 digituko egiaztatze-kodea." }, "enterVerificationCodeEmail": { - "message": "Enter the 6 digit verification code that was emailed to $EMAIL$.", + "message": "Sartu $EMAIL$-era bidalitako 6 digituko egiaztatze-kodea.", "placeholders": { "email": { "content": "$1", @@ -834,7 +837,7 @@ } }, "verificationCodeEmailSent": { - "message": "Verification email sent to $EMAIL$.", + "message": "Egiaztatze emaila $EMAIL$-era bidalia.", "placeholders": { "email": { "content": "$1", @@ -843,397 +846,397 @@ } }, "rememberMe": { - "message": "Remember me" + "message": "Gogora nazazu" }, "sendVerificationCodeEmailAgain": { - "message": "Send verification code email again" + "message": "Berbidali email bidezko egiaztatze-kodea." }, "useAnotherTwoStepMethod": { - "message": "Use another two-step login method" + "message": "Erabili bi urratseko egiaztatzeko beste modu bat." }, "insertYubiKey": { - "message": "Insert your YubiKey into your computer's USB port, then touch its button." + "message": "Sartu zure YubiKey-a ordenagailuko USB portuan, ondoren, sakatu bere botoia." }, "insertU2f": { - "message": "Insert your security key into your computer's USB port. If it has a button, touch it." + "message": "Sartu zure segurtasun giltza ordenagailuaren USB portuan. Botoia badu, sakatu ezazu." }, "webAuthnNewTab": { - "message": "To start the WebAuthn 2FA verification. Click the button below to open a new tab and follow the instructions provided in the new tab." + "message": "WebAuthn 2FA egiaztatzea hasteko. Egin klik beheko botoian fitxa berria irekitzeko eta jarraitu fitxa berriko jarraibideei." }, "webAuthnNewTabOpen": { - "message": "Open new tab" + "message": "Ireki fitxa berria" }, "webAuthnAuthenticate": { - "message": "Authenticate WebAuthn" + "message": "WebAuthn baimendu" }, "loginUnavailable": { - "message": "Login Unavailable" + "message": "Ez dago eskuragarri saio-hasierarik" }, "noTwoStepProviders": { - "message": "This account has two-step login enabled, however, none of the configured two-step providers are supported by this web browser." + "message": "Kontu honek bi urratseko egiaztatzea du gaituta, baina konfiguratutako bi urratseko egiaztatzea ez da web-nabigatzaile honekin bateragarria." }, "noTwoStepProviders2": { - "message": "Please use a supported web browser (such as Chrome) and/or add additional providers that are better supported across web browsers (such as an authenticator app)." + "message": "Mesedez, erabili nabigatzaile bateragarri bat (adibidez, Chrome) eta/edo gehitu bateragarritasun obea duten nabigatzaile bidezko (baimentze-aplikazio gisa) baimentze modu gehigarriak." }, "twoStepOptions": { - "message": "Two-step Login Options" + "message": "Bi urratseko egiaztatzearen aukerak" }, "recoveryCodeDesc": { - "message": "Lost access to all of your two-factor providers? Use your recovery code to disable all two-factor providers from your account." + "message": "Bi urratseko egiaztatzeko modu guztietarako sarbidea galdu duzu? Erabili zure berreskuratze-kodea zure kontuko bi urratseko egiaztatze hornitzaile guztiak desaktibatzeko." }, "recoveryCodeTitle": { - "message": "Recovery Code" + "message": "Berreskuratze-kodea" }, "authenticatorAppTitle": { - "message": "Authenticator App" + "message": "Baimentze aplikazioa" }, "authenticatorAppDesc": { - "message": "Use an authenticator app (such as Authy or Google Authenticator) to generate time-based verification codes.", + "message": "Erabili baimentze-aplikazio bat (adibidez, Authy edo Google Authenticator) denboran oinarritutako egiaztatze-kodeak sortzeko.", "description": "'Authy' and 'Google Authenticator' are product names and should not be translated." }, "yubiKeyTitle": { - "message": "YubiKey OTP Security Key" + "message": "YubiKey OTP segurtasun giltza" }, "yubiKeyDesc": { - "message": "Use a YubiKey to access your account. Works with YubiKey 4, 4 Nano, 4C, and NEO devices." + "message": "Erabili YubiKey zure kontuan sartzeko. YubiKey 4, 4 Nano, 4C eta NEO gailuekin dabil." }, "duoDesc": { - "message": "Verify with Duo Security using the Duo Mobile app, SMS, phone call, or U2F security key.", + "message": "Egiaztatu Duo Securityrekin Duo Mobile aplikazioa, SMS, telefono deia edo U2F segurtasun-gakoa erabiliz.", "description": "'Duo Security' and 'Duo Mobile' are product names and should not be translated." }, "duoOrganizationDesc": { - "message": "Verify with Duo Security for your organization using the Duo Mobile app, SMS, phone call, or U2F security key.", + "message": "Egiaztatu zure erakunderako Duo Securityrekin Duo Mobile aplikazioa, SMS, telefono deia edo U2F segurtasun-gakoa erabiliz.", "description": "'Duo Security' and 'Duo Mobile' are product names and should not be translated." }, "webAuthnTitle": { "message": "FIDO2 WebAuthn" }, "webAuthnDesc": { - "message": "Use any WebAuthn enabled security key to access your account." + "message": "Erabili gaitutako edozein WebAuthn segurtasun kode zure kontura sartzeko" }, "emailTitle": { - "message": "Email" + "message": "Emaila" }, "emailDesc": { - "message": "Verification codes will be emailed to you." + "message": "Egiaztatze-kodeak email bidez bidaliko dira." }, "selfHostedEnvironment": { - "message": "Self-hosted Environment" + "message": "Ostatze ingurune propioa" }, "selfHostedEnvironmentFooter": { - "message": "Specify the base URL of your on-premises hosted Bitwarden installation." + "message": "Bitwarden instalatzeko, zehaztu ostatze propioaren oinarrizko URL-a." }, "customEnvironment": { - "message": "Custom Environment" + "message": "Ingurune pertsonalizatua" }, "customEnvironmentFooter": { - "message": "For advanced users. You can specify the base URL of each service independently." + "message": "Erabiltzaile aurreratuentzat. Zerbitzu bakoitzarentzako oinarrizko URL-a zehaztu dezakezu independienteki." }, "baseUrl": { - "message": "Server URL" + "message": "Zerbitzariaren URL-a" }, "apiUrl": { - "message": "API Server URL" + "message": "API zerbitzariaren URL-a" }, "webVaultUrl": { - "message": "Web Vault Server URL" + "message": "Web kutxa gotorreko zerbitzariaren URL-a" }, "identityUrl": { - "message": "Identity Server URL" + "message": "Identitate zerbitzariaren URL-a" }, "notificationsUrl": { - "message": "Notifications Server URL" + "message": "Jakinarazpenen zerbitzariaren URL-a" }, "iconsUrl": { - "message": "Icons Server URL" + "message": "Ikonoen zerbitzariaren URL-a" }, "environmentSaved": { - "message": "The environment URLs have been saved." + "message": "Inguruneko URL-ak gorde dira." }, "enableAutoFillOnPageLoad": { - "message": "Auto-fill on page load" + "message": "Auto-bete orrialdea kargatzean" }, "enableAutoFillOnPageLoadDesc": { - "message": "If a login form is detected, auto-fill when the web page loads." + "message": "Saio-hasierako formulario bat detektatzen bada, auto-bete webgunea kargatzen denean." }, "experimentalFeature": { - "message": "This is currently an experimental feature. Use at your own risk." + "message": "Hau ezaugarri esperimental bat da. Zure ardurapean erabili." }, "defaultAutoFillOnPageLoad": { - "message": "Default autofill setting for login items" + "message": "Saio-hasierako elementuetarako lehenetsitako auto-betetzearen konfigurazioa" }, "defaultAutoFillOnPageLoadDesc": { - "message": "You can turn off auto-fill on page load for individual login items from the item's Edit view." + "message": "Orrialdearen kargatze aukeretan auto-betetzea aktibatu ondoren, banakako saio-hasierak aktibatu edo desaktibatu ditzakezu." }, "itemAutoFillOnPageLoad": { - "message": "Auto-fill on page load (if enabled in Options)" + "message": "Auto-bete orrialdea kargatzean (ezarpenetan gaituta badago)" }, "autoFillOnPageLoadUseDefault": { - "message": "Use default setting" + "message": "Erabili ezarpen lehenetsiak" }, "autoFillOnPageLoadYes": { - "message": "Auto-fill on page load" + "message": "Auto-bete orrialdea kargatzean" }, "autoFillOnPageLoadNo": { - "message": "Do not auto-fill on page load" + "message": "Ez auto-bete orrialdea kargatzean" }, "commandOpenPopup": { - "message": "Open vault popup" + "message": "Leiho gainjarrian ireki kutxa gotorra" }, "commandOpenSidebar": { - "message": "Open vault in sidebar" + "message": "Alboko barran ireki kutxa gotorra" }, "commandAutofillDesc": { - "message": "Auto-fill the last used login for the current website" + "message": "Uneko webgunerako erabilitako azken saio-hastea auto-bete" }, "commandGeneratePasswordDesc": { - "message": "Generate and copy a new random password to the clipboard" + "message": "Zorizko pasahitz berria sortu eta kopiatu arbelean" }, "commandLockVaultDesc": { - "message": "Lock the vault" + "message": "Blokeatu kutxa gotorra" }, "privateModeWarning": { - "message": "Private mode support is experimental and some features are limited." + "message": "Modu pribatuko euskarria esperimentala da eta ezaugarri batzuk mugatuak dira." }, "customFields": { - "message": "Custom Fields" + "message": "Eremu pertsonalizatuak" }, "copyValue": { - "message": "Copy Value" + "message": "Kopiatu balioa" }, "value": { - "message": "Value" + "message": "Balioa" }, "newCustomField": { - "message": "New Custom Field" + "message": "Eremu pertsonalizatu berria" }, "dragToSort": { - "message": "Drag to sort" + "message": "Arrastatu txukuntzeko" }, "cfTypeText": { - "message": "Text" + "message": "Testua" }, "cfTypeHidden": { - "message": "Hidden" + "message": "Ezkutatua" }, "cfTypeBoolean": { - "message": "Boolean" + "message": "Boolearra" }, "cfTypeLinked": { - "message": "Linked", + "message": "Lotuta", "description": "This describes a field that is 'linked' (tied) to another field." }, "linkedValue": { - "message": "Linked value", + "message": "Balioa lotuta", "description": "This describes a value that is 'linked' (tied) to another value." }, "popup2faCloseMessage": { - "message": "Clicking outside the popup window to check your email for your verification code will cause this popup to close. Do you want to open this popup in a new window so that it does not close?" + "message": "Leiho gainjarritik kanpora klik eginez gero, zure posta elektronikoa egiaztatzeko leiho gainjarria itxi egingo da. Leiho berri batean ireki nahi duzu leiho gainjarri hau itxi ez dadin?" }, "popupU2fCloseMessage": { - "message": "This browser cannot process U2F requests in this popup window. Do you want to open this popup in a new window so that you can log in using U2F?" + "message": "Nabigatzaile honek ezin ditu U2F eskaerak prozesatu leiho gainjarri honetan. Leiho berri batean ireki nahi duzu leiho gainjarri hau saioa U2F erabiliz hasi ahal izateko?" }, "enableFavicon": { - "message": "Show website icons" + "message": "Erakutsi webguneko ikonoak" }, "faviconDesc": { - "message": "Show a recognizable image next to each login." + "message": "Erakutsi irudi bat saio-hasiera bakoitzaren ondoan." }, "enableBadgeCounter": { - "message": "Show badge counter" + "message": "Erakutsi txartelen kontagailua" }, "badgeCounterDesc": { - "message": "Indicate how many logins you have for the current web page." + "message": "Adierazi zenbat saio-hasiera dituzun uneko webgunerako." }, "cardholderName": { - "message": "Cardholder Name" + "message": "Txartelaren titularraren izena" }, "number": { - "message": "Number" + "message": "Zenbakia" }, "brand": { - "message": "Brand" + "message": "Marka" }, "expirationMonth": { - "message": "Expiration Month" + "message": "Iraungitze hilabetea" }, "expirationYear": { - "message": "Expiration Year" + "message": "Iraungitze urtea" }, "expiration": { - "message": "Expiration" + "message": "Iraungitze data" }, "january": { - "message": "January" + "message": "Urtarrila" }, "february": { - "message": "February" + "message": "Otsaila" }, "march": { - "message": "March" + "message": "Martxoa" }, "april": { - "message": "April" + "message": "Apirila" }, "may": { - "message": "May" + "message": "Maiatza" }, "june": { - "message": "June" + "message": "Ekaina" }, "july": { - "message": "July" + "message": "Uztaila" }, "august": { - "message": "August" + "message": "Abuztua" }, "september": { - "message": "September" + "message": "Iraila" }, "october": { - "message": "October" + "message": "Urria" }, "november": { - "message": "November" + "message": "Azaroa" }, "december": { - "message": "December" + "message": "Abendua" }, "securityCode": { - "message": "Security Code" + "message": "Segurtasun kodea" }, "ex": { - "message": "ex." + "message": "adib." }, "title": { - "message": "Title" + "message": "Titulua" }, "mr": { - "message": "Mr" + "message": "Jn." }, "mrs": { - "message": "Mrs" + "message": "And." }, "ms": { - "message": "Ms" + "message": "And." }, "dr": { - "message": "Dr" + "message": "Jn." }, "firstName": { - "message": "First Name" + "message": "Izena" }, "middleName": { - "message": "Middle Name" + "message": "Bigarren izena" }, "lastName": { - "message": "Last Name" + "message": "Abizena" }, "fullName": { - "message": "Full Name" + "message": "Izen osoa" }, "identityName": { - "message": "Identity Name" + "message": "Identitate izena" }, "company": { - "message": "Company" + "message": "Enpresa" }, "ssn": { - "message": "Social Security Number" + "message": "Segurtasun sozialaren zenbakia" }, "passportNumber": { - "message": "Passport Number" + "message": "Pasaporte zenbakia" }, "licenseNumber": { - "message": "License Number" + "message": "Lizentzia zenbakia" }, "email": { - "message": "Email" + "message": "Emaila" }, "phone": { - "message": "Phone" + "message": "Telefonoa" }, "address": { - "message": "Address" + "message": "Helbidea" }, "address1": { - "message": "Address 1" + "message": "1go helbidea" }, "address2": { - "message": "Address 2" + "message": "2. helbidea" }, "address3": { - "message": "Address 3" + "message": "3. helbidea" }, "cityTown": { - "message": "City / Town" + "message": "Hiria / Herria" }, "stateProvince": { - "message": "State / Province" + "message": "Estatua / Probintzia" }, "zipPostalCode": { - "message": "Zip / Postal Code" + "message": "Posta kodea" }, "country": { - "message": "Country" + "message": "Herrialdea" }, "type": { - "message": "Type" + "message": "Mota" }, "typeLogin": { - "message": "Login" + "message": "Saio-hasiera" }, "typeLogins": { - "message": "Logins" + "message": "Saio-hasierak" }, "typeSecureNote": { - "message": "Secure Note" + "message": "Ohar segurua" }, "typeCard": { - "message": "Card" + "message": "Txartela" }, "typeIdentity": { - "message": "Identity" + "message": "Identitatea" }, "passwordHistory": { - "message": "Password History" + "message": "Pasahitz historiala" }, "back": { - "message": "Back" + "message": "Itzuli" }, "collections": { - "message": "Collections" + "message": "Bildumak" }, "favorites": { - "message": "Favorites" + "message": "Gogokoak" }, "popOutNewWindow": { - "message": "Pop out to a new window" + "message": "Ireki leiho berrian" }, "refresh": { - "message": "Refresh" + "message": "Freskatu" }, "cards": { - "message": "Cards" + "message": "Txartelak" }, "identities": { - "message": "Identities" + "message": "Nortasunak" }, "logins": { - "message": "Logins" + "message": "Saio-hasierak" }, "secureNotes": { - "message": "Secure Notes" + "message": "Ohar seguruak" }, "clear": { - "message": "Clear", + "message": "Ezabatu", "description": "To clear something out. example: To clear browser history." }, "checkPassword": { - "message": "Check if password has been exposed." + "message": "Egiaztatu pasahitza konprometituta dagoen." }, "passwordExposed": { - "message": "This password has been exposed $VALUE$ time(s) in data breaches. You should change it.", + "message": "Pasahitz hau $VALUE$ aldiz datu-iragazketetan aurkitu da. Aldatu egin beharko zenuke.", "placeholders": { "value": { "content": "$1", @@ -1242,204 +1245,204 @@ } }, "passwordSafe": { - "message": "This password was not found in any known data breaches. It should be safe to use." + "message": "Pasahitz hau ez da inongo datu-filtrazio ezagunetan aurkitu. Erabiltzea segurua izan beharko luke." }, "baseDomain": { - "message": "Base domain", + "message": "Oinarrizko domeinua", "description": "Domain name. Ex. website.com" }, "domainName": { - "message": "Domain name", + "message": "Domeinu izena", "description": "Domain name. Ex. website.com" }, "host": { - "message": "Host", + "message": "Ostalaria", "description": "A URL's host value. For example, the host of https://sub.domain.com:443 is 'sub.domain.com:443'." }, "exact": { - "message": "Exact" + "message": "Zehatza" }, "startsWith": { - "message": "Starts with" + "message": "Hasi honekin" }, "regEx": { - "message": "Regular expression", + "message": "Expresio erregularra", "description": "A programming term, also known as 'RegEx'." }, "matchDetection": { - "message": "Match Detection", + "message": "Detekzio modua", "description": "URI match detection for auto-fill." }, "defaultMatchDetection": { - "message": "Default match detection", + "message": "Lehenetsitako detekzio modua", "description": "Default URI match detection for auto-fill." }, "toggleOptions": { - "message": "Toggle Options" + "message": "Txandaketa aukerak" }, "toggleCurrentUris": { - "message": "Toggle Current URIs", + "message": "Uneko URI-ak txandakatu", "description": "Toggle the display of the URIs of the currently open tabs in the browser." }, "currentUri": { - "message": "Current URI", + "message": "Uneko URI-a", "description": "The URI of one of the current open tabs in the browser." }, "organization": { - "message": "Organization", + "message": "Erakundea", "description": "An entity of multiple related people (ex. a team or business organization)." }, "types": { - "message": "Types" + "message": "Motak" }, "allItems": { - "message": "All Items" + "message": "Elementu guztiak" }, "noPasswordsInList": { - "message": "There are no passwords to list." + "message": "Ez dago erakusteko pasahitzik." }, "remove": { - "message": "Remove" + "message": "Ezabatu" }, "default": { - "message": "Default" + "message": "Lehenetsia" }, "dateUpdated": { - "message": "Updated", + "message": "Eguneratua", "description": "ex. Date this item was updated" }, "datePasswordUpdated": { - "message": "Password Updated", + "message": "Pasahitza eguneratu da", "description": "ex. Date this password was updated" }, "neverLockWarning": { - "message": "Are you sure you want to use the \"Never\" option? Setting your lock options to \"Never\" stores your vault's encryption key on your device. If you use this option you should ensure that you keep your device properly protected." + "message": "Ziur zaude \"Inoiz ez\" aukera erabili nahi duzula? Zure blokeo aukerak \"Inoiz ez\" bezala konfiguratzeak kutxa gotorraren zifratze-gakoa gailuan gordetzen du. Aukera hau erabiltzen baduzu, gailua behar bezala babestuta duzula ziurtatu behar duzu." }, "noOrganizationsList": { - "message": "You do not belong to any organizations. Organizations allow you to securely share items with other users." + "message": "Zu ez zara inongo erakundekoa. Erakundeek elementuak beste erabiltzaile batzuekin modu seguruan partekatzeko aukera ematen dute." }, "noCollectionsInList": { - "message": "There are no collections to list." + "message": "Ez dago erakusteko bildumarik." }, "ownership": { - "message": "Ownership" + "message": "Jabetza" }, "whoOwnsThisItem": { - "message": "Who owns this item?" + "message": "Nork du elementu hau?" }, "strong": { - "message": "Strong", + "message": "Sendoa", "description": "ex. A strong password. Scale: Weak -> Good -> Strong" }, "good": { - "message": "Good", + "message": "Ona", "description": "ex. A good password. Scale: Weak -> Good -> Strong" }, "weak": { - "message": "Weak", + "message": "Biguna", "description": "ex. A weak password. Scale: Weak -> Good -> Strong" }, "weakMasterPassword": { - "message": "Weak Master Password" + "message": "Pasahitz nagusi ahula" }, "weakMasterPasswordDesc": { - "message": "The master password you have chosen is weak. You should use a strong master password (or a passphrase) to properly protect your Bitwarden account. Are you sure you want to use this master password?" + "message": "Aukeratu duzun pasahitza ahula da. Pasahitz nagusi sendo bat (edo pasaesaldi bat) erabili beharko zenuke Bitwarden kontua behar bezala babesteko. Ziur zaude pasahitz nagusi hau erabili nahi duzula?" }, "pin": { - "message": "PIN", + "message": "PIN-a", "description": "PIN code. Ex. The short code (often numeric) that you use to unlock a device." }, "unlockWithPin": { - "message": "Unlock with PIN" + "message": "PIN-arekin desblokeatu" }, "setYourPinCode": { - "message": "Set your PIN code for unlocking Bitwarden. Your PIN settings will be reset if you ever fully log out of the application." + "message": "Ezarri zure PIN kodea Bitwarden desblokeatzeko. Zure PIN-aren konfigurazioa berrezarriko da, noizbait aplikaziotik erabat saioa ixten baduzu." }, "pinRequired": { - "message": "PIN code is required." + "message": "PIN-a beharrezkoa da." }, "invalidPin": { - "message": "Invalid PIN code." + "message": "PIN baliogabea." }, "unlockWithBiometrics": { - "message": "Unlock with biometrics" + "message": "Desblokeatu biometria erabiliz" }, "awaitDesktop": { - "message": "Awaiting confirmation from desktop" + "message": "Mahaigainaren aldetiko berrespenaren zain" }, "awaitDesktopDesc": { - "message": "Please confirm using biometrics in the Bitwarden Desktop application to enable biometrics for browser." + "message": "Mesedez, egiaztatu biometrikoen erabilera Mahaigaineko Bitwarden aplikazioan, nabigatzailerako biometrikoak gaitzeko." }, "lockWithMasterPassOnRestart": { - "message": "Lock with master password on browser restart" + "message": "Nabigatzailea berrabiaraztean pasahitz nagusiarekin blokeatu" }, "selectOneCollection": { - "message": "You must select at least one collection." + "message": "Gutxienez bilduma bat aukeratu behar duzu." }, "cloneItem": { - "message": "Clone Item" + "message": "Klonatu elementua" }, "clone": { - "message": "Clone" + "message": "Klonatu" }, "passwordGeneratorPolicyInEffect": { - "message": "One or more organization policies are affecting your generator settings." + "message": "Erakundeko politika batek edo gehiagok sortzailearen konfigurazioari eragiten diote." }, "vaultTimeoutAction": { - "message": "Vault timeout action" + "message": "Kutxa gotorraren itxarote denboraren ekintza" }, "lock": { - "message": "Lock", + "message": "Blokeatu", "description": "Verb form: to make secure or inaccesible by" }, "trash": { - "message": "Trash", + "message": "Zakarrontzia", "description": "Noun: a special folder to hold deleted items" }, "searchTrash": { - "message": "Search trash" + "message": "Bilatu zakarrontzian" }, "permanentlyDeleteItem": { - "message": "Permanently Delete Item" + "message": "Ezabatu elementua betirako" }, "permanentlyDeleteItemConfirmation": { - "message": "Are you sure you want to permanently delete this item?" + "message": "Ziur zaude elementu hau betirako ezabatu nahi duzula?" }, "permanentlyDeletedItem": { - "message": "Permanently Deleted item" + "message": "Elementua betirako ezabatua" }, "restoreItem": { - "message": "Restore Item" + "message": "Berreskuratu elementua" }, "restoreItemConfirmation": { - "message": "Are you sure you want to restore this item?" + "message": "Ziur zaude elementu hau ezabatu nahi duzula?" }, "restoredItem": { - "message": "Restored Item" + "message": "Elementua berreskuratua" }, "vaultTimeoutLogOutConfirmation": { - "message": "Logging out will remove all access to your vault and requires online authentication after the timeout period. Are you sure you want to use this setting?" + "message": "Saioa ixteak kutxa gotorreko sarrera guztia kenduko du eta itxaronaldiaren ondoren lineako baimentzea eskatuko du. Ziur zaude hau egin nahi duzula?" }, "vaultTimeoutLogOutConfirmationTitle": { - "message": "Timeout Action Confirmation" + "message": "Baieztatu itxarote denboraren ekintza" }, "autoFillAndSave": { - "message": "Auto-fill and Save" + "message": "Auto-bete eta gorde" }, "autoFillSuccessAndSavedUri": { - "message": "Auto-filled Item and Saved URI" + "message": "Elementua auto-betea eta URIa gordeta" }, "autoFillSuccess": { - "message": "Auto-filled Item" + "message": "Elementua auto-beteta" }, "setMasterPassword": { - "message": "Set Master Password" + "message": "Ezarri pasahitz nagusia" }, "masterPasswordPolicyInEffect": { - "message": "One or more organization policies require your master password to meet the following requirements:" + "message": "Erakundeko politika batek edo gehiagok pasahitz nagusia behar dute baldintza hauek betetzeko:" }, "policyInEffectMinComplexity": { - "message": "Minimum complexity score of $SCORE$", + "message": "$SCORE$-en gutxieneko konplexutasun puntuazioa", "placeholders": { "score": { "content": "$1", @@ -1448,7 +1451,7 @@ } }, "policyInEffectMinLength": { - "message": "Minimum length of $LENGTH$", + "message": "$LENGTH$-en gutxieneko luzera", "placeholders": { "length": { "content": "$1", @@ -1457,16 +1460,16 @@ } }, "policyInEffectUppercase": { - "message": "Contain one or more uppercase characters" + "message": "Karaktere larri bat edo gehiago edukitzea" }, "policyInEffectLowercase": { - "message": "Contain one or more lowercase characters" + "message": "Karaktere txiki bat edo gehiago edukitzea" }, "policyInEffectNumbers": { - "message": "Contain one or more numbers" + "message": "Zenbaki bat edo gehiago edukitzea" }, "policyInEffectSpecial": { - "message": "Contain one or more of the following special characters $CHARS$", + "message": "Karaktere berezi hauetako ($CHARS$) bat edo gehiago edukitzea", "placeholders": { "chars": { "content": "$1", @@ -1475,100 +1478,100 @@ } }, "masterPasswordPolicyRequirementsNotMet": { - "message": "Your new master password does not meet the policy requirements." + "message": "Zure pasahitz nagusi berriak ez ditu baldintzak betetzen." }, "acceptPolicies": { - "message": "By checking this box you agree to the following:" + "message": "Laukitxo hau markatzean, honakoa onartzen duzu:" }, - "acceptPoliciesError": { - "message": "Terms of Service and Privacy Policy have not been acknowledged." + "acceptPoliciesRequired": { + "message": "Zerbitzuaren baldintzak eta pribatutasun politika ez dira onartu." }, "termsOfService": { - "message": "Terms of Service" + "message": "Zerbitzuaren baldintzak" }, "privacyPolicy": { - "message": "Privacy Policy" + "message": "Pribatutasun politika" }, "hintEqualsPassword": { - "message": "Your password hint cannot be the same as your password." + "message": "Zure pasahitza ezin da izan zure pasahitzaren pistaren berdina." }, "ok": { - "message": "Ok" + "message": "Ados" }, "desktopSyncVerificationTitle": { - "message": "Desktop sync verification" + "message": "Mahaigaineko sinkronizazioaren egiaztatzea" }, "desktopIntegrationVerificationText": { - "message": "Please verify that the desktop application shows this fingerprint: " + "message": "Mesedez, egiaztatu mahaigaineko aplikazioak hatz-marka digital hau erakusten duela: " }, "desktopIntegrationDisabledTitle": { - "message": "Browser integration is not enabled" + "message": "Nabigatzailearen integrazioa ez dago gaituta" }, "desktopIntegrationDisabledDesc": { - "message": "Browser integration is not enabled in the Bitwarden Desktop application. Please enable it in the settings within the desktop application." + "message": "Nabigatzailearen integrazioa ez dago gaituta mahaigaineko Bitwarden aplikazioan. Mesedez, gaitu mahaigaineko aplikazioko ezarpenetan." }, "startDesktopTitle": { - "message": "Start the Bitwarden Desktop application" + "message": "Hasi mahaigaineko Bitwarden aplikazioa" }, "startDesktopDesc": { - "message": "The Bitwarden Desktop application needs to be started before unlock with biometrics can be used." + "message": "Biometria bidez desblokeatu aurretik mahaigaineko Bitwarden aplikazioak hasita egon behar du." }, "errorEnableBiometricTitle": { - "message": "Unable to enable biometrics" + "message": "Ezin izan da biometria gaitu" }, "errorEnableBiometricDesc": { - "message": "Action was canceled by the desktop application" + "message": "Mahaigaineko aplikazioak ekintza geldiarazi du" }, "nativeMessagingInvalidEncryptionDesc": { - "message": "Desktop application invalidated the secure communication channel. Please retry this operation" + "message": "Mahaigaineko aplikazioak komunikazio kanal segurua geldiarazi du. Mesedez, saiatu berriro" }, "nativeMessagingInvalidEncryptionTitle": { - "message": "Desktop communication interrupted" + "message": "Mahaigainarekin komunikazioa eten da" }, "nativeMessagingWrongUserDesc": { - "message": "The desktop application is logged into a different account. Please ensure both applications are logged into the same account." + "message": "Mahaigaineko aplikazioa beste kontu batekin konektatu da. Mesedez, ziurtatu bi aplikazioak kontu berean konektatzen direla." }, "nativeMessagingWrongUserTitle": { - "message": "Account missmatch" + "message": "Kontu ezberdinak dira" }, "biometricsNotEnabledTitle": { - "message": "Biometrics not enabled" + "message": "Biometria desgaitua" }, "biometricsNotEnabledDesc": { - "message": "Browser biometrics requires desktop biometric to be enabled in the settings first." + "message": "Nabigatzailearen biometriak lehenik mahaigainaren biometria gaitzeko eskatzen du." }, "biometricsNotSupportedTitle": { - "message": "Biometrics not supported" + "message": "Ezin da biometria erabili" }, "biometricsNotSupportedDesc": { - "message": "Browser biometrics is not supported on this device." + "message": "Nabigatzailearen biometria ezin da gailu honetan erabili." }, "nativeMessaginPermissionErrorTitle": { - "message": "Permission not provided" + "message": "Baimena ukatuta" }, "nativeMessaginPermissionErrorDesc": { - "message": "Without permission to communicate with the Bitwarden Desktop Application we cannot provide biometrics in the browser extension. Please try again." + "message": "Mahaigaineko Bitwarden aplikazioarekin komunikatzeko baimenik gabe, ezin diogu datu biometrikorik eman nabigatzailearen gehigarriari. Mesedez, saiatu berriro." }, "nativeMessaginPermissionSidebarTitle": { - "message": "Permission request error" + "message": "Akatsa baimen eskaeran" }, "nativeMessaginPermissionSidebarDesc": { - "message": "This action cannot be done in the sidebar, please retry the action in the popup or popout." + "message": "Ekintza hau ezin da alboko barran egin. Saiatu berriro leiho gainjarrian edo leiho berri batean." }, "personalOwnershipSubmitError": { - "message": "Due to an Enterprise Policy, you are restricted from saving items to your personal vault. Change the Ownership option to an organization and choose from available Collections." + "message": "Erakundeko politika bat dela eta, ezin dituzu elementuak zure kutxa gotor pertsonalean gorde. Aldatu jabe aukera erakunde aukera batera, eta aukeratu bilduma erabilgarrien artean." }, "personalOwnershipPolicyInEffect": { - "message": "An organization policy is affecting your ownership options." + "message": "Erakunde politika batek, jabetza aukerei eragiten die." }, "excludedDomains": { - "message": "Excluded domains" + "message": "Kanporatutako domeinuak" }, "excludedDomainsDesc": { - "message": "Bitwarden will not ask to save login details for these domains. You must refresh the page for changes to take effect." + "message": "Bitwardenek ez du eskatuko domeinu horietarako saio-hasierako xehetasunak gordetzea. Orrialdea eguneratu behar duzu aldaketek eragina izan dezaten." }, "excludedDomainsInvalidDomain": { - "message": "$DOMAIN$ is not a valid domain", + "message": "$DOMAIN$ ez da onartutako domeinu bat", "placeholders": { "domain": { "content": "$1", @@ -1577,109 +1580,109 @@ } }, "send": { - "message": "Send", + "message": "Bidalketa", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "searchSends": { - "message": "Search Sends", + "message": "Bildalketak bilatu", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "addSend": { - "message": "Add Send", + "message": "Gehitu Bidalketa", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendTypeText": { - "message": "Text" + "message": "Testua" }, "sendTypeFile": { - "message": "File" + "message": "Fitxategia" }, "allSends": { - "message": "All Sends", + "message": "Bidalketa guztiak", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "maxAccessCountReached": { - "message": "Max access count reached", + "message": "Sarbide kopuru maximoa gaindituta", "description": "This text will be displayed after a Send has been accessed the maximum amount of times." }, "expired": { - "message": "Expired" + "message": "Iraungita" }, "pendingDeletion": { - "message": "Pending deletion" + "message": "Ezabatzea egiteke" }, "passwordProtected": { - "message": "Password protected" + "message": "Pasahitz babestua" }, "copySendLink": { - "message": "Copy Send link", + "message": "Bidalketa esteka kopiatu", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "removePassword": { - "message": "Remove Password" + "message": "Kendu pasahitza" }, "delete": { - "message": "Delete" + "message": "Ezabatu" }, "removedPassword": { - "message": "Removed Password" + "message": "Pasahitza kendua" }, "deletedSend": { - "message": "Deleted Send", + "message": "Bidalketa ezabatua", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendLink": { - "message": "Send link", + "message": "Bidalketa esteka", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "disabled": { - "message": "Disabled" + "message": "Desgaitua" }, "removePasswordConfirmation": { - "message": "Are you sure you want to remove the password?" + "message": "Ziur zaude pasahitz hau ezabatu nahi duzula?" }, "deleteSend": { - "message": "Delete Send", + "message": "Ezabatu Bidalketa", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "deleteSendConfirmation": { - "message": "Are you sure you want to delete this Send?", + "message": "Ziur al zaude Bidalketa hau ezabatu nahi duzula?", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "editSend": { - "message": "Edit Send", + "message": "Bidalketa editatu", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendTypeHeader": { - "message": "What type of Send is this?", + "message": "Zein Bidalketa mota da hau?", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendNameDesc": { - "message": "A friendly name to describe this Send.", + "message": "Bidalketa hau deskribatzeko izena.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendFileDesc": { - "message": "The file you want to send." + "message": "Bidali nahi duzun fitxategia." }, "deletionDate": { - "message": "Deletion Date" + "message": "Ezabatze data" }, "deletionDateDesc": { - "message": "The Send will be permanently deleted on the specified date and time.", + "message": "Bidalketa betiko ezabatuko da zehaztutako datan eta orduan.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "expirationDate": { - "message": "Expiration Date" + "message": "Iraungitze data" }, "expirationDateDesc": { - "message": "If set, access to this Send will expire on the specified date and time.", + "message": "Hala ezartzen bada, Bidalketa honetarako sarbidea zehaztutako egunean eta orduan amaituko da.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "oneDay": { - "message": "1 day" + "message": "Egun 1" }, "days": { - "message": "$DAYS$ days", + "message": "$DAYS$ egun", "placeholders": { "days": { "content": "$1", @@ -1688,153 +1691,153 @@ } }, "custom": { - "message": "Custom" + "message": "Pertsonalizatua" }, "maximumAccessCount": { - "message": "Maximum Access Count" + "message": "Sarbide kopuru maximoa" }, "maximumAccessCountDesc": { - "message": "If set, users will no longer be able to access this Send once the maximum access count is reached.", + "message": "Hala ezartzen bada, erabiltzaileak ezin izango dira Bidalketa honetara sartu gehienezko sarbide kopurura iritsi ondoren.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendPasswordDesc": { - "message": "Optionally require a password for users to access this Send.", + "message": "Nahi izanez gero, pasahitza eskatu erabiltzaileak bidalketa honetara sar daitezen.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendNotesDesc": { - "message": "Private notes about this Send.", + "message": "Bidalketa honi buruzko ohar pribatuak.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendDisableDesc": { - "message": "Disable this Send so that no one can access it.", + "message": "Desgaitu Bidalketa hau inor sar ez dadin.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendShareDesc": { - "message": "Copy this Send's link to clipboard upon save.", + "message": "Gordetzean, kopiatu Bidalketa honen esteka arbelean.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendTextDesc": { - "message": "The text you want to send." + "message": "Bidali nahi duzun testua." }, "sendHideText": { - "message": "Hide this Send's text by default.", + "message": "Ezkutatu Bidalketako testu hau, modu lehenetsian.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "currentAccessCount": { - "message": "Current Access Count" + "message": "Uneko sarbide kopurua" }, "createSend": { - "message": "Create New Send", + "message": "Sortu Bidalketa berria", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "newPassword": { - "message": "New Password" + "message": "Pasahitz berria" }, "sendDisabled": { - "message": "Send Disabled", + "message": "Bidalketa desgaituta", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendDisabledWarning": { - "message": "Due to an enterprise policy, you are only able to delete an existing Send.", + "message": "Enpresa-politika baten ondorioz, lehendik dagoen Bidalketa bakarrik ezaba dezakezu.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "createdSend": { - "message": "Created Send", + "message": "Bidalketa sortua", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "editedSend": { - "message": "Edited Send", + "message": "Bidalketa editatua", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendLinuxChromiumFileWarning": { - "message": "In order to choose a file, open the extension in the sidebar (if possible) or pop out to a new window by clicking this banner." + "message": "Fitxategi bat aukeratzeko, ireki gehigarria alboko barran (ahal bada) edo atera leiho berri batera banner honetan klik eginez." }, "sendFirefoxFileWarning": { - "message": "In order to choose a file using Firefox, open the extension in the sidebar or pop out to a new window by clicking this banner." + "message": "Firefox erabiliz fitxategi bat aukeratzeko, ireki gehigarria alboko barratik edo ireki beste leiho bat banner hau sakatuz." }, "sendSafariFileWarning": { - "message": "In order to choose a file using Safari, pop out to a new window by clicking this banner." + "message": "Safari erabiliz fitxategi bat aukeratzeko, ireki beste leiho bat banner hau sakatuz." }, "sendFileCalloutHeader": { - "message": "Before you start" + "message": "Hasi aurretik" }, "sendFirefoxCustomDatePopoutMessage1": { - "message": "To use a calendar style date picker", + "message": "Data aukeratzeko egutegi modua erabiltzeko", "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read '**To use a calendar style date picker ** click here to pop out your window.'" }, "sendFirefoxCustomDatePopoutMessage2": { - "message": "click here", + "message": "klikatu hemen", "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'To use a calendar style date picker **click here** to pop out your window.'" }, "sendFirefoxCustomDatePopoutMessage3": { - "message": "to pop out your window.", + "message": "leihoa irekitzeko.", "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'To use a calendar style date picker click here **to pop out your window.**'" }, "expirationDateIsInvalid": { - "message": "The expiration date provided is not valid." + "message": "Iraungitze data ez da baliozkoa." }, "deletionDateIsInvalid": { - "message": "The deletion date provided is not valid." + "message": "Ezabatze data ez da baliozkoa." }, "expirationDateAndTimeRequired": { - "message": "An expiration date and time are required." + "message": "Iraungitze data eta ordua behar dira." }, "deletionDateAndTimeRequired": { - "message": "A deletion date and time are required." + "message": "Ezabatze data eta ordua behar dira." }, "dateParsingError": { - "message": "There was an error saving your deletion and expiration dates." + "message": "Akatsa gertatu da ezabatze eta iraungitze datak gordetzean." }, "hideEmail": { - "message": "Hide my email address from recipients." + "message": "Ezkutatu nire helbide elektronikoa hartzaileei." }, "sendOptionsPolicyInEffect": { - "message": "One or more organization policies are affecting your Send options." + "message": "Erakundeko politika batek edo gehiagok Bidalketa aukerei eragiten diote." }, "passwordPrompt": { - "message": "Master password re-prompt" + "message": "Berriro eskatu pasahitz nagusia" }, "passwordConfirmation": { - "message": "Master password confirmation" + "message": "Baieztatu pasahitz nagusia" }, "passwordConfirmationDesc": { - "message": "This action is protected. To continue, please re-enter your master password to verify your identity." + "message": "Ekintza hau babestuta dago. Jarraitzeko, mesedez, sartu berriro pasahitz nagusia zure identitatea egiaztatzeko." }, "emailVerificationRequired": { - "message": "Email Verification Required" + "message": "Egiaztapen emaila beharrezkoa da" }, "emailVerificationRequiredDesc": { - "message": "You must verify your email to use this feature. You can verify your email in the web vault." + "message": "Emaila egiaztatu behar duzu funtzio hau erabiltzeko. Emaila web-eko kutxa gotorrean egiazta dezakezu." }, "updatedMasterPassword": { - "message": "Updated Master Password" + "message": "Pasahitz nagusia eguneratuta" }, "updateMasterPassword": { - "message": "Update Master Password" + "message": "Pasahitz nagusia eguneratu" }, "updateMasterPasswordWarning": { - "message": "Your Master Password was recently changed by an administrator in your organization. In order to access the vault, you must update it now. Proceeding will log you out of your current session, requiring you to log back in. Active sessions on other devices may continue to remain active for up to one hour." + "message": "Zure erakundeko administratzaile batek pasahitz nagusia aldatu berri du. Kutxa gotorrera sartzeko, pasahitz nagusia orain eguneratu behar duzu. Beraz, oraingo saiotik atera eta saioa hasteko eskatuko zaizu. Beste gailu batzuetako saio aktiboek ordubete iraun dezakete aktibo." }, "resetPasswordPolicyAutoEnroll": { - "message": "Automatic Enrollment" + "message": "Izen-emate automatikoa" }, "resetPasswordAutoEnrollInviteWarning": { - "message": "This organization has an enterprise policy that will automatically enroll you in password reset. Enrollment will allow organization administrators to change your master password." + "message": "Erakunde horrek enpresa politika bat du, eta automatikoki pasahitza berrezartzean izen-emango du. Izen-emateak aukera emango die erakundeko administratzaileei pasahitz nagusia aldatzeko." }, "selectFolder": { - "message": "Select folder..." + "message": "Hautatu karpeta..." }, "ssoCompleteRegistration": { - "message": "In order to complete logging in with SSO, please set a master password to access and protect your vault." + "message": "SSO-rekin saioa hasteko, mesedez, ezarri pasahitz nagusi bat kutxa gotorrera sartu eta babesteko." }, "hours": { - "message": "Hours" + "message": "Ordu" }, "minutes": { - "message": "Minutes" + "message": "Minutu" }, "vaultTimeoutPolicyInEffect": { - "message": "Your organization policies are affecting your vault timeout. Maximum allowed Vault Timeout is $HOURS$ hour(s) and $MINUTES$ minute(s)", + "message": "Zure erakundearen politikek zure itxaronaldiari eragiten diote. Itxaronaldiak gehienez ere $HOURS$ ordu eta $MINUTES$ minutu izango ditu", "placeholders": { "hours": { "content": "$1", @@ -1846,23 +1849,23 @@ } } }, - "vaultTimeoutToLarge": { - "message": "Your vault timeout exceeds the restrictions set by your organization." + "vaultTimeoutTooLarge": { + "message": "Zure kutxa gotorreko itxaronaldiak, zure erakundeak ezarritako murrizpenak gainditzen ditu." }, "vaultExportDisabled": { - "message": "Vault Export Disabled" + "message": "Kutxa gotorraren esportazioa desgaituta" }, "personalVaultExportPolicyInEffect": { - "message": "One or more organization policies prevents you from exporting your personal vault." + "message": "Erakundeko politika batek edo gehiagok kutxa gotorra esportatzea galarazten dute." }, "copyCustomFieldNameInvalidElement": { - "message": "Unable to identify a valid form element. Try inspecting the HTML instead." + "message": "Ez da gai elementu bat behar bezala identifikatzeko. Saiatu HTML bere ordez ikuskatzen." }, "copyCustomFieldNameNotUnique": { - "message": "No unique identifier found." + "message": "Ez da identifikatzaile bakarrik aurkitu." }, "convertOrganizationEncryptionDesc": { - "message": "$ORGANIZATION$ is using SSO with a self-hosted key server. A master password is no longer required to log in for members of this organization.", + "message": "$ORGANIZATION$ SSO erabiltzen ari da bere burua ostatatuta duen gako-zerbitzari batekin. Dagoeneko ez da pasahitz nagusirik behar erakunde honetako kideentzat saioa hasteko.", "placeholders": { "organization": { "content": "$1", @@ -1871,31 +1874,31 @@ } }, "leaveOrganization": { - "message": "Leave Organization" + "message": "Utzi erakundea" }, "removeMasterPassword": { - "message": "Remove Master Password" + "message": "Ezabatu pasahitz nagusia" }, "removedMasterPassword": { - "message": "Master password removed." + "message": "Pasahitz nagusia ezabatua." }, "leaveOrganizationConfirmation": { - "message": "Are you sure you want to leave this organization?" + "message": "Ziur al zaude erakundea utzi nahi duzula?" }, "leftOrganization": { - "message": "You have left the organization." + "message": "Erakundea utzi egin duzu." }, "toggleCharacterCount": { - "message": "Toggle character count" + "message": "Karaktere kontaketak txandakatu" }, "sessionTimeout": { - "message": "Your session has timed out. Please go back and try logging in again." + "message": "Saioa amaitu da. Mesedez, itzuli eta saiatu berriro saioa hasten." }, "exportingPersonalVaultTitle": { - "message": "Exporting Personal Vault" + "message": "Kutxa gotor pertsonala esportatzen" }, "exportingPersonalVaultDescription": { - "message": "Only the personal vault items associated with $EMAIL$ will be exported. Organization vault items will not be included.", + "message": "$EMAIL$-ekin lotutako kutxa gotor pertsonaleko elementuak bakarrik esportatuko dira. Erakundeko kutxa gotorraren elementuak ez dira sartuko.", "placeholders": { "email": { "content": "$1", @@ -1904,65 +1907,71 @@ } }, "error": { - "message": "Error" + "message": "Akatsa" }, "regenerateUsername": { - "message": "Regenerate Username" + "message": "Birsortu erabiltzaile izena" }, "generateUsername": { - "message": "Generate Username" + "message": "Sortu erabiltzaile izena" }, "usernameType": { - "message": "Username Type" + "message": "Erabiltzaile izen mota" }, "plusAddressedEmail": { - "message": "Plus Addressed Email", + "message": "Atzizkidun emaila", "description": "Username generator option that appends a random sub-address to the username. For example: address+subaddress@email.com" }, "plusAddressedEmailDesc": { - "message": "Use your email provider's sub-addressing capabilities." + "message": "Erabili emailaren hornitzailearen azpihelbideratze gaitasunak." }, "catchallEmail": { - "message": "Catch-all Email" + "message": "Harrapatu email guztiak" }, "catchallEmailDesc": { - "message": "Use your domain's configured catch-all inbox." + "message": "Erabili zure domeinuan konfiguratutako sarrerako ontzia." }, "random": { - "message": "Random" + "message": "Ausazkoa" }, "randomWord": { - "message": "Random Word" + "message": "Ausazko hitza" }, "websiteName": { - "message": "Website Name" + "message": "Webgune izena" }, "whatWouldYouLikeToGenerate": { - "message": "What would you like to generate?" + "message": "Zer sortu nahi duzu?" }, "passwordType": { - "message": "Password Type" + "message": "Pasahitz mota" }, "service": { - "message": "Service" + "message": "Zerbitzua" }, "forwardedEmail": { - "message": "Forwarded Email Alias" + "message": "Emaileko ezizena berbidalia" }, "forwardedEmailDesc": { - "message": "Generate an email alias with an external forwarding service." + "message": "Emaileko ezizen bat sortu kanpoko bidalketa zerbitzu batekin." }, "hostname": { - "message": "Hostname", + "message": "Ostalariaren izena", "description": "Part of a URL." }, "apiAccessToken": { - "message": "API Access Token" + "message": "Token sarbide API-a" }, "apiKey": { - "message": "API Key" + "message": "API Kodea" }, "ssoKeyConnectorError": { - "message": "Key Connector error: make sure Key Connector is available and working correctly." + "message": "Errore bat gertatu da konektore giltzan: ziurtatu giltza konektorea erabilgarri dagoela eta behar bezala dabilela." + }, + "organizationIsDisabled": { + "message": "Organization is disabled." + }, + "disabledOrganizationFilterError": { + "message": "Items in disabled Organizations cannot be accessed. Contact your Organization owner for assistance." } } diff --git a/apps/browser/src/_locales/fa/messages.json b/apps/browser/src/_locales/fa/messages.json index 15b7b803753..6eeb994d141 100644 --- a/apps/browser/src/_locales/fa/messages.json +++ b/apps/browser/src/_locales/fa/messages.json @@ -423,11 +423,14 @@ "invalidEmail": { "message": "آدرس ایمیل نامعتبر است." }, - "masterPassRequired": { - "message": "کلمه عبور اصلی ضروری است." + "masterPasswordRequired": { + "message": "گذرواژه اصلی ضروری است." }, - "masterPassLength": { - "message": "طول کلمه عبور اصلی باید حداقل ۸ کاراکتر باشد." + "confirmMasterPasswordRequired": { + "message": "تایپ مجدد گذرواژه اصلی نیاز است." + }, + "masterPasswordMinlength": { + "message": "Master password must be at least 8 characters long." }, "masterPassDoesntMatch": { "message": "کلمه عبور اصلی با تکرار کلمه عبور اصلی مطابقت ندارد." @@ -1480,7 +1483,7 @@ "acceptPolicies": { "message": "با علامت زدن این کادر با موارد زیر موافقت می کنید:" }, - "acceptPoliciesError": { + "acceptPoliciesRequired": { "message": "شرایط خدمات و سیاست حفظ حریم خصوصی تأیید نشده است." }, "termsOfService": { @@ -1846,7 +1849,7 @@ } } }, - "vaultTimeoutToLarge": { + "vaultTimeoutTooLarge": { "message": "مهلت زمانی شما بیش از محدودیت های تعیین شده توسط سازمانتان است." }, "vaultExportDisabled": { @@ -1964,5 +1967,11 @@ }, "ssoKeyConnectorError": { "message": "خطای Key Connector: مطمئن شوید که Key Connector در دسترس است و به درستی کار می کند." + }, + "organizationIsDisabled": { + "message": "Organization is disabled." + }, + "disabledOrganizationFilterError": { + "message": "Items in disabled Organizations cannot be accessed. Contact your Organization owner for assistance." } } diff --git a/apps/browser/src/_locales/fi/messages.json b/apps/browser/src/_locales/fi/messages.json index 310f9eca1cc..ccf9e22616a 100644 --- a/apps/browser/src/_locales/fi/messages.json +++ b/apps/browser/src/_locales/fi/messages.json @@ -423,11 +423,14 @@ "invalidEmail": { "message": "Virheellinen sähköpostiosoite." }, - "masterPassRequired": { + "masterPasswordRequired": { "message": "Pääsalasana vaaditaan." }, - "masterPassLength": { - "message": "Pääsalasanan on oltava vähintään 8 merkkiä pitkä." + "confirmMasterPasswordRequired": { + "message": "Pääsalasanan uudelleensyöttö vaaditaan." + }, + "masterPasswordMinlength": { + "message": "Pääsalasanan tulee sisältää ainakin 8 merkkiä." }, "masterPassDoesntMatch": { "message": "Pääsalasanan vahvistus ei täsmää." @@ -455,7 +458,7 @@ } }, "autofillError": { - "message": "Valitun kohteen automaattinen täyttö ei onnistu tällä sivulla. Kopioi ja liitä tiedot sen sijaan itse." + "message": "Valitttua kohdetta ei voitu täyttää tälle sivulle automaattisesti. Kopioi ja liitä tiedot itse." }, "loggedOut": { "message": "Kirjauduttu ulos" @@ -918,7 +921,7 @@ "message": "Todennuskoodit lähetetään sinulle sähköpostitse." }, "selfHostedEnvironment": { - "message": "Oma palvelinympäristö" + "message": "Itse ylläpidetty palvelinympäristö" }, "selfHostedEnvironmentFooter": { "message": "Määritä omassa palvelinympäristössäsi suoritettavan Bitwarden-asennuksen pääverkkotunnus." @@ -1313,7 +1316,7 @@ "description": "ex. Date this password was updated" }, "neverLockWarning": { - "message": "Oletko varma, että haluat käyttää asetusta \"Ei koskaan\"? Tämä valinta tallentaa holvisi salausavaimen laitteellesi. Jos käytät asetusta, varmista että laitteesi on hyvin suojattu." + "message": "Haluatko varmasti käyttää asetusta \"Ei koskaan\"? Se tallentaa holvisi salausavaimen laitteellesi. Jos käytät asetusta, varmista että laite on suojattu hyvin." }, "noOrganizationsList": { "message": "Et kuulu mihinkään organisaatioon. Organisaatioiden avulla voit jakaa kohteita turvallisesti muiden käyttäjien kanssa." @@ -1386,7 +1389,7 @@ "message": "Yksi tai useampi organisaatiokäytäntö vaikuttaa generaattorisi asetuksiin." }, "vaultTimeoutAction": { - "message": "Holvin aikakatkaisun toiminto" + "message": "Holvin aikakatkaisutoiminto" }, "lock": { "message": "Lukitse", @@ -1418,10 +1421,10 @@ "message": "Kohde palautettu" }, "vaultTimeoutLogOutConfirmation": { - "message": "Uloskirjautuminen estää pääsyn holviisi ja vaatii ajan umpeuduttua todennuksen internet-yhteyden välityksellä. Haluatko varmasti käyttää tätä asetusta?" + "message": "Uloskirjautuminen estää pääsyn holviisi ja vaatii ajan umpeuduttua todennuksen Internet-yhteyden välityksellä. Haluatko varmasti käyttää asetusta?" }, "vaultTimeoutLogOutConfirmationTitle": { - "message": "Aikakatkaisun toiminnon vahvistus" + "message": "Aikakatkaisutoiminnon vahvistus" }, "autoFillAndSave": { "message": "Täytä automaattisesti ja tallenna" @@ -1480,7 +1483,7 @@ "acceptPolicies": { "message": "Valitsemalla tämän ruudun hyväksyt seuraavat:" }, - "acceptPoliciesError": { + "acceptPoliciesRequired": { "message": "Käyttöehtoja ja tietosuojakäytäntöä ei ole vahvistettu." }, "termsOfService": { @@ -1514,7 +1517,7 @@ "message": "Bitwardenin työpöytäsovellus on käynnistettävä ennen kuin biometristä avausta voidaan käyttää." }, "errorEnableBiometricTitle": { - "message": "Biometrian käyttöönotto ei onnistu" + "message": "Biometriaa ei voitu ottaa käyttöön" }, "errorEnableBiometricDesc": { "message": "Työpöytäsovellus perui toiminnon" @@ -1834,7 +1837,7 @@ "message": "Minuuttia" }, "vaultTimeoutPolicyInEffect": { - "message": "Organisaatiosi käytännöt vaikuttavat holvisi aikakatkaisuun. Suurin sallittu viive on $HOURS$ tunti(a) ja $MINUTES$ minuutti(a)", + "message": "Organisaatiosi käytännöt vaikuttavat holvisi aikakatkaisuun. Suurin sallittu aika on $HOURS$ tunti(a) ja $MINUTES$ minuutti(a)", "placeholders": { "hours": { "content": "$1", @@ -1846,8 +1849,8 @@ } } }, - "vaultTimeoutToLarge": { - "message": "Holvisi aikakatkaisuviive ylittää organisaatiosi asettamat rajoitukset." + "vaultTimeoutTooLarge": { + "message": "Holvisi aikakatkaisu ylittää organisaatiosi asettamat rajoitukset." }, "vaultExportDisabled": { "message": "Holvin vienti on poistettu käytöstä" @@ -1856,13 +1859,13 @@ "message": "Yksi tai useampi organisaation käytäntö estää henkilökohtaisen holvisi viennin." }, "copyCustomFieldNameInvalidElement": { - "message": "Oikeaa lomakkeen elementtiä ei tunnistettu. Yritä sen sijaan HTML-koodin tarkastusta." + "message": "Oikeaa lomakkeen elementtiä ei voitu tunnistaa. Tutki sen sijaan HTML-koodia." }, "copyCustomFieldNameNotUnique": { "message": "Yksilöllistä tunnistetta ei löytynyt." }, "convertOrganizationEncryptionDesc": { - "message": "$ORGANIZATION$ käyttää kertakirjautumista (SSO) oman avainpalvelimensa kanssa. Organisaation jäsenet eivät enää tarvitse pääsalasanaa kirjautumiseen.", + "message": "$ORGANIZATION$ käyttää kertakirjautumista (SSO) itse ylläpidetyllä avainpalvelimella. Organisaation jäsenet eivät enää tarvitse pääsalasanaa kirjautumiseen.", "placeholders": { "organization": { "content": "$1", @@ -1964,5 +1967,11 @@ }, "ssoKeyConnectorError": { "message": "Key Connector -virhe: Varmista, että Key Connector on käytettävissä ja toimii oikein." + }, + "organizationIsDisabled": { + "message": "Organisaatio on poistettu käytöstä." + }, + "disabledOrganizationFilterError": { + "message": "Käytöstä poistettujen organisaatioiden kohteet eivät ole käytettävissä. Ole yhteydessä organisaation omistajaan saadaksesi apua." } } diff --git a/apps/browser/src/_locales/fil/messages.json b/apps/browser/src/_locales/fil/messages.json index 1eab3d718c0..18e515037f4 100644 --- a/apps/browser/src/_locales/fil/messages.json +++ b/apps/browser/src/_locales/fil/messages.json @@ -423,10 +423,13 @@ "invalidEmail": { "message": "Invalid email address." }, - "masterPassRequired": { + "masterPasswordRequired": { "message": "Master password is required." }, - "masterPassLength": { + "confirmMasterPasswordRequired": { + "message": "Master password retype is required." + }, + "masterPasswordMinlength": { "message": "Master password must be at least 8 characters long." }, "masterPassDoesntMatch": { @@ -1480,7 +1483,7 @@ "acceptPolicies": { "message": "By checking this box you agree to the following:" }, - "acceptPoliciesError": { + "acceptPoliciesRequired": { "message": "Terms of Service and Privacy Policy have not been acknowledged." }, "termsOfService": { @@ -1846,7 +1849,7 @@ } } }, - "vaultTimeoutToLarge": { + "vaultTimeoutTooLarge": { "message": "Your vault timeout exceeds the restrictions set by your organization." }, "vaultExportDisabled": { @@ -1964,5 +1967,11 @@ }, "ssoKeyConnectorError": { "message": "Key Connector error: make sure Key Connector is available and working correctly." + }, + "organizationIsDisabled": { + "message": "Organization is disabled." + }, + "disabledOrganizationFilterError": { + "message": "Items in disabled Organizations cannot be accessed. Contact your Organization owner for assistance." } } diff --git a/apps/browser/src/_locales/fr/messages.json b/apps/browser/src/_locales/fr/messages.json index 3cbccf45690..57e5b3322ad 100644 --- a/apps/browser/src/_locales/fr/messages.json +++ b/apps/browser/src/_locales/fr/messages.json @@ -423,11 +423,14 @@ "invalidEmail": { "message": "Adresse e-mail invalide." }, - "masterPassRequired": { - "message": "Le mot de passe maître est requis." + "masterPasswordRequired": { + "message": "Master password is required." }, - "masterPassLength": { - "message": "Le mot de passe maître doit au moins contenir 8 caractères." + "confirmMasterPasswordRequired": { + "message": "Master password retype is required." + }, + "masterPasswordMinlength": { + "message": "Master password must be at least 8 characters long." }, "masterPassDoesntMatch": { "message": "La confirmation du mot de passe maître ne correspond pas." @@ -1480,8 +1483,8 @@ "acceptPolicies": { "message": "En cochant cette case, vous acceptez les éléments suivants :" }, - "acceptPoliciesError": { - "message": "Les conditions d'utilisation et la politique de confidentialité n'ont pas été acceptées." + "acceptPoliciesRequired": { + "message": "Terms of Service and Privacy Policy have not been acknowledged." }, "termsOfService": { "message": "Conditions d'utilisation" @@ -1846,8 +1849,8 @@ } } }, - "vaultTimeoutToLarge": { - "message": "Le délai d'expiration de votre coffre dépasse les restrictions définies par votre organisation." + "vaultTimeoutTooLarge": { + "message": "Your vault timeout exceeds the restrictions set by your organization." }, "vaultExportDisabled": { "message": "Export du coffre désactivé" @@ -1964,5 +1967,11 @@ }, "ssoKeyConnectorError": { "message": "Erreur du connecteur de clé: veuillez vérifier que le connecteur de clé est disponible et qu'il fonctionne correctement." + }, + "organizationIsDisabled": { + "message": "Organization is disabled." + }, + "disabledOrganizationFilterError": { + "message": "Items in disabled Organizations cannot be accessed. Contact your Organization owner for assistance." } } diff --git a/apps/browser/src/_locales/he/messages.json b/apps/browser/src/_locales/he/messages.json index d50dd3045d8..3738b63d882 100644 --- a/apps/browser/src/_locales/he/messages.json +++ b/apps/browser/src/_locales/he/messages.json @@ -423,11 +423,14 @@ "invalidEmail": { "message": "כתובת אימייל לא תקינה." }, - "masterPassRequired": { - "message": "יש להזין את הסיסמה הראשית." + "masterPasswordRequired": { + "message": "Master password is required." }, - "masterPassLength": { - "message": "הסיסמה הראשית חייבת להיות לפחות באורך 8 תווים." + "confirmMasterPasswordRequired": { + "message": "Master password retype is required." + }, + "masterPasswordMinlength": { + "message": "Master password must be at least 8 characters long." }, "masterPassDoesntMatch": { "message": "שדה אימות סיסמה ראשית לא תואם." @@ -1480,8 +1483,8 @@ "acceptPolicies": { "message": "סימון תיבה זו מהווה את הסכמתך לתנאים הבאים:" }, - "acceptPoliciesError": { - "message": "תנאי השירות ומדיניות הפרטיות לא אושרו." + "acceptPoliciesRequired": { + "message": "Terms of Service and Privacy Policy have not been acknowledged." }, "termsOfService": { "message": "תנאי השירות" @@ -1846,8 +1849,8 @@ } } }, - "vaultTimeoutToLarge": { - "message": "Your vault timeout exceeds the restrictions set by your organization." + "vaultTimeoutTooLarge": { + "message": "הזמן הקצוב לכספת שלך חורג מהמגבלות שנקבעו על ידי הארגון שלך." }, "vaultExportDisabled": { "message": "Vault Export Disabled" @@ -1964,5 +1967,11 @@ }, "ssoKeyConnectorError": { "message": "Key Connector error: make sure Key Connector is available and working correctly." + }, + "organizationIsDisabled": { + "message": "Organization is disabled." + }, + "disabledOrganizationFilterError": { + "message": "Items in disabled Organizations cannot be accessed. Contact your Organization owner for assistance." } } diff --git a/apps/browser/src/_locales/hi/messages.json b/apps/browser/src/_locales/hi/messages.json index f9cd4d1fa99..7266c3e499d 100644 --- a/apps/browser/src/_locales/hi/messages.json +++ b/apps/browser/src/_locales/hi/messages.json @@ -423,11 +423,14 @@ "invalidEmail": { "message": "अमान्य ई-मेल |" }, - "masterPassRequired": { - "message": "मास्टर पासवर्ड की आवश्यकता है।" + "masterPasswordRequired": { + "message": "Master password is required." }, - "masterPassLength": { - "message": "मास्टर पासवर्ड कम से कम 8 अक्षर लंबे होने चाहिए।" + "confirmMasterPasswordRequired": { + "message": "Master password retype is required." + }, + "masterPasswordMinlength": { + "message": "Master password must be at least 8 characters long." }, "masterPassDoesntMatch": { "message": "मास्टर पासवर्ड पुष्टि मेल नहीं खाती है।" @@ -1480,8 +1483,8 @@ "acceptPolicies": { "message": "इस बॉक्स की जांच करके आप निम्नलिखित से सहमत हैं:" }, - "acceptPoliciesError": { - "message": "सेवा और गोपनीयता नीति की शर्तों को स्वीकार नहीं किया गया है ।" + "acceptPoliciesRequired": { + "message": "Terms of Service and Privacy Policy have not been acknowledged." }, "termsOfService": { "message": "सेवा की शर्तें" @@ -1846,7 +1849,7 @@ } } }, - "vaultTimeoutToLarge": { + "vaultTimeoutTooLarge": { "message": "Your vault timeout exceeds the restrictions set by your organization." }, "vaultExportDisabled": { @@ -1964,5 +1967,11 @@ }, "ssoKeyConnectorError": { "message": "Key Connector error: make sure Key Connector is available and working correctly." + }, + "organizationIsDisabled": { + "message": "Organization is disabled." + }, + "disabledOrganizationFilterError": { + "message": "Items in disabled Organizations cannot be accessed. Contact your Organization owner for assistance." } } diff --git a/apps/browser/src/_locales/hr/messages.json b/apps/browser/src/_locales/hr/messages.json index a85fd4a650e..f75b551f52d 100644 --- a/apps/browser/src/_locales/hr/messages.json +++ b/apps/browser/src/_locales/hr/messages.json @@ -423,11 +423,14 @@ "invalidEmail": { "message": "Neispravna adresa e-pošte." }, - "masterPassRequired": { - "message": "Potrebna je glavna lozinka." + "masterPasswordRequired": { + "message": "Master password is required." }, - "masterPassLength": { - "message": "Glavna lozinka mora imati najmanje 8 znakova." + "confirmMasterPasswordRequired": { + "message": "Master password retype is required." + }, + "masterPasswordMinlength": { + "message": "Master password must be at least 8 characters long." }, "masterPassDoesntMatch": { "message": "Potvrda glavne lozinke se ne podudara." @@ -1480,8 +1483,8 @@ "acceptPolicies": { "message": "Označavanjem ove kućice slažete se sa sljedećim:" }, - "acceptPoliciesError": { - "message": "Uvjeti korištenja i Pravila privatnosti nisu prihvaćeni." + "acceptPoliciesRequired": { + "message": "Terms of Service and Privacy Policy have not been acknowledged." }, "termsOfService": { "message": "Uvjeti korištenja" @@ -1846,8 +1849,8 @@ } } }, - "vaultTimeoutToLarge": { - "message": "Vrijeme isteka premašuje ograničenje koju je postavila tvoja organizacija." + "vaultTimeoutTooLarge": { + "message": "Your vault timeout exceeds the restrictions set by your organization." }, "vaultExportDisabled": { "message": "Izvoz trezora onemogućen" @@ -1964,5 +1967,11 @@ }, "ssoKeyConnectorError": { "message": "Pogreška konektora ključa: provjerite je li konektor ključa dostupan i radi ispravno." + }, + "organizationIsDisabled": { + "message": "Organization is disabled." + }, + "disabledOrganizationFilterError": { + "message": "Items in disabled Organizations cannot be accessed. Contact your Organization owner for assistance." } } diff --git a/apps/browser/src/_locales/hu/messages.json b/apps/browser/src/_locales/hu/messages.json index f74e2f4ae66..ec3d189daaf 100644 --- a/apps/browser/src/_locales/hu/messages.json +++ b/apps/browser/src/_locales/hu/messages.json @@ -423,10 +423,13 @@ "invalidEmail": { "message": "Érvénytelen email cím." }, - "masterPassRequired": { - "message": "Mesterjelszó megadása kötelező." + "masterPasswordRequired": { + "message": "A mesterjelszó megadása kötelező." }, - "masterPassLength": { + "confirmMasterPasswordRequired": { + "message": "A mesterjelszó ismételt megadása kötelező." + }, + "masterPasswordMinlength": { "message": "Mesterjelszónak legalább 8 karakter hosszúnak kell lennie." }, "masterPassDoesntMatch": { @@ -1480,7 +1483,7 @@ "acceptPolicies": { "message": "A doboz bejelölésével elfogadjuk a következőket:" }, - "acceptPoliciesError": { + "acceptPoliciesRequired": { "message": "A szolgáltatási feltételeket és az adatvédelmi irányelveket nem vették figyelembe." }, "termsOfService": { @@ -1846,7 +1849,7 @@ } } }, - "vaultTimeoutToLarge": { + "vaultTimeoutTooLarge": { "message": "A széf időkorlátja túllépi a szervezet által beállított korlátozást." }, "vaultExportDisabled": { @@ -1964,5 +1967,11 @@ }, "ssoKeyConnectorError": { "message": "Kulcs csatlakozó hiba: ellenőrizzük, hogy a kulcs csatlakozó rendelkezésre áll-e és megfelelően működik-e." + }, + "organizationIsDisabled": { + "message": "A szervezet letiltásra került." + }, + "disabledOrganizationFilterError": { + "message": "A letiltott szervezetek elemei nem érhetők el. Vegyük fel a kapcsolatot a szervezet tulajdonosával segítségért." } } diff --git a/apps/browser/src/_locales/id/messages.json b/apps/browser/src/_locales/id/messages.json index 3a46c3958df..f7cbaf2da40 100644 --- a/apps/browser/src/_locales/id/messages.json +++ b/apps/browser/src/_locales/id/messages.json @@ -423,11 +423,14 @@ "invalidEmail": { "message": "Alamat email tidak valid." }, - "masterPassRequired": { - "message": "Sandi utama diperlukan." + "masterPasswordRequired": { + "message": "Master password is required." }, - "masterPassLength": { - "message": "Kata sandi utama sedikitnya harus 8 karakter." + "confirmMasterPasswordRequired": { + "message": "Master password retype is required." + }, + "masterPasswordMinlength": { + "message": "Master password must be at least 8 characters long." }, "masterPassDoesntMatch": { "message": "Konfirmasi sandi utama tidak cocok." @@ -1480,8 +1483,8 @@ "acceptPolicies": { "message": "Dengan mencentang kotak ini, Anda menyetujui yang berikut:" }, - "acceptPoliciesError": { - "message": "Persyaratan Layanan dan Kebijakan Privasi belum disetujui." + "acceptPoliciesRequired": { + "message": "Terms of Service and Privacy Policy have not been acknowledged." }, "termsOfService": { "message": "Persyaratan Layanan" @@ -1846,8 +1849,8 @@ } } }, - "vaultTimeoutToLarge": { - "message": "Waktu tunggu brankas Anda melebihi batasan yang diatur organisasi Anda." + "vaultTimeoutTooLarge": { + "message": "Your vault timeout exceeds the restrictions set by your organization." }, "vaultExportDisabled": { "message": "Ekspor Brankas Dinonaktifkan" @@ -1964,5 +1967,11 @@ }, "ssoKeyConnectorError": { "message": "Key Connector error: make sure Key Connector is available and working correctly." + }, + "organizationIsDisabled": { + "message": "Organization is disabled." + }, + "disabledOrganizationFilterError": { + "message": "Items in disabled Organizations cannot be accessed. Contact your Organization owner for assistance." } } diff --git a/apps/browser/src/_locales/it/messages.json b/apps/browser/src/_locales/it/messages.json index cb21c1a2a0b..a3f9eb883e8 100644 --- a/apps/browser/src/_locales/it/messages.json +++ b/apps/browser/src/_locales/it/messages.json @@ -423,10 +423,13 @@ "invalidEmail": { "message": "Indirizzo email non valido." }, - "masterPassRequired": { - "message": "La password principale è obbligatoria." + "masterPasswordRequired": { + "message": "È necessario inserire la password principale." }, - "masterPassLength": { + "confirmMasterPasswordRequired": { + "message": "È necessario reinserire la password principale." + }, + "masterPasswordMinlength": { "message": "La password principale deve essere lunga almeno 8 caratteri." }, "masterPassDoesntMatch": { @@ -1480,7 +1483,7 @@ "acceptPolicies": { "message": "Selezionando la casella accetti quanto segue:" }, - "acceptPoliciesError": { + "acceptPoliciesRequired": { "message": "I termini di servizio e l'informativa sulla privacy non sono stati accettati." }, "termsOfService": { @@ -1846,7 +1849,7 @@ } } }, - "vaultTimeoutToLarge": { + "vaultTimeoutTooLarge": { "message": "Il timeout della tua cassaforte supera i limiti impostati dalla tua organizzazione." }, "vaultExportDisabled": { @@ -1964,5 +1967,11 @@ }, "ssoKeyConnectorError": { "message": "Errore Key Connector: assicurarsi che il Key Connector sia disponibile e correttamente funzionante." + }, + "organizationIsDisabled": { + "message": "L'organizzazione è disabilitata." + }, + "disabledOrganizationFilterError": { + "message": "Non è possibile accedere agli oggetti nelle organizzazioni disabilitate. Contatta il proprietario della tua organizzazione per ricevere assistenza." } } diff --git a/apps/browser/src/_locales/ja/messages.json b/apps/browser/src/_locales/ja/messages.json index 2ee4916870a..a8d87dcb899 100644 --- a/apps/browser/src/_locales/ja/messages.json +++ b/apps/browser/src/_locales/ja/messages.json @@ -423,10 +423,13 @@ "invalidEmail": { "message": "無効なEメールアドレスです。" }, - "masterPassRequired": { - "message": "マスターパスワードは必須です。" + "masterPasswordRequired": { + "message": "マスターパスワードが必要です。" }, - "masterPassLength": { + "confirmMasterPasswordRequired": { + "message": "マスターパスワードの再入力が必要です。" + }, + "masterPasswordMinlength": { "message": "マスターパスワードは、少なくとも8文字以上で設定してください。" }, "masterPassDoesntMatch": { @@ -1480,7 +1483,7 @@ "acceptPolicies": { "message": "以下に同意しチェックします:" }, - "acceptPoliciesError": { + "acceptPoliciesRequired": { "message": "利用規約とプライバシーポリシーを確認してください。" }, "termsOfService": { @@ -1846,7 +1849,7 @@ } } }, - "vaultTimeoutToLarge": { + "vaultTimeoutTooLarge": { "message": "保管庫のタイムアウトが組織によって設定された制限を超えています。" }, "vaultExportDisabled": { @@ -1964,5 +1967,11 @@ }, "ssoKeyConnectorError": { "message": "キーコネクターエラー: キーコネクターが使用可能で、正常に動作しているか確認してください。" + }, + "organizationIsDisabled": { + "message": "組織は無効です。" + }, + "disabledOrganizationFilterError": { + "message": "無効な組織のアイテムにアクセスすることはできません。組織の所有者に連絡してください。" } } diff --git a/apps/browser/src/_locales/ka/messages.json b/apps/browser/src/_locales/ka/messages.json index 1469a4e6279..be3f9cb0165 100644 --- a/apps/browser/src/_locales/ka/messages.json +++ b/apps/browser/src/_locales/ka/messages.json @@ -423,10 +423,13 @@ "invalidEmail": { "message": "არასწორი ელექტრო ფოსტის მისამართი." }, - "masterPassRequired": { + "masterPasswordRequired": { "message": "Master password is required." }, - "masterPassLength": { + "confirmMasterPasswordRequired": { + "message": "Master password retype is required." + }, + "masterPasswordMinlength": { "message": "Master password must be at least 8 characters long." }, "masterPassDoesntMatch": { @@ -1480,7 +1483,7 @@ "acceptPolicies": { "message": "By checking this box you agree to the following:" }, - "acceptPoliciesError": { + "acceptPoliciesRequired": { "message": "Terms of Service and Privacy Policy have not been acknowledged." }, "termsOfService": { @@ -1846,7 +1849,7 @@ } } }, - "vaultTimeoutToLarge": { + "vaultTimeoutTooLarge": { "message": "Your vault timeout exceeds the restrictions set by your organization." }, "vaultExportDisabled": { @@ -1964,5 +1967,11 @@ }, "ssoKeyConnectorError": { "message": "Key Connector error: make sure Key Connector is available and working correctly." + }, + "organizationIsDisabled": { + "message": "Organization is disabled." + }, + "disabledOrganizationFilterError": { + "message": "Items in disabled Organizations cannot be accessed. Contact your Organization owner for assistance." } } diff --git a/apps/browser/src/_locales/km/messages.json b/apps/browser/src/_locales/km/messages.json index 8fcb5822a75..4f15d3ae058 100644 --- a/apps/browser/src/_locales/km/messages.json +++ b/apps/browser/src/_locales/km/messages.json @@ -423,10 +423,13 @@ "invalidEmail": { "message": "Invalid email address." }, - "masterPassRequired": { + "masterPasswordRequired": { "message": "Master password is required." }, - "masterPassLength": { + "confirmMasterPasswordRequired": { + "message": "Master password retype is required." + }, + "masterPasswordMinlength": { "message": "Master password must be at least 8 characters long." }, "masterPassDoesntMatch": { @@ -1480,7 +1483,7 @@ "acceptPolicies": { "message": "By checking this box you agree to the following:" }, - "acceptPoliciesError": { + "acceptPoliciesRequired": { "message": "Terms of Service and Privacy Policy have not been acknowledged." }, "termsOfService": { @@ -1846,7 +1849,7 @@ } } }, - "vaultTimeoutToLarge": { + "vaultTimeoutTooLarge": { "message": "Your vault timeout exceeds the restrictions set by your organization." }, "vaultExportDisabled": { @@ -1964,5 +1967,11 @@ }, "ssoKeyConnectorError": { "message": "Key Connector error: make sure Key Connector is available and working correctly." + }, + "organizationIsDisabled": { + "message": "Organization is disabled." + }, + "disabledOrganizationFilterError": { + "message": "Items in disabled Organizations cannot be accessed. Contact your Organization owner for assistance." } } diff --git a/apps/browser/src/_locales/kn/messages.json b/apps/browser/src/_locales/kn/messages.json index ad29134d88d..5b54df57e2d 100644 --- a/apps/browser/src/_locales/kn/messages.json +++ b/apps/browser/src/_locales/kn/messages.json @@ -423,11 +423,14 @@ "invalidEmail": { "message": "ಅಮಾನ್ಯ ಇಮೇಲ್ ವಿಳಾಸ." }, - "masterPassRequired": { - "message": "ಮಾಸ್ಟರ್ ಪಾಸ್ವರ್ಡ್ ಅಗತ್ಯವಿದೆ." + "masterPasswordRequired": { + "message": "Master password is required." }, - "masterPassLength": { - "message": "ಮಾಸ್ಟರ್ ಪಾಸ್‌ವರ್ಡ್ ಕನಿಷ್ಠ 8 ಅಕ್ಷರಗಳಷ್ಟು ಉದ್ದವಾಗಿರಬೇಕು." + "confirmMasterPasswordRequired": { + "message": "Master password retype is required." + }, + "masterPasswordMinlength": { + "message": "Master password must be at least 8 characters long." }, "masterPassDoesntMatch": { "message": "ಮಾಸ್ಟರ್ ಪಾಸ್‌ವರ್ಡ್ ದೃಢೀಕರಣವು ಹೊಂದಿಕೆಯಾಗುವುದಿಲ್ಲ." @@ -1480,8 +1483,8 @@ "acceptPolicies": { "message": "ಈ ಪೆಟ್ಟಿಗೆಯನ್ನು ಪರಿಶೀಲಿಸುವ ಮೂಲಕ ನೀವು ಈ ಕೆಳಗಿನವುಗಳನ್ನು ಒಪ್ಪುತ್ತೀರಿ:" }, - "acceptPoliciesError": { - "message": "ಸೇವಾ ನಿಯಮಗಳು ಮತ್ತು ಗೌಪ್ಯತೆ ನೀತಿಯನ್ನು ಅಂಗೀಕರಿಸಲಾಗಿಲ್ಲ." + "acceptPoliciesRequired": { + "message": "Terms of Service and Privacy Policy have not been acknowledged." }, "termsOfService": { "message": "ಸೇವಾ ನಿಯಮಗಳು" @@ -1846,7 +1849,7 @@ } } }, - "vaultTimeoutToLarge": { + "vaultTimeoutTooLarge": { "message": "Your vault timeout exceeds the restrictions set by your organization." }, "vaultExportDisabled": { @@ -1964,5 +1967,11 @@ }, "ssoKeyConnectorError": { "message": "Key Connector error: make sure Key Connector is available and working correctly." + }, + "organizationIsDisabled": { + "message": "Organization is disabled." + }, + "disabledOrganizationFilterError": { + "message": "Items in disabled Organizations cannot be accessed. Contact your Organization owner for assistance." } } diff --git a/apps/browser/src/_locales/ko/messages.json b/apps/browser/src/_locales/ko/messages.json index 0cc063e4d4d..73262fc0280 100644 --- a/apps/browser/src/_locales/ko/messages.json +++ b/apps/browser/src/_locales/ko/messages.json @@ -53,13 +53,13 @@ "message": "탭" }, "vault": { - "message": "Vault" + "message": "보관함" }, "myVault": { "message": "내 보관함" }, "allVaults": { - "message": "All Vaults" + "message": "모든 보관함" }, "tools": { "message": "도구" @@ -423,11 +423,14 @@ "invalidEmail": { "message": "잘못된 이메일 주소입니다." }, - "masterPassRequired": { - "message": "마스터 비밀번호는 반드시 입력해야 합니다." + "masterPasswordRequired": { + "message": "마스터 비밀번호가 필요합니다." }, - "masterPassLength": { - "message": "마스터 비밀번호는 최소 8자 이상이어야 합니다." + "confirmMasterPasswordRequired": { + "message": "마스터 비밀번호를 재입력해야 합니다." + }, + "masterPasswordMinlength": { + "message": "Master password must be at least 8 characters long." }, "masterPassDoesntMatch": { "message": "마스터 비밀번호 확인과 마스터 비밀번호가 일치하지 않습니다." @@ -807,13 +810,13 @@ "message": "새로 고침 완료" }, "enableAutoTotpCopy": { - "message": "Copy TOTP automatically" + "message": "인증 코드 자동으로 복사하기" }, "disableAutoTotpCopyDesc": { "message": "로그인에 인증 키가 연결되어 있을 경우, 그 로그인을 자동 완성할 때마다 TOTP 인증 코드가 클립보드에 자동으로 복사됩니다." }, "enableAutoBiometricsPrompt": { - "message": "Ask for biometrics on launch" + "message": "실행 시 생체 인증 요구하기" }, "premiumRequired": { "message": "프리미엄 멤버십 필요" @@ -1034,7 +1037,7 @@ "message": "이 브라우저의 팝업 창에서는 U2F 요청을 처리할 수 없습니다. U2F로 로그인할 수 있도록 이 창을 새 창에서 여시겠습니까?" }, "enableFavicon": { - "message": "Show website icons" + "message": "웹사이트 아이콘 표시하기" }, "faviconDesc": { "message": "Show a recognizable image next to each login." @@ -1480,8 +1483,8 @@ "acceptPolicies": { "message": "이 박스를 체크하면 다음에 동의하는 것으로 간주됩니다:" }, - "acceptPoliciesError": { - "message": "서비스 약관 및 개인 정보 보호 정책을 확인하지 않았습니다." + "acceptPoliciesRequired": { + "message": "Terms of Service and Privacy Policy have not been acknowledged." }, "termsOfService": { "message": "서비스 약관" @@ -1846,8 +1849,8 @@ } } }, - "vaultTimeoutToLarge": { - "message": "볼트 제한 시간이 조직에서 설정한 제한을 초과합니다." + "vaultTimeoutTooLarge": { + "message": "Your vault timeout exceeds the restrictions set by your organization." }, "vaultExportDisabled": { "message": "보관함 내보내기 비활성화됨" @@ -1895,7 +1898,7 @@ "message": "개인 보관함을 내보내는 중" }, "exportingPersonalVaultDescription": { - "message": "Only the personal vault items associated with $EMAIL$ will be exported. Organization vault items will not be included.", + "message": "오직 $EMAIL$와 연관된 개인 보관함의 항목만 내보내집니다. 조직 보관함의 항목은 포함되지 않습니다.", "placeholders": { "email": { "content": "$1", @@ -1957,12 +1960,18 @@ "description": "Part of a URL." }, "apiAccessToken": { - "message": "API Access Token" + "message": "API 액세스 토큰" }, "apiKey": { - "message": "API Key" + "message": "API 키" }, "ssoKeyConnectorError": { - "message": "Key Connector error: make sure Key Connector is available and working correctly." + "message": "키 커넥터 오류: 키 커넥터가 사용 가능한지 및 정상적으로 작동하고 있는지 확인해주세요." + }, + "organizationIsDisabled": { + "message": "Organization is disabled." + }, + "disabledOrganizationFilterError": { + "message": "Items in disabled Organizations cannot be accessed. Contact your Organization owner for assistance." } } diff --git a/apps/browser/src/_locales/lt/messages.json b/apps/browser/src/_locales/lt/messages.json index c599f5c9bc9..1589196eba2 100644 --- a/apps/browser/src/_locales/lt/messages.json +++ b/apps/browser/src/_locales/lt/messages.json @@ -423,11 +423,14 @@ "invalidEmail": { "message": "Klaidingas el. pašto adresas." }, - "masterPassRequired": { - "message": "Būtinas pagrindinis slaptažodis." + "masterPasswordRequired": { + "message": "Master password is required." }, - "masterPassLength": { - "message": "Pagrindinis slaptažodis turi būti bent 8 simbolių ilgio." + "confirmMasterPasswordRequired": { + "message": "Master password retype is required." + }, + "masterPasswordMinlength": { + "message": "Master password must be at least 8 characters long." }, "masterPassDoesntMatch": { "message": "Pagrindinio slaptažodžio patvirtinimas nesutampa." @@ -1480,7 +1483,7 @@ "acceptPolicies": { "message": "By checking this box you agree to the following:" }, - "acceptPoliciesError": { + "acceptPoliciesRequired": { "message": "Terms of Service and Privacy Policy have not been acknowledged." }, "termsOfService": { @@ -1846,7 +1849,7 @@ } } }, - "vaultTimeoutToLarge": { + "vaultTimeoutTooLarge": { "message": "Your vault timeout exceeds the restrictions set by your organization." }, "vaultExportDisabled": { @@ -1964,5 +1967,11 @@ }, "ssoKeyConnectorError": { "message": "Key Connector error: make sure Key Connector is available and working correctly." + }, + "organizationIsDisabled": { + "message": "Organization is disabled." + }, + "disabledOrganizationFilterError": { + "message": "Items in disabled Organizations cannot be accessed. Contact your Organization owner for assistance." } } diff --git a/apps/browser/src/_locales/lv/messages.json b/apps/browser/src/_locales/lv/messages.json index 0a3e3b98a3d..a235245db03 100644 --- a/apps/browser/src/_locales/lv/messages.json +++ b/apps/browser/src/_locales/lv/messages.json @@ -423,10 +423,13 @@ "invalidEmail": { "message": "Nederīga e-pasta adrese." }, - "masterPassRequired": { - "message": "Galvenā parole ir nepieciešama." + "masterPasswordRequired": { + "message": "Master password is required." }, - "masterPassLength": { + "confirmMasterPasswordRequired": { + "message": "Master password retype is required." + }, + "masterPasswordMinlength": { "message": "Galvenajai parolei ir jābūt vismaz 8 rakstzīmes garai." }, "masterPassDoesntMatch": { @@ -1480,8 +1483,8 @@ "acceptPolicies": { "message": "Atzīmējot šo rūtiņu, Tu piekrīti sekojošajam:" }, - "acceptPoliciesError": { - "message": "Nav pieņemti izmantošanas nosacījumi un privātuma politika." + "acceptPoliciesRequired": { + "message": "Terms of Service and Privacy Policy have not been acknowledged." }, "termsOfService": { "message": "Izmantošanas nosacījumi" @@ -1846,8 +1849,8 @@ } } }, - "vaultTimeoutToLarge": { - "message": "Glabātavas noildze pāŗsniedz apvienības uzstādītos ierobežojumus." + "vaultTimeoutTooLarge": { + "message": "Glabātavas noildze pārsniedz apvienības uzstādītos ierobežojumus." }, "vaultExportDisabled": { "message": "Glabātavas izgūšana ir atspējota" @@ -1964,5 +1967,11 @@ }, "ssoKeyConnectorError": { "message": "Key Connector kļūda: jāpārliecinās, ka Key Connector ir pieejams un darbojas pareizi." + }, + "organizationIsDisabled": { + "message": "Apvienība ir atspējota." + }, + "disabledOrganizationFilterError": { + "message": "Atspējotu apvienību vienumiem nevar piekļūt. Jāsazinās ar apvienības īpašnieku, lai iegūtu palīdzību." } } diff --git a/apps/browser/src/_locales/ml/messages.json b/apps/browser/src/_locales/ml/messages.json index 5f781ed6bdb..fdac5668852 100644 --- a/apps/browser/src/_locales/ml/messages.json +++ b/apps/browser/src/_locales/ml/messages.json @@ -423,11 +423,14 @@ "invalidEmail": { "message": "അസാധുവായ ഇമെയിൽ." }, - "masterPassRequired": { - "message": "പ്രാഥമിക പാസ്‌വേഡ് നിർബന്ധമാണ്‌." + "masterPasswordRequired": { + "message": "Master password is required." }, - "masterPassLength": { - "message": "പ്രാഥമിക പാസ്‌വേഡിന് കുറഞ്ഞത് 8 പ്രതീകങ്ങളെങ്കിലും ദൈർഘ്യമുണ്ടായിരിക്കണം." + "confirmMasterPasswordRequired": { + "message": "Master password retype is required." + }, + "masterPasswordMinlength": { + "message": "Master password must be at least 8 characters long." }, "masterPassDoesntMatch": { "message": "പ്രാഥമിക പാസ്‌വേഡ് സ്ഥിരീകരണം പൊരുത്തപ്പെടുന്നില്ല." @@ -1480,8 +1483,8 @@ "acceptPolicies": { "message": "ഈ ബോക്സ് ചെക്കുചെയ്യുന്നതിലൂടെ നിങ്ങൾ ഇനിപ്പറയുന്നവ അംഗീകരിക്കുന്നു:" }, - "acceptPoliciesError": { - "message": "സേവന നിബന്ധനകളും സ്വകാര്യതാ നയവും അംഗീകരിച്ചിട്ടില്ല." + "acceptPoliciesRequired": { + "message": "Terms of Service and Privacy Policy have not been acknowledged." }, "termsOfService": { "message": "സേവന നിബന്ധനകൾ" @@ -1846,7 +1849,7 @@ } } }, - "vaultTimeoutToLarge": { + "vaultTimeoutTooLarge": { "message": "Your vault timeout exceeds the restrictions set by your organization." }, "vaultExportDisabled": { @@ -1964,5 +1967,11 @@ }, "ssoKeyConnectorError": { "message": "Key Connector error: make sure Key Connector is available and working correctly." + }, + "organizationIsDisabled": { + "message": "Organization is disabled." + }, + "disabledOrganizationFilterError": { + "message": "Items in disabled Organizations cannot be accessed. Contact your Organization owner for assistance." } } diff --git a/apps/browser/src/_locales/nb/messages.json b/apps/browser/src/_locales/nb/messages.json index f4e1baf0efa..8563a341318 100644 --- a/apps/browser/src/_locales/nb/messages.json +++ b/apps/browser/src/_locales/nb/messages.json @@ -423,11 +423,14 @@ "invalidEmail": { "message": "Ugyldig E-postadresse." }, - "masterPassRequired": { - "message": "Superpassordet er påkrevd." + "masterPasswordRequired": { + "message": "Hovedpassord er påkrevd." }, - "masterPassLength": { - "message": "Superpassordet må være ≥8 tegn lang." + "confirmMasterPasswordRequired": { + "message": "Skriv inn hovedpassordet på nytt." + }, + "masterPasswordMinlength": { + "message": "Hovedpassordet må være minst åtte tegn." }, "masterPassDoesntMatch": { "message": "Superpassord-bekreftelsen er ikke samsvarende." @@ -568,22 +571,22 @@ "description": "This is the folder for uncategorized items" }, "enableAddLoginNotification": { - "message": "Ask to add login" + "message": "Spør om å legge til innlogging" }, "addLoginNotificationDesc": { "message": "\"Legg til innlogging\"-beskjeden ber deg automatisk om å lagre nye innlogginger til hvelvet ditt hver gang du logger på dem for første gang." }, "showCardsCurrentTab": { - "message": "Show cards on Tab page" + "message": "Vis kort på fanesiden" }, "showCardsCurrentTabDesc": { - "message": "List card items on the Tab page for easy auto-fill." + "message": "Vis kortelementer på fanesiden for lett auto-utfylling." }, "showIdentitiesCurrentTab": { - "message": "Show identities on Tab page" + "message": "Vis identiteter på fanesiden" }, "showIdentitiesCurrentTabDesc": { - "message": "List identity items on the Tab page for easy auto-fill." + "message": "Vis identitetselementer på fanesiden for enkel auto-utfylling." }, "clearClipboard": { "message": "Tøm utklippstavlen", @@ -600,10 +603,10 @@ "message": "Ja, lagre nå" }, "enableChangedPasswordNotification": { - "message": "Ask to update existing login" + "message": "Spør om å oppdatere eksisterende innlogginger" }, "changedPasswordNotificationDesc": { - "message": "Ask to update a login's password when a change is detected on a website." + "message": "Spør om å oppdatere passordet til innlogging når endring på nettside oppdages." }, "notificationChangeDesc": { "message": "Vil du oppdatere dette passordet i Bitwarden?" @@ -612,10 +615,10 @@ "message": "Ja, oppdater nå" }, "enableContextMenuItem": { - "message": "Show context menu options" + "message": "Vis alternativer for kontekstmeny" }, "contextMenuItemDesc": { - "message": "Use a secondary click to access password generation and matching logins for the website. " + "message": "Bruk et sekundært klikk for å få tilgang til passordgenerering og samsvarende innlogginger for nettsiden. " }, "defaultUriMatchDetection": { "message": "Standard URI-samsvarsgjenkjenning", @@ -807,13 +810,13 @@ "message": "Oppfriskning fullført" }, "enableAutoTotpCopy": { - "message": "Copy TOTP automatically" + "message": "Kopier TOTP automatisk" }, "disableAutoTotpCopyDesc": { "message": "Dersom din innlogging har en autentiseringsnøkkel knyttet til den, blir TOTP-verifiseringskoden automatisk kopiert til utklippstavlen din når enn du auto-utfyller innloggingen." }, "enableAutoBiometricsPrompt": { - "message": "Ask for biometrics on launch" + "message": "Spør om biometri ved oppstart" }, "premiumRequired": { "message": "Premium er påkrevd" @@ -1034,16 +1037,16 @@ "message": "Denne nettleseren kan ikke behandle U2F-forespørsler i dette popup-vinduet. Vil du åpne denne popupen i et nytt vindu, slik at du kan logge deg på med U2F?" }, "enableFavicon": { - "message": "Show website icons" + "message": "Vis nettsideikoner" }, "faviconDesc": { - "message": "Show a recognizable image next to each login." + "message": "Vis et gjenkjennelig bilde ved siden av hver innlogging." }, "enableBadgeCounter": { - "message": "Show badge counter" + "message": "Vis merke-teller" }, "badgeCounterDesc": { - "message": "Indicate how many logins you have for the current web page." + "message": "Indiker hvor mange innlogginger du har for den aktuelle nettsiden." }, "cardholderName": { "message": "Kortholderens navn" @@ -1480,8 +1483,8 @@ "acceptPolicies": { "message": "Ved å merke av denne boksen sier du deg enig i følgende:" }, - "acceptPoliciesError": { - "message": "Vilkårene for bruk og personvernerklæring er ikke akseptert." + "acceptPoliciesRequired": { + "message": "Vilkårene for tjeneste og personvernerklæring er ikke akseptert." }, "termsOfService": { "message": "Vilkår for bruk" @@ -1846,8 +1849,8 @@ } } }, - "vaultTimeoutToLarge": { - "message": "Tidsavbruddet ditt for hvelvet overstiger begrensningene som er satt av organisasjonen din." + "vaultTimeoutTooLarge": { + "message": "Tidsavbrudd i hvelvet ditt overskrider restriksjoner fastsatt av din organisasjon." }, "vaultExportDisabled": { "message": "Hvelveksportering er skrudd av" @@ -1964,5 +1967,11 @@ }, "ssoKeyConnectorError": { "message": "Key Connector feil: Sjekk at Key Connector er tilgjengelig og fungerer." + }, + "organizationIsDisabled": { + "message": "Organization is disabled." + }, + "disabledOrganizationFilterError": { + "message": "Items in disabled Organizations cannot be accessed. Contact your Organization owner for assistance." } } diff --git a/apps/browser/src/_locales/nl/messages.json b/apps/browser/src/_locales/nl/messages.json index a383527cad9..43c575cfa17 100644 --- a/apps/browser/src/_locales/nl/messages.json +++ b/apps/browser/src/_locales/nl/messages.json @@ -423,11 +423,14 @@ "invalidEmail": { "message": "Ongeldig e-mailadres." }, - "masterPassRequired": { - "message": "Hoofdwachtwoord is vereist." + "masterPasswordRequired": { + "message": "Hoofdwachtwoord vereist." }, - "masterPassLength": { - "message": "Hoofdwachtwoord moet minstens 8 tekens lang zijn." + "confirmMasterPasswordRequired": { + "message": "Type je hoofdwachtwoord opnieuw in." + }, + "masterPasswordMinlength": { + "message": "Het hoofdwachtwoord moet minimaal 8 tekens lang zijn." }, "masterPassDoesntMatch": { "message": "De hoofdwachtwoorden komen niet overeen." @@ -1480,8 +1483,8 @@ "acceptPolicies": { "message": "Door dit vakje aan te vinken, ga je akkoord met het volgende:" }, - "acceptPoliciesError": { - "message": "Algemene voorwaarden en privacybeleid zijn nog niet erkend." + "acceptPoliciesRequired": { + "message": "Je hebt de algemene voorwaarden en het privacybeleid nog niet erkend." }, "termsOfService": { "message": "Algemene voorwaarden" @@ -1846,7 +1849,7 @@ } } }, - "vaultTimeoutToLarge": { + "vaultTimeoutTooLarge": { "message": "Je kluis time-out is hoger dan het maximum van jouw organisatie." }, "vaultExportDisabled": { @@ -1964,5 +1967,11 @@ }, "ssoKeyConnectorError": { "message": "Key-connector fout: zorg ervoor dat Key-connector beschikbaar is en werkt." + }, + "organizationIsDisabled": { + "message": "Organisatie is uitgeschakeld." + }, + "disabledOrganizationFilterError": { + "message": "Je kunt uitgeschakelde items in een organisatie niet benaderen. Neem contact op met de eigenaar van je organisatie voor hulp." } } diff --git a/apps/browser/src/_locales/nn/messages.json b/apps/browser/src/_locales/nn/messages.json index 8fcb5822a75..4f15d3ae058 100644 --- a/apps/browser/src/_locales/nn/messages.json +++ b/apps/browser/src/_locales/nn/messages.json @@ -423,10 +423,13 @@ "invalidEmail": { "message": "Invalid email address." }, - "masterPassRequired": { + "masterPasswordRequired": { "message": "Master password is required." }, - "masterPassLength": { + "confirmMasterPasswordRequired": { + "message": "Master password retype is required." + }, + "masterPasswordMinlength": { "message": "Master password must be at least 8 characters long." }, "masterPassDoesntMatch": { @@ -1480,7 +1483,7 @@ "acceptPolicies": { "message": "By checking this box you agree to the following:" }, - "acceptPoliciesError": { + "acceptPoliciesRequired": { "message": "Terms of Service and Privacy Policy have not been acknowledged." }, "termsOfService": { @@ -1846,7 +1849,7 @@ } } }, - "vaultTimeoutToLarge": { + "vaultTimeoutTooLarge": { "message": "Your vault timeout exceeds the restrictions set by your organization." }, "vaultExportDisabled": { @@ -1964,5 +1967,11 @@ }, "ssoKeyConnectorError": { "message": "Key Connector error: make sure Key Connector is available and working correctly." + }, + "organizationIsDisabled": { + "message": "Organization is disabled." + }, + "disabledOrganizationFilterError": { + "message": "Items in disabled Organizations cannot be accessed. Contact your Organization owner for assistance." } } diff --git a/apps/browser/src/_locales/pl/messages.json b/apps/browser/src/_locales/pl/messages.json index 11c8d457606..1e98fcbaf01 100644 --- a/apps/browser/src/_locales/pl/messages.json +++ b/apps/browser/src/_locales/pl/messages.json @@ -423,10 +423,13 @@ "invalidEmail": { "message": "Adres e-mail jest nieprawidłowy." }, - "masterPassRequired": { + "masterPasswordRequired": { "message": "Hasło główne jest wymagane." }, - "masterPassLength": { + "confirmMasterPasswordRequired": { + "message": "Wymagane jest ponowne wpisanie hasła głównego." + }, + "masterPasswordMinlength": { "message": "Hasło główne musi zawierać co najmniej 8 znaków." }, "masterPassDoesntMatch": { @@ -1480,8 +1483,8 @@ "acceptPolicies": { "message": "Zaznaczając tę opcję, akceptujesz:" }, - "acceptPoliciesError": { - "message": "Nie zaakceptowałeś regulaminu i polityki prywatności." + "acceptPoliciesRequired": { + "message": "Warunki użytkowania i polityka prywatności nie zostały zaakceptowane." }, "termsOfService": { "message": "Regulamin" @@ -1846,7 +1849,7 @@ } } }, - "vaultTimeoutToLarge": { + "vaultTimeoutTooLarge": { "message": "Czas blokowania sejfu przekracza limit określony przez organizację." }, "vaultExportDisabled": { @@ -1964,5 +1967,11 @@ }, "ssoKeyConnectorError": { "message": "Błąd serwera Key Connector: upewnij się, że serwer Key Connector jest dostępny i działa poprawnie." + }, + "organizationIsDisabled": { + "message": "Organizacja jest wyłączona." + }, + "disabledOrganizationFilterError": { + "message": "Nie można uzyskać dostępu do elementów w wyłączonych organizacjach. Skontaktuj się z właścicielem organizacji, aby uzyskać pomoc." } } diff --git a/apps/browser/src/_locales/pt_BR/messages.json b/apps/browser/src/_locales/pt_BR/messages.json index 831ecfe1c43..6b3e0fe7b77 100644 --- a/apps/browser/src/_locales/pt_BR/messages.json +++ b/apps/browser/src/_locales/pt_BR/messages.json @@ -101,10 +101,10 @@ "message": "Sem credenciais correspondentes." }, "unlockVaultMenu": { - "message": "Desbloqueie seu Cofre" + "message": "Desbloqueie seu cofre" }, "loginToVaultMenu": { - "message": "Acesse o seu Cofre" + "message": "Acesse o seu cofre" }, "autoFillInfo": { "message": "Não há credenciais disponíveis para autopreenchimento para a aba do navegador atual." @@ -149,7 +149,7 @@ "message": "Alterar Senha Mestra" }, "fingerprintPhrase": { - "message": "Frase de Biometria", + "message": "Frase Biométrica", "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": { @@ -364,7 +364,7 @@ "message": "Senha mestra inválida" }, "vaultTimeout": { - "message": "Tempo limite do cofre." + "message": "Cofre - tempo esgotado" }, "lockNow": { "message": "Bloquear Agora" @@ -423,11 +423,14 @@ "invalidEmail": { "message": "Endereço de e-mail inválido." }, - "masterPassRequired": { - "message": "A senha mestra é obrigatória." + "masterPasswordRequired": { + "message": "A senha mestre é obrigatória." }, - "masterPassLength": { - "message": "A senha mestra deve ter pelo menos 8 caracteres." + "confirmMasterPasswordRequired": { + "message": "É necessário redigitar a senha mestre." + }, + "masterPasswordMinlength": { + "message": "A senha mestre deve ter pelo menos 8 caracteres." }, "masterPassDoesntMatch": { "message": "A confirmação da senha mestra não corresponde." @@ -574,16 +577,16 @@ "message": "A \"Notificação de Adicionar Login\" pede para salvar automaticamente novas logins para o seu cofre quando você inicia uma sessão em um site pela primeira vez." }, "showCardsCurrentTab": { - "message": "Mostrar cartões na aba atual" + "message": "Mostrar cartões em páginas com guias." }, "showCardsCurrentTabDesc": { - "message": "Listar itens do cartão na Aba para facilitar preenchimento automático." + "message": "Exibir itens de cartão em páginas com abas para simplificar o preenchimento automático" }, "showIdentitiesCurrentTab": { - "message": "Mostrar identidades na aba atual" + "message": "Exibir Identidades na Aba Atual" }, "showIdentitiesCurrentTabDesc": { - "message": "List identity items on the Tab page for easy auto-fill." + "message": "Liste os itens de identidade na aba atual para facilitar preenchimento automático." }, "clearClipboard": { "message": "Limpar Área de Transferência", @@ -600,10 +603,10 @@ "message": "Salvar" }, "enableChangedPasswordNotification": { - "message": "Ask to update existing login" + "message": "Pedir para atualizar os dados de login existentes" }, "changedPasswordNotificationDesc": { - "message": "Ask to update a login's password when a change is detected on a website." + "message": "Peça para atualizar a senha de login quando uma mudança for detectada em um site." }, "notificationChangeDesc": { "message": "Você quer atualizar esta senha no Bitwarden?" @@ -1480,8 +1483,8 @@ "acceptPolicies": { "message": "Ao marcar esta caixa, você concorda com o seguinte:" }, - "acceptPoliciesError": { - "message": "Os Termos de Serviço e a Política de Privacidade não foram reconhecidos." + "acceptPoliciesRequired": { + "message": "Os Termos de Serviço e a Política de Privacidade não foram aceitos." }, "termsOfService": { "message": "Termos de Serviço" @@ -1846,8 +1849,8 @@ } } }, - "vaultTimeoutToLarge": { - "message": "O tempo limite do seu cofre excede as restrições definidas por sua organização." + "vaultTimeoutTooLarge": { + "message": "Seu tempo de espera no cofre excede as restrições estabelecidas por sua organização." }, "vaultExportDisabled": { "message": "Exportação de Cofre Desativada" @@ -1964,5 +1967,11 @@ }, "ssoKeyConnectorError": { "message": "Erro de Key Connector: certifique-se de que a Key Connector está disponível e funcionando corretamente." + }, + "organizationIsDisabled": { + "message": "Organization is disabled." + }, + "disabledOrganizationFilterError": { + "message": "Items in disabled Organizations cannot be accessed. Contact your Organization owner for assistance." } } diff --git a/apps/browser/src/_locales/pt_PT/messages.json b/apps/browser/src/_locales/pt_PT/messages.json index 407c1933a55..bafcf80451e 100644 --- a/apps/browser/src/_locales/pt_PT/messages.json +++ b/apps/browser/src/_locales/pt_PT/messages.json @@ -52,9 +52,15 @@ "tab": { "message": "Separador" }, + "vault": { + "message": "Cofre" + }, "myVault": { "message": "Meu cofre" }, + "allVaults": { + "message": "Todos os Cofres" + }, "tools": { "message": "Ferramentas" }, @@ -89,16 +95,16 @@ "message": "Gerar palavra-passe (copiada)" }, "copyElementIdentifier": { - "message": "Copy Custom Field Name" + "message": "Copiar nome do campo personalizado" }, "noMatchingLogins": { "message": "Sem credencias correspondidas." }, - "vaultLocked": { - "message": "O cofre está bloqueado." + "unlockVaultMenu": { + "message": "Desbloqueie o seu cofre" }, - "vaultLoggedOut": { - "message": "Sessão terminada no cofre." + "loginToVaultMenu": { + "message": "Inicie sessão para abrir o seu cofre" }, "autoFillInfo": { "message": "Não existem credenciais disponíveis para auto-preencher para o separador de navegador atual." @@ -121,14 +127,26 @@ "continue": { "message": "Continuar" }, + "sendVerificationCode": { + "message": "Envie um código de verificação para o seu e-mail" + }, + "sendCode": { + "message": "Enviar o código" + }, + "codeSent": { + "message": "Código enviado" + }, "verificationCode": { "message": "Código de verificação" }, + "confirmIdentity": { + "message": "Confirme a sua identidade para continuar." + }, "account": { "message": "Conta" }, "changeMasterPassword": { - "message": "Alterar palavra-passe mestra" + "message": "Alterar Palavra-passe Mestra" }, "fingerprintPhrase": { "message": "Frase de impressão digital", @@ -139,10 +157,10 @@ "description": "A 'fingerprint phrase' is a unique word phrase (similar to a passphrase) that a user can use to authenticate their public key with another user, for the purposes of sharing." }, "twoStepLogin": { - "message": "Início de sessão de dois passos" + "message": "Início de Sessão de Dois Passos" }, "logOut": { - "message": "Terminar sessão" + "message": "Terminar Sessão" }, "about": { "message": "Acerca" @@ -154,7 +172,7 @@ "message": "Guardar" }, "move": { - "message": "Move" + "message": "Mover" }, "addFolder": { "message": "Adicionar pasta" @@ -217,6 +235,18 @@ "length": { "message": "Comprimento" }, + "uppercase": { + "message": "Maiúsculas (A-Z)" + }, + "lowercase": { + "message": "Minúsculas (a-z)" + }, + "numbers": { + "message": "Números (0-9)" + }, + "specialCharacters": { + "message": "Caracteres Especiais (!@#$%^&*)" + }, "numWords": { "message": "Número de palavras" }, @@ -308,8 +338,8 @@ "browserNotSupportClipboard": { "message": "O seu navegador web não suporta cópia fácil da área de transferência. Em alternativa, copie manualmente." }, - "verifyMasterPassword": { - "message": "Verificar palavra-passe mestra" + "verifyIdentity": { + "message": "Verificar Identidade" }, "yourVaultIsLocked": { "message": "O seu cofre está bloqueado. Verifique a sua palavra-passe mestra para continuar." @@ -376,7 +406,7 @@ "message": "Quando o sistema está bloqueado" }, "onRestart": { - "message": "Quando reiniciar o navegador" + "message": "Ao reiniciar o sistema" }, "never": { "message": "Nunca" @@ -393,11 +423,14 @@ "invalidEmail": { "message": "Endereço de email inválido." }, - "masterPassRequired": { - "message": "A palavra-passe mestra é requerida." + "masterPasswordRequired": { + "message": "A palavra-passe mestra é necessária." }, - "masterPassLength": { - "message": "A palavra-passe mestra tem de ter pelo menos 8 caracteres." + "confirmMasterPasswordRequired": { + "message": "É necessário reescrever a palavra-passe mestra." + }, + "masterPasswordMinlength": { + "message": "Master password must be at least 8 characters long." }, "masterPassDoesntMatch": { "message": "A confirmação da palavra-passe mestra não corresponde." @@ -411,6 +444,9 @@ "verificationCodeRequired": { "message": "O código de verificação é requerido." }, + "invalidVerificationCode": { + "message": "Código de verificação inválido" + }, "valueCopied": { "message": "$VALUE$ copiado(a)", "description": "Value has been copied to the clipboard.", @@ -515,6 +551,12 @@ "overwritePasswordConfirmation": { "message": "Tem a certeza de que pretende sobreescrever a palavra-passe atual?" }, + "overwriteUsername": { + "message": "Sobrescrever Nome de Utilizador" + }, + "overwriteUsernameConfirmation": { + "message": "Tem a certeza de que deseja sobrescrever o nome de utilizador atual?" + }, "searchFolder": { "message": "Pesquisar pasta" }, @@ -528,23 +570,23 @@ "message": "Nenhuma pasta", "description": "This is the folder for uncategorized items" }, - "disableAddLoginNotification": { - "message": "Desativar notificação de adicionar credencial" + "enableAddLoginNotification": { + "message": "Ask to add login" }, "addLoginNotificationDesc": { "message": "A \"notificação de adicionar credencial\" solicita-lhe automaticamente a guardar novas credenciais para o seu cofre quando inicia sessão nas mesmas pela primeira vez." }, - "dontShowCardsCurrentTab": { - "message": "Não mostrar cartões na página do separador" + "showCardsCurrentTab": { + "message": "Show cards on Tab page" }, - "dontShowCardsCurrentTabDesc": { - "message": "Os itens de cartões do seu cofre estão listados na página 'Separador atual' para acesso de auto-preenchimento fácil." + "showCardsCurrentTabDesc": { + "message": "List card items on the Tab page for easy auto-fill." }, - "dontShowIdentitiesCurrentTab": { - "message": "Não mostrar identidades na página do separador" + "showIdentitiesCurrentTab": { + "message": "Show identities on Tab page" }, - "dontShowIdentitiesCurrentTabDesc": { - "message": "Os itens de identidades do seu cofre estão listados na página 'Separador atual' para acesso de auto-preenchimento fácil." + "showIdentitiesCurrentTabDesc": { + "message": "List identity items on the Tab page for easy auto-fill." }, "clearClipboard": { "message": "Limpar área de transferência", @@ -560,14 +602,11 @@ "notificationAddSave": { "message": "Sim, guardar agora" }, - "notificationNeverSave": { - "message": "Nunca para este site" + "enableChangedPasswordNotification": { + "message": "Ask to update existing login" }, - "disableChangedPasswordNotification": { - "message": "Desativar notificação de palavra-passe alterada" - }, - "disableChangedPasswordNotificationDesc": { - "message": "A \"notificação de palavra-passe alterada\" solicita-lhe automaticamente para atualizar a palavra-passe de uma credencial no seu cofre quando deteta que a alterou num website." + "changedPasswordNotificationDesc": { + "message": "Ask to update a login's password when a change is detected on a website." }, "notificationChangeDesc": { "message": "Pretende atualizar esta palavra-passe no Bitwarden?" @@ -575,11 +614,11 @@ "notificationChangeSave": { "message": "Sim, atualizar agora" }, - "disableContextMenuItem": { - "message": "Desativar opções do menu de contexto" + "enableContextMenuItem": { + "message": "Show context menu options" }, - "disableContextMenuItemDesc": { - "message": "As opções do menu de contexto providenciam acesso rápido à geração de palavras-passe e credenciais para o website no seu separador atual." + "contextMenuItemDesc": { + "message": "Use a secondary click to access password generation and matching logins for the website. " }, "defaultUriMatchDetection": { "message": "Deteção de correspondência de URI predefinida", @@ -603,7 +642,7 @@ "description": "Light color" }, "solarizedDark": { - "message": "Solarized Dark", + "message": "Solarized escuro", "description": "'Solarized' is a noun and the name of a color scheme. It should not be translated." }, "exportVault": { @@ -617,16 +656,16 @@ "description": "WARNING (should stay in capitalized letters if the language permits)" }, "confirmVaultExport": { - "message": "Confirm Vault Export" + "message": "Confirmar exportação de cofre" }, "exportWarningDesc": { "message": "Esta exportação contém os seus dados do cofre num formato desencriptado. Não deve armazenar ou enviar o ficheiro exportado através de canais inseguros (como email). Apague-a imediatamente após a utilizar." }, "encExportKeyWarningDesc": { - "message": "This export encrypts your data using your account's encryption key. If you ever rotate your account's encryption key you should export again since you will not be able to decrypt this export file." + "message": "Esta exportação cifra os seus dados utilizando a chave de cifragem da sua conta. Se alguma vez mudar a chave de cifragem da sua conta, deve fazer a exportação novamente, já que não conseguirá decifrar este ficheiro de exportação." }, "encExportAccountWarningDesc": { - "message": "Account encryption keys are unique to each Bitwarden user account, so you can't import an encrypted export into a different account." + "message": "As chaves de encriptação de conta são únicas para cada conta de utilizador Bitwarden, pelo que não se pode importar uma exportação encriptada para uma conta diferente." }, "exportMasterPassword": { "message": "Introduza a sua palavra-passe mestra para exportar os dados do seu cofre." @@ -635,19 +674,19 @@ "message": "Partilhado" }, "learnOrg": { - "message": "Learn about Organizations" + "message": "Saiba mais sobre as Organizações" }, "learnOrgConfirmation": { - "message": "Bitwarden allows you to share your vault items with others by using an organization. Would you like to visit the bitwarden.com website to learn more?" + "message": "O Bitwarden permite que você compartilhe os itens do seu cofre com outras pessoas usando uma organização. Gostaria de visitar o site bitwarden.com para saber mais?" }, "moveToOrganization": { - "message": "Move to Organization" + "message": "Mudança para Organização" }, "share": { "message": "Partilhar" }, "movedItemToOrg": { - "message": "$ITEMNAME$ moved to $ORGNAME$", + "message": "$ITEMNAME$ movido para $ORGNAME$", "placeholders": { "itemname": { "content": "$1", @@ -660,7 +699,7 @@ } }, "moveToOrgDesc": { - "message": "Choose an organization that you wish to move this item to. Moving to an organization transfers ownership of the item to that organization. You will no longer be the direct owner of this item once it has been moved." + "message": "Escolha uma organização para a qual deseja mover este item. A mudança para uma organização transfere a propriedade do item para essa organização. Deixará de ser o proprietário directo deste item uma vez que tenha sido movido." }, "learnMore": { "message": "Saber mais" @@ -770,14 +809,14 @@ "refreshComplete": { "message": "Atualização completada" }, - "disableAutoTotpCopy": { - "message": "Desativar cópia automática de TOTP" + "enableAutoTotpCopy": { + "message": "Copy TOTP automatically" }, "disableAutoTotpCopyDesc": { - "message": "Se a sua credencial tem uma chave de autenticador anexada à mesma, o código de verificação TOTP é copiado automaticamente para a sua área de transferência quando quer que auto-preencha a credencial." + "message": "Se o seu início de sessão tem uma chave de autenticador anexada ao mesmo, o código de verificação TOTP é copiado automaticamente para a sua área de transferência quando quer que auto-preencha o início de sessão." }, - "disableAutoBiometricsPrompt": { - "message": "Do not prompt for biometrics on launch" + "enableAutoBiometricsPrompt": { + "message": "Ask for biometrics on launch" }, "premiumRequired": { "message": "Premium requerido" @@ -822,13 +861,13 @@ "message": "Introduza a sua chave de segurança na porta USB do seu computador. Se tiver um botão, toque no mesmo." }, "webAuthnNewTab": { - "message": "To start the WebAuthn 2FA verification. Click the button below to open a new tab and follow the instructions provided in the new tab." + "message": "Para iniciar a verificação WebAuthn 2FA. Clique no botão abaixo para abrir um novo separador e siga as instruções fornecidas no novo separador." }, "webAuthnNewTabOpen": { - "message": "Open new tab" + "message": "Abrir novo separador" }, "webAuthnAuthenticate": { - "message": "Authenticate WebAuthn" + "message": "Autenticar WebAuthn" }, "loginUnavailable": { "message": "Início de sessão indisponível" @@ -873,7 +912,7 @@ "message": "FIDO2 WebAuthn" }, "webAuthnDesc": { - "message": "Use any WebAuthn enabled security key to access your account." + "message": "Utilize qualquer chave de segurança ativada pela WebAuthn para aceder à sua conta." }, "emailTitle": { "message": "Email" @@ -918,28 +957,28 @@ "message": "Ativar auto-preenchimento no carregar da página" }, "enableAutoFillOnPageLoadDesc": { - "message": "Se um formulário de início de sessão for detetado, realizar automaticamente um auto-preenchimento quando a página web carregar." + "message": "Se um formulário de início de sessão foram detetado, realizar automaticamente um auto-preenchimento quando a página web carregar." }, "experimentalFeature": { "message": "Esta é atualmente uma funcionalidade experimental. Utilize por sua conta e risco." }, "defaultAutoFillOnPageLoad": { - "message": "Default autofill setting for login items" + "message": "Predefinição padrão de preenchimento automático para itens de login" }, "defaultAutoFillOnPageLoadDesc": { - "message": "After enabling Auto-fill on Page Load, you can enable or disable the feature for individual login items. This is the default setting for login items that are not separately configured." + "message": "Depois de activar o preenchimento automático no carregamento da página, pode activar ou desactivar a função de itens de início de sessão individuais. Esta é a configuração padrão para os itens de início de sessão que não estão configurados separadamente." }, "itemAutoFillOnPageLoad": { - "message": "Auto-fill on Page Load (if enabled in Options)" + "message": "Preenchimento automático no carregamento da página (se ativado em Opções)" }, "autoFillOnPageLoadUseDefault": { - "message": "Use default setting" + "message": "Usar padrão" }, "autoFillOnPageLoadYes": { - "message": "Auto-fill on page load" + "message": "Preenchimento automático na carga da página" }, "autoFillOnPageLoadNo": { - "message": "Do not auto-fill on page load" + "message": "Não preencher automaticamente no carregamento da página" }, "commandOpenPopup": { "message": "Abrir popup do cofre" @@ -956,8 +995,8 @@ "commandLockVaultDesc": { "message": "Bloquear o cofre" }, - "privateModeMessage": { - "message": "Infelizmente esta janela não está disponível no modo privado para este navegador." + "privateModeWarning": { + "message": "O suporte do modo privado é experimental e alguns recursos são limitados." }, "customFields": { "message": "Campos personalizados" @@ -983,23 +1022,31 @@ "cfTypeBoolean": { "message": "Booleano" }, + "cfTypeLinked": { + "message": "Ligado", + "description": "This describes a field that is 'linked' (tied) to another field." + }, + "linkedValue": { + "message": "Valor vinculado", + "description": "This describes a value that is 'linked' (tied) to another value." + }, "popup2faCloseMessage": { "message": "Clicar fora da janela popup para verificar o seu email pelo código de verificação irá causar com que este popup feche. Deseja abrir este popup numa nova janela para que este não se feche?" }, "popupU2fCloseMessage": { "message": "Este navegador não pode processar solicitações U2F nesta janela popup. Pretende abrir este popup numa nova janela para que inicie sessão utilizando U2F?" }, - "disableFavicon": { - "message": "Desativar ícones de websites" + "enableFavicon": { + "message": "Show website icons" }, - "disableFaviconDesc": { - "message": "Os ícones de websites providenciam uma imagem reconhecível ao lado de cada item de credencial no seu cofre." + "faviconDesc": { + "message": "Show a recognizable image next to each login." }, - "disableBadgeCounter": { - "message": "Disable Badge Counter" + "enableBadgeCounter": { + "message": "Show badge counter" }, - "disableBadgeCounterDesc": { - "message": "Badge counter indicates how many logins you have for the current page in your vault." + "badgeCounterDesc": { + "message": "Indicate how many logins you have for the current web page." }, "cardholderName": { "message": "Titular do cartão" @@ -1085,6 +1132,9 @@ "lastName": { "message": "Último nome" }, + "fullName": { + "message": "Nome Completo" + }, "identityName": { "message": "Nome de identidade" }, @@ -1198,7 +1248,12 @@ "message": "Esta palavra-passe não foi encontrada em nenhuma brecha de dados conhecida. Esta deve ser segura de utilizar." }, "baseDomain": { - "message": "Domínio base" + "message": "Domínio base", + "description": "Domain name. Ex. website.com" + }, + "domainName": { + "message": "Nome do Domínio", + "description": "Domain name. Ex. website.com" }, "host": { "message": "Servidor", @@ -1257,7 +1312,7 @@ "description": "ex. Date this item was updated" }, "datePasswordUpdated": { - "message": "Palavra passe atualizada", + "message": "Palavra-passe atualizada", "description": "ex. Date this password was updated" }, "neverLockWarning": { @@ -1309,20 +1364,14 @@ "invalidPin": { "message": "Código PIN inválido." }, - "verifyPin": { - "message": "Verificar PIN" - }, - "yourVaultIsLockedPinCode": { - "message": "O seu cofre está bloqueado. Verifique o seu PIN para continuar." - }, "unlockWithBiometrics": { - "message": "Unlock with biometrics" + "message": "Desbloquear com biométricos" }, "awaitDesktop": { - "message": "Awaiting confirmation from desktop" + "message": "A aguardar confirmação do seu computador" }, "awaitDesktopDesc": { - "message": "Please confirm using biometrics in the Bitwarden Desktop application to enable biometrics for browser." + "message": "Por favor, confirme o uso de dados biométricos na aplicação Bitwarden Desktop para habilitar os dados biométricos do navegador." }, "lockWithMasterPassOnRestart": { "message": "Bloquear com palavra-passe mestra quando reiniciar o navegador" @@ -1434,8 +1483,8 @@ "acceptPolicies": { "message": "Ao marcar esta caixa concorda com o seguinte:" }, - "acceptPoliciesError": { - "message": "Os Termos de Serviço e a Política de Privacidade não foram aceites." + "acceptPoliciesRequired": { + "message": "Os Termos de Serviço e a Política de Privacidade não foram reconhecidos." }, "termsOfService": { "message": "Termos de serviço" @@ -1444,28 +1493,28 @@ "message": "Política de privacidade" }, "hintEqualsPassword": { - "message": "Your password hint cannot be the same as your password." + "message": "A dica da sua senha não pode ser igual à senha." }, "ok": { "message": "Ok" }, "desktopSyncVerificationTitle": { - "message": "Desktop sync verification" + "message": "Verificação de sincronização do ambiente de trabalho" }, "desktopIntegrationVerificationText": { - "message": "Please verify that the desktop application shows this fingerprint: " + "message": "Por favor, verifique se a aplicação no computador mostra esta impressão digital: " }, "desktopIntegrationDisabledTitle": { - "message": "Browser integration is not enabled" + "message": "Integração com o navegador não está ativada" }, "desktopIntegrationDisabledDesc": { - "message": "Browser integration is not enabled in the Bitwarden Desktop application. Please enable it in the settings within the desktop application." + "message": "A integração com o navegador não está habilitada no aplicativo Bitwarden Desktop. Por favor, habilite-o nas configurações da aplicação para computador." }, "startDesktopTitle": { - "message": "Start the Bitwarden Desktop application" + "message": "Iniciar a aplicação Bitwarden Desktop" }, "startDesktopDesc": { - "message": "The Bitwarden Desktop application needs to be started before this function can be used." + "message": "The Bitwarden Desktop application needs to be started before unlock with biometrics can be used." }, "errorEnableBiometricTitle": { "message": "Unable to enable biometrics" @@ -1516,7 +1565,7 @@ "message": "An organization policy is affecting your ownership options." }, "excludedDomains": { - "message": "Excluded Domains" + "message": "Excluded domains" }, "excludedDomainsDesc": { "message": "Bitwarden will not ask to save login details for these domains. You must refresh the page for changes to take effect." @@ -1531,15 +1580,15 @@ } }, "send": { - "message": "Send", + "message": "Envio", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "searchSends": { - "message": "Search Sends", + "message": "Pesquisar Envios", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "addSend": { - "message": "Add Send", + "message": "Adicionar Envio", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendTypeText": { @@ -1549,20 +1598,21 @@ "message": "Ficheiro" }, "allSends": { - "message": "All Sends", + "message": "Todos os Envios", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "maxAccessCountReached": { - "message": "Max access count reached" + "message": "Número de acessos máximo atingido", + "description": "This text will be displayed after a Send has been accessed the maximum amount of times." }, "expired": { - "message": "Expired" + "message": "Expirado" }, "pendingDeletion": { - "message": "Pending deletion" + "message": "Remoção pendente" }, "passwordProtected": { - "message": "Password protected" + "message": "Protegido por senha" }, "copySendLink": { "message": "Copiar Send link", @@ -1575,47 +1625,47 @@ "message": "Eliminar" }, "removedPassword": { - "message": "Palavra-passe removida" + "message": "Senha removida" }, "deletedSend": { - "message": "Deleted Send", + "message": "Envio eliminado", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendLink": { - "message": "Send link", + "message": "Link de Envio", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "disabled": { - "message": "Disabled" + "message": "Desabilitado" }, "removePasswordConfirmation": { - "message": "Are you sure you want to remove the password?" + "message": "Tem a certeza que pretende remover a senha?" }, "deleteSend": { - "message": "Delete Send", + "message": "Eliminar Envio", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "deleteSendConfirmation": { - "message": "Are you sure you want to delete this Send?", + "message": "Tem a certeza que pretende eliminar este Envio?", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "editSend": { - "message": "Edit Send", + "message": "Editar Envio", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendTypeHeader": { - "message": "What type of Send is this?", + "message": "Que tipo de Envio é este?", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendNameDesc": { - "message": "A friendly name to describe this Send.", + "message": "Um nome amigável para descrever este Envio.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendFileDesc": { - "message": "The file you want to send." + "message": "O ficheiro que deseja enviar." }, "deletionDate": { - "message": "Deletion Date" + "message": "Data de eliminação" }, "deletionDateDesc": { "message": "The Send will be permanently deleted on the specified date and time.", @@ -1709,37 +1759,37 @@ "message": "In order to choose a file using Safari, pop out to a new window by clicking this banner." }, "sendFileCalloutHeader": { - "message": "Before you start" + "message": "Antes de começar" }, "sendFirefoxCustomDatePopoutMessage1": { - "message": "To use a calendar style date picker", + "message": "Para usar um seletor de data no estilo de calendário", "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read '**To use a calendar style date picker ** click here to pop out your window.'" }, "sendFirefoxCustomDatePopoutMessage2": { - "message": "click here", + "message": "clique aqui", "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'To use a calendar style date picker **click here** to pop out your window.'" }, "sendFirefoxCustomDatePopoutMessage3": { - "message": "to pop out your window.", + "message": "Para abrir em janela.", "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'To use a calendar style date picker click here **to pop out your window.**'" }, "expirationDateIsInvalid": { - "message": "The expiration date provided is not valid." + "message": "A data de validade fornecida não é válida." }, "deletionDateIsInvalid": { - "message": "The deletion date provided is not valid." + "message": "A data de eliminação fornecida não é válida." }, "expirationDateAndTimeRequired": { - "message": "An expiration date and time are required." + "message": "Uma data de validade e uma hora são obrigatórias." }, "deletionDateAndTimeRequired": { - "message": "A deletion date and time are required." + "message": "Uma data de eliminação e uma hora são obrigatórias." }, "dateParsingError": { - "message": "There was an error saving your deletion and expiration dates." + "message": "Ocorreu um erro ao guardar a sua exclusão e datas de validade." }, "hideEmail": { - "message": "Hide my email address from recipients." + "message": "Ocultar o meu endereço de correio eletrónico dos destinatários." }, "sendOptionsPolicyInEffect": { "message": "One or more organization policies are affecting your Send options." @@ -1760,31 +1810,31 @@ "message": "You must verify your email to use this feature. You can verify your email in the web vault." }, "updatedMasterPassword": { - "message": "Updated Master Password" + "message": "Palavra-passe Mestra Atualizada" }, "updateMasterPassword": { - "message": "Update Master Password" + "message": "Atualizar Senha Mestra" }, "updateMasterPasswordWarning": { "message": "Your Master Password was recently changed by an administrator in your organization. In order to access the vault, you must update it now. Proceeding will log you out of your current session, requiring you to log back in. Active sessions on other devices may continue to remain active for up to one hour." }, "resetPasswordPolicyAutoEnroll": { - "message": "Automatic Enrollment" + "message": "Inscrição Automática" }, "resetPasswordAutoEnrollInviteWarning": { "message": "This organization has an enterprise policy that will automatically enroll you in password reset. Enrollment will allow organization administrators to change your master password." }, "selectFolder": { - "message": "Select folder..." + "message": "Seleccionar pasta..." }, "ssoCompleteRegistration": { "message": "In order to complete logging in with SSO, please set a master password to access and protect your vault." }, "hours": { - "message": "Hours" + "message": "Horas" }, "minutes": { - "message": "Minutes" + "message": "Minutos" }, "vaultTimeoutPolicyInEffect": { "message": "Your organization policies are affecting your vault timeout. Maximum allowed Vault Timeout is $HOURS$ hour(s) and $MINUTES$ minute(s)", @@ -1799,7 +1849,7 @@ } } }, - "vaultTimeoutToLarge": { + "vaultTimeoutTooLarge": { "message": "Your vault timeout exceeds the restrictions set by your organization." }, "vaultExportDisabled": { @@ -1813,5 +1863,115 @@ }, "copyCustomFieldNameNotUnique": { "message": "No unique identifier found." + }, + "convertOrganizationEncryptionDesc": { + "message": "$ORGANIZATION$ is using SSO with a self-hosted key server. A master password is no longer required to log in for members of this organization.", + "placeholders": { + "organization": { + "content": "$1", + "example": "My Org Name" + } + } + }, + "leaveOrganization": { + "message": "Deixar a Organização" + }, + "removeMasterPassword": { + "message": "Remover Senha Mestra" + }, + "removedMasterPassword": { + "message": "Senha mestra removida." + }, + "leaveOrganizationConfirmation": { + "message": "Tem a certeza de que pretende sair desta organização?" + }, + "leftOrganization": { + "message": "Saiu da organização." + }, + "toggleCharacterCount": { + "message": "Toggle character count" + }, + "sessionTimeout": { + "message": "A sua sessão expirou. Por favor, volte atrás e tente iniciar sessão novamente." + }, + "exportingPersonalVaultTitle": { + "message": "A Exportar Cofre Pessoal" + }, + "exportingPersonalVaultDescription": { + "message": "Apenas os itens do cofre pessoal associado ao $EMAIL$ serão exportados. Os itens do cofre da organização não serão incluídos.", + "placeholders": { + "email": { + "content": "$1", + "example": "name@example.com" + } + } + }, + "error": { + "message": "Erro" + }, + "regenerateUsername": { + "message": "Regerar Nome de Utilizador" + }, + "generateUsername": { + "message": "Gerar Nome de Utilizador" + }, + "usernameType": { + "message": "Tipo de Nome de Utilizador" + }, + "plusAddressedEmail": { + "message": "Plus Addressed Email", + "description": "Username generator option that appends a random sub-address to the username. For example: address+subaddress@email.com" + }, + "plusAddressedEmailDesc": { + "message": "Use your email provider's sub-addressing capabilities." + }, + "catchallEmail": { + "message": "Catch-all Email" + }, + "catchallEmailDesc": { + "message": "Use your domain's configured catch-all inbox." + }, + "random": { + "message": "Aleatório" + }, + "randomWord": { + "message": "Palavra Aleatória" + }, + "websiteName": { + "message": "Nome do Site" + }, + "whatWouldYouLikeToGenerate": { + "message": "O que desejaria de gerar?" + }, + "passwordType": { + "message": "Tipo de Palavra-passe" + }, + "service": { + "message": "Serviço" + }, + "forwardedEmail": { + "message": "Forwarded Email Alias" + }, + "forwardedEmailDesc": { + "message": "Generate an email alias with an external forwarding service." + }, + "hostname": { + "message": "Hostname", + "description": "Part of a URL." + }, + "apiAccessToken": { + "message": "Token de acesso da API" + }, + "apiKey": { + "message": "Chave da API" + }, + "ssoKeyConnectorError": { + "message": "Key Connector error: make sure Key Connector is available and working correctly." + }, + "organizationIsDisabled": { + "message": "Organization is disabled." + }, + "disabledOrganizationFilterError": { + "message": "Items in disabled Organizations cannot be accessed. Contact your Organization owner for assistance." } } diff --git a/apps/browser/src/_locales/ro/messages.json b/apps/browser/src/_locales/ro/messages.json index a260f46af95..e2a9080d648 100644 --- a/apps/browser/src/_locales/ro/messages.json +++ b/apps/browser/src/_locales/ro/messages.json @@ -423,11 +423,14 @@ "invalidEmail": { "message": "Adresă de e-mail greșită." }, - "masterPassRequired": { - "message": "Este necesară parola principală." + "masterPasswordRequired": { + "message": "Este necesară o parolă principală." }, - "masterPassLength": { - "message": "Parola principală trebuie să conțină minimum 8 caractere." + "confirmMasterPasswordRequired": { + "message": "Este necesară rescrierea parolei principale." + }, + "masterPasswordMinlength": { + "message": "Parola principală trebuie să aibă cel puțin 8 caractere." }, "masterPassDoesntMatch": { "message": "Parola principală și confirmarea ei nu coincid!" @@ -568,7 +571,7 @@ "description": "This is the folder for uncategorized items" }, "enableAddLoginNotification": { - "message": "Solicitați adăugarea autentificării" + "message": "Solicitare de adăugare cont" }, "addLoginNotificationDesc": { "message": "Solicitați adăugarea unui element dacă nu se găsește unul în seif." @@ -1480,8 +1483,8 @@ "acceptPolicies": { "message": "Dacă bifați această casetă sunteți de acord cu următoarele:" }, - "acceptPoliciesError": { - "message": "Termenii de utilizare și Politica de confidențialitate nu au fost recunoscute." + "acceptPoliciesRequired": { + "message": "Termeni de utilizare și Politica de confidențialitate nu au fost recunoscute." }, "termsOfService": { "message": "Termeni de utilizare" @@ -1846,8 +1849,8 @@ } } }, - "vaultTimeoutToLarge": { - "message": "Timpul de expirare a seifului depășește restricțiile stabilite de organizația dvs." + "vaultTimeoutTooLarge": { + "message": "Timpul de expirare al seifului depășește restricțiile stabilite de organizația dvs." }, "vaultExportDisabled": { "message": "Export de seif dezactivat" @@ -1964,5 +1967,11 @@ }, "ssoKeyConnectorError": { "message": "Eroare de Conector Cheie: asigurați-vă că aveți conectorul Cheie disponibil și că funcționează corect." + }, + "organizationIsDisabled": { + "message": "Organizația este dezactivată." + }, + "disabledOrganizationFilterError": { + "message": "Articolele din Organizațiile dezactivate nu pot fi accesate. Contactați proprietarul Organizației pentru asistență." } } diff --git a/apps/browser/src/_locales/ru/messages.json b/apps/browser/src/_locales/ru/messages.json index d507c95aa64..12da8e6e50f 100644 --- a/apps/browser/src/_locales/ru/messages.json +++ b/apps/browser/src/_locales/ru/messages.json @@ -423,10 +423,13 @@ "invalidEmail": { "message": "Неверный адрес email." }, - "masterPassRequired": { - "message": "Необходимо ввести мастер-пароль." + "masterPasswordRequired": { + "message": "Требуется мастер-пароль." }, - "masterPassLength": { + "confirmMasterPasswordRequired": { + "message": "Необходимо повторно ввести мастер-пароль." + }, + "masterPasswordMinlength": { "message": "Мастер-пароль должен содержать не менее 8 символов." }, "masterPassDoesntMatch": { @@ -1480,7 +1483,7 @@ "acceptPolicies": { "message": "Отметив этот флажок, вы соглашаетесь со следующим:" }, - "acceptPoliciesError": { + "acceptPoliciesRequired": { "message": "Условия предоставления услуг и Политика конфиденциальности не были подтверждены." }, "termsOfService": { @@ -1846,8 +1849,8 @@ } } }, - "vaultTimeoutToLarge": { - "message": "Время ожидания превышает ограничения, установленные вашей организацией." + "vaultTimeoutTooLarge": { + "message": "Тайм-аут вашего хранилища превышает ограничения, установленные вашей организацией." }, "vaultExportDisabled": { "message": "Экспорт хранилища отключен" @@ -1964,5 +1967,11 @@ }, "ssoKeyConnectorError": { "message": "Ошибка соединителя ключей: убедитесь, что он доступен и работает корректно." + }, + "organizationIsDisabled": { + "message": "Организация отключена." + }, + "disabledOrganizationFilterError": { + "message": "Доступ к элементам в отключенных организациях невозможен. Обратитесь за помощью к владельцу организации." } } diff --git a/apps/browser/src/_locales/si/messages.json b/apps/browser/src/_locales/si/messages.json index 5849355ecbf..4654f89aec9 100644 --- a/apps/browser/src/_locales/si/messages.json +++ b/apps/browser/src/_locales/si/messages.json @@ -423,11 +423,14 @@ "invalidEmail": { "message": "වලංගු නොවන විද්යුත් තැපැල් ලිපිනය." }, - "masterPassRequired": { - "message": "ප්රධාන මුරපදය අවශ්ය වේ." + "masterPasswordRequired": { + "message": "Master password is required." }, - "masterPassLength": { - "message": "ප්රධාන මුරපදය අවම වශයෙන් අක්ෂර 8 ක් දිගු විය යුතුය." + "confirmMasterPasswordRequired": { + "message": "Master password retype is required." + }, + "masterPasswordMinlength": { + "message": "Master password must be at least 8 characters long." }, "masterPassDoesntMatch": { "message": "ප්රධාන මුරපදය තහවුරු කිරීම නොගැලපේ." @@ -1480,8 +1483,8 @@ "acceptPolicies": { "message": "මෙම කොටුව පරීක්ෂා කිරීමෙන් ඔබ පහත සඳහන් දෑ වලට එකඟ වේ:" }, - "acceptPoliciesError": { - "message": "සේවා කොන්දේසි සහ රහස්යතා ප්රතිපත්තිය පිළිගෙන නොමැත." + "acceptPoliciesRequired": { + "message": "Terms of Service and Privacy Policy have not been acknowledged." }, "termsOfService": { "message": "සේවා කොන්දේසි" @@ -1846,8 +1849,8 @@ } } }, - "vaultTimeoutToLarge": { - "message": "ඔබේ සුරක්ෂිතාගාරය කාලය ඔබේ සංවිධානය විසින් නියම කර ඇති සීමාවන් ඉක්මවා යයි." + "vaultTimeoutTooLarge": { + "message": "Your vault timeout exceeds the restrictions set by your organization." }, "vaultExportDisabled": { "message": "ආබාධිත අපනයන සුරක්ෂිතාගාරය" @@ -1964,5 +1967,11 @@ }, "ssoKeyConnectorError": { "message": "Key Connector error: make sure Key Connector is available and working correctly." + }, + "organizationIsDisabled": { + "message": "Organization is disabled." + }, + "disabledOrganizationFilterError": { + "message": "Items in disabled Organizations cannot be accessed. Contact your Organization owner for assistance." } } diff --git a/apps/browser/src/_locales/sk/messages.json b/apps/browser/src/_locales/sk/messages.json index 7afc581fdc1..f9d72f35bce 100644 --- a/apps/browser/src/_locales/sk/messages.json +++ b/apps/browser/src/_locales/sk/messages.json @@ -423,10 +423,13 @@ "invalidEmail": { "message": "Neplatná emailová adresa." }, - "masterPassRequired": { + "masterPasswordRequired": { "message": "Hlavné heslo je povinné." }, - "masterPassLength": { + "confirmMasterPasswordRequired": { + "message": "Vyžaduje sa opätovné zadanie hlavného hesla." + }, + "masterPasswordMinlength": { "message": "Hlavné heslo musí obsahovať aspoň 8 znakov." }, "masterPassDoesntMatch": { @@ -1480,7 +1483,7 @@ "acceptPolicies": { "message": "Označením tohto políčka súhlasíte s nasledovným:" }, - "acceptPoliciesError": { + "acceptPoliciesRequired": { "message": "Neboli akceptované Podmienky používania a zásady Ochrany osobných údajov." }, "termsOfService": { @@ -1846,7 +1849,7 @@ } } }, - "vaultTimeoutToLarge": { + "vaultTimeoutTooLarge": { "message": "Časový limit vášho trezora prekračuje obmedzenia nastavené vašou organizáciou." }, "vaultExportDisabled": { @@ -1964,5 +1967,11 @@ }, "ssoKeyConnectorError": { "message": "Chyba Key Connector: uistite sa, že je Key Connector k dispozícii a funguje správne." + }, + "organizationIsDisabled": { + "message": "Organizácia je vypnutá." + }, + "disabledOrganizationFilterError": { + "message": "K položkám vo vypnutej organizácii nie je možné pristupovať. Požiadajte o pomoc vlastníka organizácie." } } diff --git a/apps/browser/src/_locales/sl/messages.json b/apps/browser/src/_locales/sl/messages.json index 814776b346a..07c962abf4b 100644 --- a/apps/browser/src/_locales/sl/messages.json +++ b/apps/browser/src/_locales/sl/messages.json @@ -423,11 +423,14 @@ "invalidEmail": { "message": "Neveljaven epoštni naslov." }, - "masterPassRequired": { - "message": "Glavno geslo je obvezno." + "masterPasswordRequired": { + "message": "Master password is required." }, - "masterPassLength": { - "message": "Glavno geslo mora biti dolgo najmanj 8 znakov." + "confirmMasterPasswordRequired": { + "message": "Master password retype is required." + }, + "masterPasswordMinlength": { + "message": "Master password must be at least 8 characters long." }, "masterPassDoesntMatch": { "message": "Potrditev glavnega gesla se ne ujema." @@ -1480,7 +1483,7 @@ "acceptPolicies": { "message": "By checking this box you agree to the following:" }, - "acceptPoliciesError": { + "acceptPoliciesRequired": { "message": "Terms of Service and Privacy Policy have not been acknowledged." }, "termsOfService": { @@ -1846,7 +1849,7 @@ } } }, - "vaultTimeoutToLarge": { + "vaultTimeoutTooLarge": { "message": "Your vault timeout exceeds the restrictions set by your organization." }, "vaultExportDisabled": { @@ -1964,5 +1967,11 @@ }, "ssoKeyConnectorError": { "message": "Key Connector error: make sure Key Connector is available and working correctly." + }, + "organizationIsDisabled": { + "message": "Organization is disabled." + }, + "disabledOrganizationFilterError": { + "message": "Items in disabled Organizations cannot be accessed. Contact your Organization owner for assistance." } } diff --git a/apps/browser/src/_locales/sr/messages.json b/apps/browser/src/_locales/sr/messages.json index 40722a4da8e..613c6b3725e 100644 --- a/apps/browser/src/_locales/sr/messages.json +++ b/apps/browser/src/_locales/sr/messages.json @@ -423,10 +423,13 @@ "invalidEmail": { "message": "Неисправан имејл." }, - "masterPassRequired": { + "masterPasswordRequired": { "message": "Главна Лозинка је неопходна." }, - "masterPassLength": { + "confirmMasterPasswordRequired": { + "message": "Поновно уписивање главне лозинке је неопходно." + }, + "masterPasswordMinlength": { "message": "Главна Лозинка треба имати бар 8 знака." }, "masterPassDoesntMatch": { @@ -568,22 +571,22 @@ "description": "This is the folder for uncategorized items" }, "enableAddLoginNotification": { - "message": "Ask to add login" + "message": "Питај пре додавања" }, "addLoginNotificationDesc": { "message": "„Нотификације Додај Лозинку“ аутоматски тражи да сачувате нове пријаве у сефу кад год се први пут пријавите на њих." }, "showCardsCurrentTab": { - "message": "Show cards on Tab page" + "message": "Прикажи кредитне картице на страници картице" }, "showCardsCurrentTabDesc": { - "message": "List card items on the Tab page for easy auto-fill." + "message": "Прикажи ставке кредитних картица на страници картице за лакше аутоматско допуњавање." }, "showIdentitiesCurrentTab": { - "message": "Show identities on Tab page" + "message": "Прикажи идентитете на страници" }, "showIdentitiesCurrentTabDesc": { - "message": "List identity items on the Tab page for easy auto-fill." + "message": "Прикажи ставке идентитета на страници за лакше аутоматско допуњавање." }, "clearClipboard": { "message": "Обриши привремену меморију", @@ -600,10 +603,10 @@ "message": "Сачувај" }, "enableChangedPasswordNotification": { - "message": "Ask to update existing login" + "message": "Питај за ажурирање постојеће пријаве" }, "changedPasswordNotificationDesc": { - "message": "Ask to update a login's password when a change is detected on a website." + "message": "Прикажи потврду за ажурирање тренутне лозинке за пријаву када се промена препозна на Web страници." }, "notificationChangeDesc": { "message": "Да ли желите да ажурирате ову лозинку за Bitwarden?" @@ -612,10 +615,10 @@ "message": "Ажурирај" }, "enableContextMenuItem": { - "message": "Show context menu options" + "message": "Прикажи контекстни мени" }, "contextMenuItemDesc": { - "message": "Use a secondary click to access password generation and matching logins for the website. " + "message": "Користите други клик за приступање генерисању лозинки и пријавама за тренутну web страницу. " }, "defaultUriMatchDetection": { "message": "Стандардно налажење УРЛ", @@ -807,13 +810,13 @@ "message": "Освежавање је завршено" }, "enableAutoTotpCopy": { - "message": "Copy TOTP automatically" + "message": "Аутоматски копирај једнократни код" }, "disableAutoTotpCopyDesc": { "message": "Ако је за вашу пријаву приложен аутентификациони кључ, једнократни код се аутоматски копира у вашој привременој меморији кад год ауто-попуните пријаву." }, "enableAutoBiometricsPrompt": { - "message": "Ask for biometrics on launch" + "message": "Захтевај биометрију при покретању" }, "premiumRequired": { "message": "Потребан Премијум" @@ -1034,16 +1037,16 @@ "message": "Овај прегледач не може да обрађује U2F захтеве у овом искачућем прозору. Да ли желите да отворите овај искачући прозор у новом прозору како бисте могли да се пријавите користећи U2F?" }, "enableFavicon": { - "message": "Show website icons" + "message": "Прикажи иконе сајтова" }, "faviconDesc": { - "message": "Show a recognizable image next to each login." + "message": "Прикажи препознатљиву слику поред сваке ставке за пријаву." }, "enableBadgeCounter": { - "message": "Show badge counter" + "message": "Прикажи бедж са бројачем" }, "badgeCounterDesc": { - "message": "Indicate how many logins you have for the current web page." + "message": "Означи број пријава које се могу користити на тренутној Web страници." }, "cardholderName": { "message": "Име Власника Картице" @@ -1480,7 +1483,7 @@ "acceptPolicies": { "message": "Означавањем овог поља пристајете на следеће:" }, - "acceptPoliciesError": { + "acceptPoliciesRequired": { "message": "Услови услуге и Политика приватности нису прихваћени." }, "termsOfService": { @@ -1846,7 +1849,7 @@ } } }, - "vaultTimeoutToLarge": { + "vaultTimeoutTooLarge": { "message": "Време истека вашег сефа је премашило дозвољена ограничења од стране ваше организације." }, "vaultExportDisabled": { @@ -1964,5 +1967,11 @@ }, "ssoKeyConnectorError": { "message": "Key Connector грешка: будите сигурни да је Key Connector доступан и да ради." + }, + "organizationIsDisabled": { + "message": "Organization is disabled." + }, + "disabledOrganizationFilterError": { + "message": "Items in disabled Organizations cannot be accessed. Contact your Organization owner for assistance." } } diff --git a/apps/browser/src/_locales/sv/messages.json b/apps/browser/src/_locales/sv/messages.json index 3ea4caa0ed1..71e31d658df 100644 --- a/apps/browser/src/_locales/sv/messages.json +++ b/apps/browser/src/_locales/sv/messages.json @@ -423,11 +423,14 @@ "invalidEmail": { "message": "Ogiltig e-postadress." }, - "masterPassRequired": { - "message": "Huvudlösenord krävs." + "masterPasswordRequired": { + "message": "Master password is required." }, - "masterPassLength": { - "message": "Huvudlösenordet måste vara minst 8 tecken långt." + "confirmMasterPasswordRequired": { + "message": "Master password retype is required." + }, + "masterPasswordMinlength": { + "message": "Master password must be at least 8 characters long." }, "masterPassDoesntMatch": { "message": "Bekräftelsen för huvudlösenordet stämde ej." @@ -1480,8 +1483,8 @@ "acceptPolicies": { "message": "Genom att markera denna ruta godkänner du följande:" }, - "acceptPoliciesError": { - "message": "Användarvillkoren och Integritetspolicyn har inte accepterats." + "acceptPoliciesRequired": { + "message": "Terms of Service and Privacy Policy have not been acknowledged." }, "termsOfService": { "message": "Användarvillkor" @@ -1846,8 +1849,8 @@ } } }, - "vaultTimeoutToLarge": { - "message": "Ditt valvs tid för timeout överskrider de begränsningar som fastställts av din organisation." + "vaultTimeoutTooLarge": { + "message": "Your vault timeout exceeds the restrictions set by your organization." }, "vaultExportDisabled": { "message": "Valvexport inaktiverad" @@ -1964,5 +1967,11 @@ }, "ssoKeyConnectorError": { "message": "Key Connector-fel: säkerställ att Key Connector är tillgänglig och fungerar korrekt." + }, + "organizationIsDisabled": { + "message": "Organization is disabled." + }, + "disabledOrganizationFilterError": { + "message": "Items in disabled Organizations cannot be accessed. Contact your Organization owner for assistance." } } diff --git a/apps/browser/src/_locales/th/messages.json b/apps/browser/src/_locales/th/messages.json index ebf4779b11a..eefce558bca 100644 --- a/apps/browser/src/_locales/th/messages.json +++ b/apps/browser/src/_locales/th/messages.json @@ -423,11 +423,14 @@ "invalidEmail": { "message": "ที่อยู่อีเมลไม่ถูกต้อง" }, - "masterPassRequired": { - "message": "ต้องระบุรหัสผ่านหลัก" + "masterPasswordRequired": { + "message": "Master password is required." }, - "masterPassLength": { - "message": "รหัสผ่านหลักต้องมีความยาวอย่างน้อย 8 อักขระ" + "confirmMasterPasswordRequired": { + "message": "Master password retype is required." + }, + "masterPasswordMinlength": { + "message": "Master password must be at least 8 characters long." }, "masterPassDoesntMatch": { "message": "Master password confirmation does not match." @@ -1480,7 +1483,7 @@ "acceptPolicies": { "message": "By checking this box you agree to the following:" }, - "acceptPoliciesError": { + "acceptPoliciesRequired": { "message": "Terms of Service and Privacy Policy have not been acknowledged." }, "termsOfService": { @@ -1846,7 +1849,7 @@ } } }, - "vaultTimeoutToLarge": { + "vaultTimeoutTooLarge": { "message": "Your vault timeout exceeds the restrictions set by your organization." }, "vaultExportDisabled": { @@ -1964,5 +1967,11 @@ }, "ssoKeyConnectorError": { "message": "Key Connector error: make sure Key Connector is available and working correctly." + }, + "organizationIsDisabled": { + "message": "Organization is disabled." + }, + "disabledOrganizationFilterError": { + "message": "Items in disabled Organizations cannot be accessed. Contact your Organization owner for assistance." } } diff --git a/apps/browser/src/_locales/tr/messages.json b/apps/browser/src/_locales/tr/messages.json index c44e99086c1..b2b78e70ace 100644 --- a/apps/browser/src/_locales/tr/messages.json +++ b/apps/browser/src/_locales/tr/messages.json @@ -423,10 +423,13 @@ "invalidEmail": { "message": "Geçersiz e-posta adresi." }, - "masterPassRequired": { + "masterPasswordRequired": { "message": "Ana parola gereklidir." }, - "masterPassLength": { + "confirmMasterPasswordRequired": { + "message": "Ana parolayı yeniden yazmalısınız." + }, + "masterPasswordMinlength": { "message": "Ana parola en az 8 karakter uzunluğunda olmalıdır." }, "masterPassDoesntMatch": { @@ -1480,7 +1483,7 @@ "acceptPolicies": { "message": "Bu kutuyu işaretleyerek aşağıdakileri kabul etmiş olursunuz:" }, - "acceptPoliciesError": { + "acceptPoliciesRequired": { "message": "Hizmet Koşulları ve Gizlilik Politikası kabul edilmemiş." }, "termsOfService": { @@ -1846,7 +1849,7 @@ } } }, - "vaultTimeoutToLarge": { + "vaultTimeoutTooLarge": { "message": "Kasa zaman aşımınız, kuruluşunuz tarafından belirlenen kısıtlamaları aşıyor." }, "vaultExportDisabled": { @@ -1964,5 +1967,11 @@ }, "ssoKeyConnectorError": { "message": "Anahtar Bağlayıcı hatası: Anahtar Bağlayıcının mevcut olduğundan ve doğru çalıştığından emin olun." + }, + "organizationIsDisabled": { + "message": "Kuruluş devre dışı." + }, + "disabledOrganizationFilterError": { + "message": "Devre dışı kuruluşlardaki kayıtlara erişilemez. Destek almak için kuruluş sahibinizle iletişime geçin." } } diff --git a/apps/browser/src/_locales/uk/messages.json b/apps/browser/src/_locales/uk/messages.json index 13dda620af0..7ba06675c39 100644 --- a/apps/browser/src/_locales/uk/messages.json +++ b/apps/browser/src/_locales/uk/messages.json @@ -423,11 +423,14 @@ "invalidEmail": { "message": "Неправильна адреса е-пошти." }, - "masterPassRequired": { - "message": "Потрібен головний пароль." + "masterPasswordRequired": { + "message": "Необхідно ввести головний пароль." }, - "masterPassLength": { - "message": "Довжина головного пароля повинна бути не менше 8 символів." + "confirmMasterPasswordRequired": { + "message": "Необхідно повторно ввести головний пароль." + }, + "masterPasswordMinlength": { + "message": "Довжина головного пароля має бути принаймні 8 символів." }, "masterPassDoesntMatch": { "message": "Підтвердження головного пароля не збігається." @@ -594,7 +597,7 @@ "description": "Clipboard is the operating system thing where you copy/paste data to on your device." }, "notificationAddDesc": { - "message": "Чи повинен Bitwarden зберегти цей пароль?" + "message": "Чи має Bitwarden зберегти цей пароль?" }, "notificationAddSave": { "message": "Зберегти" @@ -643,7 +646,7 @@ "description": "'Solarized' is a noun and the name of a color scheme. It should not be translated." }, "exportVault": { - "message": "Експорт сховища" + "message": "Експортувати сховище" }, "fileFormat": { "message": "Формат файлу" @@ -659,7 +662,7 @@ "message": "Експортовані дані вашого сховища знаходяться в незашифрованому вигляді. Вам не слід зберігати чи надсилати їх через незахищені канали (наприклад, е-поштою). Після використання негайно видаліть їх." }, "encExportKeyWarningDesc": { - "message": "Цей експорт шифрує ваші дані за допомогою ключа шифрування облікового запису. Якщо ви коли-небудь оновите ключ шифрування облікового запису, ви повинні виконати експорт знову, оскільки не зможете розшифрувати цей файл експорту." + "message": "Цей експорт шифрує ваші дані за допомогою ключа шифрування облікового запису. Якщо ви коли-небудь оновите ключ шифрування облікового запису, необхідно виконати експорт знову, оскільки не зможете розшифрувати цей файл експорту." }, "encExportAccountWarningDesc": { "message": "Ключі шифрування унікальні для кожного облікового запису користувача Bitwarden, тому ви не можете імпортувати зашифрований експорт до іншого облікового запису." @@ -810,7 +813,7 @@ "message": "Автоматично копіювати коди TOTP" }, "disableAutoTotpCopyDesc": { - "message": "Якщо ваш запис має вкладений ключ авторизації, код підтвердження TOTP автоматично копіюється до буфера обміну щоразу при автозаповненні." + "message": "Якщо запис має ключ авторизації, копіювати код підтвердження TOTP до буфера обміну під час автозаповнення." }, "enableAutoBiometricsPrompt": { "message": "Запитувати біометрію під час запуску" @@ -954,7 +957,7 @@ "message": "Автозаповнення на сторінці" }, "enableAutoFillOnPageLoadDesc": { - "message": "При виявленні форми входу виконувати автоматичне її заповнення під час завантаження сторінки." + "message": "Якщо виявлено форму входу, автоматично заповнювати її під час завантаження вебсторінки." }, "experimentalFeature": { "message": "Це експериментальна функція. При її використанні ви берете ризик на себе." @@ -963,10 +966,10 @@ "message": "Типове налаштування автозаповнення для записів входу" }, "defaultAutoFillOnPageLoadDesc": { - "message": "Після увімкнення автозаповнення на сторінці ви можете увімкнути чи вимкнути цю функцію для окремих записів входу. Це налаштування є типовим для записів входу, які не мають окремого налаштування." + "message": "Ви можете вимкнути цю функцію для окремих записів входу в меню запису \"Змінити\"." }, "itemAutoFillOnPageLoad": { - "message": "Автозаповнення на сторінці (якщо не увімкнено в налаштуваннях)" + "message": "Автозаповнення на сторінці (якщо увімкнено в налаштуваннях)" }, "autoFillOnPageLoadUseDefault": { "message": "Типове налаштування" @@ -1374,7 +1377,7 @@ "message": "Блокувати головним паролем при перезапуску браузера" }, "selectOneCollection": { - "message": "Ви повинні обрати принаймні одну збірку." + "message": "Необхідно вибрати принаймні одну збірку." }, "cloneItem": { "message": "Клонувати запис" @@ -1480,8 +1483,8 @@ "acceptPolicies": { "message": "Позначивши цей прапорець, ви погоджуєтеся з:" }, - "acceptPoliciesError": { - "message": "Умови користування та політика приватності не погоджені." + "acceptPoliciesRequired": { + "message": "Ви не погодилися з умовами користування та політикою приватності." }, "termsOfService": { "message": "Умови користування" @@ -1565,7 +1568,7 @@ "message": "Виключені домени" }, "excludedDomainsDesc": { - "message": "Bitwarden не запитуватиме про збереження даних входу для цих доменів. Ви повинні оновити сторінку для застосування змін." + "message": "Bitwarden не запитуватиме про збереження даних входу для цих доменів. Потрібно оновити сторінку для застосування змін." }, "excludedDomainsInvalidDomain": { "message": "$DOMAIN$ не є дійсним доменом", @@ -1813,7 +1816,7 @@ "message": "Оновити головний пароль" }, "updateMasterPasswordWarning": { - "message": "Ваш головний пароль нещодавно був змінений адміністратором організації. Щоб отримати доступ до сховища, ви повинні оновити його зараз. Продовживши, ви вийдете з поточного сеансу, після чого необхідно буде повторно виконати вхід. Сеанси на інших пристроях можуть залишатися активними протягом однієї години." + "message": "Ваш головний пароль нещодавно був змінений адміністратором організації. Щоб отримати доступ до сховища, вам необхідно оновити його зараз. Продовживши, ви вийдете з поточного сеансу, після чого потрібно буде повторно виконати вхід. Сеанси на інших пристроях можуть залишатися активними протягом однієї години." }, "resetPasswordPolicyAutoEnroll": { "message": "Автоматичне розгортання" @@ -1846,7 +1849,7 @@ } } }, - "vaultTimeoutToLarge": { + "vaultTimeoutTooLarge": { "message": "Час очікування сховища перевищує обмеження, встановлені вашою організацією." }, "vaultExportDisabled": { @@ -1964,5 +1967,11 @@ }, "ssoKeyConnectorError": { "message": "Помилка Key Connector: переконайтеся, що Key Connector доступний та працює правильно." + }, + "organizationIsDisabled": { + "message": "Організацію вимкнено." + }, + "disabledOrganizationFilterError": { + "message": "Записи у вимкнених організаціях недоступні. Зверніться до власника вашої організації для отримання допомоги." } } diff --git a/apps/browser/src/_locales/vi/messages.json b/apps/browser/src/_locales/vi/messages.json index dec923fb217..3427c608402 100644 --- a/apps/browser/src/_locales/vi/messages.json +++ b/apps/browser/src/_locales/vi/messages.json @@ -423,11 +423,14 @@ "invalidEmail": { "message": "Địa chỉ email không hợp lệ." }, - "masterPassRequired": { - "message": "Mật khẩu chủ là bắt buộc." + "masterPasswordRequired": { + "message": "Master password is required." }, - "masterPassLength": { - "message": "Mật khẩu chủ phải có ít nhất 8 kí tự." + "confirmMasterPasswordRequired": { + "message": "Master password retype is required." + }, + "masterPasswordMinlength": { + "message": "Master password must be at least 8 characters long." }, "masterPassDoesntMatch": { "message": "Xác nhận mật khẩu chủ không khớp." @@ -1480,8 +1483,8 @@ "acceptPolicies": { "message": "Bạn đồng ý với những điều sau khi nhấn chọn ô này:" }, - "acceptPoliciesError": { - "message": "Điều khoản sử dụng và Chính sách quyền riêng tư chưa được đồng ý." + "acceptPoliciesRequired": { + "message": "Terms of Service and Privacy Policy have not been acknowledged." }, "termsOfService": { "message": "Điều khoản sử dụng" @@ -1846,7 +1849,7 @@ } } }, - "vaultTimeoutToLarge": { + "vaultTimeoutTooLarge": { "message": "Your vault timeout exceeds the restrictions set by your organization." }, "vaultExportDisabled": { @@ -1964,5 +1967,11 @@ }, "ssoKeyConnectorError": { "message": "Key Connector error: make sure Key Connector is available and working correctly." + }, + "organizationIsDisabled": { + "message": "Organization is disabled." + }, + "disabledOrganizationFilterError": { + "message": "Items in disabled Organizations cannot be accessed. Contact your Organization owner for assistance." } } diff --git a/apps/browser/src/_locales/zh_CN/messages.json b/apps/browser/src/_locales/zh_CN/messages.json index 41217fd6287..f3bbdb9c030 100644 --- a/apps/browser/src/_locales/zh_CN/messages.json +++ b/apps/browser/src/_locales/zh_CN/messages.json @@ -423,10 +423,13 @@ "invalidEmail": { "message": "无效的电子邮件地址。" }, - "masterPassRequired": { + "masterPasswordRequired": { "message": "必须填写主密码。" }, - "masterPassLength": { + "confirmMasterPasswordRequired": { + "message": "必须填写确认主密码。" + }, + "masterPasswordMinlength": { "message": "主密码至少需要 8 个字符。" }, "masterPassDoesntMatch": { @@ -568,10 +571,10 @@ "description": "This is the folder for uncategorized items" }, "enableAddLoginNotification": { - "message": "要求添加登录" + "message": "询问添加登录" }, "addLoginNotificationDesc": { - "message": "在密码库中找不到项目时询问添加一个项目。" + "message": "在密码库中找不到匹配项目时询问添加一个。" }, "showCardsCurrentTab": { "message": "在标签页上显示支付卡" @@ -600,10 +603,10 @@ "message": "保存" }, "enableChangedPasswordNotification": { - "message": "要求更新现有的登录" + "message": "询问更新现有的登录" }, "changedPasswordNotificationDesc": { - "message": "在网站上检测到更改时要求更新登录密码。" + "message": "在网站上检测到更改时询问更新登录密码。" }, "notificationChangeDesc": { "message": "是否要在 Bitwarden 中更新此密码?" @@ -615,7 +618,7 @@ "message": "显示上下文菜单选项" }, "contextMenuItemDesc": { - "message": "使用辅助点击来访问网站的密码生成和匹配登录。" + "message": "使用辅助点击来访问网站的密码生成和匹配的登录项目。 " }, "defaultUriMatchDetection": { "message": "默认 URI 匹配检测", @@ -954,7 +957,7 @@ "message": "页面加载时自动填充" }, "enableAutoFillOnPageLoadDesc": { - "message": "网页加载时如果检测到登录表单,则自动填充。" + "message": "网页加载时如果检测到登录表单,则执行自动填充。" }, "experimentalFeature": { "message": "目前这是一项实验功能。使用需自担风险。" @@ -1480,7 +1483,7 @@ "acceptPolicies": { "message": "选中此框表示您同意:" }, - "acceptPoliciesError": { + "acceptPoliciesRequired": { "message": "尚未同意服务条款和隐私政策。" }, "termsOfService": { @@ -1846,7 +1849,7 @@ } } }, - "vaultTimeoutToLarge": { + "vaultTimeoutTooLarge": { "message": "您的密码库超时时间超出了组织设置的限制。" }, "vaultExportDisabled": { @@ -1964,5 +1967,11 @@ }, "ssoKeyConnectorError": { "message": "Key Connector 错误:请确保 Key Connector 可用且工作正常。" + }, + "organizationIsDisabled": { + "message": "组织已被禁用。" + }, + "disabledOrganizationFilterError": { + "message": "无法访问已禁用组织中的项目。请联系您的组织所有者获取协助。" } } diff --git a/apps/browser/src/_locales/zh_TW/messages.json b/apps/browser/src/_locales/zh_TW/messages.json index 257394a02c7..43be17a775e 100644 --- a/apps/browser/src/_locales/zh_TW/messages.json +++ b/apps/browser/src/_locales/zh_TW/messages.json @@ -423,10 +423,13 @@ "invalidEmail": { "message": "無效的電子郵件地址。" }, - "masterPassRequired": { - "message": "必須填入主密碼。" + "masterPasswordRequired": { + "message": "必須填寫主密碼。" }, - "masterPassLength": { + "confirmMasterPasswordRequired": { + "message": "必須再次輸入主密碼。" + }, + "masterPasswordMinlength": { "message": "主密碼需要至少 8 個字元。" }, "masterPassDoesntMatch": { @@ -568,22 +571,22 @@ "description": "This is the folder for uncategorized items" }, "enableAddLoginNotification": { - "message": "Ask to add login" + "message": "詢問新增登入資料" }, "addLoginNotificationDesc": { - "message": "當您首次登入時,「新增登入資料通知」會自動提醒您在密碼庫中新增登入資料。" + "message": "在密碼庫中找不到相符的項目時詢問是否新增項目。" }, "showCardsCurrentTab": { "message": "於分頁頁面顯示支付卡" }, "showCardsCurrentTabDesc": { - "message": "List card items on the Tab page for easy auto-fill." + "message": "於分頁頁面顯示支付卡以便於自動填入。" }, "showIdentitiesCurrentTab": { "message": "於分頁頁面顯示身分" }, "showIdentitiesCurrentTabDesc": { - "message": "List identity items on the Tab page for easy auto-fill." + "message": "於分頁頁面顯示身分以便於自動填入。" }, "clearClipboard": { "message": "清除剪貼簿", @@ -600,10 +603,10 @@ "message": "儲存" }, "enableChangedPasswordNotification": { - "message": "Ask to update existing login" + "message": "詢問更新現有的登入資料" }, "changedPasswordNotificationDesc": { - "message": "Ask to update a login's password when a change is detected on a website." + "message": "偵測到網站密碼變更時,詢問是否更新登入資料密碼。" }, "notificationChangeDesc": { "message": "是否要在 Bitwarden 中更新此密碼?" @@ -612,10 +615,10 @@ "message": "更新" }, "enableContextMenuItem": { - "message": "Show context menu options" + "message": "顯示內容選單選項" }, "contextMenuItemDesc": { - "message": "Use a secondary click to access password generation and matching logins for the website. " + "message": "使用輔助點選(右鍵選單)來存取網站的密碼產生和匹配的登入項目。 " }, "defaultUriMatchDetection": { "message": "預設的 URI 一致性偵測", @@ -639,7 +642,7 @@ "description": "Light color" }, "solarizedDark": { - "message": "Solarized Dark", + "message": "Solarized Dark 主題", "description": "'Solarized' is a noun and the name of a color scheme. It should not be translated." }, "exportVault": { @@ -813,7 +816,7 @@ "message": "若登入資料已包含驗證器金鑰,在自動填入此登入資料時,TOTP 驗證碼將複製至您的剪貼簿。" }, "enableAutoBiometricsPrompt": { - "message": "Ask for biometrics on launch" + "message": "啟動時要求生物特徵辨識" }, "premiumRequired": { "message": "需要進階會員資格" @@ -954,7 +957,7 @@ "message": "頁面載入時自動填入" }, "enableAutoFillOnPageLoadDesc": { - "message": "如果網頁載入時偵測到登入表單,則自動執行表單填入。" + "message": "網頁載入時如果偵測到登入表單,則執行自動填入。" }, "experimentalFeature": { "message": "這目前是一項實驗性功能。要使用需自行承擔風險。" @@ -963,7 +966,7 @@ "message": "登入項目的預設自動填入設定" }, "defaultAutoFillOnPageLoadDesc": { - "message": "啟用頁面載入時自動填入後,您可以為單個登入項目啟用或停用此功能。這是未單獨設定的登入項目的預設設定。" + "message": "您可以從項目的編輯檢視中為單個登入項目關閉頁面載入時自動填入。" }, "itemAutoFillOnPageLoad": { "message": "頁面載入時自動填入(如果選項中已啟用)" @@ -1040,10 +1043,10 @@ "message": "在每個登入資料旁顯示一個可辨識的圖片。" }, "enableBadgeCounter": { - "message": "Show badge counter" + "message": "顯示圖示計數器" }, "badgeCounterDesc": { - "message": "Indicate how many logins you have for the current web page." + "message": "顯示可用於目前網頁的登入資料數量。" }, "cardholderName": { "message": "持卡人姓名" @@ -1356,7 +1359,7 @@ "message": "設定您用來解鎖 Bitwarden 的 PIN 碼。您的 PIN 設定將在您完全登出本應用程式時被重設。" }, "pinRequired": { - "message": "需要 PIN 碼。" + "message": "必須填入 PIN 碼。" }, "invalidPin": { "message": "無效的 PIN 碼。" @@ -1480,7 +1483,7 @@ "acceptPolicies": { "message": "若選取此方塊,代表您同意下列項目:" }, - "acceptPoliciesError": { + "acceptPoliciesRequired": { "message": "尚未接受服務條款與隱私權政策。" }, "termsOfService": { @@ -1846,8 +1849,8 @@ } } }, - "vaultTimeoutToLarge": { - "message": "您的密碼庫逾時時間超過組織限制。" + "vaultTimeoutTooLarge": { + "message": "您的密碼庫逾時時間超過組織設定的限制。" }, "vaultExportDisabled": { "message": "密碼庫匯出已停用" @@ -1964,5 +1967,11 @@ }, "ssoKeyConnectorError": { "message": "Key Connector 錯誤:請確保 Key Connector 可用且運作正常。" + }, + "organizationIsDisabled": { + "message": "組織已停用。" + }, + "disabledOrganizationFilterError": { + "message": "無法存取已停用組織中的項目。請聯絡您組織的擁有者以獲取協助。" } } diff --git a/apps/browser/src/background/main.background.ts b/apps/browser/src/background/main.background.ts index 725cb1954b4..cfc66fe02bf 100644 --- a/apps/browser/src/background/main.background.ts +++ b/apps/browser/src/background/main.background.ts @@ -10,7 +10,8 @@ import { EnvironmentService as EnvironmentServiceAbstraction } from "@bitwarden/ import { EventService as EventServiceAbstraction } from "@bitwarden/common/abstractions/event.service"; import { ExportService as ExportServiceAbstraction } from "@bitwarden/common/abstractions/export.service"; import { FileUploadService as FileUploadServiceAbstraction } from "@bitwarden/common/abstractions/fileUpload.service"; -import { FolderService as FolderServiceAbstraction } from "@bitwarden/common/abstractions/folder.service"; +import { FolderApiServiceAbstraction } from "@bitwarden/common/abstractions/folder/folder-api.service.abstraction"; +import { InternalFolderService as InternalFolderServiceAbstraction } from "@bitwarden/common/abstractions/folder/folder.service.abstraction"; import { I18nService as I18nServiceAbstraction } from "@bitwarden/common/abstractions/i18n.service"; import { KeyConnectorService as KeyConnectorServiceAbstraction } from "@bitwarden/common/abstractions/keyConnector.service"; import { LogService as LogServiceAbstraction } from "@bitwarden/common/abstractions/log.service"; @@ -52,7 +53,8 @@ import { EnvironmentService } from "@bitwarden/common/services/environment.servi import { EventService } from "@bitwarden/common/services/event.service"; import { ExportService } from "@bitwarden/common/services/export.service"; import { FileUploadService } from "@bitwarden/common/services/fileUpload.service"; -import { FolderService } from "@bitwarden/common/services/folder.service"; +import { FolderApiService } from "@bitwarden/common/services/folder/folder-api.service"; +import { FolderService } from "@bitwarden/common/services/folder/folder.service"; import { KeyConnectorService } from "@bitwarden/common/services/keyConnector.service"; import { MemoryStorageService } from "@bitwarden/common/services/memoryStorage.service"; import { NotificationsService } from "@bitwarden/common/services/notifications.service"; @@ -118,7 +120,7 @@ export default class MainBackground { environmentService: EnvironmentServiceAbstraction; settingsService: SettingsServiceAbstraction; cipherService: CipherServiceAbstraction; - folderService: FolderServiceAbstraction; + folderService: InternalFolderServiceAbstraction; collectionService: CollectionServiceAbstraction; vaultTimeoutService: VaultTimeoutServiceAbstraction; syncService: SyncServiceAbstraction; @@ -147,6 +149,10 @@ export default class MainBackground { vaultFilterService: VaultFilterService; usernameGenerationService: UsernameGenerationServiceAbstraction; encryptService: EncryptService; + folderApiService: FolderApiServiceAbstraction; + + // Passed to the popup for Safari to workaround issues with theming, downloading, etc. + backgroundWindow = window; onUpdatedRan: boolean; onReplacedRan: boolean; @@ -266,11 +272,11 @@ export default class MainBackground { ); this.folderService = new FolderService( this.cryptoService, - this.apiService, this.i18nService, this.cipherService, this.stateService ); + this.folderApiService = new FolderApiService(this.folderService, this.apiService); this.collectionService = new CollectionService( this.cryptoService, this.i18nService, @@ -368,6 +374,7 @@ export default class MainBackground { this.stateService, this.organizationService, this.providerService, + this.folderApiService, logoutCallback ); this.eventService = new EventService( diff --git a/apps/browser/src/background/notification.background.ts b/apps/browser/src/background/notification.background.ts index b44ce820079..7cbdd0993e5 100644 --- a/apps/browser/src/background/notification.background.ts +++ b/apps/browser/src/background/notification.background.ts @@ -1,6 +1,8 @@ +import { firstValueFrom } from "rxjs"; + import { AuthService } from "@bitwarden/common/abstractions/auth.service"; import { CipherService } from "@bitwarden/common/abstractions/cipher.service"; -import { FolderService } from "@bitwarden/common/abstractions/folder.service"; +import { FolderService } from "@bitwarden/common/abstractions/folder/folder.service.abstraction"; import { PolicyService } from "@bitwarden/common/abstractions/policy.service"; import { AuthenticationStatus } from "@bitwarden/common/enums/authenticationStatus"; import { CipherType } from "@bitwarden/common/enums/cipherType"; @@ -385,7 +387,7 @@ export default class NotificationBackground { model.login = loginModel; if (!Utils.isNullOrWhitespace(folderId)) { - const folders = await this.folderService.getAllDecrypted(); + const folders = await firstValueFrom(this.folderService.folderViews$); if (folders.some((x) => x.id === folderId)) { model.folderId = folderId; } @@ -437,7 +439,7 @@ export default class NotificationBackground { private async getDataForTab(tab: chrome.tabs.Tab, responseCommand: string) { const responseData: any = {}; if (responseCommand === "notificationBarGetFoldersList") { - responseData.folders = await this.folderService.getAllDecrypted(); + responseData.folders = await firstValueFrom(this.folderService.folderViews$); } await BrowserApi.tabSendMessageData(tab, responseCommand, responseData); diff --git a/apps/browser/src/background/runtime.background.ts b/apps/browser/src/background/runtime.background.ts index 24513ed5bb2..e7e06e5c41a 100644 --- a/apps/browser/src/background/runtime.background.ts +++ b/apps/browser/src/background/runtime.background.ts @@ -143,7 +143,7 @@ export default class RuntimeBackground { tab: msg.tab, details: msg.details, }); - this.autofillTimeout = setTimeout(async () => await this.autofillPage(), 300); + this.autofillTimeout = setTimeout(async () => await this.autofillPage(msg.tab), 300); break; default: break; @@ -205,8 +205,9 @@ export default class RuntimeBackground { } } - private async autofillPage() { + private async autofillPage(tabToAutoFill: chrome.tabs.Tab) { const totpCode = await this.autofillService.doAutoFill({ + tab: tabToAutoFill, cipher: this.main.loginToAutoFill, pageDetails: this.pageDetailsToAutoFill, fillNewPassword: true, diff --git a/apps/browser/src/manifest.json b/apps/browser/src/manifest.json index 0054762b049..9e1299cf0b3 100644 --- a/apps/browser/src/manifest.json +++ b/apps/browser/src/manifest.json @@ -2,7 +2,7 @@ "manifest_version": 2, "name": "__MSG_extName__", "short_name": "__MSG_appName__", - "version": "2022.6.0", + "version": "2022.6.1", "description": "__MSG_extDesc__", "default_locale": "en", "author": "Bitwarden Inc.", diff --git a/apps/browser/src/popup/accounts/register.component.html b/apps/browser/src/popup/accounts/register.component.html index fc9c4e7990d..4c8ec89aac9 100644 --- a/apps/browser/src/popup/accounts/register.component.html +++ b/apps/browser/src/popup/accounts/register.component.html @@ -1,4 +1,4 @@ -
+
{{ "cancel" | i18n }} @@ -18,16 +18,7 @@
- +
@@ -44,11 +35,8 @@ @@ -60,7 +48,7 @@ appStopClick appBlurClick appA11yTitle="{{ 'toggleVisibility' | i18n }}" - (click)="togglePassword(false)" + (click)="togglePassword()" [attr.aria-pressed]="showPassword" >
@@ -110,7 +96,7 @@ appStopClick appBlurClick appA11yTitle="{{ 'toggleVisibility' | i18n }}" - (click)="togglePassword(true)" + (click)="togglePassword()" [attr.aria-pressed]="showPassword" >
- +
-
+
-
+

{{ "noFolders" | i18n }}

diff --git a/apps/browser/src/popup/settings/folders.component.ts b/apps/browser/src/popup/settings/folders.component.ts index eb289e8dcff..f0fb2204d88 100644 --- a/apps/browser/src/popup/settings/folders.component.ts +++ b/apps/browser/src/popup/settings/folders.component.ts @@ -1,24 +1,27 @@ -import { Component, OnInit } from "@angular/core"; +import { Component } from "@angular/core"; import { Router } from "@angular/router"; +import { map, Observable } from "rxjs"; -import { FolderService } from "@bitwarden/common/abstractions/folder.service"; +import { FolderService } from "@bitwarden/common/abstractions/folder/folder.service.abstraction"; import { FolderView } from "@bitwarden/common/models/view/folderView"; @Component({ selector: "app-folders", templateUrl: "folders.component.html", }) -export class FoldersComponent implements OnInit { - folders: FolderView[]; +export class FoldersComponent { + folders$: Observable; - constructor(private folderService: FolderService, private router: Router) {} + constructor(private folderService: FolderService, private router: Router) { + this.folders$ = this.folderService.folderViews$.pipe( + map((folders) => { + if (folders.length > 0) { + folders = folders.slice(0, folders.length - 1); + } - async ngOnInit() { - this.folders = await this.folderService.getAllDecrypted(); - // Remove "No Folder" - if (this.folders.length > 0) { - this.folders = this.folders.slice(0, this.folders.length - 1); - } + return folders; + }) + ); } folderSelected(folder: FolderView) { diff --git a/apps/browser/src/popup/settings/settings.component.html b/apps/browser/src/popup/settings/settings.component.html index 62d6bde5689..c7f4bb5042d 100644 --- a/apps/browser/src/popup/settings/settings.component.html +++ b/apps/browser/src/popup/settings/settings.component.html @@ -59,7 +59,11 @@ [(ngModel)]="biometric" /> -
+
diff --git a/apps/browser/src/popup/vault/add-edit.component.ts b/apps/browser/src/popup/vault/add-edit.component.ts index 237c3d40fae..899b9d6cff3 100644 --- a/apps/browser/src/popup/vault/add-edit.component.ts +++ b/apps/browser/src/popup/vault/add-edit.component.ts @@ -8,7 +8,7 @@ import { AuditService } from "@bitwarden/common/abstractions/audit.service"; import { CipherService } from "@bitwarden/common/abstractions/cipher.service"; import { CollectionService } from "@bitwarden/common/abstractions/collection.service"; import { EventService } from "@bitwarden/common/abstractions/event.service"; -import { FolderService } from "@bitwarden/common/abstractions/folder.service"; +import { FolderService } from "@bitwarden/common/abstractions/folder/folder.service.abstraction"; import { I18nService } from "@bitwarden/common/abstractions/i18n.service"; import { LogService } from "@bitwarden/common/abstractions/log.service"; import { MessagingService } from "@bitwarden/common/abstractions/messaging.service"; diff --git a/apps/browser/src/popup/vault/ciphers.component.ts b/apps/browser/src/popup/vault/ciphers.component.ts index 8c3675101f6..8637cc57b62 100644 --- a/apps/browser/src/popup/vault/ciphers.component.ts +++ b/apps/browser/src/popup/vault/ciphers.component.ts @@ -8,7 +8,7 @@ import { VaultFilter } from "@bitwarden/angular/modules/vault-filter/models/vaul import { BroadcasterService } from "@bitwarden/common/abstractions/broadcaster.service"; import { CipherService } from "@bitwarden/common/abstractions/cipher.service"; import { CollectionService } from "@bitwarden/common/abstractions/collection.service"; -import { FolderService } from "@bitwarden/common/abstractions/folder.service"; +import { FolderService } from "@bitwarden/common/abstractions/folder/folder.service.abstraction"; import { I18nService } from "@bitwarden/common/abstractions/i18n.service"; import { OrganizationService } from "@bitwarden/common/abstractions/organization.service"; import { PlatformUtilsService } from "@bitwarden/common/abstractions/platformUtils.service"; @@ -120,7 +120,7 @@ export class CiphersComponent extends BaseCiphersComponent implements OnInit, On this.searchPlaceholder = this.i18nService.t("searchFolder"); if (this.folderId != null) { this.showOrganizations = false; - const folderNode = await this.folderService.getNested(this.folderId); + const folderNode = await this.vaultFilterService.getFolderNested(this.folderId); if (folderNode != null && folderNode.node != null) { this.groupingTitle = folderNode.node.name; this.nestedFolders = diff --git a/apps/browser/src/popup/vault/current-tab.component.ts b/apps/browser/src/popup/vault/current-tab.component.ts index 97c0af22347..b196f9180d8 100644 --- a/apps/browser/src/popup/vault/current-tab.component.ts +++ b/apps/browser/src/popup/vault/current-tab.component.ts @@ -28,6 +28,7 @@ const BroadcasterSubscriptionId = "CurrentTabComponent"; }) export class CurrentTabComponent implements OnInit, OnDestroy { pageDetails: any[] = []; + tab: chrome.tabs.Tab; cardCiphers: CipherView[]; identityCiphers: CipherView[]; loginCiphers: CipherView[]; @@ -151,6 +152,7 @@ export class CurrentTabComponent implements OnInit, OnDestroy { try { this.totpCode = await this.autofillService.doAutoFill({ + tab: this.tab, cipher: cipher, pageDetails: this.pageDetails, doc: window.document, @@ -196,9 +198,9 @@ export class CurrentTabComponent implements OnInit, OnDestroy { private async load() { this.loaded = false; - const tab = await BrowserApi.getTabFromCurrentWindow(); - if (tab != null) { - this.url = tab.url; + this.tab = await BrowserApi.getTabFromCurrentWindow(); + if (this.tab != null) { + this.url = this.tab.url; } else { this.loginCiphers = []; this.loaded = true; @@ -207,9 +209,9 @@ export class CurrentTabComponent implements OnInit, OnDestroy { this.hostname = Utils.getHostname(this.url); this.pageDetails = []; - BrowserApi.tabSendMessage(tab, { + BrowserApi.tabSendMessage(this.tab, { command: "collectPageDetails", - tab: tab, + tab: this.tab, sender: BroadcasterSubscriptionId, }); diff --git a/apps/browser/src/popup/vault/vault-filter.component.ts b/apps/browser/src/popup/vault/vault-filter.component.ts index d068686e548..ddace24de5e 100644 --- a/apps/browser/src/popup/vault/vault-filter.component.ts +++ b/apps/browser/src/popup/vault/vault-filter.component.ts @@ -1,6 +1,7 @@ import { Location } from "@angular/common"; import { ChangeDetectorRef, Component, NgZone, OnDestroy, OnInit } from "@angular/core"; import { ActivatedRoute, Router } from "@angular/router"; +import { firstValueFrom } from "rxjs"; import { first } from "rxjs/operators"; import { VaultFilter } from "@bitwarden/angular/modules/vault-filter/models/vault-filter.model"; @@ -182,9 +183,11 @@ export class VaultFilterComponent implements OnInit, OnDestroy { } async loadFolders() { - const allFolders = await this.vaultFilterService.buildFolders(this.selectedOrganization); + const allFolders = await firstValueFrom( + this.vaultFilterService.buildNestedFolders(this.selectedOrganization) + ); this.folders = allFolders.fullList; - this.nestedFolders = await allFolders.nestedList; + this.nestedFolders = allFolders.nestedList; } async search(timeout: number = null) { diff --git a/apps/browser/src/popup/vault/vault-select.component.html b/apps/browser/src/popup/vault/vault-select.component.html index 813fbccf148..69a526c8961 100644 --- a/apps/browser/src/popup/vault/vault-select.component.html +++ b/apps/browser/src/popup/vault/vault-select.component.html @@ -59,6 +59,12 @@ aria-hidden="true" >  {{ organization.name | ellipsis: 21:true }} +
diff --git a/apps/browser/src/popup/vault/vault-select.component.ts b/apps/browser/src/popup/vault/vault-select.component.ts index e653cf4f492..4ed1dead32c 100644 --- a/apps/browser/src/popup/vault/vault-select.component.ts +++ b/apps/browser/src/popup/vault/vault-select.component.ts @@ -17,6 +17,7 @@ import { merge } from "rxjs"; import { VaultFilter } from "@bitwarden/angular/modules/vault-filter/models/vault-filter.model"; import { BroadcasterService } from "@bitwarden/common/abstractions/broadcaster.service"; import { I18nService } from "@bitwarden/common/abstractions/i18n.service"; +import { PlatformUtilsService } from "@bitwarden/common/abstractions/platformUtils.service"; import { Organization } from "@bitwarden/common/models/domain/organization"; import { VaultFilterService } from "../../services/vaultFilter.service"; @@ -82,7 +83,8 @@ export class VaultSelectComponent implements OnInit { private ngZone: NgZone, private broadcasterService: BroadcasterService, private overlay: Overlay, - private viewContainerRef: ViewContainerRef + private viewContainerRef: ViewContainerRef, + private platformUtilsService: PlatformUtilsService ) {} async ngOnInit() { @@ -171,10 +173,18 @@ export class VaultSelectComponent implements OnInit { } selectOrganization(organization: Organization) { - this.vaultFilterDisplay = organization.name; - this.vaultFilterService.setVaultFilter(organization.id); - this.onVaultSelectionChanged.emit(); - this.close(); + if (!organization.enabled) { + this.platformUtilsService.showToast( + "error", + null, + this.i18nService.t("disabledOrganizationFilterError") + ); + } else { + this.vaultFilterDisplay = organization.name; + this.vaultFilterService.setVaultFilter(organization.id); + this.onVaultSelectionChanged.emit(); + this.close(); + } } selectAllVaults() { this.vaultFilterDisplay = this.i18nService.t(this.vaultFilterService.allVaults); diff --git a/apps/browser/src/popup/vault/view.component.ts b/apps/browser/src/popup/vault/view.component.ts index 87f94ab75b7..0655212e6f0 100644 --- a/apps/browser/src/popup/vault/view.component.ts +++ b/apps/browser/src/popup/vault/view.component.ts @@ -276,6 +276,7 @@ export class ViewComponent extends BaseViewComponent { try { this.totpCode = await this.autofillService.doAutoFill({ + tab: this.tab, cipher: this.cipher, pageDetails: this.pageDetails, doc: window.document, diff --git a/apps/browser/src/services/autofill.service.ts b/apps/browser/src/services/autofill.service.ts index 837a013f45f..341eb723d19 100644 --- a/apps/browser/src/services/autofill.service.ts +++ b/apps/browser/src/services/autofill.service.ts @@ -66,7 +66,7 @@ export default class AutofillService implements AutofillServiceInterface { async doAutoFill(options: any) { let totpPromise: Promise = null; - const tab = await this.getActiveTab(); + const tab = options.tab; if (!tab || !options.cipher || !options.pageDetails || !options.pageDetails.length) { throw new Error("Nothing to auto-fill."); } @@ -168,6 +168,7 @@ export default class AutofillService implements AutofillServiceInterface { } const totpCode = await this.doAutoFill({ + tab: tab, cipher: cipher, pageDetails: pageDetails, skipLastUsed: !fromCommand, diff --git a/apps/browser/src/services/browserFileDownloadService.ts b/apps/browser/src/services/browserFileDownloadService.ts index 29ff661923f..8f3ddb96acb 100644 --- a/apps/browser/src/services/browserFileDownloadService.ts +++ b/apps/browser/src/services/browserFileDownloadService.ts @@ -17,9 +17,7 @@ export class BrowserFileDownloadService implements FileDownloadService { if (builder.blobOptions.type === "text/plain" && typeof request.blobData === "string") { data = request.blobData; } else { - builder.blob.arrayBuffer().then((buf) => { - data = Utils.fromBufferToB64(buf); - }); + data = Utils.fromBufferToB64(request.blobData as ArrayBuffer); } SafariApp.sendMessageToApp( "downloadFile", diff --git a/apps/browser/src/services/vaultFilter.service.ts b/apps/browser/src/services/vaultFilter.service.ts index 117cb901195..15fa3523a38 100644 --- a/apps/browser/src/services/vaultFilter.service.ts +++ b/apps/browser/src/services/vaultFilter.service.ts @@ -2,7 +2,7 @@ import { VaultFilter } from "@bitwarden/angular/modules/vault-filter/models/vaul import { VaultFilterService as BaseVaultFilterService } from "@bitwarden/angular/modules/vault-filter/vault-filter.service"; import { CipherService } from "@bitwarden/common/abstractions/cipher.service"; import { CollectionService } from "@bitwarden/common/abstractions/collection.service"; -import { FolderService } from "@bitwarden/common/abstractions/folder.service"; +import { FolderService } from "@bitwarden/common/abstractions/folder/folder.service.abstraction"; import { OrganizationService } from "@bitwarden/common/abstractions/organization.service"; import { PolicyService } from "@bitwarden/common/abstractions/policy.service"; import { StateService } from "@bitwarden/common/abstractions/state.service"; diff --git a/apps/browser/store/locales/ko/copy.resx b/apps/browser/store/locales/ko/copy.resx index c726ad687da..0fb5dd713fc 100644 --- a/apps/browser/store/locales/ko/copy.resx +++ b/apps/browser/store/locales/ko/copy.resx @@ -124,13 +124,32 @@ 당신의 모든 기기에서 사용할 수 있는, 안전한 무료 비밀번호 관리자 - Bitwarden은 당신의 로그인과 비밀번호를 보관하고 여러 기기에서 동기화할 수 있는 가장 쉽고 안전한 방법입니다. + Bitwarden, Inc.은 8bit Solutions LLC.의 모회사입니다. -계정 도용은 매우 위험한 문제입니다. 당신이 사용하는 앱 및 웹 사이트는 거의 매일 공격을 당하고 있습니다. 보안 결함이 생겨 비밀번호를 탈취당하고, 그 비밀번호를 앱 및 웹 사이트에 다시 사용하게 되면 해커들은 이메일, 은행 계좌 등 사용자의 중요한 계정에 쉽게 접근할 수 있게 됩니다. +VERGE, U.S. NEWS, WORLD REPORT, CNET 등에서 최고의 비밀번호 관리자라고 평가했습니다! -Bitwarden은 사용자의 모든 로그인을 여러 기기에서 동기화할 수 있는 암호화된 보관함에 저장합니다. 보관함은 완벽히 암호화되어 있으므로 오직 사용자 본인만이 데이터에 접근할 수 있습니다. Bitwarden 팀 멤버조차 아무리 읽고자 한다 해도 사용자의 데이터를 읽을 수 없습니다. 사용자의 데이터는 AES-256비트, 솔트 해싱 및 PBKDF2 SHA-256 방식으로 암호화됩니다. +관리하고, 보관하고, 보호하고, 어디에서든 어떤 기기에서나 무제한으로 비밀번호를 공유하세요. Bitwarden은 모두에게 오픈소스 비밀번호 관리 솔루션을 제공합니다. -Bitwarden은 100% 오픈 소스 소프트웨어입니다. Bitwarden의 소스 코드는 GitHub에 공개되어 있어 모든 사람들이 Bitwarden의 코드를 검토하고 기여할 수 있습니다. +강하고, 독특하고, 랜덤한 비밀번호를 모든 웹사이트의 보안 요구사항에 따라 생성할 수 있습니다. + +Bitwarden Send는 빠르게 암호화된 파일과 텍스트를 모두에게 전송할 수 있습니다. + +Bitwarden은 회사들을 위해 팀과 기업 플랜을 제공해서 동료에게 안전하게 비밀번호를 공유할 수 있습니다. + +Bitwarden을 선택하는 이유: + +세계 최고의 암호화 +비밀번호는 고급 종단간 암호화 (AES-256 bit, salted hashtag, 그리고 PBKDF2 SHA-256)을 이용하여 보호되기 때문에 데이터를 안전하게 보관할 수 있습니다. + +내장 비밀번호 생성기 +강하고, 독특하고, 랜덤한 비밀번호를 모든 웹사이트의 보안 요구사항에 따라 생성할 수 있습니다. + +언어 지원 +Bitwarden 번역은 전 세계의 커뮤니티 덕분에 40개의 언어를 지원하고 더 성장하고 있습니다. + +크로스 플랫폼 애플리케이션 +Bitwarden 보관함에 있는 민감한 정보를 어떠한 브라우저, 모바일 기기, 데스크톱 OS 등을 이용하여 보호하고 공유하세요. + 당신의 모든 기기에서 사용할 수 있는, 안전한 무료 비밀번호 관리자 diff --git a/apps/cli/package-lock.json b/apps/cli/package-lock.json index 9e6a3071763..133ba88a2c9 100644 --- a/apps/cli/package-lock.json +++ b/apps/cli/package-lock.json @@ -1,12 +1,12 @@ { "name": "@bitwarden/cli", - "version": "2022.6.0", + "version": "2022.6.2", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "@bitwarden/cli", - "version": "2022.6.0", + "version": "2022.6.2", "license": "GPL-3.0-only", "dependencies": { "@koa/multer": "^3.0.0", diff --git a/apps/cli/package.json b/apps/cli/package.json index a41d8d5ca7e..f4c7b669539 100644 --- a/apps/cli/package.json +++ b/apps/cli/package.json @@ -1,7 +1,7 @@ { "name": "@bitwarden/cli", "description": "A secure and free password manager for all of your devices.", - "version": "2022.6.0", + "version": "2022.6.2", "keywords": [ "bitwarden", "password", diff --git a/apps/cli/src/bw.ts b/apps/cli/src/bw.ts index 217782aac75..fe0391772c5 100644 --- a/apps/cli/src/bw.ts +++ b/apps/cli/src/bw.ts @@ -4,6 +4,7 @@ import * as path from "path"; import * as program from "commander"; import * as jsdom from "jsdom"; +import { InternalFolderService } from "@bitwarden/common/abstractions/folder/folder.service.abstraction"; import { ClientType } from "@bitwarden/common/enums/clientType"; import { KeySuffixOptions } from "@bitwarden/common/enums/keySuffixOptions"; import { LogLevelType } from "@bitwarden/common/enums/logLevelType"; @@ -13,6 +14,7 @@ import { GlobalState } from "@bitwarden/common/models/domain/globalState"; import { AppIdService } from "@bitwarden/common/services/appId.service"; import { AuditService } from "@bitwarden/common/services/audit.service"; import { AuthService } from "@bitwarden/common/services/auth.service"; +import { BroadcasterService } from "@bitwarden/common/services/broadcaster.service"; import { CipherService } from "@bitwarden/common/services/cipher.service"; import { CollectionService } from "@bitwarden/common/services/collection.service"; import { ContainerService } from "@bitwarden/common/services/container.service"; @@ -21,7 +23,8 @@ import { EncryptService } from "@bitwarden/common/services/encrypt.service"; import { EnvironmentService } from "@bitwarden/common/services/environment.service"; import { ExportService } from "@bitwarden/common/services/export.service"; import { FileUploadService } from "@bitwarden/common/services/fileUpload.service"; -import { FolderService } from "@bitwarden/common/services/folder.service"; +import { FolderApiService } from "@bitwarden/common/services/folder/folder-api.service"; +import { FolderService } from "@bitwarden/common/services/folder/folder.service"; import { ImportService } from "@bitwarden/common/services/import.service"; import { KeyConnectorService } from "@bitwarden/common/services/keyConnector.service"; import { MemoryStorageService } from "@bitwarden/common/services/memoryStorage.service"; @@ -73,7 +76,7 @@ export class Main { environmentService: EnvironmentService; settingsService: SettingsService; cipherService: CipherService; - folderService: FolderService; + folderService: InternalFolderService; collectionService: CollectionService; vaultTimeoutService: VaultTimeoutService; syncService: SyncService; @@ -101,6 +104,8 @@ export class Main { organizationService: OrganizationService; providerService: ProviderService; twoFactorService: TwoFactorService; + broadcasterService: BroadcasterService; + folderApiService: FolderApiService; constructor() { let p = null; @@ -195,14 +200,17 @@ export class Main { this.stateService ); + this.broadcasterService = new BroadcasterService(); + this.folderService = new FolderService( this.cryptoService, - this.apiService, this.i18nService, this.cipherService, this.stateService ); + this.folderApiService = new FolderApiService(this.folderService, this.apiService); + this.collectionService = new CollectionService( this.cryptoService, this.i18nService, @@ -293,6 +301,7 @@ export class Main { this.stateService, this.organizationService, this.providerService, + this.folderApiService, async (expired: boolean) => await this.logout() ); diff --git a/apps/cli/src/commands/create.command.ts b/apps/cli/src/commands/create.command.ts index 3951c9ec78e..ad69efe51e8 100644 --- a/apps/cli/src/commands/create.command.ts +++ b/apps/cli/src/commands/create.command.ts @@ -4,7 +4,8 @@ import * as path from "path"; import { ApiService } from "@bitwarden/common/abstractions/api.service"; import { CipherService } from "@bitwarden/common/abstractions/cipher.service"; import { CryptoService } from "@bitwarden/common/abstractions/crypto.service"; -import { FolderService } from "@bitwarden/common/abstractions/folder.service"; +import { FolderApiServiceAbstraction } from "@bitwarden/common/abstractions/folder/folder-api.service.abstraction"; +import { FolderService } from "@bitwarden/common/abstractions/folder/folder.service.abstraction"; import { StateService } from "@bitwarden/common/abstractions/state.service"; import { Utils } from "@bitwarden/common/misc/utils"; import { CipherExport } from "@bitwarden/common/models/export/cipherExport"; @@ -26,7 +27,8 @@ export class CreateCommand { private folderService: FolderService, private stateService: StateService, private cryptoService: CryptoService, - private apiService: ApiService + private apiService: ApiService, + private folderApiService: FolderApiServiceAbstraction ) {} async run( @@ -148,7 +150,7 @@ export class CreateCommand { private async createFolder(req: FolderExport) { const folder = await this.folderService.encrypt(FolderExport.toView(req)); try { - await this.folderService.saveWithServer(folder); + await this.folderApiService.save(folder); const newFolder = await this.folderService.get(folder.id); const decFolder = await newFolder.decrypt(); const res = new FolderResponse(decFolder); diff --git a/apps/cli/src/commands/delete.command.ts b/apps/cli/src/commands/delete.command.ts index 2a35b46637e..4ad4ac592af 100644 --- a/apps/cli/src/commands/delete.command.ts +++ b/apps/cli/src/commands/delete.command.ts @@ -1,6 +1,7 @@ import { ApiService } from "@bitwarden/common/abstractions/api.service"; import { CipherService } from "@bitwarden/common/abstractions/cipher.service"; -import { FolderService } from "@bitwarden/common/abstractions/folder.service"; +import { FolderApiServiceAbstraction } from "@bitwarden/common/abstractions/folder/folder-api.service.abstraction"; +import { FolderService } from "@bitwarden/common/abstractions/folder/folder.service.abstraction"; import { StateService } from "@bitwarden/common/abstractions/state.service"; import { Utils } from "@bitwarden/common/misc/utils"; import { Response } from "@bitwarden/node/cli/models/response"; @@ -12,7 +13,8 @@ export class DeleteCommand { private cipherService: CipherService, private folderService: FolderService, private stateService: StateService, - private apiService: ApiService + private apiService: ApiService, + private folderApiService: FolderApiServiceAbstraction ) {} async run(object: string, id: string, cmdOptions: Record): Promise { @@ -92,7 +94,7 @@ export class DeleteCommand { } try { - await this.folderService.deleteWithServer(id); + await this.folderApiService.delete(id); return Response.success(); } catch (e) { return Response.error(e); diff --git a/apps/cli/src/commands/edit.command.ts b/apps/cli/src/commands/edit.command.ts index b331b0551bc..9c8f68c8285 100644 --- a/apps/cli/src/commands/edit.command.ts +++ b/apps/cli/src/commands/edit.command.ts @@ -1,7 +1,8 @@ import { ApiService } from "@bitwarden/common/abstractions/api.service"; import { CipherService } from "@bitwarden/common/abstractions/cipher.service"; import { CryptoService } from "@bitwarden/common/abstractions/crypto.service"; -import { FolderService } from "@bitwarden/common/abstractions/folder.service"; +import { FolderApiServiceAbstraction } from "@bitwarden/common/abstractions/folder/folder-api.service.abstraction"; +import { FolderService } from "@bitwarden/common/abstractions/folder/folder.service.abstraction"; import { Utils } from "@bitwarden/common/misc/utils"; import { CipherExport } from "@bitwarden/common/models/export/cipherExport"; import { CollectionExport } from "@bitwarden/common/models/export/collectionExport"; @@ -21,7 +22,8 @@ export class EditCommand { private cipherService: CipherService, private folderService: FolderService, private cryptoService: CryptoService, - private apiService: ApiService + private apiService: ApiService, + private folderApiService: FolderApiServiceAbstraction ) {} async run( @@ -125,7 +127,7 @@ export class EditCommand { folderView = FolderExport.toView(req, folderView); const encFolder = await this.folderService.encrypt(folderView); try { - await this.folderService.saveWithServer(encFolder); + await this.folderApiService.save(encFolder); const updatedFolder = await this.folderService.get(folder.id); const decFolder = await updatedFolder.decrypt(); const res = new FolderResponse(decFolder); diff --git a/apps/cli/src/commands/get.command.ts b/apps/cli/src/commands/get.command.ts index 8fa9598dc9d..7cfcd9fb6e3 100644 --- a/apps/cli/src/commands/get.command.ts +++ b/apps/cli/src/commands/get.command.ts @@ -3,7 +3,7 @@ import { AuditService } from "@bitwarden/common/abstractions/audit.service"; import { CipherService } from "@bitwarden/common/abstractions/cipher.service"; import { CollectionService } from "@bitwarden/common/abstractions/collection.service"; import { CryptoService } from "@bitwarden/common/abstractions/crypto.service"; -import { FolderService } from "@bitwarden/common/abstractions/folder.service"; +import { FolderService } from "@bitwarden/common/abstractions/folder/folder.service.abstraction"; import { OrganizationService } from "@bitwarden/common/abstractions/organization.service"; import { SearchService } from "@bitwarden/common/abstractions/search.service"; import { StateService } from "@bitwarden/common/abstractions/state.service"; @@ -358,7 +358,7 @@ export class GetCommand extends DownloadCommand { decFolder = await folder.decrypt(); } } else if (id.trim() !== "") { - let folders = await this.folderService.getAllDecrypted(); + let folders = await this.folderService.getAllDecryptedFromState(); folders = CliUtils.searchFolders(folders, id); if (folders.length > 1) { return Response.multipleResults(folders.map((f) => f.id)); diff --git a/apps/cli/src/commands/list.command.ts b/apps/cli/src/commands/list.command.ts index e7dfef3104a..4e2d7cb02e0 100644 --- a/apps/cli/src/commands/list.command.ts +++ b/apps/cli/src/commands/list.command.ts @@ -1,7 +1,7 @@ import { ApiService } from "@bitwarden/common/abstractions/api.service"; import { CipherService } from "@bitwarden/common/abstractions/cipher.service"; import { CollectionService } from "@bitwarden/common/abstractions/collection.service"; -import { FolderService } from "@bitwarden/common/abstractions/folder.service"; +import { FolderService } from "@bitwarden/common/abstractions/folder/folder.service.abstraction"; import { OrganizationService } from "@bitwarden/common/abstractions/organization.service"; import { SearchService } from "@bitwarden/common/abstractions/search.service"; import { Utils } from "@bitwarden/common/misc/utils"; @@ -126,7 +126,7 @@ export class ListCommand { } private async listFolders(options: Options) { - let folders = await this.folderService.getAllDecrypted(); + let folders = await this.folderService.getAllDecryptedFromState(); if (options.search != null && options.search.trim() !== "") { folders = CliUtils.searchFolders(folders, options.search); diff --git a/apps/cli/src/commands/serve.command.ts b/apps/cli/src/commands/serve.command.ts index 2ce8b90409e..6900b1f93f1 100644 --- a/apps/cli/src/commands/serve.command.ts +++ b/apps/cli/src/commands/serve.command.ts @@ -79,13 +79,15 @@ export class ServeCommand { this.main.folderService, this.main.stateService, this.main.cryptoService, - this.main.apiService + this.main.apiService, + this.main.folderApiService ); this.editCommand = new EditCommand( this.main.cipherService, this.main.folderService, this.main.cryptoService, - this.main.apiService + this.main.apiService, + this.main.folderApiService ); this.generateCommand = new GenerateCommand( this.main.passwordGenerationService, @@ -102,7 +104,8 @@ export class ServeCommand { this.main.cipherService, this.main.folderService, this.main.stateService, - this.main.apiService + this.main.apiService, + this.main.folderApiService ); this.confirmCommand = new ConfirmCommand(this.main.apiService, this.main.cryptoService); this.restoreCommand = new RestoreCommand(this.main.cipherService); diff --git a/apps/cli/src/vault.program.ts b/apps/cli/src/vault.program.ts index 0237b164d18..616568fe248 100644 --- a/apps/cli/src/vault.program.ts +++ b/apps/cli/src/vault.program.ts @@ -229,7 +229,8 @@ export class VaultProgram extends Program { this.main.folderService, this.main.stateService, this.main.cryptoService, - this.main.apiService + this.main.apiService, + this.main.folderApiService ); const response = await command.run(object, encodedJson, cmd); this.processResponse(response); @@ -272,7 +273,8 @@ export class VaultProgram extends Program { this.main.cipherService, this.main.folderService, this.main.cryptoService, - this.main.apiService + this.main.apiService, + this.main.folderApiService ); const response = await command.run(object, id, encodedJson, cmd); this.processResponse(response); @@ -314,7 +316,8 @@ export class VaultProgram extends Program { this.main.cipherService, this.main.folderService, this.main.stateService, - this.main.apiService + this.main.apiService, + this.main.folderApiService ); const response = await command.run(object, id, cmd); this.processResponse(response); diff --git a/apps/desktop/electron-builder.json b/apps/desktop/electron-builder.json index 22c579d9600..b6211e8cdac 100644 --- a/apps/desktop/electron-builder.json +++ b/apps/desktop/electron-builder.json @@ -14,7 +14,7 @@ "afterSign": "scripts/after-sign.js", "asarUnpack": ["**/*.node"], "files": ["**/*", "!**/node_modules/@bitwarden/desktop-native/**/*"], - "electronVersion": "16.2.7", + "electronVersion": "19.0.8", "generateUpdatesFilesForAllChannels": true, "publish": { "provider": "generic", @@ -69,7 +69,7 @@ "sign": "./sign.js", "extraResources": [ { - "from": "node_modules/regedit/vbs", + "from": "../../node_modules/regedit/vbs", "to": "regedit/vbs", "filter": ["**/*"] }, diff --git a/apps/desktop/scripts/choco-update.ps1 b/apps/desktop/scripts/choco-update.ps1 index 72677357aaa..24c0edf9526 100644 --- a/apps/desktop/scripts/choco-update.ps1 +++ b/apps/desktop/scripts/choco-update.ps1 @@ -19,7 +19,7 @@ if(Test-Path -Path $distChocoDir) { Copy-Item -Path $chocoDir -Destination $distChocoDir –Recurse $exe = $distChocoDir + "\Bitwarden-Installer-" + $version + ".exe"; -$uri = "https://github.com/bitwarden/desktop/releases/download/v" + $version + "/Bitwarden-Installer-" + $version + ".exe"; +$uri = "https://github.com/bitwarden/clients/releases/download/desktop-v" + $version + "/Bitwarden-Installer-" + $version + ".exe"; [Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12 Invoke-RestMethod -Uri $uri -OutFile $exe diff --git a/apps/desktop/src/app/accounts/register.component.html b/apps/desktop/src/app/accounts/register.component.html index 395c1bba621..3bdf7d6f6f6 100644 --- a/apps/desktop/src/app/accounts/register.component.html +++ b/apps/desktop/src/app/accounts/register.component.html @@ -1,19 +1,17 @@ - +

{{ "createAccount" | i18n }}

- +
@@ -30,11 +28,8 @@ @@ -46,7 +41,7 @@ appStopClick appA11yTitle="{{ 'toggleVisibility' | i18n }}" [attr.aria-pressed]="showPassword" - (click)="togglePassword(false)" + (click)="togglePassword()" >
@@ -95,7 +88,7 @@ appStopClick appA11yTitle="{{ 'toggleVisibility' | i18n }}" [attr.aria-pressed]="showPassword" - (click)="togglePassword(true)" + (click)="togglePassword()" >
- +
@@ -127,12 +120,7 @@
-
+
- +
diff --git a/apps/web/src/app/accounts/register.component.ts b/apps/web/src/app/accounts/register.component.ts index 3ae38f960e2..c4d60c47367 100644 --- a/apps/web/src/app/accounts/register.component.ts +++ b/apps/web/src/app/accounts/register.component.ts @@ -1,4 +1,5 @@ import { Component } from "@angular/core"; +import { FormBuilder } from "@angular/forms"; import { ActivatedRoute, Router } from "@angular/router"; import { first } from "rxjs/operators"; @@ -7,6 +8,7 @@ import { ApiService } from "@bitwarden/common/abstractions/api.service"; import { AuthService } from "@bitwarden/common/abstractions/auth.service"; import { CryptoService } from "@bitwarden/common/abstractions/crypto.service"; import { EnvironmentService } from "@bitwarden/common/abstractions/environment.service"; +import { FormValidationErrorsService } from "@bitwarden/common/abstractions/formValidationErrors.service"; import { I18nService } from "@bitwarden/common/abstractions/i18n.service"; import { LogService } from "@bitwarden/common/abstractions/log.service"; import { PasswordGenerationService } from "@bitwarden/common/abstractions/passwordGeneration.service"; @@ -25,6 +27,7 @@ import { RouterService } from "../services/router.service"; templateUrl: "register.component.html", }) export class RegisterComponent extends BaseRegisterComponent { + email = ""; showCreateOrgMessage = false; layout = ""; enforcedPolicyOptions: MasterPasswordPolicyOptions; @@ -32,6 +35,8 @@ export class RegisterComponent extends BaseRegisterComponent { private policies: Policy[]; constructor( + formValidationErrorService: FormValidationErrorsService, + formBuilder: FormBuilder, authService: AuthService, router: Router, i18nService: I18nService, @@ -47,6 +52,8 @@ export class RegisterComponent extends BaseRegisterComponent { private routerService: RouterService ) { super( + formValidationErrorService, + formBuilder, authService, router, i18nService, @@ -126,24 +133,4 @@ export class RegisterComponent extends BaseRegisterComponent { await super.ngOnInit(); } - - async submit() { - if ( - this.enforcedPolicyOptions != null && - !this.policyService.evaluateMasterPassword( - this.masterPasswordScore, - this.masterPassword, - this.enforcedPolicyOptions - ) - ) { - this.platformUtilsService.showToast( - "error", - this.i18nService.t("errorOccurred"), - this.i18nService.t("masterPasswordPolicyRequirementsNotMet") - ); - return; - } - - await super.submit(); - } } diff --git a/apps/web/src/app/app.component.ts b/apps/web/src/app/app.component.ts index 4d934820730..7c02076191c 100644 --- a/apps/web/src/app/app.component.ts +++ b/apps/web/src/app/app.component.ts @@ -4,6 +4,7 @@ import { DomSanitizer } from "@angular/platform-browser"; import { NavigationEnd, Router } from "@angular/router"; import * as jq from "jquery"; import { IndividualConfig, ToastrService } from "ngx-toastr"; +import { Subject, takeUntil } from "rxjs"; import Swal from "sweetalert2"; import { AuthService } from "@bitwarden/common/abstractions/auth.service"; @@ -12,7 +13,7 @@ import { CipherService } from "@bitwarden/common/abstractions/cipher.service"; import { CollectionService } from "@bitwarden/common/abstractions/collection.service"; import { CryptoService } from "@bitwarden/common/abstractions/crypto.service"; import { EventService } from "@bitwarden/common/abstractions/event.service"; -import { FolderService } from "@bitwarden/common/abstractions/folder.service"; +import { InternalFolderService } from "@bitwarden/common/abstractions/folder/folder.service.abstraction"; import { I18nService } from "@bitwarden/common/abstractions/i18n.service"; import { KeyConnectorService } from "@bitwarden/common/abstractions/keyConnector.service"; import { NotificationsService } from "@bitwarden/common/abstractions/notifications.service"; @@ -23,7 +24,6 @@ import { SearchService } from "@bitwarden/common/abstractions/search.service"; import { SettingsService } from "@bitwarden/common/abstractions/settings.service"; import { StateService } from "@bitwarden/common/abstractions/state.service"; import { SyncService } from "@bitwarden/common/abstractions/sync.service"; -import { TokenService } from "@bitwarden/common/abstractions/token.service"; import { VaultTimeoutService } from "@bitwarden/common/abstractions/vaultTimeout.service"; import { DisableSendPolicy } from "./organizations/policies/disable-send.component"; @@ -49,12 +49,12 @@ export class AppComponent implements OnDestroy, OnInit { private lastActivity: number = null; private idleTimer: number = null; private isIdle = false; + private destroy$ = new Subject(); constructor( @Inject(DOCUMENT) private document: Document, private broadcasterService: BroadcasterService, - private tokenService: TokenService, - private folderService: FolderService, + private folderService: InternalFolderService, private settingsService: SettingsService, private syncService: SyncService, private passwordGenerationService: PasswordGenerationService, @@ -80,7 +80,9 @@ export class AppComponent implements OnDestroy, OnInit { ) {} ngOnInit() { - this.document.documentElement.lang = this.i18nService.locale; + this.i18nService.locale$.pipe(takeUntil(this.destroy$)).subscribe((locale) => { + this.document.documentElement.lang = locale; + }); this.ngZone.runOutsideAngular(() => { window.onmousemove = () => this.recordActivity(); @@ -183,7 +185,7 @@ export class AppComponent implements OnDestroy, OnInit { }); }); - this.router.events.subscribe((event) => { + this.router.events.pipe(takeUntil(this.destroy$)).subscribe((event) => { if (event instanceof NavigationEnd) { const modals = Array.from(document.querySelectorAll(".modal")); for (const modal of modals) { @@ -199,13 +201,13 @@ export class AppComponent implements OnDestroy, OnInit { this.policyListService.addPolicies([ new TwoFactorAuthenticationPolicy(), new MasterPasswordPolicy(), + new ResetPasswordPolicy(), new PasswordGeneratorPolicy(), new SingleOrgPolicy(), new RequireSsoPolicy(), new PersonalOwnershipPolicy(), new DisableSendPolicy(), new SendOptionsPolicy(), - new ResetPasswordPolicy(), ]); this.setFullWidth(); @@ -213,6 +215,8 @@ export class AppComponent implements OnDestroy, OnInit { ngOnDestroy() { this.broadcasterService.unsubscribe(BroadcasterSubscriptionId); + this.destroy$.next(); + this.destroy$.unsubscribe(); } private async logOut(expired: boolean) { diff --git a/apps/web/src/app/common/base.people.component.ts b/apps/web/src/app/common/base.people.component.ts index af65fef96b5..24344890868 100644 --- a/apps/web/src/app/common/base.people.component.ts +++ b/apps/web/src/app/common/base.people.component.ts @@ -204,15 +204,18 @@ export abstract class BasePeopleComponent< this.edit(null); } - async remove(user: UserType) { - const confirmed = await this.platformUtilsService.showDialog( - this.deleteWarningMessage(user), + protected async removeUserConfirmationDialog(user: UserType) { + return this.platformUtilsService.showDialog( + this.i18nService.t("removeUserConfirmation"), this.userNamePipe.transform(user), this.i18nService.t("yes"), this.i18nService.t("no"), "warning" ); + } + async remove(user: UserType) { + const confirmed = await this.removeUserConfirmationDialog(user); if (!confirmed) { return false; } @@ -235,8 +238,8 @@ export abstract class BasePeopleComponent< async deactivate(user: UserType) { const confirmed = await this.platformUtilsService.showDialog( this.deactivateWarningMessage(), - this.i18nService.t("deactivateUserId", this.userNamePipe.transform(user)), - this.i18nService.t("deactivate"), + this.i18nService.t("revokeUserId", this.userNamePipe.transform(user)), + this.i18nService.t("revokeAccess"), this.i18nService.t("cancel"), "warning" ); @@ -251,7 +254,7 @@ export abstract class BasePeopleComponent< this.platformUtilsService.showToast( "success", null, - this.i18nService.t("deactivatedUserId", this.userNamePipe.transform(user)) + this.i18nService.t("revokedUserId", this.userNamePipe.transform(user)) ); await this.load(); } catch (e) { @@ -261,25 +264,13 @@ export abstract class BasePeopleComponent< } async activate(user: UserType) { - const confirmed = await this.platformUtilsService.showDialog( - this.activateWarningMessage(), - this.i18nService.t("activateUserId", this.userNamePipe.transform(user)), - this.i18nService.t("activate"), - this.i18nService.t("cancel"), - "warning" - ); - - if (!confirmed) { - return false; - } - this.actionPromise = this.activateUser(user.id); try { await this.actionPromise; this.platformUtilsService.showToast( "success", null, - this.i18nService.t("activatedUserId", this.userNamePipe.transform(user)) + this.i18nService.t("restoredUserId", this.userNamePipe.transform(user)) ); await this.load(); } catch (e) { @@ -395,7 +386,7 @@ export abstract class BasePeopleComponent< } protected deactivateWarningMessage(): string { - return this.i18nService.t("deactivateUserConfirmation"); + return this.i18nService.t("revokeUserConfirmation"); } protected activateWarningMessage(): string { diff --git a/apps/web/src/app/modules/loose-components.module.ts b/apps/web/src/app/modules/loose-components.module.ts index c172e554a61..73b5589c769 100644 --- a/apps/web/src/app/modules/loose-components.module.ts +++ b/apps/web/src/app/modules/loose-components.module.ts @@ -23,7 +23,6 @@ import { FilePasswordPromptComponent } from "../components/file-password-prompt. import { NestedCheckboxComponent } from "../components/nested-checkbox.component"; import { OrganizationSwitcherComponent } from "../components/organization-switcher.component"; import { PasswordRepromptComponent } from "../components/password-reprompt.component"; -import { PasswordStrengthComponent } from "../components/password-strength.component"; import { PremiumBadgeComponent } from "../components/premium-badge.component"; import { UserVerificationPromptComponent } from "../components/user-verification-prompt.component"; import { FooterComponent } from "../layouts/footer.component"; @@ -117,7 +116,6 @@ import { EmergencyAccessComponent } from "../settings/emergency-access.component import { EmergencyAddEditComponent } from "../settings/emergency-add-edit.component"; import { OrganizationPlansComponent } from "../settings/organization-plans.component"; import { PaymentMethodComponent } from "../settings/payment-method.component"; -import { PaymentComponent } from "../settings/payment.component"; import { PreferencesComponent } from "../settings/preferences.component"; import { PremiumComponent } from "../settings/premium.component"; import { ProfileComponent } from "../settings/profile.component"; @@ -128,7 +126,6 @@ import { SettingsComponent } from "../settings/settings.component"; import { SponsoredFamiliesComponent } from "../settings/sponsored-families.component"; import { SponsoringOrgRowComponent } from "../settings/sponsoring-org-row.component"; import { SubscriptionComponent } from "../settings/subscription.component"; -import { TaxInfoComponent } from "../settings/tax-info.component"; import { TwoFactorAuthenticatorComponent } from "../settings/two-factor-authenticator.component"; import { TwoFactorDuoComponent } from "../settings/two-factor-duo.component"; import { TwoFactorEmailComponent } from "../settings/two-factor-email.component"; @@ -159,7 +156,9 @@ import { CollectionsComponent } from "../vault/collections.component"; import { FolderAddEditComponent } from "../vault/folder-add-edit.component"; import { ShareComponent } from "../vault/share.component"; +import { OrganizationCreateModule } from "./organizations/create/organization-create.module"; import { PipesModule } from "./pipes/pipes.module"; +import { RegisterFormModule } from "./register-form/register-form.module"; import { SharedModule } from "./shared.module"; import { VaultFilterModule } from "./vault-filter/vault-filter.module"; import { OrganizationBadgeModule } from "./vault/modules/organization-badge/organization-badge.module"; @@ -167,7 +166,14 @@ import { OrganizationBadgeModule } from "./vault/modules/organization-badge/orga // Please do not add to this list of declarations - we should refactor these into modules when doing so makes sense until there are none left. // If you are building new functionality, please create or extend a feature module instead. @NgModule({ - imports: [SharedModule, VaultFilterModule, OrganizationBadgeModule, PipesModule], + imports: [ + SharedModule, + VaultFilterModule, + OrganizationBadgeModule, + PipesModule, + OrganizationCreateModule, + RegisterFormModule, + ], declarations: [ PremiumBadgeComponent, AcceptEmergencyComponent, @@ -267,8 +273,6 @@ import { OrganizationBadgeModule } from "./vault/modules/organization-badge/orga PasswordRepromptComponent, FilePasswordPromptComponent, UserVerificationPromptComponent, - PasswordStrengthComponent, - PaymentComponent, PaymentMethodComponent, PersonalOwnershipPolicyComponent, PreferencesComponent, @@ -301,7 +305,6 @@ import { OrganizationBadgeModule } from "./vault/modules/organization-badge/orga SponsoringOrgRowComponent, SsoComponent, SubscriptionComponent, - TaxInfoComponent, ToolsComponent, TwoFactorAuthenticationPolicyComponent, TwoFactorAuthenticatorComponent, @@ -423,8 +426,6 @@ import { OrganizationBadgeModule } from "./vault/modules/organization-badge/orga PasswordGeneratorPolicyComponent, PasswordRepromptComponent, FilePasswordPromptComponent, - PasswordStrengthComponent, - PaymentComponent, PaymentMethodComponent, PersonalOwnershipPolicyComponent, PreferencesComponent, @@ -457,7 +458,6 @@ import { OrganizationBadgeModule } from "./vault/modules/organization-badge/orga SponsoringOrgRowComponent, SsoComponent, SubscriptionComponent, - TaxInfoComponent, ToolsComponent, TwoFactorAuthenticationPolicyComponent, TwoFactorAuthenticatorComponent, diff --git a/apps/web/src/app/modules/organizations/create/organization-create.module.ts b/apps/web/src/app/modules/organizations/create/organization-create.module.ts new file mode 100644 index 00000000000..2ee84fdd680 --- /dev/null +++ b/apps/web/src/app/modules/organizations/create/organization-create.module.ts @@ -0,0 +1,12 @@ +import { NgModule } from "@angular/core"; + +import { SharedModule } from "../../shared.module"; + +import { OrganizationInformationComponent } from "./organization-information.component"; + +@NgModule({ + imports: [SharedModule], + declarations: [OrganizationInformationComponent], + exports: [OrganizationInformationComponent], +}) +export class OrganizationCreateModule {} diff --git a/apps/web/src/app/modules/organizations/create/organization-information.component.html b/apps/web/src/app/modules/organizations/create/organization-information.component.html new file mode 100644 index 00000000000..6029cfd833a --- /dev/null +++ b/apps/web/src/app/modules/organizations/create/organization-information.component.html @@ -0,0 +1,38 @@ +
+ + {{ "organizationName" | i18n }} + + +
+
+

{{ "generalInformation" | i18n }}

+
+ + {{ "organizationName" | i18n }} + + + + {{ "billingEmail" | i18n }} + + + + {{ "clientOwnerEmail" | i18n }} + + +
+
+ + {{ "accountOwnedBusiness" | i18n }} +
+ + {{ "businessName" | i18n }} + + +
+
+
diff --git a/apps/web/src/app/modules/organizations/create/organization-information.component.ts b/apps/web/src/app/modules/organizations/create/organization-information.component.ts new file mode 100644 index 00000000000..bd59a472ed9 --- /dev/null +++ b/apps/web/src/app/modules/organizations/create/organization-information.component.ts @@ -0,0 +1,15 @@ +import { Component, EventEmitter, Input, Output } from "@angular/core"; +import { FormGroup } from "@angular/forms"; + +@Component({ + selector: "app-org-info", + templateUrl: "organization-information.component.html", +}) +export class OrganizationInformationComponent { + @Input() nameOnly = false; + @Input() createOrganization = true; + @Input() isProvider = false; + @Input() acceptingSponsorship = false; + @Input() formGroup: FormGroup; + @Output() changedBusinessOwned = new EventEmitter(); +} diff --git a/apps/web/src/app/modules/organizations/manage/entity-users.component.html b/apps/web/src/app/modules/organizations/manage/entity-users.component.html index f4c157a9413..92f95bae3b3 100644 --- a/apps/web/src/app/modules/organizations/manage/entity-users.component.html +++ b/apps/web/src/app/modules/organizations/manage/entity-users.component.html @@ -64,9 +64,7 @@ (click)="filterSelected(true)" > {{ "selected" | i18n }} - {{ - selectedCount - }} + {{ selectedCount }}
@@ -115,12 +113,14 @@ {{ u.email }} {{ "invited" | i18n }} {{ "accepted" | i18n }} diff --git a/apps/web/src/app/modules/register-form/register-form.component.html b/apps/web/src/app/modules/register-form/register-form.component.html new file mode 100644 index 00000000000..b4f2877ef15 --- /dev/null +++ b/apps/web/src/app/modules/register-form/register-form.component.html @@ -0,0 +1,121 @@ +
+ +
diff --git a/apps/web/src/app/modules/register-form/register-form.component.ts b/apps/web/src/app/modules/register-form/register-form.component.ts new file mode 100644 index 00000000000..519a185fa13 --- /dev/null +++ b/apps/web/src/app/modules/register-form/register-form.component.ts @@ -0,0 +1,87 @@ +import { Component, Input } from "@angular/core"; +import { FormBuilder } from "@angular/forms"; +import { Router } from "@angular/router"; + +import { RegisterComponent as BaseRegisterComponent } from "@bitwarden/angular/components/register.component"; +import { ApiService } from "@bitwarden/common/abstractions/api.service"; +import { AuthService } from "@bitwarden/common/abstractions/auth.service"; +import { CryptoService } from "@bitwarden/common/abstractions/crypto.service"; +import { EnvironmentService } from "@bitwarden/common/abstractions/environment.service"; +import { FormValidationErrorsService } from "@bitwarden/common/abstractions/formValidationErrors.service"; +import { I18nService } from "@bitwarden/common/abstractions/i18n.service"; +import { LogService } from "@bitwarden/common/abstractions/log.service"; +import { PasswordGenerationService } from "@bitwarden/common/abstractions/passwordGeneration.service"; +import { PlatformUtilsService } from "@bitwarden/common/abstractions/platformUtils.service"; +import { PolicyService } from "@bitwarden/common/abstractions/policy.service"; +import { StateService } from "@bitwarden/common/abstractions/state.service"; +import { MasterPasswordPolicyOptions } from "@bitwarden/common/models/domain/masterPasswordPolicyOptions"; + +@Component({ + selector: "app-register-form", + templateUrl: "./register-form.component.html", +}) +export class RegisterFormComponent extends BaseRegisterComponent { + @Input() queryParamEmail: string; + @Input() enforcedPolicyOptions: MasterPasswordPolicyOptions; + + showErrorSummary = false; + + constructor( + formValidationErrorService: FormValidationErrorsService, + formBuilder: FormBuilder, + authService: AuthService, + router: Router, + i18nService: I18nService, + cryptoService: CryptoService, + apiService: ApiService, + stateService: StateService, + platformUtilsService: PlatformUtilsService, + passwordGenerationService: PasswordGenerationService, + private policyService: PolicyService, + environmentService: EnvironmentService, + logService: LogService + ) { + super( + formValidationErrorService, + formBuilder, + authService, + router, + i18nService, + cryptoService, + apiService, + stateService, + platformUtilsService, + passwordGenerationService, + environmentService, + logService + ); + } + + async ngOnInit() { + await super.ngOnInit(); + + if (this.queryParamEmail) { + this.formGroup.get("email")?.setValue(this.queryParamEmail); + } + } + + async submit() { + if ( + this.enforcedPolicyOptions != null && + !this.policyService.evaluateMasterPassword( + this.masterPasswordScore, + this.formGroup.get("masterPassword")?.value, + this.enforcedPolicyOptions + ) + ) { + this.platformUtilsService.showToast( + "error", + this.i18nService.t("errorOccurred"), + this.i18nService.t("masterPasswordPolicyRequirementsNotMet") + ); + return; + } + + await super.submit(false); + } +} diff --git a/apps/web/src/app/modules/register-form/register-form.module.ts b/apps/web/src/app/modules/register-form/register-form.module.ts new file mode 100644 index 00000000000..0c6c919ef16 --- /dev/null +++ b/apps/web/src/app/modules/register-form/register-form.module.ts @@ -0,0 +1,12 @@ +import { NgModule } from "@angular/core"; + +import { SharedModule } from "../shared.module"; + +import { RegisterFormComponent } from "./register-form.component"; + +@NgModule({ + imports: [SharedModule], + declarations: [RegisterFormComponent], + exports: [RegisterFormComponent], +}) +export class RegisterFormModule {} diff --git a/apps/web/src/app/modules/shared.module.ts b/apps/web/src/app/modules/shared.module.ts index 868e3cee587..79f967f23a7 100644 --- a/apps/web/src/app/modules/shared.module.ts +++ b/apps/web/src/app/modules/shared.module.ts @@ -62,10 +62,14 @@ import { ButtonModule, CalloutModule, FormFieldModule, - MenuModule, SubmitButtonModule, + MenuModule, } from "@bitwarden/components"; +import { PasswordStrengthComponent } from "../components/password-strength.component"; +import { PaymentComponent } from "../settings/payment.component"; +import { TaxInfoComponent } from "../settings/tax-info.component"; + registerLocaleData(localeAf, "af"); registerLocaleData(localeAz, "az"); registerLocaleData(localeBe, "be"); @@ -118,6 +122,7 @@ registerLocaleData(localeZhCn, "zh-CN"); registerLocaleData(localeZhTw, "zh-TW"); @NgModule({ + declarations: [PasswordStrengthComponent, PaymentComponent, TaxInfoComponent], imports: [ CommonModule, DragDropModule, @@ -153,6 +158,9 @@ registerLocaleData(localeZhTw, "zh-TW"); MenuModule, FormFieldModule, SubmitButtonModule, + PasswordStrengthComponent, + PaymentComponent, + TaxInfoComponent, ], providers: [DatePipe], bootstrap: [], diff --git a/apps/web/src/app/modules/trial-initiation/billing.component.html b/apps/web/src/app/modules/trial-initiation/billing.component.html new file mode 100644 index 00000000000..949220bad51 --- /dev/null +++ b/apps/web/src/app/modules/trial-initiation/billing.component.html @@ -0,0 +1,48 @@ +
+
+
+

{{ "billingPlanLabel" | i18n }}

+
+ +
+
+ +
+

{{ "paymentType" | i18n }}

+ + +
+ +
+ {{ "startTrial" | i18n }} + + +
+
+
diff --git a/apps/web/src/app/modules/trial-initiation/billing.component.ts b/apps/web/src/app/modules/trial-initiation/billing.component.ts new file mode 100644 index 00000000000..ed0eb7892e7 --- /dev/null +++ b/apps/web/src/app/modules/trial-initiation/billing.component.ts @@ -0,0 +1,68 @@ +import { Component, EventEmitter, Input, Output } from "@angular/core"; +import { FormBuilder, FormGroup } from "@angular/forms"; +import { Router } from "@angular/router"; + +import { ApiService } from "@bitwarden/common/abstractions/api.service"; +import { CryptoService } from "@bitwarden/common/abstractions/crypto.service"; +import { I18nService } from "@bitwarden/common/abstractions/i18n.service"; +import { LogService } from "@bitwarden/common/abstractions/log.service"; +import { MessagingService } from "@bitwarden/common/abstractions/messaging.service"; +import { OrganizationService } from "@bitwarden/common/abstractions/organization.service"; +import { PlatformUtilsService } from "@bitwarden/common/abstractions/platformUtils.service"; +import { PolicyService } from "@bitwarden/common/abstractions/policy.service"; +import { SyncService } from "@bitwarden/common/abstractions/sync.service"; + +import { OrganizationPlansComponent } from "src/app/settings/organization-plans.component"; + +@Component({ + selector: "app-billing", + templateUrl: "./billing.component.html", +}) +export class BillingComponent extends OrganizationPlansComponent { + @Input() orgInfoForm: FormGroup; + @Output() previousStep = new EventEmitter(); + + constructor( + apiService: ApiService, + i18nService: I18nService, + platformUtilsService: PlatformUtilsService, + cryptoService: CryptoService, + router: Router, + syncService: SyncService, + policyService: PolicyService, + organizationService: OrganizationService, + logService: LogService, + messagingService: MessagingService, + formBuilder: FormBuilder + ) { + super( + apiService, + i18nService, + platformUtilsService, + cryptoService, + router, + syncService, + policyService, + organizationService, + logService, + messagingService, + formBuilder + ); + } + + async ngOnInit() { + this.formGroup.patchValue({ + name: this.orgInfoForm.get("name")?.value, + billingEmail: this.orgInfoForm.get("email")?.value, + additionalSeats: 1, + plan: this.plan, + product: this.product, + }); + this.isInTrialFlow = true; + await super.ngOnInit(); + } + + stepBack() { + this.previousStep.emit(); + } +} diff --git a/apps/web/src/app/modules/trial-initiation/confirmation-details.component.html b/apps/web/src/app/modules/trial-initiation/confirmation-details.component.html new file mode 100644 index 00000000000..e892abf3c5a --- /dev/null +++ b/apps/web/src/app/modules/trial-initiation/confirmation-details.component.html @@ -0,0 +1,17 @@ +
+

{{ "trialThankYou" | i18n: orgLabel }}

+
    +
  • +

    + {{ "trialConfirmationEmail" | i18n }} + {{ email }}. +

    +
  • +
  • +

    + {{ "trialPaidInfoMessage" | i18n: orgLabel }} +

    +
  • +
+
diff --git a/apps/web/src/app/modules/trial-initiation/confirmation-details.component.ts b/apps/web/src/app/modules/trial-initiation/confirmation-details.component.ts new file mode 100644 index 00000000000..95976fe7273 --- /dev/null +++ b/apps/web/src/app/modules/trial-initiation/confirmation-details.component.ts @@ -0,0 +1,10 @@ +import { Component, Input } from "@angular/core"; + +@Component({ + selector: "app-trial-confirmation-details", + templateUrl: "confirmation-details.component.html", +}) +export class ConfirmationDetailsComponent { + @Input() email: string; + @Input() orgLabel: string; +} diff --git a/apps/web/src/app/modules/trial-initiation/enterprise-content.component.html b/apps/web/src/app/modules/trial-initiation/enterprise-content.component.html new file mode 100644 index 00000000000..2da9a72cab1 --- /dev/null +++ b/apps/web/src/app/modules/trial-initiation/enterprise-content.component.html @@ -0,0 +1,11 @@ +

You've chosen Bitwarden for Enterprise

+
+

What you can do with Bitwarden for Enterprise

+
+ +
+

Collaborate and share securely

+

Deploy and manage quickly and easily

+

Access anywhere on any device

+

Create your account to get started

+
diff --git a/apps/web/src/app/modules/trial-initiation/enterprise-content.component.ts b/apps/web/src/app/modules/trial-initiation/enterprise-content.component.ts new file mode 100644 index 00000000000..847b3c3088a --- /dev/null +++ b/apps/web/src/app/modules/trial-initiation/enterprise-content.component.ts @@ -0,0 +1,7 @@ +import { Component } from "@angular/core"; + +@Component({ + selector: "app-enterprise-content", + templateUrl: "enterprise-content.component.html", +}) +export class EnterpriseContentComponent {} diff --git a/apps/web/src/app/modules/trial-initiation/families-content.component.html b/apps/web/src/app/modules/trial-initiation/families-content.component.html new file mode 100644 index 00000000000..d2fc304e9e1 --- /dev/null +++ b/apps/web/src/app/modules/trial-initiation/families-content.component.html @@ -0,0 +1,13 @@ +

You've chosen Bitwarden for Families

+
+

+ Trusted by millions of individuals, teams, and organizations worldwide for secure password + storage and sharing. +

+
+
+

Collaborate and share securely

+

Deploy and manage quickly and easily

+

Access anywhere on any device

+

Create your account to get started

+
diff --git a/apps/web/src/app/modules/trial-initiation/families-content.component.ts b/apps/web/src/app/modules/trial-initiation/families-content.component.ts new file mode 100644 index 00000000000..1a13be80e67 --- /dev/null +++ b/apps/web/src/app/modules/trial-initiation/families-content.component.ts @@ -0,0 +1,7 @@ +import { Component } from "@angular/core"; + +@Component({ + selector: "app-families-content", + templateUrl: "families-content.component.html", +}) +export class FamiliesContentComponent {} diff --git a/apps/web/src/app/modules/trial-initiation/teams-content.component.html b/apps/web/src/app/modules/trial-initiation/teams-content.component.html new file mode 100644 index 00000000000..6183618dee8 --- /dev/null +++ b/apps/web/src/app/modules/trial-initiation/teams-content.component.html @@ -0,0 +1,10 @@ +

You've chosen Bitwarden for Teams

+
+

What you can do with Btiwarden for Teams

+
+
+

Collaborate and share securely

+

Deploy and manage quickly and easily

+

Access anywhere on any device

+

Create your account to get started

+
diff --git a/apps/web/src/app/modules/trial-initiation/teams-content.component.ts b/apps/web/src/app/modules/trial-initiation/teams-content.component.ts new file mode 100644 index 00000000000..5c97695deff --- /dev/null +++ b/apps/web/src/app/modules/trial-initiation/teams-content.component.ts @@ -0,0 +1,7 @@ +import { Component } from "@angular/core"; + +@Component({ + selector: "app-teams-content", + templateUrl: "teams-content.component.html", +}) +export class TeamsContentComponent {} diff --git a/apps/web/src/app/modules/trial-initiation/trial-initiation.component.html b/apps/web/src/app/modules/trial-initiation/trial-initiation.component.html new file mode 100644 index 00000000000..b0d647b68bf --- /dev/null +++ b/apps/web/src/app/modules/trial-initiation/trial-initiation.component.html @@ -0,0 +1,94 @@ +
+

{{ "createAccount" | i18n }}

+
+ +
+
+
+
+
+
+ Bitwarden + +
+ + + + + + +
+
+
+
+
+
+

+ Start your 7-Day free trial of Bitwarden for {{ org }} +

+
+ + + + + + + + + + + + + +
+ + +
+
+
+
+
+
+
+
diff --git a/apps/web/src/app/modules/trial-initiation/trial-initiation.component.ts b/apps/web/src/app/modules/trial-initiation/trial-initiation.component.ts new file mode 100644 index 00000000000..b11cdde71dd --- /dev/null +++ b/apps/web/src/app/modules/trial-initiation/trial-initiation.component.ts @@ -0,0 +1,145 @@ +import { StepperSelectionEvent } from "@angular/cdk/stepper"; +import { TitleCasePipe } from "@angular/common"; +import { Component, OnInit, ViewChild } from "@angular/core"; +import { FormBuilder, Validators } from "@angular/forms"; +import { ActivatedRoute, Router } from "@angular/router"; +import { first } from "rxjs"; + +import { ApiService } from "@bitwarden/common/abstractions/api.service"; +import { I18nService } from "@bitwarden/common/abstractions/i18n.service"; +import { LogService } from "@bitwarden/common/abstractions/log.service"; +import { PolicyService } from "@bitwarden/common/abstractions/policy.service"; +import { StateService } from "@bitwarden/common/abstractions/state.service"; +import { PlanType } from "@bitwarden/common/enums/planType"; +import { ProductType } from "@bitwarden/common/enums/productType"; +import { PolicyData } from "@bitwarden/common/models/data/policyData"; +import { MasterPasswordPolicyOptions } from "@bitwarden/common/models/domain/masterPasswordPolicyOptions"; +import { Policy } from "@bitwarden/common/models/domain/policy"; + +import { VerticalStepperComponent } from "../vertical-stepper/vertical-stepper.component"; + +@Component({ + selector: "app-trial", + templateUrl: "trial-initiation.component.html", +}) +export class TrialInitiationComponent implements OnInit { + email = ""; + org = "teams"; + orgInfoSubLabel = ""; + orgId = ""; + orgLabel = ""; + billingSubLabel = ""; + plan: PlanType; + product: ProductType; + accountCreateOnly = true; + policies: Policy[]; + enforcedPolicyOptions: MasterPasswordPolicyOptions; + @ViewChild("stepper", { static: false }) verticalStepper: VerticalStepperComponent; + + orgInfoFormGroup = this.formBuilder.group({ + name: ["", [Validators.required]], + email: [""], + }); + + constructor( + private route: ActivatedRoute, + protected router: Router, + private formBuilder: FormBuilder, + private titleCasePipe: TitleCasePipe, + private stateService: StateService, + private apiService: ApiService, + private logService: LogService, + private policyService: PolicyService, + private i18nService: I18nService + ) {} + + async ngOnInit(): Promise { + this.route.queryParams.pipe(first()).subscribe((qParams) => { + if (qParams.email != null && qParams.email.indexOf("@") > -1) { + this.email = qParams.email; + } + + if (!qParams.org) { + return; + } + + this.org = qParams.org; + this.orgLabel = this.titleCasePipe.transform(this.org); + this.accountCreateOnly = false; + + if (qParams.org === "families") { + this.plan = PlanType.FamiliesAnnually; + this.product = ProductType.Families; + } else if (qParams.org === "teams") { + this.plan = PlanType.TeamsAnnually; + this.product = ProductType.Teams; + } else if (qParams.org === "enterprise") { + this.plan = PlanType.EnterpriseAnnually; + this.product = ProductType.Enterprise; + } + }); + + const invite = await this.stateService.getOrganizationInvitation(); + if (invite != null) { + try { + const policies = await this.apiService.getPoliciesByToken( + invite.organizationId, + invite.token, + invite.email, + invite.organizationUserId + ); + if (policies.data != null) { + const policiesData = policies.data.map((p) => new PolicyData(p)); + this.policies = policiesData.map((p) => new Policy(p)); + } + } catch (e) { + this.logService.error(e); + } + } + + if (this.policies != null) { + this.enforcedPolicyOptions = await this.policyService.getMasterPasswordPolicyOptions( + this.policies + ); + } + } + + stepSelectionChange(event: StepperSelectionEvent) { + // Set org info sub label + if (event.selectedIndex === 1 && this.orgInfoFormGroup.controls.name.value === "") { + this.orgInfoSubLabel = + "Enter your " + this.titleCasePipe.transform(this.org) + " organization information"; + } else if (event.previouslySelectedIndex === 1) { + this.orgInfoSubLabel = this.orgInfoFormGroup.controls.name.value; + } + + //set billing sub label + if (event.selectedIndex === 2) { + this.billingSubLabel = this.i18nService.t("billingTrialSubLabel"); + } + } + + createdAccount(email: string) { + this.email = email; + this.orgInfoFormGroup.get("email")?.setValue(email); + this.verticalStepper.next(); + } + + billingSuccess(event: any) { + this.orgId = event?.orgId; + this.billingSubLabel = event?.subLabelText; + this.verticalStepper.next(); + } + + navigateToOrgVault() { + this.router.navigate(["organizations", this.orgId, "vault"]); + } + + navigateToOrgInvite() { + this.router.navigate(["organizations", this.orgId, "manage", "people"]); + } + + previousStep() { + this.verticalStepper.previous(); + } +} diff --git a/apps/web/src/app/modules/trial-initiation/trial-initiation.module.ts b/apps/web/src/app/modules/trial-initiation/trial-initiation.module.ts new file mode 100644 index 00000000000..4507970adb0 --- /dev/null +++ b/apps/web/src/app/modules/trial-initiation/trial-initiation.module.ts @@ -0,0 +1,39 @@ +import { CdkStepperModule } from "@angular/cdk/stepper"; +import { TitleCasePipe } from "@angular/common"; +import { NgModule } from "@angular/core"; + +import { FormFieldModule } from "@bitwarden/components"; + +import { OrganizationCreateModule } from "../organizations/create/organization-create.module"; +import { RegisterFormModule } from "../register-form/register-form.module"; +import { SharedModule } from "../shared.module"; +import { VerticalStepperModule } from "../vertical-stepper/vertical-stepper.module"; + +import { BillingComponent } from "./billing.component"; +import { ConfirmationDetailsComponent } from "./confirmation-details.component"; +import { EnterpriseContentComponent } from "./enterprise-content.component"; +import { FamiliesContentComponent } from "./families-content.component"; +import { TeamsContentComponent } from "./teams-content.component"; +import { TrialInitiationComponent } from "./trial-initiation.component"; + +@NgModule({ + imports: [ + SharedModule, + CdkStepperModule, + VerticalStepperModule, + FormFieldModule, + RegisterFormModule, + OrganizationCreateModule, + ], + declarations: [ + TrialInitiationComponent, + EnterpriseContentComponent, + FamiliesContentComponent, + TeamsContentComponent, + ConfirmationDetailsComponent, + BillingComponent, + ], + exports: [TrialInitiationComponent], + providers: [TitleCasePipe], +}) +export class TrialInitiationModule {} diff --git a/apps/web/src/app/modules/vault-filter/components/collection-filter.component.html b/apps/web/src/app/modules/vault-filter/components/collection-filter.component.html index 24463dca19d..417d635bad9 100644 --- a/apps/web/src/app/modules/vault-filter/components/collection-filter.component.html +++ b/apps/web/src/app/modules/vault-filter/components/collection-filter.component.html @@ -23,7 +23,7 @@
  • diff --git a/apps/web/src/app/modules/vault-filter/components/organization-filter.component.html b/apps/web/src/app/modules/vault-filter/components/organization-filter.component.html index 0c4bf90eb1e..7ea5c0c92c5 100644 --- a/apps/web/src/app/modules/vault-filter/components/organization-filter.component.html +++ b/apps/web/src/app/modules/vault-filter/components/organization-filter.component.html @@ -129,6 +129,12 @@ +
  • diff --git a/apps/web/src/app/modules/vertical-stepper/vertical-step-content.component.ts b/apps/web/src/app/modules/vertical-stepper/vertical-step-content.component.ts new file mode 100644 index 00000000000..8a074073dbf --- /dev/null +++ b/apps/web/src/app/modules/vertical-stepper/vertical-step-content.component.ts @@ -0,0 +1,20 @@ +import { Component, EventEmitter, Input, Output } from "@angular/core"; + +import { VerticalStep } from "./vertical-step.component"; + +@Component({ + selector: "app-vertical-step-content", + templateUrl: "vertical-step-content.component.html", +}) +export class VerticalStepContentComponent { + @Output() onSelectStep = new EventEmitter(); + + @Input() disabled = false; + @Input() selected = false; + @Input() step: VerticalStep; + @Input() stepNumber: number; + + selectStep() { + this.onSelectStep.emit(); + } +} diff --git a/apps/web/src/app/modules/vertical-stepper/vertical-step.component.html b/apps/web/src/app/modules/vertical-stepper/vertical-step.component.html new file mode 100644 index 00000000000..60685013dbf --- /dev/null +++ b/apps/web/src/app/modules/vertical-stepper/vertical-step.component.html @@ -0,0 +1,8 @@ + +
    + +
    +
    diff --git a/apps/web/src/app/modules/vertical-stepper/vertical-step.component.ts b/apps/web/src/app/modules/vertical-stepper/vertical-step.component.ts new file mode 100644 index 00000000000..17371532245 --- /dev/null +++ b/apps/web/src/app/modules/vertical-stepper/vertical-step.component.ts @@ -0,0 +1,12 @@ +import { CdkStep } from "@angular/cdk/stepper"; +import { Component, Input } from "@angular/core"; + +@Component({ + selector: "app-vertical-step", + templateUrl: "vertical-step.component.html", + providers: [{ provide: CdkStep, useExisting: VerticalStep }], +}) +export class VerticalStep extends CdkStep { + @Input() subLabel = ""; + @Input() applyBorder = true; +} diff --git a/apps/web/src/app/modules/vertical-stepper/vertical-stepper.component.html b/apps/web/src/app/modules/vertical-stepper/vertical-stepper.component.html new file mode 100644 index 00000000000..2051cfb47d8 --- /dev/null +++ b/apps/web/src/app/modules/vertical-stepper/vertical-stepper.component.html @@ -0,0 +1,22 @@ +
    +
      +
    • + +
      +
      +
    • +
    +
    diff --git a/apps/web/src/app/modules/vertical-stepper/vertical-stepper.component.ts b/apps/web/src/app/modules/vertical-stepper/vertical-stepper.component.ts new file mode 100644 index 00000000000..2c66dae7be1 --- /dev/null +++ b/apps/web/src/app/modules/vertical-stepper/vertical-stepper.component.ts @@ -0,0 +1,29 @@ +import { CdkStepper } from "@angular/cdk/stepper"; +import { Component, Input } from "@angular/core"; + +@Component({ + selector: "app-vertical-stepper", + templateUrl: "vertical-stepper.component.html", + providers: [{ provide: CdkStepper, useExisting: VerticalStepperComponent }], +}) +export class VerticalStepperComponent extends CdkStepper { + @Input() + activeClass = "active"; + + isNextButtonHidden() { + return !(this.steps.length === this.selectedIndex + 1); + } + + isStepDisabled(index: number) { + if (this.selectedIndex !== index) { + return this.selectedIndex === index - 1 + ? !this.steps.find((_, i) => i == index - 1)?.completed + : true; + } + return false; + } + + selectStepByIndex(index: number): void { + this.selectedIndex = index; + } +} diff --git a/apps/web/src/app/modules/vertical-stepper/vertical-stepper.module.ts b/apps/web/src/app/modules/vertical-stepper/vertical-stepper.module.ts new file mode 100644 index 00000000000..71207aa4313 --- /dev/null +++ b/apps/web/src/app/modules/vertical-stepper/vertical-stepper.module.ts @@ -0,0 +1,14 @@ +import { NgModule } from "@angular/core"; + +import { SharedModule } from "../shared.module"; + +import { VerticalStepContentComponent } from "./vertical-step-content.component"; +import { VerticalStep } from "./vertical-step.component"; +import { VerticalStepperComponent } from "./vertical-stepper.component"; + +@NgModule({ + imports: [SharedModule], + declarations: [VerticalStepperComponent, VerticalStep, VerticalStepContentComponent], + exports: [VerticalStepperComponent, VerticalStep], +}) +export class VerticalStepperModule {} diff --git a/apps/web/src/app/organizations/layouts/organization-layout.component.ts b/apps/web/src/app/organizations/layouts/organization-layout.component.ts index 2657e70f0ad..c9dcbd5cf3c 100644 --- a/apps/web/src/app/organizations/layouts/organization-layout.component.ts +++ b/apps/web/src/app/organizations/layouts/organization-layout.component.ts @@ -86,6 +86,9 @@ export class OrganizationLayoutComponent implements OnInit, OnDestroy { case this.organization.canManageSso: route = "manage/sso"; break; + case this.organization.canManageScim: + route = "manage/scim"; + break; case this.organization.canAccessEventLogs: route = "manage/events"; break; diff --git a/apps/web/src/app/organizations/manage/bulk/bulk-deactivate.component.html b/apps/web/src/app/organizations/manage/bulk/bulk-deactivate.component.html index b8bebcaa6fa..d2005be2290 100644 --- a/apps/web/src/app/organizations/manage/bulk/bulk-deactivate.component.html +++ b/apps/web/src/app/organizations/manage/bulk/bulk-deactivate.component.html @@ -22,8 +22,8 @@ {{ error }} - - {{ usersWarning }} + + {{ "revokeUsersWarning" | i18n }} diff --git a/apps/web/src/app/organizations/manage/bulk/bulk-deactivate.component.ts b/apps/web/src/app/organizations/manage/bulk/bulk-deactivate.component.ts index a6c63765cc8..558c312825f 100644 --- a/apps/web/src/app/organizations/manage/bulk/bulk-deactivate.component.ts +++ b/apps/web/src/app/organizations/manage/bulk/bulk-deactivate.component.ts @@ -1,6 +1,5 @@ import { Component } from "@angular/core"; -import { ModalRef } from "@bitwarden/angular/components/modal/modal.ref"; import { ModalConfig } from "@bitwarden/angular/services/modal.service"; import { ApiService } from "@bitwarden/common/abstractions/api.service"; import { I18nService } from "@bitwarden/common/abstractions/i18n.service"; @@ -26,7 +25,6 @@ export class BulkDeactivateComponent { constructor( protected apiService: ApiService, protected i18nService: I18nService, - private modalRef: ModalRef, config: ModalConfig ) { this.isDeactivating = config.data.isDeactivating; @@ -35,21 +33,16 @@ export class BulkDeactivateComponent { } get bulkTitle() { - const titleKey = this.isDeactivating ? "deactivateUsers" : "activateUsers"; + const titleKey = this.isDeactivating ? "revokeUsers" : "restoreUsers"; return this.i18nService.t(titleKey); } - get usersWarning() { - const warningKey = this.isDeactivating ? "deactivateUsersWarning" : "activateUsersWarning"; - return this.i18nService.t(warningKey); - } - async submit() { this.loading = true; try { const response = await this.performBulkUserAction(); - const bulkMessage = this.isDeactivating ? "bulkDeactivatedMessage" : "bulkActivatedMessage"; + const bulkMessage = this.isDeactivating ? "bulkRevokedMessage" : "bulkRestoredMessage"; response.data.forEach((entry) => { const error = entry.error !== "" ? entry.error : this.i18nService.t(bulkMessage); this.statuses.set(entry.id, error); @@ -60,7 +53,6 @@ export class BulkDeactivateComponent { } this.loading = false; - this.modalRef.close(); } protected async performBulkUserAction() { diff --git a/apps/web/src/app/organizations/manage/bulk/bulk-remove.component.html b/apps/web/src/app/organizations/manage/bulk/bulk-remove.component.html index 993d89533f5..25b91fbf13a 100644 --- a/apps/web/src/app/organizations/manage/bulk/bulk-remove.component.html +++ b/apps/web/src/app/organizations/manage/bulk/bulk-remove.component.html @@ -23,7 +23,7 @@ - {{ "removeUsersWarning" | i18n }} + {{ removeUsersWarning }}
    diff --git a/apps/web/src/app/organizations/manage/bulk/bulk-remove.component.ts b/apps/web/src/app/organizations/manage/bulk/bulk-remove.component.ts index e6abeb03228..33641d76164 100644 --- a/apps/web/src/app/organizations/manage/bulk/bulk-remove.component.ts +++ b/apps/web/src/app/organizations/manage/bulk/bulk-remove.component.ts @@ -43,4 +43,8 @@ export class BulkRemoveComponent { const request = new OrganizationUserBulkRequest(this.users.map((user) => user.id)); return await this.apiService.deleteManyOrganizationUsers(this.organizationId, request); } + + protected get removeUsersWarning() { + return this.i18nService.t("removeOrgUsersConfirmation"); + } } diff --git a/apps/web/src/app/organizations/manage/manage.component.html b/apps/web/src/app/organizations/manage/manage.component.html index 63718db4327..5d119bd4bb4 100644 --- a/apps/web/src/app/organizations/manage/manage.component.html +++ b/apps/web/src/app/organizations/manage/manage.component.html @@ -44,6 +44,14 @@ > {{ "singleSignOn" | i18n }} + + {{ "scim" | i18n }} + {{ "all" | i18n }} - {{ allCount }} + {{ allCount }}
    @@ -81,11 +77,11 @@
    @@ -263,7 +259,7 @@ *ngIf="u.status === userStatusType.Deactivated" > - {{ "activate" | i18n }} + {{ "restoreAccess" | i18n }} - {{ "deactivate" | i18n }} + {{ "revokeAccess" | i18n }} diff --git a/apps/web/src/app/organizations/manage/people.component.ts b/apps/web/src/app/organizations/manage/people.component.ts index a9f0c02929d..5bf6144ddaa 100644 --- a/apps/web/src/app/organizations/manage/people.component.ts +++ b/apps/web/src/app/organizations/manage/people.component.ts @@ -397,12 +397,18 @@ export class PeopleComponent ); } - protected deleteWarningMessage(user: OrganizationUserUserDetailsResponse): string { - if (user.usesKeyConnector) { - return this.i18nService.t("removeUserConfirmationKeyConnector"); - } + protected async removeUserConfirmationDialog(user: OrganizationUserUserDetailsResponse) { + const warningMessage = user.usesKeyConnector + ? this.i18nService.t("removeUserConfirmationKeyConnector") + : this.i18nService.t("removeOrgUserConfirmation"); - return super.deleteWarningMessage(user); + return this.platformUtilsService.showDialog( + warningMessage, + this.i18nService.t("removeUserIdAccess", this.userNamePipe.transform(user)), + this.i18nService.t("yes"), + this.i18nService.t("no"), + "warning" + ); } private async showBulkStatus( diff --git a/apps/web/src/app/organizations/manage/policies.component.html b/apps/web/src/app/organizations/manage/policies.component.html index 0f8b890c8f6..d12502398fc 100644 --- a/apps/web/src/app/organizations/manage/policies.component.html +++ b/apps/web/src/app/organizations/manage/policies.component.html @@ -14,8 +14,8 @@ diff --git a/apps/web/src/app/organizations/manage/user-add-edit.component.html b/apps/web/src/app/organizations/manage/user-add-edit.component.html index a11aeda15b6..2820ac05e2f 100644 --- a/apps/web/src/app/organizations/manage/user-add-edit.component.html +++ b/apps/web/src/app/organizations/manage/user-add-edit.component.html @@ -11,7 +11,7 @@ diff --git a/apps/web/src/app/reports/inactive-two-factor-report.component.html b/apps/web/src/app/reports/inactive-two-factor-report.component.html index b472498093c..961d3e1acef 100644 --- a/apps/web/src/app/reports/inactive-two-factor-report.component.html +++ b/apps/web/src/app/reports/inactive-two-factor-report.component.html @@ -61,7 +61,7 @@ diff --git a/apps/web/src/app/reports/weak-passwords-report.component.html b/apps/web/src/app/reports/weak-passwords-report.component.html index 15315b5c2d1..414cdb086e1 100644 --- a/apps/web/src/app/reports/weak-passwords-report.component.html +++ b/apps/web/src/app/reports/weak-passwords-report.component.html @@ -65,7 +65,7 @@ {{ c.subTitle }} diff --git a/apps/web/src/app/services/event.service.ts b/apps/web/src/app/services/event.service.ts index 302fe2b9cea..abb97e37311 100644 --- a/apps/web/src/app/services/event.service.ts +++ b/apps/web/src/app/services/event.service.ts @@ -280,6 +280,20 @@ export class EventService { this.getShortId(ev.organizationUserId) ); break; + case EventType.OrganizationUser_Deactivated: + msg = this.i18nService.t("revokedUserId", this.formatOrgUserId(ev)); + humanReadableMsg = this.i18nService.t( + "revokedUserId", + this.getShortId(ev.organizationUserId) + ); + break; + case EventType.OrganizationUser_Activated: + msg = this.i18nService.t("restoredUserId", this.formatOrgUserId(ev)); + humanReadableMsg = this.i18nService.t( + "restoredUserId", + this.getShortId(ev.organizationUserId) + ); + break; // Org case EventType.Organization_Updated: msg = humanReadableMsg = this.i18nService.t("editedOrgSettings"); diff --git a/apps/web/src/app/settings/change-password.component.html b/apps/web/src/app/settings/change-password.component.html index 90df85042e6..3171d8e0ea8 100644 --- a/apps/web/src/app/settings/change-password.component.html +++ b/apps/web/src/app/settings/change-password.component.html @@ -64,6 +64,17 @@ +
    + + +
    {{ c.email }} {{ "invited" | i18n }} - {{ - "accepted" | i18n - }} {{ "accepted" | i18n }} + {{ "emergencyAccessRecoveryInitiated" | i18n }} - {{ "emergencyAccessRecoveryApproved" | i18n }} - - {{ - "view" | i18n + {{ + "emergencyAccessRecoveryApproved" | i18n }} - {{ + + {{ "view" | i18n }} + {{ "takeover" | i18n }} @@ -159,29 +160,30 @@
    {{ u.email }} - {{ + {{ "invited" | i18n }} - {{ + {{ "accepted" | i18n }} - {{ - "deactivated" | i18n + {{ + "revoked" | i18n }} {{ u.name }}
    {{ p.name | i18n }} - {{ - "enabled" | i18n + {{ + "on" | i18n }} {{ p.description | i18n }} - + {{ "exposedXTimes" | i18n: (exposedPasswordMap.get(c.id) | number) }} {{ c.subTitle }} - + {{ "reusedXTimes" | i18n: passwordUseMap.get(c.login.password) }} - + {{ passwordStrengthMap.get(c.id)[0] | i18n }} {{ c.email }} - {{ "invited" | i18n }} - {{ - "accepted" | i18n + {{ + "invited" | i18n }} {{ "accepted" | i18n }} + {{ "emergencyAccessRecoveryInitiated" | i18n }} {{ "emergencyAccessRecoveryApproved" | i18n }} - {{ - "view" | i18n - }} - {{ + {{ "view" | i18n }} + {{ "takeover" | i18n }} diff --git a/apps/web/src/app/settings/emergency-add-edit.component.ts b/apps/web/src/app/settings/emergency-add-edit.component.ts index c0aabd8da36..28b69693431 100644 --- a/apps/web/src/app/settings/emergency-add-edit.component.ts +++ b/apps/web/src/app/settings/emergency-add-edit.component.ts @@ -4,7 +4,7 @@ import { AuditService } from "@bitwarden/common/abstractions/audit.service"; import { CipherService } from "@bitwarden/common/abstractions/cipher.service"; import { CollectionService } from "@bitwarden/common/abstractions/collection.service"; import { EventService } from "@bitwarden/common/abstractions/event.service"; -import { FolderService } from "@bitwarden/common/abstractions/folder.service"; +import { FolderService } from "@bitwarden/common/abstractions/folder/folder.service.abstraction"; import { I18nService } from "@bitwarden/common/abstractions/i18n.service"; import { LogService } from "@bitwarden/common/abstractions/log.service"; import { MessagingService } from "@bitwarden/common/abstractions/messaging.service"; diff --git a/apps/web/src/app/settings/organization-plans.component.html b/apps/web/src/app/settings/organization-plans.component.html index 7b827ce7c79..a282aaf05e6 100644 --- a/apps/web/src/app/settings/organization-plans.component.html +++ b/apps/web/src/app/settings/organization-plans.component.html @@ -24,68 +24,20 @@
    -

    {{ "generalInformation" | i18n }}

    -
    -
    - - -
    -
    - - -
    -
    - - - {{ "clientOwnerDesc" | i18n: "20" }} -
    -
    -
    -
    - - -
    -
    -
    - - -
    -
    -
    +

    {{ "chooseYourPlan" | i18n }}

    -
    +

    {{ "users" | i18n }}

    @@ -177,10 +129,8 @@ id="additionalSeats" class="form-control" type="number" - name="AdditionalSeats" - [(ngModel)]="additionalSeats" - min="1" - max="100000" + name="additionalSeats" + formControlName="additionalSeats" placeholder="{{ 'userSeatsDesc' | i18n }}" required /> @@ -196,10 +146,8 @@ id="additionalSeats" class="form-control" type="number" - name="AdditionalSeats" - [(ngModel)]="additionalSeats" - min="0" - max="100000" + name="additionalSeats" + formControlName="additionalSeats" placeholder="{{ 'userSeatsDesc' | i18n }}" /> {{ @@ -215,10 +163,8 @@ id="additionalStorage" class="form-control" type="number" - name="AdditionalStorageGb" - [(ngModel)]="additionalStorage" - min="0" - max="99" + name="additionalStorageGb" + formControlName="additionalStorage" step="1" placeholder="{{ 'additionalStorageGbDesc' | i18n }}" /> @@ -238,8 +184,8 @@ id="premiumAccess" class="form-check-input" type="checkbox" - name="PremiumAccessAddon" - [(ngModel)]="premiumAccessAddon" + name="premiumAccessAddon" + formControlName="premiumAccessAddon" />
    - + {{ + "submit" | i18n + }} diff --git a/apps/web/src/app/settings/organization-plans.component.ts b/apps/web/src/app/settings/organization-plans.component.ts index 65e39d9212b..25e35ade7e7 100644 --- a/apps/web/src/app/settings/organization-plans.component.ts +++ b/apps/web/src/app/settings/organization-plans.component.ts @@ -1,4 +1,5 @@ import { Component, EventEmitter, Input, OnInit, Output, ViewChild } from "@angular/core"; +import { FormBuilder, Validators } from "@angular/forms"; import { Router } from "@angular/router"; import { ApiService } from "@bitwarden/common/abstractions/api.service"; @@ -42,22 +43,29 @@ export class OrganizationPlansComponent implements OnInit { @Input() providerId: string; @Output() onSuccess = new EventEmitter(); @Output() onCanceled = new EventEmitter(); + @Output() onTrialBillingSuccess = new EventEmitter(); loading = true; selfHosted = false; - ownedBusiness = false; - premiumAccessAddon = false; - additionalStorage = 0; - additionalSeats = 0; - name: string; - billingEmail: string; - clientOwnerEmail: string; - businessName: string; productTypes = ProductType; formPromise: Promise; singleOrgPolicyBlock = false; + isInTrialFlow = false; discount = 0; + formGroup = this.formBuilder.group({ + name: [""], + billingEmail: ["", [Validators.email]], + businessOwned: [false], + premiumAccessAddon: [false], + additionalStorage: [0, [Validators.min(0), Validators.max(99)]], + additionalSeats: [0, [Validators.min(0), Validators.max(100000)]], + clientOwnerEmail: ["", [Validators.email]], + businessName: [""], + plan: [this.plan], + product: [this.product], + }); + plans: PlanResponse[]; constructor( @@ -70,7 +78,8 @@ export class OrganizationPlansComponent implements OnInit { private policyService: PolicyService, private organizationService: OrganizationService, private logService: LogService, - private messagingService: MessagingService + private messagingService: MessagingService, + private formBuilder: FormBuilder ) { this.selfHosted = platformUtilsService.isSelfHost(); } @@ -80,15 +89,25 @@ export class OrganizationPlansComponent implements OnInit { const plans = await this.apiService.getPlans(); this.plans = plans.data; if (this.product === ProductType.Enterprise || this.product === ProductType.Teams) { - this.ownedBusiness = true; + this.formGroup.controls.businessOwned.setValue(true); } } if (this.providerId) { - this.ownedBusiness = true; + this.formGroup.controls.businessOwned.setValue(true); this.changedOwnedBusiness(); } + if (!this.createOrganization || this.acceptingSponsorship) { + this.formGroup.controls.product.setValue(ProductType.Families); + this.changedProduct(); + } + + if (this.createOrganization) { + this.formGroup.controls.name.addValidators(Validators.required); + this.formGroup.controls.billingEmail.addValidators(Validators.required); + } + this.loading = false; } @@ -97,7 +116,7 @@ export class OrganizationPlansComponent implements OnInit { } get selectedPlan() { - return this.plans.find((plan) => plan.type === this.plan); + return this.plans.find((plan) => plan.type === this.formGroup.controls.plan.value); } get selectedPlanInterval() { @@ -107,7 +126,7 @@ export class OrganizationPlansComponent implements OnInit { get selectableProducts() { let validPlans = this.plans.filter((plan) => plan.type !== PlanType.Custom); - if (this.ownedBusiness) { + if (this.formGroup.controls.businessOwned.value) { validPlans = validPlans.filter((plan) => plan.canBeUsedByBusiness); } @@ -132,8 +151,9 @@ export class OrganizationPlansComponent implements OnInit { } get selectablePlans() { - return this.plans.filter( - (plan) => !plan.legacyYear && !plan.disabled && plan.product === this.product + return this.plans?.filter( + (plan) => + !plan.legacyYear && !plan.disabled && plan.product === this.formGroup.controls.product.value ); } @@ -156,7 +176,10 @@ export class OrganizationPlansComponent implements OnInit { return 0; } - return plan.additionalStoragePricePerGb * Math.abs(this.additionalStorage || 0); + return ( + plan.additionalStoragePricePerGb * + Math.abs(this.formGroup.controls.additionalStorage.value || 0) + ); } seatTotal(plan: PlanResponse): number { @@ -164,18 +187,27 @@ export class OrganizationPlansComponent implements OnInit { return 0; } - return plan.seatPrice * Math.abs(this.additionalSeats || 0); + return plan.seatPrice * Math.abs(this.formGroup.controls.additionalSeats.value || 0); } get subtotal() { let subTotal = this.selectedPlan.basePrice; - if (this.selectedPlan.hasAdditionalSeatsOption && this.additionalSeats) { + if ( + this.selectedPlan.hasAdditionalSeatsOption && + this.formGroup.controls.additionalSeats.value + ) { subTotal += this.seatTotal(this.selectedPlan); } - if (this.selectedPlan.hasAdditionalStorageOption && this.additionalStorage) { + if ( + this.selectedPlan.hasAdditionalStorageOption && + this.formGroup.controls.additionalStorage.value + ) { subTotal += this.additionalStorageTotal(this.selectedPlan); } - if (this.selectedPlan.hasPremiumAccessOption && this.premiumAccessAddon) { + if ( + this.selectedPlan.hasPremiumAccessOption && + this.formGroup.controls.premiumAccessAddon.value + ) { subTotal += this.selectedPlan.premiumAccessOptionPrice; } return subTotal - this.discount; @@ -206,30 +238,31 @@ export class OrganizationPlansComponent implements OnInit { } changedProduct() { - this.plan = this.selectablePlans[0].type; + this.formGroup.controls.plan.setValue(this.selectablePlans[0].type); if (!this.selectedPlan.hasPremiumAccessOption) { - this.premiumAccessAddon = false; + this.formGroup.controls.premiumAccessAddon.setValue(false); } if (!this.selectedPlan.hasAdditionalStorageOption) { - this.additionalStorage = 0; + this.formGroup.controls.additionalStorage.setValue(0); } if (!this.selectedPlan.hasAdditionalSeatsOption) { - this.additionalSeats = 0; + this.formGroup.controls.additionalSeats.setValue(0); } else if ( - !this.additionalSeats && + !this.formGroup.controls.additionalSeats.value && !this.selectedPlan.baseSeats && this.selectedPlan.hasAdditionalSeatsOption ) { - this.additionalSeats = 1; + this.formGroup.controls.additionalSeats.setValue(1); } } changedOwnedBusiness() { - if (!this.ownedBusiness || this.selectedPlan.canBeUsedByBusiness) { + if (!this.formGroup.controls.businessOwned.value || this.selectedPlan.canBeUsedByBusiness) { return; } - this.product = ProductType.Teams; - this.plan = PlanType.TeamsAnnually; + this.formGroup.controls.product.setValue(ProductType.Teams); + this.formGroup.controls.plan.setValue(PlanType.TeamsAnnually); + this.changedProduct(); } changedCountry() { @@ -290,10 +323,18 @@ export class OrganizationPlansComponent implements OnInit { await this.apiService.refreshIdentityToken(); await this.syncService.fullSync(true); - if (!this.acceptingSponsorship) { + + if (!this.acceptingSponsorship && !this.isInTrialFlow) { this.router.navigate(["/organizations/" + orgId]); } + if (this.isInTrialFlow) { + this.onTrialBillingSuccess.emit({ + orgId: orgId, + subLabelText: this.billingSubLabelText(), + }); + } + return orgId; }; @@ -312,11 +353,13 @@ export class OrganizationPlansComponent implements OnInit { private async updateOrganization(orgId: string) { const request = new OrganizationUpgradeRequest(); - request.businessName = this.ownedBusiness ? this.businessName : null; - request.additionalSeats = this.additionalSeats; - request.additionalStorageGb = this.additionalStorage; + request.businessName = this.formGroup.controls.businessOwned.value + ? this.formGroup.controls.businessName.value + : null; + request.additionalSeats = this.formGroup.controls.additionalSeats.value; + request.additionalStorageGb = this.formGroup.controls.additionalStorage.value; request.premiumAccessAddon = - this.selectedPlan.hasPremiumAccessOption && this.premiumAccessAddon; + this.selectedPlan.hasPremiumAccessOption && this.formGroup.controls.premiumAccessAddon.value; request.planType = this.selectedPlan.type; request.billingAddressCountry = this.taxComponent.taxInfo.country; request.billingAddressPostalCode = this.taxComponent.taxInfo.postalCode; @@ -345,8 +388,8 @@ export class OrganizationPlansComponent implements OnInit { const request = new OrganizationCreateRequest(); request.key = key; request.collectionName = collectionCt; - request.name = this.name; - request.billingEmail = this.billingEmail; + request.name = this.formGroup.controls.name.value; + request.billingEmail = this.formGroup.controls.billingEmail.value; request.keys = new OrganizationKeysRequest(orgKeys[0], orgKeys[1].encryptedString); if (this.selectedPlan.type === PlanType.Free) { @@ -356,11 +399,14 @@ export class OrganizationPlansComponent implements OnInit { request.paymentToken = tokenResult[0]; request.paymentMethodType = tokenResult[1]; - request.businessName = this.ownedBusiness ? this.businessName : null; - request.additionalSeats = this.additionalSeats; - request.additionalStorageGb = this.additionalStorage; + request.businessName = this.formGroup.controls.businessOwned.value + ? this.formGroup.controls.businessName.value + : null; + request.additionalSeats = this.formGroup.controls.additionalSeats.value; + request.additionalStorageGb = this.formGroup.controls.additionalStorage.value; request.premiumAccessAddon = - this.selectedPlan.hasPremiumAccessOption && this.premiumAccessAddon; + this.selectedPlan.hasPremiumAccessOption && + this.formGroup.controls.premiumAccessAddon.value; request.planType = this.selectedPlan.type; request.billingAddressPostalCode = this.taxComponent.taxInfo.postalCode; request.billingAddressCountry = this.taxComponent.taxInfo.country; @@ -374,7 +420,10 @@ export class OrganizationPlansComponent implements OnInit { } if (this.providerId) { - const providerRequest = new ProviderOrganizationCreateRequest(this.clientOwnerEmail, request); + const providerRequest = new ProviderOrganizationCreateRequest( + this.formGroup.controls.clientOwnerEmail.value, + request + ); const providerKey = await this.cryptoService.getProviderKey(this.providerId); providerRequest.organizationCreateRequest.key = ( await this.cryptoService.encrypt(orgKey.key, providerKey) @@ -409,4 +458,18 @@ export class OrganizationPlansComponent implements OnInit { return orgId; } + + private billingSubLabelText(): string { + const selectedPlan = this.selectedPlan; + const price = selectedPlan.basePrice === 0 ? selectedPlan.seatPrice : selectedPlan.basePrice; + let text = ""; + + if (selectedPlan.isAnnual) { + text += `${this.i18nService.t("annual")} ($${price}/${this.i18nService.t("yr")})`; + } else { + text += `${this.i18nService.t("monthly")} ($${price}/${this.i18nService.t("monthAbbr")})`; + } + + return text; + } } diff --git a/apps/web/src/app/settings/payment.component.html b/apps/web/src/app/settings/payment.component.html index 66135e0b9af..56813414069 100644 --- a/apps/web/src/app/settings/payment.component.html +++ b/apps/web/src/app/settings/payment.component.html @@ -58,11 +58,11 @@
    -
    +
    -
    +
    Visa, MasterCard, Discover, AmEx, JCB, Diners Club, UnionPay
    -
    +
    diff --git a/apps/web/src/app/settings/payment.component.ts b/apps/web/src/app/settings/payment.component.ts index 479671e5613..6a95a790102 100644 --- a/apps/web/src/app/settings/payment.component.ts +++ b/apps/web/src/app/settings/payment.component.ts @@ -25,6 +25,7 @@ export class PaymentComponent implements OnInit, OnDestroy { @Input() hideBank = false; @Input() hidePaypal = false; @Input() hideCredit = false; + @Input() trialFlow = false; private destroy$: Subject = new Subject(); diff --git a/apps/web/src/app/settings/profile.component.html b/apps/web/src/app/settings/profile.component.html index bdc6932ee4f..c7184985df3 100644 --- a/apps/web/src/app/settings/profile.component.html +++ b/apps/web/src/app/settings/profile.component.html @@ -30,16 +30,6 @@ readonly />
    -
    - - -
    diff --git a/apps/web/src/app/settings/profile.component.ts b/apps/web/src/app/settings/profile.component.ts index f93cc340ad6..fc7a56632ea 100644 --- a/apps/web/src/app/settings/profile.component.ts +++ b/apps/web/src/app/settings/profile.component.ts @@ -18,7 +18,6 @@ export class ProfileComponent implements OnInit { loading = true; profile: ProfileResponse; fingerprint: string; - hidePasswordHint = false; formPromise: Promise; @@ -41,7 +40,6 @@ export class ProfileComponent implements OnInit { if (fingerprint != null) { this.fingerprint = fingerprint.join("-"); } - this.hidePasswordHint = await this.keyConnectorService.getUsesKeyConnector(); } async submit() { diff --git a/apps/web/src/app/settings/sponsoring-org-row.component.ts b/apps/web/src/app/settings/sponsoring-org-row.component.ts index 4dabff04b60..db898e5cbac 100644 --- a/apps/web/src/app/settings/sponsoring-org-row.component.ts +++ b/apps/web/src/app/settings/sponsoring-org-row.component.ts @@ -1,5 +1,6 @@ import { formatDate } from "@angular/common"; import { Component, EventEmitter, Input, Output, OnInit } from "@angular/core"; +import { firstValueFrom } from "rxjs"; import { ApiService } from "@bitwarden/common/abstractions/api.service"; import { I18nService } from "@bitwarden/common/abstractions/i18n.service"; @@ -23,6 +24,8 @@ export class SponsoringOrgRowComponent implements OnInit { revokeSponsorshipPromise: Promise; resendEmailPromise: Promise; + private locale = ""; + constructor( private apiService: ApiService, private i18nService: I18nService, @@ -30,7 +33,9 @@ export class SponsoringOrgRowComponent implements OnInit { private platformUtilsService: PlatformUtilsService ) {} - ngOnInit(): void { + async ngOnInit() { + this.locale = await firstValueFrom(this.i18nService.locale$); + this.setStatus( this.isSelfHosted, this.sponsoringOrg.familySponsorshipToDelete, @@ -98,7 +103,7 @@ export class SponsoringOrgRowComponent implements OnInit { // They want to delete but there is a valid until date which means there is an active sponsorship this.statusMessage = this.i18nService.t( "revokeWhenExpired", - formatDate(validUntil, "MM/dd/yyyy", this.i18nService.locale) + formatDate(validUntil, "MM/dd/yyyy", this.locale) ); this.statusClass = "text-danger"; } else if (toDelete) { diff --git a/apps/web/src/app/settings/tax-info.component.html b/apps/web/src/app/settings/tax-info.component.html index ea21a461542..4083b7373da 100644 --- a/apps/web/src/app/settings/tax-info.component.html +++ b/apps/web/src/app/settings/tax-info.component.html @@ -1,5 +1,5 @@
    -
    +
    - +
    @@ -194,7 +194,9 @@
    diff --git a/apps/web/src/app/vault/bulk-move.component.ts b/apps/web/src/app/vault/bulk-move.component.ts index 3dd906e5834..29e017b9356 100644 --- a/apps/web/src/app/vault/bulk-move.component.ts +++ b/apps/web/src/app/vault/bulk-move.component.ts @@ -1,7 +1,8 @@ import { Component, EventEmitter, Input, OnInit, Output } from "@angular/core"; +import { firstValueFrom, Observable } from "rxjs"; import { CipherService } from "@bitwarden/common/abstractions/cipher.service"; -import { FolderService } from "@bitwarden/common/abstractions/folder.service"; +import { FolderService } from "@bitwarden/common/abstractions/folder/folder.service.abstraction"; import { I18nService } from "@bitwarden/common/abstractions/i18n.service"; import { PlatformUtilsService } from "@bitwarden/common/abstractions/platformUtils.service"; import { FolderView } from "@bitwarden/common/models/view/folderView"; @@ -15,7 +16,7 @@ export class BulkMoveComponent implements OnInit { @Output() onMoved = new EventEmitter(); folderId: string = null; - folders: FolderView[] = []; + folders$: Observable; formPromise: Promise; constructor( @@ -26,8 +27,8 @@ export class BulkMoveComponent implements OnInit { ) {} async ngOnInit() { - this.folders = await this.folderService.getAllDecrypted(); - this.folderId = this.folders[0].id; + this.folders$ = this.folderService.folderViews$; + this.folderId = (await firstValueFrom(this.folders$))[0].id; } async submit() { diff --git a/apps/web/src/app/vault/folder-add-edit.component.ts b/apps/web/src/app/vault/folder-add-edit.component.ts index 9c7369ac876..a014389577d 100644 --- a/apps/web/src/app/vault/folder-add-edit.component.ts +++ b/apps/web/src/app/vault/folder-add-edit.component.ts @@ -1,7 +1,8 @@ import { Component } from "@angular/core"; import { FolderAddEditComponent as BaseFolderAddEditComponent } from "@bitwarden/angular/components/folder-add-edit.component"; -import { FolderService } from "@bitwarden/common/abstractions/folder.service"; +import { FolderApiServiceAbstraction } from "@bitwarden/common/abstractions/folder/folder-api.service.abstraction"; +import { FolderService } from "@bitwarden/common/abstractions/folder/folder.service.abstraction"; import { I18nService } from "@bitwarden/common/abstractions/i18n.service"; import { LogService } from "@bitwarden/common/abstractions/log.service"; import { PlatformUtilsService } from "@bitwarden/common/abstractions/platformUtils.service"; @@ -13,10 +14,11 @@ import { PlatformUtilsService } from "@bitwarden/common/abstractions/platformUti export class FolderAddEditComponent extends BaseFolderAddEditComponent { constructor( folderService: FolderService, + folderApiService: FolderApiServiceAbstraction, i18nService: I18nService, platformUtilsService: PlatformUtilsService, logService: LogService ) { - super(folderService, i18nService, platformUtilsService, logService); + super(folderService, folderApiService, i18nService, platformUtilsService, logService); } } diff --git a/apps/web/src/locales/af/messages.json b/apps/web/src/locales/af/messages.json index 5374e8379fd..a7629438e96 100644 --- a/apps/web/src/locales/af/messages.json +++ b/apps/web/src/locales/af/messages.json @@ -572,6 +572,9 @@ "createAccount": { "message": "Skep rekening" }, + "startTrial": { + "message": "Start Trial" + }, "logIn": { "message": "Teken aan" }, @@ -593,6 +596,9 @@ "masterPassDesc": { "message": "Die hoofwagwoord is die wagwoord wat u gaan gebruik vir toegang tot u kluis. Dit is baie belangrik dat u u hoofwagwoord onthou. Daar is geen manier om dit terug te kry ingeval u dit vergeet het nie." }, + "masterPassImportant": { + "message": "Master passwords cannot be recovered if you forget it!" + }, "masterPassHintDesc": { "message": "’n Hoofwagwoordwenk kan u help om u wagwoord te onthou, sou u dit vergeet." }, @@ -623,11 +629,14 @@ "invalidEmail": { "message": "Ongeldige e-posadres." }, - "masterPassRequired": { - "message": "Hoofwagwoord word benodig." + "masterPasswordRequired": { + "message": "Master password is required." }, - "masterPassLength": { - "message": "Hoofwagwoord moet ten minste 8 karakters lank wees." + "confirmMasterPasswordRequired": { + "message": "Master password retype is required." + }, + "masterPasswordMinLength": { + "message": "Master password must be at least 8 characters long." }, "masterPassDoesntMatch": { "message": "Hoofwagwoordbevestiging stem nie ooreen nie." @@ -3159,8 +3168,8 @@ "acceptPolicies": { "message": "Deur hierdie kassie af te merk stem u in tot die volgende:" }, - "acceptPoliciesError": { - "message": "Gebruiksvoorwaardes en privaatheidsbeleid is nie erken nie." + "acceptPoliciesRequired": { + "message": "Terms of Service and Privacy Policy have not been acknowledged." }, "termsOfService": { "message": "Gebruiksvoorwaardes" @@ -3209,6 +3218,9 @@ "organizationIsDisabled": { "message": "Organisasie is gedeaktiveer." }, + "disabledOrganizationFilterError": { + "message": "Items in disabled Organizations cannot be accessed. Contact your Organization owner for assistance." + }, "licenseIsExpired": { "message": "Lisensie het verstryk." }, @@ -3333,14 +3345,20 @@ "clone": { "message": "Kloon" }, + "masterPassPolicyTitle": { + "message": "Master password requirements" + }, "masterPassPolicyDesc": { "message": "Stel minimum vereistes vir hoofwagwoordsterkte." }, + "twoStepLoginPolicyTitle": { + "message": "Require two-step login" + }, "twoStepLoginPolicyDesc": { "message": "Vereis tweestapaantekening op gebruikers se persoonlike rekeninge." }, "twoStepLoginPolicyWarning": { - "message": "Organization members who are not Owners or Administrators and do not have two-step login enabled for their personal account will be removed from the organization and will receive an email notifying them about the change." + "message": "Organization members who are not Owners or Administrators and do not have two-step login turned on for their account will be removed from the organization and will receive an email notifying them about the change." }, "twoStepLoginPolicyUserWarning": { "message": "You are a member of an organization that requires two-step login to be enabled on your user account. If you disable all two-step login providers you will be automatically removed from these organizations." @@ -3567,7 +3585,7 @@ "message": "Enkele organisasie" }, "singleOrgDesc": { - "message": "Restrict users from being able to join any other organizations." + "message": "Restrict members from joining other organizations." }, "singleOrgBlockCreateMessage": { "message": "U huidige organisasie het ’n beleid wat u nie toelaat om deel te neem aan meer as een organisasie nie. Kontak u organisasie se beheerders of teken aan met’n ander Bitwarden-rekening." @@ -3579,13 +3597,13 @@ "message": "Enkelaantekenwaarmerking" }, "requireSsoPolicyDesc": { - "message": "Require users to log in with the Enterprise Single Sign-On method." + "message": "Require members to log in with the Enterprise Single Sign-On method." }, "prerequisite": { "message": "Voorvereiste" }, "requireSsoPolicyReq": { - "message": "The Single Organization enterprise policy must be enabled before activating this policy." + "message": "The Single Organization enterprise policy must be turned on before activating this policy." }, "requireSsoPolicyReqError": { "message": "Single Organization policy not enabled." @@ -3883,7 +3901,7 @@ "message": "Persoonlike eienaarskap" }, "personalOwnershipPolicyDesc": { - "message": "Require users to save vault items to an organization by removing the personal ownership option." + "message": "Require members to save items to an organization by removing the individual vault option." }, "personalOwnershipExemption": { "message": "Organisasie-eienaars en -administrateurs is vrygestel van die afdwing van hierdie beleid." @@ -3895,7 +3913,7 @@ "message": "Deaktiveer Send" }, "disableSendPolicyDesc": { - "message": "Do not allow users to create or edit a Bitwarden Send. Deleting an existing Send is still allowed.", + "message": "Do not allow members to create or edit sends.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "disableSendExemption": { @@ -3921,7 +3939,7 @@ "message": "Organization users that can manage the organization's policies are exempt from this policy's enforcement." }, "disableHideEmail": { - "message": "Do not allow users to hide their email address from recipients when creating or editing a Send.", + "message": "Always show member’s email address with recipients when creating or editing a send.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendOptionsPolicyInEffect": { @@ -4099,7 +4117,7 @@ } }, "viewSendHiddenEmailWarning": { - "message": "The Bitwarden user who created this Send has chosen to hide their email address. You should ensure you trust the source of this link before using or downloading its content.", + "message": "Die Bitwarden-gebruiker wat hierdie Send geskep het, het gekies om hul e-posadres te verberg. U moet verseker dat u die bron van hierdie skakel vertrou voordat u die inhoud gebruik of aflaai.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "expirationDateIsInvalid": { @@ -4220,7 +4238,7 @@ "message": "Bestuur wagwoordherstel" }, "resetPasswordPolicyDescription": { - "message": "Allow administrators in the organization to reset organization users' master password." + "message": "Allow admins to reset master passwords for members." }, "resetPasswordPolicyWarning": { "message": "Gebruikers in die organisasie sal self moet inskryf of moet outomaties ingeskryf word voor beheerders hul hoofwagwoord sal kan terugstel." @@ -4467,7 +4485,7 @@ "message": "Kluis-uittel" }, "maximumVaultTimeoutDesc": { - "message": "Configure a maximum vault timeout for all users." + "message": "Set a maximum vault timeout for members." }, "maximumVaultTimeoutLabel": { "message": "Maximum Vault Timeout" @@ -4507,10 +4525,10 @@ "message": "Vault Timeout is not within allowed range." }, "disablePersonalVaultExport": { - "message": "Disable Personal Vault Export" + "message": "Deaktiveer uitstuur van persoonlike kluis" }, "disablePersonalVaultExportDesc": { - "message": "Prohibits users from exporting their private vault data." + "message": "Verbied gebruikers om hul privaatkluisdata uit te stuur." }, "vaultExportDisabled": { "message": "Kluisuitstuur gedeaktiveer" @@ -4802,15 +4820,15 @@ }, "ssoPolicyHelpStart": { "message": "Aktiveer die", - "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Enable the SSO Authentication policy to require all members to log in with SSO.'" + "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Use the require single-sign-on authentication policy to require all members to log in with SSO.'" }, "ssoPolicyHelpLink": { "message": "SSO-waarmerkbeleid", - "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Enable the SSO Authentication policy to require all members to log in with SSO.'" + "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Use the require single-sign-on authentication policy to require all members to log in with SSO.'" }, "ssoPolicyHelpEnd": { "message": "om aantekening met SSO vir alle lede te verplig.", - "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Enable the SSO Authentication policy to require all members to log in with SSO.'" + "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Use the require single-sign-on authentication policy to require all members to log in with SSO.'" }, "ssoPolicyHelpKeyConnector": { "message": "SSO-waarmerking en Enkelorganisasiebeleide word vereis om Key Connector-dekripsie op te stel." @@ -5165,5 +5183,35 @@ "example": "My Email" } } + }, + "inputRequired": { + "message": "Input is required." + }, + "inputEmail": { + "message": "Input is not an email-address." + }, + "inputMinLength": { + "message": "Input must be at least $COUNT$ characters long.", + "placeholders": { + "count": { + "content": "$1", + "example": "8" + } + } + }, + "fieldsNeedAttention": { + "message": "$COUNT$ veld(e) hierbo benodig u aandag.", + "placeholders": { + "count": { + "content": "$1", + "example": "4" + } + } + }, + "turnOn": { + "message": "Turn on" + }, + "on": { + "message": "On" } } diff --git a/apps/web/src/locales/ar/messages.json b/apps/web/src/locales/ar/messages.json index 99729692b31..92ef4a008ba 100644 --- a/apps/web/src/locales/ar/messages.json +++ b/apps/web/src/locales/ar/messages.json @@ -572,6 +572,9 @@ "createAccount": { "message": "إنشاء حساب" }, + "startTrial": { + "message": "Start Trial" + }, "logIn": { "message": "تسجيل الدخول" }, @@ -593,6 +596,9 @@ "masterPassDesc": { "message": "The master password is the password you use to access your vault. It is very important that you do not forget your master password. There is no way to recover the password in the event that you forget it." }, + "masterPassImportant": { + "message": "Master passwords cannot be recovered if you forget it!" + }, "masterPassHintDesc": { "message": "يمكن أن يساعدك تلميح كلمة المرور الرئيسية في تذكر كلمة المرور الخاصة بك في حال نسيتها." }, @@ -623,11 +629,14 @@ "invalidEmail": { "message": "عنوان البريد الإلكتروني غير صالح." }, - "masterPassRequired": { - "message": "كلمة المرور الرئيسية مطلوبة." + "masterPasswordRequired": { + "message": "Master password is required." }, - "masterPassLength": { - "message": "يجب أن يكون طول كلمة المرور الرئيسية 8 أحرف على الأقل." + "confirmMasterPasswordRequired": { + "message": "Master password retype is required." + }, + "masterPasswordMinLength": { + "message": "Master password must be at least 8 characters long." }, "masterPassDoesntMatch": { "message": "لا يتطابق تأكيد كلمة المرور مع كلمة المرور." @@ -1067,7 +1076,7 @@ "message": "حذف الحساب" }, "deleteAccountDesc": { - "message": "Proceed below to delete your account and all associated data." + "message": "Proceed below to delete your account and all vault data." }, "deleteAccountWarning": { "message": "Deleting your account is permanent. It cannot be undone." @@ -1076,7 +1085,7 @@ "message": "Account Deleted" }, "accountDeletedDesc": { - "message": "Your account has been closed and all associated data has been deleted." + "message": "Your Bitwarden account and vault data were permanently deleted." }, "myAccount": { "message": "حسابي" @@ -1214,7 +1223,7 @@ "message": "Domains updated" }, "twoStepLogin": { - "message": "Two-step Login" + "message": "Two-step login" }, "twoStepLoginDesc": { "message": "Secure your account by requiring an additional step when logging in." @@ -3159,7 +3168,7 @@ "acceptPolicies": { "message": "By checking this box you agree to the following:" }, - "acceptPoliciesError": { + "acceptPoliciesRequired": { "message": "Terms of Service and Privacy Policy have not been acknowledged." }, "termsOfService": { @@ -3209,6 +3218,9 @@ "organizationIsDisabled": { "message": "Organization is disabled." }, + "disabledOrganizationFilterError": { + "message": "Items in disabled Organizations cannot be accessed. Contact your Organization owner for assistance." + }, "licenseIsExpired": { "message": "License is expired." }, @@ -3333,20 +3345,26 @@ "clone": { "message": "استنساخ" }, + "masterPassPolicyTitle": { + "message": "Master password requirements" + }, "masterPassPolicyDesc": { - "message": "Set minimum requirements for master password strength." + "message": "Set requirements for master password strength." + }, + "twoStepLoginPolicyTitle": { + "message": "Require two-step login" }, "twoStepLoginPolicyDesc": { - "message": "Require users to set up two-step login on their personal accounts." + "message": "Require members to set up two-step login." }, "twoStepLoginPolicyWarning": { - "message": "Organization members who are not Owners or Administrators and do not have two-step login enabled for their personal account will be removed from the organization and will receive an email notifying them about the change." + "message": "Organization members who are not Owners or Administrators and do not have two-step login turned on for their account will be removed from the organization and will receive an email notifying them about the change." }, "twoStepLoginPolicyUserWarning": { "message": "You are a member of an organization that requires two-step login to be enabled on your user account. If you disable all two-step login providers you will be automatically removed from these organizations." }, "passwordGeneratorPolicyDesc": { - "message": "Set minimum requirements for password generator configuration." + "message": "Set requirements for password generator." }, "passwordGeneratorPolicyInEffect": { "message": "One or more organization policies are affecting your generator settings." @@ -3564,10 +3582,10 @@ "message": "Link SSO" }, "singleOrg": { - "message": "Single Organization" + "message": "Single organization" }, "singleOrgDesc": { - "message": "Restrict users from being able to join any other organizations." + "message": "Restrict members from joining other organizations." }, "singleOrgBlockCreateMessage": { "message": "Your current organization has a policy that does not allow you to join more than one organization. Please contact your organization admins or sign up from a different Bitwarden account." @@ -3576,16 +3594,16 @@ "message": "Organization members who are not Owners or Administrators and are already a member of another organization will be removed from your organization." }, "requireSso": { - "message": "Single Sign-On Authentication" + "message": "Require single sign-on authentication" }, "requireSsoPolicyDesc": { - "message": "Require users to log in with the Enterprise Single Sign-On method." + "message": "Require members to log in with the Enterprise Single Sign-On method." }, "prerequisite": { "message": "Prerequisite" }, "requireSsoPolicyReq": { - "message": "The Single Organization enterprise policy must be enabled before activating this policy." + "message": "The Single Organization enterprise policy must be turned on before activating this policy." }, "requireSsoPolicyReqError": { "message": "Single Organization policy not enabled." @@ -3880,10 +3898,10 @@ } }, "personalOwnership": { - "message": "Personal Ownership" + "message": "Remove individual vault" }, "personalOwnershipPolicyDesc": { - "message": "Require users to save vault items to an organization by removing the personal ownership option." + "message": "Require members to save items to an organization by removing the individual vault option." }, "personalOwnershipExemption": { "message": "Organization Owners and Administrators are exempt from this policy's enforcement." @@ -3892,10 +3910,10 @@ "message": "Due to an enterprise policy, you are restricted from saving items to your personal vault. Change the Ownership option to an organization and choose from available Collections." }, "disableSend": { - "message": "Disable Send" + "message": "Remove Send" }, "disableSendPolicyDesc": { - "message": "Do not allow users to create or edit a Bitwarden Send. Deleting an existing Send is still allowed.", + "message": "Do not allow members to create or edit sends.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "disableSendExemption": { @@ -3910,7 +3928,7 @@ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendOptions": { - "message": "Send Options", + "message": "Send options", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendOptionsPolicyDesc": { @@ -3921,7 +3939,7 @@ "message": "Organization users that can manage the organization's policies are exempt from this policy's enforcement." }, "disableHideEmail": { - "message": "Do not allow users to hide their email address from recipients when creating or editing a Send.", + "message": "Always show member’s email address with recipients when creating or editing a send.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendOptionsPolicyInEffect": { @@ -4217,10 +4235,10 @@ "message": "Enrollment will allow organization administrators to change your master password" }, "resetPasswordPolicy": { - "message": "Master Password Reset" + "message": "Master password reset" }, "resetPasswordPolicyDescription": { - "message": "Allow administrators in the organization to reset organization users' master password." + "message": "Allow admins to reset master passwords for members." }, "resetPasswordPolicyWarning": { "message": "Users in the organization will need to self-enroll or be auto-enrolled before administrators can reset their master password." @@ -4464,10 +4482,10 @@ "message": "Your Master Password does not meet the policy requirements of this organization. In order to join the organization, you must update your Master Password now. Proceeding will log you out of your current session, requiring you to log back in. Active sessions on other devices may continue to remain active for up to one hour." }, "maximumVaultTimeout": { - "message": "Vault Timeout" + "message": "Vault timeout" }, "maximumVaultTimeoutDesc": { - "message": "Configure a maximum vault timeout for all users." + "message": "Set a maximum vault timeout for members." }, "maximumVaultTimeoutLabel": { "message": "Maximum Vault Timeout" @@ -4507,10 +4525,10 @@ "message": "Vault Timeout is not within allowed range." }, "disablePersonalVaultExport": { - "message": "Disable Personal Vault Export" + "message": "Remove individual vault export" }, "disablePersonalVaultExportDesc": { - "message": "Prohibits users from exporting their private vault data." + "message": "Do not allow members to export their individual vault data." }, "vaultExportDisabled": { "message": "Vault Export Disabled" @@ -4801,19 +4819,19 @@ "message": "Once set up, your configuration will be saved and members will be able to authenticate using their Identity Provider credentials." }, "ssoPolicyHelpStart": { - "message": "Enable the", - "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Enable the SSO Authentication policy to require all members to log in with SSO.'" + "message": "Use the", + "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Use the require single-sign-on authentication policy to require all members to log in with SSO.'" }, "ssoPolicyHelpLink": { - "message": "SSO Authentication policy", - "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Enable the SSO Authentication policy to require all members to log in with SSO.'" + "message": "require single-sign-on authentication policy", + "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Use the require single-sign-on authentication policy to require all members to log in with SSO.'" }, "ssoPolicyHelpEnd": { "message": "to require all members to log in with SSO.", - "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Enable the SSO Authentication policy to require all members to log in with SSO.'" + "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Use the require single-sign-on authentication policy to require all members to log in with SSO.'" }, "ssoPolicyHelpKeyConnector": { - "message": "SSO Authentication and Single Organization policies are required to set up Key Connector decryption." + "message": "The require SSO authentication and single organization policies are required to set up Key Connector decryption." }, "memberDecryptionOption": { "message": "Member Decryption Options" @@ -5165,5 +5183,35 @@ "example": "My Email" } } + }, + "inputRequired": { + "message": "Input is required." + }, + "inputEmail": { + "message": "Input is not an email-address." + }, + "inputMinLength": { + "message": "Input must be at least $COUNT$ characters long.", + "placeholders": { + "count": { + "content": "$1", + "example": "8" + } + } + }, + "fieldsNeedAttention": { + "message": "$COUNT$ field(s) above need your attention.", + "placeholders": { + "count": { + "content": "$1", + "example": "4" + } + } + }, + "turnOn": { + "message": "Turn on" + }, + "on": { + "message": "On" } } diff --git a/apps/web/src/locales/az/messages.json b/apps/web/src/locales/az/messages.json index 6aa270aee3e..08bfb479508 100644 --- a/apps/web/src/locales/az/messages.json +++ b/apps/web/src/locales/az/messages.json @@ -572,6 +572,9 @@ "createAccount": { "message": "Hesab yarat" }, + "startTrial": { + "message": "Sınağa Başla" + }, "logIn": { "message": "Giriş et" }, @@ -593,6 +596,9 @@ "masterPassDesc": { "message": "Ana parol, anbarınıza müraciət etmək üçün istifadə edəcəyiniz şifrədir. Ana parolu yadda saxlamaq çox vacibdir. Unutsanız, parolu bərpa etməyin heç bir yolu yoxdur." }, + "masterPassImportant": { + "message": "Unutsanız, Ana parollar bərpa edilə bilməz!" + }, "masterPassHintDesc": { "message": "Ana parol məsləhəti, unutduğunuz parolu xatırlamağınıza kömək edir." }, @@ -623,10 +629,13 @@ "invalidEmail": { "message": "Etibarsız e-poçt ünvanı." }, - "masterPassRequired": { + "masterPasswordRequired": { "message": "Ana parol lazımdır." }, - "masterPassLength": { + "confirmMasterPasswordRequired": { + "message": "Ana parolun yenidən yazılması lazımdır." + }, + "masterPasswordMinLength": { "message": "Ana parol ən azı 8 simvol uzunluğunda olmalıdır." }, "masterPassDoesntMatch": { @@ -3159,7 +3168,7 @@ "acceptPolicies": { "message": "Bu qutunu işarələyərək aşağıdakılarla razılaşırsınız:" }, - "acceptPoliciesError": { + "acceptPoliciesRequired": { "message": "Xidmət Şərtləri və Gizlilik Siyasəti qəbul edilməyib." }, "termsOfService": { @@ -3209,6 +3218,9 @@ "organizationIsDisabled": { "message": "Təşkilat sıradan çıxarıldı." }, + "disabledOrganizationFilterError": { + "message": "Sıradan çıxarılmış Təşkilatlardakı elementlərə müraciət edilə bilmir. Kömək üçün Təşkilatınızın sahibi ilə əlaqə saxlayın." + }, "licenseIsExpired": { "message": "Lisenziyanın vaxtı bitib." }, @@ -3333,9 +3345,15 @@ "clone": { "message": "Klonla" }, + "masterPassPolicyTitle": { + "message": "Ana parol tələbləri" + }, "masterPassPolicyDesc": { "message": "Ana parol gücü üçün minimum tələbləri tənzimlə." }, + "twoStepLoginPolicyTitle": { + "message": "İki mərhələli girişi tələb et" + }, "twoStepLoginPolicyDesc": { "message": "İstifadəçilərin fərdi hesablarında \"iki mərhələli giriş\"i istifadə etmələrini məcburi et." }, @@ -4802,15 +4820,15 @@ }, "ssoPolicyHelpStart": { "message": "Bütün üzvlərin SSO ilə", - "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Enable the SSO Authentication policy to require all members to log in with SSO.'" + "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Use the require single-sign-on authentication policy to require all members to log in with SSO.'" }, "ssoPolicyHelpLink": { "message": "giriş etməsini məcburi etmək üçün", - "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Enable the SSO Authentication policy to require all members to log in with SSO.'" + "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Use the require single-sign-on authentication policy to require all members to log in with SSO.'" }, "ssoPolicyHelpEnd": { "message": "SSO Siyasətini fəallaşdırın.", - "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Enable the SSO Authentication policy to require all members to log in with SSO.'" + "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Use the require single-sign-on authentication policy to require all members to log in with SSO.'" }, "ssoPolicyHelpKeyConnector": { "message": "Açar Bağlayıcı şifrə açmanı quraşdırmaq üçün SSO Kimlik Təsdiqləmə və Tək Təşkilat siyasətləri tələb olunur." @@ -5165,5 +5183,35 @@ "example": "My Email" } } + }, + "inputRequired": { + "message": "Giriş lazımdır." + }, + "inputEmail": { + "message": "Giriş, bir e-poçt ünvanı deyil." + }, + "inputMinLength": { + "message": "Giriş, ən azı $COUNT$ simvol uzunluğunda olmalıdır.", + "placeholders": { + "count": { + "content": "$1", + "example": "8" + } + } + }, + "fieldsNeedAttention": { + "message": "Yuxarıdakı $COUNT$ sahənin diqqətinizə ehtiyacı var.", + "placeholders": { + "count": { + "content": "$1", + "example": "4" + } + } + }, + "turnOn": { + "message": "İşə sal" + }, + "on": { + "message": "Açıqdır" } } diff --git a/apps/web/src/locales/be/messages.json b/apps/web/src/locales/be/messages.json index 6bc3430721a..7c2879183c5 100644 --- a/apps/web/src/locales/be/messages.json +++ b/apps/web/src/locales/be/messages.json @@ -572,6 +572,9 @@ "createAccount": { "message": "Стварыць уліковы запіс" }, + "startTrial": { + "message": "Start Trial" + }, "logIn": { "message": "Увайсці" }, @@ -593,6 +596,9 @@ "masterPassDesc": { "message": "Асноўны пароль — ключ да вашага бяспечнага сховішча. Ён вельмі важны, таму не забывайце яго. Аднавіць асноўны пароль немагчыма." }, + "masterPassImportant": { + "message": "Master passwords cannot be recovered if you forget it!" + }, "masterPassHintDesc": { "message": "Падказка да асноўнага пароля можа дапамагчы вам яго ўспомніць." }, @@ -623,11 +629,14 @@ "invalidEmail": { "message": "Памылковы адрас электроннай пошты." }, - "masterPassRequired": { - "message": "Патрабуецца асноўны пароль." + "masterPasswordRequired": { + "message": "Master password is required." }, - "masterPassLength": { - "message": "Асноўны пароль павінен быць даўжынёй не менш за 8 сімвалаў." + "confirmMasterPasswordRequired": { + "message": "Master password retype is required." + }, + "masterPasswordMinLength": { + "message": "Master password must be at least 8 characters long." }, "masterPassDoesntMatch": { "message": "Асноўныя паролі не супадаюць." @@ -1067,7 +1076,7 @@ "message": "Delete Account" }, "deleteAccountDesc": { - "message": "Proceed below to delete your account and all associated data." + "message": "Proceed below to delete your account and all vault data." }, "deleteAccountWarning": { "message": "Deleting your account is permanent. It cannot be undone." @@ -1076,7 +1085,7 @@ "message": "Уліковы запіс выдалены" }, "accountDeletedDesc": { - "message": "Your account has been closed and all associated data has been deleted." + "message": "Your Bitwarden account and vault data were permanently deleted." }, "myAccount": { "message": "Мой уліковы запіс" @@ -3159,7 +3168,7 @@ "acceptPolicies": { "message": "By checking this box you agree to the following:" }, - "acceptPoliciesError": { + "acceptPoliciesRequired": { "message": "Terms of Service and Privacy Policy have not been acknowledged." }, "termsOfService": { @@ -3209,6 +3218,9 @@ "organizationIsDisabled": { "message": "Organization is disabled." }, + "disabledOrganizationFilterError": { + "message": "Items in disabled Organizations cannot be accessed. Contact your Organization owner for assistance." + }, "licenseIsExpired": { "message": "License is expired." }, @@ -3333,20 +3345,26 @@ "clone": { "message": "Clone" }, + "masterPassPolicyTitle": { + "message": "Master password requirements" + }, "masterPassPolicyDesc": { "message": "Задайце мінімальныя патрабаванні да надзейнасці асноўнага пароля." }, + "twoStepLoginPolicyTitle": { + "message": "Require two-step login" + }, "twoStepLoginPolicyDesc": { - "message": "Require users to set up two-step login on their personal accounts." + "message": "Require members to set up two-step login." }, "twoStepLoginPolicyWarning": { - "message": "Organization members who are not Owners or Administrators and do not have two-step login enabled for their personal account will be removed from the organization and will receive an email notifying them about the change." + "message": "Organization members who are not Owners or Administrators and do not have two-step login turned on for their account will be removed from the organization and will receive an email notifying them about the change." }, "twoStepLoginPolicyUserWarning": { "message": "You are a member of an organization that requires two-step login to be enabled on your user account. If you disable all two-step login providers you will be automatically removed from these organizations." }, "passwordGeneratorPolicyDesc": { - "message": "Set minimum requirements for password generator configuration." + "message": "Set requirements for password generator." }, "passwordGeneratorPolicyInEffect": { "message": "One or more organization policies are affecting your generator settings." @@ -3564,10 +3582,10 @@ "message": "Link SSO" }, "singleOrg": { - "message": "Single Organization" + "message": "Single organization" }, "singleOrgDesc": { - "message": "Restrict users from being able to join any other organizations." + "message": "Restrict members from joining other organizations." }, "singleOrgBlockCreateMessage": { "message": "Your current organization has a policy that does not allow you to join more than one organization. Please contact your organization admins or sign up from a different Bitwarden account." @@ -3576,16 +3594,16 @@ "message": "Organization members who are not Owners or Administrators and are already a member of another organization will be removed from your organization." }, "requireSso": { - "message": "Single Sign-On Authentication" + "message": "Require single sign-on authentication" }, "requireSsoPolicyDesc": { - "message": "Require users to log in with the Enterprise Single Sign-On method." + "message": "Require members to log in with the Enterprise Single Sign-On method." }, "prerequisite": { "message": "Prerequisite" }, "requireSsoPolicyReq": { - "message": "The Single Organization enterprise policy must be enabled before activating this policy." + "message": "The Single Organization enterprise policy must be turned on before activating this policy." }, "requireSsoPolicyReqError": { "message": "Single Organization policy not enabled." @@ -3880,10 +3898,10 @@ } }, "personalOwnership": { - "message": "Personal Ownership" + "message": "Remove individual vault" }, "personalOwnershipPolicyDesc": { - "message": "Require users to save vault items to an organization by removing the personal ownership option." + "message": "Require members to save items to an organization by removing the individual vault option." }, "personalOwnershipExemption": { "message": "Organization Owners and Administrators are exempt from this policy's enforcement." @@ -3892,10 +3910,10 @@ "message": "Due to an enterprise policy, you are restricted from saving items to your personal vault. Change the Ownership option to an organization and choose from available Collections." }, "disableSend": { - "message": "Disable Send" + "message": "Remove Send" }, "disableSendPolicyDesc": { - "message": "Do not allow users to create or edit a Bitwarden Send. Deleting an existing Send is still allowed.", + "message": "Do not allow members to create or edit sends.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "disableSendExemption": { @@ -3910,7 +3928,7 @@ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendOptions": { - "message": "Send Options", + "message": "Send options", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendOptionsPolicyDesc": { @@ -3921,7 +3939,7 @@ "message": "Organization users that can manage the organization's policies are exempt from this policy's enforcement." }, "disableHideEmail": { - "message": "Do not allow users to hide their email address from recipients when creating or editing a Send.", + "message": "Always show member’s email address with recipients when creating or editing a send.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendOptionsPolicyInEffect": { @@ -4217,10 +4235,10 @@ "message": "Enrollment will allow organization administrators to change your master password" }, "resetPasswordPolicy": { - "message": "Master Password Reset" + "message": "Master password reset" }, "resetPasswordPolicyDescription": { - "message": "Allow administrators in the organization to reset organization users' master password." + "message": "Allow admins to reset master passwords for members." }, "resetPasswordPolicyWarning": { "message": "Users in the organization will need to self-enroll or be auto-enrolled before administrators can reset their master password." @@ -4464,10 +4482,10 @@ "message": "Your Master Password does not meet the policy requirements of this organization. In order to join the organization, you must update your Master Password now. Proceeding will log you out of your current session, requiring you to log back in. Active sessions on other devices may continue to remain active for up to one hour." }, "maximumVaultTimeout": { - "message": "Vault Timeout" + "message": "Vault timeout" }, "maximumVaultTimeoutDesc": { - "message": "Configure a maximum vault timeout for all users." + "message": "Set a maximum vault timeout for members." }, "maximumVaultTimeoutLabel": { "message": "Maximum Vault Timeout" @@ -4507,10 +4525,10 @@ "message": "Vault Timeout is not within allowed range." }, "disablePersonalVaultExport": { - "message": "Disable Personal Vault Export" + "message": "Remove individual vault export" }, "disablePersonalVaultExportDesc": { - "message": "Prohibits users from exporting their private vault data." + "message": "Do not allow members to export their individual vault data." }, "vaultExportDisabled": { "message": "Vault Export Disabled" @@ -4801,19 +4819,19 @@ "message": "Once set up, your configuration will be saved and members will be able to authenticate using their Identity Provider credentials." }, "ssoPolicyHelpStart": { - "message": "Enable the", - "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Enable the SSO Authentication policy to require all members to log in with SSO.'" + "message": "Use the", + "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Use the require single-sign-on authentication policy to require all members to log in with SSO.'" }, "ssoPolicyHelpLink": { - "message": "SSO Authentication policy", - "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Enable the SSO Authentication policy to require all members to log in with SSO.'" + "message": "require single-sign-on authentication policy", + "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Use the require single-sign-on authentication policy to require all members to log in with SSO.'" }, "ssoPolicyHelpEnd": { "message": "to require all members to log in with SSO.", - "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Enable the SSO Authentication policy to require all members to log in with SSO.'" + "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Use the require single-sign-on authentication policy to require all members to log in with SSO.'" }, "ssoPolicyHelpKeyConnector": { - "message": "SSO Authentication and Single Organization policies are required to set up Key Connector decryption." + "message": "The require SSO authentication and single organization policies are required to set up Key Connector decryption." }, "memberDecryptionOption": { "message": "Member Decryption Options" @@ -5165,5 +5183,35 @@ "example": "My Email" } } + }, + "inputRequired": { + "message": "Input is required." + }, + "inputEmail": { + "message": "Input is not an email-address." + }, + "inputMinLength": { + "message": "Input must be at least $COUNT$ characters long.", + "placeholders": { + "count": { + "content": "$1", + "example": "8" + } + } + }, + "fieldsNeedAttention": { + "message": "$COUNT$ field(s) above need your attention.", + "placeholders": { + "count": { + "content": "$1", + "example": "4" + } + } + }, + "turnOn": { + "message": "Turn on" + }, + "on": { + "message": "On" } } diff --git a/apps/web/src/locales/bg/messages.json b/apps/web/src/locales/bg/messages.json index 644b130b3a7..9ef93093091 100644 --- a/apps/web/src/locales/bg/messages.json +++ b/apps/web/src/locales/bg/messages.json @@ -572,6 +572,9 @@ "createAccount": { "message": "Създаване на абонамент" }, + "startTrial": { + "message": "Стартиране на пробния период" + }, "logIn": { "message": "Вписване" }, @@ -593,6 +596,9 @@ "masterPassDesc": { "message": "Главната парола се използва за достъп до трезора ви. Запомнете я добре, защото възстановяването ѝ е абсолютно невъзможно." }, + "masterPassImportant": { + "message": "Главната парола не може да бъде възстановена, ако я забравите!" + }, "masterPassHintDesc": { "message": "Ако сте забравили главната парола, то подсказването може да ви помогне да си я припомните." }, @@ -623,11 +629,14 @@ "invalidEmail": { "message": "Недействителна електронна поща." }, - "masterPassRequired": { + "masterPasswordRequired": { "message": "Главната парола е задължителна." }, - "masterPassLength": { - "message": "Главната парола трябва да съдържа поне 8 знака." + "confirmMasterPasswordRequired": { + "message": "Повторното въвеждане на главната парола е задължително." + }, + "masterPasswordMinLength": { + "message": "Главната парола трябва да е с дължина поне 8 знака." }, "masterPassDoesntMatch": { "message": "Главната парола и потвърждението ѝ не съвпадат." @@ -3159,7 +3168,7 @@ "acceptPolicies": { "message": "Чрез тази отметка вие се съгласявате със следните:" }, - "acceptPoliciesError": { + "acceptPoliciesRequired": { "message": "Условията за използване и политиката за поверителност не бяха приети." }, "termsOfService": { @@ -3209,6 +3218,9 @@ "organizationIsDisabled": { "message": "Организацията е изключена." }, + "disabledOrganizationFilterError": { + "message": "Items in disabled Organizations cannot be accessed. Contact your Organization owner for assistance." + }, "licenseIsExpired": { "message": "Изтекъл лиценз." }, @@ -3333,9 +3345,15 @@ "clone": { "message": "Дублиране" }, + "masterPassPolicyTitle": { + "message": "Master password requirements" + }, "masterPassPolicyDesc": { "message": "Задаване на минимална сила на главната парола." }, + "twoStepLoginPolicyTitle": { + "message": "Require two-step login" + }, "twoStepLoginPolicyDesc": { "message": "Изискване от потребителите да включат двустепенно удостоверяване за личните си абонаменти." }, @@ -4802,18 +4820,18 @@ }, "ssoPolicyHelpStart": { "message": "Включете", - "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Enable the SSO Authentication policy to require all members to log in with SSO.'" + "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Use the require single-sign-on authentication policy to require all members to log in with SSO.'" }, "ssoPolicyHelpLink": { "message": "еднократното удостоверяване", - "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Enable the SSO Authentication policy to require all members to log in with SSO.'" + "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Use the require single-sign-on authentication policy to require all members to log in with SSO.'" }, "ssoPolicyHelpEnd": { "message": "за да задължите всички членове да се вписват чрез еднократно удостоверяване.", - "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Enable the SSO Authentication policy to require all members to log in with SSO.'" + "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Use the require single-sign-on authentication policy to require all members to log in with SSO.'" }, "ssoPolicyHelpKeyConnector": { - "message": "SSO Authentication and Single Organization policies are required to set up Key Connector decryption." + "message": "The require SSO authentication and single organization policies are required to set up Key Connector decryption." }, "memberDecryptionOption": { "message": "Member Decryption Options" @@ -5165,5 +5183,35 @@ "example": "My Email" } } + }, + "inputRequired": { + "message": "Полето е задължтелно да бъде попълнено." + }, + "inputEmail": { + "message": "Въведеният в полето текст не е адрес на е-поща." + }, + "inputMinLength": { + "message": "Въведеният в полето текст трябва да бъде с дължина поне $COUNT$ знака.", + "placeholders": { + "count": { + "content": "$1", + "example": "8" + } + } + }, + "fieldsNeedAttention": { + "message": "$COUNT$ поле(та) по-горе се нуждае/ят от вниманието Ви.", + "placeholders": { + "count": { + "content": "$1", + "example": "4" + } + } + }, + "turnOn": { + "message": "Turn on" + }, + "on": { + "message": "On" } } diff --git a/apps/web/src/locales/bn/messages.json b/apps/web/src/locales/bn/messages.json index c22d41a07db..3938af21e32 100644 --- a/apps/web/src/locales/bn/messages.json +++ b/apps/web/src/locales/bn/messages.json @@ -572,6 +572,9 @@ "createAccount": { "message": "অ্যাকাউন্ট তৈরি" }, + "startTrial": { + "message": "Start Trial" + }, "logIn": { "message": "Log In" }, @@ -593,6 +596,9 @@ "masterPassDesc": { "message": "The master password is the password you use to access your vault. It is very important that you do not forget your master password. There is no way to recover the password in the event that you forget it." }, + "masterPassImportant": { + "message": "Master passwords cannot be recovered if you forget it!" + }, "masterPassHintDesc": { "message": "A master password hint can help you remember your password if you forget it." }, @@ -623,11 +629,14 @@ "invalidEmail": { "message": "অকার্যকর ইমেইল ঠিকানা।" }, - "masterPassRequired": { - "message": "মূল পাসওয়ার্ড প্রয়োজন।" + "masterPasswordRequired": { + "message": "Master password is required." }, - "masterPassLength": { - "message": "মূল পাসওয়ার্ড কমপক্ষে ৮ অক্ষর দীর্ঘ হওয়া উচিত।" + "confirmMasterPasswordRequired": { + "message": "Master password retype is required." + }, + "masterPasswordMinLength": { + "message": "Master password must be at least 8 characters long." }, "masterPassDoesntMatch": { "message": "মূল পাসওয়ার্ড নিশ্চিতকরণ মেলেনি।" @@ -1067,7 +1076,7 @@ "message": "Delete Account" }, "deleteAccountDesc": { - "message": "Proceed below to delete your account and all associated data." + "message": "Proceed below to delete your account and all vault data." }, "deleteAccountWarning": { "message": "Deleting your account is permanent. It cannot be undone." @@ -1076,7 +1085,7 @@ "message": "Account Deleted" }, "accountDeletedDesc": { - "message": "Your account has been closed and all associated data has been deleted." + "message": "Your Bitwarden account and vault data were permanently deleted." }, "myAccount": { "message": "My Account" @@ -3159,8 +3168,8 @@ "acceptPolicies": { "message": "এই বাক্সটি টিক করে আপনি নিম্নলিখিতগুলিতে সম্মত হন:" }, - "acceptPoliciesError": { - "message": "পরিষেবার শর্তাদি এবং গোপনীয়তা নীতি স্বীকার করা হয়নি।" + "acceptPoliciesRequired": { + "message": "Terms of Service and Privacy Policy have not been acknowledged." }, "termsOfService": { "message": "সেবা পাবার শর্ত" @@ -3209,6 +3218,9 @@ "organizationIsDisabled": { "message": "Organization is disabled." }, + "disabledOrganizationFilterError": { + "message": "Items in disabled Organizations cannot be accessed. Contact your Organization owner for assistance." + }, "licenseIsExpired": { "message": "License is expired." }, @@ -3333,14 +3345,20 @@ "clone": { "message": "Clone" }, + "masterPassPolicyTitle": { + "message": "Master password requirements" + }, "masterPassPolicyDesc": { - "message": "Set minimum requirements for master password strength." + "message": "Set requirements for master password strength." + }, + "twoStepLoginPolicyTitle": { + "message": "Require two-step login" }, "twoStepLoginPolicyDesc": { - "message": "Require users to set up two-step login on their personal accounts." + "message": "Require members to set up two-step login." }, "twoStepLoginPolicyWarning": { - "message": "Organization members who are not Owners or Administrators and do not have two-step login enabled for their personal account will be removed from the organization and will receive an email notifying them about the change." + "message": "Organization members who are not Owners or Administrators and do not have two-step login turned on for their account will be removed from the organization and will receive an email notifying them about the change." }, "twoStepLoginPolicyUserWarning": { "message": "You are a member of an organization that requires two-step login to be enabled on your user account. If you disable all two-step login providers you will be automatically removed from these organizations." @@ -3564,10 +3582,10 @@ "message": "Link SSO" }, "singleOrg": { - "message": "Single Organization" + "message": "Single organization" }, "singleOrgDesc": { - "message": "Restrict users from being able to join any other organizations." + "message": "Restrict members from joining other organizations." }, "singleOrgBlockCreateMessage": { "message": "Your current organization has a policy that does not allow you to join more than one organization. Please contact your organization admins or sign up from a different Bitwarden account." @@ -3576,16 +3594,16 @@ "message": "Organization members who are not Owners or Administrators and are already a member of another organization will be removed from your organization." }, "requireSso": { - "message": "Single Sign-On Authentication" + "message": "Require single sign-on authentication" }, "requireSsoPolicyDesc": { - "message": "Require users to log in with the Enterprise Single Sign-On method." + "message": "Require members to log in with the Enterprise Single Sign-On method." }, "prerequisite": { "message": "Prerequisite" }, "requireSsoPolicyReq": { - "message": "The Single Organization enterprise policy must be enabled before activating this policy." + "message": "The Single Organization enterprise policy must be turned on before activating this policy." }, "requireSsoPolicyReqError": { "message": "Single Organization policy not enabled." @@ -3880,10 +3898,10 @@ } }, "personalOwnership": { - "message": "Personal Ownership" + "message": "Remove individual vault" }, "personalOwnershipPolicyDesc": { - "message": "Require users to save vault items to an organization by removing the personal ownership option." + "message": "Require members to save items to an organization by removing the individual vault option." }, "personalOwnershipExemption": { "message": "Organization Owners and Administrators are exempt from this policy's enforcement." @@ -3892,10 +3910,10 @@ "message": "Due to an enterprise policy, you are restricted from saving items to your personal vault. Change the Ownership option to an organization and choose from available Collections." }, "disableSend": { - "message": "Disable Send" + "message": "Remove Send" }, "disableSendPolicyDesc": { - "message": "Do not allow users to create or edit a Bitwarden Send. Deleting an existing Send is still allowed.", + "message": "Do not allow members to create or edit sends.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "disableSendExemption": { @@ -3910,7 +3928,7 @@ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendOptions": { - "message": "Send Options", + "message": "Send options", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendOptionsPolicyDesc": { @@ -3921,7 +3939,7 @@ "message": "Organization users that can manage the organization's policies are exempt from this policy's enforcement." }, "disableHideEmail": { - "message": "Do not allow users to hide their email address from recipients when creating or editing a Send.", + "message": "Always show member’s email address with recipients when creating or editing a send.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendOptionsPolicyInEffect": { @@ -4217,10 +4235,10 @@ "message": "Enrollment will allow organization administrators to change your master password" }, "resetPasswordPolicy": { - "message": "Master Password Reset" + "message": "Master password reset" }, "resetPasswordPolicyDescription": { - "message": "Allow administrators in the organization to reset organization users' master password." + "message": "Allow admins to reset master passwords for members." }, "resetPasswordPolicyWarning": { "message": "Users in the organization will need to self-enroll or be auto-enrolled before administrators can reset their master password." @@ -4464,10 +4482,10 @@ "message": "Your Master Password does not meet the policy requirements of this organization. In order to join the organization, you must update your Master Password now. Proceeding will log you out of your current session, requiring you to log back in. Active sessions on other devices may continue to remain active for up to one hour." }, "maximumVaultTimeout": { - "message": "Vault Timeout" + "message": "Vault timeout" }, "maximumVaultTimeoutDesc": { - "message": "Configure a maximum vault timeout for all users." + "message": "Set a maximum vault timeout for members." }, "maximumVaultTimeoutLabel": { "message": "Maximum Vault Timeout" @@ -4507,10 +4525,10 @@ "message": "Vault Timeout is not within allowed range." }, "disablePersonalVaultExport": { - "message": "Disable Personal Vault Export" + "message": "Remove individual vault export" }, "disablePersonalVaultExportDesc": { - "message": "Prohibits users from exporting their private vault data." + "message": "Do not allow members to export their individual vault data." }, "vaultExportDisabled": { "message": "Vault Export Disabled" @@ -4801,19 +4819,19 @@ "message": "Once set up, your configuration will be saved and members will be able to authenticate using their Identity Provider credentials." }, "ssoPolicyHelpStart": { - "message": "Enable the", - "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Enable the SSO Authentication policy to require all members to log in with SSO.'" + "message": "Use the", + "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Use the require single-sign-on authentication policy to require all members to log in with SSO.'" }, "ssoPolicyHelpLink": { - "message": "SSO Authentication policy", - "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Enable the SSO Authentication policy to require all members to log in with SSO.'" + "message": "require single-sign-on authentication policy", + "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Use the require single-sign-on authentication policy to require all members to log in with SSO.'" }, "ssoPolicyHelpEnd": { "message": "to require all members to log in with SSO.", - "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Enable the SSO Authentication policy to require all members to log in with SSO.'" + "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Use the require single-sign-on authentication policy to require all members to log in with SSO.'" }, "ssoPolicyHelpKeyConnector": { - "message": "SSO Authentication and Single Organization policies are required to set up Key Connector decryption." + "message": "The require SSO authentication and single organization policies are required to set up Key Connector decryption." }, "memberDecryptionOption": { "message": "Member Decryption Options" @@ -5165,5 +5183,35 @@ "example": "My Email" } } + }, + "inputRequired": { + "message": "Input is required." + }, + "inputEmail": { + "message": "Input is not an email-address." + }, + "inputMinLength": { + "message": "Input must be at least $COUNT$ characters long.", + "placeholders": { + "count": { + "content": "$1", + "example": "8" + } + } + }, + "fieldsNeedAttention": { + "message": "$COUNT$ field(s) above need your attention.", + "placeholders": { + "count": { + "content": "$1", + "example": "4" + } + } + }, + "turnOn": { + "message": "Turn on" + }, + "on": { + "message": "On" } } diff --git a/apps/web/src/locales/bs/messages.json b/apps/web/src/locales/bs/messages.json index 464625d877e..d4fa64ea694 100644 --- a/apps/web/src/locales/bs/messages.json +++ b/apps/web/src/locales/bs/messages.json @@ -572,6 +572,9 @@ "createAccount": { "message": "Create Account" }, + "startTrial": { + "message": "Start Trial" + }, "logIn": { "message": "Log In" }, @@ -593,6 +596,9 @@ "masterPassDesc": { "message": "The master password is the password you use to access your vault. It is very important that you do not forget your master password. There is no way to recover the password in the event that you forget it." }, + "masterPassImportant": { + "message": "Master passwords cannot be recovered if you forget it!" + }, "masterPassHintDesc": { "message": "A master password hint can help you remember your password if you forget it." }, @@ -623,10 +629,13 @@ "invalidEmail": { "message": "Invalid email address." }, - "masterPassRequired": { + "masterPasswordRequired": { "message": "Master password is required." }, - "masterPassLength": { + "confirmMasterPasswordRequired": { + "message": "Master password retype is required." + }, + "masterPasswordMinLength": { "message": "Master password must be at least 8 characters long." }, "masterPassDoesntMatch": { @@ -882,7 +891,7 @@ "message": "Your vault data has been exported." }, "passwordGenerator": { - "message": "Password Generator" + "message": "Password generator" }, "minComplexityScore": { "message": "Minimum Complexity Score" @@ -1067,7 +1076,7 @@ "message": "Delete Account" }, "deleteAccountDesc": { - "message": "Proceed below to delete your account and all associated data." + "message": "Proceed below to delete your account and all vault data." }, "deleteAccountWarning": { "message": "Deleting your account is permanent. It cannot be undone." @@ -1076,7 +1085,7 @@ "message": "Account Deleted" }, "accountDeletedDesc": { - "message": "Your account has been closed and all associated data has been deleted." + "message": "Your Bitwarden account and vault data were permanently deleted." }, "myAccount": { "message": "My Account" @@ -1214,7 +1223,7 @@ "message": "Domains updated" }, "twoStepLogin": { - "message": "Two-step Login" + "message": "Two-step login" }, "twoStepLoginDesc": { "message": "Secure your account by requiring an additional step when logging in." @@ -3159,7 +3168,7 @@ "acceptPolicies": { "message": "By checking this box you agree to the following:" }, - "acceptPoliciesError": { + "acceptPoliciesRequired": { "message": "Terms of Service and Privacy Policy have not been acknowledged." }, "termsOfService": { @@ -3209,6 +3218,9 @@ "organizationIsDisabled": { "message": "Organization is disabled." }, + "disabledOrganizationFilterError": { + "message": "Items in disabled Organizations cannot be accessed. Contact your Organization owner for assistance." + }, "licenseIsExpired": { "message": "License is expired." }, @@ -3333,20 +3345,26 @@ "clone": { "message": "Clone" }, + "masterPassPolicyTitle": { + "message": "Master password requirements" + }, "masterPassPolicyDesc": { - "message": "Set minimum requirements for master password strength." + "message": "Set requirements for master password strength." + }, + "twoStepLoginPolicyTitle": { + "message": "Require two-step login" }, "twoStepLoginPolicyDesc": { - "message": "Require users to set up two-step login on their personal accounts." + "message": "Require members to set up two-step login." }, "twoStepLoginPolicyWarning": { - "message": "Organization members who are not Owners or Administrators and do not have two-step login enabled for their personal account will be removed from the organization and will receive an email notifying them about the change." + "message": "Organization members who are not Owners or Administrators and do not have two-step login turned on for their account will be removed from the organization and will receive an email notifying them about the change." }, "twoStepLoginPolicyUserWarning": { "message": "You are a member of an organization that requires two-step login to be enabled on your user account. If you disable all two-step login providers you will be automatically removed from these organizations." }, "passwordGeneratorPolicyDesc": { - "message": "Set minimum requirements for password generator configuration." + "message": "Set requirements for password generator." }, "passwordGeneratorPolicyInEffect": { "message": "One or more organization policies are affecting your generator settings." @@ -3564,10 +3582,10 @@ "message": "Link SSO" }, "singleOrg": { - "message": "Single Organization" + "message": "Single organization" }, "singleOrgDesc": { - "message": "Restrict users from being able to join any other organizations." + "message": "Restrict members from joining other organizations." }, "singleOrgBlockCreateMessage": { "message": "Your current organization has a policy that does not allow you to join more than one organization. Please contact your organization admins or sign up from a different Bitwarden account." @@ -3576,16 +3594,16 @@ "message": "Organization members who are not Owners or Administrators and are already a member of another organization will be removed from your organization." }, "requireSso": { - "message": "Single Sign-On Authentication" + "message": "Require single sign-on authentication" }, "requireSsoPolicyDesc": { - "message": "Require users to log in with the Enterprise Single Sign-On method." + "message": "Require members to log in with the Enterprise Single Sign-On method." }, "prerequisite": { "message": "Prerequisite" }, "requireSsoPolicyReq": { - "message": "The Single Organization enterprise policy must be enabled before activating this policy." + "message": "The Single Organization enterprise policy must be turned on before activating this policy." }, "requireSsoPolicyReqError": { "message": "Single Organization policy not enabled." @@ -3880,10 +3898,10 @@ } }, "personalOwnership": { - "message": "Personal Ownership" + "message": "Remove individual vault" }, "personalOwnershipPolicyDesc": { - "message": "Require users to save vault items to an organization by removing the personal ownership option." + "message": "Require members to save items to an organization by removing the individual vault option." }, "personalOwnershipExemption": { "message": "Organization Owners and Administrators are exempt from this policy's enforcement." @@ -3892,10 +3910,10 @@ "message": "Due to an enterprise policy, you are restricted from saving items to your personal vault. Change the Ownership option to an organization and choose from available Collections." }, "disableSend": { - "message": "Disable Send" + "message": "Remove Send" }, "disableSendPolicyDesc": { - "message": "Do not allow users to create or edit a Bitwarden Send. Deleting an existing Send is still allowed.", + "message": "Do not allow members to create or edit sends.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "disableSendExemption": { @@ -3910,7 +3928,7 @@ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendOptions": { - "message": "Send Options", + "message": "Send options", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendOptionsPolicyDesc": { @@ -3921,7 +3939,7 @@ "message": "Organization users that can manage the organization's policies are exempt from this policy's enforcement." }, "disableHideEmail": { - "message": "Do not allow users to hide their email address from recipients when creating or editing a Send.", + "message": "Always show member’s email address with recipients when creating or editing a send.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendOptionsPolicyInEffect": { @@ -4217,10 +4235,10 @@ "message": "Enrollment will allow organization administrators to change your master password" }, "resetPasswordPolicy": { - "message": "Master Password Reset" + "message": "Master password reset" }, "resetPasswordPolicyDescription": { - "message": "Allow administrators in the organization to reset organization users' master password." + "message": "Allow admins to reset master passwords for members." }, "resetPasswordPolicyWarning": { "message": "Users in the organization will need to self-enroll or be auto-enrolled before administrators can reset their master password." @@ -4464,10 +4482,10 @@ "message": "Your Master Password does not meet the policy requirements of this organization. In order to join the organization, you must update your Master Password now. Proceeding will log you out of your current session, requiring you to log back in. Active sessions on other devices may continue to remain active for up to one hour." }, "maximumVaultTimeout": { - "message": "Vault Timeout" + "message": "Vault timeout" }, "maximumVaultTimeoutDesc": { - "message": "Configure a maximum vault timeout for all users." + "message": "Set a maximum vault timeout for members." }, "maximumVaultTimeoutLabel": { "message": "Maximum Vault Timeout" @@ -4507,10 +4525,10 @@ "message": "Vault Timeout is not within allowed range." }, "disablePersonalVaultExport": { - "message": "Disable Personal Vault Export" + "message": "Remove individual vault export" }, "disablePersonalVaultExportDesc": { - "message": "Prohibits users from exporting their private vault data." + "message": "Do not allow members to export their individual vault data." }, "vaultExportDisabled": { "message": "Vault Export Disabled" @@ -4801,19 +4819,19 @@ "message": "Once set up, your configuration will be saved and members will be able to authenticate using their Identity Provider credentials." }, "ssoPolicyHelpStart": { - "message": "Enable the", - "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Enable the SSO Authentication policy to require all members to log in with SSO.'" + "message": "Use the", + "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Use the require single-sign-on authentication policy to require all members to log in with SSO.'" }, "ssoPolicyHelpLink": { - "message": "SSO Authentication policy", - "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Enable the SSO Authentication policy to require all members to log in with SSO.'" + "message": "require single-sign-on authentication policy", + "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Use the require single-sign-on authentication policy to require all members to log in with SSO.'" }, "ssoPolicyHelpEnd": { "message": "to require all members to log in with SSO.", - "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Enable the SSO Authentication policy to require all members to log in with SSO.'" + "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Use the require single-sign-on authentication policy to require all members to log in with SSO.'" }, "ssoPolicyHelpKeyConnector": { - "message": "SSO Authentication and Single Organization policies are required to set up Key Connector decryption." + "message": "The require SSO authentication and single organization policies are required to set up Key Connector decryption." }, "memberDecryptionOption": { "message": "Member Decryption Options" @@ -5165,5 +5183,35 @@ "example": "My Email" } } + }, + "inputRequired": { + "message": "Input is required." + }, + "inputEmail": { + "message": "Input is not an email-address." + }, + "inputMinLength": { + "message": "Input must be at least $COUNT$ characters long.", + "placeholders": { + "count": { + "content": "$1", + "example": "8" + } + } + }, + "fieldsNeedAttention": { + "message": "$COUNT$ field(s) above need your attention.", + "placeholders": { + "count": { + "content": "$1", + "example": "4" + } + } + }, + "turnOn": { + "message": "Turn on" + }, + "on": { + "message": "On" } } diff --git a/apps/web/src/locales/ca/messages.json b/apps/web/src/locales/ca/messages.json index 7525d51bfc0..98b8e55ba82 100644 --- a/apps/web/src/locales/ca/messages.json +++ b/apps/web/src/locales/ca/messages.json @@ -572,6 +572,9 @@ "createAccount": { "message": "Crea un compte" }, + "startTrial": { + "message": "Comença la prova" + }, "logIn": { "message": "Inicia sessió" }, @@ -593,6 +596,9 @@ "masterPassDesc": { "message": "La contrasenya mestra és la clau que utilitzeu per accedir a la vostra caixa forta. És molt important que no la oblideu. No hi ha manera de recuperar-la en cas que la oblideu." }, + "masterPassImportant": { + "message": "Les contrasenyes mestres no es poden recuperar si les oblideu!" + }, "masterPassHintDesc": { "message": "Una pista de la contrasenya mestra pot ajudar-vos a recordar-la si la oblideu." }, @@ -623,11 +629,14 @@ "invalidEmail": { "message": "L’adreça electrònica no és vàlida." }, - "masterPassRequired": { - "message": "La contrasenya és obligatòria." + "masterPasswordRequired": { + "message": "Es requereix la contrasenya mestra." }, - "masterPassLength": { - "message": "La contrasenya ha de contenir almenys 8 caràcters." + "confirmMasterPasswordRequired": { + "message": "Cal tornar a escriure la contrasenya mestra." + }, + "masterPasswordMinLength": { + "message": "La contrasenya mestra ha de tenir almenys 8 caràcters." }, "masterPassDoesntMatch": { "message": "La confirmació de la contrasenya mestra no coincideix." @@ -3159,7 +3168,7 @@ "acceptPolicies": { "message": "Si activeu aquesta casella, indiqueu que esteu d’acord amb el següent:" }, - "acceptPoliciesError": { + "acceptPoliciesRequired": { "message": "No s’han reconegut les condicions del servei i la declaració de privadesa." }, "termsOfService": { @@ -3209,6 +3218,9 @@ "organizationIsDisabled": { "message": "L'organització està inhabilitada." }, + "disabledOrganizationFilterError": { + "message": "Items in disabled Organizations cannot be accessed. Contact your Organization owner for assistance." + }, "licenseIsExpired": { "message": "Llicència caducada." }, @@ -3333,14 +3345,20 @@ "clone": { "message": "Clona" }, + "masterPassPolicyTitle": { + "message": "Requisits de contrasenya mestra" + }, "masterPassPolicyDesc": { "message": "Estableix els requisits mínims per al nivell de seguretat de la contrasenya principal." }, + "twoStepLoginPolicyTitle": { + "message": "Cal iniciar sessió en dos passos" + }, "twoStepLoginPolicyDesc": { "message": "Requereix que els usuaris configuren l’inici de sessió en dues passes als seus comptes personals." }, "twoStepLoginPolicyWarning": { - "message": "Els membres de l’organització que no tinguen activat l’inici de sessió en dues passes per al seu compte personal s'eliminaran de l’organització i rebran un correu electrònic que els notificarà sobre el canvi." + "message": "Els membres de l’organització que no tinguen activat l’inici de sessió en dos passos per al seu compte personal s'eliminaran de l’organització i rebran un correu electrònic que els notificarà sobre el canvi." }, "twoStepLoginPolicyUserWarning": { "message": "Eres membre d’una organització que necessita l’inici de sessió en dues passes per estar habilitat al vostre compte d’usuari. Si desactiveu tots els proveïdors d’inici de sessió en dues passes, sereu eliminats automàticament d’aquestes organitzacions." @@ -3880,7 +3898,7 @@ } }, "personalOwnership": { - "message": "Propietat personal" + "message": "Suprimeix la caixa forta individual" }, "personalOwnershipPolicyDesc": { "message": "Sol·liciteu als usuaris que guarden elements de caixa forta a una organització suprimint l’opció de propietat personal." @@ -3892,10 +3910,10 @@ "message": "A causa d'una política empresarial, no podeu guardar elements a la vostra caixa forta personal. Canvieu l'opció Propietat en organització i trieu entre les col·leccions disponibles." }, "disableSend": { - "message": "Desactiva Send" + "message": "Suprimeix Send" }, "disableSendPolicyDesc": { - "message": "No permeteu als usuaris crear o editar un Send Bitwarden. Es permet suprimir un Send existent.", + "message": "No permeteu als usuaris crear o editar Send.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "disableSendExemption": { @@ -3921,7 +3939,7 @@ "message": "Els usuaris de l’organització que poden gestionar les polítiques d'aquesta, estan exempts de la seua aplicació." }, "disableHideEmail": { - "message": "No permeteu que els usuaris amaguen la seua adreça de correu electrònic dels destinataris en crear o editar un Send.", + "message": "Mostra sempre l'adreça de correu electrònic del membre amb els destinataris quan creeu o editeu un Send.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendOptionsPolicyInEffect": { @@ -4802,18 +4820,18 @@ }, "ssoPolicyHelpStart": { "message": "Habilita la", - "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Enable the SSO Authentication policy to require all members to log in with SSO.'" + "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Use the require single-sign-on authentication policy to require all members to log in with SSO.'" }, "ssoPolicyHelpLink": { "message": "Política d'autenticació SSO", - "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Enable the SSO Authentication policy to require all members to log in with SSO.'" + "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Use the require single-sign-on authentication policy to require all members to log in with SSO.'" }, "ssoPolicyHelpEnd": { "message": "per obligar que tots els membres inicien la sessió amb SSO.", - "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Enable the SSO Authentication policy to require all members to log in with SSO.'" + "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Use the require single-sign-on authentication policy to require all members to log in with SSO.'" }, "ssoPolicyHelpKeyConnector": { - "message": "Les polítiques d'autenticació SSO i d'organització única són necessàries per configurar el desxifrat del connector de claus." + "message": "Es requereix l'autenticació SSO i les polítiques d'organització única per configurar el desxifrat del connector de claus." }, "memberDecryptionOption": { "message": "Opcions de desxifrat de membres" @@ -5165,5 +5183,35 @@ "example": "My Email" } } + }, + "inputRequired": { + "message": "Es requereix una entrada." + }, + "inputEmail": { + "message": "L'entrada no és una adreça de correu electrònic." + }, + "inputMinLength": { + "message": "L'entrada ha de tenir com a mínim $COUNT$ caràcters.", + "placeholders": { + "count": { + "content": "$1", + "example": "8" + } + } + }, + "fieldsNeedAttention": { + "message": "$COUNT$ camps de dalt necessiten la vostra atenció.", + "placeholders": { + "count": { + "content": "$1", + "example": "4" + } + } + }, + "turnOn": { + "message": "Activa" + }, + "on": { + "message": "Activat" } } diff --git a/apps/web/src/locales/cs/messages.json b/apps/web/src/locales/cs/messages.json index c7505f854c0..b52bd433076 100644 --- a/apps/web/src/locales/cs/messages.json +++ b/apps/web/src/locales/cs/messages.json @@ -572,6 +572,9 @@ "createAccount": { "message": "Vytvořit účet" }, + "startTrial": { + "message": "Start Trial" + }, "logIn": { "message": "Přihlásit se" }, @@ -593,6 +596,9 @@ "masterPassDesc": { "message": "Hlavní heslo je heslo, které používáte k přístupu do vašeho trezoru. Je velmi důležité, abyste jej nezapomněli. Neexistuje totiž žádný způsob, jak heslo obnovit v případě, že jste na něj zapomněli." }, + "masterPassImportant": { + "message": "Master passwords cannot be recovered if you forget it!" + }, "masterPassHintDesc": { "message": "Nápověda k hlavnímu heslu vám pomůže zapamatovat si heslo, pokud ho zapomenete." }, @@ -623,11 +629,14 @@ "invalidEmail": { "message": "Neplatná e-mailová adresa." }, - "masterPassRequired": { - "message": "Hlavní heslo je povinné." + "masterPasswordRequired": { + "message": "Master password is required." }, - "masterPassLength": { - "message": "Hlavní heslo musí obsahovat alespoň 8 znaků." + "confirmMasterPasswordRequired": { + "message": "Master password retype is required." + }, + "masterPasswordMinLength": { + "message": "Master password must be at least 8 characters long." }, "masterPassDoesntMatch": { "message": "Potvrzení hlavního hesla se neshoduje." @@ -3159,8 +3168,8 @@ "acceptPolicies": { "message": "Zaškrtnutím tohoto políčka souhlasím s následujícím:" }, - "acceptPoliciesError": { - "message": "Podmínky služby a zásady ochrany osobních údajů nebyly uznány." + "acceptPoliciesRequired": { + "message": "Terms of Service and Privacy Policy have not been acknowledged." }, "termsOfService": { "message": "Podmínky služby" @@ -3209,6 +3218,9 @@ "organizationIsDisabled": { "message": "Organizace je zakázána." }, + "disabledOrganizationFilterError": { + "message": "Items in disabled Organizations cannot be accessed. Contact your Organization owner for assistance." + }, "licenseIsExpired": { "message": "Licence vypršela." }, @@ -3333,9 +3345,15 @@ "clone": { "message": "Duplikovat" }, + "masterPassPolicyTitle": { + "message": "Master password requirements" + }, "masterPassPolicyDesc": { "message": "Nastavte minimální požadavky pro sílu hlavního hesla." }, + "twoStepLoginPolicyTitle": { + "message": "Require two-step login" + }, "twoStepLoginPolicyDesc": { "message": "Požadovat po uživatelích nastavení dvoufázového přihlášení pro jejich osobní účty." }, @@ -4507,10 +4525,10 @@ "message": "Vault Timeout is not within allowed range." }, "disablePersonalVaultExport": { - "message": "Disable Personal Vault Export" + "message": "Remove individual vault export" }, "disablePersonalVaultExportDesc": { - "message": "Prohibits users from exporting their private vault data." + "message": "Do not allow members to export their individual vault data." }, "vaultExportDisabled": { "message": "Vault Export Disabled" @@ -4801,19 +4819,19 @@ "message": "Once set up, your configuration will be saved and members will be able to authenticate using their Identity Provider credentials." }, "ssoPolicyHelpStart": { - "message": "Enable the", - "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Enable the SSO Authentication policy to require all members to log in with SSO.'" + "message": "Use the", + "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Use the require single-sign-on authentication policy to require all members to log in with SSO.'" }, "ssoPolicyHelpLink": { - "message": "SSO Authentication policy", - "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Enable the SSO Authentication policy to require all members to log in with SSO.'" + "message": "require single-sign-on authentication policy", + "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Use the require single-sign-on authentication policy to require all members to log in with SSO.'" }, "ssoPolicyHelpEnd": { "message": "to require all members to log in with SSO.", - "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Enable the SSO Authentication policy to require all members to log in with SSO.'" + "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Use the require single-sign-on authentication policy to require all members to log in with SSO.'" }, "ssoPolicyHelpKeyConnector": { - "message": "SSO Authentication and Single Organization policies are required to set up Key Connector decryption." + "message": "The require SSO authentication and single organization policies are required to set up Key Connector decryption." }, "memberDecryptionOption": { "message": "Member Decryption Options" @@ -5165,5 +5183,35 @@ "example": "My Email" } } + }, + "inputRequired": { + "message": "Input is required." + }, + "inputEmail": { + "message": "Input is not an email-address." + }, + "inputMinLength": { + "message": "Input must be at least $COUNT$ characters long.", + "placeholders": { + "count": { + "content": "$1", + "example": "8" + } + } + }, + "fieldsNeedAttention": { + "message": "$COUNT$ field(s) above need your attention.", + "placeholders": { + "count": { + "content": "$1", + "example": "4" + } + } + }, + "turnOn": { + "message": "Turn on" + }, + "on": { + "message": "On" } } diff --git a/apps/web/src/locales/da/messages.json b/apps/web/src/locales/da/messages.json index 1fb0926e424..fd87ad73171 100644 --- a/apps/web/src/locales/da/messages.json +++ b/apps/web/src/locales/da/messages.json @@ -572,6 +572,9 @@ "createAccount": { "message": "Opret konto" }, + "startTrial": { + "message": "Start prøveperiode" + }, "logIn": { "message": "Log ind" }, @@ -593,6 +596,9 @@ "masterPassDesc": { "message": "Hovedadgangskoden er den adgangskode, du bruger til at få adgang til din boks. Det er meget vigtigt, at du ikke glemmer din hovedadgangskode. Der er ingen måde hvorpå koden kan genoprettes, i tilfælde af at du glemmer den." }, + "masterPassImportant": { + "message": "Hovedadgangskoder kan ikke gendannes, hvis de glemmes!" + }, "masterPassHintDesc": { "message": "Et tip til hovedadgangskoden kan hjælpe dig med at huske din adgangskode, hvis du glemmer den." }, @@ -623,11 +629,14 @@ "invalidEmail": { "message": "Ugyldig e-mailadresse." }, - "masterPassRequired": { - "message": "Hovedadgangskode er påkrævet." + "masterPasswordRequired": { + "message": "Hovedadgangskode er obligatorisk." }, - "masterPassLength": { - "message": "Hovedadgangskoden skal være på mindst 8 tegn." + "confirmMasterPasswordRequired": { + "message": "Hovedadgangskode kræves angivet igen." + }, + "masterPasswordMinLength": { + "message": "Hovedadgangskode skal udgøre min. 8 tegn." }, "masterPassDoesntMatch": { "message": "De to hovedadgangskoder matcher ikke." @@ -1155,17 +1164,17 @@ "message": "Vis webstedsikoner" }, "faviconDesc": { - "message": "Vis genkendeligt billede ved hvert login." + "message": "Vis et genkendeligt billede ud for hvert login." }, "enableGravatars": { - "message": "Aktivér Gravatars", + "message": "Vis Gravatarer", "description": "Use avatar images loaded from gravatar.com." }, "enableGravatarsDesc": { "message": "Brug avatar billeder hentet fra gravatar.com." }, "enableFullWidth": { - "message": "Aktivér layout med fuld bredde", + "message": "Vis layout med fuld bredde", "description": "Allows scaling the web vault UI's width" }, "enableFullWidthDesc": { @@ -3159,8 +3168,8 @@ "acceptPolicies": { "message": "Ved at markere dette felt accepterer du følgende:" }, - "acceptPoliciesError": { - "message": "Servicevilkår og fortrolighedspolitik er ikke blevet bekræftet." + "acceptPoliciesRequired": { + "message": "Tjenestevilkår og Fortrolighedspolitik er ikke blevet accepteret." }, "termsOfService": { "message": "Servicevilkår" @@ -3175,7 +3184,7 @@ "message": "Boks timeout" }, "vaultTimeoutDesc": { - "message": "Vælg timeout for din boks, hvorefter den vil udføre den valgte handling." + "message": "Vælg hvornår din boks skal udføre timeout-handlingen." }, "oneMinute": { "message": "1 minut" @@ -3196,7 +3205,7 @@ "message": "4 timer" }, "onRefresh": { - "message": "Ved genstart af browseren" + "message": "Ved browser opdatering" }, "dateUpdated": { "message": "Opdateret", @@ -3209,6 +3218,9 @@ "organizationIsDisabled": { "message": "Organisationen er deaktiveret." }, + "disabledOrganizationFilterError": { + "message": "Elementer i deaktiverede organisationer kan ikke tilgås. Kontakt organisationsejeren for hjælp." + }, "licenseIsExpired": { "message": "Licensen er udløbet." }, @@ -3333,9 +3345,15 @@ "clone": { "message": "Klon" }, + "masterPassPolicyTitle": { + "message": "Hovedadgangskodekrav" + }, "masterPassPolicyDesc": { "message": "Angiv minimumskrav til styrken af hovedadgangskoden." }, + "twoStepLoginPolicyTitle": { + "message": "Kræv totrins-login" + }, "twoStepLoginPolicyDesc": { "message": "Kræv at brugerne konfigurerer to-trins-login på deres personlige konti." }, @@ -3406,10 +3424,10 @@ "message": "Boks timeout-handling" }, "vaultTimeoutActionLockDesc": { - "message": "En låst boks kræver at du gentaster din hovedadgangskode for at tilgå den igen." + "message": "Hovedadgangskode eller anden oplåsningsmetode kræves for at få adgang til din boks igen." }, "vaultTimeoutActionLogOutDesc": { - "message": "En boks der er logget ud kræver, at du godkender igen for at få adgang til den." + "message": "Gengodkendelse kræves for at få adgang til din boks igen." }, "lock": { "message": "Lås", @@ -4802,15 +4820,15 @@ }, "ssoPolicyHelpStart": { "message": "Aktivér", - "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Enable the SSO Authentication policy to require all members to log in with SSO.'" + "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Use the require single-sign-on authentication policy to require all members to log in with SSO.'" }, "ssoPolicyHelpLink": { "message": "SSO-godkendelsespolitik", - "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Enable the SSO Authentication policy to require all members to log in with SSO.'" + "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Use the require single-sign-on authentication policy to require all members to log in with SSO.'" }, "ssoPolicyHelpEnd": { "message": "for at kræve, at alle medlemmer logger ind med SSO.", - "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Enable the SSO Authentication policy to require all members to log in with SSO.'" + "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Use the require single-sign-on authentication policy to require all members to log in with SSO.'" }, "ssoPolicyHelpKeyConnector": { "message": "SSO-godkendelse og Enkel organisation-politikker er påkrævet for at konfigurere Key Connector-dekryptering." @@ -5165,5 +5183,35 @@ "example": "My Email" } } + }, + "inputRequired": { + "message": "Input obligatorisk." + }, + "inputEmail": { + "message": "Input er ikke en gyldig e-mailadresse." + }, + "inputMinLength": { + "message": "Input skal udgøre min. $COUNT$ tegn.", + "placeholders": { + "count": { + "content": "$1", + "example": "8" + } + } + }, + "fieldsNeedAttention": { + "message": "$COUNT$-felt(er) ovenfor kræver din opmærksomhed.", + "placeholders": { + "count": { + "content": "$1", + "example": "4" + } + } + }, + "turnOn": { + "message": "Slå til" + }, + "on": { + "message": "Til" } } diff --git a/apps/web/src/locales/de/messages.json b/apps/web/src/locales/de/messages.json index 99498d6ea08..34bf627faca 100644 --- a/apps/web/src/locales/de/messages.json +++ b/apps/web/src/locales/de/messages.json @@ -572,6 +572,9 @@ "createAccount": { "message": "Konto erstellen" }, + "startTrial": { + "message": "Probephase starten" + }, "logIn": { "message": "Anmelden" }, @@ -593,6 +596,9 @@ "masterPassDesc": { "message": "Das Master-Passwort wird verwendet, um den Tresor zu öffnen. Es ist sehr wichtig, dass Sie das Passwort nicht vergessen, da es keine Möglichkeit gibt es zurückzusetzen." }, + "masterPassImportant": { + "message": "Master-Passwörter können nicht wiederhergestellt werden, wenn du sie vergisst!" + }, "masterPassHintDesc": { "message": "Ein Master-Passwort-Hinweis kann Ihnen helfen, sich an das Passwort zu erinnern, wenn Sie es vergessen haben sollten." }, @@ -623,10 +629,13 @@ "invalidEmail": { "message": "Ungültige E-Mail Adresse." }, - "masterPassRequired": { + "masterPasswordRequired": { "message": "Das Master-Passwort ist erforderlich." }, - "masterPassLength": { + "confirmMasterPasswordRequired": { + "message": "Erneute Eingabe des Master-Passworts ist erforderlich." + }, + "masterPasswordMinLength": { "message": "Das Master-Passwort muss mindestens 8 Zeichen lang sein." }, "masterPassDoesntMatch": { @@ -1152,10 +1161,10 @@ "message": "Ändern Sie die Sprache für den Web-Tresor." }, "enableFavicon": { - "message": "Show website icons" + "message": "Zeige Webseiten-Icons" }, "faviconDesc": { - "message": "Show a recognizable image next to each login." + "message": "Ein wiedererkennbares Bild neben jeden Zugangsdaten anzeigen." }, "enableGravatars": { "message": "Gravatare aktivieren", @@ -3159,7 +3168,7 @@ "acceptPolicies": { "message": "Durch Anwählen dieses Kästchens erklären Sie sich mit folgendem einverstanden:" }, - "acceptPoliciesError": { + "acceptPoliciesRequired": { "message": "Die Nutzungsbedingungen und Datenschutzerklärung wurden nicht akzeptiert." }, "termsOfService": { @@ -3209,6 +3218,9 @@ "organizationIsDisabled": { "message": "Organisation ist deaktiviert." }, + "disabledOrganizationFilterError": { + "message": "Auf Einträge in deaktivierten Organisationen kann nicht zugegriffen werden. Kontaktiere deinen Organisationseigentümer für Unterstützung." + }, "licenseIsExpired": { "message": "Lizenz ist abgelaufen." }, @@ -3333,9 +3345,15 @@ "clone": { "message": "Duplizieren" }, + "masterPassPolicyTitle": { + "message": "Master-Passwort-Anforderungen" + }, "masterPassPolicyDesc": { "message": "Mindestanforderungen für die Stärke des Master-Passworts festlegen." }, + "twoStepLoginPolicyTitle": { + "message": "Zwei-Faktor-Authentifizierung verlangen" + }, "twoStepLoginPolicyDesc": { "message": "Benutzer müssen eine zweistufige Anmeldung für ihre persönlichen Konten einrichten." }, @@ -4802,15 +4820,15 @@ }, "ssoPolicyHelpStart": { "message": "Aktiviere die", - "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Enable the SSO Authentication policy to require all members to log in with SSO.'" + "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Use the require single-sign-on authentication policy to require all members to log in with SSO.'" }, "ssoPolicyHelpLink": { "message": "SSO-Richtlinie", - "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Enable the SSO Authentication policy to require all members to log in with SSO.'" + "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Use the require single-sign-on authentication policy to require all members to log in with SSO.'" }, "ssoPolicyHelpEnd": { "message": ", um zu erzwingen, dass sich alle Mitglieder mit SSO anmelden.", - "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Enable the SSO Authentication policy to require all members to log in with SSO.'" + "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Use the require single-sign-on authentication policy to require all members to log in with SSO.'" }, "ssoPolicyHelpKeyConnector": { "message": "SSO-Authentifizierung und Richtlinien für eine einzelne Organisation werden benötigt, um die Key Connector Entschlüsselung einzurichten." @@ -5165,5 +5183,35 @@ "example": "My Email" } } + }, + "inputRequired": { + "message": "Angabe ist erforderlich." + }, + "inputEmail": { + "message": "Angabe ist keine E-Mail-Adresse." + }, + "inputMinLength": { + "message": "Angabe muss mindestens $COUNT$ Zeichen lang sein.", + "placeholders": { + "count": { + "content": "$1", + "example": "8" + } + } + }, + "fieldsNeedAttention": { + "message": "$COUNT$ Feld(er) oben benötigt deine Aufmerksamkeit.", + "placeholders": { + "count": { + "content": "$1", + "example": "4" + } + } + }, + "turnOn": { + "message": "Einschalten" + }, + "on": { + "message": "Ein" } } diff --git a/apps/web/src/locales/el/messages.json b/apps/web/src/locales/el/messages.json index 4552350680e..f9242a05342 100644 --- a/apps/web/src/locales/el/messages.json +++ b/apps/web/src/locales/el/messages.json @@ -572,6 +572,9 @@ "createAccount": { "message": "Δημιουργία Λογαριασμού" }, + "startTrial": { + "message": "Start Trial" + }, "logIn": { "message": "Είσοδος" }, @@ -593,6 +596,9 @@ "masterPassDesc": { "message": "Ο κύριος κωδικός είναι ο κωδικός που χρησιμοποιείτε για την πρόσβαση στο vault σας. Είναι πολύ σημαντικό να μην ξεχάσετε τον κύριο κωδικό. Δεν υπάρχει τρόπος να τον ανακτήσετε σε περίπτωση που τον ξεχάσετε." }, + "masterPassImportant": { + "message": "Master passwords cannot be recovered if you forget it!" + }, "masterPassHintDesc": { "message": "Η υπόδειξη του κύριου κωδικού μπορεί να σας βοηθήσει να θυμηθείτε τον κωδικό σας, σε περίπτωση που τον ξεχάσετε." }, @@ -623,11 +629,14 @@ "invalidEmail": { "message": "Μη έγκυρη διεύθυνση e-mail." }, - "masterPassRequired": { - "message": "Απαιτείται κύριος κωδικός πρόσβασης." + "masterPasswordRequired": { + "message": "Master password is required." }, - "masterPassLength": { - "message": "Ο κύριος κωδικός πρέπει να έχει μήκος τουλάχιστον 8 χαρακτήρες." + "confirmMasterPasswordRequired": { + "message": "Master password retype is required." + }, + "masterPasswordMinLength": { + "message": "Master password must be at least 8 characters long." }, "masterPassDoesntMatch": { "message": "Η επιβεβαίωση του κύριου κωδικού δεν ταιριάζει." @@ -3159,8 +3168,8 @@ "acceptPolicies": { "message": "Επιλέγοντας αυτό το πλαίσιο, συμφωνείτε με τα εξής:" }, - "acceptPoliciesError": { - "message": "Οι Όροι Παροχής Υπηρεσιών και η Πολιτική Απορρήτου δεν έχουν αναγνωριστεί." + "acceptPoliciesRequired": { + "message": "Terms of Service and Privacy Policy have not been acknowledged." }, "termsOfService": { "message": "Όροι Χρήσης" @@ -3209,6 +3218,9 @@ "organizationIsDisabled": { "message": "Ο οργανισμός είναι απενεργοποιημένος." }, + "disabledOrganizationFilterError": { + "message": "Items in disabled Organizations cannot be accessed. Contact your Organization owner for assistance." + }, "licenseIsExpired": { "message": "Η άδεια χρήσης έληξε." }, @@ -3333,9 +3345,15 @@ "clone": { "message": "Κλώνος" }, + "masterPassPolicyTitle": { + "message": "Master password requirements" + }, "masterPassPolicyDesc": { "message": "Ορίστε ελάχιστες απαιτήσεις, για ισχύ του κύριου κωδικού." }, + "twoStepLoginPolicyTitle": { + "message": "Require two-step login" + }, "twoStepLoginPolicyDesc": { "message": "Να απαιτείτε από τους χρήστες να ορίσουν τη σύνδεση σε δύο βήματα στους προσωπικούς τους λογαριασμούς." }, @@ -4802,15 +4820,15 @@ }, "ssoPolicyHelpStart": { "message": "Ενεργοποίηση του", - "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Enable the SSO Authentication policy to require all members to log in with SSO.'" + "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Use the require single-sign-on authentication policy to require all members to log in with SSO.'" }, "ssoPolicyHelpLink": { "message": "Πολιτική ελέγχου ταυτότητας SSO", - "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Enable the SSO Authentication policy to require all members to log in with SSO.'" + "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Use the require single-sign-on authentication policy to require all members to log in with SSO.'" }, "ssoPolicyHelpEnd": { "message": "για να απαιτήσει από όλα τα μέλη να συνδεθούν με SSO.", - "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Enable the SSO Authentication policy to require all members to log in with SSO.'" + "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Use the require single-sign-on authentication policy to require all members to log in with SSO.'" }, "ssoPolicyHelpKeyConnector": { "message": "Απαιτούνται πολιτικές ελέγχου ταυτότητας και ενιαίου οργανισμού για τη δημιουργία αποκρυπτογράφησης κλειδιών σύνδεσης." @@ -5165,5 +5183,35 @@ "example": "My Email" } } + }, + "inputRequired": { + "message": "Input is required." + }, + "inputEmail": { + "message": "Input is not an email-address." + }, + "inputMinLength": { + "message": "Input must be at least $COUNT$ characters long.", + "placeholders": { + "count": { + "content": "$1", + "example": "8" + } + } + }, + "fieldsNeedAttention": { + "message": "$COUNT$ field(s) above need your attention.", + "placeholders": { + "count": { + "content": "$1", + "example": "4" + } + } + }, + "turnOn": { + "message": "Turn on" + }, + "on": { + "message": "On" } } diff --git a/apps/web/src/locales/en/messages.json b/apps/web/src/locales/en/messages.json index 725a0a52ba1..f574c9bd037 100644 --- a/apps/web/src/locales/en/messages.json +++ b/apps/web/src/locales/en/messages.json @@ -572,6 +572,9 @@ "createAccount": { "message": "Create Account" }, + "startTrial": { + "message": "Start Trial" + }, "logIn": { "message": "Log In" }, @@ -593,6 +596,9 @@ "masterPassDesc": { "message": "The master password is the password you use to access your vault. It is very important that you do not forget your master password. There is no way to recover the password in the event that you forget it." }, + "masterPassImportant": { + "message": "Master passwords cannot be recovered if you forget it!" + }, "masterPassHintDesc": { "message": "A master password hint can help you remember your password if you forget it." }, @@ -623,10 +629,13 @@ "invalidEmail": { "message": "Invalid email address." }, - "masterPassRequired": { + "masterPasswordRequired": { "message": "Master password is required." }, - "masterPassLength": { + "confirmMasterPasswordRequired": { + "message": "Master password retype is required." + }, + "masterPasswordMinLength": { "message": "Master password must be at least 8 characters long." }, "masterPassDoesntMatch": { @@ -635,6 +644,9 @@ "newAccountCreated": { "message": "Your new account has been created! You may now log in." }, + "trialAccountCreated": { + "message": "Account created successfully." + }, "masterPassSent": { "message": "We've sent you an email with your master password hint." }, @@ -927,7 +939,7 @@ "message": "Your vault data has been exported." }, "passwordGenerator": { - "message": "Password Generator" + "message": "Password generator" }, "minComplexityScore": { "message": "Minimum Complexity Score" @@ -1112,7 +1124,7 @@ "message": "Delete Account" }, "deleteAccountDesc": { - "message": "Proceed below to delete your account and all associated data." + "message": "Proceed below to delete your account and all vault data." }, "deleteAccountWarning": { "message": "Deleting your account is permanent. It cannot be undone." @@ -1121,7 +1133,7 @@ "message": "Account Deleted" }, "accountDeletedDesc": { - "message": "Your account has been closed and all associated data has been deleted." + "message": "Your Bitwarden account and vault data were permanently deleted." }, "myAccount": { "message": "My Account" @@ -1259,7 +1271,7 @@ "message": "Domains updated" }, "twoStepLogin": { - "message": "Two-step Login" + "message": "Two-step login" }, "twoStepLoginDesc": { "message": "Secure your account by requiring an additional step when logging in." @@ -1283,8 +1295,8 @@ "enabled": { "message": "Enabled" }, - "activate": { - "message": "Activate" + "restoreAccess": { + "message": "Restore Access" }, "premium": { "message": "Premium", @@ -1311,8 +1323,8 @@ "disable": { "message": "Disable" }, - "deactivate": { - "message": "Deactivate" + "revokeAccess": { + "message": "Revoke Access" }, "twoStepLoginProviderEnabled": { "message": "This two-step login provider is enabled on your account." @@ -1705,6 +1717,12 @@ "billing": { "message": "Billing" }, + "billingPlanLabel": { + "message": "Billing Plan" + }, + "paymentType": { + "message": "Payment Type" + }, "accountCredit": { "message": "Account Credit", "description": "Financial term. In the case of Bitwarden, a positive balance means that you owe money, while a negative balance means that you have a credit (Bitwarden owes you money)." @@ -1821,6 +1839,9 @@ "year": { "message": "year" }, + "yr": { + "message": "yr" + }, "month": { "message": "month" }, @@ -1849,6 +1870,9 @@ "billingInformation": { "message": "Billing Information" }, + "billingTrialSubLabel": { + "message": "Your payment method will not be charged during the 7 day free trial." + }, "creditCard": { "message": "Credit Card" }, @@ -2205,12 +2229,36 @@ } } }, + "trialThankYou": { + "message": "Thanks for signing up for Bitwarden for $PLAN$!", + "placeholders": { + "plan": { + "content": "$1", + "example": "Teams" + } + } + }, + "trialPaidInfoMessage": { + "message": "Your $PLAN$ 7 day free trial will be converted to a paid subscription after 7 days.", + "placeholders": { + "plan": { + "content": "$1", + "example": "Teams" + } + } + }, + "trialConfirmationEmail": { + "message": "We've sent a confirmation email to your team's billing email at " + }, "monthly": { "message": "Monthly" }, "annually": { "message": "Annually" }, + "annual": { + "message": "Annual" + }, "basePrice": { "message": "Base Price" }, @@ -2277,11 +2325,11 @@ "removeUserConfirmation": { "message": "Are you sure you want to remove this user?" }, - "deactivateUserConfirmation": { - "message": "The member will no longer have access to the organization, but will still have access to their individual vault." + "removeOrgUserConfirmation": { + "message": "When a member is removed, they no longer have access to organization data and this action is irreversible. To add the member back to the organization, they must be invited and onboarded again." }, - "activateUserConfirmation": { - "message": "Are you sure you want to activate this user, granting them access to the organization?" + "revokeUserConfirmation": { + "message": "When a member is revoked, they no longer have access to organization data. To quickly restore member access, go to the Revoked tab." }, "removeUserConfirmationKeyConnector": { "message": "Warning! This user requires Key Connector to manage their encryption. Removing this user from your organization will permanently disable their account. This action cannot be undone. Do you want to proceed?" @@ -2628,8 +2676,8 @@ } } }, - "deactivatedUserId": { - "message": "Deactivated user $ID$.", + "removeUserIdAccess": { + "message": "Remove $ID$ access", "placeholders": { "id": { "content": "$1", @@ -2637,8 +2685,8 @@ } } }, - "activatedUserId": { - "message": "Activated user $ID$.", + "revokedUserId": { + "message": "Revoked organization access for $ID$.", "placeholders": { "id": { "content": "$1", @@ -2646,8 +2694,8 @@ } } }, - "deactivateUserId": { - "message": "Deactivate user $ID$?", + "restoredUserId": { + "message": "Restored organization access for $ID$.", "placeholders": { "id": { "content": "$1", @@ -2655,8 +2703,8 @@ } } }, - "activateUserId": { - "message": "Activate user $ID$?", + "revokeUserId": { + "message": "Revoke $ID$ access", "placeholders": { "id": { "content": "$1", @@ -3204,7 +3252,7 @@ "acceptPolicies": { "message": "By checking this box you agree to the following:" }, - "acceptPoliciesError": { + "acceptPoliciesRequired": { "message": "Terms of Service and Privacy Policy have not been acknowledged." }, "termsOfService": { @@ -3254,6 +3302,9 @@ "organizationIsDisabled": { "message": "Organization is disabled." }, + "disabledOrganizationFilterError": { + "message": "Items in disabled Organizations cannot be accessed. Contact your Organization owner for assistance." + }, "licenseIsExpired": { "message": "License is expired." }, @@ -3378,20 +3429,26 @@ "clone": { "message": "Clone" }, + "masterPassPolicyTitle": { + "message": "Master password requirements" + }, "masterPassPolicyDesc": { - "message": "Set minimum requirements for master password strength." + "message": "Set requirements for master password strength." + }, + "twoStepLoginPolicyTitle": { + "message": "Require two-step login" }, "twoStepLoginPolicyDesc": { - "message": "Require users to set up two-step login on their personal accounts." + "message": "Require members to set up two-step login." }, "twoStepLoginPolicyWarning": { - "message": "Organization members who are not Owners or Administrators and do not have two-step login enabled for their personal account will be removed from the organization and will receive an email notifying them about the change." + "message": "Organization members who are not Owners or Administrators and do not have two-step login turned on for their account will be removed from the organization and will receive an email notifying them about the change." }, "twoStepLoginPolicyUserWarning": { "message": "You are a member of an organization that requires two-step login to be enabled on your user account. If you disable all two-step login providers you will be automatically removed from these organizations." }, "passwordGeneratorPolicyDesc": { - "message": "Set minimum requirements for password generator configuration." + "message": "Set requirements for password generator." }, "passwordGeneratorPolicyInEffect": { "message": "One or more organization policies are affecting your generator settings." @@ -3609,10 +3666,10 @@ "message": "Link SSO" }, "singleOrg": { - "message": "Single Organization" + "message": "Single organization" }, "singleOrgDesc": { - "message": "Restrict users from being able to join any other organizations." + "message": "Restrict members from joining other organizations." }, "singleOrgBlockCreateMessage": { "message": "Your current organization has a policy that does not allow you to join more than one organization. Please contact your organization admins or sign up from a different Bitwarden account." @@ -3621,16 +3678,16 @@ "message": "Organization members who are not Owners or Administrators and are already a member of another organization will be removed from your organization." }, "requireSso": { - "message": "Single Sign-On Authentication" + "message": "Require single sign-on authentication" }, "requireSsoPolicyDesc": { - "message": "Require users to log in with the Enterprise Single Sign-On method." + "message": "Require members to log in with the Enterprise Single Sign-On method." }, "prerequisite": { "message": "Prerequisite" }, "requireSsoPolicyReq": { - "message": "The Single Organization enterprise policy must be enabled before activating this policy." + "message": "The Single Organization enterprise policy must be turned on before activating this policy." }, "requireSsoPolicyReqError": { "message": "Single Organization policy not enabled." @@ -3711,8 +3768,8 @@ "disabled": { "message": "Disabled" }, - "deactivated": { - "message": "Deactivated" + "revoked": { + "message": "Revoked" }, "sendLink": { "message": "Send link", @@ -3925,10 +3982,10 @@ } }, "personalOwnership": { - "message": "Personal Ownership" + "message": "Remove individual vault" }, "personalOwnershipPolicyDesc": { - "message": "Require users to save vault items to an organization by removing the personal ownership option." + "message": "Require members to save items to an organization by removing the individual vault option." }, "personalOwnershipExemption": { "message": "Organization Owners and Administrators are exempt from this policy's enforcement." @@ -3937,10 +3994,10 @@ "message": "Due to an enterprise policy, you are restricted from saving items to your personal vault. Change the Ownership option to an organization and choose from available Collections." }, "disableSend": { - "message": "Disable Send" + "message": "Remove Send" }, "disableSendPolicyDesc": { - "message": "Do not allow users to create or edit a Bitwarden Send. Deleting an existing Send is still allowed.", + "message": "Do not allow members to create or edit sends.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "disableSendExemption": { @@ -3955,7 +4012,7 @@ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendOptions": { - "message": "Send Options", + "message": "Send options", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendOptionsPolicyDesc": { @@ -3966,7 +4023,7 @@ "message": "Organization users that can manage the organization's policies are exempt from this policy's enforcement." }, "disableHideEmail": { - "message": "Do not allow users to hide their email address from recipients when creating or editing a Send.", + "message": "Always show member’s email address with recipients when creating or editing a send.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendOptionsPolicyInEffect": { @@ -4262,10 +4319,10 @@ "message": "Enrollment will allow organization administrators to change your master password" }, "resetPasswordPolicy": { - "message": "Master Password Reset" + "message": "Master password reset" }, "resetPasswordPolicyDescription": { - "message": "Allow administrators in the organization to reset organization users' master password." + "message": "Allow admins to reset master passwords for members." }, "resetPasswordPolicyWarning": { "message": "Users in the organization will need to self-enroll or be auto-enrolled before administrators can reset their master password." @@ -4315,11 +4372,11 @@ "removeUsersWarning": { "message": "Are you sure you want to remove the following users? The process may take a few seconds to complete and cannot be interrupted or canceled." }, - "deactivateUsersWarning": { - "message": "Are you sure you want to deactivate the following members? They will no longer have access to the organization, but will still have access to their individual vaults. The process may take a few seconds to complete and cannot be interrupted or canceled." + "removeOrgUsersConfirmation": { + "message": "When member(s) are removed, they no longer have access to organization data and this action is irreversible. To add the member back to the organization, they must be invited and onboarded again. The process may take a few seconds to complete and cannot be interrupted or canceled." }, - "activateUsersWarning": { - "message": "Are you sure you want to activate the following members, granting them access to the organization? The process may take a few seconds to complete and cannot be interrupted or canceled." + "revokeUsersWarning": { + "message": "When member(s) are revoked, they no longer have access to organization data. To quickly restore member access, go to the Revoked tab. The process may take a few seconds to complete and cannot be interrupted or canceled." }, "theme": { "message": "Theme" @@ -4351,11 +4408,11 @@ "bulkRemovedMessage": { "message": "Removed successfully" }, - "bulkDeactivatedMessage": { - "message": "Deactivated successfully" + "bulkRevokedMessage": { + "message": "Revoked organization access successfully" }, - "bulkActivatedMessage": { - "message": "Activated successfully" + "bulkRestoredMessage": { + "message": "Restored organization access successfully" }, "bulkFilteredMessage": { "message": "Excluded, not applicable for this action." @@ -4366,11 +4423,11 @@ "removeUsers": { "message": "Remove Users" }, - "deactivateUsers": { - "message": "Deactivate Users" + "revokeUsers": { + "message": "Revoke Users" }, - "activateUsers": { - "message": "Activate Users" + "restoreUsers": { + "message": "Restore Users" }, "error": { "message": "Error" @@ -4509,10 +4566,10 @@ "message": "Your Master Password does not meet the policy requirements of this organization. In order to join the organization, you must update your Master Password now. Proceeding will log you out of your current session, requiring you to log back in. Active sessions on other devices may continue to remain active for up to one hour." }, "maximumVaultTimeout": { - "message": "Vault Timeout" + "message": "Vault timeout" }, "maximumVaultTimeoutDesc": { - "message": "Configure a maximum vault timeout for all users." + "message": "Set a maximum vault timeout for members." }, "maximumVaultTimeoutLabel": { "message": "Maximum Vault Timeout" @@ -4552,10 +4609,10 @@ "message": "Vault Timeout is not within allowed range." }, "disablePersonalVaultExport": { - "message": "Disable Personal Vault Export" + "message": "Remove individual vault export" }, "disablePersonalVaultExportDesc": { - "message": "Prohibits users from exporting their private vault data." + "message": "Do not allow members to export their individual vault data." }, "vaultExportDisabled": { "message": "Vault Export Disabled" @@ -4782,9 +4839,6 @@ "sponsorshipCreated": { "message": "Sponsorship Created" }, - "revoke": { - "message": "Revoke" - }, "emailSent": { "message": "Email Sent" }, @@ -4846,19 +4900,19 @@ "message": "Once set up, your configuration will be saved and members will be able to authenticate using their Identity Provider credentials." }, "ssoPolicyHelpStart": { - "message": "Enable the", - "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Enable the SSO Authentication policy to require all members to log in with SSO.'" + "message": "Use the", + "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Use the require single-sign-on authentication policy to require all members to log in with SSO.'" }, "ssoPolicyHelpLink": { - "message": "SSO Authentication policy", - "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Enable the SSO Authentication policy to require all members to log in with SSO.'" + "message": "require single-sign-on authentication policy", + "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Use the require single-sign-on authentication policy to require all members to log in with SSO.'" }, "ssoPolicyHelpEnd": { "message": "to require all members to log in with SSO.", - "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Enable the SSO Authentication policy to require all members to log in with SSO.'" + "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Use the require single-sign-on authentication policy to require all members to log in with SSO.'" }, "ssoPolicyHelpKeyConnector": { - "message": "SSO Authentication and Single Organization policies are required to set up Key Connector decryption." + "message": "The require SSO authentication and single organization policies are required to set up Key Connector decryption." }, "memberDecryptionOption": { "message": "Member Decryption Options" @@ -5210,5 +5264,92 @@ "example": "My Email" } } + }, + "scim": { + "message": "SCIM Provisioning", + "description": "The text, 'SCIM', is an acronymn and should not be translated." + }, + "scimDescription": { + "message": "Automatically provision users and groups with your preferred identity provider via SCIM provisioning", + "description": "the text, 'SCIM', is an acronymn and should not be translated." + }, + "scimEnabledCheckboxDesc": { + "message": "Enable SCIM", + "description": "the text, 'SCIM', is an acronymn and should not be translated." + }, + "scimEnabledCheckboxDescHelpText": { + "message": "Set up your preferred identity provider by configuring the URL and SCIM API Key", + "description": "the text, 'SCIM', is an acronymn and should not be translated." + }, + "scimApiKeyHelperText": { + "message": "This API key has access to manage users within your organization. It should be kept secret." + }, + "copyScimKey": { + "message": "Copy the SCIM API Key to your clipboard", + "description": "the text, 'SCIM' and 'API', are acronymns and should not be translated." + }, + "rotateScimKey": { + "message": "Rotate the SCIM API Key", + "description": "the text, 'SCIM' and 'API', are acronymns and should not be translated." + }, + "rotateScimKeyWarning": { + "message": "Are you sure you want to rotate the SCIM API Key? The current key will no longer work for any existing integrations.", + "description": "the text, 'SCIM' and 'API', are acronymns and should not be translated." + }, + "rotateKey": { + "message": "Rotate Key" + }, + "scimApiKey": { + "message": "SCIM API Key", + "description": "the text, 'SCIM' and 'API', are acronymns and should not be translated." + }, + "copyScimUrl": { + "message": "Copy the SCIM endpoint URL to your clipboard", + "description": "the text, 'SCIM' and 'URL', are acronymns and should not be translated." + }, + "scimUrl": { + "message": "SCIM URL", + "description": "the text, 'SCIM' and 'URL', are acronymns and should not be translated." + }, + "scimApiKeyRotated": { + "message": "The SCIM API Key has been successfully rotated", + "description": "the text, 'SCIM' and 'API', are acronymns and should not be translated." + }, + "scimSettingsSaved": { + "message": "SCIM settings have been saved successfully", + "description": "the text, 'SCIM', is an acronymn and should not be translated." + }, + "inputRequired": { + "message": "Input is required." + }, + "inputEmail": { + "message": "Input is not an email-address." + }, + "inputMinLength": { + "message": "Input must be at least $COUNT$ characters long.", + "placeholders": { + "count": { + "content": "$1", + "example": "8" + } + } + }, + "fieldsNeedAttention": { + "message": "$COUNT$ field(s) above need your attention.", + "placeholders": { + "count": { + "content": "$1", + "example": "4" + } + } + }, + "turnOn": { + "message": "Turn on" + }, + "on": { + "message": "On" + }, + "cardBrandMir": { + "message": "Mir" } } diff --git a/apps/web/src/locales/en_GB/messages.json b/apps/web/src/locales/en_GB/messages.json index 303589bd033..ed1e89fafb2 100644 --- a/apps/web/src/locales/en_GB/messages.json +++ b/apps/web/src/locales/en_GB/messages.json @@ -572,6 +572,9 @@ "createAccount": { "message": "Create account" }, + "startTrial": { + "message": "Start Trial" + }, "logIn": { "message": "Log in" }, @@ -593,6 +596,9 @@ "masterPassDesc": { "message": "The master password is the password you use to access your vault. It is very important that you do not forget your master password. There is no way to recover the password in the event that you forget it." }, + "masterPassImportant": { + "message": "Master passwords cannot be recovered if you forget it!" + }, "masterPassHintDesc": { "message": "A master password hint can help you remember your password if you forget it." }, @@ -623,10 +629,13 @@ "invalidEmail": { "message": "Invalid email address." }, - "masterPassRequired": { + "masterPasswordRequired": { "message": "Master password is required." }, - "masterPassLength": { + "confirmMasterPasswordRequired": { + "message": "Master password retype is required." + }, + "masterPasswordMinLength": { "message": "Master password must be at least 8 characters long." }, "masterPassDoesntMatch": { @@ -1155,7 +1164,7 @@ "message": "Show website icons" }, "faviconDesc": { - "message": "Show a recognizable image next to each login." + "message": "Show a recognisable image next to each login." }, "enableGravatars": { "message": "Enable Gravatars", @@ -3159,8 +3168,8 @@ "acceptPolicies": { "message": "By checking this box you agree to the following:" }, - "acceptPoliciesError": { - "message": "Terms of service and privacy policy have not been acknowledged." + "acceptPoliciesRequired": { + "message": "Terms of Service and Privacy Policy have not been acknowledged." }, "termsOfService": { "message": "Terms of service" @@ -3209,6 +3218,9 @@ "organizationIsDisabled": { "message": "Organisation is disabled." }, + "disabledOrganizationFilterError": { + "message": "Items in disabled Organisations cannot be accessed. Contact your Organisation owner for assistance." + }, "licenseIsExpired": { "message": "Licence is expired." }, @@ -3333,9 +3345,15 @@ "clone": { "message": "Clone" }, + "masterPassPolicyTitle": { + "message": "Master password requirements" + }, "masterPassPolicyDesc": { "message": "Set minimum requirements for master password strength." }, + "twoStepLoginPolicyTitle": { + "message": "Require two-step login" + }, "twoStepLoginPolicyDesc": { "message": "Require users to set up two-step login on their personal accounts." }, @@ -4802,15 +4820,15 @@ }, "ssoPolicyHelpStart": { "message": "Enable the", - "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Enable the SSO Authentication policy to require all members to log in with SSO.'" + "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Use the require single-sign-on authentication policy to require all members to log in with SSO.'" }, "ssoPolicyHelpLink": { "message": "SSO Authentication policy", - "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Enable the SSO Authentication policy to require all members to log in with SSO.'" + "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Use the require single-sign-on authentication policy to require all members to log in with SSO.'" }, "ssoPolicyHelpEnd": { "message": "to require all members to log in with SSO.", - "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Enable the SSO Authentication policy to require all members to log in with SSO.'" + "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Use the require single-sign-on authentication policy to require all members to log in with SSO.'" }, "ssoPolicyHelpKeyConnector": { "message": "SSO Authentication and Single Organisation policies are required to set up Key Connector decryption." @@ -5165,5 +5183,35 @@ "example": "My Email" } } + }, + "inputRequired": { + "message": "Input is required." + }, + "inputEmail": { + "message": "Input is not an email address." + }, + "inputMinLength": { + "message": "Input must be at least $COUNT$ characters long.", + "placeholders": { + "count": { + "content": "$1", + "example": "8" + } + } + }, + "fieldsNeedAttention": { + "message": "$COUNT$ field(s) above need your attention.", + "placeholders": { + "count": { + "content": "$1", + "example": "4" + } + } + }, + "turnOn": { + "message": "Turn on" + }, + "on": { + "message": "On" } } diff --git a/apps/web/src/locales/en_IN/messages.json b/apps/web/src/locales/en_IN/messages.json index 512fc02ca3e..e0ed27f7b5b 100644 --- a/apps/web/src/locales/en_IN/messages.json +++ b/apps/web/src/locales/en_IN/messages.json @@ -572,6 +572,9 @@ "createAccount": { "message": "Create account" }, + "startTrial": { + "message": "Start Trial" + }, "logIn": { "message": "Log in" }, @@ -593,6 +596,9 @@ "masterPassDesc": { "message": "The master password is the password you use to access your vault. It is very important that you do not forget your master password. There is no way to recover the password in the event that you forget it." }, + "masterPassImportant": { + "message": "Master passwords cannot be recovered if you forget it!" + }, "masterPassHintDesc": { "message": "A master password hint can help you remember your password if you forget it." }, @@ -623,10 +629,13 @@ "invalidEmail": { "message": "Invalid email address." }, - "masterPassRequired": { + "masterPasswordRequired": { "message": "Master password is required." }, - "masterPassLength": { + "confirmMasterPasswordRequired": { + "message": "Master password retype is required." + }, + "masterPasswordMinLength": { "message": "Master password must be at least 8 characters long." }, "masterPassDoesntMatch": { @@ -3159,7 +3168,7 @@ "acceptPolicies": { "message": "By checking this box you agree to the following:" }, - "acceptPoliciesError": { + "acceptPoliciesRequired": { "message": "Terms of Service and Privacy Policy have not been acknowledged." }, "termsOfService": { @@ -3209,6 +3218,9 @@ "organizationIsDisabled": { "message": "Organisation is disabled." }, + "disabledOrganizationFilterError": { + "message": "Items in disabled Organizations cannot be accessed. Contact your Organization owner for assistance." + }, "licenseIsExpired": { "message": "Licence is expired." }, @@ -3333,9 +3345,15 @@ "clone": { "message": "Clone" }, + "masterPassPolicyTitle": { + "message": "Master password requirements" + }, "masterPassPolicyDesc": { "message": "Set minimum requirements for master password strength." }, + "twoStepLoginPolicyTitle": { + "message": "Require two-step login" + }, "twoStepLoginPolicyDesc": { "message": "Require users to set up two-step login on their personal accounts." }, @@ -4464,10 +4482,10 @@ "message": "Your Master Password does not meet the policy requirements of this organization. In order to join the organization, you must update your Master Password now. Proceeding will log you out of your current session, requiring you to log back in. Active sessions on other devices may continue to remain active for up to one hour." }, "maximumVaultTimeout": { - "message": "Vault Timeout" + "message": "Vault timeout" }, "maximumVaultTimeoutDesc": { - "message": "Configure a maximum vault timeout for all users." + "message": "Set a maximum vault timeout for members." }, "maximumVaultTimeoutLabel": { "message": "Maximum Vault Timeout" @@ -4507,10 +4525,10 @@ "message": "Vault Timeout is not within allowed range." }, "disablePersonalVaultExport": { - "message": "Disable Personal Vault Export" + "message": "Remove individual vault export" }, "disablePersonalVaultExportDesc": { - "message": "Prohibits users from exporting their private vault data." + "message": "Do not allow members to export their individual vault data." }, "vaultExportDisabled": { "message": "Vault Export Disabled" @@ -4801,19 +4819,19 @@ "message": "Once set up, your configuration will be saved and members will be able to authenticate using their Identity Provider credentials." }, "ssoPolicyHelpStart": { - "message": "Enable the", - "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Enable the SSO Authentication policy to require all members to log in with SSO.'" + "message": "Use the", + "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Use the require single-sign-on authentication policy to require all members to log in with SSO.'" }, "ssoPolicyHelpLink": { - "message": "SSO Authentication policy", - "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Enable the SSO Authentication policy to require all members to log in with SSO.'" + "message": "require single-sign-on authentication policy", + "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Use the require single-sign-on authentication policy to require all members to log in with SSO.'" }, "ssoPolicyHelpEnd": { "message": "to require all members to log in with SSO.", - "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Enable the SSO Authentication policy to require all members to log in with SSO.'" + "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Use the require single-sign-on authentication policy to require all members to log in with SSO.'" }, "ssoPolicyHelpKeyConnector": { - "message": "SSO Authentication and Single Organization policies are required to set up Key Connector decryption." + "message": "The require SSO authentication and single organization policies are required to set up Key Connector decryption." }, "memberDecryptionOption": { "message": "Member Decryption Options" @@ -5165,5 +5183,35 @@ "example": "My Email" } } + }, + "inputRequired": { + "message": "Input is required." + }, + "inputEmail": { + "message": "Input is not an email-address." + }, + "inputMinLength": { + "message": "Input must be at least $COUNT$ characters long.", + "placeholders": { + "count": { + "content": "$1", + "example": "8" + } + } + }, + "fieldsNeedAttention": { + "message": "$COUNT$ field(s) above need your attention.", + "placeholders": { + "count": { + "content": "$1", + "example": "4" + } + } + }, + "turnOn": { + "message": "Turn on" + }, + "on": { + "message": "On" } } diff --git a/apps/web/src/locales/eo/messages.json b/apps/web/src/locales/eo/messages.json index a7c4f081971..059ee3a0ab9 100644 --- a/apps/web/src/locales/eo/messages.json +++ b/apps/web/src/locales/eo/messages.json @@ -1,6 +1,6 @@ { "pageTitle": { - "message": "$APP_NAME$ Reta Volbo", + "message": "Kasa retejo de $APP_NAME$", "description": "The title of the website in the browser window.", "placeholders": { "app_name": { @@ -10,7 +10,7 @@ } }, "whatTypeOfItem": { - "message": "Kia speco de ero estas ĉi tio?" + "message": "Kia tipo de elemento estas ĉi tio?" }, "name": { "message": "Nomo" @@ -47,10 +47,10 @@ "message": "Notoj" }, "customFields": { - "message": "Propraj Kampoj" + "message": "Propraj kampoj" }, "cardholderName": { - "message": "Nomo de Kartposedanto" + "message": "Nomo de la posedanto de la karto" }, "number": { "message": "Numero" @@ -65,7 +65,7 @@ "message": "Sekureca Kodo (CVV)" }, "identityName": { - "message": "Identeca Nomo" + "message": "Nomo de la identilo" }, "company": { "message": "Kompanio" @@ -74,10 +74,10 @@ "message": "Socia Sekureca Numero" }, "passportNumber": { - "message": "Pasporta Numero" + "message": "Numero de pasporto" }, "licenseNumber": { - "message": "Permesila Numero" + "message": "Numero de permesilo" }, "email": { "message": "Retpoŝto" @@ -86,40 +86,40 @@ "message": "Telefono" }, "january": { - "message": "januaro" + "message": "Januaro" }, "february": { "message": "februaro" }, "march": { - "message": "marto" + "message": "Marto" }, "april": { - "message": "aprilo" + "message": "Aprilo" }, "may": { - "message": "majo" + "message": "Majo" }, "june": { - "message": "junio" + "message": "Junio" }, "july": { - "message": "julio" + "message": "Julio" }, "august": { - "message": "aŭgusto" + "message": "Aŭgusto" }, "september": { - "message": "septembro" + "message": "Septembro" }, "october": { - "message": "oktobro" + "message": "Oktobro" }, "november": { - "message": "novembro" + "message": "Novembro" }, "december": { - "message": "decembro" + "message": "Decembro" }, "title": { "message": "Titolo" @@ -137,19 +137,19 @@ "message": "Dr" }, "expirationMonth": { - "message": "Finiĝa Monato" + "message": "Monato de validoperiodo" }, "expirationYear": { - "message": "Finiĝa Jaro" + "message": "Jaro de validoperiodo" }, "authenticatorKeyTotp": { - "message": "Aŭtentiga Ŝlosilo (TOTP)" + "message": "Ŝlosilo de aŭtentigo (TOTP)" }, "folder": { "message": "Dosierujo" }, "newCustomField": { - "message": "Nova Propra Kampo" + "message": "Nova propra kampo" }, "value": { "message": "Valoro" @@ -167,7 +167,7 @@ "message": "Bulea" }, "cfTypeLinked": { - "message": "Linked", + "message": "Ligita", "description": "This describes a field that is 'linked' (related) to another field." }, "remove": { @@ -191,7 +191,7 @@ "description": "Domain name. Ex. website.com" }, "domainName": { - "message": "Domain Name", + "message": "Nomo de domajno", "description": "Domain name. Ex. website.com" }, "host": { @@ -202,18 +202,18 @@ "message": "Ĝusta" }, "startsWith": { - "message": "Komencas per" + "message": "Komencas kun" }, "regEx": { "message": "Regula esprimo", "description": "A programming term, also known as 'RegEx'." }, "matchDetection": { - "message": "Match Match", + "message": "Detektilo de interrespondo", "description": "URI match detection for auto-fill." }, "defaultMatchDetection": { - "message": "Defaŭlta kongrua detekto", + "message": "Implicita detektilo de interrespondo", "description": "Default URI match detection for auto-fill." }, "never": { @@ -227,7 +227,7 @@ "description": "Toggling an expand/collapse state." }, "generatePassword": { - "message": "Generi Pasvorton" + "message": "Generi pasvorton" }, "checkPassword": { "message": "Kontrolu ĉu pasvorto estis elmontrita." @@ -242,7 +242,7 @@ } }, "passwordSafe": { - "message": "Ĉi tiu pasvorto ne troviĝis en iuj konataj rompo de datumoj. Ĝi estu sekure uzebla." + "message": "Ĉi tiu pasvorto ne estas trovita en iuj konataj branĉoj de databazo. Devas esti sekure uzeble." }, "save": { "message": "Konservi" @@ -257,13 +257,13 @@ "message": "Fermi" }, "delete": { - "message": "Forigi" + "message": "Forviŝi" }, "favorite": { - "message": "Plej ŝatata" + "message": "Preferaĵo" }, "unfavorite": { - "message": "Malfavoras" + "message": "Forigi de preferaĵo" }, "edit": { "message": "Redakti" @@ -278,7 +278,7 @@ "message": "Serĉi Favoratojn" }, "searchType": { - "message": "Serĉspeco", + "message": "Serĉo en tipo", "description": "Search item type" }, "searchVault": { @@ -294,28 +294,28 @@ "message": "Tipoj" }, "typeLogin": { - "message": "Ensaluti" + "message": "Saluto" }, "typeCard": { "message": "Karto" }, "typeIdentity": { - "message": "Identeco" + "message": "Identilo" }, "typeSecureNote": { - "message": "Sekura Noto" + "message": "Sekura noto" }, "typeLoginPlural": { - "message": "Logins" + "message": "Salutoj" }, "typeCardPlural": { - "message": "Cards" + "message": "Kartoj" }, "typeIdentityPlural": { - "message": "Identities" + "message": "Identiloj" }, "typeSecureNotePlural": { - "message": "Secure Notes" + "message": "Sekuraj notoj" }, "folders": { "message": "Dosierujoj" @@ -546,16 +546,16 @@ "message": "Forigita dosierujo" }, "loggedOut": { - "message": "Elsalutita" + "message": "Adiaŭita" }, "loginExpired": { - "message": "Via ensaluta kunsido eksvalidiĝis." + "message": "Via seanco eksvalidiĝis." }, "logOutConfirmation": { - "message": "Ĉu vi certe volas elsaluti?" + "message": "Ĉu vi certas ke vi volas adiaŭi?" }, "logOut": { - "message": "Eliri" + "message": "Adiaŭi" }, "ok": { "message": "Bone" @@ -572,8 +572,11 @@ "createAccount": { "message": "Krei konton" }, + "startTrial": { + "message": "Start Trial" + }, "logIn": { - "message": "Ensaluti" + "message": "Saluti" }, "submit": { "message": "Sendu" @@ -593,6 +596,9 @@ "masterPassDesc": { "message": "La ĉefa pasvorto estas la pasvorto, kiun vi uzas por aliri vian trezorejon. Tre gravas, ke vi ne forgesu vian ĉefan pasvorton. Ne eblas retrovi la pasvorton, se vi forgesos ĝin." }, + "masterPassImportant": { + "message": "Master passwords cannot be recovered if you forget it!" + }, "masterPassHintDesc": { "message": "Majstra pasvorta sugesto povas helpi vin memori vian pasvorton se vi forgesas ĝin." }, @@ -623,14 +629,17 @@ "invalidEmail": { "message": "Nevalida retpoŝta adreso." }, - "masterPassRequired": { - "message": "Majstra pasvorto necesas." + "masterPasswordRequired": { + "message": "Master password is required." }, - "masterPassLength": { - "message": "Majstra pasvorto devas havi almenaŭ 8 signojn." + "confirmMasterPasswordRequired": { + "message": "Master password retype is required." + }, + "masterPasswordMinLength": { + "message": "Master password must be at least 8 characters long." }, "masterPassDoesntMatch": { - "message": "Majstra pasvorta konfirmo ne kongruas." + "message": "La konfirmo de la ĉefa pasvorto ne interrespondas." }, "newAccountCreated": { "message": "Via nova konto kreiĝis! Vi nun povas ensaluti." @@ -727,7 +736,7 @@ "message": "Sendu retpoŝtan kontrol-kodon denove" }, "useAnotherTwoStepMethod": { - "message": "Uzu alian du-paŝan ensalutan metodon" + "message": "Uzu alian metodon de identigo en du-ŝtupa saluto" }, "insertYubiKey": { "message": "Enmetu vian YubiKey en la USB-havenon de via komputilo, tiam tuŝu ĝian butonon." @@ -736,7 +745,7 @@ "message": "Enmetu vian sekurecan ŝlosilon en la USB-havenon de via komputilo. Se ĝi havas butonon, tuŝu ĝin." }, "loginUnavailable": { - "message": "Ensaluto Neatingebla" + "message": "Saluto ne disponebla" }, "noTwoStepProviders": { "message": "Ĉi tiu konto havas du-paŝan ensaluton ebligita, tamen neniu el la agorditaj du-paŝaj provizantoj estas subtenata de ĉi tiu retumilo." @@ -745,7 +754,7 @@ "message": "Bonvolu uzi subtenatan tTT-legilon (kiel Chrome) kaj / aŭ aldoni pliajn provizantojn pli bone subtenatajn tra tTT-legiloj (kiel aŭtentikiga programo)." }, "twoStepOptions": { - "message": "Duŝtupaj Ensalutaj Elektoj" + "message": "Elektebloj de la du-ŝtupa saluto" }, "recoveryCodeDesc": { "message": "Ĉu vi perdis aliron al ĉiuj viaj du-faktoraj provizantoj? Uzu vian reakiran kodon por malŝalti ĉiujn du-faktorajn provizantojn de via konto." @@ -965,16 +974,16 @@ } }, "loggedOutWarning": { - "message": "Daŭrigi vin elsalutos de via nuna sesio, postulante vin denove ensaluti. Aktivaj sesioj sur aliaj aparatoj povas daŭre resti aktivaj ĝis unu horo." + "message": "Prilabori vian adiaŭadon de la nuna seanco, necesigos vin saluti denove. La seancoj aktivaj sur aliaj aparatoj povas resti aktivaj ankoraŭ unu horon." }, "emailChanged": { "message": "Retpoŝto Ŝanĝis" }, "logBackIn": { - "message": "Bonvolu ensaluti denove." + "message": "Bonvolu saluti refoje." }, "logBackInOthersToo": { - "message": "Bonvolu ensaluti. Se vi uzas aliajn Bitwarden-programojn, elsalutu kaj reen al tiuj ankaŭ." + "message": "Bonvolu saluti refoje. Se vi uzas aliajn programojn de Bitwarden, adiaŭu kaj ankaŭ salutu ilin." }, "changeMasterPassword": { "message": "Ŝanĝi Majstran Pasvorton" @@ -1037,7 +1046,7 @@ "message": "Ĉu vi zorgas pri tio, ke via konto estas ensalutinta sur alia aparato? Sekvu sube por senrajtigi ĉiujn komputilojn aŭ aparatojn, kiujn vi antaŭe uzis. Ĉi tiu sekureca paŝo rekomendas se vi antaŭe uzis publikan komputilon aŭ hazarde konservis vian pasvorton sur aparato, kiu ne estas via. Ĉi tiu paŝo ankaŭ malplenigos ĉiujn antaŭe memoritajn du-paŝajn ensalutajn sesiojn. " }, "deauthorizeSessionsWarning": { - "message": "La daŭrigo ankaŭ elsalutos vin de via nuna sesio, postulante vin denove ensaluti. Oni ankaŭ petos vin du-ŝtupa ensaluto, se ĝi estas ebligita. Aktivaj sesioj sur aliaj aparatoj povas daŭre resti aktivaj ĝis ĝis unu horo. " + "message": "Se vi daŭrigos vian adiaŭadon de la nuna seanco, necesos vin saluti denove. Oni ankaŭ demandos de vi du-faktoran aŭtentigon, se tiu elekteblo estas ebligita. La seancoj aktivaj sur aliaj aparatoj povas resti daŭre aktivaj ankoraŭ unu horon." }, "sessionsDeauthorized": { "message": "Ĉiuj Sesioj Neaŭtorizitaj" @@ -1112,7 +1121,7 @@ "message": "Nenio estis importita." }, "importEncKeyError": { - "message": "Error decrypting the exported file. Your encryption key does not match the encryption key used export the data." + "message": "Eraro de deĉifrado de la elportaĵo. Via ŝlosilo de ĉifrado ne interrespondas kun la ŝlosilo de ĉifrado uzita por elporti la datenon." }, "selectFormat": { "message": "Elektu la formaton de la importa dosiero" @@ -1134,7 +1143,7 @@ } }, "options": { - "message": "Opcioj" + "message": "Elektebloj" }, "preferences": { "message": "Preferences" @@ -1149,7 +1158,7 @@ "message": "Lingvo" }, "languageDesc": { - "message": "Ŝanĝi la lingvon uzatan de la retejo-volbo." + "message": "Ŝanĝi la lingvon uzatan por la retejo de la kaso." }, "enableFavicon": { "message": "Show website icons" @@ -1214,7 +1223,7 @@ "message": "Domajnoj ĝisdatigitaj" }, "twoStepLogin": { - "message": "Du-ŝtupa ensaluto" + "message": "Du-ŝtupa saluto" }, "twoStepLoginDesc": { "message": "Sekurigu vian konton postulante plian paŝon kiam vi ensalutas." @@ -1264,7 +1273,7 @@ "message": "Administri" }, "disable": { - "message": "Malebligi" + "message": "Neebligi" }, "deactivate": { "message": "Deactivate" @@ -1300,7 +1309,7 @@ "message": "Skani ĉi tiun QR-kodon per via aŭtentikiga programo" }, "key": { - "message": "Ŝlosilo" + "message": "Konigilo" }, "twoStepAuthenticatorEnterCode": { "message": "Enigu la rezultan 6-ciferan konfirmkodon de la programo" @@ -1378,7 +1387,7 @@ "message": "YubiKeys ĝisdatigis" }, "disableAllKeys": { - "message": "Malebligi ĉiujn ŝlosilojn" + "message": "Neebligi ĉiujn ŝlosilojn" }, "twoFactorDuoDesc": { "message": "Enmetu la informojn pri Bitwarden-aplikaĵo de via panelo de Duo Admin." @@ -1453,7 +1462,7 @@ "message": "Web vault and browser extensions on a desktop/laptop with a WebAuthn enabled browser (Chrome, Opera, Vivaldi, or Firefox with FIDO U2F enabled)." }, "twoFactorRecoveryYourCode": { - "message": "Via Bitwarden-du-ŝtupa ensaluta reakiro-kodo" + "message": "Via kodo de senpaneigo de la du-ŝtupa saluto de Bitwarden" }, "twoFactorRecoveryNoCode": { "message": "Vi ankoraŭ ne ebligis du-paŝajn ensalutajn provizantojn. Post kiam vi ebligis du-ŝtupan ensalut-provizanton, vi povas kontroli ĉi tie vian reakiran kodon." @@ -2383,10 +2392,10 @@ "message": "Ebligita / ĝisdatigita du-ŝtupa ensaluto." }, "disabled2fa": { - "message": "Malebligita du-ŝtupa ensaluto." + "message": "Neebligita du-ŝtupa saluto." }, "recovered2fa": { - "message": "Rekuperita konto post du-ŝtupa ensaluto." + "message": "Konto senpaneigita el du-ŝtupa saluto." }, "failedLogin": { "message": "Ensaluta provo malsukcesis kun malĝusta pasvorto." @@ -2857,10 +2866,10 @@ "message": "Se vi ne povas aliri vian konton per viaj normalaj du-ŝtupaj ensalutaj metodoj, vi povas uzi vian du-ŝtupan ensalutan rekuperan kodon por malŝalti ĉiujn du-ŝtupajn provizantojn en via konto." }, "recoverAccountTwoStep": { - "message": "Rekuperi Ensaluton Du-Paŝan" + "message": "Senpaneigi la du-faktoran aŭtentigon de la konto" }, "twoStepRecoverDisabled": { - "message": "Du-ŝtupa ensaluto estas malŝaltita en via konto." + "message": "Du-faktora aŭtentigo estas neebligita en via konto." }, "learnMore": { "message": "Lernu pli" @@ -2983,7 +2992,7 @@ "message": "Nomo de Konto-Posedanto" }, "bankAccountType": { - "message": "Kontospeco" + "message": "Tipo de konto" }, "bankAccountTypeCompany": { "message": "Kompanio (Komerco)" @@ -3159,8 +3168,8 @@ "acceptPolicies": { "message": "Markante ĉi tiun keston vi konsentas pri jeno:" }, - "acceptPoliciesError": { - "message": "Kondiĉoj pri Servo kaj Privateca Politiko ne estis agnoskitaj." + "acceptPoliciesRequired": { + "message": "Terms of Service and Privacy Policy have not been acknowledged." }, "termsOfService": { "message": "Kondiĉoj por Servo" @@ -3209,6 +3218,9 @@ "organizationIsDisabled": { "message": "Organizo estas malŝaltita." }, + "disabledOrganizationFilterError": { + "message": "Items in disabled Organizations cannot be accessed. Contact your Organization owner for assistance." + }, "licenseIsExpired": { "message": "Licenco eksvalidiĝis." }, @@ -3333,9 +3345,15 @@ "clone": { "message": "Kloni" }, + "masterPassPolicyTitle": { + "message": "Master password requirements" + }, "masterPassPolicyDesc": { "message": "Agordi minimumajn postulojn por majstra pasvorta forto." }, + "twoStepLoginPolicyTitle": { + "message": "Require two-step login" + }, "twoStepLoginPolicyDesc": { "message": "Postuli uzantojn agordi du-ŝtupan ensaluton en siaj personaj kontoj." }, @@ -3528,7 +3546,7 @@ "message": "Identigilo" }, "organizationIdentifier": { - "message": "Organiza Identigilo" + "message": "Identigilo de la organizo" }, "ssoLogInWithOrgIdentifier": { "message": "Ensalutu per la unika ensaluta portalo de via organizo. Bonvolu enigi la identigilon de via organizo por komenci." @@ -3552,7 +3570,7 @@ "message": "SSO-Validado Malsukcesis" }, "ssoIdentifierRequired": { - "message": "Organiza Identigilo necesas." + "message": "La identigilo de la organizo estas postulata." }, "unlinkSso": { "message": "Malkonekti SSO" @@ -3664,7 +3682,7 @@ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "disabled": { - "message": "Malebligita" + "message": "Neebligita" }, "deactivated": { "message": "Deactivated" @@ -3871,7 +3889,7 @@ "message": "Krizaliro malakceptita" }, "passwordResetFor": { - "message": "Pasvorta restarigo por $USER $. Vi nun povas ensaluti per la nova pasvorto.", + "message": "Pravaloriziĝis la pasvorto de $USER$. Vi nun povas saluti per la nova pasvorto.", "placeholders": { "user": { "content": "$1", @@ -3892,7 +3910,7 @@ "message": "Pro entreprena politiko, vi ne rajtas konservi artikolojn al via persona trezorejo. Ŝanĝu la opcion Proprieto al organizo kaj elektu el disponeblaj Kolektoj." }, "disableSend": { - "message": "Malebligi Sendi" + "message": "Neebligi la Send" }, "disableSendPolicyDesc": { "message": "Ne permesu al uzantoj krei aŭ redakti Bitwarden Sendon. Forigi ekzistantan Sendon estas ankoraŭ permesita.", @@ -3902,7 +3920,7 @@ "message": "Organizaj uzantoj, kiuj povas administri la politikojn de la organizo, estas esceptitaj de la devigo de ĉi tiu politiko." }, "sendDisabled": { - "message": "Sendu malebligita", + "message": "Send neebligita", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendDisabledWarning": { @@ -3910,7 +3928,7 @@ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendOptions": { - "message": "Send Options", + "message": "Send options", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendOptionsPolicyDesc": { @@ -3921,7 +3939,7 @@ "message": "Organization users that can manage the organization's policies are exempt from this policy's enforcement." }, "disableHideEmail": { - "message": "Do not allow users to hide their email address from recipients when creating or editing a Send.", + "message": "Always show member’s email address with recipients when creating or editing a send.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendOptionsPolicyInEffect": { @@ -4217,10 +4235,10 @@ "message": "Enrollment will allow organization administrators to change your master password" }, "resetPasswordPolicy": { - "message": "Master Password Reset" + "message": "Master password reset" }, "resetPasswordPolicyDescription": { - "message": "Allow administrators in the organization to reset organization users' master password." + "message": "Allow admins to reset master passwords for members." }, "resetPasswordPolicyWarning": { "message": "Users in the organization will need to self-enroll or be auto-enrolled before administrators can reset their master password." @@ -4241,7 +4259,7 @@ "message": "This organization has an enterprise policy that will automatically enroll you in password reset. Enrollment will allow organization administrators to change your master password." }, "resetPasswordOrgKeysError": { - "message": "Organization Keys response is null" + "message": "La respondo de la identigilo de la organizo estas nula" }, "resetPasswordDetailsError": { "message": "Reset Password Details response is null" @@ -4464,10 +4482,10 @@ "message": "Your Master Password does not meet the policy requirements of this organization. In order to join the organization, you must update your Master Password now. Proceeding will log you out of your current session, requiring you to log back in. Active sessions on other devices may continue to remain active for up to one hour." }, "maximumVaultTimeout": { - "message": "Vault Timeout" + "message": "Vault timeout" }, "maximumVaultTimeoutDesc": { - "message": "Configure a maximum vault timeout for all users." + "message": "Set a maximum vault timeout for members." }, "maximumVaultTimeoutLabel": { "message": "Maximum Vault Timeout" @@ -4507,10 +4525,10 @@ "message": "Vault Timeout is not within allowed range." }, "disablePersonalVaultExport": { - "message": "Disable Personal Vault Export" + "message": "Remove individual vault export" }, "disablePersonalVaultExportDesc": { - "message": "Prohibits users from exporting their private vault data." + "message": "Do not allow members to export their individual vault data." }, "vaultExportDisabled": { "message": "Vault Export Disabled" @@ -4753,7 +4771,7 @@ "message": "Key Connector error: make sure Key Connector is available and working correctly." }, "keyConnectorUrl": { - "message": "Key Connector URL" + "message": "URL de la Key Connector" }, "sendVerificationCode": { "message": "Send a verification code to your email" @@ -4801,19 +4819,19 @@ "message": "Once set up, your configuration will be saved and members will be able to authenticate using their Identity Provider credentials." }, "ssoPolicyHelpStart": { - "message": "Enable the", - "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Enable the SSO Authentication policy to require all members to log in with SSO.'" + "message": "Use the", + "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Use the require single-sign-on authentication policy to require all members to log in with SSO.'" }, "ssoPolicyHelpLink": { - "message": "SSO Authentication policy", - "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Enable the SSO Authentication policy to require all members to log in with SSO.'" + "message": "require single-sign-on authentication policy", + "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Use the require single-sign-on authentication policy to require all members to log in with SSO.'" }, "ssoPolicyHelpEnd": { "message": "to require all members to log in with SSO.", - "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Enable the SSO Authentication policy to require all members to log in with SSO.'" + "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Use the require single-sign-on authentication policy to require all members to log in with SSO.'" }, "ssoPolicyHelpKeyConnector": { - "message": "SSO Authentication and Single Organization policies are required to set up Key Connector decryption." + "message": "The require SSO authentication and single organization policies are required to set up Key Connector decryption." }, "memberDecryptionOption": { "message": "Member Decryption Options" @@ -4837,10 +4855,10 @@ "message": "Disabled SSO" }, "enabledKeyConnector": { - "message": "Enabled Key Connector" + "message": "Aktivigita Key Connector" }, "disabledKeyConnector": { - "message": "Disabled Key Connector" + "message": "Neebligita Key Connector" }, "keyConnectorWarning": { "message": "Once members begin using Key Connector, your Organization cannot revert to Master Password decryption. Proceed only if you are comfortable deploying and managing a key server." @@ -5165,5 +5183,35 @@ "example": "My Email" } } + }, + "inputRequired": { + "message": "Input is required." + }, + "inputEmail": { + "message": "Input is not an email-address." + }, + "inputMinLength": { + "message": "Input must be at least $COUNT$ characters long.", + "placeholders": { + "count": { + "content": "$1", + "example": "8" + } + } + }, + "fieldsNeedAttention": { + "message": "$COUNT$ field(s) above need your attention.", + "placeholders": { + "count": { + "content": "$1", + "example": "4" + } + } + }, + "turnOn": { + "message": "Turn on" + }, + "on": { + "message": "On" } } diff --git a/apps/web/src/locales/es/messages.json b/apps/web/src/locales/es/messages.json index c3a57c9f652..1a5991a4aa6 100644 --- a/apps/web/src/locales/es/messages.json +++ b/apps/web/src/locales/es/messages.json @@ -428,16 +428,16 @@ "message": "Mi caja fuerte" }, "allVaults": { - "message": "Todas las bóvedas" + "message": "Todas las cajas fuertes" }, "vault": { "message": "Caja fuerte" }, "vaults": { - "message": "Bóvedas" + "message": "Cajas fuertes" }, "vaultItems": { - "message": "Elementos de la bóveda" + "message": "Elementos de la caja fuerte" }, "moveSelectedToOrg": { "message": "Mover los seleccionados a la organización" @@ -488,7 +488,7 @@ "message": "Elemento editado" }, "movedItemToOrg": { - "message": "$ITEMNAME$ se desplazó a $ORGNAME$", + "message": "$ITEMNAME$ se movió a $ORGNAME$", "placeholders": { "itemname": { "content": "$1", @@ -572,6 +572,9 @@ "createAccount": { "message": "Crear cuenta" }, + "startTrial": { + "message": "Iniciar período de prueba" + }, "logIn": { "message": "Identificarse" }, @@ -593,6 +596,9 @@ "masterPassDesc": { "message": "La contraseña maestra es la clave que utilizas para acceder a tu caja fuerte. Es muy importante que no olvides tu contraseña maestra. No hay forma de recuperarla si la olvidas." }, + "masterPassImportant": { + "message": "¡Las contraseñas maestras no pueden ser recuperadas si las olvidas!" + }, "masterPassHintDesc": { "message": "Una pista de tu contraseña maestra puede ayudarte a recordarla en caso de que la olvides." }, @@ -623,10 +629,13 @@ "invalidEmail": { "message": "Correo electrónico no válido." }, - "masterPassRequired": { - "message": "Contraseña maestra requerida." + "masterPasswordRequired": { + "message": "Se requiere una contraseña maestra." }, - "masterPassLength": { + "confirmMasterPasswordRequired": { + "message": "Se requiere volver a teclear la contraseña maestra." + }, + "masterPasswordMinLength": { "message": "La contraseña maestra debe tener al menos 8 caracteres." }, "masterPassDoesntMatch": { @@ -667,7 +676,7 @@ "message": "Contraseña maestra no válida" }, "lockNow": { - "message": "Bloquear" + "message": "Bloquear ahora" }, "noItemsInList": { "message": "No hay elementos que listar." @@ -787,7 +796,7 @@ "message": "Utilice cualquier clave de seguridad WebAuthn habilitada para acceder a su cuenta." }, "webAuthnMigrated": { - "message": "(Migrado del FIDO)" + "message": "(Migrado desde FIDO)" }, "emailTitle": { "message": "Correo electrónico" @@ -832,7 +841,7 @@ } }, "moveSelectedItemsCountDesc": { - "message": "Ha seleccionado $COUNT$ elemento(s). $MOVEABLE_COUNT$ elemento(s) pueden ser movidos a una organización, $NONMOVEABLE_COUNT$ no puede.", + "message": "Ha seleccionado $COUNT$ elemento(s). Se pueden mover $MOVEABLE_COUNT$ elemento(s) a una organización, no se pueden mover $NONMOVEABLE_COUNT$.", "placeholders": { "count": { "content": "$1", @@ -924,7 +933,7 @@ "message": "Separador de palabras" }, "capitalize": { - "message": "Mayúsculas iniciales", + "message": "Capitalizar", "description": "Make the first letter of a work uppercase." }, "includeNumber": { @@ -1076,7 +1085,7 @@ "message": "Cuenta eliminada" }, "accountDeletedDesc": { - "message": "Tu cuenta ha sido cerrada y toda la información asociada ha sido eliminada." + "message": "Tu cuenta de Bitwarden y los datos de tu caja fuerte fueron eliminados permanentemente." }, "myAccount": { "message": "Mi cuenta" @@ -1152,10 +1161,10 @@ "message": "Cambiar el idioma utilizado en la caja fuerte web." }, "enableFavicon": { - "message": "Show website icons" + "message": "Mostrar los iconos del sitio web" }, "faviconDesc": { - "message": "Show a recognizable image next to each login." + "message": "Mostrar una imagen reconocible junto a cada inicio de sesión." }, "enableGravatars": { "message": "Habilitar Gravatars", @@ -1239,7 +1248,7 @@ "message": "Activado" }, "activate": { - "message": "Activate" + "message": "Activar" }, "premium": { "message": "Premium", @@ -1267,7 +1276,7 @@ "message": "Desactivar" }, "deactivate": { - "message": "Deactivate" + "message": "Desactivar" }, "twoStepLoginProviderEnabled": { "message": "Este proveedor de autenticación en dos pasos está habilitado para tu cuenta." @@ -1548,7 +1557,7 @@ } }, "weakPasswordsReport": { - "message": "Informe de contraseñas débiles" + "message": "Contraseñas débiles" }, "weakPasswordsReportDesc": { "message": "Contraseñas débiles pueden ser fácilmente adivinadas por hackers y herramientas automatizadas que se utilizan para descifrar contraseñas- El generador de contraseñas de Bitwarden puede ayudarle a crear contraseñas fuertes." @@ -1569,7 +1578,7 @@ "message": "No hay elementos en su caja fuerte que tengan contraseñas débiles." }, "reusedPasswordsReport": { - "message": "Informe de contraseñas reutilizadas" + "message": "Contraseñas reutilizadas" }, "reusedPasswordsReportDesc": { "message": "Si un servicio que usa está comprometido, reutilizar la misma contraseña en otros lugares puede permitir que los hackers accedan fácilmente a más de sus cuentas en línea. Debe utilizar una contraseña única para cada cuenta o servicio." @@ -1590,7 +1599,7 @@ "message": "No hay inicios de sesión en su caja fuerte que tengan contraseñas que esten siendo reutilizadas." }, "reusedXTimes": { - "message": "Reutilizada $COUNT$ vez/veces", + "message": "Reutilizada $COUNT$ veces", "placeholders": { "count": { "content": "$1", @@ -1620,7 +1629,7 @@ } }, "goodNews": { - "message": "Buenas Noticias", + "message": "Buenas noticias", "description": "ex. Good News, No Breached Accounts Found!" }, "breachUsernameFound": { @@ -1673,7 +1682,7 @@ "description": "Add more credit to your account's balance." }, "amount": { - "message": "Importe", + "message": "Cantidad", "description": "Dollar amount, or quantity." }, "creditDelayed": { @@ -1780,7 +1789,7 @@ "message": "mes" }, "monthAbbr": { - "message": "mo.", + "message": "mes", "description": "Short abbreviation for 'month'" }, "paymentChargedAnnually": { @@ -1802,7 +1811,7 @@ "message": "Información de pago" }, "billingInformation": { - "message": "Información de Facturación" + "message": "Información de facturación" }, "creditCard": { "message": "Tarjeta de crédito" @@ -1844,7 +1853,7 @@ "message": "Estado" }, "nextCharge": { - "message": "Cargo siguiente" + "message": "Siguiente cobro" }, "details": { "message": "Detalles" @@ -1853,7 +1862,7 @@ "message": "Descargar licencia" }, "updateLicense": { - "message": "Actualizar Licencia" + "message": "Actualizar licencia" }, "updatedLicense": { "message": "Licencia actualizada" @@ -1893,7 +1902,7 @@ "message": "Añadir método de pago" }, "changePaymentMethod": { - "message": "Cambiar Método de Pago" + "message": "Cambiar método de pago" }, "invoices": { "message": "Facturas" @@ -2038,7 +2047,7 @@ "description": "Free as in 'free beer'." }, "planDescFree": { - "message": "Para usuarios de prueba o personales, permite compartir con $COUNT$ usuario más.", + "message": "Para usuarios de prueba o personales, permite compartir con $COUNT$ usuarios más.", "placeholders": { "count": { "content": "$1", @@ -2062,7 +2071,7 @@ "message": "Empresas" }, "planDescEnterprise": { - "message": "Para empresas u otras organizaciones grandes." + "message": "Para empresas u otras grandes organizaciones." }, "freeForever": { "message": "Gratis para siempre" @@ -2233,10 +2242,10 @@ "message": "¿Estás seguro de que deseas eliminar a este usuario?" }, "deactivateUserConfirmation": { - "message": "The member will no longer have access to the organization, but will still have access to their individual vault." + "message": "El miembro ya no tendrá acceso a la organización, pero todavía tendrá acceso a su caja fuerte individual." }, "activateUserConfirmation": { - "message": "Are you sure you want to activate this user, granting them access to the organization?" + "message": "¿Está seguro de que desea activar este usuario, concediéndole acceso a la organización?" }, "removeUserConfirmationKeyConnector": { "message": "¡Advertencia! Este usuario requiere Conector de Clave para administrar su cifrado. Eliminar a este usuario de tu organización deshabilitará permanentemente su cuenta. Esta acción no se puede deshacer. ¿Quieres continuar?" @@ -2584,7 +2593,7 @@ } }, "deactivatedUserId": { - "message": "Deactivated user $ID$.", + "message": "Usuario $ID$ desactivado.", "placeholders": { "id": { "content": "$1", @@ -2593,7 +2602,7 @@ } }, "activatedUserId": { - "message": "Activated user $ID$.", + "message": "Usuario $ID$ activado.", "placeholders": { "id": { "content": "$1", @@ -2602,7 +2611,7 @@ } }, "deactivateUserId": { - "message": "Deactivate user $ID$?", + "message": "¿Desactivar el usuario $ID$?", "placeholders": { "id": { "content": "$1", @@ -2611,7 +2620,7 @@ } }, "activateUserId": { - "message": "Activate user $ID$?", + "message": "¿Activar el usuario $ID$?", "placeholders": { "id": { "content": "$1", @@ -3159,8 +3168,8 @@ "acceptPolicies": { "message": "Al seleccionar esta casilla, acepta lo siguiente:" }, - "acceptPoliciesError": { - "message": "Todavía no has aceptado los términos del servicio y la política de privacidad." + "acceptPoliciesRequired": { + "message": "No ha aceptado los términos del servicio y la política de privacidad." }, "termsOfService": { "message": "Términos y condiciones del servicio" @@ -3209,6 +3218,9 @@ "organizationIsDisabled": { "message": "La organización está desactivada." }, + "disabledOrganizationFilterError": { + "message": "Items in disabled Organizations cannot be accessed. Contact your Organization owner for assistance." + }, "licenseIsExpired": { "message": "Licencia expirada." }, @@ -3333,9 +3345,15 @@ "clone": { "message": "Clonar" }, + "masterPassPolicyTitle": { + "message": "Requisitos de la contraseña maestra" + }, "masterPassPolicyDesc": { "message": "Establecer requisitos mínimos para la fortaleza de la contraseña maestra." }, + "twoStepLoginPolicyTitle": { + "message": "Requiere inicio de sesión en dos pasos" + }, "twoStepLoginPolicyDesc": { "message": "Requiere que los usuarios establezcan un inicio de sesión en dos pasos en sus cuentas personales." }, @@ -3667,7 +3685,7 @@ "message": "Deshabilitado" }, "deactivated": { - "message": "Deactivated" + "message": "Desactivado" }, "sendLink": { "message": "Enlace Send", @@ -4307,10 +4325,10 @@ "message": "Eliminado con éxito" }, "bulkDeactivatedMessage": { - "message": "Deactivated successfully" + "message": "Desactivado correctamente" }, "bulkActivatedMessage": { - "message": "Activated successfully" + "message": "Activado correctamente" }, "bulkFilteredMessage": { "message": "Excluido, no aplicable a esta acción." @@ -4322,10 +4340,10 @@ "message": "Eliminar usuarios" }, "deactivateUsers": { - "message": "Deactivate Users" + "message": "Desactivar usuarios" }, "activateUsers": { - "message": "Activate Users" + "message": "Activar usuarios" }, "error": { "message": "Error" @@ -4609,22 +4627,22 @@ "message": "Tipo de enlace" }, "idpSingleSignOnServiceUrl": { - "message": "Single Sign On Service URL" + "message": "URL del servicio de inicio de sesión único" }, "idpSingleLogoutServiceUrl": { "message": "Single Log Out Service URL" }, "idpX509PublicCert": { - "message": "X509 Public Certificate" + "message": "Certificado público X509" }, "idpOutboundSigningAlgorithm": { "message": "Outbound Signing Algorithm" }, "idpAllowUnsolicitedAuthnResponse": { - "message": "Allow unsolicited authentication response" + "message": "Permitir respuestas de autenticación no solicitadas" }, "idpAllowOutboundLogoutRequests": { - "message": "Allow outbound logout requests" + "message": "Permitir peticiones de cierre de sesión" }, "idpSignAuthenticationRequests": { "message": "Sign authentication requests" @@ -4657,10 +4675,10 @@ "message": "Reclaimed free plan" }, "redeem": { - "message": "Redeem" + "message": "Canjear" }, "sponsoredFamiliesSelectOffer": { - "message": "Select the organization you would like sponsored" + "message": "Seleccione la organización que desea patrocinar" }, "familiesSponsoringOrgSelect": { "message": "Which Free Families offer would you like to redeem?" @@ -4802,15 +4820,15 @@ }, "ssoPolicyHelpStart": { "message": "Activar el", - "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Enable the SSO Authentication policy to require all members to log in with SSO.'" + "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Use the require single-sign-on authentication policy to require all members to log in with SSO.'" }, "ssoPolicyHelpLink": { "message": "Política de autenticación SSO", - "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Enable the SSO Authentication policy to require all members to log in with SSO.'" + "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Use the require single-sign-on authentication policy to require all members to log in with SSO.'" }, "ssoPolicyHelpEnd": { "message": "para requerir que todos los miembros inicien sesión con SSO.", - "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Enable the SSO Authentication policy to require all members to log in with SSO.'" + "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Use the require single-sign-on authentication policy to require all members to log in with SSO.'" }, "ssoPolicyHelpKeyConnector": { "message": "Se requieren políticas de autenticación de SSO y de una Única Organización para configurar el descifrado del Conector de Claves." @@ -4879,10 +4897,10 @@ "message": "GRATIS con patrocinio" }, "viewBillingSyncToken": { - "message": "View Billing Sync Token" + "message": "Ver el token de sincronización de facturación" }, "generateBillingSyncToken": { - "message": "Generate Billing Sync Token" + "message": "Generar el token de sincronización de facturación" }, "copyPasteBillingSync": { "message": "Copy and paste this token into the Billing Sync settings of your self-hosted organization." @@ -4891,16 +4909,16 @@ "message": "Your Billing Sync token can access and edit this organization's subscription settings." }, "manageBillingSync": { - "message": "Manage Billing Sync" + "message": "Administrar la sincronización de facturación" }, "setUpBillingSync": { - "message": "Set Up Billing Sync" + "message": "Configurar la sincronización de facturación" }, "generateToken": { - "message": "Generate Token" + "message": "Generar token" }, "rotateToken": { - "message": "Rotate Token" + "message": "Rotar token" }, "rotateBillingSyncTokenWarning": { "message": "If you proceed, you will need to re-setup billing sync on your self-hosted server." @@ -4915,7 +4933,7 @@ "message": "To set-up your organization on your own server, you will need to upload your license file. To support Free Families plans and advanced billing capabilities for your self-hosted organization, you will need to set up billing sync." }, "billingSyncApiKeyRotated": { - "message": "Token rotated." + "message": "Token rotado." }, "billingSync": { "message": "Billing Sync" @@ -4930,25 +4948,25 @@ "message": "Billing Sync Token" }, "active": { - "message": "Active" + "message": "Activo" }, "inactive": { "message": "Inactive" }, "sentAwaitingSync": { - "message": "Sent (Awaiting Sync)" + "message": "Enviado (esperando sincronización)" }, "sent": { - "message": "Sent" + "message": "Enviado" }, "requestRemoved": { - "message": "Removed (Awaiting Sync)" + "message": "Eliminado (esperando sincronización)" }, "requested": { - "message": "Requested" + "message": "Solicitado" }, "formErrorSummaryPlural": { - "message": "$COUNT$ fields above need your attention.", + "message": "$COUNT$ campos anteriores necesitan tu atención.", "placeholders": { "count": { "content": "$1", @@ -4957,10 +4975,10 @@ } }, "formErrorSummarySingle": { - "message": "1 field above needs your attention." + "message": "1 campo de los anteriores necesita su atención." }, "fieldRequiredError": { - "message": "$FIELDNAME$ is required.", + "message": "$FIELDNAME$ es requerido.", "placeholders": { "fieldname": { "content": "$1", @@ -4969,19 +4987,19 @@ } }, "required": { - "message": "required" + "message": "requerido" }, "idpSingleSignOnServiceUrlRequired": { - "message": "Required if Entity ID is not a URL." + "message": "Requerido si el ID de la entidad no es una URL." }, "openIdOptionalCustomizations": { - "message": "Optional Customizations" + "message": "Personalizaciones opcionales" }, "openIdAuthorityRequired": { - "message": "Required if Authority is not valid." + "message": "Requerido si la Autoridad no es válida." }, "separateMultipleWithComma": { - "message": "Separate multiple with a comma." + "message": "Separados por comas." }, "sessionTimeout": { "message": "Su sesión ha expirado. Por favor, vuelva e intente iniciar sesión de nuevo." @@ -5011,50 +5029,50 @@ } }, "accessDenied": { - "message": "Access Denied. You do not have permission to view this page." + "message": "Acceso denegado. No tiene permiso para ver esta página." }, "masterPassword": { - "message": "Master Password" + "message": "Contraseña maestra" }, "security": { - "message": "Security" + "message": "Seguridad" }, "keys": { - "message": "Keys" + "message": "Claves" }, "billingHistory": { - "message": "Billing History" + "message": "Historial de facturación" }, "backToReports": { - "message": "Back to Reports" + "message": "Volver a los informes" }, "organizationPicker": { - "message": "Organization picker" + "message": "Nombre de la organización" }, "currentOrganization": { - "message": "Current organization", + "message": "Organización actual", "description": "This is used by screen readers to indicate the organization that is currently being shown to the user." }, "accountSettings": { - "message": "Account Settings" + "message": "Configuración de la cuenta" }, "generator": { - "message": "Generator" + "message": "Generador" }, "whatWouldYouLikeToGenerate": { - "message": "What would you like to generate?" + "message": "¿Qué desea generar?" }, "passwordType": { - "message": "Password Type" + "message": "Tipo de contraseña" }, "regenerateUsername": { - "message": "Regenerate Username" + "message": "Regenerar nombre de usuario" }, "generateUsername": { - "message": "Generate Username" + "message": "Generar nombre de usuario" }, "usernameType": { - "message": "Username Type" + "message": "Tipo de nombre de usuario" }, "plusAddressedEmail": { "message": "Plus Addressed Email", @@ -5070,14 +5088,14 @@ "message": "Use your domain's configured catch-all inbox." }, "random": { - "message": "Random", + "message": "Aleatorio", "description": "Generates domain-based username using random letters" }, "randomWord": { - "message": "Random Word" + "message": "Palabra aleatoria" }, "service": { - "message": "Service" + "message": "Servicio" }, "unknownCipher": { "message": "Unknown Item, you may need to request permission to access this item." @@ -5086,7 +5104,7 @@ "message": "You cannot redeem for the active account. Enter a different email." }, "revokeWhenExpired": { - "message": "Expires $DATE$", + "message": "Caduca $DATE$", "placeholders": { "date": { "content": "$1", @@ -5095,7 +5113,7 @@ } }, "awaitingSyncSingular": { - "message": "Token rotated $DAYS$ day ago. Update the billing sync token in your self-hosted organization settings.", + "message": "El token se ha rotado hace $DAYS$ día. Actualice el token de sincronización de facturación en los ajustes de su organización.", "placeholders": { "days": { "content": "$1", @@ -5104,7 +5122,7 @@ } }, "awaitingSyncPlural": { - "message": "Token rotated $DAYS$ days ago. Update the billing sync token in your self-hosted organization settings.", + "message": "El token se ha rotado hace $DAYS$ días. Actualice el token de sincronización de facturación en los ajustes de su organización.", "placeholders": { "days": { "content": "$1", @@ -5113,14 +5131,14 @@ } }, "lastSync": { - "message": "Last Sync", + "message": "Última sincronización", "Description": "Used as a prefix to indicate the last time a sync occured. Example \"Last sync 1968-11-16 00:00:00\"" }, "sponsorshipsSynced": { "message": "Self-hosted sponsorships synced." }, "billingManagedByProvider": { - "message": "Managed by $PROVIDER$", + "message": "Gestionado por $PROVIDER$", "placeholders": { "provider": { "content": "$1", @@ -5129,21 +5147,21 @@ } }, "billingContactProviderForAssistance": { - "message": "Please reach out to them for further assistance", + "message": "Por favor, contacte con ellos para obtener más ayuda", "description": "This text is displayed if an organization's billing is managed by a Provider. It tells the user to contact the Provider for assistance." }, "forwardedEmail": { "message": "Forwarded Email Alias" }, "forwardedEmailDesc": { - "message": "Generate an email alias with an external forwarding service." + "message": "Generar un alias de correo electrónico mediante un servicio de reenvío externo." }, "hostname": { - "message": "Hostname", + "message": "Nombre del host", "description": "Part of a URL." }, "apiAccessToken": { - "message": "API Access Token" + "message": "Token de acceso API" }, "deviceVerification": { "message": "Verificación del dispositivo" @@ -5165,5 +5183,35 @@ "example": "My Email" } } + }, + "inputRequired": { + "message": "Entrada requerida." + }, + "inputEmail": { + "message": "La entrada no es una dirección de correo electrónico." + }, + "inputMinLength": { + "message": "La entrada debe tener al menos $COUNT$ caracteres.", + "placeholders": { + "count": { + "content": "$1", + "example": "8" + } + } + }, + "fieldsNeedAttention": { + "message": "$COUNT$ campo(s) anteriores necesitan su atención.", + "placeholders": { + "count": { + "content": "$1", + "example": "4" + } + } + }, + "turnOn": { + "message": "Activar" + }, + "on": { + "message": "Activado" } } diff --git a/apps/web/src/locales/et/messages.json b/apps/web/src/locales/et/messages.json index 9406f13a093..ebb73b7763a 100644 --- a/apps/web/src/locales/et/messages.json +++ b/apps/web/src/locales/et/messages.json @@ -572,6 +572,9 @@ "createAccount": { "message": "Konto loomine" }, + "startTrial": { + "message": "Alusta prooviperioodi" + }, "logIn": { "message": "Logi sisse" }, @@ -593,6 +596,9 @@ "masterPassDesc": { "message": "Ülemparooliga pääsed oma kontole ligi. On äärmiselt tähtis, et ülemparool ei ununeks. Selle parooli taastamine ei ole mingil moel võimalik." }, + "masterPassImportant": { + "message": "Ülemparooli ei saa taastada, kui sa selle unustama peaksid!" + }, "masterPassHintDesc": { "message": "Vihje võib abiks olla olukorras, kui oled ülemparooli unustanud." }, @@ -623,10 +629,13 @@ "invalidEmail": { "message": "Vigane e-posti aadress." }, - "masterPassRequired": { + "masterPasswordRequired": { "message": "Vajalik on ülemparooli sisestamine." }, - "masterPassLength": { + "confirmMasterPasswordRequired": { + "message": "Vajalik on ülemparooli uuesti sisestamine." + }, + "masterPasswordMinLength": { "message": "Ülemparool peab olema vähemalt 8 tähemärgi pikkune." }, "masterPassDoesntMatch": { @@ -1152,10 +1161,10 @@ "message": "Siin saab veebihoidla keelt muuta." }, "enableFavicon": { - "message": "Show website icons" + "message": "Kuva veebilehtede ikoone" }, "faviconDesc": { - "message": "Show a recognizable image next to each login." + "message": "Kuva iga kirje kõrval lehekülje ikooni." }, "enableGravatars": { "message": "Luba Gravatarid", @@ -3159,7 +3168,7 @@ "acceptPolicies": { "message": "Märkeruudu markeerimisel nõustud järgnevaga:" }, - "acceptPoliciesError": { + "acceptPoliciesRequired": { "message": "Kasutustingimuste ja Privaatsuspoliitikaga pole nõustutud." }, "termsOfService": { @@ -3209,6 +3218,9 @@ "organizationIsDisabled": { "message": "Organisatsioon on välja lülitatud." }, + "disabledOrganizationFilterError": { + "message": "Organisatsiooni alla kuuluvatele kirjetele ei ole ligipääsu. Kontakteeru oma organisatsiooni omanikuga." + }, "licenseIsExpired": { "message": "Litsents on aegunud." }, @@ -3333,9 +3345,15 @@ "clone": { "message": "Klooni" }, + "masterPassPolicyTitle": { + "message": "Master password requirements" + }, "masterPassPolicyDesc": { "message": "Määra minimaalsed ülemparooli tugevuse tingimused." }, + "twoStepLoginPolicyTitle": { + "message": "Require two-step login" + }, "twoStepLoginPolicyDesc": { "message": "Nõua, et kasutajad seadistaksid oma kontodes kaheastmelise kinnituse." }, @@ -4467,7 +4485,7 @@ "message": "Hoidla ajalõpp" }, "maximumVaultTimeoutDesc": { - "message": "Configure a maximum vault timeout for all users." + "message": "Set a maximum vault timeout for members." }, "maximumVaultTimeoutLabel": { "message": "Maximum Vault Timeout" @@ -4507,7 +4525,7 @@ "message": "Hoidla ajalõpp pole lubatud piirides." }, "disablePersonalVaultExport": { - "message": "Disable Personal Vault Export" + "message": "Remove individual vault export" }, "disablePersonalVaultExportDesc": { "message": "Keelustab kasutajate privaatse hoidla andmete eksportimise." @@ -4801,19 +4819,19 @@ "message": "Once set up, your configuration will be saved and members will be able to authenticate using their Identity Provider credentials." }, "ssoPolicyHelpStart": { - "message": "Enable the", - "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Enable the SSO Authentication policy to require all members to log in with SSO.'" + "message": "Use the", + "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Use the require single-sign-on authentication policy to require all members to log in with SSO.'" }, "ssoPolicyHelpLink": { - "message": "SSO Authentication policy", - "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Enable the SSO Authentication policy to require all members to log in with SSO.'" + "message": "require single-sign-on authentication policy", + "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Use the require single-sign-on authentication policy to require all members to log in with SSO.'" }, "ssoPolicyHelpEnd": { "message": "to require all members to log in with SSO.", - "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Enable the SSO Authentication policy to require all members to log in with SSO.'" + "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Use the require single-sign-on authentication policy to require all members to log in with SSO.'" }, "ssoPolicyHelpKeyConnector": { - "message": "SSO Authentication and Single Organization policies are required to set up Key Connector decryption." + "message": "The require SSO authentication and single organization policies are required to set up Key Connector decryption." }, "memberDecryptionOption": { "message": "Member Decryption Options" @@ -5165,5 +5183,35 @@ "example": "My Email" } } + }, + "inputRequired": { + "message": "Sisestus on nõutav." + }, + "inputEmail": { + "message": "Tegu pole e-posti aadressiga." + }, + "inputMinLength": { + "message": "Sisend peab olema vähemalt $COUNT$ tähemärki pikk.", + "placeholders": { + "count": { + "content": "$1", + "example": "8" + } + } + }, + "fieldsNeedAttention": { + "message": "$COUNT$ välja vajab sinu tähelepanu.", + "placeholders": { + "count": { + "content": "$1", + "example": "4" + } + } + }, + "turnOn": { + "message": "Turn on" + }, + "on": { + "message": "On" } } diff --git a/apps/web/src/locales/eu/messages.json b/apps/web/src/locales/eu/messages.json index 047e6c2fb38..00f4a140fb1 100644 --- a/apps/web/src/locales/eu/messages.json +++ b/apps/web/src/locales/eu/messages.json @@ -125,16 +125,16 @@ "message": "Titulua" }, "mr": { - "message": "Mr" + "message": "Jn." }, "mrs": { - "message": "Mrs" + "message": "And." }, "ms": { - "message": "Ms" + "message": "And." }, "dr": { - "message": "Dr" + "message": "Jn." }, "expirationMonth": { "message": "Iraungitze hilabetea" @@ -440,13 +440,13 @@ "message": "Kuxa gotorreko elementuak" }, "moveSelectedToOrg": { - "message": "Mugitu aukeratutako antolakundera" + "message": "Mugitu hautatutako antolakundera" }, "deleteSelected": { "message": "Ezabatu hautatutakoa" }, "moveSelected": { - "message": "Mugitu aukeratuak" + "message": "Mugitu hautatuak" }, "selectAll": { "message": "Hautatu guztiak" @@ -540,112 +540,121 @@ "message": "Karpeta gehituta" }, "deleteFolderConfirmation": { - "message": "Are you sure you want to delete this folder?" + "message": "Ziur al zaude karpeta hau ezabatu nahi duzula?" }, "deletedFolder": { - "message": "Deleted folder" + "message": "Karpeta ezabatuta" }, "loggedOut": { - "message": "Logged out" + "message": "Saioa itxita" }, "loginExpired": { - "message": "Your login session has expired." + "message": "Saioa amaitu da." }, "logOutConfirmation": { - "message": "Are you sure you want to log out?" + "message": "Ziur zaude saioa itxi nahi duzula?" }, "logOut": { - "message": "Log out" + "message": "Itxi saioa" }, "ok": { - "message": "Ok" + "message": "Ados" }, "yes": { - "message": "Yes" + "message": "Bai" }, "no": { - "message": "No" + "message": "Ez" }, "loginOrCreateNewAccount": { - "message": "Log in or create a new account to access your secure vault." + "message": "Saioa hasi edo sortu kontu berri bat zure kutxa gotorrera sartzeko." }, "createAccount": { - "message": "Create Account" + "message": "Sortu kontua" + }, + "startTrial": { + "message": "Hasi probaldia" }, "logIn": { - "message": "Log In" + "message": "Hasi saioa" }, "submit": { - "message": "Submit" + "message": "Bidali" }, "emailAddressDesc": { - "message": "You'll use your email address to log in." + "message": "Zure emaila erabiliko duzu saioa hasteko." }, "yourName": { - "message": "Your Name" + "message": "Zure izena" }, "yourNameDesc": { - "message": "What should we call you?" + "message": "Nola deitu beharko genizuke?" }, "masterPass": { - "message": "Master Password" + "message": "Pasahitz nagusia" }, "masterPassDesc": { - "message": "The master password is the password you use to access your vault. It is very important that you do not forget your master password. There is no way to recover the password in the event that you forget it." + "message": "Pasahitz nagusia, kutxa gotorrera sartzeko erabiltzen duzun pasahitza da. Oso garrantzitsua da ez ahaztea, ahazten baduzu, ez dago pasahitza berreskuratzeko modurik." + }, + "masterPassImportant": { + "message": "Pasahitz nagusia ahazten baduzu ezingo duzu berreskuratu!" }, "masterPassHintDesc": { - "message": "A master password hint can help you remember your password if you forget it." + "message": "Pasahitz nagusia ahazten baduzu, pista batek pasahitza gogoratzen lagunduko dizu." }, "reTypeMasterPass": { - "message": "Re-type Master Password" + "message": "Idatzi berriro pasahitz nagusia" }, "masterPassHint": { - "message": "Master Password Hint (optional)" + "message": "Pasahitz nagusirako pista (aukerakoa)" }, "masterPassHintLabel": { - "message": "Master Password Hint" + "message": "Pasahitz nagusiaren pista" }, "settings": { - "message": "Settings" + "message": "Ezarpenak" }, "passwordHint": { - "message": "Password Hint" + "message": "Pasahitza gogoratzeko pista" }, "enterEmailToGetHint": { - "message": "Enter your account email address to receive your master password hint." + "message": "Sartu zure kontuko posta elektronikoa pasahitz nagusiaren pista jasotzeko." }, "getMasterPasswordHint": { - "message": "Get master password hint" + "message": "Jaso pasahitz nagusiaren pista" }, "emailRequired": { - "message": "Email address is required." + "message": "Emaila derrigorrezkoa da." }, "invalidEmail": { - "message": "Invalid email address." + "message": "Email helbide baliogabea." }, - "masterPassRequired": { - "message": "Master password is required." + "masterPasswordRequired": { + "message": "Pasahitz nagusia derrigorrezkoa da." }, - "masterPassLength": { - "message": "Master password must be at least 8 characters long." + "confirmMasterPasswordRequired": { + "message": "Pasahitz nagusia berridaztea derrigorrezkoa da." + }, + "masterPasswordMinLength": { + "message": "Pasahitz nagusiak gutxienez 8 karaktere izan behar ditu." }, "masterPassDoesntMatch": { - "message": "Master password confirmation does not match." + "message": "Pasahitz nagusiaren egiaztatzea ez dator bat." }, "newAccountCreated": { - "message": "Your new account has been created! You may now log in." + "message": "Zure kontua egina dago. Orain saioa has dezakezu." }, "masterPassSent": { - "message": "We've sent you an email with your master password hint." + "message": "Mezu elektroniko bat bidali dizugu zure pasahitz nagusiaren pistarekin." }, "unexpectedError": { - "message": "An unexpected error has occurred." + "message": "Ustekabeko akatsa gertatu da." }, "emailAddress": { - "message": "Email Address" + "message": "Helbide elektronikoa" }, "yourVaultIsLocked": { - "message": "Your vault is locked. Verify your master password to continue." + "message": "Zure kutxa gotorra blokeatuta dago. Egiaztatu zure pasahitz nagusia jarraitzeko." }, "unlock": { "message": "Desblokeatu" @@ -688,10 +697,10 @@ "message": "Erakunde berria" }, "noOrganizationsList": { - "message": "You do not belong to any organizations. Organizations allow you to securely share items with other users." + "message": "Zu ez zara inongo erakundekoa. Erakundeek elementuak beste erabiltzaile batzuekin modu seguruan partekatzeko aukera ematen dute." }, "versionNumber": { - "message": "Version $VERSION_NUMBER$", + "message": "$VERSION_NUMBER$ bertsioa", "placeholders": { "version_number": { "content": "$1", @@ -700,10 +709,10 @@ } }, "enterVerificationCodeApp": { - "message": "Enter the 6 digit verification code from your authenticator app." + "message": "Sartu zure baimentze-aplikazioaren 6 digituko egiaztatze-kodea." }, "enterVerificationCodeEmail": { - "message": "Enter the 6 digit verification code that was emailed to $EMAIL$.", + "message": "Sartu $EMAIL$-era bidalitako 6 digituko egiaztatze-kodea.", "placeholders": { "email": { "content": "$1", @@ -712,7 +721,7 @@ } }, "verificationCodeEmailSent": { - "message": "Verification email sent to $EMAIL$.", + "message": "Egiaztatze emaila $EMAIL$-era bidalia.", "placeholders": { "email": { "content": "$1", @@ -721,100 +730,100 @@ } }, "rememberMe": { - "message": "Remember me" + "message": "Gogora nazazu" }, "sendVerificationCodeEmailAgain": { - "message": "Send verification code email again" + "message": "Berbidali email bidezko egiaztatze-kodea" }, "useAnotherTwoStepMethod": { - "message": "Use another two-step login method" + "message": "Erabili bi urratseko egiaztatzeko beste modu bat" }, "insertYubiKey": { - "message": "Insert your YubiKey into your computer's USB port, then touch its button." + "message": "Sartu zure YubiKey-a ordenagailuko USB portuan, ondoren, sakatu bere botoia." }, "insertU2f": { - "message": "Insert your security key into your computer's USB port. If it has a button, touch it." + "message": "Sartu zure segurtasun giltza ordenagailuaren USB portuan. Botoia badu, sakatu ezazu." }, "loginUnavailable": { - "message": "Login Unavailable" + "message": "Ez dago eskuragarri saio-hasierarik" }, "noTwoStepProviders": { - "message": "This account has two-step login enabled, however, none of the configured two-step providers are supported by this web browser." + "message": "Kontu honek bi urratseko egiaztatzea du gaituta, baina konfiguratutako bi urratseko egiaztatzea ez da web-nabigatzaile honekin bateragarria." }, "noTwoStepProviders2": { - "message": "Please use a supported web browser (such as Chrome) and/or add additional providers that are better supported across web browsers (such as an authenticator app)." + "message": "Mesedez, erabili nabigatzaile bateragarri bat (adibidez, Chrome) eta/edo gehitu bateragarritasun obea duten nabigatzaile bidezko (baimentze-aplikazio gisa) baimentze modu gehigarriak." }, "twoStepOptions": { - "message": "Two-step Login Options" + "message": "Bi urratseko egiaztatzearen aukerak" }, "recoveryCodeDesc": { - "message": "Lost access to all of your two-factor providers? Use your recovery code to disable all two-factor providers from your account." + "message": "Bi urratseko egiaztatzeko modu guztietarako sarbidea galdu duzu? Erabili zure berreskuratze-kodea zure kontuko bi urratseko egiaztatze hornitzaile guztiak desaktibatzeko." }, "recoveryCodeTitle": { - "message": "Recovery Code" + "message": "Berreskuratze-kodea" }, "authenticatorAppTitle": { - "message": "Authenticator App" + "message": "Baimentze aplikazioa" }, "authenticatorAppDesc": { - "message": "Use an authenticator app (such as Authy or Google Authenticator) to generate time-based verification codes.", + "message": "Erabili baimentze-aplikazio bat (adibidez, Authy edo Google Authenticator) denboran oinarritutako egiaztatze-kodeak sortzeko.", "description": "'Authy' and 'Google Authenticator' are product names and should not be translated." }, "yubiKeyTitle": { - "message": "YubiKey OTP Security Key" + "message": "YubiKey OTP segurtasun giltza" }, "yubiKeyDesc": { - "message": "Use a YubiKey to access your account. Works with YubiKey 4 series, 5 series, and NEO devices." + "message": "Erabili YubiKey zure kontuan sartzeko. YubiKey 4 series, 5 series eta NEO gailuekin dabil." }, "duoDesc": { - "message": "Verify with Duo Security using the Duo Mobile app, SMS, phone call, or U2F security key.", + "message": "Egiaztatu Duo Securityrekin Duo Mobile aplikazioa, SMS, telefono deia edo U2F segurtasun-gakoa erabiliz.", "description": "'Duo Security' and 'Duo Mobile' are product names and should not be translated." }, "duoOrganizationDesc": { - "message": "Verify with Duo Security for your organization using the Duo Mobile app, SMS, phone call, or U2F security key.", + "message": "Egiaztatu zure erakunderako Duo Securityrekin Duo Mobile aplikazioa, SMS, telefono deia edo U2F segurtasun-gakoa erabiliz.", "description": "'Duo Security' and 'Duo Mobile' are product names and should not be translated." }, "u2fDesc": { - "message": "Use any FIDO U2F enabled security key to access your account." + "message": "Erabili gaitutako edozein FIDO U2F segurtasun kode zure kontura sartzeko." }, "u2fTitle": { - "message": "FIDO U2F Security Key" + "message": "FIDO U2F segurtasun kodea" }, "webAuthnTitle": { "message": "FIDO2 WebAuthn" }, "webAuthnDesc": { - "message": "Use any WebAuthn enabled security key to access your account." + "message": "Erabili gaitutako edozein WebAuthn segurtasun kode zure kontura sartzeko." }, "webAuthnMigrated": { - "message": "(Migrated from FIDO)" + "message": "(FIDO-tik migratua)" }, "emailTitle": { - "message": "Email" + "message": "Emaila" }, "emailDesc": { - "message": "Verification codes will be emailed to you." + "message": "Egiaztatze-kodeak email bidez bidaliko dira." }, "continue": { - "message": "Continue" + "message": "Jarraitu" }, "organization": { - "message": "Organization" + "message": "Erakundea" }, "organizations": { - "message": "Organizations" + "message": "Erakundeak" }, "moveToOrgDesc": { - "message": "Choose an organization that you wish to move this item to. Moving to an organization transfers ownership of the item to that organization. You will no longer be the direct owner of this item once it has been moved." + "message": "Aukeratu elementu hau zein erakundetara eraman nahi duzun. Erakunde batera pasatzeak elementuaren jabetza erakunde horretara transferitzen du. Zu ez zara elementu honen jabe zuzena izango mugitzen duzunean." }, "moveManyToOrgDesc": { - "message": "Choose an organization that you wish to move these items to. Moving to an organization transfers ownership of the items to that organization. You will no longer be the direct owner of these items once they have been moved." + "message": "Aukeratu elementu hauek zein erakundetara eraman nahi dituzun. Erakunde batera pasatzeak elementuen jabetzak erakunde horretara transferitzen ditu. Zu ez zara elementu horien jabe zuzena izango mugitzen dituzunean." }, "collectionsDesc": { - "message": "Edit the collections that this item is being shared with. Only organization users with access to these collections will be able to see this item." + "message": "Aukeratu elementu hau zein bildumarekin partekatzen den. Bilduma horietarako sarbidea duten erakundeko erabiltzaileek bakarrik ikus dezakete elementu hau." }, "deleteSelectedItemsDesc": { - "message": "You have selected $COUNT$ item(s) to delete. Are you sure you want to delete all of these items?", + "message": "$COUNT$ elementu hautatu dituzu ezabatzeko. Ziur zaude elementu horiek guztiak ezabatu nahi dituzula?", "placeholders": { "count": { "content": "$1", @@ -823,7 +832,7 @@ } }, "moveSelectedItemsDesc": { - "message": "Choose a folder that you would like to move the $COUNT$ selected item(s) to.", + "message": "Aukeratu $COUNT$ hautatutako artikulu mugitu nahi d(it)uzun karpeta.", "placeholders": { "count": { "content": "$1", @@ -832,7 +841,7 @@ } }, "moveSelectedItemsCountDesc": { - "message": "You have selected $COUNT$ item(s). $MOVEABLE_COUNT$ item(s) can be moved to an organization, $NONMOVEABLE_COUNT$ cannot.", + "message": "$COUNT$ artikulu hautatu d(it)uzu. $MOVEABLE_COUNT$ artikulu erakunde batera alda daite(z)ke, $NONMOVEABLE_COUNT$ ezin d(ir)a.", "placeholders": { "count": { "content": "$1", @@ -849,114 +858,114 @@ } }, "verificationCodeTotp": { - "message": "Verification Code (TOTP)" + "message": "Egiaztatze kodea (TOTP)" }, "copyVerificationCode": { - "message": "Copy Verification Code" + "message": "Kopiatu egiaztatze-kodea" }, "warning": { - "message": "Warning" + "message": "Kontuz" }, "confirmVaultExport": { - "message": "Confirm Vault Export" + "message": "Baieztatu kutxa gotorra esportatzea" }, "exportWarningDesc": { - "message": "This export contains your vault data in an unencrypted format. You should not store or send the exported file over unsecure channels (such as email). Delete it immediately after you are done using it." + "message": "Esportazio honek kutxa gotorraren datuak zifratu gabeko formatuan biltzen ditu. Ez zenuke gorde edo kanal ez-seguruetaik (posta elektronikoa, adibidez) bidali behar. Erabili eta berehala ezabatu." }, "encExportKeyWarningDesc": { - "message": "This export encrypts your data using your account's encryption key. If you ever rotate your account's encryption key you should export again since you will not be able to decrypt this export file." + "message": "Esportazio honek zure datuak enkriptatzen ditu zure kontuaren zifratze-kodea erabiliz. Inoiz zure kontuko zifratze-gakoa aldatuz gero, berriro esportatu beharko duzu, ezin izango baituzu fitxategi hori deszifratu." }, "encExportAccountWarningDesc": { - "message": "Account encryption keys are unique to each Bitwarden user account, so you can't import an encrypted export into a different account." + "message": "Kontua zifratzeko gakoak Bitwarden erabiltzaile bakoitzarentzako bakarrik dira; beraz, ezin da inportatu beste kontu batean zifratutako esportazio bat." }, "export": { - "message": "Export" + "message": "Esportatu" }, "exportVault": { - "message": "Export Vault" + "message": "Esportatu kutxa gotorra" }, "fileFormat": { - "message": "File Format" + "message": "Fitxategiaren formatua" }, "exportSuccess": { - "message": "Your vault data has been exported." + "message": "Zure kutxa gotorra esportatu da." }, "passwordGenerator": { - "message": "Password Generator" + "message": "Pasahitz sortzailea" }, "minComplexityScore": { - "message": "Minimum Complexity Score" + "message": "Konplexutasun puntuazio minimoa" }, "minNumbers": { - "message": "Minimum Numbers" + "message": "Gutxieneko zenbaki kopurua" }, "minSpecial": { - "message": "Minimum Special", + "message": "Gutxieneko karaktere bereziak", "description": "Minimum Special Characters" }, "ambiguous": { - "message": "Avoid Ambiguous Characters" + "message": "Saihestu karaktere anbiguoak" }, "regeneratePassword": { - "message": "Regenerate Password" + "message": "Birsortu pasahitza" }, "length": { - "message": "Length" + "message": "Luzera" }, "uppercase": { - "message": "Uppercase (A-Z)", + "message": "Letra larria (A-Z)", "description": "Include uppercase letters in the password generator." }, "lowercase": { - "message": "Lowercase (a-z)", + "message": "Letra txikia (a-z)", "description": "Include lowercase letters in the password generator." }, "numbers": { - "message": "Numbers (0-9)" + "message": "Zenbakiak (0-9)" }, "specialCharacters": { - "message": "Special Characters (!@#$%^&*)" + "message": "Karaktere bereziak (!@#$%^&*)" }, "numWords": { - "message": "Number of Words" + "message": "Hitz kopurua" }, "wordSeparator": { - "message": "Word Separator" + "message": "Hitz banatzailea" }, "capitalize": { - "message": "Capitalize", + "message": "Hasierako letra larria", "description": "Make the first letter of a work uppercase." }, "includeNumber": { - "message": "Include Number" + "message": "Sartu zenbakia" }, "passwordHistory": { - "message": "Password History" + "message": "Pasahitz historiala" }, "noPasswordsInList": { - "message": "There are no passwords to list." + "message": "Ez dago erakusteko pasahitzik." }, "clear": { - "message": "Clear", + "message": "Ezabatu", "description": "To clear something out. example: To clear browser history." }, "accountUpdated": { - "message": "Account Updated" + "message": "Kontu eguneratua" }, "changeEmail": { - "message": "Change Email" + "message": "Aldatu emaila" }, "changeEmailTwoFactorWarning": { - "message": "Proceeding will change your account email address. It will not change the email address used for two-factor authentication. You can change this email address in the Two-Step Login settings." + "message": "Prozedurak zure kontuko emaila aldatuko du. Bi urratseko egiaztatzean erabilitako emaila ez da aldatuko. Email hori alda dezakezu bi urratseko egiaztatzearen ezarpenetan." }, "newEmail": { - "message": "New Email" + "message": "Email berria" }, "code": { - "message": "Code" + "message": "Kodea" }, "changeEmailDesc": { - "message": "We have emailed a verification code to $EMAIL$. Please check your email for this code and enter it below to finalize the email address change.", + "message": "Egiaztatze-kode bat bidali dugu $EMAIL$-ra. Mesedez, berrikusi zure emaila eta idatzi kodea behean emailaren aldaketa burutzeko.", "placeholders": { "email": { "content": "$1", @@ -965,43 +974,43 @@ } }, "loggedOutWarning": { - "message": "Proceeding will log you out of your current session, requiring you to log back in. Active sessions on other devices may continue to remain active for up to one hour." + "message": "Jarraitzeak uneko saioa itxiko du eta berriro saioa hasteko eskatuko zaizu. Beste gailu batzuetako saio aktiboek ordubete iraun dezakete aktibo." }, "emailChanged": { - "message": "Email Changed" + "message": "Emaila aldatua" }, "logBackIn": { - "message": "Please log back in." + "message": "Mesedez, hasi saioa berriro." }, "logBackInOthersToo": { - "message": "Please log back in. If you are using other Bitwarden applications log out and back in to those as well." + "message": "Mesedez, hasi saioa berriro. Bitwardenen beste aplikazioren bat erabiltzen ari bazara, itxi saioa eta hasi saioa berriro aplikazio horretan ere." }, "changeMasterPassword": { - "message": "Change Master Password" + "message": "Aldatu pasahitz nagusia" }, "masterPasswordChanged": { - "message": "Master Password Changed" + "message": "Pasahitz nagusia aldatua" }, "currentMasterPass": { - "message": "Current Master Password" + "message": "Uneko pasahitz nagusia" }, "newMasterPass": { - "message": "New Master Password" + "message": "Pasahitz nagusi berria" }, "confirmNewMasterPass": { - "message": "Confirm New Master Password" + "message": "Pasahitz nagusi berria baieztatu" }, "encKeySettings": { - "message": "Encryption Key Settings" + "message": "Zifratze gakoaren ezarpenak" }, "kdfAlgorithm": { - "message": "KDF Algorithm" + "message": "KDF algoritmoa" }, "kdfIterations": { - "message": "KDF Iterations" + "message": "KDF iterazioak" }, "kdfIterationsDesc": { - "message": "Higher KDF iterations can help protect your master password from being brute forced by an attacker. We recommend a value of $VALUE$ or more.", + "message": "KFD iterazio altuenek zure pasahitz nagusia babesten lagun dezakete, erasotzaile batek bortxatu ez ditzan. $VALUE$ edo gehiagoko balioa gomendatzen dugu.", "placeholders": { "value": { "content": "$1", @@ -1010,7 +1019,7 @@ } }, "kdfIterationsWarning": { - "message": "Setting your KDF iterations too high could result in poor performance when logging into (and unlocking) Bitwarden on devices with slower CPUs. We recommend that you increase the value in increments of $INCREMENT$ and then test all of your devices.", + "message": "KFD iterazio altuegiak konfiguratzea errendimendu eskasa izan liteke CPU motelagoko gailuetan Bitwarden saioa hasi eta/edo desblokeatzean. Gomendatzen dugu balioa handitzea $INCREMENT$ gehikuntzan, eta gero gailu guztietan probatzea.", "placeholders": { "increment": { "content": "$1", @@ -1019,85 +1028,85 @@ } }, "changeKdf": { - "message": "Change KDF" + "message": "Aldatu KDF" }, "encKeySettingsChanged": { - "message": "Encryption Key Settings Changed" + "message": "Zifratze gakoaren ezarpenak aldatuta" }, "dangerZone": { - "message": "Danger Zone" + "message": "Eremu arriskutsua" }, "dangerZoneDesc": { - "message": "Careful, these actions are not reversible!" + "message": "Kontuz, ekintza hauek ez dira itzulgarriak!" }, "deauthorizeSessions": { - "message": "Deauthorize Sessions" + "message": "Baimena kendu saio hasierei" }, "deauthorizeSessionsDesc": { - "message": "Concerned your account is logged in on another device? Proceed below to deauthorize all computers or devices that you have previously used. This security step is recommended if you previously used a public computer or accidentally saved your password on a device that isn't yours. This step will also clear all previously remembered two-step login sessions." + "message": "Zure kontua beste gailu batean saioa hasita egoteak kezkatzen zaitu? Beheko aukeran, erabili dituzun gailu guztietako saioa hasteko baimenak kendu dezakezu. Gomendagarria da aldez aurretik ordenagailu publiko bat erabili baduzu edo nahi gabe pasahitza zurea ez den gailu batean gorde baduzu. Urrats honek lehenago gogoratutako bi urratseko saio-hasierako saio guztiak ere garbituko ditu." }, "deauthorizeSessionsWarning": { - "message": "Proceeding will also log you out of your current session, requiring you to log back in. You will also be prompted for two-step login again, if enabled. Active sessions on other devices may continue to remain active for up to one hour." + "message": "Jarraitzeak uneko saioa itxiko du eta berriro saioa hasteko eskatuko zaizu. Gaituta badago, berriz ere bi urratseko egiaztatzea eskatuko zaizu. Beste gailu batzuetako saio aktiboek ordubete iraun dezakete aktibo." }, "sessionsDeauthorized": { - "message": "All Sessions Deauthorized" + "message": "Saio guztiei baimena kendua" }, "purgeVault": { - "message": "Purge Vault" + "message": "Garbitu kutxa gotorra" }, "purgedOrganizationVault": { - "message": "Purged organization vault." + "message": "Garbitu erakundeko kutxa gotorra." }, "vaultAccessedByProvider": { - "message": "Vault accessed by provider." + "message": "Hornitzaileak sarbidea duen kutxa gotorra." }, "purgeVaultDesc": { - "message": "Proceed below to delete all items and folders in your vault. Items that belong to an organization that you share with will not be deleted." + "message": "Jarraitzeak kutxa gotorrean dauden elementu eta karpeta guztiak ezabatuko ditu. Partekatzen dituzun erakunde bateko elementuak ez dira ezabatuko." }, "purgeOrgVaultDesc": { - "message": "Proceed below to delete all items in the organization's vault." + "message": "Jarraitzeak erakundeko kutxa gotorrean dauden elementu guztiak ezabatuko ditu." }, "purgeVaultWarning": { - "message": "Purging your vault is permanent. It cannot be undone." + "message": "Kutxa gotorra garbitzea iraunkorra da. Ezin da desegin." }, "vaultPurged": { - "message": "Your vault has been purged." + "message": "Zure kutxa gotorra garbitu da." }, "deleteAccount": { - "message": "Delete Account" + "message": "Ezabatu kontua" }, "deleteAccountDesc": { - "message": "Proceed below to delete your account and all associated data." + "message": "Jarraitzeak zure kontua eta kutxa gotorreko datu guztiak ezabatuko ditu." }, "deleteAccountWarning": { - "message": "Deleting your account is permanent. It cannot be undone." + "message": "Zure kontua ezabatzea iraunkorra da. Ezin da desegin." }, "accountDeleted": { - "message": "Account Deleted" + "message": "Kontu eguneratua" }, "accountDeletedDesc": { - "message": "Your account has been closed and all associated data has been deleted." + "message": "Bitwarden kontuko eta kutxa gotorreko datuak betiko ezabatu dira." }, "myAccount": { - "message": "My Account" + "message": "Nire kontua" }, "tools": { - "message": "Tools" + "message": "Tresnak" }, "importData": { - "message": "Import Data" + "message": "Inportatu datuak" }, "importError": { - "message": "Import Error" + "message": "Akatsa inportatzerakoan" }, "importErrorDesc": { - "message": "There was a problem with the data you tried to import. Please resolve the errors listed below in your source file and try again." + "message": "Inportatzen saiatu zaren datuekin arazo bat egon da. Mesedez, konpondu ondoren adierazten diren akatsak eta saiatu berriro." }, "importSuccess": { - "message": "Data has been successfully imported into your vault." + "message": "Datuak behar bezala inportatu dira." }, "importWarning": { - "message": "You are importing data to $ORGANIZATION$. Your data may be shared with members of this organization. Do you want to proceed?", + "message": "$ORGANIZATION$-era datuak inportatzen ari zara. Zure datuak erakunde horretako kideekin parteka daitezke. Jarraitu nahi duzu?", "placeholders": { "organization": { "content": "$1", @@ -1106,25 +1115,25 @@ } }, "importFormatError": { - "message": "Data is not formatted correctly. Please check your import file and try again." + "message": "Datuak ez daude behar bezala formateatuta. Berrikusi inportazio fitxategia eta saiatu berriro." }, "importNothingError": { - "message": "Nothing was imported." + "message": "Ez da ezer inportatu." }, "importEncKeyError": { - "message": "Error decrypting the exported file. Your encryption key does not match the encryption key used export the data." + "message": "Errorea esportatutako fitxategia deszifratzean. Zifratze-gakoa ez dator bat datuak esportatzeko erabilitako zifratze-gakoarekin." }, "selectFormat": { - "message": "Select the format of the import file" + "message": "Hautatu inportazio fitxategiaren formatua" }, "selectImportFile": { - "message": "Select the import file" + "message": "Hautatu inportazio fitxategia" }, "orCopyPasteFileContents": { - "message": "or copy/paste the import file contents" + "message": "edo kopiatu/pegatu inportazio fitxategiaren edukia" }, "instructionsFor": { - "message": "$NAME$ Instructions", + "message": "$NAME$ jarraibideak", "description": "The title for the import tool instructions.", "placeholders": { "name": { @@ -1134,75 +1143,75 @@ } }, "options": { - "message": "Options" + "message": "Aukerak" }, "preferences": { - "message": "Preferences" + "message": "Hobespenak" }, "preferencesDesc": { - "message": "Customize your web vault experience." + "message": "Pertsonalizatu zure esperientzia webguneko kutxa gotorrean." }, "preferencesUpdated": { - "message": "Preferences updated" + "message": "Hobespenak eguneratuta" }, "language": { - "message": "Language" + "message": "Hizkuntza" }, "languageDesc": { - "message": "Change the language used by the web vault." + "message": "Aldatu webguneko kutxa gotorrean erabiltzen den hizkuntza." }, "enableFavicon": { - "message": "Show website icons" + "message": "Erakutsi webguneko ikonoak" }, "faviconDesc": { - "message": "Show a recognizable image next to each login." + "message": "Erakutsi irudi bat saio-hasiera bakoitzaren ondoan." }, "enableGravatars": { - "message": "Show Gravatars", + "message": "Erakutsi gravatarrak", "description": "Use avatar images loaded from gravatar.com." }, "enableGravatarsDesc": { - "message": "Use avatar images loaded from gravatar.com." + "message": "Erabili gravatar.com-etik hartutako avatar irudiak." }, "enableFullWidth": { - "message": "Display full width layout", + "message": "Erabili zabalera osoko diseinua", "description": "Allows scaling the web vault UI's width" }, "enableFullWidthDesc": { - "message": "Allow the web vault to expand the full width of the browser window." + "message": "Baimendu webguneko kutxa gotorrari nabigatzailearen leihoaren zabalera osoa hartzea." }, "default": { - "message": "Default" + "message": "Lehenetsia" }, "domainRules": { - "message": "Domain Rules" + "message": "Domeinu arauak" }, "domainRulesDesc": { - "message": "If you have the same login across multiple different website domains, you can mark the website as \"equivalent\". \"Global\" domains are ones already created for you by Bitwarden." + "message": "Webguneko hainbat domeinutan saio bera hasia baduzu, webgunea \"baliokide\" gisa marka dezakezu. Domeinu \"globalak\" Bitwarden-ek zure ordez sortzen ditu." }, "globalEqDomains": { - "message": "Global Equivalent Domains" + "message": "Domeinu baliokide globalak" }, "customEqDomains": { - "message": "Custom Equivalent Domains" + "message": "Pertsonalizatutako domeinu baliokideak" }, "exclude": { - "message": "Exclude" + "message": "Baztertu" }, "include": { - "message": "Include" + "message": "Barne hartu" }, "customize": { - "message": "Customize" + "message": "Pertsonalizatu" }, "newCustomDomain": { - "message": "New Custom Domain" + "message": "Domeinu pertsonalizatu berria" }, "newCustomDomainDesc": { - "message": "Enter a list of domains separated by commas. Only \"base\" domains are allowed. Do not enter subdomains. For example, enter \"google.com\" instead of \"www.google.com\". You can also enter \"androidapp://package.name\" to associate an android app with other website domains." + "message": "Sartu komaz bereizitako domeinu zerrenda bat. \"Oinarrizko\" domeinuak bakarrik onartzen dira. Ez sartu azpidomeinuak. Adibidez, sartu \"google.com\" \"www.google.com\" beharrean. \"androidapp://gav.name\" ere sar dezakezu Android-eko aplikazio bat webguneko beste domeinu batzuekin lotzeko." }, "customDomainX": { - "message": "Custom Domain $INDEX$", + "message": "$INDEX$ domeinu pertsonalizatua", "placeholders": { "index": { "content": "$1", @@ -1211,132 +1220,132 @@ } }, "domainsUpdated": { - "message": "Domains updated" + "message": "Domeinua eguneratua" }, "twoStepLogin": { - "message": "Two-step Login" + "message": "Bi urratseko egiaztatzea" }, "twoStepLoginDesc": { - "message": "Secure your account by requiring an additional step when logging in." + "message": "Ziurtatu zure kontua saioa hastean beste urrats bat egitea eskatuz." }, "twoStepLoginOrganizationDesc": { - "message": "Require two-step login for your organization's users by configuring providers at the organization level." + "message": "Zure erakundeko erabiltzaileentzat bi urratseko egiaztatze bidez hasi behar da saioa, hornitzaileak erakundearen mailan konfiguratuz." }, "twoStepLoginRecoveryWarning": { - "message": "Enabling two-step login can permanently lock you out of your Bitwarden account. A recovery code allows you to access your account in the event that you can no longer use your normal two-step login provider (ex. you lose your device). Bitwarden support will not be able to assist you if you lose access to your account. We recommend you write down or print the recovery code and keep it in a safe place." + "message": "Bi urratseko egiaztatzea gaitzeak betirako blokea dezake Bitwarden kontura sartzea. Berreskuratze-kode baten bidez, zure kontura sar zaitezke, bi urratseko egiaztatzerako hornitzailea erabili ezin baduzu (adb. gailua galtzen baduzu). Bitwarden-ek ezingo dizu lagundu zure konturako sarbidea galtzen baduzu. Berreskuratze-kodea idatzi edo inprimatzea eta leku seguruan edukitzea gomendatzen dugu." }, "viewRecoveryCode": { - "message": "View Recovery Code" + "message": "Berreskuratze-kodea" }, "providers": { - "message": "Providers", + "message": "Hornitzaileak", "description": "Two-step login providers such as YubiKey, Duo, Authenticator apps, Email, etc." }, "enable": { - "message": "Enable" + "message": "Gaitu" }, "enabled": { - "message": "Enabled" + "message": "Gaituta" }, "activate": { - "message": "Activate" + "message": "Aktibatu" }, "premium": { "message": "Premium", "description": "Premium Membership" }, "premiumMembership": { - "message": "Premium Membership" + "message": "Premium bazkidea" }, "premiumRequired": { - "message": "Premium Required" + "message": "Premium izatea beharrezkoa da" }, "premiumRequiredDesc": { - "message": "A premium membership is required to use this feature." + "message": "Premium bazkidetza beharrezkoa da ezaugarri hau erabiltzeko." }, "youHavePremiumAccess": { - "message": "You have premium access" + "message": "Premium sarbidea duzu" }, "alreadyPremiumFromOrg": { - "message": "You already have access to premium features because of an organization you are a member of." + "message": "Dagoeneko premium ezaugarrietarako sarbidea duzu, kide zaren erakundeagatik." }, "manage": { - "message": "Manage" + "message": "Kudeatu" }, "disable": { - "message": "Disable" + "message": "Desgaitu" }, "deactivate": { - "message": "Deactivate" + "message": "Desaktibatu" }, "twoStepLoginProviderEnabled": { - "message": "This two-step login provider is enabled on your account." + "message": "Zure kontuan gaituta dago bi urratseko egiaztatze hornitzaile hori." }, "twoStepLoginAuthDesc": { - "message": "Enter your master password to modify two-step login settings." + "message": "Sartu pasahitz nagusia bi urratseko egiaztatzerako ezarpenak aldatzeko." }, "twoStepAuthenticatorDesc": { - "message": "Follow these steps to set up two-step login with an authenticator app:" + "message": "Jarraitu bi urratseko egiaztatzea baimentze-aplikazio batekin zehazteko:" }, "twoStepAuthenticatorDownloadApp": { - "message": "Download a two-step authenticator app" + "message": "Deskargatu bi urratseko baimentze-aplikazio bat" }, "twoStepAuthenticatorNeedApp": { - "message": "Need a two-step authenticator app? Download one of the following" + "message": "Bi urratseko baimentze-aplikazio bat behar duzu? Deskargatu ondorengoetako bat" }, "iosDevices": { - "message": "iOS devices" + "message": "iOS gailuak" }, "androidDevices": { - "message": "Android devices" + "message": "Android gailuak" }, "windowsDevices": { - "message": "Windows devices" + "message": "Windows gailuak" }, "twoStepAuthenticatorAppsRecommended": { - "message": "These apps are recommended, however, other authenticator apps will also work." + "message": "Aplikazio hauek dira gomendatuak, hala ere, beste aplikazio batzuk ere funtzionatuko dute." }, "twoStepAuthenticatorScanCode": { - "message": "Scan this QR code with your authenticator app" + "message": "Eskaneatu QR kode hau zure baimentze-aplikazioarekin" }, "key": { - "message": "Key" + "message": "Gakoa" }, "twoStepAuthenticatorEnterCode": { - "message": "Enter the resulting 6 digit verification code from the app" + "message": "Sartu aplikazioko 6 digituko egiaztatze-kodea" }, "twoStepAuthenticatorReaddDesc": { - "message": "In case you need to add it to another device, below is the QR code (or key) required by your authenticator app." + "message": "Beste gailu bati gehitu behar badiozu, hona hemen baimentze-aplikazioak eskatzen duen QR kodea (edo gakoa)." }, "twoStepDisableDesc": { - "message": "Are you sure you want to disable this two-step login provider?" + "message": "Ziur zaude bi urratseko egiaztatzeko hornitzaile hau desgaitu nahi duzula?" }, "twoStepDisabled": { - "message": "Two-step login provider disabled." + "message": "Bi urratseko egiaztatzeko hornitzailea desgaitua." }, "twoFactorYubikeyAdd": { - "message": "Add a new YubiKey to your account" + "message": "Gehitu YubiKey berria zure kontura" }, "twoFactorYubikeyPlugIn": { - "message": "Plug the YubiKey into your computer's USB port." + "message": "Sartu zure YubiKey-a ordenagailuko USB portuan." }, "twoFactorYubikeySelectKey": { - "message": "Select the first empty YubiKey input field below." + "message": "Hautatu YubiKey-ren lehen sarrera-eremu hutsa." }, "twoFactorYubikeyTouchButton": { - "message": "Touch the YubiKey's button." + "message": "Sakatu YubiKey-aren botoia." }, "twoFactorYubikeySaveForm": { - "message": "Save the form." + "message": "Formularioa gorde." }, "twoFactorYubikeyWarning": { - "message": "Due to platform limitations, YubiKeys cannot be used on all Bitwarden applications. You should enable another two-step login provider so that you can access your account when YubiKeys cannot be used. Supported platforms:" + "message": "Plataformaren mugak direla eta, YubiKey ezin da erabili Bitwarden-en aplikazio guztietan. Bi urratseko egiaztatzerako beste hornitzaile bat gaitu beharko duzu, YubiKey erabili ezin denean zure kontuan sartzeko. Plataforma bateragarriak:" }, "twoFactorYubikeySupportUsb": { - "message": "Web vault, desktop application, CLI, and all browser extensions on a device with a USB port that can accept your YubiKey." + "message": "Weguneko kutxa gotorra, mahaigaineko aplikazioa, CLI eta nabigatzailearen luzapen guztiak USB portua duen gailu batean, zure YubiKeyak onar ditzakeena." }, "twoFactorYubikeySupportMobile": { - "message": "Mobile apps on a device with NFC capabilities or a data port that can accept your YubiKey." + "message": "Aplikazio mugikorrak NFC duen gailu batean edo zure YubiKey onartzen duen USB portu batean." }, "yubikeyX": { "message": "YubiKey $INDEX$", @@ -1366,91 +1375,91 @@ } }, "nfcSupport": { - "message": "NFC Support" + "message": "NFC euskarria" }, "twoFactorYubikeySupportsNfc": { - "message": "One of my keys supports NFC." + "message": "Nire giltzetako batek NFC baimentzen du." }, "twoFactorYubikeySupportsNfcDesc": { - "message": "If one of your YubiKeys supports NFC (such as a YubiKey NEO), you will be prompted on mobile devices whenever NFC availability is detected." + "message": "YubiKey-etako batek NFC onartzen badu (YubiKeyko NEO bat bezala), gailu mugikorretan eskatuko zaio NFC erabiltzeko aukera detektatzen denean." }, "yubikeysUpdated": { - "message": "YubiKeys updated" + "message": "YubiKey eguneratua" }, "disableAllKeys": { - "message": "Disable All Keys" + "message": "Giltza guztiak desgaitu" }, "twoFactorDuoDesc": { - "message": "Enter the Bitwarden application information from your Duo Admin panel." + "message": "Sartu zure Duo administrazio paneleko Bitwarden aplikazioaren informazioa." }, "twoFactorDuoIntegrationKey": { - "message": "Integration Key" + "message": "Integrazio giltza" }, "twoFactorDuoSecretKey": { - "message": "Secret Key" + "message": "Giltza sekretua" }, "twoFactorDuoApiHostname": { - "message": "API Hostname" + "message": "API-aren ostalariaren izena" }, "twoFactorEmailDesc": { - "message": "Follow these steps to set up two-step login with email:" + "message": "Jarraitu bi urratseko egiaztatzea email batekin zehazteko:" }, "twoFactorEmailEnterEmail": { - "message": "Enter the email that you wish to receive verification codes" + "message": "Sartu egiaztatze-kodeak jaso nahi dituzun emaila" }, "twoFactorEmailEnterCode": { - "message": "Enter the resulting 6 digit verification code from the email" + "message": "Sartu emaileko 6 digituko egiaztatze-kodea" }, "sendEmail": { - "message": "Send Email" + "message": "Emaila bidali" }, "twoFactorU2fAdd": { - "message": "Add a FIDO U2F security key to your account" + "message": "Gehitu FIDO U2F segurtasun giltza zure kontura" }, "removeU2fConfirmation": { - "message": "Are you sure you want to remove this security key?" + "message": "Ziur zaude segurtasun giltza hau ezabatu nahi duzula?" }, "twoFactorWebAuthnAdd": { - "message": "Add a WebAuthn security key to your account" + "message": "Gehitu WebAuthn segurtasun giltza zure kontura" }, "readKey": { - "message": "Read Key" + "message": "Irakurri giltza" }, "keyCompromised": { - "message": "Key is compromised." + "message": "Giltza konprometituta dago." }, "twoFactorU2fGiveName": { - "message": "Give the security key a friendly name to identify it." + "message": "Izendatu segurtasun-giltza." }, "twoFactorU2fPlugInReadKey": { - "message": "Plug the security key into your computer's USB port and click the \"Read Key\" button." + "message": "Sartu segurtasun-giltza ordenagailuaren USB portuan eta egin klik \"Read Key\" botoian." }, "twoFactorU2fTouchButton": { - "message": "If the security key has a button, touch it." + "message": "Segurtasun-giltzak botoia badu, sakatu." }, "twoFactorU2fSaveForm": { - "message": "Save the form." + "message": "Formularioa gorde." }, "twoFactorU2fWarning": { - "message": "Due to platform limitations, FIDO U2F cannot be used on all Bitwarden applications. You should enable another two-step login provider so that you can access your account when FIDO U2F cannot be used. Supported platforms:" + "message": "Plataformaren mugak direla eta, FIDO U2F ezin da erabili Bitwarden-en aplikazio guztietan. Bi urratseko egiaztatzerako beste hornitzaile bat gaitu beharko duzu, FIDO U2F erabili ezin denean zure kontuan sartzeko. Plataforma bateragarriak:" }, "twoFactorU2fSupportWeb": { - "message": "Web vault and browser extensions on a desktop/laptop with a U2F enabled browser (Chrome, Opera, Vivaldi, or Firefox with FIDO U2F enabled)." + "message": "Webguneko kutxa gotorra eta nabigatzailearen gehiagarriak mahaigain/ordenagailu eramangarri batean, U2F nabigatzaile gaitu batekin (Chrome, Opera, Vivaldi edo Firefox, FIDO U2F gaitua duena)." }, "twoFactorU2fWaiting": { - "message": "Waiting for you to touch the button on your security key" + "message": "Segurtasun-giltzako botoia sakatzeko zain" }, "twoFactorU2fClickSave": { - "message": "Click the \"Save\" button below to enable this security key for two-step login." + "message": "Egin klik \"gorde\" botoian, bi urratseko egiaztatzerako segurtasun-giltza hau gaitzeko." }, "twoFactorU2fProblemReadingTryAgain": { - "message": "There was a problem reading the security key. Try again." + "message": "Arazo bat egon da segurtasun-giltza irakurtzean. Saiatu berriro mesedez." }, "twoFactorWebAuthnWarning": { - "message": "Due to platform limitations, WebAuthn cannot be used on all Bitwarden applications. You should enable another two-step login provider so that you can access your account when WebAuthn cannot be used. Supported platforms:" + "message": "Plataformaren mugak direla eta, WebAuthn ezin da erabili Bitwarden-en aplikazio guztietan. Bi urratseko egiaztatzerako beste hornitzaile bat gaitu beharko duzu, WebAuthn erabili ezin denean zure kontuan sartzeko. Plataforma bateragarriak:" }, "twoFactorWebAuthnSupportWeb": { - "message": "Web vault and browser extensions on a desktop/laptop with a WebAuthn enabled browser (Chrome, Opera, Vivaldi, or Firefox with FIDO U2F enabled)." + "message": "Webguneko kutxa gotorra eta nabigatzailearen gehiagarriak mahaigain/ordenagailu eramangarri batean, WebAuthn nabigatzaile gaitu batekin (Chrome, Opera, Vivaldi edo Firefox, FIDO U2F gaitua duena)." }, "twoFactorRecoveryYourCode": { "message": "Your Bitwarden two-step login recovery code" @@ -1608,10 +1617,10 @@ "message": "Check any usernames or email addresses that you use." }, "checkBreaches": { - "message": "Check Breaches" + "message": "Datu-iragazketak egiaztatu" }, "breachUsernameNotFound": { - "message": "$USERNAME$ was not found in any known data breaches.", + "message": "$USERNAME$ ez da inongo datu-iragazketa ezagunetan aurkitu.", "placeholders": { "username": { "content": "$1", @@ -1620,11 +1629,11 @@ } }, "goodNews": { - "message": "Good News", + "message": "Berri onak", "description": "ex. Good News, No Breached Accounts Found!" }, "breachUsernameFound": { - "message": "$USERNAME$ was found in $COUNT$ different data breaches online.", + "message": "$USERNAME$ $COUNT$ datu-iragazketa ezagunetan aurkitu da.", "placeholders": { "username": { "content": "$1", @@ -1637,28 +1646,28 @@ } }, "breachFound": { - "message": "Breached Accounts Found" + "message": "Iragazitako kontuak aurkitu dira" }, "compromisedData": { - "message": "Compromised data" + "message": "Datu konprometituak" }, "website": { - "message": "Website" + "message": "Webgunea" }, "affectedUsers": { - "message": "Affected Users" + "message": "Eragindako erabiltzaileak" }, "breachOccurred": { - "message": "Breach Occurred" + "message": "Iragazketa bat gertatu da" }, "breachReported": { - "message": "Breach Reported" + "message": "Iragazketa jakinarazia" }, "reportError": { "message": "An error occurred trying to load the report. Try again" }, "billing": { - "message": "Billing" + "message": "Fakturazioa" }, "accountCredit": { "message": "Account Credit", @@ -2371,7 +2380,7 @@ "description": "Desktop app" }, "webVault": { - "message": "Web Vault" + "message": "Webguneko kutxa gotorra" }, "loggedIn": { "message": "Logged in." @@ -3159,7 +3168,7 @@ "acceptPolicies": { "message": "By checking this box you agree to the following:" }, - "acceptPoliciesError": { + "acceptPoliciesRequired": { "message": "Terms of Service and Privacy Policy have not been acknowledged." }, "termsOfService": { @@ -3209,6 +3218,9 @@ "organizationIsDisabled": { "message": "Organization is disabled." }, + "disabledOrganizationFilterError": { + "message": "Items in disabled Organizations cannot be accessed. Contact your Organization owner for assistance." + }, "licenseIsExpired": { "message": "License is expired." }, @@ -3333,20 +3345,26 @@ "clone": { "message": "Clone" }, + "masterPassPolicyTitle": { + "message": "Master password requirements" + }, "masterPassPolicyDesc": { - "message": "Set minimum requirements for master password strength." + "message": "Set requirements for master password strength." + }, + "twoStepLoginPolicyTitle": { + "message": "Require two-step login" }, "twoStepLoginPolicyDesc": { - "message": "Require users to set up two-step login on their personal accounts." + "message": "Require members to set up two-step login." }, "twoStepLoginPolicyWarning": { - "message": "Organization members who are not Owners or Administrators and do not have two-step login enabled for their personal account will be removed from the organization and will receive an email notifying them about the change." + "message": "Organization members who are not Owners or Administrators and do not have two-step login turned on for their account will be removed from the organization and will receive an email notifying them about the change." }, "twoStepLoginPolicyUserWarning": { "message": "You are a member of an organization that requires two-step login to be enabled on your user account. If you disable all two-step login providers you will be automatically removed from these organizations." }, "passwordGeneratorPolicyDesc": { - "message": "Set minimum requirements for password generator configuration." + "message": "Set requirements for password generator." }, "passwordGeneratorPolicyInEffect": { "message": "One or more organization policies are affecting your generator settings." @@ -3564,10 +3582,10 @@ "message": "Link SSO" }, "singleOrg": { - "message": "Single Organization" + "message": "Single organization" }, "singleOrgDesc": { - "message": "Restrict users from being able to join any other organizations." + "message": "Restrict members from joining other organizations." }, "singleOrgBlockCreateMessage": { "message": "Your current organization has a policy that does not allow you to join more than one organization. Please contact your organization admins or sign up from a different Bitwarden account." @@ -3576,16 +3594,16 @@ "message": "Organization members who are not Owners or Administrators and are already a member of another organization will be removed from your organization." }, "requireSso": { - "message": "Single Sign-On Authentication" + "message": "Require single sign-on authentication" }, "requireSsoPolicyDesc": { - "message": "Require users to log in with the Enterprise Single Sign-On method." + "message": "Require members to log in with the Enterprise Single Sign-On method." }, "prerequisite": { "message": "Prerequisite" }, "requireSsoPolicyReq": { - "message": "The Single Organization enterprise policy must be enabled before activating this policy." + "message": "The Single Organization enterprise policy must be turned on before activating this policy." }, "requireSsoPolicyReqError": { "message": "Single Organization policy not enabled." @@ -3880,10 +3898,10 @@ } }, "personalOwnership": { - "message": "Personal Ownership" + "message": "Remove individual vault" }, "personalOwnershipPolicyDesc": { - "message": "Require users to save vault items to an organization by removing the personal ownership option." + "message": "Require members to save items to an organization by removing the individual vault option." }, "personalOwnershipExemption": { "message": "Organization Owners and Administrators are exempt from this policy's enforcement." @@ -3892,10 +3910,10 @@ "message": "Due to an enterprise policy, you are restricted from saving items to your personal vault. Change the Ownership option to an organization and choose from available Collections." }, "disableSend": { - "message": "Disable Send" + "message": "Remove Send" }, "disableSendPolicyDesc": { - "message": "Do not allow users to create or edit a Bitwarden Send. Deleting an existing Send is still allowed.", + "message": "Do not allow members to create or edit sends.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "disableSendExemption": { @@ -3910,7 +3928,7 @@ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendOptions": { - "message": "Send Options", + "message": "Send options", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendOptionsPolicyDesc": { @@ -3921,7 +3939,7 @@ "message": "Organization users that can manage the organization's policies are exempt from this policy's enforcement." }, "disableHideEmail": { - "message": "Do not allow users to hide their email address from recipients when creating or editing a Send.", + "message": "Always show member’s email address with recipients when creating or editing a send.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendOptionsPolicyInEffect": { @@ -4217,10 +4235,10 @@ "message": "Enrollment will allow organization administrators to change your master password" }, "resetPasswordPolicy": { - "message": "Master Password Reset" + "message": "Master password reset" }, "resetPasswordPolicyDescription": { - "message": "Allow administrators in the organization to reset organization users' master password." + "message": "Allow admins to reset master passwords for members." }, "resetPasswordPolicyWarning": { "message": "Users in the organization will need to self-enroll or be auto-enrolled before administrators can reset their master password." @@ -4464,10 +4482,10 @@ "message": "Your Master Password does not meet the policy requirements of this organization. In order to join the organization, you must update your Master Password now. Proceeding will log you out of your current session, requiring you to log back in. Active sessions on other devices may continue to remain active for up to one hour." }, "maximumVaultTimeout": { - "message": "Vault Timeout" + "message": "Vault timeout" }, "maximumVaultTimeoutDesc": { - "message": "Configure a maximum vault timeout for all users." + "message": "Set a maximum vault timeout for members." }, "maximumVaultTimeoutLabel": { "message": "Maximum Vault Timeout" @@ -4507,10 +4525,10 @@ "message": "Vault Timeout is not within allowed range." }, "disablePersonalVaultExport": { - "message": "Disable Personal Vault Export" + "message": "Remove individual vault export" }, "disablePersonalVaultExportDesc": { - "message": "Prohibits users from exporting their private vault data." + "message": "Do not allow members to export their individual vault data." }, "vaultExportDisabled": { "message": "Vault Export Disabled" @@ -4801,19 +4819,19 @@ "message": "Once set up, your configuration will be saved and members will be able to authenticate using their Identity Provider credentials." }, "ssoPolicyHelpStart": { - "message": "Enable the", - "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Enable the SSO Authentication policy to require all members to log in with SSO.'" + "message": "Use the", + "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Use the require single-sign-on authentication policy to require all members to log in with SSO.'" }, "ssoPolicyHelpLink": { - "message": "SSO Authentication policy", - "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Enable the SSO Authentication policy to require all members to log in with SSO.'" + "message": "require single-sign-on authentication policy", + "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Use the require single-sign-on authentication policy to require all members to log in with SSO.'" }, "ssoPolicyHelpEnd": { "message": "to require all members to log in with SSO.", - "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Enable the SSO Authentication policy to require all members to log in with SSO.'" + "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Use the require single-sign-on authentication policy to require all members to log in with SSO.'" }, "ssoPolicyHelpKeyConnector": { - "message": "SSO Authentication and Single Organization policies are required to set up Key Connector decryption." + "message": "The require SSO authentication and single organization policies are required to set up Key Connector decryption." }, "memberDecryptionOption": { "message": "Member Decryption Options" @@ -5165,5 +5183,35 @@ "example": "My Email" } } + }, + "inputRequired": { + "message": "Input is required." + }, + "inputEmail": { + "message": "Input is not an email-address." + }, + "inputMinLength": { + "message": "Input must be at least $COUNT$ characters long.", + "placeholders": { + "count": { + "content": "$1", + "example": "8" + } + } + }, + "fieldsNeedAttention": { + "message": "$COUNT$ field(s) above need your attention.", + "placeholders": { + "count": { + "content": "$1", + "example": "4" + } + } + }, + "turnOn": { + "message": "Turn on" + }, + "on": { + "message": "On" } } diff --git a/apps/web/src/locales/fi/messages.json b/apps/web/src/locales/fi/messages.json index 58323192e3f..d9204bf02f3 100644 --- a/apps/web/src/locales/fi/messages.json +++ b/apps/web/src/locales/fi/messages.json @@ -572,6 +572,9 @@ "createAccount": { "message": "Luo tili" }, + "startTrial": { + "message": "Aloita kokeilu" + }, "logIn": { "message": "Kirjaudu sisään" }, @@ -593,6 +596,9 @@ "masterPassDesc": { "message": "Pääsalasanalla pääset käsiksi holviisi. On erittäin tärkeää, että muistat pääsalasanasi, koska sen palautus ei ole mahdollista, jos unohdat sen." }, + "masterPassImportant": { + "message": "Pääsalasanan palautus ei ole mahdollista, jos unohdat sen!" + }, "masterPassHintDesc": { "message": "Pääsalasanan vihje voi auttaa sinua muistamaan unohtamasi salasanan." }, @@ -623,11 +629,14 @@ "invalidEmail": { "message": "Virheellinen sähköpostiosoite." }, - "masterPassRequired": { + "masterPasswordRequired": { "message": "Pääsalasana vaaditaan." }, - "masterPassLength": { - "message": "Pääsalasanan on oltava vähintään 8 merkkiä pitkä." + "confirmMasterPasswordRequired": { + "message": "Pääsalasanan uudelleensyöttö vaaditaan." + }, + "masterPasswordMinLength": { + "message": "Pääsalasanan tulee sisältää ainakin 8 merkkiä." }, "masterPassDoesntMatch": { "message": "Pääsalasanan vahvistus ei täsmää." @@ -1067,7 +1076,7 @@ "message": "Poista tili" }, "deleteAccountDesc": { - "message": "Jatka alla poistaaksesi tilisi ja kaikki siihen liittyvät tiedot." + "message": "Jatka alla poistaaksesi tilisi ja kaikki holvin tiedot." }, "deleteAccountWarning": { "message": "Tilin poisto on pysyvä toimenpide, eikä sen peruminen ole mahdollista." @@ -1076,7 +1085,7 @@ "message": "Tili poistettu" }, "accountDeletedDesc": { - "message": "Tilisi on suljettu ja kaikki siihen liittyvät tiedot on poistettu." + "message": "Bitwarden-tilisi ja -holvin tiedot on poistettu pysyvästi." }, "myAccount": { "message": "Oma tili" @@ -1267,7 +1276,7 @@ "message": "Poista käytöstä" }, "deactivate": { - "message": "Poista aktivointi" + "message": "Deaktivoi" }, "twoStepLoginProviderEnabled": { "message": "Tämä kaksivaiheisen kirjautumisen todentaja on käytössä tililläsi." @@ -2236,7 +2245,7 @@ "message": "Jäsenellä ei ole enää organisaation käyttöoikeutta, mutta hän voi edelleen käyttää henkilökohtaista hoviaan." }, "activateUserConfirmation": { - "message": "Haluatko varmasti aktivoida käyttäjän ja myöntää heille organisaation käyttöoikeuden?" + "message": "Haluatko varmasti aktivoida käyttäjän ja myöntää hänelle käyttöoikeuden organisaatioon?" }, "removeUserConfirmationKeyConnector": { "message": "Varoitus! Tämä käyttäjä tarvitsee salauksensa hallintaan Key Connectoria. Käyttäjän poistaminen organisaatiostasi poistaa heidän tilinsä käytöstä pysvästi. Toimenpide on pysyvä, eikä sen peruminen ole mahdollista. Haluatko jatkaa?" @@ -2584,7 +2593,7 @@ } }, "deactivatedUserId": { - "message": "Käyttäjän $ID$ aktivointi poistettiin.", + "message": "Käyttäjä $ID$ on deaktivoitu.", "placeholders": { "id": { "content": "$1", @@ -2593,7 +2602,7 @@ } }, "activatedUserId": { - "message": "Käyttäjä $ID$ aktivointiin.", + "message": "Käyttäjä $ID$ on aktivoitu.", "placeholders": { "id": { "content": "$1", @@ -2602,7 +2611,7 @@ } }, "deactivateUserId": { - "message": "Poistetaanko käyttäjän $ID$ aktivointi?", + "message": "Deaktivoidaanko käyttäjä $ID$?", "placeholders": { "id": { "content": "$1", @@ -2812,7 +2821,7 @@ "message": "Sähköpostiosoitteesi on vahvistettu." }, "emailVerifiedFailed": { - "message": "Sähköpostiosoitteesi vahvistus ei onnistunut. Yritä lähettää uusi vahvistussähköposti." + "message": "Sähköpostiosoitettasi ei voitu vahvistaa. Yritä lähettää uusi vahvistussähköposti." }, "emailVerificationRequired": { "message": "Sähköpostiosoitteen vahvistus vaaditaan" @@ -2839,7 +2848,7 @@ "message": "Saat organisaation käyttöoikeuden ylläpitäjän vahvistettua jäsentyytesi. Saat vahvistuksesta ilmoituksen sähköpostitse." }, "inviteAcceptFailed": { - "message": "Kutsun hyväksyntä ei onnistu. Pyydä organisaation ylläpitäjää lähettämään uusi kutsu." + "message": "Kutsua ei voitu hyväksyä. Pyydä organisaation ylläpitäjää lähettämään uusi kutsu." }, "inviteAcceptFailedShort": { "message": "Kutsua ei voitu hyväksyä. $DESCRIPTION$", @@ -3159,7 +3168,7 @@ "acceptPolicies": { "message": "Valitsemalla tämän ruudun hyväksyt seuraavat:" }, - "acceptPoliciesError": { + "acceptPoliciesRequired": { "message": "Käyttöehtoja ja tietosuojakäytäntöä ei ole vahvistettu." }, "termsOfService": { @@ -3209,6 +3218,9 @@ "organizationIsDisabled": { "message": "Organisaatio on poistettu käytöstä." }, + "disabledOrganizationFilterError": { + "message": "Käytöstä poistettujen organisaatioiden kohteet eivät ole käytettävissä. Ole yhteydessä organisaation omistajaan saadaksesi apua." + }, "licenseIsExpired": { "message": "Lisenssi on erääntynyt." }, @@ -3333,20 +3345,26 @@ "clone": { "message": "Kloonaa" }, + "masterPassPolicyTitle": { + "message": "Pääsalasanan vaatimukset" + }, "masterPassPolicyDesc": { - "message": "Aseta pääsalasanan vahvuuden vähimmäisvaatimukset." + "message": "Aseta pääsalasanan vahvuusvaatimukset." + }, + "twoStepLoginPolicyTitle": { + "message": "Vaadi kaksivaiheinen kirjautuminen" }, "twoStepLoginPolicyDesc": { - "message": "Vaadi käyttäjiä ottamaan kaksivaiheinen kirjautuminen käyttöön henkilökohtaisilla tileillään." + "message": "Vaadi jäseniä määrittämään kaksivaiheinen kirjautuminen." }, "twoStepLoginPolicyWarning": { - "message": "Organisaation jäsenet, jotka eivät ole sen omistajia tai ylläpitäjiä, eivätkä ole ottaneet kaksivaiheista kirjautumista käyttöön henkilökohtaisilla tileillään, poistetaan organisaatiosta ja heille ilmoitetaan muutoksesta sähköpostitse." + "message": "Organisaation jäsenet, jotka eivät ole sen omistajia tai ylläpitäjiä, eivätkä ole ottaneet tileillään käyttöön kaksivaiheista kirjautumista, poistetaan organisaatiosta ja heille ilmoitetaan muutoksesta sähköpostitse." }, "twoStepLoginPolicyUserWarning": { "message": "Olet jäsenenä organisaatiossa, joka vaatii kaksivaiheisen kirjautumisen käyttöä käyttäjätililläsi. Jos poistat kaikki kaksivaiheisen kirjautumisen todentajat käytöstä, sinut poistetaan automaattisesti näistä organisaatioista." }, "passwordGeneratorPolicyDesc": { - "message": "Aseta salasanageneraattorin määritysten vähimmäisvaatimukset." + "message": "Aseta salasanageneraattorin vaatimukset." }, "passwordGeneratorPolicyInEffect": { "message": "Yksi tai useampi organisaatiokäytäntö vaikuttaa generaattorisi asetuksiin." @@ -3403,13 +3421,13 @@ "message": "Käyttäjän asetus" }, "vaultTimeoutAction": { - "message": "Holvin aikakatkaisun toiminto" + "message": "Holvin aikakatkaisutoiminto" }, "vaultTimeoutActionLockDesc": { - "message": "Holvin käyttö edellyttää pääsalasanaa tai muuta avaustapaa." + "message": "Holvisi käyttö edellyttää pääsalasanaa tai muuta avaustapaa." }, "vaultTimeoutActionLogOutDesc": { - "message": "Holvin käyttö edellyttää uuttaa todennusta." + "message": "Holvisi käyttö edellyttää uutta todennusta." }, "lock": { "message": "Lukitse", @@ -3501,7 +3519,7 @@ "message": "Uloskirjautuminen estää pääsyn holviisi ja vaatii ajan umpeuduttua todennuksen internet-yhteyden välityksellä. Haluatko varmasti käyttää tätä asetusta?" }, "vaultTimeoutLogOutConfirmationTitle": { - "message": "Aikakatkaisun toiminnon vahvistus" + "message": "Aikakatkaisutoiminnon vahvistus" }, "hidePasswords": { "message": "Piilota salasanat" @@ -3567,7 +3585,7 @@ "message": "Yksittäinen organisaatio" }, "singleOrgDesc": { - "message": "Estä käyttäjiä liittymästä muihin organisaatioihin." + "message": "Estä jäseniä liittymästä muihin organisaatioihin." }, "singleOrgBlockCreateMessage": { "message": "Nykyisen organisaatiosi käytäntö ei salli liittymistä useampaan kuin yhteen organisaatioon. Ota yhteyttä organisaatiosi ylläpitäjiin tai liity eri Bitwarden-tilin kautta." @@ -3576,10 +3594,10 @@ "message": "Organisaation jäsenet, jotka eivät ole omistajia tai ylläpitäjiä ja jotka ovat jo toisen organisaation jäseniä, poistetaan organisaatiostasi." }, "requireSso": { - "message": "Kertakirjautumisen (SSO) todennus" + "message": "Vaadi kertakirjautumisen (SSO) todennus" }, "requireSsoPolicyDesc": { - "message": "Vaadi käyttäjiä kirjautumaan sisään käyttäen yrityksen kertakirjautumista (SSO)." + "message": "Vaadi jäseniä kirjautumaan käyttäen yrityksen kertakirjautumista (SSO)." }, "prerequisite": { "message": "Edellytys" @@ -3667,7 +3685,7 @@ "message": "Poistettu käytöstä" }, "deactivated": { - "message": "Aktivointi poistettiin" + "message": "Deaktivoitu" }, "sendLink": { "message": "Send-linkki", @@ -3810,7 +3828,7 @@ "message": "Sinut on kutsuttu yllä mainitun käyttäjän varmuuskontaktiksi. Hyväksyäksesi kutsun, sinun tulee kirjautua tilillesi tai luoda uusi Bitwarden tili." }, "emergencyInviteAcceptFailed": { - "message": "Kutsun hyväksyntä ei onnistu. Pyydä käyttäjää lähettämään uusi kutsu." + "message": "Kutsua ei voitu hyväksyä. Pyydä käyttäjää lähettämään uusi kutsu." }, "emergencyInviteAcceptFailedShort": { "message": "Kutsua ei voitu hyväksyä. $DESCRIPTION$", @@ -3880,10 +3898,10 @@ } }, "personalOwnership": { - "message": "Henkilökohtainen omistus" + "message": "Poista yksityinen holvi" }, "personalOwnershipPolicyDesc": { - "message": "Vaadi käyttäjiä tallentamaan holvin kohteet organisaatiolle poistamalla henkilökohtaisen omistuksen valinta." + "message": "Vaadi jäseniä tallentamaan holvin kohteet organisaatiolle poistamalla yksityisen holvin valinta." }, "personalOwnershipExemption": { "message": "Organisaation omistajat ja ylläpitäjät on vapautettu tämän käytännön piiristä." @@ -3892,10 +3910,10 @@ "message": "Yrityksen asettaman käytännön johdosta kohteiden tallennus omaan holviisi ei ole mahdollista. Muuta omistusasetus organisaatiolle ja valitse käytettävissä olevista kokoelmista." }, "disableSend": { - "message": "Poista Send käytöstä" + "message": "Poista Send" }, "disableSendPolicyDesc": { - "message": "Älä salli käyttäjien luoda tai muokata Bitwarden Sendejä. Olemassa olevan Sendin poisto sallitaan edelleen.", + "message": "Älä salli käyttäjien luoda tai muokata Sendejä.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "disableSendExemption": { @@ -3921,7 +3939,7 @@ "message": "Käytäntöä ei pakoteta käyttöön niille organisaation käyttäjille, joilla on organisaation käytäntöjen hallintaoikeudet." }, "disableHideEmail": { - "message": "Estä käyttäjiltä sähköpostiosoitteen piilotus kun he luovat tai muokkaavat Sendiä.", + "message": "Näytä jäsenen sähköpostiosoite aina vastaanottajien kanssa, kun luodaan tai muokataan Sendiä.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendOptionsPolicyInEffect": { @@ -4220,7 +4238,7 @@ "message": "Pääsalasanan palautus" }, "resetPasswordPolicyDescription": { - "message": "Salli organisaation ylläpitäjien palauttaa organisaation käyttäjien pääsalasanat." + "message": "Salli ylläpitäjien palauttaa jäsenten pääsalasanat." }, "resetPasswordPolicyWarning": { "message": "Organisaation käyttäjien on liityttävä itse tai automaattisen liitoksen välityksellä ennen kuin ylläpitäjät voivat palauttaa heidän pääsalasanojaan." @@ -4271,10 +4289,10 @@ "message": "Haluatko varmasti poistaa seuraavat käyttäjät? Toiminto saattaa kestää muutamia sekunteja, eikä sen keskeytys tai peruminen ole mahdollista." }, "deactivateUsersWarning": { - "message": "Haluatko varmasti poistaa seuraavien käyttäjien aktivoinnin? Heillä ei enää ole organisaation käyttöoikeutta, mutta he voivat edelleen käyttää henkilökohtaisia holvejaan. Toiminto saattaa kestää muutamia sekunteja, eikä sen keskeytys tai peruminen ole mahdollista." + "message": "Haluatko varmasti deaktivoida seuraavat käyttäjät? Heillä ei enää ole organisaation käyttöoikeutta, mutta he voivat edelleen käyttää henkilökohtaisia holvejaan. Toiminto saattaa kestää muutamia sekunteja, eikä sen keskeytys tai peruminen ole mahdollista." }, "activateUsersWarning": { - "message": "Haluatko varmasti aktivoida seuraavat käyttäjät ja myöntää heille organisaation käyttöoikeuden? Toiminto saattaa kestää muutamia sekunteja, eikä sen keskeytys tai peruminen ole mahdollista." + "message": "Haluatko varmasti aktivoida seuraavat käyttäjät ja myöntää heille käyttöoikeuden organisaatioon? Toiminto saattaa kestää muutamia sekunteja, eikä sitä ole mahdollista keskeyttää tai perua." }, "theme": { "message": "Teema" @@ -4307,7 +4325,7 @@ "message": "Poistettu onnistuneesti." }, "bulkDeactivatedMessage": { - "message": "Aktivoinnin poisto onnistui" + "message": "Deaktivointi onnistui" }, "bulkActivatedMessage": { "message": "Aktivointi onnistui" @@ -4322,7 +4340,7 @@ "message": "Poista käyttäjiä" }, "deactivateUsers": { - "message": "Poista käyttäjien aktivointi" + "message": "Deaktivoi käyttäjät" }, "activateUsers": { "message": "Aktivoi käyttäjät" @@ -4373,7 +4391,7 @@ "message": "Sinut on kutsuttu liittymään yllä mainittuun todentajaan. Hyväksyäksesi kutsun, sinun tulee kirjautua tilillesi tai luoda uusi Bitwarden-tili." }, "providerInviteAcceptFailed": { - "message": "Kutsua ei voida hyväksyä. Pyydä todentajan ylläpitäjää lähettämään uusi kutsu." + "message": "Kutsua ei voitu hyväksyä. Pyydä todentajan ylläpitäjää lähettämään uusi kutsu." }, "providerInviteAcceptedDesc": { "message": "Pääset käyttämään todentajaa ylläpitäjän vahvistettua jäsentyytesi. Saat tästä ilmoituksen sähköpostitse." @@ -4467,13 +4485,13 @@ "message": "Holvin aikakatkaisu" }, "maximumVaultTimeoutDesc": { - "message": "Määritä holvin aikakatkaisun enimmäisviive kaikille käyttäjille." + "message": "Aseta jäsenille holvin aikakatkaisun enimmäisaika." }, "maximumVaultTimeoutLabel": { - "message": "Holvin aikakatkaisun enimmäisviive" + "message": "Holvin aikakatkaisun enimmäisaika" }, "invalidMaximumVaultTimeout": { - "message": "Virheellinen holvin aikakatkaisun enimmäisviive." + "message": "Virheellinen holvin aikakatkaisun enimmäisaika." }, "hours": { "message": "Tuntia" @@ -4482,7 +4500,7 @@ "message": "Minuuttia" }, "vaultTimeoutPolicyInEffect": { - "message": "Organisaatiosi käytännöt vaikuttavat holvisi aikakatkaisuun. Suurin sallittu viive on $HOURS$ tunti(a) ja $MINUTES$ minuutti(a)", + "message": "Organisaatiosi käytännöt vaikuttavat holvisi aikakatkaisuun. Suurin sallittu aika on $HOURS$ tunti(a) ja $MINUTES$ minuutti(a)", "placeholders": { "hours": { "content": "$1", @@ -4495,22 +4513,22 @@ } }, "customVaultTimeout": { - "message": "Mukautettu holvin aikakatkaisuviive" + "message": "Mukautettu holvin aikakatkaisu" }, "vaultTimeoutToLarge": { - "message": "Holvisi aikakatkaisuviive ylittää organisaatiosi asettamat rajoitukset." + "message": "Holvisi aikakatkaisu ylittää organisaatiosi asettamat rajoitukset." }, "vaultCustomTimeoutMinimum": { - "message": "Lyhin omavalintainen aikakatkaisuaika on 1 minuutti." + "message": "Mukautetun aikakatkaisun vähimmäisaika on 1 minuutti." }, "vaultTimeoutRangeError": { - "message": "Holvin aikakatkaisuaika ei ole sallitun alueen sisällä." + "message": "Holvin aikakatkaisu ei ole sallitun alueen sisällä." }, "disablePersonalVaultExport": { - "message": "Poista henkilökohtaisen holvin vienti käytöstä" + "message": "Estä yksityisen holvin vienti" }, "disablePersonalVaultExportDesc": { - "message": "Estää käyttäjiä viemästä yksityisen holvinsa tietoja." + "message": "Älä salli jäseniä viemästä yksityisten holviensa tietoja." }, "vaultExportDisabled": { "message": "Holvin vienti on poistettu käytöstä" @@ -4678,10 +4696,10 @@ "message": "Sinulle on tarjottu ilmaista Bitwarden Perheille -organisaatiota. Jatkaaksesi sinun on kirjauduttava tarjouksen saaneelle tilille." }, "sponsoredFamiliesAcceptFailed": { - "message": "Tarjousta ei voida hyväksyä. Lähetä tarjoussähköposti uudestaan yritystililtäsi ja yritä uudelleen." + "message": "Tarjousta ei voitu hyväksyä. Lähetä tarjoussähköposti uudestaan yritystililtäsi ja yritä uudelleen." }, "sponsoredFamiliesAcceptFailedShort": { - "message": "Tarjousta ei voida hyväksyä. $DESCRIPTION$", + "message": "Kutsua ei voitu hyväksyä. $DESCRIPTION$", "placeholders": { "description": { "content": "$1", @@ -4777,7 +4795,7 @@ "message": "Virheellinen todennuskoodi" }, "convertOrganizationEncryptionDesc": { - "message": "$ORGANIZATION$ käyttää kertakirjautumista (SSO) itse ylläpitämänsä avainpalvelimen kanssa. Organisaation jäsenet eivät enää tarvitse pääsalasanaa kirjautumiseen.", + "message": "$ORGANIZATION$ käyttää kertakirjautumista (SSO) itse ylläpidetyllä avainpalvelimella. Organisaation jäsenet eivät enää tarvitse pääsalasanaa kirjautumiseen.", "placeholders": { "organization": { "content": "$1", @@ -4801,19 +4819,19 @@ "message": "Määrityksen jälkeen asetukset tallennetaan ja käyttäjät voivat tunnistautua käyttäen tunnistustietojen tarjoajansa (Identity Provider) tietoja." }, "ssoPolicyHelpStart": { - "message": "Ota", - "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Enable the SSO Authentication policy to require all members to log in with SSO.'" + "message": "Käytä", + "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Use the require single-sign-on authentication policy to require all members to log in with SSO.'" }, "ssoPolicyHelpLink": { - "message": "SSO-todennuskäytäntö", - "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Enable the SSO Authentication policy to require all members to log in with SSO.'" + "message": "\"Vaadi kertakirjautumisen (SSO) todennus\" -käytäntöä", + "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Use the require single-sign-on authentication policy to require all members to log in with SSO.'" }, "ssoPolicyHelpEnd": { "message": "käyttöön pakottaaksesi kertakirjautumisen kaikille jäsenille.", - "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Enable the SSO Authentication policy to require all members to log in with SSO.'" + "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Use the require single-sign-on authentication policy to require all members to log in with SSO.'" }, "ssoPolicyHelpKeyConnector": { - "message": "\"SSO-todennus\" ja \"Yksittäinen organisaatio\" -käytännöt vaaditaan Key Connector -salauksenpurun määritykseen." + "message": "\"Vaadi kertakirjautumisen (SSO) todennus\" ja \"Yksittäinen organisaatio\" -käytännöt vaaditaan Key Connector -salauksenpurun määritykseen." }, "memberDecryptionOption": { "message": "Jäsenen salauksenpurkuvalinnat" @@ -4903,7 +4921,7 @@ "message": "Uudista tunniste" }, "rotateBillingSyncTokenWarning": { - "message": "Jos jatkat, on itse ylläpitämäsi palvelimen laskutuksen synkronointi määritettävä uudelleen." + "message": "Jos jatkat, tulee itse ylläpitämäsi palvelimen laskutuksen synkronointi määrittää uudelleen." }, "rotateBillingSyncTokenTitle": { "message": "Laskutuksen synkronointitunnisteen uudistus mitätöi edellisen tunnisteen." @@ -4912,7 +4930,7 @@ "message": "Itse ylläpidetty" }, "selfHostingEnterpriseOrganizationSectionCopy": { - "message": "Määrittääksesi organisaatiosi itse ylläpitämällesi palvelimelle, on lisenssitiedostosi tallennettava sinne. Sinun on määritettävä laskutuksen synkronointi, jotta ilmaiset Perheille-tilaukset ja edistyneet laskutusominaisuudet ovat itse ylläpitämäsi organisaation käytettävissä." + "message": "Määrittääksesi organisaation omalle palvelimellesi, tulee lisenssitiedosto tallentaa sinne. Sinun on määritettävä laskutuksen synkronointi, jotta ilmaiset Perheille-tilaukset ja edistyneet laskutusominaisuudet ovat itse ylläpitämäsi organisaation käytettävissä." }, "billingSyncApiKeyRotated": { "message": "Tunniste uudistettiin." @@ -4921,19 +4939,19 @@ "message": "Laskutuksen synkronointi" }, "billingSyncDesc": { - "message": "Laskutuksen synkronointi mahdollistaa jäsenille ilmaiset Perheille-tilaukset ja edistyneet laskutusominaisuudet liittämällä itse ylläpitämäsi Bitwarden-palvelimen Bitwardenin pilvipalvelimeen." + "message": "Laskutuksen synkronointi mahdollistaa jäsenille ilmaiset Perheille-tilaukset ja edistyneet laskutusominaisuudet liittämällä itse ylläpitämäsi Bitwarden-palvelin Bitwardenin pilvipalvelimeen." }, "billingSyncKeyDesc": { - "message": "Tämän lomakkeen täyttöön tarvitaan laskutuksen synkronointitunniste pilviorganisaatiosi tilausasetuksista." + "message": "Lomakkeen täyttö edellyttää laskutuksen synkronointitunnisteen pilviorganisaatiosi tilausasetuksista." }, "billingSyncKey": { "message": "Laskutuksen synkronointitunniste" }, "active": { - "message": "Käytössä" + "message": "Aktiivinen" }, "inactive": { - "message": "Ei käytössä" + "message": "Ei aktivoitu" }, "sentAwaitingSync": { "message": "Lähetetty (odottaa synkronointia)" @@ -5165,5 +5183,35 @@ "example": "My Email" } } + }, + "inputRequired": { + "message": "Syöte vaaditaan." + }, + "inputEmail": { + "message": "Syöte ei ole sähköpostiosoite." + }, + "inputMinLength": { + "message": "Syötteen tulee sisältää ainakin $COUNT$ merkkiä.", + "placeholders": { + "count": { + "content": "$1", + "example": "8" + } + } + }, + "fieldsNeedAttention": { + "message": "$COUNT$ yllä oleva(a) kenttä(ä) vaatii huomiotasi.", + "placeholders": { + "count": { + "content": "$1", + "example": "4" + } + } + }, + "turnOn": { + "message": "Ota käyttöön" + }, + "on": { + "message": "Käytössä" } } diff --git a/apps/web/src/locales/fil/messages.json b/apps/web/src/locales/fil/messages.json index ecd7d00efa9..675c4a10779 100644 --- a/apps/web/src/locales/fil/messages.json +++ b/apps/web/src/locales/fil/messages.json @@ -572,6 +572,9 @@ "createAccount": { "message": "Create Account" }, + "startTrial": { + "message": "Start Trial" + }, "logIn": { "message": "Log In" }, @@ -593,6 +596,9 @@ "masterPassDesc": { "message": "The master password is the password you use to access your vault. It is very important that you do not forget your master password. There is no way to recover the password in the event that you forget it." }, + "masterPassImportant": { + "message": "Master passwords cannot be recovered if you forget it!" + }, "masterPassHintDesc": { "message": "A master password hint can help you remember your password if you forget it." }, @@ -623,10 +629,13 @@ "invalidEmail": { "message": "Invalid email address." }, - "masterPassRequired": { + "masterPasswordRequired": { "message": "Master password is required." }, - "masterPassLength": { + "confirmMasterPasswordRequired": { + "message": "Master password retype is required." + }, + "masterPasswordMinLength": { "message": "Master password must be at least 8 characters long." }, "masterPassDoesntMatch": { @@ -882,7 +891,7 @@ "message": "Your vault data has been exported." }, "passwordGenerator": { - "message": "Password Generator" + "message": "Password generator" }, "minComplexityScore": { "message": "Minimum Complexity Score" @@ -1067,7 +1076,7 @@ "message": "Delete Account" }, "deleteAccountDesc": { - "message": "Proceed below to delete your account and all associated data." + "message": "Proceed below to delete your account and all vault data." }, "deleteAccountWarning": { "message": "Deleting your account is permanent. It cannot be undone." @@ -1076,7 +1085,7 @@ "message": "Account Deleted" }, "accountDeletedDesc": { - "message": "Your account has been closed and all associated data has been deleted." + "message": "Your Bitwarden account and vault data were permanently deleted." }, "myAccount": { "message": "My Account" @@ -1214,7 +1223,7 @@ "message": "Domains updated" }, "twoStepLogin": { - "message": "Two-step Login" + "message": "Two-step login" }, "twoStepLoginDesc": { "message": "Secure your account by requiring an additional step when logging in." @@ -3159,7 +3168,7 @@ "acceptPolicies": { "message": "By checking this box you agree to the following:" }, - "acceptPoliciesError": { + "acceptPoliciesRequired": { "message": "Terms of Service and Privacy Policy have not been acknowledged." }, "termsOfService": { @@ -3209,6 +3218,9 @@ "organizationIsDisabled": { "message": "Organization is disabled." }, + "disabledOrganizationFilterError": { + "message": "Items in disabled Organizations cannot be accessed. Contact your Organization owner for assistance." + }, "licenseIsExpired": { "message": "License is expired." }, @@ -3333,20 +3345,26 @@ "clone": { "message": "Clone" }, + "masterPassPolicyTitle": { + "message": "Master password requirements" + }, "masterPassPolicyDesc": { - "message": "Set minimum requirements for master password strength." + "message": "Set requirements for master password strength." + }, + "twoStepLoginPolicyTitle": { + "message": "Require two-step login" }, "twoStepLoginPolicyDesc": { - "message": "Require users to set up two-step login on their personal accounts." + "message": "Require members to set up two-step login." }, "twoStepLoginPolicyWarning": { - "message": "Organization members who are not Owners or Administrators and do not have two-step login enabled for their personal account will be removed from the organization and will receive an email notifying them about the change." + "message": "Organization members who are not Owners or Administrators and do not have two-step login turned on for their account will be removed from the organization and will receive an email notifying them about the change." }, "twoStepLoginPolicyUserWarning": { "message": "You are a member of an organization that requires two-step login to be enabled on your user account. If you disable all two-step login providers you will be automatically removed from these organizations." }, "passwordGeneratorPolicyDesc": { - "message": "Set minimum requirements for password generator configuration." + "message": "Set requirements for password generator." }, "passwordGeneratorPolicyInEffect": { "message": "One or more organization policies are affecting your generator settings." @@ -3564,10 +3582,10 @@ "message": "Link SSO" }, "singleOrg": { - "message": "Single Organization" + "message": "Single organization" }, "singleOrgDesc": { - "message": "Restrict users from being able to join any other organizations." + "message": "Restrict members from joining other organizations." }, "singleOrgBlockCreateMessage": { "message": "Your current organization has a policy that does not allow you to join more than one organization. Please contact your organization admins or sign up from a different Bitwarden account." @@ -3576,16 +3594,16 @@ "message": "Organization members who are not Owners or Administrators and are already a member of another organization will be removed from your organization." }, "requireSso": { - "message": "Single Sign-On Authentication" + "message": "Require single sign-on authentication" }, "requireSsoPolicyDesc": { - "message": "Require users to log in with the Enterprise Single Sign-On method." + "message": "Require members to log in with the Enterprise Single Sign-On method." }, "prerequisite": { "message": "Prerequisite" }, "requireSsoPolicyReq": { - "message": "The Single Organization enterprise policy must be enabled before activating this policy." + "message": "The Single Organization enterprise policy must be turned on before activating this policy." }, "requireSsoPolicyReqError": { "message": "Single Organization policy not enabled." @@ -3880,10 +3898,10 @@ } }, "personalOwnership": { - "message": "Personal Ownership" + "message": "Remove individual vault" }, "personalOwnershipPolicyDesc": { - "message": "Require users to save vault items to an organization by removing the personal ownership option." + "message": "Require members to save items to an organization by removing the individual vault option." }, "personalOwnershipExemption": { "message": "Organization Owners and Administrators are exempt from this policy's enforcement." @@ -3892,10 +3910,10 @@ "message": "Due to an enterprise policy, you are restricted from saving items to your personal vault. Change the Ownership option to an organization and choose from available Collections." }, "disableSend": { - "message": "Disable Send" + "message": "Remove Send" }, "disableSendPolicyDesc": { - "message": "Do not allow users to create or edit a Bitwarden Send. Deleting an existing Send is still allowed.", + "message": "Do not allow members to create or edit sends.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "disableSendExemption": { @@ -3910,7 +3928,7 @@ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendOptions": { - "message": "Send Options", + "message": "Send options", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendOptionsPolicyDesc": { @@ -3921,7 +3939,7 @@ "message": "Organization users that can manage the organization's policies are exempt from this policy's enforcement." }, "disableHideEmail": { - "message": "Do not allow users to hide their email address from recipients when creating or editing a Send.", + "message": "Always show member’s email address with recipients when creating or editing a send.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendOptionsPolicyInEffect": { @@ -4217,10 +4235,10 @@ "message": "Enrollment will allow organization administrators to change your master password" }, "resetPasswordPolicy": { - "message": "Master Password Reset" + "message": "Master password reset" }, "resetPasswordPolicyDescription": { - "message": "Allow administrators in the organization to reset organization users' master password." + "message": "Allow admins to reset master passwords for members." }, "resetPasswordPolicyWarning": { "message": "Users in the organization will need to self-enroll or be auto-enrolled before administrators can reset their master password." @@ -4464,10 +4482,10 @@ "message": "Your Master Password does not meet the policy requirements of this organization. In order to join the organization, you must update your Master Password now. Proceeding will log you out of your current session, requiring you to log back in. Active sessions on other devices may continue to remain active for up to one hour." }, "maximumVaultTimeout": { - "message": "Vault Timeout" + "message": "Vault timeout" }, "maximumVaultTimeoutDesc": { - "message": "Configure a maximum vault timeout for all users." + "message": "Set a maximum vault timeout for members." }, "maximumVaultTimeoutLabel": { "message": "Maximum Vault Timeout" @@ -4507,10 +4525,10 @@ "message": "Vault Timeout is not within allowed range." }, "disablePersonalVaultExport": { - "message": "Disable Personal Vault Export" + "message": "Remove individual vault export" }, "disablePersonalVaultExportDesc": { - "message": "Prohibits users from exporting their private vault data." + "message": "Do not allow members to export their individual vault data." }, "vaultExportDisabled": { "message": "Vault Export Disabled" @@ -4801,19 +4819,19 @@ "message": "Once set up, your configuration will be saved and members will be able to authenticate using their Identity Provider credentials." }, "ssoPolicyHelpStart": { - "message": "Enable the", - "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Enable the SSO Authentication policy to require all members to log in with SSO.'" + "message": "Use the", + "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Use the require single-sign-on authentication policy to require all members to log in with SSO.'" }, "ssoPolicyHelpLink": { - "message": "SSO Authentication policy", - "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Enable the SSO Authentication policy to require all members to log in with SSO.'" + "message": "require single-sign-on authentication policy", + "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Use the require single-sign-on authentication policy to require all members to log in with SSO.'" }, "ssoPolicyHelpEnd": { "message": "to require all members to log in with SSO.", - "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Enable the SSO Authentication policy to require all members to log in with SSO.'" + "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Use the require single-sign-on authentication policy to require all members to log in with SSO.'" }, "ssoPolicyHelpKeyConnector": { - "message": "SSO Authentication and Single Organization policies are required to set up Key Connector decryption." + "message": "The require SSO authentication and single organization policies are required to set up Key Connector decryption." }, "memberDecryptionOption": { "message": "Member Decryption Options" @@ -5165,5 +5183,35 @@ "example": "My Email" } } + }, + "inputRequired": { + "message": "Input is required." + }, + "inputEmail": { + "message": "Input is not an email-address." + }, + "inputMinLength": { + "message": "Input must be at least $COUNT$ characters long.", + "placeholders": { + "count": { + "content": "$1", + "example": "8" + } + } + }, + "fieldsNeedAttention": { + "message": "$COUNT$ field(s) above need your attention.", + "placeholders": { + "count": { + "content": "$1", + "example": "4" + } + } + }, + "turnOn": { + "message": "Turn on" + }, + "on": { + "message": "On" } } diff --git a/apps/web/src/locales/fr/messages.json b/apps/web/src/locales/fr/messages.json index 27274b0150f..a2b2945fad0 100644 --- a/apps/web/src/locales/fr/messages.json +++ b/apps/web/src/locales/fr/messages.json @@ -572,6 +572,9 @@ "createAccount": { "message": "Créer un compte" }, + "startTrial": { + "message": "Commencer la Période d'Essai" + }, "logIn": { "message": "S'identifier" }, @@ -593,6 +596,9 @@ "masterPassDesc": { "message": "Le mot de passe maître est le mot de passe que vous utilisez pour accéder à votre coffre. Il est très important de ne pas l'oublier. Il n'existe aucun moyen de le récupérer si vous le perdez." }, + "masterPassImportant": { + "message": "Le mot de passe maître ne peut pas être récupérés si vous l'oubliez!" + }, "masterPassHintDesc": { "message": "Un indice de mot de passe maître peut vous aider à vous rappeler de votre mot de passe en cas d'oubli." }, @@ -623,11 +629,14 @@ "invalidEmail": { "message": "Adresse e-mail invalide." }, - "masterPassRequired": { + "masterPasswordRequired": { "message": "Le mot de passe maître est requis." }, - "masterPassLength": { - "message": "Le mot de passe maître doit au moins contenir 8 caractères." + "confirmMasterPasswordRequired": { + "message": "Le mot de passe maître doit être entré de nouveau." + }, + "masterPasswordMinLength": { + "message": "Le mot de passe maître doit comporter au moins 8 caractères." }, "masterPassDoesntMatch": { "message": "La confirmation du mot de passe maître ne correspond pas." @@ -3159,8 +3168,8 @@ "acceptPolicies": { "message": "En cochant cette case, vous acceptez les éléments suivants :" }, - "acceptPoliciesError": { - "message": "Les conditions d'utilisation et la politique de confidentialité n'ont pas été acceptées." + "acceptPoliciesRequired": { + "message": "Les Conditions d'Utilisation et la Politique de Confidentialité n'ont pas été acceptées." }, "termsOfService": { "message": "Conditions d'utilisation" @@ -3209,6 +3218,9 @@ "organizationIsDisabled": { "message": "L'organisation est désactivée." }, + "disabledOrganizationFilterError": { + "message": "Items in disabled Organizations cannot be accessed. Contact your Organization owner for assistance." + }, "licenseIsExpired": { "message": "La licence a expiré." }, @@ -3333,8 +3345,14 @@ "clone": { "message": "Cloner" }, + "masterPassPolicyTitle": { + "message": "Exigences pour le mot de passe maître" + }, "masterPassPolicyDesc": { - "message": "Définir des exigences minimales pour la force du mot de passe maître." + "message": "Définir les exigences minimales pour la force du mot de passe maître." + }, + "twoStepLoginPolicyTitle": { + "message": "Nécessite une connexion en deux étapes" }, "twoStepLoginPolicyDesc": { "message": "Exiger que les utilisateurs définissent une connexion en deux étapes sur leurs comptes personnels." @@ -4802,15 +4820,15 @@ }, "ssoPolicyHelpStart": { "message": "Activer la", - "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Enable the SSO Authentication policy to require all members to log in with SSO.'" + "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Use the require single-sign-on authentication policy to require all members to log in with SSO.'" }, "ssoPolicyHelpLink": { "message": "politique de connexion SSO", - "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Enable the SSO Authentication policy to require all members to log in with SSO.'" + "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Use the require single-sign-on authentication policy to require all members to log in with SSO.'" }, "ssoPolicyHelpEnd": { "message": "pour obliger tous les membres à se connecter avec SSO.", - "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Enable the SSO Authentication policy to require all members to log in with SSO.'" + "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Use the require single-sign-on authentication policy to require all members to log in with SSO.'" }, "ssoPolicyHelpKeyConnector": { "message": "Les politiques \"Authentification SSO\" et \"Organisation Unique\" sont requises pour mettre en place le déchiffrement avec Key Connector." @@ -5165,5 +5183,35 @@ "example": "My Email" } } + }, + "inputRequired": { + "message": "Entrée requise." + }, + "inputEmail": { + "message": "L'entrée n'est pas une adresse e-mail." + }, + "inputMinLength": { + "message": "L'entrée doit comporter au moins $COUNT$ caractères.", + "placeholders": { + "count": { + "content": "$1", + "example": "8" + } + } + }, + "fieldsNeedAttention": { + "message": "$COUNT$ champ(s) ci-dessus nécessitent votre attention.", + "placeholders": { + "count": { + "content": "$1", + "example": "4" + } + } + }, + "turnOn": { + "message": "Activer" + }, + "on": { + "message": "Activé" } } diff --git a/apps/web/src/locales/he/messages.json b/apps/web/src/locales/he/messages.json index d8f1706d92d..294d0234c92 100644 --- a/apps/web/src/locales/he/messages.json +++ b/apps/web/src/locales/he/messages.json @@ -572,6 +572,9 @@ "createAccount": { "message": "צור חשבון" }, + "startTrial": { + "message": "Start Trial" + }, "logIn": { "message": "התחבר" }, @@ -593,6 +596,9 @@ "masterPassDesc": { "message": "הסיסמה הראשית היא הסיסמה שבאמצעותה תיגש לכספת שלך. חשוב מאוד שלא תשכח את הסיסמה הזו. אין שום דרך לשחזר אותה במקרה ושכחת אותה." }, + "masterPassImportant": { + "message": "Master passwords cannot be recovered if you forget it!" + }, "masterPassHintDesc": { "message": "ניתן להשתמש ברמז לסיסמה הראשית אם שכחת אותה." }, @@ -623,11 +629,14 @@ "invalidEmail": { "message": "כתובת אימייל לא תקינה." }, - "masterPassRequired": { - "message": "יש להזין את הסיסמה הראשית." + "masterPasswordRequired": { + "message": "Master password is required." }, - "masterPassLength": { - "message": "הסיסמה הראשית חייבת להיות לפחות באורך 8 תווים." + "confirmMasterPasswordRequired": { + "message": "Master password retype is required." + }, + "masterPasswordMinLength": { + "message": "Master password must be at least 8 characters long." }, "masterPassDoesntMatch": { "message": "שדה אימות סיסמה ראשית לא תואם." @@ -3159,8 +3168,8 @@ "acceptPolicies": { "message": "סימון תיבה זו מהווה את הסכמתך לתנאים הבאים:" }, - "acceptPoliciesError": { - "message": "לא הסכמת לתנאי השירות ומדיניות הפרטיות." + "acceptPoliciesRequired": { + "message": "Terms of Service and Privacy Policy have not been acknowledged." }, "termsOfService": { "message": "תנאי שירות" @@ -3209,6 +3218,9 @@ "organizationIsDisabled": { "message": "הארגון הושבת." }, + "disabledOrganizationFilterError": { + "message": "Items in disabled Organizations cannot be accessed. Contact your Organization owner for assistance." + }, "licenseIsExpired": { "message": "תוקף הרשיון הסתיים." }, @@ -3333,9 +3345,15 @@ "clone": { "message": "שכפול" }, + "masterPassPolicyTitle": { + "message": "Master password requirements" + }, "masterPassPolicyDesc": { "message": "קבע דרישות מינימום עבור חוזק הסיסמה הראשית." }, + "twoStepLoginPolicyTitle": { + "message": "Require two-step login" + }, "twoStepLoginPolicyDesc": { "message": "דרוש מהמשתמשים להגדיר כניסה דו-שלבית בחשבונות האישיים שלהם." }, @@ -3880,10 +3898,10 @@ } }, "personalOwnership": { - "message": "Personal Ownership" + "message": "Remove individual vault" }, "personalOwnershipPolicyDesc": { - "message": "Require users to save vault items to an organization by removing the personal ownership option." + "message": "Require members to save items to an organization by removing the individual vault option." }, "personalOwnershipExemption": { "message": "Organization Owners and Administrators are exempt from this policy's enforcement." @@ -3892,10 +3910,10 @@ "message": "Due to an enterprise policy, you are restricted from saving items to your personal vault. Change the Ownership option to an organization and choose from available Collections." }, "disableSend": { - "message": "Disable Send" + "message": "Remove Send" }, "disableSendPolicyDesc": { - "message": "Do not allow users to create or edit a Bitwarden Send. Deleting an existing Send is still allowed.", + "message": "Do not allow members to create or edit sends.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "disableSendExemption": { @@ -3910,7 +3928,7 @@ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendOptions": { - "message": "Send Options", + "message": "Send options", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendOptionsPolicyDesc": { @@ -3921,7 +3939,7 @@ "message": "Organization users that can manage the organization's policies are exempt from this policy's enforcement." }, "disableHideEmail": { - "message": "Do not allow users to hide their email address from recipients when creating or editing a Send.", + "message": "Always show member’s email address with recipients when creating or editing a send.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendOptionsPolicyInEffect": { @@ -4217,10 +4235,10 @@ "message": "Enrollment will allow organization administrators to change your master password" }, "resetPasswordPolicy": { - "message": "Master Password Reset" + "message": "Master password reset" }, "resetPasswordPolicyDescription": { - "message": "Allow administrators in the organization to reset organization users' master password." + "message": "Allow admins to reset master passwords for members." }, "resetPasswordPolicyWarning": { "message": "Users in the organization will need to self-enroll or be auto-enrolled before administrators can reset their master password." @@ -4464,10 +4482,10 @@ "message": "Your Master Password does not meet the policy requirements of this organization. In order to join the organization, you must update your Master Password now. Proceeding will log you out of your current session, requiring you to log back in. Active sessions on other devices may continue to remain active for up to one hour." }, "maximumVaultTimeout": { - "message": "Vault Timeout" + "message": "Vault timeout" }, "maximumVaultTimeoutDesc": { - "message": "Configure a maximum vault timeout for all users." + "message": "Set a maximum vault timeout for members." }, "maximumVaultTimeoutLabel": { "message": "Maximum Vault Timeout" @@ -4507,10 +4525,10 @@ "message": "Vault Timeout is not within allowed range." }, "disablePersonalVaultExport": { - "message": "Disable Personal Vault Export" + "message": "Remove individual vault export" }, "disablePersonalVaultExportDesc": { - "message": "Prohibits users from exporting their private vault data." + "message": "Do not allow members to export their individual vault data." }, "vaultExportDisabled": { "message": "Vault Export Disabled" @@ -4801,19 +4819,19 @@ "message": "Once set up, your configuration will be saved and members will be able to authenticate using their Identity Provider credentials." }, "ssoPolicyHelpStart": { - "message": "Enable the", - "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Enable the SSO Authentication policy to require all members to log in with SSO.'" + "message": "Use the", + "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Use the require single-sign-on authentication policy to require all members to log in with SSO.'" }, "ssoPolicyHelpLink": { - "message": "SSO Authentication policy", - "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Enable the SSO Authentication policy to require all members to log in with SSO.'" + "message": "require single-sign-on authentication policy", + "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Use the require single-sign-on authentication policy to require all members to log in with SSO.'" }, "ssoPolicyHelpEnd": { "message": "to require all members to log in with SSO.", - "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Enable the SSO Authentication policy to require all members to log in with SSO.'" + "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Use the require single-sign-on authentication policy to require all members to log in with SSO.'" }, "ssoPolicyHelpKeyConnector": { - "message": "SSO Authentication and Single Organization policies are required to set up Key Connector decryption." + "message": "The require SSO authentication and single organization policies are required to set up Key Connector decryption." }, "memberDecryptionOption": { "message": "Member Decryption Options" @@ -5165,5 +5183,35 @@ "example": "My Email" } } + }, + "inputRequired": { + "message": "Input is required." + }, + "inputEmail": { + "message": "Input is not an email-address." + }, + "inputMinLength": { + "message": "Input must be at least $COUNT$ characters long.", + "placeholders": { + "count": { + "content": "$1", + "example": "8" + } + } + }, + "fieldsNeedAttention": { + "message": "$COUNT$ field(s) above need your attention.", + "placeholders": { + "count": { + "content": "$1", + "example": "4" + } + } + }, + "turnOn": { + "message": "Turn on" + }, + "on": { + "message": "On" } } diff --git a/apps/web/src/locales/hi/messages.json b/apps/web/src/locales/hi/messages.json index 324d06f0bc9..67094dffe65 100644 --- a/apps/web/src/locales/hi/messages.json +++ b/apps/web/src/locales/hi/messages.json @@ -572,6 +572,9 @@ "createAccount": { "message": "Create Account" }, + "startTrial": { + "message": "Start Trial" + }, "logIn": { "message": "Log In" }, @@ -593,6 +596,9 @@ "masterPassDesc": { "message": "The master password is the password you use to access your vault. It is very important that you do not forget your master password. There is no way to recover the password in the event that you forget it." }, + "masterPassImportant": { + "message": "Master passwords cannot be recovered if you forget it!" + }, "masterPassHintDesc": { "message": "A master password hint can help you remember your password if you forget it." }, @@ -623,10 +629,13 @@ "invalidEmail": { "message": "Invalid email address." }, - "masterPassRequired": { + "masterPasswordRequired": { "message": "Master password is required." }, - "masterPassLength": { + "confirmMasterPasswordRequired": { + "message": "Master password retype is required." + }, + "masterPasswordMinLength": { "message": "Master password must be at least 8 characters long." }, "masterPassDoesntMatch": { @@ -882,7 +891,7 @@ "message": "Your vault data has been exported." }, "passwordGenerator": { - "message": "Password Generator" + "message": "Password generator" }, "minComplexityScore": { "message": "Minimum Complexity Score" @@ -1067,7 +1076,7 @@ "message": "Delete Account" }, "deleteAccountDesc": { - "message": "Proceed below to delete your account and all associated data." + "message": "Proceed below to delete your account and all vault data." }, "deleteAccountWarning": { "message": "Deleting your account is permanent. It cannot be undone." @@ -1076,7 +1085,7 @@ "message": "Account Deleted" }, "accountDeletedDesc": { - "message": "Your account has been closed and all associated data has been deleted." + "message": "Your Bitwarden account and vault data were permanently deleted." }, "myAccount": { "message": "My Account" @@ -1214,7 +1223,7 @@ "message": "Domains updated" }, "twoStepLogin": { - "message": "Two-step Login" + "message": "Two-step login" }, "twoStepLoginDesc": { "message": "Secure your account by requiring an additional step when logging in." @@ -3159,7 +3168,7 @@ "acceptPolicies": { "message": "By checking this box you agree to the following:" }, - "acceptPoliciesError": { + "acceptPoliciesRequired": { "message": "Terms of Service and Privacy Policy have not been acknowledged." }, "termsOfService": { @@ -3209,6 +3218,9 @@ "organizationIsDisabled": { "message": "Organization is disabled." }, + "disabledOrganizationFilterError": { + "message": "Items in disabled Organizations cannot be accessed. Contact your Organization owner for assistance." + }, "licenseIsExpired": { "message": "License is expired." }, @@ -3333,20 +3345,26 @@ "clone": { "message": "Clone" }, + "masterPassPolicyTitle": { + "message": "Master password requirements" + }, "masterPassPolicyDesc": { - "message": "Set minimum requirements for master password strength." + "message": "Set requirements for master password strength." + }, + "twoStepLoginPolicyTitle": { + "message": "Require two-step login" }, "twoStepLoginPolicyDesc": { - "message": "Require users to set up two-step login on their personal accounts." + "message": "Require members to set up two-step login." }, "twoStepLoginPolicyWarning": { - "message": "Organization members who are not Owners or Administrators and do not have two-step login enabled for their personal account will be removed from the organization and will receive an email notifying them about the change." + "message": "Organization members who are not Owners or Administrators and do not have two-step login turned on for their account will be removed from the organization and will receive an email notifying them about the change." }, "twoStepLoginPolicyUserWarning": { "message": "You are a member of an organization that requires two-step login to be enabled on your user account. If you disable all two-step login providers you will be automatically removed from these organizations." }, "passwordGeneratorPolicyDesc": { - "message": "Set minimum requirements for password generator configuration." + "message": "Set requirements for password generator." }, "passwordGeneratorPolicyInEffect": { "message": "One or more organization policies are affecting your generator settings." @@ -3564,10 +3582,10 @@ "message": "Link SSO" }, "singleOrg": { - "message": "Single Organization" + "message": "Single organization" }, "singleOrgDesc": { - "message": "Restrict users from being able to join any other organizations." + "message": "Restrict members from joining other organizations." }, "singleOrgBlockCreateMessage": { "message": "Your current organization has a policy that does not allow you to join more than one organization. Please contact your organization admins or sign up from a different Bitwarden account." @@ -3576,16 +3594,16 @@ "message": "Organization members who are not Owners or Administrators and are already a member of another organization will be removed from your organization." }, "requireSso": { - "message": "Single Sign-On Authentication" + "message": "Require single sign-on authentication" }, "requireSsoPolicyDesc": { - "message": "Require users to log in with the Enterprise Single Sign-On method." + "message": "Require members to log in with the Enterprise Single Sign-On method." }, "prerequisite": { "message": "Prerequisite" }, "requireSsoPolicyReq": { - "message": "The Single Organization enterprise policy must be enabled before activating this policy." + "message": "The Single Organization enterprise policy must be turned on before activating this policy." }, "requireSsoPolicyReqError": { "message": "Single Organization policy not enabled." @@ -3880,10 +3898,10 @@ } }, "personalOwnership": { - "message": "Personal Ownership" + "message": "Remove individual vault" }, "personalOwnershipPolicyDesc": { - "message": "Require users to save vault items to an organization by removing the personal ownership option." + "message": "Require members to save items to an organization by removing the individual vault option." }, "personalOwnershipExemption": { "message": "Organization Owners and Administrators are exempt from this policy's enforcement." @@ -3892,10 +3910,10 @@ "message": "Due to an enterprise policy, you are restricted from saving items to your personal vault. Change the Ownership option to an organization and choose from available Collections." }, "disableSend": { - "message": "Disable Send" + "message": "Remove Send" }, "disableSendPolicyDesc": { - "message": "Do not allow users to create or edit a Bitwarden Send. Deleting an existing Send is still allowed.", + "message": "Do not allow members to create or edit sends.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "disableSendExemption": { @@ -3910,7 +3928,7 @@ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendOptions": { - "message": "Send Options", + "message": "Send options", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendOptionsPolicyDesc": { @@ -3921,7 +3939,7 @@ "message": "Organization users that can manage the organization's policies are exempt from this policy's enforcement." }, "disableHideEmail": { - "message": "Do not allow users to hide their email address from recipients when creating or editing a Send.", + "message": "Always show member’s email address with recipients when creating or editing a send.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendOptionsPolicyInEffect": { @@ -4217,10 +4235,10 @@ "message": "Enrollment will allow organization administrators to change your master password" }, "resetPasswordPolicy": { - "message": "Master Password Reset" + "message": "Master password reset" }, "resetPasswordPolicyDescription": { - "message": "Allow administrators in the organization to reset organization users' master password." + "message": "Allow admins to reset master passwords for members." }, "resetPasswordPolicyWarning": { "message": "Users in the organization will need to self-enroll or be auto-enrolled before administrators can reset their master password." @@ -4464,10 +4482,10 @@ "message": "Your Master Password does not meet the policy requirements of this organization. In order to join the organization, you must update your Master Password now. Proceeding will log you out of your current session, requiring you to log back in. Active sessions on other devices may continue to remain active for up to one hour." }, "maximumVaultTimeout": { - "message": "Vault Timeout" + "message": "Vault timeout" }, "maximumVaultTimeoutDesc": { - "message": "Configure a maximum vault timeout for all users." + "message": "Set a maximum vault timeout for members." }, "maximumVaultTimeoutLabel": { "message": "Maximum Vault Timeout" @@ -4507,10 +4525,10 @@ "message": "Vault Timeout is not within allowed range." }, "disablePersonalVaultExport": { - "message": "Disable Personal Vault Export" + "message": "Remove individual vault export" }, "disablePersonalVaultExportDesc": { - "message": "Prohibits users from exporting their private vault data." + "message": "Do not allow members to export their individual vault data." }, "vaultExportDisabled": { "message": "Vault Export Disabled" @@ -4801,19 +4819,19 @@ "message": "Once set up, your configuration will be saved and members will be able to authenticate using their Identity Provider credentials." }, "ssoPolicyHelpStart": { - "message": "Enable the", - "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Enable the SSO Authentication policy to require all members to log in with SSO.'" + "message": "Use the", + "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Use the require single-sign-on authentication policy to require all members to log in with SSO.'" }, "ssoPolicyHelpLink": { - "message": "SSO Authentication policy", - "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Enable the SSO Authentication policy to require all members to log in with SSO.'" + "message": "require single-sign-on authentication policy", + "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Use the require single-sign-on authentication policy to require all members to log in with SSO.'" }, "ssoPolicyHelpEnd": { "message": "to require all members to log in with SSO.", - "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Enable the SSO Authentication policy to require all members to log in with SSO.'" + "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Use the require single-sign-on authentication policy to require all members to log in with SSO.'" }, "ssoPolicyHelpKeyConnector": { - "message": "SSO Authentication and Single Organization policies are required to set up Key Connector decryption." + "message": "The require SSO authentication and single organization policies are required to set up Key Connector decryption." }, "memberDecryptionOption": { "message": "Member Decryption Options" @@ -5165,5 +5183,35 @@ "example": "My Email" } } + }, + "inputRequired": { + "message": "Input is required." + }, + "inputEmail": { + "message": "Input is not an email-address." + }, + "inputMinLength": { + "message": "Input must be at least $COUNT$ characters long.", + "placeholders": { + "count": { + "content": "$1", + "example": "8" + } + } + }, + "fieldsNeedAttention": { + "message": "$COUNT$ field(s) above need your attention.", + "placeholders": { + "count": { + "content": "$1", + "example": "4" + } + } + }, + "turnOn": { + "message": "Turn on" + }, + "on": { + "message": "On" } } diff --git a/apps/web/src/locales/hr/messages.json b/apps/web/src/locales/hr/messages.json index 9ec828fb945..38ff70a8677 100644 --- a/apps/web/src/locales/hr/messages.json +++ b/apps/web/src/locales/hr/messages.json @@ -572,6 +572,9 @@ "createAccount": { "message": "Stvori račun" }, + "startTrial": { + "message": "Start Trial" + }, "logIn": { "message": "Prijavi se" }, @@ -593,6 +596,9 @@ "masterPassDesc": { "message": "Glavnu lozinku koristiš za pristup svom trezoru. Vrlo je važno da ne zaboraviš glavnu lozinku. Ne postoji način za oporavak lozinke u slučaju da ju zaboraviš." }, + "masterPassImportant": { + "message": "Master passwords cannot be recovered if you forget it!" + }, "masterPassHintDesc": { "message": "Podsjetnik glavne lozinke ti može pomoći da se prisjetiš svoje lozinke ako ju zaboraviš." }, @@ -623,11 +629,14 @@ "invalidEmail": { "message": "Neispravna adresa e-pošte." }, - "masterPassRequired": { - "message": "Potrebna je glavna lozinka." + "masterPasswordRequired": { + "message": "Master password is required." }, - "masterPassLength": { - "message": "Glavna lozinka mora imati najmanje 8 znakova." + "confirmMasterPasswordRequired": { + "message": "Master password retype is required." + }, + "masterPasswordMinLength": { + "message": "Master password must be at least 8 characters long." }, "masterPassDoesntMatch": { "message": "Potvrda glavne lozinke se ne podudara." @@ -3159,8 +3168,8 @@ "acceptPolicies": { "message": "Označavanjem ove kućice slažete se sa sljedećim:" }, - "acceptPoliciesError": { - "message": "Uvjeti korištenja i Pravila privatnosti nisu prihvaćeni." + "acceptPoliciesRequired": { + "message": "Terms of Service and Privacy Policy have not been acknowledged." }, "termsOfService": { "message": "Uvjeti korištenja" @@ -3209,6 +3218,9 @@ "organizationIsDisabled": { "message": "Organizacija je onemogućena." }, + "disabledOrganizationFilterError": { + "message": "Items in disabled Organizations cannot be accessed. Contact your Organization owner for assistance." + }, "licenseIsExpired": { "message": "Licenca je istekla." }, @@ -3333,9 +3345,15 @@ "clone": { "message": "Kloniraj" }, + "masterPassPolicyTitle": { + "message": "Master password requirements" + }, "masterPassPolicyDesc": { "message": "Postavi smjernice sigurnosti koju glavna lozinka mora zadovoljiti." }, + "twoStepLoginPolicyTitle": { + "message": "Require two-step login" + }, "twoStepLoginPolicyDesc": { "message": "Zahtijevaj da korisnici uključe prijavu u dva koraka na svojim osobnim računima." }, @@ -4802,18 +4820,18 @@ }, "ssoPolicyHelpStart": { "message": "Omogući", - "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Enable the SSO Authentication policy to require all members to log in with SSO.'" + "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Use the require single-sign-on authentication policy to require all members to log in with SSO.'" }, "ssoPolicyHelpLink": { "message": "SSO autentifikaciju", - "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Enable the SSO Authentication policy to require all members to log in with SSO.'" + "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Use the require single-sign-on authentication policy to require all members to log in with SSO.'" }, "ssoPolicyHelpEnd": { "message": "kako bi se svi članovi mogli prijaviti sa SSO.", - "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Enable the SSO Authentication policy to require all members to log in with SSO.'" + "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Use the require single-sign-on authentication policy to require all members to log in with SSO.'" }, "ssoPolicyHelpKeyConnector": { - "message": "SSO Authentication and Single Organization policies are required to set up Key Connector decryption." + "message": "The require SSO authentication and single organization policies are required to set up Key Connector decryption." }, "memberDecryptionOption": { "message": "Opcije dešifriranja za članove" @@ -5165,5 +5183,35 @@ "example": "My Email" } } + }, + "inputRequired": { + "message": "Input is required." + }, + "inputEmail": { + "message": "Input is not an email-address." + }, + "inputMinLength": { + "message": "Input must be at least $COUNT$ characters long.", + "placeholders": { + "count": { + "content": "$1", + "example": "8" + } + } + }, + "fieldsNeedAttention": { + "message": "$COUNT$ field(s) above need your attention.", + "placeholders": { + "count": { + "content": "$1", + "example": "4" + } + } + }, + "turnOn": { + "message": "Turn on" + }, + "on": { + "message": "On" } } diff --git a/apps/web/src/locales/hu/messages.json b/apps/web/src/locales/hu/messages.json index 3b6010deaec..b64fdebfc01 100644 --- a/apps/web/src/locales/hu/messages.json +++ b/apps/web/src/locales/hu/messages.json @@ -572,6 +572,9 @@ "createAccount": { "message": "Fiók létrehozása" }, + "startTrial": { + "message": "Próbaverzió indítása" + }, "logIn": { "message": "Bejelentkezés" }, @@ -593,6 +596,9 @@ "masterPassDesc": { "message": "A mesterjelszó a jelszó a széf eléréséhez. Nagyon fontos a mesterjelszó ismerete. Nincs mód a jelszó visszaállítására." }, + "masterPassImportant": { + "message": "Az elfelejtett mesterjelszavak nem állíthatók helyre!" + }, "masterPassHintDesc": { "message": "A mesterjelszó emlékeztető segíthet emlékezni a jelszóra elfelejtése esetén." }, @@ -623,10 +629,13 @@ "invalidEmail": { "message": "Az email cím érvénytelen." }, - "masterPassRequired": { + "masterPasswordRequired": { "message": "A mesterjelszó megadása kötelező." }, - "masterPassLength": { + "confirmMasterPasswordRequired": { + "message": "A mesterjelszó ismételt megadása kötelező." + }, + "masterPasswordMinLength": { "message": "A mesterjelszó legyen legalább 8 karakter hosszú." }, "masterPassDoesntMatch": { @@ -3159,7 +3168,7 @@ "acceptPolicies": { "message": "A doboz bejelölésével elfogadjuk a következőket:" }, - "acceptPoliciesError": { + "acceptPoliciesRequired": { "message": "A szolgáltatási feltételeket és az adatvédelmi irányelveket nem vették figyelembe." }, "termsOfService": { @@ -3209,6 +3218,9 @@ "organizationIsDisabled": { "message": "A szervezet letiltásra került." }, + "disabledOrganizationFilterError": { + "message": "A letiltott szervezetek elemeii nem érhetők el. Vegyük fel a kapcsolatot a szervezet tulajdonosával segítségért." + }, "licenseIsExpired": { "message": "A licensz lejárt." }, @@ -3333,9 +3345,15 @@ "clone": { "message": "Klónozás" }, + "masterPassPolicyTitle": { + "message": "Mesterjelszó követelmények" + }, "masterPassPolicyDesc": { "message": "A minimális követelmények beállítása a mesterjelszó hozzához." }, + "twoStepLoginPolicyTitle": { + "message": "Kétlépéses bejelentkezés szükséges" + }, "twoStepLoginPolicyDesc": { "message": "A felhasználók számára kétlépcsős bejelentkezés szükséges a személyes fióknál." }, @@ -4217,7 +4235,7 @@ "message": "A regisztráció lehetővé teszi a szervezet adminisztrátorainak a saját mesterjelszó megváltoztatását. Biztosan feliratkozunk?" }, "resetPasswordPolicy": { - "message": "Mesterjelszó alaphelyzetbe állítás" + "message": "Mesterjelszó alaphelyzetbe állítása" }, "resetPasswordPolicyDescription": { "message": "A szervezet adminisztrátorai alaphelyzetbe állíthatják a szervezet mesterjelszavát." @@ -4802,15 +4820,15 @@ }, "ssoPolicyHelpStart": { "message": "Engedélyezzük az", - "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Enable the SSO Authentication policy to require all members to log in with SSO.'" + "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Use the require single-sign-on authentication policy to require all members to log in with SSO.'" }, "ssoPolicyHelpLink": { "message": "SSO hitelesítési szabályzat", - "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Enable the SSO Authentication policy to require all members to log in with SSO.'" + "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Use the require single-sign-on authentication policy to require all members to log in with SSO.'" }, "ssoPolicyHelpEnd": { "message": "szolgáltatást az összes tag bejelentkezéséhez SSO szolgáltatással.", - "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Enable the SSO Authentication policy to require all members to log in with SSO.'" + "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Use the require single-sign-on authentication policy to require all members to log in with SSO.'" }, "ssoPolicyHelpKeyConnector": { "message": "A kulcscsatlakozó visszafejtésének beállításához SSO hitelesítés és egy szervezeti szabályzat szükséges." @@ -5165,5 +5183,35 @@ "example": "My Email" } } + }, + "inputRequired": { + "message": "Az adatbevitel kötelező." + }, + "inputEmail": { + "message": "Az megadott adat nem email cím." + }, + "inputMinLength": { + "message": "Az adat legyen legalább $COUNT$ karakter hosszú.", + "placeholders": { + "count": { + "content": "$1", + "example": "8" + } + } + }, + "fieldsNeedAttention": { + "message": "$COUNT$ mező fentebb figyelmet érdemel.", + "placeholders": { + "count": { + "content": "$1", + "example": "4" + } + } + }, + "turnOn": { + "message": "Bekapcsolás" + }, + "on": { + "message": "Be" } } diff --git a/apps/web/src/locales/id/messages.json b/apps/web/src/locales/id/messages.json index d663b112759..9b757de8065 100644 --- a/apps/web/src/locales/id/messages.json +++ b/apps/web/src/locales/id/messages.json @@ -572,6 +572,9 @@ "createAccount": { "message": "Buat Akun" }, + "startTrial": { + "message": "Start Trial" + }, "logIn": { "message": "Masuk" }, @@ -593,6 +596,9 @@ "masterPassDesc": { "message": "Kata sandi utama adalah kata sandi yang Anda gunakan untuk mengakses brankas Anda. Sangat penting bahwa Anda tidak lupa kata sandi utama Anda. Tidak ada cara untuk memulihkan kata sandi jika Anda melupakannya." }, + "masterPassImportant": { + "message": "Master passwords cannot be recovered if you forget it!" + }, "masterPassHintDesc": { "message": "Petunjuk kata sandi utama dapat membantu Anda mengingat kata sandi Anda jika Anda melupakannya." }, @@ -623,11 +629,14 @@ "invalidEmail": { "message": "Alamat surel tidak valid." }, - "masterPassRequired": { - "message": "Sandi utama diperlukan." + "masterPasswordRequired": { + "message": "Master password is required." }, - "masterPassLength": { - "message": "Kata sandi utama sedikitnya harus 8 karakter." + "confirmMasterPasswordRequired": { + "message": "Master password retype is required." + }, + "masterPasswordMinLength": { + "message": "Master password must be at least 8 characters long." }, "masterPassDoesntMatch": { "message": "Konfirmasi sandi utama tidak cocok." @@ -3159,8 +3168,8 @@ "acceptPolicies": { "message": "Dengan mencentang kotak ini, anda menyetujui yang berikut:" }, - "acceptPoliciesError": { - "message": "Persyaratan Layanan dan Kebijakan Privasi belum diakui." + "acceptPoliciesRequired": { + "message": "Terms of Service and Privacy Policy have not been acknowledged." }, "termsOfService": { "message": "Persyaratan Layanan" @@ -3209,6 +3218,9 @@ "organizationIsDisabled": { "message": "Organisasi dinonaktifkan." }, + "disabledOrganizationFilterError": { + "message": "Items in disabled Organizations cannot be accessed. Contact your Organization owner for assistance." + }, "licenseIsExpired": { "message": "Lisensi sudah kadaluarsa." }, @@ -3333,9 +3345,15 @@ "clone": { "message": "Klon" }, + "masterPassPolicyTitle": { + "message": "Master password requirements" + }, "masterPassPolicyDesc": { "message": "Tetapkan persyaratan minimum untuk kekuatan kata sandi utama." }, + "twoStepLoginPolicyTitle": { + "message": "Require two-step login" + }, "twoStepLoginPolicyDesc": { "message": "Mewajibkan pengguna untuk mengatur login dua langkah di akun pribadi mereka." }, @@ -4467,7 +4485,7 @@ "message": "Batas Waktu Brankas" }, "maximumVaultTimeoutDesc": { - "message": "Configure a maximum vault timeout for all users." + "message": "Set a maximum vault timeout for members." }, "maximumVaultTimeoutLabel": { "message": "Batas waktu Maksimal Brankas" @@ -4507,10 +4525,10 @@ "message": "Vault Timeout is not within allowed range." }, "disablePersonalVaultExport": { - "message": "Disable Personal Vault Export" + "message": "Remove individual vault export" }, "disablePersonalVaultExportDesc": { - "message": "Prohibits users from exporting their private vault data." + "message": "Do not allow members to export their individual vault data." }, "vaultExportDisabled": { "message": "Ekspor Brankas Dinonaktifkan" @@ -4802,18 +4820,18 @@ }, "ssoPolicyHelpStart": { "message": "Aktifkan", - "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Enable the SSO Authentication policy to require all members to log in with SSO.'" + "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Use the require single-sign-on authentication policy to require all members to log in with SSO.'" }, "ssoPolicyHelpLink": { "message": "kebijakan Otentikasi SSO", - "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Enable the SSO Authentication policy to require all members to log in with SSO.'" + "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Use the require single-sign-on authentication policy to require all members to log in with SSO.'" }, "ssoPolicyHelpEnd": { "message": "untuk mewajibkan semua anggota masuk dengan SSO.", - "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Enable the SSO Authentication policy to require all members to log in with SSO.'" + "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Use the require single-sign-on authentication policy to require all members to log in with SSO.'" }, "ssoPolicyHelpKeyConnector": { - "message": "SSO Authentication and Single Organization policies are required to set up Key Connector decryption." + "message": "The require SSO authentication and single organization policies are required to set up Key Connector decryption." }, "memberDecryptionOption": { "message": "Member Decryption Options" @@ -5165,5 +5183,35 @@ "example": "My Email" } } + }, + "inputRequired": { + "message": "Input is required." + }, + "inputEmail": { + "message": "Input is not an email-address." + }, + "inputMinLength": { + "message": "Input must be at least $COUNT$ characters long.", + "placeholders": { + "count": { + "content": "$1", + "example": "8" + } + } + }, + "fieldsNeedAttention": { + "message": "$COUNT$ field(s) above need your attention.", + "placeholders": { + "count": { + "content": "$1", + "example": "4" + } + } + }, + "turnOn": { + "message": "Turn on" + }, + "on": { + "message": "On" } } diff --git a/apps/web/src/locales/it/messages.json b/apps/web/src/locales/it/messages.json index 29fe2728769..87beb8b85a5 100644 --- a/apps/web/src/locales/it/messages.json +++ b/apps/web/src/locales/it/messages.json @@ -572,6 +572,9 @@ "createAccount": { "message": "Crea account" }, + "startTrial": { + "message": "Inizia il periodo di prova" + }, "logIn": { "message": "Accedi" }, @@ -593,6 +596,9 @@ "masterPassDesc": { "message": "La password principale è la password che utilizzi per accedere alla tua cassaforte. È molto importante che tu non la dimentichi. Non c'è modo di recuperare questa password nel caso che tu la dimenticassi." }, + "masterPassImportant": { + "message": "Le password principali non possono essere recuperate se dimenticate!" + }, "masterPassHintDesc": { "message": "Un suggerimento che può aiutarti a ricordare la tua password principale se la dimentichi." }, @@ -623,11 +629,14 @@ "invalidEmail": { "message": "L'indirizzo email non è valido." }, - "masterPassRequired": { - "message": "La password principale è obbligatoria." + "masterPasswordRequired": { + "message": "È necessario inserire la password principale." }, - "masterPassLength": { - "message": "La password principale deve essere almeno di 8 caratteri." + "confirmMasterPasswordRequired": { + "message": "È necessario reinserire la password principale." + }, + "masterPasswordMinLength": { + "message": "La password principale deve essere lunga almeno 8 caratteri." }, "masterPassDoesntMatch": { "message": "La conferma della password principale non corrisponde." @@ -3159,7 +3168,7 @@ "acceptPolicies": { "message": "Selezionando la casella accetti quanto segue:" }, - "acceptPoliciesError": { + "acceptPoliciesRequired": { "message": "I termini di servizio e l'informativa sulla privacy non sono stati accettati." }, "termsOfService": { @@ -3209,6 +3218,9 @@ "organizationIsDisabled": { "message": "L'organizzazione è disabilitata." }, + "disabledOrganizationFilterError": { + "message": "Non è possibile accedere agli oggetti nelle organizzazioni disabilitate. Contatta il proprietario della tua organizzazione per ricevere assistenza." + }, "licenseIsExpired": { "message": "La licenza è scaduta." }, @@ -3333,9 +3345,15 @@ "clone": { "message": "Clona" }, + "masterPassPolicyTitle": { + "message": "Requisiti della password principale" + }, "masterPassPolicyDesc": { "message": "Imposta i requisiti minimi di complessità della password principale." }, + "twoStepLoginPolicyTitle": { + "message": "Richiedi login in due passaggi" + }, "twoStepLoginPolicyDesc": { "message": "Obbliga gli utenti a impostare l'autenticazione a due fattori sul loro account personale." }, @@ -4771,7 +4789,7 @@ "message": "Conferma la tua identità per continuare." }, "verificationCodeRequired": { - "message": "Il codice di verifica è obbligatorio." + "message": "È necessario inserire il codice di verifica." }, "invalidVerificationCode": { "message": "Codice di verifica non valido" @@ -4802,15 +4820,15 @@ }, "ssoPolicyHelpStart": { "message": "Abilita la", - "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Enable the SSO Authentication policy to require all members to log in with SSO.'" + "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Use the require single-sign-on authentication policy to require all members to log in with SSO.'" }, "ssoPolicyHelpLink": { "message": "policy SSO", - "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Enable the SSO Authentication policy to require all members to log in with SSO.'" + "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Use the require single-sign-on authentication policy to require all members to log in with SSO.'" }, "ssoPolicyHelpEnd": { "message": "per obbligare tutti i membri ad accedere con SSO.", - "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Enable the SSO Authentication policy to require all members to log in with SSO.'" + "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Use the require single-sign-on authentication policy to require all members to log in with SSO.'" }, "ssoPolicyHelpKeyConnector": { "message": "L'autenticazione SSO e i criteri dell'organizzazione unica sono necessari per configurare la decifratura del connettore chiave." @@ -5117,7 +5135,7 @@ "Description": "Used as a prefix to indicate the last time a sync occured. Example \"Last sync 1968-11-16 00:00:00\"" }, "sponsorshipsSynced": { - "message": "Self-hosted sponsorships synced." + "message": "Sponsorizzazione self-hosted sincronizzata." }, "billingManagedByProvider": { "message": "Gestito da $PROVIDER$", @@ -5165,5 +5183,35 @@ "example": "My Email" } } + }, + "inputRequired": { + "message": "Input richiesto." + }, + "inputEmail": { + "message": "L'input non è un indirizzo email." + }, + "inputMinLength": { + "message": "L'input deve contenere almeno $COUNT$ caratteri.", + "placeholders": { + "count": { + "content": "$1", + "example": "8" + } + } + }, + "fieldsNeedAttention": { + "message": "Il/i campo/i $COUNT$ sopra richiedono la tua attenzione.", + "placeholders": { + "count": { + "content": "$1", + "example": "4" + } + } + }, + "turnOn": { + "message": "Attiva" + }, + "on": { + "message": "Attivo" } } diff --git a/apps/web/src/locales/ja/messages.json b/apps/web/src/locales/ja/messages.json index 30d640265f8..2a9856fe5a2 100644 --- a/apps/web/src/locales/ja/messages.json +++ b/apps/web/src/locales/ja/messages.json @@ -572,6 +572,9 @@ "createAccount": { "message": "アカウントの作成" }, + "startTrial": { + "message": "試用版を開始" + }, "logIn": { "message": "ログイン" }, @@ -593,6 +596,9 @@ "masterPassDesc": { "message": "マスターパスワードは、パスワード保管庫へのアクセスに使用するパスワードです。あなたのマスターパスワードを忘れないように注意してください。忘れた場合、パスワードを回復する方法はありません。" }, + "masterPassImportant": { + "message": "マスターパスワードを忘れた場合は復元できません!" + }, "masterPassHintDesc": { "message": "マスターパスワードのヒントは、パスワードを忘れた場合に役立ちます。" }, @@ -623,10 +629,13 @@ "invalidEmail": { "message": "無効なメールアドレスです。" }, - "masterPassRequired": { - "message": "マスターパスワードは必須です。" + "masterPasswordRequired": { + "message": "マスター パスワードが必要です。" }, - "masterPassLength": { + "confirmMasterPasswordRequired": { + "message": "マスターパスワードの再入力が必要です。" + }, + "masterPasswordMinLength": { "message": "マスターパスワードは、少なくとも8文字以上で設定してください。" }, "masterPassDoesntMatch": { @@ -3159,7 +3168,7 @@ "acceptPolicies": { "message": "以下に同意しチェックします:" }, - "acceptPoliciesError": { + "acceptPoliciesRequired": { "message": "利用規約とプライバシーポリシーを確認してください。" }, "termsOfService": { @@ -3209,6 +3218,9 @@ "organizationIsDisabled": { "message": "組織は無効です。" }, + "disabledOrganizationFilterError": { + "message": "無効な組織のアイテムにアクセスすることはできません。組織の所有者に連絡してください。" + }, "licenseIsExpired": { "message": "ライセンスの有効期限が切れています。" }, @@ -3333,9 +3345,15 @@ "clone": { "message": "複製" }, + "masterPassPolicyTitle": { + "message": "マスターパスワードの要件" + }, "masterPassPolicyDesc": { "message": "マスターパスワードの強度に最低要件を設定する。" }, + "twoStepLoginPolicyTitle": { + "message": "2段階認証が必要です" + }, "twoStepLoginPolicyDesc": { "message": "2段階認証の設定を要求する。" }, @@ -3880,10 +3898,10 @@ } }, "personalOwnership": { - "message": "Personal Ownership" + "message": "Remove individual vault" }, "personalOwnershipPolicyDesc": { - "message": "Require users to save vault items to an organization by removing the personal ownership option." + "message": "Require members to save items to an organization by removing the individual vault option." }, "personalOwnershipExemption": { "message": "組織の所有者および管理者は、このポリシーの執行から免除されます。" @@ -3921,7 +3939,7 @@ "message": "組織のポリシーを管理できる組織ユーザーは、このポリシーの適用から除外されます。" }, "disableHideEmail": { - "message": "Do not allow users to hide their email address from recipients when creating or editing a Send.", + "message": "Always show member’s email address with recipients when creating or editing a send.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendOptionsPolicyInEffect": { @@ -4464,10 +4482,10 @@ "message": "あなたのマスターパスワードは、この組織のポリシー要件を満たしていません。組織に参加するには、マスターパスワードを更新してください。 続行すると現在のセッションからログアウトするため、再ログインが必要です。 他のデバイスでのアクティブなセッションは、最大1時間アクティブになり続けることができます。" }, "maximumVaultTimeout": { - "message": "Vault Timeout" + "message": "Vault timeout" }, "maximumVaultTimeoutDesc": { - "message": "Configure a maximum vault timeout for all users." + "message": "Set a maximum vault timeout for members." }, "maximumVaultTimeoutLabel": { "message": "Maximum Vault Timeout" @@ -4507,10 +4525,10 @@ "message": "保管庫のタイムアウトは許可された範囲内にありません。" }, "disablePersonalVaultExport": { - "message": "Disable Personal Vault Export" + "message": "Remove individual vault export" }, "disablePersonalVaultExportDesc": { - "message": "Prohibits users from exporting their private vault data." + "message": "Do not allow members to export their individual vault data." }, "vaultExportDisabled": { "message": "Vault Export Disabled" @@ -4802,18 +4820,18 @@ }, "ssoPolicyHelpStart": { "message": "すべてのメンバーが SSO でログインするには", - "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Enable the SSO Authentication policy to require all members to log in with SSO.'" + "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Use the require single-sign-on authentication policy to require all members to log in with SSO.'" }, "ssoPolicyHelpLink": { "message": "SSO ポリシー", - "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Enable the SSO Authentication policy to require all members to log in with SSO.'" + "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Use the require single-sign-on authentication policy to require all members to log in with SSO.'" }, "ssoPolicyHelpEnd": { "message": "を有効にしてください。", - "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Enable the SSO Authentication policy to require all members to log in with SSO.'" + "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Use the require single-sign-on authentication policy to require all members to log in with SSO.'" }, "ssoPolicyHelpKeyConnector": { - "message": "SSO Authentication and Single Organization policies are required to set up Key Connector decryption." + "message": "The require SSO authentication and single organization policies are required to set up Key Connector decryption." }, "memberDecryptionOption": { "message": "メンバー復号オプション" @@ -5165,5 +5183,35 @@ "example": "My Email" } } + }, + "inputRequired": { + "message": "入力が必要です。" + }, + "inputEmail": { + "message": "入力したものはメールアドレスではありません。" + }, + "inputMinLength": { + "message": "$COUNT$ 文字以上でなければなりません。", + "placeholders": { + "count": { + "content": "$1", + "example": "8" + } + } + }, + "fieldsNeedAttention": { + "message": "上記の $COUNT$ フィールドを確認してください。", + "placeholders": { + "count": { + "content": "$1", + "example": "4" + } + } + }, + "turnOn": { + "message": "オンにする" + }, + "on": { + "message": "オン" } } diff --git a/apps/web/src/locales/ka/messages.json b/apps/web/src/locales/ka/messages.json index 0e32e2dd533..df0c56a617d 100644 --- a/apps/web/src/locales/ka/messages.json +++ b/apps/web/src/locales/ka/messages.json @@ -572,6 +572,9 @@ "createAccount": { "message": "Create Account" }, + "startTrial": { + "message": "Start Trial" + }, "logIn": { "message": "Log In" }, @@ -593,6 +596,9 @@ "masterPassDesc": { "message": "The master password is the password you use to access your vault. It is very important that you do not forget your master password. There is no way to recover the password in the event that you forget it." }, + "masterPassImportant": { + "message": "Master passwords cannot be recovered if you forget it!" + }, "masterPassHintDesc": { "message": "A master password hint can help you remember your password if you forget it." }, @@ -623,10 +629,13 @@ "invalidEmail": { "message": "Invalid email address." }, - "masterPassRequired": { + "masterPasswordRequired": { "message": "Master password is required." }, - "masterPassLength": { + "confirmMasterPasswordRequired": { + "message": "Master password retype is required." + }, + "masterPasswordMinLength": { "message": "Master password must be at least 8 characters long." }, "masterPassDoesntMatch": { @@ -882,7 +891,7 @@ "message": "Your vault data has been exported." }, "passwordGenerator": { - "message": "Password Generator" + "message": "Password generator" }, "minComplexityScore": { "message": "Minimum Complexity Score" @@ -1067,7 +1076,7 @@ "message": "Delete Account" }, "deleteAccountDesc": { - "message": "Proceed below to delete your account and all associated data." + "message": "Proceed below to delete your account and all vault data." }, "deleteAccountWarning": { "message": "Deleting your account is permanent. It cannot be undone." @@ -1076,7 +1085,7 @@ "message": "Account Deleted" }, "accountDeletedDesc": { - "message": "Your account has been closed and all associated data has been deleted." + "message": "Your Bitwarden account and vault data were permanently deleted." }, "myAccount": { "message": "My Account" @@ -1214,7 +1223,7 @@ "message": "Domains updated" }, "twoStepLogin": { - "message": "Two-step Login" + "message": "Two-step login" }, "twoStepLoginDesc": { "message": "Secure your account by requiring an additional step when logging in." @@ -3159,7 +3168,7 @@ "acceptPolicies": { "message": "By checking this box you agree to the following:" }, - "acceptPoliciesError": { + "acceptPoliciesRequired": { "message": "Terms of Service and Privacy Policy have not been acknowledged." }, "termsOfService": { @@ -3209,6 +3218,9 @@ "organizationIsDisabled": { "message": "Organization is disabled." }, + "disabledOrganizationFilterError": { + "message": "Items in disabled Organizations cannot be accessed. Contact your Organization owner for assistance." + }, "licenseIsExpired": { "message": "License is expired." }, @@ -3333,20 +3345,26 @@ "clone": { "message": "Clone" }, + "masterPassPolicyTitle": { + "message": "Master password requirements" + }, "masterPassPolicyDesc": { - "message": "Set minimum requirements for master password strength." + "message": "Set requirements for master password strength." + }, + "twoStepLoginPolicyTitle": { + "message": "Require two-step login" }, "twoStepLoginPolicyDesc": { - "message": "Require users to set up two-step login on their personal accounts." + "message": "Require members to set up two-step login." }, "twoStepLoginPolicyWarning": { - "message": "Organization members who are not Owners or Administrators and do not have two-step login enabled for their personal account will be removed from the organization and will receive an email notifying them about the change." + "message": "Organization members who are not Owners or Administrators and do not have two-step login turned on for their account will be removed from the organization and will receive an email notifying them about the change." }, "twoStepLoginPolicyUserWarning": { "message": "You are a member of an organization that requires two-step login to be enabled on your user account. If you disable all two-step login providers you will be automatically removed from these organizations." }, "passwordGeneratorPolicyDesc": { - "message": "Set minimum requirements for password generator configuration." + "message": "Set requirements for password generator." }, "passwordGeneratorPolicyInEffect": { "message": "One or more organization policies are affecting your generator settings." @@ -3564,10 +3582,10 @@ "message": "Link SSO" }, "singleOrg": { - "message": "Single Organization" + "message": "Single organization" }, "singleOrgDesc": { - "message": "Restrict users from being able to join any other organizations." + "message": "Restrict members from joining other organizations." }, "singleOrgBlockCreateMessage": { "message": "Your current organization has a policy that does not allow you to join more than one organization. Please contact your organization admins or sign up from a different Bitwarden account." @@ -3576,16 +3594,16 @@ "message": "Organization members who are not Owners or Administrators and are already a member of another organization will be removed from your organization." }, "requireSso": { - "message": "Single Sign-On Authentication" + "message": "Require single sign-on authentication" }, "requireSsoPolicyDesc": { - "message": "Require users to log in with the Enterprise Single Sign-On method." + "message": "Require members to log in with the Enterprise Single Sign-On method." }, "prerequisite": { "message": "Prerequisite" }, "requireSsoPolicyReq": { - "message": "The Single Organization enterprise policy must be enabled before activating this policy." + "message": "The Single Organization enterprise policy must be turned on before activating this policy." }, "requireSsoPolicyReqError": { "message": "Single Organization policy not enabled." @@ -3880,10 +3898,10 @@ } }, "personalOwnership": { - "message": "Personal Ownership" + "message": "Remove individual vault" }, "personalOwnershipPolicyDesc": { - "message": "Require users to save vault items to an organization by removing the personal ownership option." + "message": "Require members to save items to an organization by removing the individual vault option." }, "personalOwnershipExemption": { "message": "Organization Owners and Administrators are exempt from this policy's enforcement." @@ -3892,10 +3910,10 @@ "message": "Due to an enterprise policy, you are restricted from saving items to your personal vault. Change the Ownership option to an organization and choose from available Collections." }, "disableSend": { - "message": "Disable Send" + "message": "Remove Send" }, "disableSendPolicyDesc": { - "message": "Do not allow users to create or edit a Bitwarden Send. Deleting an existing Send is still allowed.", + "message": "Do not allow members to create or edit sends.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "disableSendExemption": { @@ -3910,7 +3928,7 @@ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendOptions": { - "message": "Send Options", + "message": "Send options", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendOptionsPolicyDesc": { @@ -3921,7 +3939,7 @@ "message": "Organization users that can manage the organization's policies are exempt from this policy's enforcement." }, "disableHideEmail": { - "message": "Do not allow users to hide their email address from recipients when creating or editing a Send.", + "message": "Always show member’s email address with recipients when creating or editing a send.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendOptionsPolicyInEffect": { @@ -4217,10 +4235,10 @@ "message": "Enrollment will allow organization administrators to change your master password" }, "resetPasswordPolicy": { - "message": "Master Password Reset" + "message": "Master password reset" }, "resetPasswordPolicyDescription": { - "message": "Allow administrators in the organization to reset organization users' master password." + "message": "Allow admins to reset master passwords for members." }, "resetPasswordPolicyWarning": { "message": "Users in the organization will need to self-enroll or be auto-enrolled before administrators can reset their master password." @@ -4464,10 +4482,10 @@ "message": "Your Master Password does not meet the policy requirements of this organization. In order to join the organization, you must update your Master Password now. Proceeding will log you out of your current session, requiring you to log back in. Active sessions on other devices may continue to remain active for up to one hour." }, "maximumVaultTimeout": { - "message": "Vault Timeout" + "message": "Vault timeout" }, "maximumVaultTimeoutDesc": { - "message": "Configure a maximum vault timeout for all users." + "message": "Set a maximum vault timeout for members." }, "maximumVaultTimeoutLabel": { "message": "Maximum Vault Timeout" @@ -4507,10 +4525,10 @@ "message": "Vault Timeout is not within allowed range." }, "disablePersonalVaultExport": { - "message": "Disable Personal Vault Export" + "message": "Remove individual vault export" }, "disablePersonalVaultExportDesc": { - "message": "Prohibits users from exporting their private vault data." + "message": "Do not allow members to export their individual vault data." }, "vaultExportDisabled": { "message": "Vault Export Disabled" @@ -4801,19 +4819,19 @@ "message": "Once set up, your configuration will be saved and members will be able to authenticate using their Identity Provider credentials." }, "ssoPolicyHelpStart": { - "message": "Enable the", - "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Enable the SSO Authentication policy to require all members to log in with SSO.'" + "message": "Use the", + "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Use the require single-sign-on authentication policy to require all members to log in with SSO.'" }, "ssoPolicyHelpLink": { - "message": "SSO Authentication policy", - "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Enable the SSO Authentication policy to require all members to log in with SSO.'" + "message": "require single-sign-on authentication policy", + "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Use the require single-sign-on authentication policy to require all members to log in with SSO.'" }, "ssoPolicyHelpEnd": { "message": "to require all members to log in with SSO.", - "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Enable the SSO Authentication policy to require all members to log in with SSO.'" + "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Use the require single-sign-on authentication policy to require all members to log in with SSO.'" }, "ssoPolicyHelpKeyConnector": { - "message": "SSO Authentication and Single Organization policies are required to set up Key Connector decryption." + "message": "The require SSO authentication and single organization policies are required to set up Key Connector decryption." }, "memberDecryptionOption": { "message": "Member Decryption Options" @@ -5165,5 +5183,35 @@ "example": "My Email" } } + }, + "inputRequired": { + "message": "Input is required." + }, + "inputEmail": { + "message": "Input is not an email-address." + }, + "inputMinLength": { + "message": "Input must be at least $COUNT$ characters long.", + "placeholders": { + "count": { + "content": "$1", + "example": "8" + } + } + }, + "fieldsNeedAttention": { + "message": "$COUNT$ field(s) above need your attention.", + "placeholders": { + "count": { + "content": "$1", + "example": "4" + } + } + }, + "turnOn": { + "message": "Turn on" + }, + "on": { + "message": "On" } } diff --git a/apps/web/src/locales/km/messages.json b/apps/web/src/locales/km/messages.json index 0e32e2dd533..df0c56a617d 100644 --- a/apps/web/src/locales/km/messages.json +++ b/apps/web/src/locales/km/messages.json @@ -572,6 +572,9 @@ "createAccount": { "message": "Create Account" }, + "startTrial": { + "message": "Start Trial" + }, "logIn": { "message": "Log In" }, @@ -593,6 +596,9 @@ "masterPassDesc": { "message": "The master password is the password you use to access your vault. It is very important that you do not forget your master password. There is no way to recover the password in the event that you forget it." }, + "masterPassImportant": { + "message": "Master passwords cannot be recovered if you forget it!" + }, "masterPassHintDesc": { "message": "A master password hint can help you remember your password if you forget it." }, @@ -623,10 +629,13 @@ "invalidEmail": { "message": "Invalid email address." }, - "masterPassRequired": { + "masterPasswordRequired": { "message": "Master password is required." }, - "masterPassLength": { + "confirmMasterPasswordRequired": { + "message": "Master password retype is required." + }, + "masterPasswordMinLength": { "message": "Master password must be at least 8 characters long." }, "masterPassDoesntMatch": { @@ -882,7 +891,7 @@ "message": "Your vault data has been exported." }, "passwordGenerator": { - "message": "Password Generator" + "message": "Password generator" }, "minComplexityScore": { "message": "Minimum Complexity Score" @@ -1067,7 +1076,7 @@ "message": "Delete Account" }, "deleteAccountDesc": { - "message": "Proceed below to delete your account and all associated data." + "message": "Proceed below to delete your account and all vault data." }, "deleteAccountWarning": { "message": "Deleting your account is permanent. It cannot be undone." @@ -1076,7 +1085,7 @@ "message": "Account Deleted" }, "accountDeletedDesc": { - "message": "Your account has been closed and all associated data has been deleted." + "message": "Your Bitwarden account and vault data were permanently deleted." }, "myAccount": { "message": "My Account" @@ -1214,7 +1223,7 @@ "message": "Domains updated" }, "twoStepLogin": { - "message": "Two-step Login" + "message": "Two-step login" }, "twoStepLoginDesc": { "message": "Secure your account by requiring an additional step when logging in." @@ -3159,7 +3168,7 @@ "acceptPolicies": { "message": "By checking this box you agree to the following:" }, - "acceptPoliciesError": { + "acceptPoliciesRequired": { "message": "Terms of Service and Privacy Policy have not been acknowledged." }, "termsOfService": { @@ -3209,6 +3218,9 @@ "organizationIsDisabled": { "message": "Organization is disabled." }, + "disabledOrganizationFilterError": { + "message": "Items in disabled Organizations cannot be accessed. Contact your Organization owner for assistance." + }, "licenseIsExpired": { "message": "License is expired." }, @@ -3333,20 +3345,26 @@ "clone": { "message": "Clone" }, + "masterPassPolicyTitle": { + "message": "Master password requirements" + }, "masterPassPolicyDesc": { - "message": "Set minimum requirements for master password strength." + "message": "Set requirements for master password strength." + }, + "twoStepLoginPolicyTitle": { + "message": "Require two-step login" }, "twoStepLoginPolicyDesc": { - "message": "Require users to set up two-step login on their personal accounts." + "message": "Require members to set up two-step login." }, "twoStepLoginPolicyWarning": { - "message": "Organization members who are not Owners or Administrators and do not have two-step login enabled for their personal account will be removed from the organization and will receive an email notifying them about the change." + "message": "Organization members who are not Owners or Administrators and do not have two-step login turned on for their account will be removed from the organization and will receive an email notifying them about the change." }, "twoStepLoginPolicyUserWarning": { "message": "You are a member of an organization that requires two-step login to be enabled on your user account. If you disable all two-step login providers you will be automatically removed from these organizations." }, "passwordGeneratorPolicyDesc": { - "message": "Set minimum requirements for password generator configuration." + "message": "Set requirements for password generator." }, "passwordGeneratorPolicyInEffect": { "message": "One or more organization policies are affecting your generator settings." @@ -3564,10 +3582,10 @@ "message": "Link SSO" }, "singleOrg": { - "message": "Single Organization" + "message": "Single organization" }, "singleOrgDesc": { - "message": "Restrict users from being able to join any other organizations." + "message": "Restrict members from joining other organizations." }, "singleOrgBlockCreateMessage": { "message": "Your current organization has a policy that does not allow you to join more than one organization. Please contact your organization admins or sign up from a different Bitwarden account." @@ -3576,16 +3594,16 @@ "message": "Organization members who are not Owners or Administrators and are already a member of another organization will be removed from your organization." }, "requireSso": { - "message": "Single Sign-On Authentication" + "message": "Require single sign-on authentication" }, "requireSsoPolicyDesc": { - "message": "Require users to log in with the Enterprise Single Sign-On method." + "message": "Require members to log in with the Enterprise Single Sign-On method." }, "prerequisite": { "message": "Prerequisite" }, "requireSsoPolicyReq": { - "message": "The Single Organization enterprise policy must be enabled before activating this policy." + "message": "The Single Organization enterprise policy must be turned on before activating this policy." }, "requireSsoPolicyReqError": { "message": "Single Organization policy not enabled." @@ -3880,10 +3898,10 @@ } }, "personalOwnership": { - "message": "Personal Ownership" + "message": "Remove individual vault" }, "personalOwnershipPolicyDesc": { - "message": "Require users to save vault items to an organization by removing the personal ownership option." + "message": "Require members to save items to an organization by removing the individual vault option." }, "personalOwnershipExemption": { "message": "Organization Owners and Administrators are exempt from this policy's enforcement." @@ -3892,10 +3910,10 @@ "message": "Due to an enterprise policy, you are restricted from saving items to your personal vault. Change the Ownership option to an organization and choose from available Collections." }, "disableSend": { - "message": "Disable Send" + "message": "Remove Send" }, "disableSendPolicyDesc": { - "message": "Do not allow users to create or edit a Bitwarden Send. Deleting an existing Send is still allowed.", + "message": "Do not allow members to create or edit sends.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "disableSendExemption": { @@ -3910,7 +3928,7 @@ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendOptions": { - "message": "Send Options", + "message": "Send options", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendOptionsPolicyDesc": { @@ -3921,7 +3939,7 @@ "message": "Organization users that can manage the organization's policies are exempt from this policy's enforcement." }, "disableHideEmail": { - "message": "Do not allow users to hide their email address from recipients when creating or editing a Send.", + "message": "Always show member’s email address with recipients when creating or editing a send.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendOptionsPolicyInEffect": { @@ -4217,10 +4235,10 @@ "message": "Enrollment will allow organization administrators to change your master password" }, "resetPasswordPolicy": { - "message": "Master Password Reset" + "message": "Master password reset" }, "resetPasswordPolicyDescription": { - "message": "Allow administrators in the organization to reset organization users' master password." + "message": "Allow admins to reset master passwords for members." }, "resetPasswordPolicyWarning": { "message": "Users in the organization will need to self-enroll or be auto-enrolled before administrators can reset their master password." @@ -4464,10 +4482,10 @@ "message": "Your Master Password does not meet the policy requirements of this organization. In order to join the organization, you must update your Master Password now. Proceeding will log you out of your current session, requiring you to log back in. Active sessions on other devices may continue to remain active for up to one hour." }, "maximumVaultTimeout": { - "message": "Vault Timeout" + "message": "Vault timeout" }, "maximumVaultTimeoutDesc": { - "message": "Configure a maximum vault timeout for all users." + "message": "Set a maximum vault timeout for members." }, "maximumVaultTimeoutLabel": { "message": "Maximum Vault Timeout" @@ -4507,10 +4525,10 @@ "message": "Vault Timeout is not within allowed range." }, "disablePersonalVaultExport": { - "message": "Disable Personal Vault Export" + "message": "Remove individual vault export" }, "disablePersonalVaultExportDesc": { - "message": "Prohibits users from exporting their private vault data." + "message": "Do not allow members to export their individual vault data." }, "vaultExportDisabled": { "message": "Vault Export Disabled" @@ -4801,19 +4819,19 @@ "message": "Once set up, your configuration will be saved and members will be able to authenticate using their Identity Provider credentials." }, "ssoPolicyHelpStart": { - "message": "Enable the", - "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Enable the SSO Authentication policy to require all members to log in with SSO.'" + "message": "Use the", + "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Use the require single-sign-on authentication policy to require all members to log in with SSO.'" }, "ssoPolicyHelpLink": { - "message": "SSO Authentication policy", - "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Enable the SSO Authentication policy to require all members to log in with SSO.'" + "message": "require single-sign-on authentication policy", + "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Use the require single-sign-on authentication policy to require all members to log in with SSO.'" }, "ssoPolicyHelpEnd": { "message": "to require all members to log in with SSO.", - "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Enable the SSO Authentication policy to require all members to log in with SSO.'" + "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Use the require single-sign-on authentication policy to require all members to log in with SSO.'" }, "ssoPolicyHelpKeyConnector": { - "message": "SSO Authentication and Single Organization policies are required to set up Key Connector decryption." + "message": "The require SSO authentication and single organization policies are required to set up Key Connector decryption." }, "memberDecryptionOption": { "message": "Member Decryption Options" @@ -5165,5 +5183,35 @@ "example": "My Email" } } + }, + "inputRequired": { + "message": "Input is required." + }, + "inputEmail": { + "message": "Input is not an email-address." + }, + "inputMinLength": { + "message": "Input must be at least $COUNT$ characters long.", + "placeholders": { + "count": { + "content": "$1", + "example": "8" + } + } + }, + "fieldsNeedAttention": { + "message": "$COUNT$ field(s) above need your attention.", + "placeholders": { + "count": { + "content": "$1", + "example": "4" + } + } + }, + "turnOn": { + "message": "Turn on" + }, + "on": { + "message": "On" } } diff --git a/apps/web/src/locales/kn/messages.json b/apps/web/src/locales/kn/messages.json index 820c37519af..b283fffcc2b 100644 --- a/apps/web/src/locales/kn/messages.json +++ b/apps/web/src/locales/kn/messages.json @@ -572,6 +572,9 @@ "createAccount": { "message": "ಖಾತೆ ತೆರೆ" }, + "startTrial": { + "message": "Start Trial" + }, "logIn": { "message": "ಲಾಗಿನ್" }, @@ -593,6 +596,9 @@ "masterPassDesc": { "message": "ನಿಮ್ಮ ವಾಲ್ಟ್ ಅನ್ನು ಪ್ರವೇಶಿಸಲು ನೀವು ಬಳಸುವ ಪಾಸ್ವರ್ಡ್ ಮಾಸ್ಟರ್ ಪಾಸ್ವರ್ಡ್ ಆಗಿದೆ. ನಿಮ್ಮ ಮಾಸ್ಟರ್ ಪಾಸ್‌ವರ್ಡ್ ಅನ್ನು ನೀವು ಮರೆಯದಿರುವುದು ಬಹಳ ಮುಖ್ಯ. ನೀವು ಅದನ್ನು ಮರೆತ ಸಂದರ್ಭದಲ್ಲಿ ಪಾಸ್‌ವರ್ಡ್ ಅನ್ನು ಮರುಪಡೆಯಲು ಯಾವುದೇ ಮಾರ್ಗವಿಲ್ಲ." }, + "masterPassImportant": { + "message": "Master passwords cannot be recovered if you forget it!" + }, "masterPassHintDesc": { "message": "ನಿಮ್ಮ ಪಾಸ್‌ವರ್ಡ್ ಅನ್ನು ನೀವು ಮರೆತರೆ ಅದನ್ನು ನೆನಪಿಟ್ಟುಕೊಳ್ಳಲು ಮಾಸ್ಟರ್ ಪಾಸ್‌ವರ್ಡ್ ಸುಳಿವು ನಿಮಗೆ ಸಹಾಯ ಮಾಡುತ್ತದೆ." }, @@ -623,11 +629,14 @@ "invalidEmail": { "message": "ಅಮಾನ್ಯ ಇಮೇಲ್ ವಿಳಾಸ." }, - "masterPassRequired": { - "message": "ಮಾಸ್ಟರ್ ಪಾಸ್ವರ್ಡ್ ಅಗತ್ಯವಿದೆ." + "masterPasswordRequired": { + "message": "Master password is required." }, - "masterPassLength": { - "message": "ಮಾಸ್ಟರ್ ಪಾಸ್‌ವರ್ಡ್ ಕನಿಷ್ಠ 8 ಅಕ್ಷರಗಳಷ್ಟು ಉದ್ದವಾಗಿರಬೇಕು." + "confirmMasterPasswordRequired": { + "message": "Master password retype is required." + }, + "masterPasswordMinLength": { + "message": "Master password must be at least 8 characters long." }, "masterPassDoesntMatch": { "message": "ಮಾಸ್ಟರ್ ಪಾಸ್‌ವರ್ಡ್ ದೃಢೀಕರಣವು ಹೊಂದಿಕೆಯಾಗುವುದಿಲ್ಲ." @@ -3159,8 +3168,8 @@ "acceptPolicies": { "message": "ಈ ಪೆಟ್ಟಿಗೆಯನ್ನು ಪರಿಶೀಲಿಸುವ ಮೂಲಕ ನೀವು ಈ ಕೆಳಗಿನವುಗಳನ್ನು ಒಪ್ಪುತ್ತೀರಿ:" }, - "acceptPoliciesError": { - "message": "ಸೇವಾ ನಿಯಮಗಳು ಮತ್ತು ಗೌಪ್ಯತೆ ನೀತಿಯನ್ನು ಅಂಗೀಕರಿಸಲಾಗಿಲ್ಲ." + "acceptPoliciesRequired": { + "message": "Terms of Service and Privacy Policy have not been acknowledged." }, "termsOfService": { "message": "ಸೇವಾ ನಿಯಮಗಳು" @@ -3209,6 +3218,9 @@ "organizationIsDisabled": { "message": "ಸಂಘಟನೆಯನ್ನು ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಲಾಗಿದೆ." }, + "disabledOrganizationFilterError": { + "message": "Items in disabled Organizations cannot be accessed. Contact your Organization owner for assistance." + }, "licenseIsExpired": { "message": "ಪರವಾನಗಿ ಅವಧಿ ಮೀರಿದೆ." }, @@ -3333,9 +3345,15 @@ "clone": { "message": "ಕ್ಲೋನ್" }, + "masterPassPolicyTitle": { + "message": "Master password requirements" + }, "masterPassPolicyDesc": { "message": "ಮಾಸ್ಟರ್ ಪಾಸ್‌ವರ್ಡ್ ಶಕ್ತಿಗಾಗಿ ಕನಿಷ್ಠ ಅವಶ್ಯಕತೆಗಳನ್ನು ಹೊಂದಿಸಿ." }, + "twoStepLoginPolicyTitle": { + "message": "Require two-step login" + }, "twoStepLoginPolicyDesc": { "message": "ಬಳಕೆದಾರರು ತಮ್ಮ ವೈಯಕ್ತಿಕ ಖಾತೆಗಳಲ್ಲಿ ಎರಡು-ಹಂತದ ಲಾಗಿನ್ ಅನ್ನು ಹೊಂದಿಸಲು ಅಗತ್ಯವಿದೆ." }, @@ -4464,10 +4482,10 @@ "message": "Your Master Password does not meet the policy requirements of this organization. In order to join the organization, you must update your Master Password now. Proceeding will log you out of your current session, requiring you to log back in. Active sessions on other devices may continue to remain active for up to one hour." }, "maximumVaultTimeout": { - "message": "Vault Timeout" + "message": "Vault timeout" }, "maximumVaultTimeoutDesc": { - "message": "Configure a maximum vault timeout for all users." + "message": "Set a maximum vault timeout for members." }, "maximumVaultTimeoutLabel": { "message": "Maximum Vault Timeout" @@ -4507,10 +4525,10 @@ "message": "Vault Timeout is not within allowed range." }, "disablePersonalVaultExport": { - "message": "Disable Personal Vault Export" + "message": "Remove individual vault export" }, "disablePersonalVaultExportDesc": { - "message": "Prohibits users from exporting their private vault data." + "message": "Do not allow members to export their individual vault data." }, "vaultExportDisabled": { "message": "Vault Export Disabled" @@ -4801,19 +4819,19 @@ "message": "Once set up, your configuration will be saved and members will be able to authenticate using their Identity Provider credentials." }, "ssoPolicyHelpStart": { - "message": "Enable the", - "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Enable the SSO Authentication policy to require all members to log in with SSO.'" + "message": "Use the", + "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Use the require single-sign-on authentication policy to require all members to log in with SSO.'" }, "ssoPolicyHelpLink": { - "message": "SSO Authentication policy", - "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Enable the SSO Authentication policy to require all members to log in with SSO.'" + "message": "require single-sign-on authentication policy", + "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Use the require single-sign-on authentication policy to require all members to log in with SSO.'" }, "ssoPolicyHelpEnd": { "message": "to require all members to log in with SSO.", - "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Enable the SSO Authentication policy to require all members to log in with SSO.'" + "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Use the require single-sign-on authentication policy to require all members to log in with SSO.'" }, "ssoPolicyHelpKeyConnector": { - "message": "SSO Authentication and Single Organization policies are required to set up Key Connector decryption." + "message": "The require SSO authentication and single organization policies are required to set up Key Connector decryption." }, "memberDecryptionOption": { "message": "Member Decryption Options" @@ -5165,5 +5183,35 @@ "example": "My Email" } } + }, + "inputRequired": { + "message": "Input is required." + }, + "inputEmail": { + "message": "Input is not an email-address." + }, + "inputMinLength": { + "message": "Input must be at least $COUNT$ characters long.", + "placeholders": { + "count": { + "content": "$1", + "example": "8" + } + } + }, + "fieldsNeedAttention": { + "message": "$COUNT$ field(s) above need your attention.", + "placeholders": { + "count": { + "content": "$1", + "example": "4" + } + } + }, + "turnOn": { + "message": "Turn on" + }, + "on": { + "message": "On" } } diff --git a/apps/web/src/locales/ko/messages.json b/apps/web/src/locales/ko/messages.json index b9f07f19414..bc3a98441f1 100644 --- a/apps/web/src/locales/ko/messages.json +++ b/apps/web/src/locales/ko/messages.json @@ -191,7 +191,7 @@ "description": "Domain name. Ex. website.com" }, "domainName": { - "message": "Domain Name", + "message": "도메인 이름", "description": "Domain name. Ex. website.com" }, "host": { @@ -309,13 +309,13 @@ "message": "Logins" }, "typeCardPlural": { - "message": "Cards" + "message": "카드" }, "typeIdentityPlural": { - "message": "Identities" + "message": "신원" }, "typeSecureNotePlural": { - "message": "Secure Notes" + "message": "보안 메모" }, "folders": { "message": "폴더" @@ -422,22 +422,22 @@ "description": "Copy URI to clipboard" }, "me": { - "message": "Me" + "message": "나" }, "myVault": { "message": "내 보관함" }, "allVaults": { - "message": "All Vaults" + "message": "모든 보관함" }, "vault": { "message": "보관함" }, "vaults": { - "message": "Vaults" + "message": "보관함" }, "vaultItems": { - "message": "Vault Items" + "message": "보관함 항목" }, "moveSelectedToOrg": { "message": "선택한 항목을 조직으로 이동함" @@ -572,6 +572,9 @@ "createAccount": { "message": "계정 만들기" }, + "startTrial": { + "message": "평가판 시작" + }, "logIn": { "message": "로그인" }, @@ -593,6 +596,9 @@ "masterPassDesc": { "message": "마스터 비밀번호는 보관함을 열 때 필요한 비밀번호입니다. 절대 마스터 비밀번호를 잊어버리지 마세요. 잊어버리면 복구할 수 있는 방법이 없습니다." }, + "masterPassImportant": { + "message": "마스터 비밀번호를 잊으면 복구할 수 없습니다!" + }, "masterPassHintDesc": { "message": "마스터 비밀번호 힌트는 마스터 비밀번호를 잊었을 때 도움이 될 수 있습니다." }, @@ -623,10 +629,13 @@ "invalidEmail": { "message": "잘못된 이메일 주소입니다." }, - "masterPassRequired": { - "message": "마스터 비밀번호는 반드시 입력해야 합니다." + "masterPasswordRequired": { + "message": "마스터 비밀번호가 필요합니다." }, - "masterPassLength": { + "confirmMasterPasswordRequired": { + "message": "마스터 비밀번호를 재입력해야 합니다." + }, + "masterPasswordMinLength": { "message": "마스터 비밀번호는 최소 8자 이상이어야 합니다." }, "masterPassDoesntMatch": { @@ -1137,13 +1146,13 @@ "message": "옵션" }, "preferences": { - "message": "Preferences" + "message": "설정" }, "preferencesDesc": { - "message": "Customize your web vault experience." + "message": "웹 보관함 환경 사용자 지정" }, "preferencesUpdated": { - "message": "Preferences updated" + "message": "설정 업데이트 완료!" }, "language": { "message": "언어(Language)" @@ -1152,7 +1161,7 @@ "message": "웹 보관함에서 사용할 언어를 변경합니다." }, "enableFavicon": { - "message": "Show website icons" + "message": "웹사이트 아이콘 표시하기" }, "faviconDesc": { "message": "Show a recognizable image next to each login." @@ -1239,7 +1248,7 @@ "message": "활성화됨" }, "activate": { - "message": "Activate" + "message": "활성화" }, "premium": { "message": "프리미엄", @@ -1267,7 +1276,7 @@ "message": "비활성화" }, "deactivate": { - "message": "Deactivate" + "message": "비활성화" }, "twoStepLoginProviderEnabled": { "message": "이 2단계 로그인 제공자는 귀하의 계정에 사용 가능합니다." @@ -3159,8 +3168,8 @@ "acceptPolicies": { "message": "이 박스를 체크하면 다음에 동의하는 것으로 간주됩니다:" }, - "acceptPoliciesError": { - "message": "서비스 약관 및 개인 정보 보호 정책을 확인하지 않았습니다." + "acceptPoliciesRequired": { + "message": "Terms of Service and Privacy Policy have not been acknowledged." }, "termsOfService": { "message": "서비스 약관" @@ -3209,6 +3218,9 @@ "organizationIsDisabled": { "message": "조직이 비활성화됨" }, + "disabledOrganizationFilterError": { + "message": "Items in disabled Organizations cannot be accessed. Contact your Organization owner for assistance." + }, "licenseIsExpired": { "message": "라이선스가 만료되었습니다." }, @@ -3333,9 +3345,15 @@ "clone": { "message": "복제" }, + "masterPassPolicyTitle": { + "message": "Master password requirements" + }, "masterPassPolicyDesc": { "message": "마스터 비밀번호 강도에 대한 최소 요구 사항을 설정해주세요." }, + "twoStepLoginPolicyTitle": { + "message": "Require two-step login" + }, "twoStepLoginPolicyDesc": { "message": "개인 계정에서 2단계 로그인을 요구합니다." }, @@ -4467,7 +4485,7 @@ "message": "보관함 시간 제한" }, "maximumVaultTimeoutDesc": { - "message": "Configure a maximum vault timeout for all users." + "message": "Set a maximum vault timeout for members." }, "maximumVaultTimeoutLabel": { "message": "최대 보관함 시간 제한" @@ -4510,7 +4528,7 @@ "message": "개인 보관함 내보내기 비활성화" }, "disablePersonalVaultExportDesc": { - "message": "Prohibits users from exporting their private vault data." + "message": "Do not allow members to export their individual vault data." }, "vaultExportDisabled": { "message": "보관함 내보내기 비활성화됨" @@ -4802,18 +4820,18 @@ }, "ssoPolicyHelpStart": { "message": "활성화:", - "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Enable the SSO Authentication policy to require all members to log in with SSO.'" + "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Use the require single-sign-on authentication policy to require all members to log in with SSO.'" }, "ssoPolicyHelpLink": { "message": "SSO 인증 정책", - "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Enable the SSO Authentication policy to require all members to log in with SSO.'" + "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Use the require single-sign-on authentication policy to require all members to log in with SSO.'" }, "ssoPolicyHelpEnd": { "message": "to require all members to log in with SSO.", - "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Enable the SSO Authentication policy to require all members to log in with SSO.'" + "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Use the require single-sign-on authentication policy to require all members to log in with SSO.'" }, "ssoPolicyHelpKeyConnector": { - "message": "SSO Authentication and Single Organization policies are required to set up Key Connector decryption." + "message": "The require SSO authentication and single organization policies are required to set up Key Connector decryption." }, "memberDecryptionOption": { "message": "멤버 복호화 옵션" @@ -5165,5 +5183,35 @@ "example": "My Email" } } + }, + "inputRequired": { + "message": "Input is required." + }, + "inputEmail": { + "message": "Input is not an email-address." + }, + "inputMinLength": { + "message": "Input must be at least $COUNT$ characters long.", + "placeholders": { + "count": { + "content": "$1", + "example": "8" + } + } + }, + "fieldsNeedAttention": { + "message": "$COUNT$ field(s) above need your attention.", + "placeholders": { + "count": { + "content": "$1", + "example": "4" + } + } + }, + "turnOn": { + "message": "Turn on" + }, + "on": { + "message": "On" } } diff --git a/apps/web/src/locales/lv/messages.json b/apps/web/src/locales/lv/messages.json index 8faa6ed01bc..1c1f67a7da5 100644 --- a/apps/web/src/locales/lv/messages.json +++ b/apps/web/src/locales/lv/messages.json @@ -572,6 +572,9 @@ "createAccount": { "message": "Izveidot kontu" }, + "startTrial": { + "message": "Start Trial" + }, "logIn": { "message": "Pierakstīties" }, @@ -593,6 +596,9 @@ "masterPassDesc": { "message": "Galvenā parole ir parole, kas tiek izmantota, lai piekļūtu glabātavai. Ir ļoti svarīgi, ka tā netiek aizmirsta, jo tādā gadījumā to nav iespējams atgūt." }, + "masterPassImportant": { + "message": "Master passwords cannot be recovered if you forget it!" + }, "masterPassHintDesc": { "message": "Galvenās paroles norāde var palīdzēt atcerēties paroli, ja tā ir aizmirsta." }, @@ -623,11 +629,14 @@ "invalidEmail": { "message": "Nederīga e-pasta adrese." }, - "masterPassRequired": { - "message": "Ir jānorāda galvenā parole." + "masterPasswordRequired": { + "message": "Master password is required." }, - "masterPassLength": { - "message": "Galvenajai parolei ir jābūt vismaz 8 rakstzīmes garai." + "confirmMasterPasswordRequired": { + "message": "Master password retype is required." + }, + "masterPasswordMinLength": { + "message": "Master password must be at least 8 characters long." }, "masterPassDoesntMatch": { "message": "Galvenās paroles apstiprinājums nesakrīt." @@ -3159,8 +3168,8 @@ "acceptPolicies": { "message": "Atzīmējot šo rūtiņu, Tu piekrīti sekojošajam:" }, - "acceptPoliciesError": { - "message": "Nav pieņemti izmantošanas nosacījumi un privātuma politika." + "acceptPoliciesRequired": { + "message": "Terms of Service and Privacy Policy have not been acknowledged." }, "termsOfService": { "message": "Izmantošanas nosacījumi" @@ -3209,6 +3218,9 @@ "organizationIsDisabled": { "message": "Apvienība ir atspējota." }, + "disabledOrganizationFilterError": { + "message": "Atspējotu apvienību vienumiem nevar piekļūt. Jāsazinās ar apvienības īpašnieku, lai iegūtu palīdzību." + }, "licenseIsExpired": { "message": "Ir beidzies licences izmantošanas laiks." }, @@ -3333,9 +3345,15 @@ "clone": { "message": "Pavairot" }, + "masterPassPolicyTitle": { + "message": "Galvenās paroles prasības" + }, "masterPassPolicyDesc": { "message": "Uzstādīt galvenās paroles stipruma mazākās izpildāmās prasības." }, + "twoStepLoginPolicyTitle": { + "message": "Pieprasīt divpakāpju pierakstīšanos" + }, "twoStepLoginPolicyDesc": { "message": "Pieprasīt lietotājiem uzstādīt divpakāpju pierakstīšanos personīgajiem kontiem." }, @@ -4498,7 +4516,7 @@ "message": "Pielāgota glabātavas noildze" }, "vaultTimeoutToLarge": { - "message": "Glabātavas noildze pāŗsniedz apvienības uzstādīto ierobežojumu." + "message": "Glabātavas noildze pārsniedz apvienības uzstādītos ierobežojumus." }, "vaultCustomTimeoutMinimum": { "message": "Mazākā pieļaujamā pielāgotā noildze ir 1 minūte." @@ -4802,15 +4820,15 @@ }, "ssoPolicyHelpStart": { "message": "Iespējot", - "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Enable the SSO Authentication policy to require all members to log in with SSO.'" + "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Use the require single-sign-on authentication policy to require all members to log in with SSO.'" }, "ssoPolicyHelpLink": { "message": "Vienotās pieteikšanās nosacījumi", - "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Enable the SSO Authentication policy to require all members to log in with SSO.'" + "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Use the require single-sign-on authentication policy to require all members to log in with SSO.'" }, "ssoPolicyHelpEnd": { "message": ", lai pieprasītu dalībniekiem pierakstīties ar vienoto pieteikšanos.", - "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Enable the SSO Authentication policy to require all members to log in with SSO.'" + "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Use the require single-sign-on authentication policy to require all members to log in with SSO.'" }, "ssoPolicyHelpKeyConnector": { "message": "Ir nepieciešami vienotās pieteikšanās un vienas apvienības nosacījumi, lai uzstādītu Key Connector šifrēšanu." @@ -5165,5 +5183,35 @@ "example": "My Email" } } + }, + "inputRequired": { + "message": "Input is required." + }, + "inputEmail": { + "message": "Input is not an email-address." + }, + "inputMinLength": { + "message": "Input must be at least $COUNT$ characters long.", + "placeholders": { + "count": { + "content": "$1", + "example": "8" + } + } + }, + "fieldsNeedAttention": { + "message": "$COUNT$ field(s) above need your attention.", + "placeholders": { + "count": { + "content": "$1", + "example": "4" + } + } + }, + "turnOn": { + "message": "Ieslēgt" + }, + "on": { + "message": "Ieslēgts" } } diff --git a/apps/web/src/locales/ml/messages.json b/apps/web/src/locales/ml/messages.json index af3cb86c116..5268c1cbc7a 100644 --- a/apps/web/src/locales/ml/messages.json +++ b/apps/web/src/locales/ml/messages.json @@ -572,6 +572,9 @@ "createAccount": { "message": "അക്കൗണ്ട് സൃഷ്ടിക്കുക" }, + "startTrial": { + "message": "Start Trial" + }, "logIn": { "message": "പ്രവേശിക്കുക" }, @@ -593,6 +596,9 @@ "masterPassDesc": { "message": "നിങ്ങളുടെ വാൾട്ടിലേക്ക് പ്രവേശിക്കാൻ ഉപയോഗിക്കുന്ന പാസ്‌വേഡാണ് പ്രാഥമിക പാസ്‌വേഡ്. പ്രാഥമിക പാസ്‌വേഡ് നിങ്ങൾ ഒരു കാരണവശാലും മറക്കരുത്. നിങ്ങൾ പാസ്‌വേഡ് മറന്നാൽ, വീണ്ടെടുക്കാൻ വേറെ ഒരു മാർഗ്ഗവുമില്ല." }, + "masterPassImportant": { + "message": "Master passwords cannot be recovered if you forget it!" + }, "masterPassHintDesc": { "message": "നിങ്ങളുടെ പാസ്‌വേഡ് മറന്നാൽ അത് ഓർമ്മിക്കാൻ ഒരു പ്രാഥമിക പാസ്‌വേഡ് സൂചന സഹായിക്കും." }, @@ -623,11 +629,14 @@ "invalidEmail": { "message": "അസാധുവായ ഇമെയിൽ." }, - "masterPassRequired": { - "message": "പ്രാഥമിക പാസ്‌വേഡ് നിർബന്ധമാണ്‌." + "masterPasswordRequired": { + "message": "Master password is required." }, - "masterPassLength": { - "message": "പ്രാഥമിക പാസ്‌വേഡിന് കുറഞ്ഞത് 8 പ്രതീകങ്ങളെങ്കിലും ദൈർഘ്യമുണ്ടായിരിക്കണം." + "confirmMasterPasswordRequired": { + "message": "Master password retype is required." + }, + "masterPasswordMinLength": { + "message": "Master password must be at least 8 characters long." }, "masterPassDoesntMatch": { "message": "പ്രാഥമിക പാസ്‌വേഡ് സ്ഥിരീകരണം പൊരുത്തപ്പെടുന്നില്ല." @@ -3159,8 +3168,8 @@ "acceptPolicies": { "message": "ഈ ബോക്സ് ചെക്കുചെയ്യുന്നതിലൂടെ നിങ്ങൾ ഇനിപ്പറയുന്നവ അംഗീകരിക്കുന്നു:" }, - "acceptPoliciesError": { - "message": "സേവന നിബന്ധനകളും സ്വകാര്യതാ നയവും അംഗീകരിച്ചിട്ടില്ല." + "acceptPoliciesRequired": { + "message": "Terms of Service and Privacy Policy have not been acknowledged." }, "termsOfService": { "message": "സേവന വ്യവസ്ഥകൾ" @@ -3209,6 +3218,9 @@ "organizationIsDisabled": { "message": "സംഘടന അപ്രാപ്‌തമാക്കി." }, + "disabledOrganizationFilterError": { + "message": "Items in disabled Organizations cannot be accessed. Contact your Organization owner for assistance." + }, "licenseIsExpired": { "message": "ലൈസൻസ് കാലഹരണപ്പെട്ടു." }, @@ -3333,9 +3345,15 @@ "clone": { "message": "ക്ലോൺ" }, + "masterPassPolicyTitle": { + "message": "Master password requirements" + }, "masterPassPolicyDesc": { "message": "Set minimum requirements for master password strength." }, + "twoStepLoginPolicyTitle": { + "message": "Require two-step login" + }, "twoStepLoginPolicyDesc": { "message": "ഉപയോക്താക്കൾക്ക് അവരുടെ സ്വകാര്യ അക്കൗണ്ടുകളിൽ രണ്ട്-ഘട്ട പ്രവേശനം സജ്ജമാക്കാൻ ആവശ്യപ്പെടുക." }, @@ -3883,7 +3901,7 @@ "message": "വ്യക്തിഗത ഉടമസ്ഥാവകാശം" }, "personalOwnershipPolicyDesc": { - "message": "Require users to save vault items to an organization by removing the personal ownership option." + "message": "Require members to save items to an organization by removing the individual vault option." }, "personalOwnershipExemption": { "message": "Organization Owners and Administrators are exempt from this policy's enforcement." @@ -3892,10 +3910,10 @@ "message": "Due to an enterprise policy, you are restricted from saving items to your personal vault. Change the Ownership option to an organization and choose from available Collections." }, "disableSend": { - "message": "Disable Send" + "message": "Remove Send" }, "disableSendPolicyDesc": { - "message": "Do not allow users to create or edit a Bitwarden Send. Deleting an existing Send is still allowed.", + "message": "Do not allow members to create or edit sends.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "disableSendExemption": { @@ -3910,7 +3928,7 @@ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendOptions": { - "message": "Send Options", + "message": "Send options", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendOptionsPolicyDesc": { @@ -3921,7 +3939,7 @@ "message": "Organization users that can manage the organization's policies are exempt from this policy's enforcement." }, "disableHideEmail": { - "message": "Do not allow users to hide their email address from recipients when creating or editing a Send.", + "message": "Always show member’s email address with recipients when creating or editing a send.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendOptionsPolicyInEffect": { @@ -4217,10 +4235,10 @@ "message": "Enrollment will allow organization administrators to change your master password" }, "resetPasswordPolicy": { - "message": "Master Password Reset" + "message": "Master password reset" }, "resetPasswordPolicyDescription": { - "message": "Allow administrators in the organization to reset organization users' master password." + "message": "Allow admins to reset master passwords for members." }, "resetPasswordPolicyWarning": { "message": "Users in the organization will need to self-enroll or be auto-enrolled before administrators can reset their master password." @@ -4464,10 +4482,10 @@ "message": "Your Master Password does not meet the policy requirements of this organization. In order to join the organization, you must update your Master Password now. Proceeding will log you out of your current session, requiring you to log back in. Active sessions on other devices may continue to remain active for up to one hour." }, "maximumVaultTimeout": { - "message": "Vault Timeout" + "message": "Vault timeout" }, "maximumVaultTimeoutDesc": { - "message": "Configure a maximum vault timeout for all users." + "message": "Set a maximum vault timeout for members." }, "maximumVaultTimeoutLabel": { "message": "Maximum Vault Timeout" @@ -4507,10 +4525,10 @@ "message": "Vault Timeout is not within allowed range." }, "disablePersonalVaultExport": { - "message": "Disable Personal Vault Export" + "message": "Remove individual vault export" }, "disablePersonalVaultExportDesc": { - "message": "Prohibits users from exporting their private vault data." + "message": "Do not allow members to export their individual vault data." }, "vaultExportDisabled": { "message": "Vault Export Disabled" @@ -4801,19 +4819,19 @@ "message": "Once set up, your configuration will be saved and members will be able to authenticate using their Identity Provider credentials." }, "ssoPolicyHelpStart": { - "message": "Enable the", - "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Enable the SSO Authentication policy to require all members to log in with SSO.'" + "message": "Use the", + "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Use the require single-sign-on authentication policy to require all members to log in with SSO.'" }, "ssoPolicyHelpLink": { - "message": "SSO Authentication policy", - "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Enable the SSO Authentication policy to require all members to log in with SSO.'" + "message": "require single-sign-on authentication policy", + "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Use the require single-sign-on authentication policy to require all members to log in with SSO.'" }, "ssoPolicyHelpEnd": { "message": "to require all members to log in with SSO.", - "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Enable the SSO Authentication policy to require all members to log in with SSO.'" + "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Use the require single-sign-on authentication policy to require all members to log in with SSO.'" }, "ssoPolicyHelpKeyConnector": { - "message": "SSO Authentication and Single Organization policies are required to set up Key Connector decryption." + "message": "The require SSO authentication and single organization policies are required to set up Key Connector decryption." }, "memberDecryptionOption": { "message": "Member Decryption Options" @@ -5165,5 +5183,35 @@ "example": "My Email" } } + }, + "inputRequired": { + "message": "Input is required." + }, + "inputEmail": { + "message": "Input is not an email-address." + }, + "inputMinLength": { + "message": "Input must be at least $COUNT$ characters long.", + "placeholders": { + "count": { + "content": "$1", + "example": "8" + } + } + }, + "fieldsNeedAttention": { + "message": "$COUNT$ field(s) above need your attention.", + "placeholders": { + "count": { + "content": "$1", + "example": "4" + } + } + }, + "turnOn": { + "message": "Turn on" + }, + "on": { + "message": "On" } } diff --git a/apps/web/src/locales/nb/messages.json b/apps/web/src/locales/nb/messages.json index 71b96b032c4..80816f19fb8 100644 --- a/apps/web/src/locales/nb/messages.json +++ b/apps/web/src/locales/nb/messages.json @@ -572,6 +572,9 @@ "createAccount": { "message": "Opprett en konto" }, + "startTrial": { + "message": "Start Trial" + }, "logIn": { "message": "Logg på" }, @@ -593,6 +596,9 @@ "masterPassDesc": { "message": "Superpassordet er passordet du bruker for å få tilgang til hvelvet ditt. Det er veldig viktig at du aldri glemmer ditt superpassord. Det er ingen måter å få tilbake passordet på dersom du noensinne skulle klare å glemme det." }, + "masterPassImportant": { + "message": "Master passwords cannot be recovered if you forget it!" + }, "masterPassHintDesc": { "message": "Et hint for superpassordet kan hjelpe deg med å huske på passordet dersom du skulle glemme det." }, @@ -623,11 +629,14 @@ "invalidEmail": { "message": "Ugyldig E-postadresse." }, - "masterPassRequired": { - "message": "Superpassordet er påkrevd." + "masterPasswordRequired": { + "message": "Master password is required." }, - "masterPassLength": { - "message": "Superpassordet må være ≥8 tegn langt." + "confirmMasterPasswordRequired": { + "message": "Master password retype is required." + }, + "masterPasswordMinLength": { + "message": "Master password must be at least 8 characters long." }, "masterPassDoesntMatch": { "message": "Superpassord-bekreftelsen er ikke samsvarende." @@ -3159,8 +3168,8 @@ "acceptPolicies": { "message": "Ved å huke av denne boksen sier du deg enig i følgende:" }, - "acceptPoliciesError": { - "message": "Bruksvilkårene og personvernerklæring er ikke godkjent." + "acceptPoliciesRequired": { + "message": "Terms of Service and Privacy Policy have not been acknowledged." }, "termsOfService": { "message": "Tjenestevilkår" @@ -3209,6 +3218,9 @@ "organizationIsDisabled": { "message": "Organisasjonen er skrudd av." }, + "disabledOrganizationFilterError": { + "message": "Items in disabled Organizations cannot be accessed. Contact your Organization owner for assistance." + }, "licenseIsExpired": { "message": "Lisensen har utløpt." }, @@ -3333,9 +3345,15 @@ "clone": { "message": "Klon" }, + "masterPassPolicyTitle": { + "message": "Master password requirements" + }, "masterPassPolicyDesc": { "message": "Sett minimumskrav til hovedpassordets styrke." }, + "twoStepLoginPolicyTitle": { + "message": "Require two-step login" + }, "twoStepLoginPolicyDesc": { "message": "Krev at brukere konfigurere totrinns pålogging på sine personlige kontoer." }, @@ -4802,15 +4820,15 @@ }, "ssoPolicyHelpStart": { "message": "Skru på", - "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Enable the SSO Authentication policy to require all members to log in with SSO.'" + "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Use the require single-sign-on authentication policy to require all members to log in with SSO.'" }, "ssoPolicyHelpLink": { "message": "SSO godkjenningspolicy", - "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Enable the SSO Authentication policy to require all members to log in with SSO.'" + "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Use the require single-sign-on authentication policy to require all members to log in with SSO.'" }, "ssoPolicyHelpEnd": { "message": "for å få alle medlemmer til å logge inn med SSO.", - "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Enable the SSO Authentication policy to require all members to log in with SSO.'" + "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Use the require single-sign-on authentication policy to require all members to log in with SSO.'" }, "ssoPolicyHelpKeyConnector": { "message": "SSO-autentisering og Enslig organisasjons politikk er nødvendig for å sette opp nøkkel Connector dekryptering." @@ -5165,5 +5183,35 @@ "example": "My Email" } } + }, + "inputRequired": { + "message": "Input is required." + }, + "inputEmail": { + "message": "Input is not an email-address." + }, + "inputMinLength": { + "message": "Input must be at least $COUNT$ characters long.", + "placeholders": { + "count": { + "content": "$1", + "example": "8" + } + } + }, + "fieldsNeedAttention": { + "message": "$COUNT$ field(s) above need your attention.", + "placeholders": { + "count": { + "content": "$1", + "example": "4" + } + } + }, + "turnOn": { + "message": "Turn on" + }, + "on": { + "message": "On" } } diff --git a/apps/web/src/locales/nl/messages.json b/apps/web/src/locales/nl/messages.json index 345b112909c..e3e86e93355 100644 --- a/apps/web/src/locales/nl/messages.json +++ b/apps/web/src/locales/nl/messages.json @@ -572,6 +572,9 @@ "createAccount": { "message": "Account aanmaken" }, + "startTrial": { + "message": "Start proefperiode" + }, "logIn": { "message": "Inloggen" }, @@ -593,6 +596,9 @@ "masterPassDesc": { "message": "Het hoofdwachtwoord is het wachtwoord waarmee je toegang krijgt tot je beveiligde kluis. Het is belangrijk dat je het hoofdwachtwoord niet vergeet, want er is geen manier om het te herstellen." }, + "masterPassImportant": { + "message": "Hoofdwachtwoorden kun je niet herstellen als je ze vergeet!" + }, "masterPassHintDesc": { "message": "Een hoofdwachtwoordhint kan je helpen je wachtwoord te herinneren als je het vergeten bent." }, @@ -623,11 +629,14 @@ "invalidEmail": { "message": "Ongeldig e-mailadres." }, - "masterPassRequired": { - "message": "Hoofdwachtwoord is vereist." + "masterPasswordRequired": { + "message": "Hoofdwachtwoord vereist." }, - "masterPassLength": { - "message": "Het hoofdwachtwoord moet minimaal 8 tekens lang zijn." + "confirmMasterPasswordRequired": { + "message": "Type je hoofdwachtwoord opnieuw in." + }, + "masterPasswordMinLength": { + "message": "Hoofdwachtwoord moet minimaal 8 tekens lang zijn." }, "masterPassDoesntMatch": { "message": "De hoofdwachtwoorden komen niet overeen." @@ -3159,8 +3168,8 @@ "acceptPolicies": { "message": "Door dit vakje aan te vinken ga je akkoord met het volgende:" }, - "acceptPoliciesError": { - "message": "Algemene voorwaarden en privacybeleid zijn nog niet erkend." + "acceptPoliciesRequired": { + "message": "Je hebt de algemene voorwaarden en het privacybeleid nog niet erkend." }, "termsOfService": { "message": "Algemene gebruiksvoorwaarden" @@ -3209,6 +3218,9 @@ "organizationIsDisabled": { "message": "Organisatie uitgeschakeld." }, + "disabledOrganizationFilterError": { + "message": "Je kunt uitgeschakelde items in een organisatie niet benaderen. Neem contact op met de eigenaar van je organisatie voor hulp." + }, "licenseIsExpired": { "message": "Licentie verlopen." }, @@ -3333,9 +3345,15 @@ "clone": { "message": "Dupliceren" }, + "masterPassPolicyTitle": { + "message": "Vereisten hoofdwachtwoord" + }, "masterPassPolicyDesc": { "message": "Minimale eisen voor de sterkte van het hoofdwachtwoord instellen." }, + "twoStepLoginPolicyTitle": { + "message": "Tweestapsaanmelding vereisen" + }, "twoStepLoginPolicyDesc": { "message": "Vereis tweestapsaanmelding op het persoonlijke account van gebruikers." }, @@ -3346,7 +3364,7 @@ "message": "Je bent lid van een organisatie die tweestapsaanmelding vereist op je persoonlijke account. Als je tweestapsaanmelding uitschakelt wordt je automatisch uit deze organisaties verwijderd." }, "passwordGeneratorPolicyDesc": { - "message": "Stel minimale vereisten in voor de configuratie van de wachtwoordgenerator." + "message": "Stel minimale vereisten in voor de configuratie van het wachtwoord generator." }, "passwordGeneratorPolicyInEffect": { "message": "Een of meer organisatiebeleidseisen heeft invloed op de instellingen van je generator." @@ -4802,15 +4820,15 @@ }, "ssoPolicyHelpStart": { "message": "Inschakelen", - "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Enable the SSO Authentication policy to require all members to log in with SSO.'" + "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Use the require single-sign-on authentication policy to require all members to log in with SSO.'" }, "ssoPolicyHelpLink": { "message": "SSO-beleid", - "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Enable the SSO Authentication policy to require all members to log in with SSO.'" + "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Use the require single-sign-on authentication policy to require all members to log in with SSO.'" }, "ssoPolicyHelpEnd": { "message": "om alle leden inloggen met SSO te verplichten.", - "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Enable the SSO Authentication policy to require all members to log in with SSO.'" + "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Use the require single-sign-on authentication policy to require all members to log in with SSO.'" }, "ssoPolicyHelpKeyConnector": { "message": "SSO-authenticatie en Enkele Organisatie-beleid zijn vereist voor het instellen van de versleuteling van de Key Connector." @@ -5165,5 +5183,35 @@ "example": "My Email" } } + }, + "inputRequired": { + "message": "Invoer vereist." + }, + "inputEmail": { + "message": "Invoer is geen e-mailadres." + }, + "inputMinLength": { + "message": "Invoer moet minimaal $COUNT$ tekens lang zijn.", + "placeholders": { + "count": { + "content": "$1", + "example": "8" + } + } + }, + "fieldsNeedAttention": { + "message": "$COUNT$ veld(en) hierboven hebben je aandacht nodig.", + "placeholders": { + "count": { + "content": "$1", + "example": "4" + } + } + }, + "turnOn": { + "message": "Inschakelen" + }, + "on": { + "message": "Aan" } } diff --git a/apps/web/src/locales/nn/messages.json b/apps/web/src/locales/nn/messages.json index cee5cd365a6..917d262c00f 100644 --- a/apps/web/src/locales/nn/messages.json +++ b/apps/web/src/locales/nn/messages.json @@ -177,7 +177,7 @@ "message": "Unassigned" }, "noneFolder": { - "message": "Ingen mappe", + "message": "Inga mappe", "description": "This is the folder for uncategorized items" }, "addFolder": { @@ -202,10 +202,10 @@ "message": "Exact" }, "startsWith": { - "message": "Starts with" + "message": "Byrjar med" }, "regEx": { - "message": "Regular expression", + "message": "Regulært uttrykk", "description": "A programming term, also known as 'RegEx'." }, "matchDetection": { @@ -251,7 +251,7 @@ "message": "Avbryt" }, "canceled": { - "message": "Canceled" + "message": "Brote av" }, "close": { "message": "Lat att" @@ -464,10 +464,10 @@ "message": "Sletta vedlegget" }, "deleteAttachmentConfirmation": { - "message": "Are you sure you want to delete this attachment?" + "message": "Er du trygg på at du vil sletta dette vedlegget?" }, "attachmentSaved": { - "message": "The attachment has been saved." + "message": "Vedlegget er vorte lagra." }, "file": { "message": "Fil" @@ -531,10 +531,10 @@ "message": "Flytta oppføringar" }, "overwritePasswordConfirmation": { - "message": "Are you sure you want to overwrite the current password?" + "message": "Er du trygg på at du vil skriva over passordet du har no?" }, "editedFolder": { - "message": "Edited folder" + "message": "Reidd mappa" }, "addedFolder": { "message": "Added folder" @@ -543,7 +543,7 @@ "message": "Are you sure you want to delete this folder?" }, "deletedFolder": { - "message": "Deleted folder" + "message": "Sletta mappe" }, "loggedOut": { "message": "Logged out" @@ -572,6 +572,9 @@ "createAccount": { "message": "Create Account" }, + "startTrial": { + "message": "Start Trial" + }, "logIn": { "message": "Log In" }, @@ -593,6 +596,9 @@ "masterPassDesc": { "message": "Hovudpassordet er passordet du brukar for å få tilgjenge til kvelvet ditt. Det er veldig viktig at du ikkje gløymer hovudpassordet ditt. Det er umogleg å få tilbake passordet om du so gløymer det." }, + "masterPassImportant": { + "message": "Master passwords cannot be recovered if you forget it!" + }, "masterPassHintDesc": { "message": "Eit hovudpassordvink kan hjelpa deg med å hugsa passordet ditt om du gløymer det." }, @@ -623,11 +629,14 @@ "invalidEmail": { "message": "Ugild e-postadresse." }, - "masterPassRequired": { - "message": "Hovudpassord er påkravt." + "masterPasswordRequired": { + "message": "Master password is required." }, - "masterPassLength": { - "message": "Hovudpassordet ditt må vera på minst 8 teikn." + "confirmMasterPasswordRequired": { + "message": "Master password retype is required." + }, + "masterPasswordMinLength": { + "message": "Master password must be at least 8 characters long." }, "masterPassDoesntMatch": { "message": "Stadfesting av hovudpassordet samsvarar ikkje." @@ -855,7 +864,7 @@ "message": "Copy Verification Code" }, "warning": { - "message": "Warning" + "message": "Åtvaring" }, "confirmVaultExport": { "message": "Confirm Vault Export" @@ -882,7 +891,7 @@ "message": "Your vault data has been exported." }, "passwordGenerator": { - "message": "Password Generator" + "message": "Password generator" }, "minComplexityScore": { "message": "Minimum Complexity Score" @@ -1067,7 +1076,7 @@ "message": "Sletta konto" }, "deleteAccountDesc": { - "message": "Proceed below to delete your account and all associated data." + "message": "Proceed below to delete your account and all vault data." }, "deleteAccountWarning": { "message": "Deleting your account is permanent. It cannot be undone." @@ -1076,7 +1085,7 @@ "message": "Kontoen er sletta" }, "accountDeletedDesc": { - "message": "Your account has been closed and all associated data has been deleted." + "message": "Your Bitwarden account and vault data were permanently deleted." }, "myAccount": { "message": "My Account" @@ -1214,7 +1223,7 @@ "message": "Domains updated" }, "twoStepLogin": { - "message": "Two-step Login" + "message": "Two-step login" }, "twoStepLoginDesc": { "message": "Secure your account by requiring an additional step when logging in." @@ -2239,7 +2248,7 @@ "message": "Are you sure you want to activate this user, granting them access to the organization?" }, "removeUserConfirmationKeyConnector": { - "message": "Warning! This user requires Key Connector to manage their encryption. Removing this user from your organization will permanently disable their account. This action cannot be undone. Do you want to proceed?" + "message": "Åtvaring! Dette brukarnamnet krev nykelkopling for å administrera krypteringa. Fjernar du denne brukaren frå verksemda di vil det deaktivera kontoen deira. Du kan ikkje angra på denne gjerda. Vil du halda fram?" }, "externalId": { "message": "External Id" @@ -3159,7 +3168,7 @@ "acceptPolicies": { "message": "By checking this box you agree to the following:" }, - "acceptPoliciesError": { + "acceptPoliciesRequired": { "message": "Terms of Service and Privacy Policy have not been acknowledged." }, "termsOfService": { @@ -3209,6 +3218,9 @@ "organizationIsDisabled": { "message": "Organization is disabled." }, + "disabledOrganizationFilterError": { + "message": "Items in disabled Organizations cannot be accessed. Contact your Organization owner for assistance." + }, "licenseIsExpired": { "message": "License is expired." }, @@ -3333,20 +3345,26 @@ "clone": { "message": "Clone" }, + "masterPassPolicyTitle": { + "message": "Master password requirements" + }, "masterPassPolicyDesc": { - "message": "Set minimum requirements for master password strength." + "message": "Set requirements for master password strength." + }, + "twoStepLoginPolicyTitle": { + "message": "Require two-step login" }, "twoStepLoginPolicyDesc": { - "message": "Require users to set up two-step login on their personal accounts." + "message": "Require members to set up two-step login." }, "twoStepLoginPolicyWarning": { - "message": "Organization members who are not Owners or Administrators and do not have two-step login enabled for their personal account will be removed from the organization and will receive an email notifying them about the change." + "message": "Organization members who are not Owners or Administrators and do not have two-step login turned on for their account will be removed from the organization and will receive an email notifying them about the change." }, "twoStepLoginPolicyUserWarning": { "message": "You are a member of an organization that requires two-step login to be enabled on your user account. If you disable all two-step login providers you will be automatically removed from these organizations." }, "passwordGeneratorPolicyDesc": { - "message": "Set minimum requirements for password generator configuration." + "message": "Set requirements for password generator." }, "passwordGeneratorPolicyInEffect": { "message": "One or more organization policies are affecting your generator settings." @@ -3420,7 +3438,7 @@ "description": "Noun: A special folder for holding deleted items that have not yet been permanently deleted" }, "searchTrash": { - "message": "Søk i boss" + "message": "Leita i papirkorga" }, "permanentlyDelete": { "message": "Permanently Delete" @@ -3564,10 +3582,10 @@ "message": "Link SSO" }, "singleOrg": { - "message": "Single Organization" + "message": "Single organization" }, "singleOrgDesc": { - "message": "Restrict users from being able to join any other organizations." + "message": "Restrict members from joining other organizations." }, "singleOrgBlockCreateMessage": { "message": "Your current organization has a policy that does not allow you to join more than one organization. Please contact your organization admins or sign up from a different Bitwarden account." @@ -3576,16 +3594,16 @@ "message": "Organization members who are not Owners or Administrators and are already a member of another organization will be removed from your organization." }, "requireSso": { - "message": "Single Sign-On Authentication" + "message": "Require single sign-on authentication" }, "requireSsoPolicyDesc": { - "message": "Require users to log in with the Enterprise Single Sign-On method." + "message": "Require members to log in with the Enterprise Single Sign-On method." }, "prerequisite": { "message": "Prerequisite" }, "requireSsoPolicyReq": { - "message": "The Single Organization enterprise policy must be enabled before activating this policy." + "message": "The Single Organization enterprise policy must be turned on before activating this policy." }, "requireSsoPolicyReqError": { "message": "Single Organization policy not enabled." @@ -3707,7 +3725,7 @@ "message": "Expired" }, "searchSends": { - "message": "Search Sends", + "message": "Leita i Send-ar", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendProtectedPassword": { @@ -3880,10 +3898,10 @@ } }, "personalOwnership": { - "message": "Personal Ownership" + "message": "Remove individual vault" }, "personalOwnershipPolicyDesc": { - "message": "Require users to save vault items to an organization by removing the personal ownership option." + "message": "Require members to save items to an organization by removing the individual vault option." }, "personalOwnershipExemption": { "message": "Organization Owners and Administrators are exempt from this policy's enforcement." @@ -3892,10 +3910,10 @@ "message": "Due to an enterprise policy, you are restricted from saving items to your personal vault. Change the Ownership option to an organization and choose from available Collections." }, "disableSend": { - "message": "Disable Send" + "message": "Remove Send" }, "disableSendPolicyDesc": { - "message": "Do not allow users to create or edit a Bitwarden Send. Deleting an existing Send is still allowed.", + "message": "Do not allow members to create or edit sends.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "disableSendExemption": { @@ -3910,7 +3928,7 @@ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendOptions": { - "message": "Send Options", + "message": "Send options", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendOptionsPolicyDesc": { @@ -3921,7 +3939,7 @@ "message": "Organization users that can manage the organization's policies are exempt from this policy's enforcement." }, "disableHideEmail": { - "message": "Do not allow users to hide their email address from recipients when creating or editing a Send.", + "message": "Always show member’s email address with recipients when creating or editing a send.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendOptionsPolicyInEffect": { @@ -4217,10 +4235,10 @@ "message": "Enrollment will allow organization administrators to change your master password" }, "resetPasswordPolicy": { - "message": "Master Password Reset" + "message": "Master password reset" }, "resetPasswordPolicyDescription": { - "message": "Allow administrators in the organization to reset organization users' master password." + "message": "Allow admins to reset master passwords for members." }, "resetPasswordPolicyWarning": { "message": "Users in the organization will need to self-enroll or be auto-enrolled before administrators can reset their master password." @@ -4464,10 +4482,10 @@ "message": "Your Master Password does not meet the policy requirements of this organization. In order to join the organization, you must update your Master Password now. Proceeding will log you out of your current session, requiring you to log back in. Active sessions on other devices may continue to remain active for up to one hour." }, "maximumVaultTimeout": { - "message": "Vault Timeout" + "message": "Vault timeout" }, "maximumVaultTimeoutDesc": { - "message": "Configure a maximum vault timeout for all users." + "message": "Set a maximum vault timeout for members." }, "maximumVaultTimeoutLabel": { "message": "Maximum Vault Timeout" @@ -4507,10 +4525,10 @@ "message": "Vault Timeout is not within allowed range." }, "disablePersonalVaultExport": { - "message": "Disable Personal Vault Export" + "message": "Remove individual vault export" }, "disablePersonalVaultExportDesc": { - "message": "Prohibits users from exporting their private vault data." + "message": "Do not allow members to export their individual vault data." }, "vaultExportDisabled": { "message": "Vault Export Disabled" @@ -4801,19 +4819,19 @@ "message": "Once set up, your configuration will be saved and members will be able to authenticate using their Identity Provider credentials." }, "ssoPolicyHelpStart": { - "message": "Enable the", - "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Enable the SSO Authentication policy to require all members to log in with SSO.'" + "message": "Use the", + "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Use the require single-sign-on authentication policy to require all members to log in with SSO.'" }, "ssoPolicyHelpLink": { - "message": "SSO Authentication policy", - "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Enable the SSO Authentication policy to require all members to log in with SSO.'" + "message": "require single-sign-on authentication policy", + "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Use the require single-sign-on authentication policy to require all members to log in with SSO.'" }, "ssoPolicyHelpEnd": { "message": "to require all members to log in with SSO.", - "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Enable the SSO Authentication policy to require all members to log in with SSO.'" + "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Use the require single-sign-on authentication policy to require all members to log in with SSO.'" }, "ssoPolicyHelpKeyConnector": { - "message": "SSO Authentication and Single Organization policies are required to set up Key Connector decryption." + "message": "The require SSO authentication and single organization policies are required to set up Key Connector decryption." }, "memberDecryptionOption": { "message": "Member Decryption Options" @@ -5165,5 +5183,35 @@ "example": "My Email" } } + }, + "inputRequired": { + "message": "Input is required." + }, + "inputEmail": { + "message": "Input is not an email-address." + }, + "inputMinLength": { + "message": "Input must be at least $COUNT$ characters long.", + "placeholders": { + "count": { + "content": "$1", + "example": "8" + } + } + }, + "fieldsNeedAttention": { + "message": "$COUNT$ field(s) above need your attention.", + "placeholders": { + "count": { + "content": "$1", + "example": "4" + } + } + }, + "turnOn": { + "message": "Turn on" + }, + "on": { + "message": "On" } } diff --git a/apps/web/src/locales/pl/messages.json b/apps/web/src/locales/pl/messages.json index d73a957910c..2bf315158e1 100644 --- a/apps/web/src/locales/pl/messages.json +++ b/apps/web/src/locales/pl/messages.json @@ -572,6 +572,9 @@ "createAccount": { "message": "Utwórz konto" }, + "startTrial": { + "message": "Rozpocznij okres próbny" + }, "logIn": { "message": "Zaloguj się" }, @@ -593,6 +596,9 @@ "masterPassDesc": { "message": "Hasło główne zapewnia dostęp do sejfu. To bardzo ważne, aby je pamiętać, ponieważ zapomnianego hasła nie będzie można odzyskać." }, + "masterPassImportant": { + "message": "Hasła główne nie mogą zostać odzyskane, jeśli je zapomnisz!" + }, "masterPassHintDesc": { "message": "Podpowiedź do hasła głównego może pomóc Ci przypomnieć hasło, jeśli je zapomnisz." }, @@ -623,10 +629,13 @@ "invalidEmail": { "message": "Adres e-mail jest nieprawidłowy." }, - "masterPassRequired": { + "masterPasswordRequired": { "message": "Hasło główne jest wymagane." }, - "masterPassLength": { + "confirmMasterPasswordRequired": { + "message": "Wymagane jest ponowne wpisanie hasła głównego." + }, + "masterPasswordMinLength": { "message": "Hasło główne musi zawierać co najmniej 8 znaków." }, "masterPassDoesntMatch": { @@ -1152,10 +1161,10 @@ "message": "Zmień język używany przez sejf." }, "enableFavicon": { - "message": "Pokaż ikonkę strony" + "message": "Pokaż ikony witryn" }, "faviconDesc": { - "message": "Pokaż rozpoznawalny obrazek obok każdego elementu." + "message": "Pokaż rozpoznawalny obraz obok każdych danych logowania." }, "enableGravatars": { "message": "Włącz Gravatary", @@ -3159,8 +3168,8 @@ "acceptPolicies": { "message": "Zaznaczając tę opcję, akceptujesz:" }, - "acceptPoliciesError": { - "message": "Nie zaakceptowałeś regulaminu i polityki prywatności." + "acceptPoliciesRequired": { + "message": "Warunki użytkowania i polityka prywatności nie zostały zaakceptowane." }, "termsOfService": { "message": "Regulamin" @@ -3209,6 +3218,9 @@ "organizationIsDisabled": { "message": "Organizacja jest wyłączona." }, + "disabledOrganizationFilterError": { + "message": "Nie można uzyskać dostępu do elementów w wyłączonych organizacjach. Skontaktuj się z właścicielem organizacji, aby uzyskać pomoc." + }, "licenseIsExpired": { "message": "Licencja wygasła." }, @@ -3333,9 +3345,15 @@ "clone": { "message": "Klonuj" }, + "masterPassPolicyTitle": { + "message": "Wymagania hasła głównego" + }, "masterPassPolicyDesc": { "message": "Ustaw minimalne wymagania dla hasła głównego." }, + "twoStepLoginPolicyTitle": { + "message": "Wymagaj logowania dwustopniowego" + }, "twoStepLoginPolicyDesc": { "message": "Wymagaj od użytkowników aktywowania logowania dwustopniowego na swoich kontach osobistych." }, @@ -4802,15 +4820,15 @@ }, "ssoPolicyHelpStart": { "message": "Włącz", - "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Enable the SSO Authentication policy to require all members to log in with SSO.'" + "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Use the require single-sign-on authentication policy to require all members to log in with SSO.'" }, "ssoPolicyHelpLink": { "message": "zasadę logowania jednokrotnego SSO", - "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Enable the SSO Authentication policy to require all members to log in with SSO.'" + "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Use the require single-sign-on authentication policy to require all members to log in with SSO.'" }, "ssoPolicyHelpEnd": { "message": ", aby wymagać od wszystkich użytkowników logowania jednokrotnego SSO.", - "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Enable the SSO Authentication policy to require all members to log in with SSO.'" + "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Use the require single-sign-on authentication policy to require all members to log in with SSO.'" }, "ssoPolicyHelpKeyConnector": { "message": "Zasady logowania jednokrotnego SSO i pojedynczej organizacji muszą być włączone, aby skonfigurować serwer Key Connector." @@ -5165,5 +5183,35 @@ "example": "My Email" } } + }, + "inputRequired": { + "message": "Dane wejściowe są wymagane." + }, + "inputEmail": { + "message": "Dane wejściowe nie są adresem e-mail." + }, + "inputMinLength": { + "message": "Dane wejściowe muszą zawierać co najmniej $COUNT$ znaki(-ów).", + "placeholders": { + "count": { + "content": "$1", + "example": "8" + } + } + }, + "fieldsNeedAttention": { + "message": "Pola powyżej wymagające Twojej uwagi: $COUNT$.", + "placeholders": { + "count": { + "content": "$1", + "example": "4" + } + } + }, + "turnOn": { + "message": "Włącz" + }, + "on": { + "message": "Wł." } } diff --git a/apps/web/src/locales/pt_BR/messages.json b/apps/web/src/locales/pt_BR/messages.json index 6b5155ff9fd..07062993d9c 100644 --- a/apps/web/src/locales/pt_BR/messages.json +++ b/apps/web/src/locales/pt_BR/messages.json @@ -191,7 +191,7 @@ "description": "Domain name. Ex. website.com" }, "domainName": { - "message": "Domain Name", + "message": "Nome do domínio", "description": "Domain name. Ex. website.com" }, "host": { @@ -422,25 +422,25 @@ "description": "Copy URI to clipboard" }, "me": { - "message": "Me" + "message": "Eu" }, "myVault": { "message": "Meu Cofre" }, "allVaults": { - "message": "All Vaults" + "message": "Todos os Cofres" }, "vault": { "message": "Cofre" }, "vaults": { - "message": "Vaults" + "message": "Cofres" }, "vaultItems": { - "message": "Vault Items" + "message": "Itens do Cofre" }, "moveSelectedToOrg": { - "message": "Mover Selecionados para a organização" + "message": "Mover Selecionados para a Organização" }, "deleteSelected": { "message": "Excluir Selecionados" @@ -572,6 +572,9 @@ "createAccount": { "message": "Criar Conta" }, + "startTrial": { + "message": "Iniciar Período de Testes" + }, "logIn": { "message": "Iniciar Sessão" }, @@ -593,6 +596,9 @@ "masterPassDesc": { "message": "A senha mestra é a senha que você usa para acessar o seu cofre. É muito importante que você não esqueça sua senha mestra. Não há maneira de recuperar a senha caso você se esqueça." }, + "masterPassImportant": { + "message": "Senhas mestres não podem ser recuperadas se você esquecê-la!" + }, "masterPassHintDesc": { "message": "Uma dica de senha mestra pode ajudá-lo(a) a lembrar a senha caso você esqueça." }, @@ -623,11 +629,14 @@ "invalidEmail": { "message": "Endereço de e-mail inválido." }, - "masterPassRequired": { + "masterPasswordRequired": { "message": "A senha mestra é obrigatória." }, - "masterPassLength": { - "message": "A senha mestra deve ter pelo menos 8 caracteres." + "confirmMasterPasswordRequired": { + "message": "A senha mestra é necessária." + }, + "masterPasswordMinLength": { + "message": "A senha mestra deve ter ao menos 8 caracteres." }, "masterPassDoesntMatch": { "message": "A confirmação da senha mestra não corresponde." @@ -882,7 +891,7 @@ "message": "Os dados do seu cofre foram exportados." }, "passwordGenerator": { - "message": "Gerador de senha" + "message": "Gerador de Senha" }, "minComplexityScore": { "message": "Pontuação Mínima de Complexidade" @@ -1067,7 +1076,7 @@ "message": "Excluir a conta" }, "deleteAccountDesc": { - "message": "Prossiga abaixo para excluir a sua conta e todos os dados associados." + "message": "Prossiga abaixo para excluir sua conta e todos os dados associados." }, "deleteAccountWarning": { "message": "A exclusão de sua conta é permanente. Não pode ser desfeito." @@ -1137,13 +1146,13 @@ "message": "Opções" }, "preferences": { - "message": "Preferences" + "message": "Preferências" }, "preferencesDesc": { - "message": "Customize your web vault experience." + "message": "Personalize sua experiência no cofre web." }, "preferencesUpdated": { - "message": "Preferences updated" + "message": "Preferências atualizadas" }, "language": { "message": "Idioma" @@ -1152,10 +1161,10 @@ "message": "Altere o idioma usado pelo cofre web." }, "enableFavicon": { - "message": "Show website icons" + "message": "Mostrar ícones do site" }, "faviconDesc": { - "message": "Show a recognizable image next to each login." + "message": "Mostrar uma imagem reconhecível ao lado de cada login." }, "enableGravatars": { "message": "Habilitar Gravatar", @@ -1239,7 +1248,7 @@ "message": "Habilitado" }, "activate": { - "message": "Activate" + "message": "Ativar" }, "premium": { "message": "Premium", @@ -1267,7 +1276,7 @@ "message": "Desabilitar" }, "deactivate": { - "message": "Deactivate" + "message": "Desativado" }, "twoStepLoginProviderEnabled": { "message": "Este provedor de login em duas etapas está ativado em sua conta." @@ -1466,7 +1475,7 @@ "message": "Relatórios" }, "reportsDesc": { - "message": "Identify and close security gaps in your online accounts by clicking the reports below.", + "message": "Identifique e feche as lacunas de segurança em suas contas online clicando nos relatórios abaixo.", "description": "Vault Health Reports can be used to evaluate the security of your Bitwarden Personal or Organization Vault." }, "unsecuredWebsitesReport": { @@ -2233,10 +2242,10 @@ "message": "Você tem certeza que deseja remover este(a) usuário(a)?" }, "deactivateUserConfirmation": { - "message": "The member will no longer have access to the organization, but will still have access to their individual vault." + "message": "O membro já não terá acesso à organização, mas ainda terá acesso ao seu cofre individual." }, "activateUserConfirmation": { - "message": "Are you sure you want to activate this user, granting them access to the organization?" + "message": "Tem certeza de que deseja ativar este usuário, concedendo-lhes o acesso à organização?" }, "removeUserConfirmationKeyConnector": { "message": "Aviso! Este usuário precisa do Conector de Chave para gerenciar sua criptografia. Remover este usuário de sua organização desativará permanentemente sua conta. Essa ação não pode ser desfeita. Você quer prosseguir?" @@ -2584,7 +2593,7 @@ } }, "deactivatedUserId": { - "message": "Deactivated user $ID$.", + "message": "Usuário $ID$ desativado.", "placeholders": { "id": { "content": "$1", @@ -2593,7 +2602,7 @@ } }, "activatedUserId": { - "message": "Activated user $ID$.", + "message": "Usuário $ID$ ativado.", "placeholders": { "id": { "content": "$1", @@ -2602,7 +2611,7 @@ } }, "deactivateUserId": { - "message": "Deactivate user $ID$?", + "message": "Desativar o usuário $ID$?", "placeholders": { "id": { "content": "$1", @@ -2611,7 +2620,7 @@ } }, "activateUserId": { - "message": "Activate user $ID$?", + "message": "Ativar o usuário $ID$?", "placeholders": { "id": { "content": "$1", @@ -3159,7 +3168,7 @@ "acceptPolicies": { "message": "Ao marcar esta caixa, você concorda com o seguinte:" }, - "acceptPoliciesError": { + "acceptPoliciesRequired": { "message": "Os Termos de Serviço e a Política de Privacidade não foram reconhecidos." }, "termsOfService": { @@ -3209,6 +3218,9 @@ "organizationIsDisabled": { "message": "Organização está desabilitada." }, + "disabledOrganizationFilterError": { + "message": "Items in disabled Organizations cannot be accessed. Contact your Organization owner for assistance." + }, "licenseIsExpired": { "message": "A licença está expirada." }, @@ -3333,9 +3345,15 @@ "clone": { "message": "Clonar" }, + "masterPassPolicyTitle": { + "message": "Requisitos de senha mestra" + }, "masterPassPolicyDesc": { "message": "Defina os requisitos mínimos para a força da senha mestra." }, + "twoStepLoginPolicyTitle": { + "message": "Exigir login em duas etapas" + }, "twoStepLoginPolicyDesc": { "message": "Exigir que os usuários definam a autenticação de dois passos nas suas contas pessoais." }, @@ -3667,7 +3685,7 @@ "message": "Desativado" }, "deactivated": { - "message": "Deactivated" + "message": "Desativado" }, "sendLink": { "message": "Link do Send", @@ -4271,10 +4289,10 @@ "message": "Tem certeza de que deseja remover os seguintes usuários? O processo pode levar alguns segundos para ser concluído e não pode ser interrompido ou cancelado." }, "deactivateUsersWarning": { - "message": "Are you sure you want to deactivate the following members? They will no longer have access to the organization, but will still have access to their individual vaults. The process may take a few seconds to complete and cannot be interrupted or canceled." + "message": "Você tem certeza de que deseja desativar os seguintes membros? Eles deixarão de ter acesso à organização, mas continuarão a ter acesso aos seus cofres individuais. O processo pode demorar alguns segundos para ser concluído e não pode ser interrompido ou cancelado." }, "activateUsersWarning": { - "message": "Are you sure you want to activate the following members, granting them access to the organization? The process may take a few seconds to complete and cannot be interrupted or canceled." + "message": "Tem certeza de que deseja ativar os seguintes membros, concedendo a eles acesso à organização? O processo pode demorar alguns segundos para ser concluído e não pode ser interrompido ou cancelado." }, "theme": { "message": "Tema" @@ -4307,10 +4325,10 @@ "message": "Removido com sucesso" }, "bulkDeactivatedMessage": { - "message": "Deactivated successfully" + "message": "Desativado com sucesso" }, "bulkActivatedMessage": { - "message": "Activated successfully" + "message": "Ativado com sucesso" }, "bulkFilteredMessage": { "message": "Excluído, não aplicável para esta ação." @@ -4322,10 +4340,10 @@ "message": "Remover Usuários" }, "deactivateUsers": { - "message": "Deactivate Users" + "message": "Desativar Usuários" }, "activateUsers": { - "message": "Activate Users" + "message": "Ativar usuários" }, "error": { "message": "Erro" @@ -4501,10 +4519,10 @@ "message": "O tempo limite do seu cofre excede a restrição definida por sua organização." }, "vaultCustomTimeoutMinimum": { - "message": "Minimum custom timeout is 1 minute." + "message": "Tempo limite mínimo personalizado é 1 minuto." }, "vaultTimeoutRangeError": { - "message": "Vault Timeout is not within allowed range." + "message": "Tempo limite do cofre não está dentro do intervalo permitido." }, "disablePersonalVaultExport": { "message": "Desabilitar Exportação de Cofre Pessoal" @@ -4624,7 +4642,7 @@ "message": "Permitir Retorno de Autenticação Não Solicitada" }, "idpAllowOutboundLogoutRequests": { - "message": "Allow outbound logout requests" + "message": "Permitir pedidos de saída" }, "idpSignAuthenticationRequests": { "message": "Assinar pedidos de autenticação" @@ -4750,7 +4768,7 @@ "message": "Patrocínio Removido" }, "ssoKeyConnectorError": { - "message": "Key Connector error: make sure Key Connector is available and working correctly." + "message": "Erro de Key Connector: certifique-se de que a Key Connector está disponível e funcionando corretamente." }, "keyConnectorUrl": { "message": "URL de Conector de Chave" @@ -4802,15 +4820,15 @@ }, "ssoPolicyHelpStart": { "message": "Ativar o", - "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Enable the SSO Authentication policy to require all members to log in with SSO.'" + "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Use the require single-sign-on authentication policy to require all members to log in with SSO.'" }, "ssoPolicyHelpLink": { "message": "Política de SSO", - "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Enable the SSO Authentication policy to require all members to log in with SSO.'" + "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Use the require single-sign-on authentication policy to require all members to log in with SSO.'" }, "ssoPolicyHelpEnd": { "message": "para exigir que todos os membros entrem com o SSO.", - "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Enable the SSO Authentication policy to require all members to log in with SSO.'" + "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Use the require single-sign-on authentication policy to require all members to log in with SSO.'" }, "ssoPolicyHelpKeyConnector": { "message": "As políticas de Autenticação de SSO e Organização Única são necessárias para configurar a descriptografia do Conector de Chave." @@ -4879,76 +4897,76 @@ "message": "GRÁTIS com patrocínio" }, "viewBillingSyncToken": { - "message": "View Billing Sync Token" + "message": "Ver Token de Faturamento Sync" }, "generateBillingSyncToken": { - "message": "Generate Billing Sync Token" + "message": "Gerar token de faturamento Sync" }, "copyPasteBillingSync": { - "message": "Copy and paste this token into the Billing Sync settings of your self-hosted organization." + "message": "Copie e cole esse token nas configurações de Faturamento Sync da sua organização auto-hospedada." }, "billingSyncCanAccess": { - "message": "Your Billing Sync token can access and edit this organization's subscription settings." + "message": "Seu token de faturamento Sync pode acessar e editar as configurações de assinatura desta organização." }, "manageBillingSync": { - "message": "Manage Billing Sync" + "message": "Gerenciar sincronização de faturamento" }, "setUpBillingSync": { - "message": "Set Up Billing Sync" + "message": "Configurar sincronização de faturamento" }, "generateToken": { - "message": "Generate Token" + "message": "Gerar o token" }, "rotateToken": { - "message": "Rotate Token" + "message": "Renovar Token" }, "rotateBillingSyncTokenWarning": { - "message": "If you proceed, you will need to re-setup billing sync on your self-hosted server." + "message": "Se você continuar, precisará re-configurar a sincronização de cobrança no seu servidor auto-hospedado." }, "rotateBillingSyncTokenTitle": { - "message": "Rotating the Billing Sync Token will invalidate the previous token." + "message": "Renovar o Token de Sincronização de Cobrança invalidará o token anterior." }, "selfHostingTitle": { - "message": "Self-Hosting" + "message": "Auto-hospedado" }, "selfHostingEnterpriseOrganizationSectionCopy": { - "message": "To set-up your organization on your own server, you will need to upload your license file. To support Free Families plans and advanced billing capabilities for your self-hosted organization, you will need to set up billing sync." + "message": "Para configurar sua organização no seu próprio servidor, você precisará fazer o upload do arquivo de licença. Para oferecer suporte a planos de famílias gratuitas e recursos avançados de faturamento para a sua organização auto-hospedada, você precisará configurar a sincronização de cobrança." }, "billingSyncApiKeyRotated": { - "message": "Token rotated." + "message": "Token renovado" }, "billingSync": { - "message": "Billing Sync" + "message": "Sincronização de Faturamento" }, "billingSyncDesc": { - "message": "Billing Sync provides Free Families plans for members and advanced billing capabilities by linking your self-hosted Bitwarden to the Bitwarden cloud server." + "message": "A sincronização de faturamento fornece Plano Familiar gratuito para membros e recursos avançados de faturamento, vinculando o Bitwarden auto-hospedado ao servidor da nuvem do Bitwarden." }, "billingSyncKeyDesc": { - "message": "A Billing Sync Token from your cloud organization's subscription settings is required to complete this form." + "message": "Um Token de sincronização de faturamento das configurações de assinatura da sua organização da nuvem é necessário para completar este formulário." }, "billingSyncKey": { - "message": "Billing Sync Token" + "message": "Token de Sincronização de Faturamento" }, "active": { - "message": "Active" + "message": "Ativo" }, "inactive": { - "message": "Inactive" + "message": "Inativo" }, "sentAwaitingSync": { - "message": "Sent (Awaiting Sync)" + "message": "Enviado (Aguardando Sincronização)" }, "sent": { - "message": "Sent" + "message": "Enviado" }, "requestRemoved": { - "message": "Removed (Awaiting Sync)" + "message": "Removido (Aguardando Sincronização)" }, "requested": { - "message": "Requested" + "message": "Solicitado" }, "formErrorSummaryPlural": { - "message": "$COUNT$ fields above need your attention.", + "message": "$COUNT$ campos acima precisam de sua atenção.", "placeholders": { "count": { "content": "$1", @@ -4957,10 +4975,10 @@ } }, "formErrorSummarySingle": { - "message": "1 field above needs your attention." + "message": "1 campo acima precisa de sua atenção." }, "fieldRequiredError": { - "message": "$FIELDNAME$ is required.", + "message": "$FIELDNAME$ é obrigatório.", "placeholders": { "fieldname": { "content": "$1", @@ -4969,31 +4987,31 @@ } }, "required": { - "message": "required" + "message": "obrigatório" }, "idpSingleSignOnServiceUrlRequired": { - "message": "Required if Entity ID is not a URL." + "message": "Necessário se o ID da Entidade não for um URL." }, "openIdOptionalCustomizations": { - "message": "Optional Customizations" + "message": "Personalizações opcionais" }, "openIdAuthorityRequired": { - "message": "Required if Authority is not valid." + "message": "Necessário se a autoridade não for válida." }, "separateMultipleWithComma": { - "message": "Separate multiple with a comma." + "message": "Separe várias tags com vírgula." }, "sessionTimeout": { - "message": "Your session has timed out. Please go back and try logging in again." + "message": "Sua sessão expirou. Volte e tente iniciar a sessão novamente." }, "exportingPersonalVaultTitle": { - "message": "Exporting Personal Vault" + "message": "Exportando Cofre Pessoal" }, "exportingOrganizationVaultTitle": { - "message": "Exporting Organization Vault" + "message": "Exportando o Cofre da Organização" }, "exportingPersonalVaultDescription": { - "message": "Only the personal vault items associated with $EMAIL$ will be exported. Organization vault items will not be included.", + "message": "Apenas os itens pessoais do cofre associados com $EMAIL$ serão exportados. Os itens do cofre da organização não serão incluídos.", "placeholders": { "email": { "content": "$1", @@ -5002,7 +5020,7 @@ } }, "exportingOrganizationVaultDescription": { - "message": "Only the organization vault associated with $ORGANIZATION$ will be exported. Personal vault items and items from other organizations will not be included.", + "message": "Apenas o cofre da organização associado com $ORGANIZATION$ será exportado. Itens do cofre pessoal e itens de outras organizações não serão incluídos.", "placeholders": { "organization": { "content": "$1", @@ -5011,82 +5029,82 @@ } }, "accessDenied": { - "message": "Access Denied. You do not have permission to view this page." + "message": "Acesso negado. Você não tem permissão para ver esta página." }, "masterPassword": { - "message": "Master Password" + "message": "Senha Mestra" }, "security": { - "message": "Security" + "message": "Segurança" }, "keys": { - "message": "Keys" + "message": "Chaves" }, "billingHistory": { - "message": "Billing History" + "message": "Histórico de Cobrança" }, "backToReports": { - "message": "Back to Reports" + "message": "Voltar para Relatórios" }, "organizationPicker": { - "message": "Organization picker" + "message": "Seletor de organização" }, "currentOrganization": { - "message": "Current organization", + "message": "Organização atual", "description": "This is used by screen readers to indicate the organization that is currently being shown to the user." }, "accountSettings": { - "message": "Account Settings" + "message": "Configurações da Conta" }, "generator": { - "message": "Generator" + "message": "Gerador" }, "whatWouldYouLikeToGenerate": { - "message": "What would you like to generate?" + "message": "O que você gostaria de gerar?" }, "passwordType": { - "message": "Password Type" + "message": "Tipo de Senha" }, "regenerateUsername": { "message": "Recriar Usuário" }, "generateUsername": { - "message": "Generate Username" + "message": "Gerar Usuário" }, "usernameType": { - "message": "Username Type" + "message": "Tipo de Usuário" }, "plusAddressedEmail": { - "message": "Plus Addressed Email", + "message": "E-mail alternativo (com um +)", "description": "Username generator option that appends a random sub-address to the username. For example: address+subaddress@email.com" }, "plusAddressedEmailDesc": { - "message": "Use your email provider's sub-addressing capabilities." + "message": "Use as capacidades de sub-endereçamento do seu provedor de e-mail." }, "catchallEmail": { - "message": "Catch-all Email" + "message": "E-mail pega-tudo" }, "catchallEmailDesc": { - "message": "Use your domain's configured catch-all inbox." + "message": "Use o catch-all configurado no seu domínio." }, "random": { - "message": "Random", + "message": "Aleatório", "description": "Generates domain-based username using random letters" }, "randomWord": { - "message": "Random Word" + "message": "Palavra Aleatória" }, "service": { - "message": "Service" + "message": "Serviço" }, "unknownCipher": { "message": "Item desconhecido, talvez você precise fazer login com outra conta para acessar este item." }, "cannotSponsorSelf": { - "message": "You cannot redeem for the active account. Enter a different email." + "message": "Você não pode resgatar a conta ativa. Digite um e-mail diferente." }, "revokeWhenExpired": { - "message": "Expires $DATE$", + "message": "Expira em $DATE$", "placeholders": { "date": { "content": "$1", @@ -5095,7 +5113,7 @@ } }, "awaitingSyncSingular": { - "message": "Token rotated $DAYS$ day ago. Update the billing sync token in your self-hosted organization settings.", + "message": "Token renovado há $DAYS$ dia atrás. Atualize o token de sincronização de cobrança nas configurações da organização auto-hospedada.", "placeholders": { "days": { "content": "$1", @@ -5104,7 +5122,7 @@ } }, "awaitingSyncPlural": { - "message": "Token rotated $DAYS$ days ago. Update the billing sync token in your self-hosted organization settings.", + "message": "Token renovado há $DAYS$ dias. Atualize o token de sincronização de cobrança nas configurações da sua organização auto-hospedada.", "placeholders": { "days": { "content": "$1", @@ -5113,14 +5131,14 @@ } }, "lastSync": { - "message": "Last Sync", + "message": "Última Sincronização", "Description": "Used as a prefix to indicate the last time a sync occured. Example \"Last sync 1968-11-16 00:00:00\"" }, "sponsorshipsSynced": { - "message": "Self-hosted sponsorships synced." + "message": "Patrocínios auto-hospedados sincronizados." }, "billingManagedByProvider": { - "message": "Managed by $PROVIDER$", + "message": "Gerenciado por $PROVIDER$", "placeholders": { "provider": { "content": "$1", @@ -5129,7 +5147,7 @@ } }, "billingContactProviderForAssistance": { - "message": "Please reach out to them for further assistance", + "message": "Por favor, entre em contato com eles para obter mais ajuda", "description": "This text is displayed if an organization's billing is managed by a Provider. It tells the user to contact the Provider for assistance." }, "forwardedEmail": { @@ -5143,27 +5161,57 @@ "description": "Part of a URL." }, "apiAccessToken": { - "message": "API Access Token" + "message": "Token de acesso API" }, "deviceVerification": { - "message": "Device Verification" + "message": "Verificação do dispositivo" }, "enableDeviceVerification": { - "message": "Enable Device Verification" + "message": "Habilitar Verificação do Dispositivo" }, "deviceVerificationDesc": { - "message": "When enabled, verification codes are sent to your email address when logging in from an unrecognized device" + "message": "Quando ativado, são enviados códigos de verificação para o seu endereço de e-mail ao fazer login a partir de um dispositivo não reconhecido" }, "updatedDeviceVerification": { - "message": "Updated Device Verification" + "message": "Verificação do Dispositivo Atualizada" }, "areYouSureYouWantToEnableDeviceVerificationTheVerificationCodeEmailsWillArriveAtX": { - "message": "Are you sure you want to enable Device Verification? The verification code emails will arrive at: $EMAIL$", + "message": "Tem certeza de que deseja habilitar o Verificação do Dispositivo? O código de verificação de e-mail chegarão em: $EMAIL$", "placeholders": { "email": { "content": "$1", "example": "My Email" } } + }, + "inputRequired": { + "message": "Entrada necessária." + }, + "inputEmail": { + "message": "A entrada não é um endereço de e-mail." + }, + "inputMinLength": { + "message": "A entrada deve ter pelo menos $COUNT$ caracteres.", + "placeholders": { + "count": { + "content": "$1", + "example": "8" + } + } + }, + "fieldsNeedAttention": { + "message": "$COUNT$ campos(s) acima precisam de sua atenção.", + "placeholders": { + "count": { + "content": "$1", + "example": "4" + } + } + }, + "turnOn": { + "message": "Ligar" + }, + "on": { + "message": "Ligado" } } diff --git a/apps/web/src/locales/pt_PT/messages.json b/apps/web/src/locales/pt_PT/messages.json index b7069e5327c..a4117ca485d 100644 --- a/apps/web/src/locales/pt_PT/messages.json +++ b/apps/web/src/locales/pt_PT/messages.json @@ -572,6 +572,9 @@ "createAccount": { "message": "Criar conta" }, + "startTrial": { + "message": "Iniciar avaliação" + }, "logIn": { "message": "Iniciar sessão" }, @@ -593,6 +596,9 @@ "masterPassDesc": { "message": "A palavra-passe mestra é a palavra-passe que utiliza para aceder ao seu cofre. É muito importante que não se esqueça da sua palavra-passe mestra. Não existe maneira de recuperar a palavra-passe no caso de a esquecer." }, + "masterPassImportant": { + "message": "As palavras-passe mestras não podem ser recuperadas se as esquecer!" + }, "masterPassHintDesc": { "message": "Uma dica da palavra-passe mestra pode ajudar a lembrar-se da sua palavra-passe se a esquecer." }, @@ -623,11 +629,14 @@ "invalidEmail": { "message": "Endereço de email inválido." }, - "masterPassRequired": { - "message": "A palavra-passe mestra é requerida." + "masterPasswordRequired": { + "message": "A palavra-passe mestra é necessária." }, - "masterPassLength": { - "message": "A palavra-passe mestra tem de ter pelo menos 8 caracteres." + "confirmMasterPasswordRequired": { + "message": "É necessário reescrever a palavra-passe mestra." + }, + "masterPasswordMinLength": { + "message": "A palavra-passe mestra deve ter pelo menos 8 caracteres." }, "masterPassDoesntMatch": { "message": "A confirmação da palavra-passe mestra não corresponde." @@ -1076,7 +1085,7 @@ "message": "Conta eliminada" }, "accountDeletedDesc": { - "message": "A sua conta foi encerrada e todos os dados associados foram eliminados." + "message": "A sua conta foi encerrada e todos os dados associados eliminados." }, "myAccount": { "message": "Minha conta" @@ -3037,7 +3046,7 @@ "message": "Opções Adicionais" }, "additionalOptionsDesc": { - "message": "For additional help in managing your subscription, please contact Customer Support." + "message": "Para ajuda adicional no gerenciamento da sua assinatura, entre em contato com o suporte ao cliente." }, "subscriptionUserSeatsUnlimitedAutoscale": { "message": "Adjustments to your subscription will result in prorated changes to your billing totals. If newly invited users exceed your subscription seats, you will immediately receive a prorated charge for the additional users." @@ -3157,10 +3166,10 @@ "message": "Não selecionou nada." }, "acceptPolicies": { - "message": "By checking this box you agree to the following:" + "message": "Ao marcar esta caixa concorda com o seguinte:" }, - "acceptPoliciesError": { - "message": "Terms of Service and Privacy Policy have not been acknowledged." + "acceptPoliciesRequired": { + "message": "Os Termos de Serviço e a Política de Privacidade não foram reconhecidos." }, "termsOfService": { "message": "Termos de serviço" @@ -3209,6 +3218,9 @@ "organizationIsDisabled": { "message": "A organização está desativada." }, + "disabledOrganizationFilterError": { + "message": "Itens em Organizações desativadas não podem ser acedidos. Entre em contato com o proprietário da sua Organização para obter assistência." + }, "licenseIsExpired": { "message": "A licença está expirada." }, @@ -3333,9 +3345,15 @@ "clone": { "message": "Clonar" }, + "masterPassPolicyTitle": { + "message": "Requisitos de palavra-passe mestra" + }, "masterPassPolicyDesc": { "message": "Defina os requisitos mínimos para a força da palavra-passe mestra." }, + "twoStepLoginPolicyTitle": { + "message": "Exigir login em duas etapas" + }, "twoStepLoginPolicyDesc": { "message": "Requer que os utilizadores definam a autenticação de dois passos nas suas contas pessoais." }, @@ -3567,7 +3585,7 @@ "message": "Organização única" }, "singleOrgDesc": { - "message": "Restrict users from being able to join any other organizations." + "message": "Restringir que membros entrem em outras organizações." }, "singleOrgBlockCreateMessage": { "message": "Your current organization has a policy that does not allow you to join more than one organization. Please contact your organization admins or sign up from a different Bitwarden account." @@ -3579,13 +3597,13 @@ "message": "Autenticação de acesso único" }, "requireSsoPolicyDesc": { - "message": "Require users to log in with the Enterprise Single Sign-On method." + "message": "Require members to log in with the Enterprise Single Sign-On method." }, "prerequisite": { "message": "Pré-requisito" }, "requireSsoPolicyReq": { - "message": "The Single Organization enterprise policy must be enabled before activating this policy." + "message": "The Single Organization enterprise policy must be turned on before activating this policy." }, "requireSsoPolicyReqError": { "message": "Política da Organização Única não ativada." @@ -3780,7 +3798,7 @@ "message": "Pode ver todos os itens no seu próprio cofre." }, "takeover": { - "message": "Takeover" + "message": "Controlo" }, "takeoverDesc": { "message": "Pode redefinir a sua conta com uma nova senha mestra." @@ -3883,7 +3901,7 @@ "message": "Propriedade pessoal" }, "personalOwnershipPolicyDesc": { - "message": "Require users to save vault items to an organization by removing the personal ownership option." + "message": "Require members to save items to an organization by removing the individual vault option." }, "personalOwnershipExemption": { "message": "Organization Owners and Administrators are exempt from this policy's enforcement." @@ -3895,7 +3913,7 @@ "message": "Desabilitar envio" }, "disableSendPolicyDesc": { - "message": "Do not allow users to create or edit a Bitwarden Send. Deleting an existing Send is still allowed.", + "message": "Do not allow members to create or edit sends.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "disableSendExemption": { @@ -3921,7 +3939,7 @@ "message": "Organization users that can manage the organization's policies are exempt from this policy's enforcement." }, "disableHideEmail": { - "message": "Do not allow users to hide their email address from recipients when creating or editing a Send.", + "message": "Always show member’s email address with recipients when creating or editing a send.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendOptionsPolicyInEffect": { @@ -3941,7 +3959,7 @@ } }, "planPrice": { - "message": "Plan price" + "message": "Preço do planoplanejado" }, "estimatedTax": { "message": "Imposto estimado" @@ -4019,14 +4037,14 @@ "message": "An organization policy has disabled importing items into your personal vault." }, "personalOwnershipCheckboxDesc": { - "message": "Disable personal ownership for organization users" + "message": "Desativar direito de propriedade para utilizadores da organização" }, "textHiddenByDefault": { - "message": "When accessing the Send, hide the text by default", + "message": "Ao aceder ao Envio, ocultar o texto por padrão", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendNameDesc": { - "message": "A friendly name to describe this Send.", + "message": "Um nome amigável para descrever este Envio.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendTextDesc": { @@ -4220,7 +4238,7 @@ "message": "Redefinir Senha Mestra" }, "resetPasswordPolicyDescription": { - "message": "Allow administrators in the organization to reset organization users' master password." + "message": "Allow admins to reset master passwords for members." }, "resetPasswordPolicyWarning": { "message": "Users in the organization will need to self-enroll or be auto-enrolled before administrators can reset their master password." @@ -4467,7 +4485,7 @@ "message": "Expiração do cofre" }, "maximumVaultTimeoutDesc": { - "message": "Configure a maximum vault timeout for all users." + "message": "Set a maximum vault timeout for members." }, "maximumVaultTimeoutLabel": { "message": "Maximum Vault Timeout" @@ -4507,10 +4525,10 @@ "message": "Tempo limite do cofre não está dentro do intervalo permitido." }, "disablePersonalVaultExport": { - "message": "Disable Personal Vault Export" + "message": "Remove individual vault export" }, "disablePersonalVaultExportDesc": { - "message": "Prohibits users from exporting their private vault data." + "message": "Do not allow members to export their individual vault data." }, "vaultExportDisabled": { "message": "Exportação de cofre desabilitada" @@ -4801,19 +4819,19 @@ "message": "Once set up, your configuration will be saved and members will be able to authenticate using their Identity Provider credentials." }, "ssoPolicyHelpStart": { - "message": "Enable the", - "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Enable the SSO Authentication policy to require all members to log in with SSO.'" + "message": "Use the", + "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Use the require single-sign-on authentication policy to require all members to log in with SSO.'" }, "ssoPolicyHelpLink": { - "message": "SSO Authentication policy", - "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Enable the SSO Authentication policy to require all members to log in with SSO.'" + "message": "require single-sign-on authentication policy", + "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Use the require single-sign-on authentication policy to require all members to log in with SSO.'" }, "ssoPolicyHelpEnd": { "message": "to require all members to log in with SSO.", - "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Enable the SSO Authentication policy to require all members to log in with SSO.'" + "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Use the require single-sign-on authentication policy to require all members to log in with SSO.'" }, "ssoPolicyHelpKeyConnector": { - "message": "SSO Authentication and Single Organization policies are required to set up Key Connector decryption." + "message": "The require SSO authentication and single organization policies are required to set up Key Connector decryption." }, "memberDecryptionOption": { "message": "Member Decryption Options" @@ -5165,5 +5183,35 @@ "example": "My Email" } } + }, + "inputRequired": { + "message": "Entrada necessária." + }, + "inputEmail": { + "message": "A entrada não é um endereço de e-mail." + }, + "inputMinLength": { + "message": "A entrada deve ter pelo menos $COUNT$ caracteres.", + "placeholders": { + "count": { + "content": "$1", + "example": "8" + } + } + }, + "fieldsNeedAttention": { + "message": "$COUNT$ campos(s) acima precisam da sua atenção.", + "placeholders": { + "count": { + "content": "$1", + "example": "4" + } + } + }, + "turnOn": { + "message": "Ativar" + }, + "on": { + "message": "Ligado" } } diff --git a/apps/web/src/locales/ro/messages.json b/apps/web/src/locales/ro/messages.json index 41603080ef2..c4b5257b4d8 100644 --- a/apps/web/src/locales/ro/messages.json +++ b/apps/web/src/locales/ro/messages.json @@ -572,6 +572,9 @@ "createAccount": { "message": "Creare cont" }, + "startTrial": { + "message": "Începeți o încercare" + }, "logIn": { "message": "Conectare" }, @@ -593,6 +596,9 @@ "masterPassDesc": { "message": "Parola principală este parola pe care o utilizați pentru a vă accesa seiful. Este foarte important să nu uitați această parolă. Nu există nicio modalitate de a recupera parola în cazul în care ați uitat-o." }, + "masterPassImportant": { + "message": "Parolele principale nu pot fi recuperate dacă le uitați!" + }, "masterPassHintDesc": { "message": "Un indiciu pentru parola principală vă poate ajuta să v-o reamintiți dacă o uitați." }, @@ -623,11 +629,14 @@ "invalidEmail": { "message": "Adresă de e-mail greșită." }, - "masterPassRequired": { - "message": "Este necesară parola principală." + "masterPasswordRequired": { + "message": "Este necesară o parolă principală." }, - "masterPassLength": { - "message": "Parola principală trebuie să conțină minimum 8 caractere." + "confirmMasterPasswordRequired": { + "message": "Este necesară rescrierea parolei principale." + }, + "masterPasswordMinLength": { + "message": "Parola principală trebuie să aibă cel puțin 8 caractere." }, "masterPassDoesntMatch": { "message": "Parola principală și confirmarea ei nu coincid!" @@ -882,7 +891,7 @@ "message": "Datele seifului dvs. au fost exportate." }, "passwordGenerator": { - "message": "Generator de parole" + "message": "Generator de parolă" }, "minComplexityScore": { "message": "Scor minim de complexitate" @@ -1067,7 +1076,7 @@ "message": "Ștergere cont" }, "deleteAccountDesc": { - "message": "Continuați în modul indicat mai jos pentru a vă șterge contul și toate datele asociate." + "message": "Procedați mai jos pentru a vă șterge contul și toate datele din seif." }, "deleteAccountWarning": { "message": "Ștergerea contului dvs. este definitivă. Nu poate fi anulată." @@ -1076,7 +1085,7 @@ "message": "Contul a fost șters" }, "accountDeletedDesc": { - "message": "Contul dvs. a fost închis și toate datele asociate au fost șterse." + "message": "Contul dvs. Bitwarden și datele din seif au fost șterse definitiv." }, "myAccount": { "message": "Contul meu" @@ -1214,7 +1223,7 @@ "message": "Domenii s-au actualizat" }, "twoStepLogin": { - "message": "Autentificare în două etape" + "message": "Autentificare în doi pași" }, "twoStepLoginDesc": { "message": "Vă securizează contul solicitând un pas suplimentar la conectare." @@ -3159,7 +3168,7 @@ "acceptPolicies": { "message": "Dacă bifați această casetă sunteți de acord cu următoarele:" }, - "acceptPoliciesError": { + "acceptPoliciesRequired": { "message": "Termeni de utilizare și Politica de confidențialitate nu au fost recunoscute." }, "termsOfService": { @@ -3175,7 +3184,7 @@ "message": "Timp de expirare seif" }, "vaultTimeoutDesc": { - "message": "Alegeți când se va efectua acțiunea selectată la expirarea seifului." + "message": "Alegeți când seiful dvs. va efectua acțiunea de expirare a seifului." }, "oneMinute": { "message": "1 minut" @@ -3209,6 +3218,9 @@ "organizationIsDisabled": { "message": "Organizația este dezactivată." }, + "disabledOrganizationFilterError": { + "message": "Articolele din Organizațiile dezactivate nu pot fi accesate. Contactați proprietarul Organizației pentru asistență." + }, "licenseIsExpired": { "message": "Licența a expirat." }, @@ -3333,20 +3345,26 @@ "clone": { "message": "Clonare" }, + "masterPassPolicyTitle": { + "message": "Cerințe privind parola principală" + }, "masterPassPolicyDesc": { - "message": "Setează cerințele minime pentru puterea parolei principale." + "message": "Setați cerințele pentru puterea parolei principale." + }, + "twoStepLoginPolicyTitle": { + "message": "Necesită autentificare în doi pași" }, "twoStepLoginPolicyDesc": { - "message": "Solicită utilizatorilor să configureze conectarea în două etape pentru conturile lor personale." + "message": "Cereți membrilor să seteze o autentificare în doi pași." }, "twoStepLoginPolicyWarning": { - "message": "Membrii organizației care nu sunt Proprietari sau Administratori și nu au activată conectarea în două etape în contul lor personal vor fi eliminați din organizație și vor primi o notificare prin e-mail cu privire la modificare." + "message": "Membrii organizației care nu sunt Proprietari sau Administratori și care nu au activată autentificarea în doi pași pentru contul lor vor fi eliminați din organizație și vor primi un e-mail prin care vor fi anunțați despre această schimbare." }, "twoStepLoginPolicyUserWarning": { "message": "Sunteți membrul unei organizații care necesită conectarea în două etape activată în contul dvs. de utilizator. Dacă dezactivați toți furnizorii de conectare în două etape, veți fi eliminat automat din aceste organizații." }, "passwordGeneratorPolicyDesc": { - "message": "Setează cerințele minime pentru configurarea generatorului de parole." + "message": "Setați cerințele pentru generatorul de parole." }, "passwordGeneratorPolicyInEffect": { "message": "Una sau mai multe politici organizaționale vă afectează setările generatorului." @@ -3564,10 +3582,10 @@ "message": "Conectare SSO" }, "singleOrg": { - "message": "Organizație Unică" + "message": "Organizație unică" }, "singleOrgDesc": { - "message": "Restricționează utilizatorii să se alăture oricărei alte organizații." + "message": "Interzice membrilor să se alăture altor organizații." }, "singleOrgBlockCreateMessage": { "message": "Organizația dvs. actuală are o politică care nu vă permite să vă alăturați la mai mult de o organizație. Vă rugăm să contactați administratorii organizației sau să vă înscrieți dintr-un cont Bitwarden diferit." @@ -3576,7 +3594,7 @@ "message": "Membrii organizației care nu sunt proprietari sau administratori și sunt deja membri ai unei alte organizații vor fi eliminați din organizația dvs." }, "requireSso": { - "message": "Autentificare Single Sign-On" + "message": "Solicitați autentificarea cu autentificare unică" }, "requireSsoPolicyDesc": { "message": "Solicită utilizatorilor să se conecteze cu metoda Conectare unică organizație (SSO)." @@ -3585,7 +3603,7 @@ "message": "Condiție prealabilă" }, "requireSsoPolicyReq": { - "message": "Înainte de activarea acestei politici, trebuie activată metoda de conectare \"Single sign-on\" pentru organizație (SSO)." + "message": "Înainte de a activa această politică, trebuie activată politica de întreprindere Organizație unică." }, "requireSsoPolicyReqError": { "message": "Politica Organizație Unică nu este activată." @@ -3880,10 +3898,10 @@ } }, "personalOwnership": { - "message": "Proprietate personală" + "message": "Înlăturați seiful personal" }, "personalOwnershipPolicyDesc": { - "message": "Solicită utilizatorilor să salveze articolele din seif într-o organizație prin eliminarea opțiunii de proprietate personală." + "message": "Solicitați membrilor să salveze elementele seifului într-o organizație prin eliminarea opțiunii de seif personal." }, "personalOwnershipExemption": { "message": "Proprietarii și administratorii organizației sunt exceptați de la aplicarea acestei politici." @@ -3892,10 +3910,10 @@ "message": "Datorită unei politici pentru întreprinderi, vă este restricționată salvarea de articole în seiful dvs. personal. Schimbați opțiunea de proprietate la o organizație și alegeți dintre colecțiile disponibile." }, "disableSend": { - "message": "Dezactivare Send" + "message": "Înlăturare Send" }, "disableSendPolicyDesc": { - "message": "Nu permiteți utilizatorilor să creeze sau să editeze un Send Bitwarden. Ștergerea unui Send existent este încă permisă.", + "message": "Nu permiteți membrilor să creeze sau să editeze send-uri.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "disableSendExemption": { @@ -3921,7 +3939,7 @@ "message": "Utilizatorii organizației care pot gestiona politicile organizației sunt exceptați de la aplicarea acestei politici." }, "disableHideEmail": { - "message": "Nu permiteți utilizatorilor să-și ascundă adresa de e-mail de la destinatari, atunci când creează sau editează un Send.", + "message": "Afișați întotdeauna adresa de e-mail a membrului cu destinatarii atunci când creați sau editați un send.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendOptionsPolicyInEffect": { @@ -4217,10 +4235,10 @@ "message": "Înscrierea va permite administratorilor organizației să vă schimbe parola principală" }, "resetPasswordPolicy": { - "message": "Resetare parolă principală" + "message": "Resetarea parolei principale" }, "resetPasswordPolicyDescription": { - "message": "Permite administratorilor din organizație să reseteze parola principală a utilizatorilor organizației." + "message": "Permiteți administratorilor să reseteze parolele principale ale membrilor." }, "resetPasswordPolicyWarning": { "message": "Utilizatorii din organizație vor trebui să se înregistreze singuri sau, să fie înregistrați automat, înainte ca administratorii să le poată reseta parola principală." @@ -4464,10 +4482,10 @@ "message": "Parola dvs. principală nu îndeplinește cerințele politicii acestei organizații. Pentru a vă alătura organizației, trebuie să vă actualizați acum parola principală. Continuarea vă va deconecta de la sesiunea curentă, fiind necesar să vă autentificați din nou. Sesiunile active pe alte dispozitive pot continua să rămână active timp de până la o oră." }, "maximumVaultTimeout": { - "message": "Expirare seif" + "message": "Timp de expirare seif" }, "maximumVaultTimeoutDesc": { - "message": "Configurează timpul maxim de expirare a seifului pentru toți utilizatorii." + "message": "Setează un timp de expirare maxim a seifului pentru membri." }, "maximumVaultTimeoutLabel": { "message": "Timp maxim de expirare a seifului" @@ -4498,7 +4516,7 @@ "message": "Expirare seif personalizată" }, "vaultTimeoutToLarge": { - "message": "Timpul de expirare a seifului depășește restricția stabilită de organizația dvs." + "message": "Timpul de expirare al seifului depășește restricția stabilită de organizația dvs." }, "vaultCustomTimeoutMinimum": { "message": "Durata minimă de expirare personalizată este de 1 minut." @@ -4507,10 +4525,10 @@ "message": "Expirarea seifului nu se încadrează în intervalul permis." }, "disablePersonalVaultExport": { - "message": "Dezactivare a exportului seifului personal" + "message": "Înlăturați exportul de seif individual" }, "disablePersonalVaultExportDesc": { - "message": "Interzice utilizatorilor să exporte datele private ale seifului lor." + "message": "Nu permite membrilor să-și exporte datele individuale din seif." }, "vaultExportDisabled": { "message": "Export de seif dezactivat" @@ -4801,19 +4819,19 @@ "message": "Odată configurată, configurația dvs. va fi salvată, iar membrii vor putea să se autentifice folosind acreditările furnizorului lor de identitate." }, "ssoPolicyHelpStart": { - "message": "Activează", - "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Enable the SSO Authentication policy to require all members to log in with SSO.'" + "message": "Utilizați", + "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Use the require single-sign-on authentication policy to require all members to log in with SSO.'" }, "ssoPolicyHelpLink": { - "message": "Politica de autentificare SSO", - "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Enable the SSO Authentication policy to require all members to log in with SSO.'" + "message": "politica de autentificare unică", + "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Use the require single-sign-on authentication policy to require all members to log in with SSO.'" }, "ssoPolicyHelpEnd": { "message": "pentru a solicita tuturor membrilor să se conecteze cu SSO.", - "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Enable the SSO Authentication policy to require all members to log in with SSO.'" + "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Use the require single-sign-on authentication policy to require all members to log in with SSO.'" }, "ssoPolicyHelpKeyConnector": { - "message": "Autentificarea SSO și politicile Organizației Unice sunt necesare pentru a configura decriptarea cu Conectorul Cheie." + "message": "Pentru a configura decriptarea Conectorul Cheie este necesară atât autentificarea SSO, cât și politicile de organizație unică." }, "memberDecryptionOption": { "message": "Opțiuni de decriptare ale membrilor" @@ -5165,5 +5183,35 @@ "example": "My Email" } } + }, + "inputRequired": { + "message": "Este necesară o intrare." + }, + "inputEmail": { + "message": "Intrarea nu este o adresă de e-mail." + }, + "inputMinLength": { + "message": "Intrarea trebuie să aibă o lungime de cel puțin $COUNT$ caractere.", + "placeholders": { + "count": { + "content": "$1", + "example": "8" + } + } + }, + "fieldsNeedAttention": { + "message": "$COUNT$ câmp/câmpuri de mai sus necesită atenția dumneavoastră.", + "placeholders": { + "count": { + "content": "$1", + "example": "4" + } + } + }, + "turnOn": { + "message": "Pornire" + }, + "on": { + "message": "Pornit" } } diff --git a/apps/web/src/locales/ru/messages.json b/apps/web/src/locales/ru/messages.json index 6dba7fdde01..9b82549f6d5 100644 --- a/apps/web/src/locales/ru/messages.json +++ b/apps/web/src/locales/ru/messages.json @@ -572,6 +572,9 @@ "createAccount": { "message": "Создать аккаунт" }, + "startTrial": { + "message": "Начать пробный период" + }, "logIn": { "message": "Войти" }, @@ -593,6 +596,9 @@ "masterPassDesc": { "message": "Мастер-пароль – это ключ к вашему защищенному хранилищу. Он очень важен, поэтому не забывайте его. Восстановить мастер-пароль невозможно." }, + "masterPassImportant": { + "message": "Мастер-пароли невозможно восстановить, если вы их забудете!" + }, "masterPassHintDesc": { "message": "Подсказка к мастер-паролю может помочь вам его вспомнить." }, @@ -623,10 +629,13 @@ "invalidEmail": { "message": "Неверный адрес email." }, - "masterPassRequired": { + "masterPasswordRequired": { "message": "Требуется мастер-пароль." }, - "masterPassLength": { + "confirmMasterPasswordRequired": { + "message": "Необходимо повторно ввести мастер-пароль." + }, + "masterPasswordMinLength": { "message": "Мастер-пароль должен содержать не менее 8 символов." }, "masterPassDoesntMatch": { @@ -1067,7 +1076,7 @@ "message": "Удалить аккаунт" }, "deleteAccountDesc": { - "message": "Чтобы удалить учетную запись и все связанные с ней данные, выполните действие ниже." + "message": "Чтобы удалить свой аккаунт и все данные хранилища, выполните следующие действия." }, "deleteAccountWarning": { "message": "Удаление вашей учетной записи необратимо. Его нельзя отменить." @@ -1076,7 +1085,7 @@ "message": "Аккаунт удален" }, "accountDeletedDesc": { - "message": "Ваша учетная запись была закрыта и все связанные с ней данные были удалены." + "message": "Ваш аккаунт Bitwarden и данные хранилища были удалены навсегда." }, "myAccount": { "message": "Мой аккаунт" @@ -3159,7 +3168,7 @@ "acceptPolicies": { "message": "Отметив этот флажок, вы соглашаетесь со следующим:" }, - "acceptPoliciesError": { + "acceptPoliciesRequired": { "message": "Условия предоставления услуг и Политика конфиденциальности не были подтверждены." }, "termsOfService": { @@ -3209,6 +3218,9 @@ "organizationIsDisabled": { "message": "Организация отключена." }, + "disabledOrganizationFilterError": { + "message": "Доступ к элементам в отключенных организациях невозможен. Обратитесь за помощью к владельцу организации." + }, "licenseIsExpired": { "message": "Срок действия лицензии истек." }, @@ -3333,20 +3345,26 @@ "clone": { "message": "Клонировать" }, + "masterPassPolicyTitle": { + "message": "Требования к мастер-паролю" + }, "masterPassPolicyDesc": { - "message": "Установите минимальные требования к надежности мастер-пароля." + "message": "Установите требования к надежности мастер-пароля." + }, + "twoStepLoginPolicyTitle": { + "message": "Требуется двухфакторная аутентификация" }, "twoStepLoginPolicyDesc": { - "message": "Требовать от пользователей настройки двухэтапной авторизации в их персональных учетных записях." + "message": "Требовать от пользователей настройки двухфакторной аутентификации." }, "twoStepLoginPolicyWarning": { - "message": "Члены организации, у которых в личном аккаунте отключена двухфакторная аутентификация, будут удалены из организации и получат об этом уведомление по email." + "message": "Члены организации, которые не являются владельцами или администраторами и не включили двухфакторную авторизацию в своем аккаунте, будут удалены из организации и получат об этом уведомление по email." }, "twoStepLoginPolicyUserWarning": { "message": "Вы участник организации, которая требует, чтобы в вашем аккаунте была включена двухфакторная аутентификация. Если вы отключите всех провайдеров двухфакторной аутентификации, то будете автоматически удалены из этих организаций." }, "passwordGeneratorPolicyDesc": { - "message": "Установите минимальные требования к конфигурации генератора паролей." + "message": "Установить требования к генератору паролей." }, "passwordGeneratorPolicyInEffect": { "message": "На настройки генератора влияют одна или несколько политик организации." @@ -3576,16 +3594,16 @@ "message": "Члены организации, которые не являются владельцами или администраторами и уже входят в другую организацию, будут удалены из вашей организации." }, "requireSso": { - "message": "Авторизация через единый вход (SSO)" + "message": "Требовать авторизацию через единый вход (SSO)" }, "requireSsoPolicyDesc": { - "message": "Требовать от пользователей авторизацию с помощью единого корпоративного входа." + "message": "Требовать от пользователей авторизацию через единый вход (SSO)." }, "prerequisite": { "message": "Обязательное условие" }, "requireSsoPolicyReq": { - "message": "Перед активацией этой политики необходимо активировать корпоративную политику 'Одна организация'." + "message": "Перед активацией этой политики необходимо включить политику Единого входа (SSO)." }, "requireSsoPolicyReqError": { "message": "Не включена политика 'Одна организация'." @@ -3880,10 +3898,10 @@ } }, "personalOwnership": { - "message": "Личное владение" + "message": "Удалить личное хранилище" }, "personalOwnershipPolicyDesc": { - "message": "Требовать от пользователей сохранения элементов хранилища в организации, удалив опцию личного владения." + "message": "Требовать от пользователей сохранять элементы в организации, удалив опцию личного хранилища." }, "personalOwnershipExemption": { "message": "Владельцы и администраторы организации не подпадают под действие этой политики." @@ -3895,7 +3913,7 @@ "message": "Отключить Send" }, "disableSendPolicyDesc": { - "message": "Не разрешать пользователям создавать или редактировать Bitwarden Send. Удаление существующей Send по-прежнему разрешено.", + "message": "Не разрешать пользователям создавать или редактировать Bitwarden Send.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "disableSendExemption": { @@ -3910,7 +3928,7 @@ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendOptions": { - "message": "Настройки Send", + "message": "Параметры Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendOptionsPolicyDesc": { @@ -3921,7 +3939,7 @@ "message": "Политики не распространяются на пользователей организации, которые могут ими управлять." }, "disableHideEmail": { - "message": "Запретить пользователям скрывать свой адрес email от получателей при создании или редактировании Send.", + "message": "Всегда показывать email пользователя получателям при создании или редактировании Send.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendOptionsPolicyInEffect": { @@ -4220,7 +4238,7 @@ "message": "Сброс мастер-пароля" }, "resetPasswordPolicyDescription": { - "message": "Разрешить администраторам организации сбрасывать мастер-пароль пользователей организации." + "message": "Разрешить администраторам сбрасывать мастер-пароли пользователей." }, "resetPasswordPolicyWarning": { "message": "Пользователи организации должны зарегистрироваться самостоятельно или быть зарегистрированными автоматически, чтобы администраторы могли сбросить их мастер-пароль." @@ -4467,7 +4485,7 @@ "message": "Тайм-аут хранилища" }, "maximumVaultTimeoutDesc": { - "message": "Настроить максимальный тайм-аут хранилища для всех пользователей." + "message": "Установить максимальный тайм-аут хранилища для пользователей." }, "maximumVaultTimeoutLabel": { "message": "Максимальный тайм-аут хранилища" @@ -4507,10 +4525,10 @@ "message": "Тайм-аут хранилища находится за пределами допустимого диапазона." }, "disablePersonalVaultExport": { - "message": "Отключить экспорт личного хранилища" + "message": "Удалить экспорт личного хранилища" }, "disablePersonalVaultExportDesc": { - "message": "Запрещает пользователям экспортировать данные своего личного хранилища." + "message": "Не разрешать пользователям экспортировать данные своего личного хранилища." }, "vaultExportDisabled": { "message": "Экспорт хранилища отключен" @@ -4801,19 +4819,19 @@ "message": "После настройки ваша конфигурация будет сохранена, и пользователи смогут проходить аутентификацию, используя свои учетные данные Провайдера идентификации." }, "ssoPolicyHelpStart": { - "message": "Активировать", - "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Enable the SSO Authentication policy to require all members to log in with SSO.'" + "message": "Использовать", + "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Use the require single-sign-on authentication policy to require all members to log in with SSO.'" }, "ssoPolicyHelpLink": { - "message": "Политика аутентификации SSO", - "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Enable the SSO Authentication policy to require all members to log in with SSO.'" + "message": "требуемую политику аутентификации с единым входом", + "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Use the require single-sign-on authentication policy to require all members to log in with SSO.'" }, "ssoPolicyHelpEnd": { "message": "для обеспечения авторизации всех членов при помощи единого входа.", - "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Enable the SSO Authentication policy to require all members to log in with SSO.'" + "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Use the require single-sign-on authentication policy to require all members to log in with SSO.'" }, "ssoPolicyHelpKeyConnector": { - "message": "Для настройки расшифровки соединителя ключей требуются политики проверки подлинности SSO и единой организации." + "message": "Для настройки расшифровки соединителя ключей требуются политики аутентификации SSO и единой организации." }, "memberDecryptionOption": { "message": "Параметры расшифровки членов" @@ -5165,5 +5183,35 @@ "example": "My Email" } } + }, + "inputRequired": { + "message": "Необходимо ввести данные." + }, + "inputEmail": { + "message": "Введенные данные не являются адресом email." + }, + "inputMinLength": { + "message": "Вводимые данные должны содержать не менее $COUNT$ символов.", + "placeholders": { + "count": { + "content": "$1", + "example": "8" + } + } + }, + "fieldsNeedAttention": { + "message": "$COUNT$ поля(ей) выше требуют вашего внимания.", + "placeholders": { + "count": { + "content": "$1", + "example": "4" + } + } + }, + "turnOn": { + "message": "Включить" + }, + "on": { + "message": "Вкл." } } diff --git a/apps/web/src/locales/si/messages.json b/apps/web/src/locales/si/messages.json index c92172b87ef..b8248a5579e 100644 --- a/apps/web/src/locales/si/messages.json +++ b/apps/web/src/locales/si/messages.json @@ -572,6 +572,9 @@ "createAccount": { "message": "ගිණුමක් සාදන්න" }, + "startTrial": { + "message": "Start Trial" + }, "logIn": { "message": "පිවිසෙන්න" }, @@ -593,6 +596,9 @@ "masterPassDesc": { "message": "The master password is the password you use to access your vault. It is very important that you do not forget your master password. There is no way to recover the password in the event that you forget it." }, + "masterPassImportant": { + "message": "Master passwords cannot be recovered if you forget it!" + }, "masterPassHintDesc": { "message": "A master password hint can help you remember your password if you forget it." }, @@ -623,10 +629,13 @@ "invalidEmail": { "message": "Invalid email address." }, - "masterPassRequired": { + "masterPasswordRequired": { "message": "Master password is required." }, - "masterPassLength": { + "confirmMasterPasswordRequired": { + "message": "Master password retype is required." + }, + "masterPasswordMinLength": { "message": "Master password must be at least 8 characters long." }, "masterPassDoesntMatch": { @@ -882,7 +891,7 @@ "message": "Your vault data has been exported." }, "passwordGenerator": { - "message": "Password Generator" + "message": "Password generator" }, "minComplexityScore": { "message": "Minimum Complexity Score" @@ -1067,7 +1076,7 @@ "message": "Delete Account" }, "deleteAccountDesc": { - "message": "Proceed below to delete your account and all associated data." + "message": "Proceed below to delete your account and all vault data." }, "deleteAccountWarning": { "message": "Deleting your account is permanent. It cannot be undone." @@ -1076,7 +1085,7 @@ "message": "Account Deleted" }, "accountDeletedDesc": { - "message": "Your account has been closed and all associated data has been deleted." + "message": "Your Bitwarden account and vault data were permanently deleted." }, "myAccount": { "message": "My Account" @@ -1214,7 +1223,7 @@ "message": "Domains updated" }, "twoStepLogin": { - "message": "Two-step Login" + "message": "Two-step login" }, "twoStepLoginDesc": { "message": "Secure your account by requiring an additional step when logging in." @@ -3159,7 +3168,7 @@ "acceptPolicies": { "message": "By checking this box you agree to the following:" }, - "acceptPoliciesError": { + "acceptPoliciesRequired": { "message": "Terms of Service and Privacy Policy have not been acknowledged." }, "termsOfService": { @@ -3209,6 +3218,9 @@ "organizationIsDisabled": { "message": "Organization is disabled." }, + "disabledOrganizationFilterError": { + "message": "Items in disabled Organizations cannot be accessed. Contact your Organization owner for assistance." + }, "licenseIsExpired": { "message": "License is expired." }, @@ -3333,20 +3345,26 @@ "clone": { "message": "Clone" }, + "masterPassPolicyTitle": { + "message": "Master password requirements" + }, "masterPassPolicyDesc": { - "message": "Set minimum requirements for master password strength." + "message": "Set requirements for master password strength." + }, + "twoStepLoginPolicyTitle": { + "message": "Require two-step login" }, "twoStepLoginPolicyDesc": { - "message": "Require users to set up two-step login on their personal accounts." + "message": "Require members to set up two-step login." }, "twoStepLoginPolicyWarning": { - "message": "Organization members who are not Owners or Administrators and do not have two-step login enabled for their personal account will be removed from the organization and will receive an email notifying them about the change." + "message": "Organization members who are not Owners or Administrators and do not have two-step login turned on for their account will be removed from the organization and will receive an email notifying them about the change." }, "twoStepLoginPolicyUserWarning": { "message": "You are a member of an organization that requires two-step login to be enabled on your user account. If you disable all two-step login providers you will be automatically removed from these organizations." }, "passwordGeneratorPolicyDesc": { - "message": "Set minimum requirements for password generator configuration." + "message": "Set requirements for password generator." }, "passwordGeneratorPolicyInEffect": { "message": "One or more organization policies are affecting your generator settings." @@ -3564,10 +3582,10 @@ "message": "Link SSO" }, "singleOrg": { - "message": "Single Organization" + "message": "Single organization" }, "singleOrgDesc": { - "message": "Restrict users from being able to join any other organizations." + "message": "Restrict members from joining other organizations." }, "singleOrgBlockCreateMessage": { "message": "Your current organization has a policy that does not allow you to join more than one organization. Please contact your organization admins or sign up from a different Bitwarden account." @@ -3576,16 +3594,16 @@ "message": "Organization members who are not Owners or Administrators and are already a member of another organization will be removed from your organization." }, "requireSso": { - "message": "Single Sign-On Authentication" + "message": "Require single sign-on authentication" }, "requireSsoPolicyDesc": { - "message": "Require users to log in with the Enterprise Single Sign-On method." + "message": "Require members to log in with the Enterprise Single Sign-On method." }, "prerequisite": { "message": "Prerequisite" }, "requireSsoPolicyReq": { - "message": "The Single Organization enterprise policy must be enabled before activating this policy." + "message": "The Single Organization enterprise policy must be turned on before activating this policy." }, "requireSsoPolicyReqError": { "message": "Single Organization policy not enabled." @@ -3880,10 +3898,10 @@ } }, "personalOwnership": { - "message": "Personal Ownership" + "message": "Remove individual vault" }, "personalOwnershipPolicyDesc": { - "message": "Require users to save vault items to an organization by removing the personal ownership option." + "message": "Require members to save items to an organization by removing the individual vault option." }, "personalOwnershipExemption": { "message": "Organization Owners and Administrators are exempt from this policy's enforcement." @@ -3892,10 +3910,10 @@ "message": "Due to an enterprise policy, you are restricted from saving items to your personal vault. Change the Ownership option to an organization and choose from available Collections." }, "disableSend": { - "message": "Disable Send" + "message": "Remove Send" }, "disableSendPolicyDesc": { - "message": "Do not allow users to create or edit a Bitwarden Send. Deleting an existing Send is still allowed.", + "message": "Do not allow members to create or edit sends.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "disableSendExemption": { @@ -3910,7 +3928,7 @@ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendOptions": { - "message": "Send Options", + "message": "Send options", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendOptionsPolicyDesc": { @@ -3921,7 +3939,7 @@ "message": "Organization users that can manage the organization's policies are exempt from this policy's enforcement." }, "disableHideEmail": { - "message": "Do not allow users to hide their email address from recipients when creating or editing a Send.", + "message": "Always show member’s email address with recipients when creating or editing a send.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendOptionsPolicyInEffect": { @@ -4217,10 +4235,10 @@ "message": "Enrollment will allow organization administrators to change your master password" }, "resetPasswordPolicy": { - "message": "Master Password Reset" + "message": "Master password reset" }, "resetPasswordPolicyDescription": { - "message": "Allow administrators in the organization to reset organization users' master password." + "message": "Allow admins to reset master passwords for members." }, "resetPasswordPolicyWarning": { "message": "Users in the organization will need to self-enroll or be auto-enrolled before administrators can reset their master password." @@ -4464,10 +4482,10 @@ "message": "Your Master Password does not meet the policy requirements of this organization. In order to join the organization, you must update your Master Password now. Proceeding will log you out of your current session, requiring you to log back in. Active sessions on other devices may continue to remain active for up to one hour." }, "maximumVaultTimeout": { - "message": "Vault Timeout" + "message": "Vault timeout" }, "maximumVaultTimeoutDesc": { - "message": "Configure a maximum vault timeout for all users." + "message": "Set a maximum vault timeout for members." }, "maximumVaultTimeoutLabel": { "message": "Maximum Vault Timeout" @@ -4507,10 +4525,10 @@ "message": "Vault Timeout is not within allowed range." }, "disablePersonalVaultExport": { - "message": "Disable Personal Vault Export" + "message": "Remove individual vault export" }, "disablePersonalVaultExportDesc": { - "message": "Prohibits users from exporting their private vault data." + "message": "Do not allow members to export their individual vault data." }, "vaultExportDisabled": { "message": "Vault Export Disabled" @@ -4801,19 +4819,19 @@ "message": "Once set up, your configuration will be saved and members will be able to authenticate using their Identity Provider credentials." }, "ssoPolicyHelpStart": { - "message": "Enable the", - "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Enable the SSO Authentication policy to require all members to log in with SSO.'" + "message": "Use the", + "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Use the require single-sign-on authentication policy to require all members to log in with SSO.'" }, "ssoPolicyHelpLink": { - "message": "SSO Authentication policy", - "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Enable the SSO Authentication policy to require all members to log in with SSO.'" + "message": "require single-sign-on authentication policy", + "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Use the require single-sign-on authentication policy to require all members to log in with SSO.'" }, "ssoPolicyHelpEnd": { "message": "to require all members to log in with SSO.", - "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Enable the SSO Authentication policy to require all members to log in with SSO.'" + "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Use the require single-sign-on authentication policy to require all members to log in with SSO.'" }, "ssoPolicyHelpKeyConnector": { - "message": "SSO Authentication and Single Organization policies are required to set up Key Connector decryption." + "message": "The require SSO authentication and single organization policies are required to set up Key Connector decryption." }, "memberDecryptionOption": { "message": "Member Decryption Options" @@ -5165,5 +5183,35 @@ "example": "My Email" } } + }, + "inputRequired": { + "message": "Input is required." + }, + "inputEmail": { + "message": "Input is not an email-address." + }, + "inputMinLength": { + "message": "Input must be at least $COUNT$ characters long.", + "placeholders": { + "count": { + "content": "$1", + "example": "8" + } + } + }, + "fieldsNeedAttention": { + "message": "$COUNT$ field(s) above need your attention.", + "placeholders": { + "count": { + "content": "$1", + "example": "4" + } + } + }, + "turnOn": { + "message": "Turn on" + }, + "on": { + "message": "On" } } diff --git a/apps/web/src/locales/sk/messages.json b/apps/web/src/locales/sk/messages.json index 7eb9dab56f5..0cb97b2a567 100644 --- a/apps/web/src/locales/sk/messages.json +++ b/apps/web/src/locales/sk/messages.json @@ -572,6 +572,9 @@ "createAccount": { "message": "Vytvoriť účet" }, + "startTrial": { + "message": "Začať skúšobné obdobie" + }, "logIn": { "message": "Prihlásiť sa" }, @@ -593,6 +596,9 @@ "masterPassDesc": { "message": "Hlavné heslo je heslo, ktoré použijete na prístup k svojmu trezoru. Je veľmi dôležité, aby ste svoje hlavné heslo nezabudli. Neexistuje možnosť, ako heslo obnoviť v prípade, že ho zabudnete." }, + "masterPassImportant": { + "message": "Hlavné heslo sa nedá obnoviť, ak ho zabudnete!" + }, "masterPassHintDesc": { "message": "Nápoveď k hlavnému heslu vám môže pomôcť spomenúť si na heslo, ak ho zabudnete." }, @@ -623,11 +629,14 @@ "invalidEmail": { "message": "Neplatná emailová adresa." }, - "masterPassRequired": { + "masterPasswordRequired": { "message": "Hlavné heslo je povinné." }, - "masterPassLength": { - "message": "Hlavné heslo musí obsahovať aspoň 8 znakov." + "confirmMasterPasswordRequired": { + "message": "Vyžaduje sa opätovné zadanie hlavného hesla." + }, + "masterPasswordMinLength": { + "message": "Hlavné heslo musí mať aspoň 8 znakov." }, "masterPassDoesntMatch": { "message": "Potvrdenie hlavného hesla sa nezhoduje." @@ -1076,7 +1085,7 @@ "message": "Účet bol odstránený" }, "accountDeletedDesc": { - "message": "Váš účet bol uzavretý a všetky súvisiace dáta vymazané." + "message": "Váš účet a dáta z trezora boli trvalo vymazané." }, "myAccount": { "message": "Môj účet" @@ -3159,7 +3168,7 @@ "acceptPolicies": { "message": "Označením tohto políčka súhlasíte s nasledovným:" }, - "acceptPoliciesError": { + "acceptPoliciesRequired": { "message": "Neboli akceptované Podmienky používania a zásady Ochrany osobných údajov." }, "termsOfService": { @@ -3209,6 +3218,9 @@ "organizationIsDisabled": { "message": "Organizácia je vypnutá." }, + "disabledOrganizationFilterError": { + "message": "K položkám vo vypnutej organizácii nie je možné pristupovať. Požiadajte o pomoc vlastníka organizácie." + }, "licenseIsExpired": { "message": "Licencia vypršala." }, @@ -3333,11 +3345,17 @@ "clone": { "message": "Klonovať" }, + "masterPassPolicyTitle": { + "message": "Požiadavky na hlavné heslo" + }, "masterPassPolicyDesc": { "message": "Nastavte minimálne požiadavky pre silu hlavného hesla." }, + "twoStepLoginPolicyTitle": { + "message": "Vyžadovať dvojstupňové prihlásenie" + }, "twoStepLoginPolicyDesc": { - "message": "Požadujte dvojstupňové prihlásenie pre osobné účty." + "message": "Vyžadujte dvojstupňové prihlásenie pre členov." }, "twoStepLoginPolicyWarning": { "message": "Členovia organizácie, ktorí nie su vlastníci alebo administratori a ktorí nemajú zapnuté dvojstupňové prihlásenie budú odstranení z organizácie a obdržia email s informáciou o tejto zmene." @@ -3576,7 +3594,7 @@ "message": "Členovia organizácie, ktorí nie sú vlastníkmi alebo administrátormi a už sú členmi inej organizácie, budú odstránení z vašej organizácie." }, "requireSso": { - "message": "Overovanie prostredníctvom jednotného prihlasovania (SSO)" + "message": "Požadovať overovanie prostredníctvom jednotného prihlasovania (SSO)" }, "requireSsoPolicyDesc": { "message": "Vyžadovať od používateľov prihlásenie prostredníctvom jednotného prihlasovania (SSO) spoločnosti." @@ -3880,10 +3898,10 @@ } }, "personalOwnership": { - "message": "Osobné vlastníctvo" + "message": "Zakázať osobný trezor" }, "personalOwnershipPolicyDesc": { - "message": "Požadovať, aby používatelia na uloženie položiek trezoru organizácie odstránili osobné vlastníctvo." + "message": "Požadovať, aby používatelia na uloženie položiek používali trezor organizácie odstránením možnosti uloženia v osobnom trezore." }, "personalOwnershipExemption": { "message": "Vlastníci a administrátori organizácie sú vyňatí z uplatnenia tohto pravidla." @@ -3895,7 +3913,7 @@ "message": "Zakázať Send" }, "disableSendPolicyDesc": { - "message": "Nedovoľte používateľom vytvárať alebo upravovať funkciu Bitwarden Send. Odstránenie existujúceho Send je stále povolené.", + "message": "Nedovoľte používateľom vytvárať alebo upravovať Bitwarden Send.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "disableSendExemption": { @@ -4802,18 +4820,18 @@ }, "ssoPolicyHelpStart": { "message": "Povoliť", - "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Enable the SSO Authentication policy to require all members to log in with SSO.'" + "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Use the require single-sign-on authentication policy to require all members to log in with SSO.'" }, "ssoPolicyHelpLink": { - "message": "SSO Authentication policy", - "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Enable the SSO Authentication policy to require all members to log in with SSO.'" + "message": "require single-sign-on authentication policy", + "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Use the require single-sign-on authentication policy to require all members to log in with SSO.'" }, "ssoPolicyHelpEnd": { "message": "to require all members to log in with SSO.", - "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Enable the SSO Authentication policy to require all members to log in with SSO.'" + "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Use the require single-sign-on authentication policy to require all members to log in with SSO.'" }, "ssoPolicyHelpKeyConnector": { - "message": "SSO Authentication and Single Organization policies are required to set up Key Connector decryption." + "message": "The require SSO authentication and single organization policies are required to set up Key Connector decryption." }, "memberDecryptionOption": { "message": "Member Decryption Options" @@ -5165,5 +5183,35 @@ "example": "My Email" } } + }, + "inputRequired": { + "message": "Vstup je povinný." + }, + "inputEmail": { + "message": "Vstupom nie je e-mailová adresa." + }, + "inputMinLength": { + "message": "Vstup musí mať aspoň $COUNT$ znakov.", + "placeholders": { + "count": { + "content": "$1", + "example": "8" + } + } + }, + "fieldsNeedAttention": { + "message": "Niektoré polia ($COUNT$) vyžadujú vašu pozornosť.", + "placeholders": { + "count": { + "content": "$1", + "example": "4" + } + } + }, + "turnOn": { + "message": "Zapnúť" + }, + "on": { + "message": "Zapnuté" } } diff --git a/apps/web/src/locales/sl/messages.json b/apps/web/src/locales/sl/messages.json index d69a433ac01..73a3679feb6 100644 --- a/apps/web/src/locales/sl/messages.json +++ b/apps/web/src/locales/sl/messages.json @@ -572,6 +572,9 @@ "createAccount": { "message": "Ustvari račun" }, + "startTrial": { + "message": "Start Trial" + }, "logIn": { "message": "Prijava" }, @@ -593,6 +596,9 @@ "masterPassDesc": { "message": "Glavno geslo je geslo, ki ga uporabljate za dostop do vašega trezorja. Zelo pomembno je, da ne pozabite vaše glavno geslo. Gesla ni mogoče obnoviti v primeru, če ga pozabite." }, + "masterPassImportant": { + "message": "Master passwords cannot be recovered if you forget it!" + }, "masterPassHintDesc": { "message": "Namig glavnega gesla vam lahko pomaga, da se spomnite vašega gesla, če ga pozabite." }, @@ -623,11 +629,14 @@ "invalidEmail": { "message": "Neveljaven e-poštni naslov." }, - "masterPassRequired": { - "message": "Glavno geslo je obvezno." + "masterPasswordRequired": { + "message": "Master password is required." }, - "masterPassLength": { - "message": "Glavno geslo mora biti dolgo najmanj 8 znakov." + "confirmMasterPasswordRequired": { + "message": "Master password retype is required." + }, + "masterPasswordMinLength": { + "message": "Master password must be at least 8 characters long." }, "masterPassDoesntMatch": { "message": "Potrditev glavnega gesla se ne ujema." @@ -1067,7 +1076,7 @@ "message": "Izbriši račun" }, "deleteAccountDesc": { - "message": "Proceed below to delete your account and all associated data." + "message": "Proceed below to delete your account and all vault data." }, "deleteAccountWarning": { "message": "Deleting your account is permanent. It cannot be undone." @@ -1076,7 +1085,7 @@ "message": "Account Deleted" }, "accountDeletedDesc": { - "message": "Your account has been closed and all associated data has been deleted." + "message": "Your Bitwarden account and vault data were permanently deleted." }, "myAccount": { "message": "Moj račun" @@ -3159,7 +3168,7 @@ "acceptPolicies": { "message": "By checking this box you agree to the following:" }, - "acceptPoliciesError": { + "acceptPoliciesRequired": { "message": "Terms of Service and Privacy Policy have not been acknowledged." }, "termsOfService": { @@ -3209,6 +3218,9 @@ "organizationIsDisabled": { "message": "Organization is disabled." }, + "disabledOrganizationFilterError": { + "message": "Items in disabled Organizations cannot be accessed. Contact your Organization owner for assistance." + }, "licenseIsExpired": { "message": "License is expired." }, @@ -3333,20 +3345,26 @@ "clone": { "message": "Clone" }, + "masterPassPolicyTitle": { + "message": "Master password requirements" + }, "masterPassPolicyDesc": { - "message": "Set minimum requirements for master password strength." + "message": "Set requirements for master password strength." + }, + "twoStepLoginPolicyTitle": { + "message": "Require two-step login" }, "twoStepLoginPolicyDesc": { - "message": "Require users to set up two-step login on their personal accounts." + "message": "Require members to set up two-step login." }, "twoStepLoginPolicyWarning": { - "message": "Organization members who are not Owners or Administrators and do not have two-step login enabled for their personal account will be removed from the organization and will receive an email notifying them about the change." + "message": "Organization members who are not Owners or Administrators and do not have two-step login turned on for their account will be removed from the organization and will receive an email notifying them about the change." }, "twoStepLoginPolicyUserWarning": { "message": "You are a member of an organization that requires two-step login to be enabled on your user account. If you disable all two-step login providers you will be automatically removed from these organizations." }, "passwordGeneratorPolicyDesc": { - "message": "Set minimum requirements for password generator configuration." + "message": "Set requirements for password generator." }, "passwordGeneratorPolicyInEffect": { "message": "One or more organization policies are affecting your generator settings." @@ -3564,10 +3582,10 @@ "message": "Link SSO" }, "singleOrg": { - "message": "Single Organization" + "message": "Single organization" }, "singleOrgDesc": { - "message": "Restrict users from being able to join any other organizations." + "message": "Restrict members from joining other organizations." }, "singleOrgBlockCreateMessage": { "message": "Your current organization has a policy that does not allow you to join more than one organization. Please contact your organization admins or sign up from a different Bitwarden account." @@ -3576,16 +3594,16 @@ "message": "Organization members who are not Owners or Administrators and are already a member of another organization will be removed from your organization." }, "requireSso": { - "message": "Single Sign-On Authentication" + "message": "Require single sign-on authentication" }, "requireSsoPolicyDesc": { - "message": "Require users to log in with the Enterprise Single Sign-On method." + "message": "Require members to log in with the Enterprise Single Sign-On method." }, "prerequisite": { "message": "Prerequisite" }, "requireSsoPolicyReq": { - "message": "The Single Organization enterprise policy must be enabled before activating this policy." + "message": "The Single Organization enterprise policy must be turned on before activating this policy." }, "requireSsoPolicyReqError": { "message": "Single Organization policy not enabled." @@ -3880,10 +3898,10 @@ } }, "personalOwnership": { - "message": "Personal Ownership" + "message": "Remove individual vault" }, "personalOwnershipPolicyDesc": { - "message": "Require users to save vault items to an organization by removing the personal ownership option." + "message": "Require members to save items to an organization by removing the individual vault option." }, "personalOwnershipExemption": { "message": "Organization Owners and Administrators are exempt from this policy's enforcement." @@ -3892,10 +3910,10 @@ "message": "Due to an enterprise policy, you are restricted from saving items to your personal vault. Change the Ownership option to an organization and choose from available Collections." }, "disableSend": { - "message": "Disable Send" + "message": "Remove Send" }, "disableSendPolicyDesc": { - "message": "Do not allow users to create or edit a Bitwarden Send. Deleting an existing Send is still allowed.", + "message": "Do not allow members to create or edit sends.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "disableSendExemption": { @@ -3910,7 +3928,7 @@ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendOptions": { - "message": "Send Options", + "message": "Send options", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendOptionsPolicyDesc": { @@ -3921,7 +3939,7 @@ "message": "Organization users that can manage the organization's policies are exempt from this policy's enforcement." }, "disableHideEmail": { - "message": "Do not allow users to hide their email address from recipients when creating or editing a Send.", + "message": "Always show member’s email address with recipients when creating or editing a send.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendOptionsPolicyInEffect": { @@ -4217,10 +4235,10 @@ "message": "Enrollment will allow organization administrators to change your master password" }, "resetPasswordPolicy": { - "message": "Master Password Reset" + "message": "Master password reset" }, "resetPasswordPolicyDescription": { - "message": "Allow administrators in the organization to reset organization users' master password." + "message": "Allow admins to reset master passwords for members." }, "resetPasswordPolicyWarning": { "message": "Users in the organization will need to self-enroll or be auto-enrolled before administrators can reset their master password." @@ -4464,10 +4482,10 @@ "message": "Your Master Password does not meet the policy requirements of this organization. In order to join the organization, you must update your Master Password now. Proceeding will log you out of your current session, requiring you to log back in. Active sessions on other devices may continue to remain active for up to one hour." }, "maximumVaultTimeout": { - "message": "Vault Timeout" + "message": "Vault timeout" }, "maximumVaultTimeoutDesc": { - "message": "Configure a maximum vault timeout for all users." + "message": "Set a maximum vault timeout for members." }, "maximumVaultTimeoutLabel": { "message": "Maximum Vault Timeout" @@ -4507,10 +4525,10 @@ "message": "Vault Timeout is not within allowed range." }, "disablePersonalVaultExport": { - "message": "Disable Personal Vault Export" + "message": "Remove individual vault export" }, "disablePersonalVaultExportDesc": { - "message": "Prohibits users from exporting their private vault data." + "message": "Do not allow members to export their individual vault data." }, "vaultExportDisabled": { "message": "Vault Export Disabled" @@ -4801,19 +4819,19 @@ "message": "Once set up, your configuration will be saved and members will be able to authenticate using their Identity Provider credentials." }, "ssoPolicyHelpStart": { - "message": "Enable the", - "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Enable the SSO Authentication policy to require all members to log in with SSO.'" + "message": "Use the", + "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Use the require single-sign-on authentication policy to require all members to log in with SSO.'" }, "ssoPolicyHelpLink": { - "message": "SSO Authentication policy", - "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Enable the SSO Authentication policy to require all members to log in with SSO.'" + "message": "require single-sign-on authentication policy", + "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Use the require single-sign-on authentication policy to require all members to log in with SSO.'" }, "ssoPolicyHelpEnd": { "message": "to require all members to log in with SSO.", - "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Enable the SSO Authentication policy to require all members to log in with SSO.'" + "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Use the require single-sign-on authentication policy to require all members to log in with SSO.'" }, "ssoPolicyHelpKeyConnector": { - "message": "SSO Authentication and Single Organization policies are required to set up Key Connector decryption." + "message": "The require SSO authentication and single organization policies are required to set up Key Connector decryption." }, "memberDecryptionOption": { "message": "Member Decryption Options" @@ -5165,5 +5183,35 @@ "example": "My Email" } } + }, + "inputRequired": { + "message": "Input is required." + }, + "inputEmail": { + "message": "Input is not an email-address." + }, + "inputMinLength": { + "message": "Input must be at least $COUNT$ characters long.", + "placeholders": { + "count": { + "content": "$1", + "example": "8" + } + } + }, + "fieldsNeedAttention": { + "message": "$COUNT$ field(s) above need your attention.", + "placeholders": { + "count": { + "content": "$1", + "example": "4" + } + } + }, + "turnOn": { + "message": "Turn on" + }, + "on": { + "message": "On" } } diff --git a/apps/web/src/locales/sr/messages.json b/apps/web/src/locales/sr/messages.json index ce5d110eb00..19224a49bf2 100644 --- a/apps/web/src/locales/sr/messages.json +++ b/apps/web/src/locales/sr/messages.json @@ -572,6 +572,9 @@ "createAccount": { "message": "Креирај налог" }, + "startTrial": { + "message": "Почетак пробе" + }, "logIn": { "message": "Пријавите се" }, @@ -593,6 +596,9 @@ "masterPassDesc": { "message": "Главна Лозинка је лозинка коју користите за приступ Вашем сефу. Врло је важно да је не заборавите. Не постоји начин да повратите лозинку у случају да је заборавите." }, + "masterPassImportant": { + "message": "Главне лозинке се не могу повратити ако их заборавите!" + }, "masterPassHintDesc": { "message": "Савет Главне Лозинке може да Вам помогне да се је потсетите ако је заборавите." }, @@ -623,11 +629,14 @@ "invalidEmail": { "message": "Неисправан имејл." }, - "masterPassRequired": { + "masterPasswordRequired": { "message": "Главна Лозинка је неопходна." }, - "masterPassLength": { - "message": "Главна Лозинка треба имати бар 8 знака." + "confirmMasterPasswordRequired": { + "message": "Поновно уписивање главне лозинке је неопходно." + }, + "masterPasswordMinLength": { + "message": "Главна лозинка мора да садржи барем 8 знакова." }, "masterPassDoesntMatch": { "message": "Потврђена Главна Лозинка се не подудара." @@ -1152,10 +1161,10 @@ "message": "Променити језик за Сеф." }, "enableFavicon": { - "message": "Show website icons" + "message": "Прикажи иконе сајтова" }, "faviconDesc": { - "message": "Show a recognizable image next to each login." + "message": "Прикажи препознатљиву слику поред сваке ставке за пријаву." }, "enableGravatars": { "message": "Омогући Gravatar", @@ -1239,7 +1248,7 @@ "message": "Омогућено" }, "activate": { - "message": "Activate" + "message": "Активирати" }, "premium": { "message": "Премијум", @@ -1267,7 +1276,7 @@ "message": "Онемогући" }, "deactivate": { - "message": "Deactivate" + "message": "Деактивирати" }, "twoStepLoginProviderEnabled": { "message": "Овај добављач услуге пријављивања у два корака је омогућен на вашем налогу." @@ -2233,10 +2242,10 @@ "message": "Да ли сте сигурни да желите да уклоните овог корисника?" }, "deactivateUserConfirmation": { - "message": "The member will no longer have access to the organization, but will still have access to their individual vault." + "message": "Члан више неће имати приступ организацији, али ће и даље имати приступ свом индивидуалном сефу." }, "activateUserConfirmation": { - "message": "Are you sure you want to activate this user, granting them access to the organization?" + "message": "Да ли сигурно желите да активирате овог корисника, дајући му приступ организацији?" }, "removeUserConfirmationKeyConnector": { "message": "Упозорење! Овај корисник захтева Key Connector да управља њиховом шифровањем. Уклањање овог корисника из ваше организације трајно ће онемогућити њихов рачун. Ова радња се не може поништити. Да ли желите да наставите?" @@ -2584,7 +2593,7 @@ } }, "deactivatedUserId": { - "message": "Deactivated user $ID$.", + "message": "Корисник $ID$ је деактивиран.", "placeholders": { "id": { "content": "$1", @@ -2593,7 +2602,7 @@ } }, "activatedUserId": { - "message": "Activated user $ID$.", + "message": "Корисник $ID$ је активиран.", "placeholders": { "id": { "content": "$1", @@ -2602,7 +2611,7 @@ } }, "deactivateUserId": { - "message": "Deactivate user $ID$?", + "message": "Деактивирати корисника $ID$?", "placeholders": { "id": { "content": "$1", @@ -2611,7 +2620,7 @@ } }, "activateUserId": { - "message": "Activate user $ID$?", + "message": "Активирати корисника $ID$?", "placeholders": { "id": { "content": "$1", @@ -3159,8 +3168,8 @@ "acceptPolicies": { "message": "Означавањем овог поља пристајете на следеће:" }, - "acceptPoliciesError": { - "message": "Услови услуге и Политика приватности нису признати." + "acceptPoliciesRequired": { + "message": "Услови услуге и Политика приватности нису прихваћени." }, "termsOfService": { "message": "Услови коришћења услуге" @@ -3209,6 +3218,9 @@ "organizationIsDisabled": { "message": "Организација је онемогућена." }, + "disabledOrganizationFilterError": { + "message": "Items in disabled Organizations cannot be accessed. Contact your Organization owner for assistance." + }, "licenseIsExpired": { "message": "Лиценца је истекла." }, @@ -3333,9 +3345,15 @@ "clone": { "message": "Клонирај" }, + "masterPassPolicyTitle": { + "message": "Захтеви за главну лозинку" + }, "masterPassPolicyDesc": { "message": "Поставите минималне захтеве за чврстоћу главне лозинке." }, + "twoStepLoginPolicyTitle": { + "message": "Потребна дво-степенска пријава" + }, "twoStepLoginPolicyDesc": { "message": "Захтевајте од корисника да поставе пријаву у два корака на своје личне налоге." }, @@ -3667,7 +3685,7 @@ "message": "Онемогућено" }, "deactivated": { - "message": "Deactivated" + "message": "Деактивирано" }, "sendLink": { "message": "УРЛ „Send“", @@ -4271,10 +4289,10 @@ "message": "Јесте ли сигурни да желите да уклоните следеће кориснике? Процес може потрајати неколико секунди да се заврши, и не може се прекинути или отказати." }, "deactivateUsersWarning": { - "message": "Are you sure you want to deactivate the following members? They will no longer have access to the organization, but will still have access to their individual vaults. The process may take a few seconds to complete and cannot be interrupted or canceled." + "message": "Да ли сте сигурни да желите да деактивирате следеће чланове? Они више неће имати приступ организацији, али ће и даље имати приступ својим појединачним сефовима. Процес може потрајати неколико секунди и не може се прекинути или отказати." }, "activateUsersWarning": { - "message": "Are you sure you want to activate the following members, granting them access to the organization? The process may take a few seconds to complete and cannot be interrupted or canceled." + "message": "Да ли сте сигурни да желите да активирате следеће чланове, дајући им приступ организацији? Процес може потрајати неколико секунди и не може се прекинути или отказати." }, "theme": { "message": "Тема" @@ -4307,10 +4325,10 @@ "message": "Успешно уклоњено" }, "bulkDeactivatedMessage": { - "message": "Deactivated successfully" + "message": "Успешно деактивирање" }, "bulkActivatedMessage": { - "message": "Activated successfully" + "message": "Успешно активирање" }, "bulkFilteredMessage": { "message": "Искључено, није применљиво за ову акцију." @@ -4322,10 +4340,10 @@ "message": "Уклони кориснике" }, "deactivateUsers": { - "message": "Deactivate Users" + "message": "Деактивирати кориснике" }, "activateUsers": { - "message": "Activate Users" + "message": "Активирати кориснике" }, "error": { "message": "Грешка" @@ -4633,19 +4651,19 @@ "message": "Single Sign-On configuration was saved." }, "sponsoredFamilies": { - "message": "Free Bitwarden Families" + "message": "Бесплатно Bitwarden Families" }, "sponsoredFamiliesEligible": { - "message": "You and your family are eligible for Free Bitwarden Families. Redeem with your personal email to keep your data secure even when you are not at work." + "message": "Ви и ваша породица испуњавате услове за бесплатне Bitwarden Families. Искористите својом личном е-поштом да бисте заштитили своје податке чак и када нисте на послу." }, "sponsoredFamiliesEligibleCard": { - "message": "Redeem your Free Bitwarden for Families plan today to keep your data secure even when you are not at work." + "message": "Искористите свој бесплатни план Bitwarden for Families данас да бисте заштитили своје податке чак и када нисте на послу." }, "sponsoredFamiliesInclude": { - "message": "The Bitwarden for Families plan include" + "message": "Bitwarden for Families укључује" }, "sponsoredFamiliesPremiumAccess": { - "message": "Premium access for up to 6 users" + "message": "Премиум приступ за до 6 корисника" }, "sponsoredFamiliesSharedCollections": { "message": "Shared collections for Family secrets" @@ -4681,7 +4699,7 @@ "message": "Unable to accept offer. Please resend the offer email from your enterprise account and try again." }, "sponsoredFamiliesAcceptFailedShort": { - "message": "Unable to accept offer. $DESCRIPTION$", + "message": "Није могуће прихватити понуду. $DESCRIPTION$", "placeholders": { "description": { "content": "$1", @@ -4690,10 +4708,10 @@ } }, "sponsoredFamiliesOffer": { - "message": "Accept Free Bitwarden Families" + "message": "Прихвати Бесплатно Free Bitwarden Families" }, "sponsoredFamiliesOfferRedeemed": { - "message": "Free Bitwarden Families offer successfully redeemed" + "message": "Бесплатна понуда за Bitwarden Families је успешно искоришћена" }, "redeemed": { "message": "Откупљено" @@ -4802,18 +4820,18 @@ }, "ssoPolicyHelpStart": { "message": "Упалити", - "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Enable the SSO Authentication policy to require all members to log in with SSO.'" + "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Use the require single-sign-on authentication policy to require all members to log in with SSO.'" }, "ssoPolicyHelpLink": { "message": "политику SSO аутентификације", - "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Enable the SSO Authentication policy to require all members to log in with SSO.'" + "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Use the require single-sign-on authentication policy to require all members to log in with SSO.'" }, "ssoPolicyHelpEnd": { "message": "да би сви чланови обавезно користили SSO.", - "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Enable the SSO Authentication policy to require all members to log in with SSO.'" + "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Use the require single-sign-on authentication policy to require all members to log in with SSO.'" }, "ssoPolicyHelpKeyConnector": { - "message": "SSO Authentication and Single Organization policies are required to set up Key Connector decryption." + "message": "The require SSO authentication and single organization policies are required to set up Key Connector decryption." }, "memberDecryptionOption": { "message": "Опциј дешифровања члана" @@ -4879,10 +4897,10 @@ "message": "БЕСПЛАТНО уз спонзорство" }, "viewBillingSyncToken": { - "message": "View Billing Sync Token" + "message": "Види токен синхронизације наплате" }, "generateBillingSyncToken": { - "message": "Generate Billing Sync Token" + "message": "Генериши токен синхронизације наплате" }, "copyPasteBillingSync": { "message": "Copy and paste this token into the Billing Sync settings of your self-hosted organization." @@ -4891,10 +4909,10 @@ "message": "Your Billing Sync token can access and edit this organization's subscription settings." }, "manageBillingSync": { - "message": "Manage Billing Sync" + "message": "Управљати синхроизацију наплате" }, "setUpBillingSync": { - "message": "Set Up Billing Sync" + "message": "Подесити синхронизацију наплате" }, "generateToken": { "message": "Генеришите Токен" @@ -4915,10 +4933,10 @@ "message": "To set-up your organization on your own server, you will need to upload your license file. To support Free Families plans and advanced billing capabilities for your self-hosted organization, you will need to set up billing sync." }, "billingSyncApiKeyRotated": { - "message": "Token rotated." + "message": "Токен је обрнут." }, "billingSync": { - "message": "Billing Sync" + "message": "Синхронизација наплате" }, "billingSyncDesc": { "message": "Billing Sync provides Free Families plans for members and advanced billing capabilities by linking your self-hosted Bitwarden to the Bitwarden cloud server." @@ -4927,7 +4945,7 @@ "message": "A Billing Sync Token from your cloud organization's subscription settings is required to complete this form." }, "billingSyncKey": { - "message": "Billing Sync Token" + "message": "Синхронизација токена наплате" }, "active": { "message": "Активан" @@ -4984,7 +5002,7 @@ "message": "Вишеструко одвојите зарезом." }, "sessionTimeout": { - "message": "Your session has timed out. Please go back and try logging in again." + "message": "Ваша сесија је истекла. Вратите се и покушајте поново да се пријавите." }, "exportingPersonalVaultTitle": { "message": "Извоз личног сефа" @@ -4993,7 +5011,7 @@ "message": "Извоз сефа организације" }, "exportingPersonalVaultDescription": { - "message": "Only the personal vault items associated with $EMAIL$ will be exported. Organization vault items will not be included.", + "message": "Само предмети личног сефа повезани са $EMAIL$ биће извезени. Ставке организационог сефа неће бити укључене.", "placeholders": { "email": { "content": "$1", @@ -5129,7 +5147,7 @@ } }, "billingContactProviderForAssistance": { - "message": "Please reach out to them for further assistance", + "message": "Обратите се њима за даљу помоћ", "description": "This text is displayed if an organization's billing is managed by a Provider. It tells the user to contact the Provider for assistance." }, "forwardedEmail": { @@ -5146,13 +5164,13 @@ "message": "Приступни АПИ токен" }, "deviceVerification": { - "message": "Device Verification" + "message": "Провера уређаја" }, "enableDeviceVerification": { - "message": "Enable Device Verification" + "message": "Омогућити проверу уређаја" }, "deviceVerificationDesc": { - "message": "When enabled, verification codes are sent to your email address when logging in from an unrecognized device" + "message": "Када је омогућено, верификациони кодови се шаљу на вашу е-адресу када се пријавите са непрепознатог уређаја" }, "updatedDeviceVerification": { "message": "Провера уређаја је ажурирана" @@ -5165,5 +5183,35 @@ "example": "My Email" } } + }, + "inputRequired": { + "message": "Унос је потребан." + }, + "inputEmail": { + "message": "Унос није е-адреса." + }, + "inputMinLength": { + "message": "Унос трба имати најмање $COUNT$ слова.", + "placeholders": { + "count": { + "content": "$1", + "example": "8" + } + } + }, + "fieldsNeedAttention": { + "message": "$COUNT$ поље(а) изнад захтевај(у) вашу пажњу.", + "placeholders": { + "count": { + "content": "$1", + "example": "4" + } + } + }, + "turnOn": { + "message": "Укључи" + }, + "on": { + "message": "Укључено" } } diff --git a/apps/web/src/locales/sr_CS/messages.json b/apps/web/src/locales/sr_CS/messages.json index 390bc5acf7c..7394194c124 100644 --- a/apps/web/src/locales/sr_CS/messages.json +++ b/apps/web/src/locales/sr_CS/messages.json @@ -572,6 +572,9 @@ "createAccount": { "message": "Napravi Nalog" }, + "startTrial": { + "message": "Start Trial" + }, "logIn": { "message": "Prijavi Se" }, @@ -593,6 +596,9 @@ "masterPassDesc": { "message": "Glavna šifra je šifra koju koristite kako biste pristupili svom trezoru. Veoma je važno da ne zaboravite svoju glavnu šifru. Ukoliko je zaboravite, ne postoji način da je dobijete nazad." }, + "masterPassImportant": { + "message": "Master passwords cannot be recovered if you forget it!" + }, "masterPassHintDesc": { "message": "A master password hint can help you remember your password if you forget it." }, @@ -623,10 +629,13 @@ "invalidEmail": { "message": "Invalid email address." }, - "masterPassRequired": { + "masterPasswordRequired": { "message": "Master password is required." }, - "masterPassLength": { + "confirmMasterPasswordRequired": { + "message": "Master password retype is required." + }, + "masterPasswordMinLength": { "message": "Master password must be at least 8 characters long." }, "masterPassDoesntMatch": { @@ -1067,7 +1076,7 @@ "message": "Delete Account" }, "deleteAccountDesc": { - "message": "Proceed below to delete your account and all associated data." + "message": "Proceed below to delete your account and all vault data." }, "deleteAccountWarning": { "message": "Deleting your account is permanent. It cannot be undone." @@ -3159,7 +3168,7 @@ "acceptPolicies": { "message": "By checking this box you agree to the following:" }, - "acceptPoliciesError": { + "acceptPoliciesRequired": { "message": "Terms of Service and Privacy Policy have not been acknowledged." }, "termsOfService": { @@ -3209,6 +3218,9 @@ "organizationIsDisabled": { "message": "Organization is disabled." }, + "disabledOrganizationFilterError": { + "message": "Items in disabled Organizations cannot be accessed. Contact your Organization owner for assistance." + }, "licenseIsExpired": { "message": "License is expired." }, @@ -3333,20 +3345,26 @@ "clone": { "message": "Clone" }, + "masterPassPolicyTitle": { + "message": "Master password requirements" + }, "masterPassPolicyDesc": { - "message": "Set minimum requirements for master password strength." + "message": "Set requirements for master password strength." + }, + "twoStepLoginPolicyTitle": { + "message": "Require two-step login" }, "twoStepLoginPolicyDesc": { - "message": "Require users to set up two-step login on their personal accounts." + "message": "Require members to set up two-step login." }, "twoStepLoginPolicyWarning": { - "message": "Organization members who are not Owners or Administrators and do not have two-step login enabled for their personal account will be removed from the organization and will receive an email notifying them about the change." + "message": "Organization members who are not Owners or Administrators and do not have two-step login turned on for their account will be removed from the organization and will receive an email notifying them about the change." }, "twoStepLoginPolicyUserWarning": { "message": "You are a member of an organization that requires two-step login to be enabled on your user account. If you disable all two-step login providers you will be automatically removed from these organizations." }, "passwordGeneratorPolicyDesc": { - "message": "Set minimum requirements for password generator configuration." + "message": "Set requirements for password generator." }, "passwordGeneratorPolicyInEffect": { "message": "One or more organization policies are affecting your generator settings." @@ -3564,10 +3582,10 @@ "message": "Link SSO" }, "singleOrg": { - "message": "Single Organization" + "message": "Single organization" }, "singleOrgDesc": { - "message": "Restrict users from being able to join any other organizations." + "message": "Restrict members from joining other organizations." }, "singleOrgBlockCreateMessage": { "message": "Your current organization has a policy that does not allow you to join more than one organization. Please contact your organization admins or sign up from a different Bitwarden account." @@ -3576,16 +3594,16 @@ "message": "Organization members who are not Owners or Administrators and are already a member of another organization will be removed from your organization." }, "requireSso": { - "message": "Single Sign-On Authentication" + "message": "Require single sign-on authentication" }, "requireSsoPolicyDesc": { - "message": "Require users to log in with the Enterprise Single Sign-On method." + "message": "Require members to log in with the Enterprise Single Sign-On method." }, "prerequisite": { "message": "Prerequisite" }, "requireSsoPolicyReq": { - "message": "The Single Organization enterprise policy must be enabled before activating this policy." + "message": "The Single Organization enterprise policy must be turned on before activating this policy." }, "requireSsoPolicyReqError": { "message": "Single Organization policy not enabled." @@ -3880,10 +3898,10 @@ } }, "personalOwnership": { - "message": "Personal Ownership" + "message": "Remove individual vault" }, "personalOwnershipPolicyDesc": { - "message": "Require users to save vault items to an organization by removing the personal ownership option." + "message": "Require members to save items to an organization by removing the individual vault option." }, "personalOwnershipExemption": { "message": "Organization Owners and Administrators are exempt from this policy's enforcement." @@ -3892,10 +3910,10 @@ "message": "Due to an enterprise policy, you are restricted from saving items to your personal vault. Change the Ownership option to an organization and choose from available Collections." }, "disableSend": { - "message": "Disable Send" + "message": "Remove Send" }, "disableSendPolicyDesc": { - "message": "Do not allow users to create or edit a Bitwarden Send. Deleting an existing Send is still allowed.", + "message": "Do not allow members to create or edit sends.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "disableSendExemption": { @@ -3910,7 +3928,7 @@ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendOptions": { - "message": "Send Options", + "message": "Send options", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendOptionsPolicyDesc": { @@ -3921,7 +3939,7 @@ "message": "Organization users that can manage the organization's policies are exempt from this policy's enforcement." }, "disableHideEmail": { - "message": "Do not allow users to hide their email address from recipients when creating or editing a Send.", + "message": "Always show member’s email address with recipients when creating or editing a send.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendOptionsPolicyInEffect": { @@ -4217,10 +4235,10 @@ "message": "Enrollment will allow organization administrators to change your master password" }, "resetPasswordPolicy": { - "message": "Master Password Reset" + "message": "Master password reset" }, "resetPasswordPolicyDescription": { - "message": "Allow administrators in the organization to reset organization users' master password." + "message": "Allow admins to reset master passwords for members." }, "resetPasswordPolicyWarning": { "message": "Users in the organization will need to self-enroll or be auto-enrolled before administrators can reset their master password." @@ -4464,10 +4482,10 @@ "message": "Your Master Password does not meet the policy requirements of this organization. In order to join the organization, you must update your Master Password now. Proceeding will log you out of your current session, requiring you to log back in. Active sessions on other devices may continue to remain active for up to one hour." }, "maximumVaultTimeout": { - "message": "Vault Timeout" + "message": "Vault timeout" }, "maximumVaultTimeoutDesc": { - "message": "Configure a maximum vault timeout for all users." + "message": "Set a maximum vault timeout for members." }, "maximumVaultTimeoutLabel": { "message": "Maximum Vault Timeout" @@ -4507,10 +4525,10 @@ "message": "Vault Timeout is not within allowed range." }, "disablePersonalVaultExport": { - "message": "Disable Personal Vault Export" + "message": "Remove individual vault export" }, "disablePersonalVaultExportDesc": { - "message": "Prohibits users from exporting their private vault data." + "message": "Do not allow members to export their individual vault data." }, "vaultExportDisabled": { "message": "Vault Export Disabled" @@ -4801,19 +4819,19 @@ "message": "Once set up, your configuration will be saved and members will be able to authenticate using their Identity Provider credentials." }, "ssoPolicyHelpStart": { - "message": "Enable the", - "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Enable the SSO Authentication policy to require all members to log in with SSO.'" + "message": "Use the", + "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Use the require single-sign-on authentication policy to require all members to log in with SSO.'" }, "ssoPolicyHelpLink": { - "message": "SSO Authentication policy", - "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Enable the SSO Authentication policy to require all members to log in with SSO.'" + "message": "require single-sign-on authentication policy", + "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Use the require single-sign-on authentication policy to require all members to log in with SSO.'" }, "ssoPolicyHelpEnd": { "message": "to require all members to log in with SSO.", - "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Enable the SSO Authentication policy to require all members to log in with SSO.'" + "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Use the require single-sign-on authentication policy to require all members to log in with SSO.'" }, "ssoPolicyHelpKeyConnector": { - "message": "SSO Authentication and Single Organization policies are required to set up Key Connector decryption." + "message": "The require SSO authentication and single organization policies are required to set up Key Connector decryption." }, "memberDecryptionOption": { "message": "Member Decryption Options" @@ -5165,5 +5183,35 @@ "example": "My Email" } } + }, + "inputRequired": { + "message": "Input is required." + }, + "inputEmail": { + "message": "Input is not an email-address." + }, + "inputMinLength": { + "message": "Input must be at least $COUNT$ characters long.", + "placeholders": { + "count": { + "content": "$1", + "example": "8" + } + } + }, + "fieldsNeedAttention": { + "message": "$COUNT$ field(s) above need your attention.", + "placeholders": { + "count": { + "content": "$1", + "example": "4" + } + } + }, + "turnOn": { + "message": "Turn on" + }, + "on": { + "message": "On" } } diff --git a/apps/web/src/locales/sv/messages.json b/apps/web/src/locales/sv/messages.json index c2b1f6a1719..f03bbdce457 100644 --- a/apps/web/src/locales/sv/messages.json +++ b/apps/web/src/locales/sv/messages.json @@ -572,6 +572,9 @@ "createAccount": { "message": "Skapa konto" }, + "startTrial": { + "message": "Start Trial" + }, "logIn": { "message": "Logga in" }, @@ -593,6 +596,9 @@ "masterPassDesc": { "message": "Huvudlösenordet är det lösenord som du använder för att komma åt ditt valv. Det är väldigt viktigt att du inte glömmer bort ditt huvudlösenord, eftersom det inte går att återställa lösenordet ifall du skulle glömma bort det." }, + "masterPassImportant": { + "message": "Master passwords cannot be recovered if you forget it!" + }, "masterPassHintDesc": { "message": "En huvudlösenordsledtråd kan hjälpa dig att komma ihåg ditt lösenord om du glömmer bort det." }, @@ -623,11 +629,14 @@ "invalidEmail": { "message": "Ogiltig e-postadress." }, - "masterPassRequired": { - "message": "Huvudlösenord krävs." + "masterPasswordRequired": { + "message": "Master password is required." }, - "masterPassLength": { - "message": "Huvudlösenordet måste vara minst 8 tecken långt." + "confirmMasterPasswordRequired": { + "message": "Master password retype is required." + }, + "masterPasswordMinLength": { + "message": "Master password must be at least 8 characters long." }, "masterPassDoesntMatch": { "message": "Huvudlösenorden stämmer inte överens." @@ -1239,7 +1248,7 @@ "message": "Aktiverad" }, "activate": { - "message": "Activate" + "message": "Aktivera" }, "premium": { "message": "Premium", @@ -1267,7 +1276,7 @@ "message": "Inaktivera" }, "deactivate": { - "message": "Deactivate" + "message": "Inaktivera" }, "twoStepLoginProviderEnabled": { "message": "Denna metod för tvåstegsverifiering är aktiverad på ditt konto." @@ -3159,8 +3168,8 @@ "acceptPolicies": { "message": "Genom att markera denna ruta godkänner du följande:" }, - "acceptPoliciesError": { - "message": "Användarvillkoren och Integritetspolicyn har inte accepterats." + "acceptPoliciesRequired": { + "message": "Terms of Service and Privacy Policy have not been acknowledged." }, "termsOfService": { "message": "Användarvillkor" @@ -3209,6 +3218,9 @@ "organizationIsDisabled": { "message": "Organisationen är inaktiverad." }, + "disabledOrganizationFilterError": { + "message": "Items in disabled Organizations cannot be accessed. Contact your Organization owner for assistance." + }, "licenseIsExpired": { "message": "Licensen har upphört att gälla." }, @@ -3333,9 +3345,15 @@ "clone": { "message": "Klona" }, + "masterPassPolicyTitle": { + "message": "Master password requirements" + }, "masterPassPolicyDesc": { "message": "Ange minimikrav för huvudlösenordsstyrka." }, + "twoStepLoginPolicyTitle": { + "message": "Require two-step login" + }, "twoStepLoginPolicyDesc": { "message": "Kräv att användare konfigurerar tvåstegsverifiering för sina personliga konton." }, @@ -3895,7 +3913,7 @@ "message": "Inaktivera Send" }, "disableSendPolicyDesc": { - "message": "Do not allow users to create or edit a Bitwarden Send. Deleting an existing Send is still allowed.", + "message": "Do not allow members to create or edit sends.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "disableSendExemption": { @@ -4322,10 +4340,10 @@ "message": "Ta bort användare" }, "deactivateUsers": { - "message": "Deactivate Users" + "message": "Inaktivera användare" }, "activateUsers": { - "message": "Activate Users" + "message": "Aktivera användare" }, "error": { "message": "Fel" @@ -4464,10 +4482,10 @@ "message": "Your Master Password does not meet the policy requirements of this organization. In order to join the organization, you must update your Master Password now. Proceeding will log you out of your current session, requiring you to log back in. Active sessions on other devices may continue to remain active for up to one hour." }, "maximumVaultTimeout": { - "message": "Vault Timeout" + "message": "Vault timeout" }, "maximumVaultTimeoutDesc": { - "message": "Configure a maximum vault timeout for all users." + "message": "Set a maximum vault timeout for members." }, "maximumVaultTimeoutLabel": { "message": "Maximum Vault Timeout" @@ -4507,10 +4525,10 @@ "message": "Vault Timeout is not within allowed range." }, "disablePersonalVaultExport": { - "message": "Disable Personal Vault Export" + "message": "Remove individual vault export" }, "disablePersonalVaultExportDesc": { - "message": "Prohibits users from exporting their private vault data." + "message": "Do not allow members to export their individual vault data." }, "vaultExportDisabled": { "message": "Vault Export Disabled" @@ -4801,19 +4819,19 @@ "message": "Once set up, your configuration will be saved and members will be able to authenticate using their Identity Provider credentials." }, "ssoPolicyHelpStart": { - "message": "Enable the", - "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Enable the SSO Authentication policy to require all members to log in with SSO.'" + "message": "Use the", + "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Use the require single-sign-on authentication policy to require all members to log in with SSO.'" }, "ssoPolicyHelpLink": { - "message": "SSO Authentication policy", - "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Enable the SSO Authentication policy to require all members to log in with SSO.'" + "message": "require single-sign-on authentication policy", + "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Use the require single-sign-on authentication policy to require all members to log in with SSO.'" }, "ssoPolicyHelpEnd": { "message": "to require all members to log in with SSO.", - "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Enable the SSO Authentication policy to require all members to log in with SSO.'" + "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Use the require single-sign-on authentication policy to require all members to log in with SSO.'" }, "ssoPolicyHelpKeyConnector": { - "message": "SSO Authentication and Single Organization policies are required to set up Key Connector decryption." + "message": "The require SSO authentication and single organization policies are required to set up Key Connector decryption." }, "memberDecryptionOption": { "message": "Member Decryption Options" @@ -5165,5 +5183,35 @@ "example": "My Email" } } + }, + "inputRequired": { + "message": "Input is required." + }, + "inputEmail": { + "message": "Input is not an email-address." + }, + "inputMinLength": { + "message": "Input must be at least $COUNT$ characters long.", + "placeholders": { + "count": { + "content": "$1", + "example": "8" + } + } + }, + "fieldsNeedAttention": { + "message": "$COUNT$ field(s) above need your attention.", + "placeholders": { + "count": { + "content": "$1", + "example": "4" + } + } + }, + "turnOn": { + "message": "Turn on" + }, + "on": { + "message": "On" } } diff --git a/apps/web/src/locales/tr/messages.json b/apps/web/src/locales/tr/messages.json index c299e7216ab..6431ea7723d 100644 --- a/apps/web/src/locales/tr/messages.json +++ b/apps/web/src/locales/tr/messages.json @@ -572,6 +572,9 @@ "createAccount": { "message": "Hesap aç" }, + "startTrial": { + "message": "Denemeyi başlat" + }, "logIn": { "message": "Giriş yap" }, @@ -593,6 +596,9 @@ "masterPassDesc": { "message": "Ana parola, kasanıza ulaşmak için kullanacağınız paroladır. Ana parolanızı unutmamanız çok önemlidir. Unutursanız parolalarınızı asla kurtaramazsınız." }, + "masterPassImportant": { + "message": "Master passwords cannot be recovered if you forget it!" + }, "masterPassHintDesc": { "message": "Ana parolanızı unutursanız bu ipucuna bakınca size ana parolanızı hatırlatacak bir şey yazabilirsiniz." }, @@ -623,10 +629,13 @@ "invalidEmail": { "message": "Geçersiz e-posta adresi." }, - "masterPassRequired": { - "message": "Ana parola gerekli." + "masterPasswordRequired": { + "message": "Ana parola gereklidir." }, - "masterPassLength": { + "confirmMasterPasswordRequired": { + "message": "Ana parolayı yeniden yazmalısınız." + }, + "masterPasswordMinLength": { "message": "Ana parola en az 8 karakter uzunluğunda olmalıdır." }, "masterPassDoesntMatch": { @@ -1067,7 +1076,7 @@ "message": "Hesabı sil" }, "deleteAccountDesc": { - "message": "Hesabınızı ve tüm ilişkili verileri silmek için aşağıdan devam edin." + "message": "Hesabınızı ve ilişkili tüm verileri silmek için aşağıya devam edin." }, "deleteAccountWarning": { "message": "Hesabınızı silmek kalıcıdır. Geri alınamaz." @@ -3159,7 +3168,7 @@ "acceptPolicies": { "message": "Bu kutuyu işaretleyerek aşağıdakileri kabul etmiş olursunuz:" }, - "acceptPoliciesError": { + "acceptPoliciesRequired": { "message": "Hizmet Koşulları ve Gizlilik Politikası kabul edilmemiş." }, "termsOfService": { @@ -3209,6 +3218,9 @@ "organizationIsDisabled": { "message": "Kuruluş devre dışı." }, + "disabledOrganizationFilterError": { + "message": "Devre dışı kuruluşlardaki kayıtlara erişilemez. Destek almak için kuruluş sahibinizle iletişime geçin." + }, "licenseIsExpired": { "message": "Lisans süresi doldu." }, @@ -3333,14 +3345,20 @@ "clone": { "message": "Klonla" }, + "masterPassPolicyTitle": { + "message": "Ana parola gereksinimleri" + }, "masterPassPolicyDesc": { "message": "Ana parola gücü için minimum gereksinimleri ayarlayın." }, + "twoStepLoginPolicyTitle": { + "message": "Require two-step login" + }, "twoStepLoginPolicyDesc": { "message": "Kullanıcıların hesaplarında iki aşamalı giriş kullanmalarını zorunlu tutun." }, "twoStepLoginPolicyWarning": { - "message": "Organization members who are not Owners or Administrators and do not have two-step login enabled for their personal account will be removed from the organization and will receive an email notifying them about the change." + "message": "Organization members who are not Owners or Administrators and do not have two-step login turned on for their account will be removed from the organization and will receive an email notifying them about the change." }, "twoStepLoginPolicyUserWarning": { "message": "İki aşamalı girişin etkinleştirilmesi gereken bir kuruluşa üyesisiniz. İki aşamalı giriş sağlayıcılarının tümünü devre dışı bırakırsanız bu kuruluşlardan otomatik olarak kaldırılırsınız." @@ -4467,7 +4485,7 @@ "message": "Kasa zaman aşımı" }, "maximumVaultTimeoutDesc": { - "message": "Configure a maximum vault timeout for all users." + "message": "Set a maximum vault timeout for members." }, "maximumVaultTimeoutLabel": { "message": "Maksimum kasa zaman aşımı" @@ -4802,15 +4820,15 @@ }, "ssoPolicyHelpStart": { "message": "Tüm üyelerin SSO ile giriş yapmasını zorunlu tutmak için", - "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Enable the SSO Authentication policy to require all members to log in with SSO.'" + "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Use the require single-sign-on authentication policy to require all members to log in with SSO.'" }, "ssoPolicyHelpLink": { "message": "SSO kimlik doğrulama ilkesini", - "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Enable the SSO Authentication policy to require all members to log in with SSO.'" + "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Use the require single-sign-on authentication policy to require all members to log in with SSO.'" }, "ssoPolicyHelpEnd": { "message": "etkinleştirin.", - "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Enable the SSO Authentication policy to require all members to log in with SSO.'" + "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Use the require single-sign-on authentication policy to require all members to log in with SSO.'" }, "ssoPolicyHelpKeyConnector": { "message": "Key Connector ile çözmeyi kurmak için \"SSO kimlik doğrulama\" ve \"tek kuruluş\" ilkeleri gereklidir." @@ -5165,5 +5183,35 @@ "example": "My Email" } } + }, + "inputRequired": { + "message": "Girdi gerekli." + }, + "inputEmail": { + "message": "Input is not an email-address." + }, + "inputMinLength": { + "message": "Input must be at least $COUNT$ characters long.", + "placeholders": { + "count": { + "content": "$1", + "example": "8" + } + } + }, + "fieldsNeedAttention": { + "message": "$COUNT$ field(s) above need your attention.", + "placeholders": { + "count": { + "content": "$1", + "example": "4" + } + } + }, + "turnOn": { + "message": "Aç" + }, + "on": { + "message": "Açık" } } diff --git a/apps/web/src/locales/uk/messages.json b/apps/web/src/locales/uk/messages.json index 2ca96f92132..137e4fe767c 100644 --- a/apps/web/src/locales/uk/messages.json +++ b/apps/web/src/locales/uk/messages.json @@ -572,6 +572,9 @@ "createAccount": { "message": "Створити обліковий запис" }, + "startTrial": { + "message": "Почати пробний період" + }, "logIn": { "message": "Увійти" }, @@ -593,6 +596,9 @@ "masterPassDesc": { "message": "Головний пароль використовується для доступу до вашого сховища. Дуже важливо, щоб ви запам'ятали його. Якщо ви забудете головний пароль, його неможливо буде відновити." }, + "masterPassImportant": { + "message": "Головний пароль неможливо відновити, якщо ви забудете його!" + }, "masterPassHintDesc": { "message": "Якщо ви забудете головний пароль, підказка може допомогти вам згадати його." }, @@ -623,11 +629,14 @@ "invalidEmail": { "message": "Неправильна адреса е-пошти." }, - "masterPassRequired": { - "message": "Потрібен головний пароль." + "masterPasswordRequired": { + "message": "Необхідно ввести головний пароль." }, - "masterPassLength": { - "message": "Довжина головного пароля повинна бути не менше 8 символів." + "confirmMasterPasswordRequired": { + "message": "Необхідно повторно ввести головний пароль." + }, + "masterPasswordMinLength": { + "message": "Довжина головного пароля має бути принаймні 8 символів." }, "masterPassDoesntMatch": { "message": "Підтвердження головного пароля не збігається." @@ -864,7 +873,7 @@ "message": "Експортовані дані вашого сховища знаходяться в незашифрованому вигляді. Вам не слід зберігати чи надсилати їх через незахищені канали (наприклад, е-поштою). Після використання негайно видаліть їх." }, "encExportKeyWarningDesc": { - "message": "Цей експорт шифрує ваші дані за допомогою ключа шифрування облікового запису. Якщо ви коли-небудь оновите ключ шифрування облікового запису, ви повинні виконати експорт знову, оскільки не зможете розшифрувати цей файл експорту." + "message": "Цей експорт шифрує ваші дані за допомогою ключа шифрування облікового запису. Якщо ви коли-небудь оновите ключ шифрування облікового запису, необхідно виконати експорт знову, оскільки не зможете розшифрувати цей файл експорту." }, "encExportAccountWarningDesc": { "message": "Ключі шифрування унікальні для кожного облікового запису користувача Bitwarden, тому ви не можете імпортувати зашифрований експорт до іншого облікового запису." @@ -1067,7 +1076,7 @@ "message": "Видалити обліковий запис" }, "deleteAccountDesc": { - "message": "Продовжуйте внизу для видалення облікового запису і всіх пов'язаних даних." + "message": "Нижче ви зможете завершити видалення облікового запису та всіх даних сховища." }, "deleteAccountWarning": { "message": "Видалення облікового запису є незворотною дією. Це не можна буде скасувати." @@ -1076,7 +1085,7 @@ "message": "Обліковий запис видалено" }, "accountDeletedDesc": { - "message": "Ваш обліковий запис було закрито і всі пов'язані дані було видалено." + "message": "Ваш обліковий запис і дані сховища було остаточно видалено." }, "myAccount": { "message": "Мій обліковий запис" @@ -1494,7 +1503,7 @@ "message": "Неактивна двоетапна перевірка" }, "inactive2faReportDesc": { - "message": "Двоетапна перевірка надає додатковий рівень захисту для ваших облікових записів. Увімкніть двоетапнуперевірку з використанням вбудованих засобів Bitwarden для цих облікових записів, або скористайтеся альтернативним способом." + "message": "Двоетапна перевірка забезпечує додатковий рівень захисту для ваших облікових записів. Увімкніть двоетапну перевірку з використанням вбудованих засобів Bitwarden для цих облікових записів, або скористайтеся альтернативним способом." }, "inactive2faFound": { "message": "Знайдено записи без двоетапної перевірки" @@ -2320,7 +2329,7 @@ "message": "Користувач з найвищими привілеями, який може керувати всіма налаштуваннями організації." }, "clientOwnerDesc": { - "message": "Цей користувач повинен бути незалежним від постачальника. Якщо постачальник не пов'язаний з організацією, цей користувач підтримуватиме право власності організації." + "message": "Цей користувач має бути незалежним від постачальника. Якщо постачальник не пов'язаний з організацією, цей користувач підтримуватиме право власності організації." }, "admin": { "message": "Адміністратор" @@ -3159,8 +3168,8 @@ "acceptPolicies": { "message": "Позначивши цей прапорець, ви погоджуєтеся з:" }, - "acceptPoliciesError": { - "message": "Умови користування та політика приватності не погоджені." + "acceptPoliciesRequired": { + "message": "Ви не погодилися з умовами користування та політикою приватності." }, "termsOfService": { "message": "Умови користування" @@ -3209,6 +3218,9 @@ "organizationIsDisabled": { "message": "Організацію вимкнено." }, + "disabledOrganizationFilterError": { + "message": "Записи у вимкнених організаціях недоступні. Зверніться до власника вашої організації для отримання допомоги." + }, "licenseIsExpired": { "message": "Термін дії ліцензії завершився." }, @@ -3294,7 +3306,7 @@ "message": "Поворот ключа API спричинить анулювання попереднього ключа. Ви можете повернути свій ключ API, якщо вважаєте, що поточний ключ більше не є безпечним для використання." }, "apiKeyWarning": { - "message": "Ваш ключ API має повний доступ до організації. Він повинен зберігатися в секреті." + "message": "Ваш ключ API має повний доступ до організації. Його необхідно надійно зберігати." }, "userApiKeyDesc": { "message": "Ваш ключ API може бути використаний для авторизації в Bitwarden CLI." @@ -3313,7 +3325,7 @@ "message": "Повернути ключ API" }, "selectOneCollection": { - "message": "Ви повинні обрати принаймні одну збірку." + "message": "Необхідно вибрати принаймні одну збірку." }, "couldNotChargeCardPayInvoice": { "message": "Нам не вдалося виконати оплату з вашої картки. Будь ласка, перегляньте і проведіть оплату за рахунком, вказаним внизу." @@ -3325,7 +3337,7 @@ "message": "Ви не можете виконати цю дію під час використання способу оплати покупки в додатку." }, "manageSubscriptionFromStore": { - "message": "Ви повинні керувати своєю передплатою з магазину, в якому виконали покупку в додатку." + "message": "Керувати своєю передплатою потрібно з магазину, в якому ви виконали покупку в додатку." }, "minLength": { "message": "Мінімальна довжина" @@ -3333,20 +3345,26 @@ "clone": { "message": "Клонувати" }, + "masterPassPolicyTitle": { + "message": "Вимоги до головного пароля" + }, "masterPassPolicyDesc": { - "message": "Встановіть мінімальні вимоги надійності головного пароля." + "message": "Встановіть вимоги надійності головного пароля." + }, + "twoStepLoginPolicyTitle": { + "message": "Вимагати двоетапну перевірку" }, "twoStepLoginPolicyDesc": { - "message": "Зобов'язувати користувачів встановлювати двоетапну перевірку в їхніх особистих облікових записах." + "message": "Зобов'язувати учасників встановлювати двоетапну перевірку." }, "twoStepLoginPolicyWarning": { - "message": "Учасники організації, які не є власниками, чи адміністратори, в яких не увімкнено двоетапну перевірку для їхніх особистих облікових записів, будуть вилучені з організації та проінформовані поштовим повідомленням." + "message": "Учасники організації, які не є власниками, чи адміністратори, в яких не увімкнено двоетапну перевірку для їхніх облікових записів, будуть вилучені з організації та проінформовані поштовим повідомленням." }, "twoStepLoginPolicyUserWarning": { "message": "Ви включені до організації, яка зобов'язує використання двоетапної перевірки у вашому обліковому записі. Якщо ви вимкнете всі способи двоетапної перевірки, вас буде автоматично вилучено з цієї організації." }, "passwordGeneratorPolicyDesc": { - "message": "Встановіть мінімальні вимоги для параметрів генерування пароля." + "message": "Встановити вимоги для генерування пароля." }, "passwordGeneratorPolicyInEffect": { "message": "На параметри генератора впливають одна чи декілька політик організації." @@ -3567,7 +3585,7 @@ "message": "Єдина організація" }, "singleOrgDesc": { - "message": "Заборонити користувачам приєднуватися до будь-яких інших організацій." + "message": "Заборонити користувачам приєднуватися до інших організацій." }, "singleOrgBlockCreateMessage": { "message": "Ваша організація має політику, що не дозволяє вам приєднуватися до більш, ніж однієї організації. Будь ласка, зв'яжіться з адміністратором вашої організації, або увійдіть з іншим обліковим записом Bitwarden." @@ -3576,10 +3594,10 @@ "message": "Учасники організації, які не є власниками чи адміністраторами, але вже є учасниками іншої організації, будуть вилучені з вашої організації." }, "requireSso": { - "message": "Авторизація через єдиний вхід (SSO)" + "message": "Вимагати авторизацію через єдиний вхід (SSO)" }, "requireSsoPolicyDesc": { - "message": "Вимагати від користувачів входити в систему через єдиний вхід (SSO) компанії." + "message": "Зобов'язувати учасників входити в систему через єдиний вхід (SSO) компанії." }, "prerequisite": { "message": "Передумови" @@ -3880,10 +3898,10 @@ } }, "personalOwnership": { - "message": "Особиста власність" + "message": "Вилучити особисте сховище" }, "personalOwnershipPolicyDesc": { - "message": "Вимагати від користувачів зберігати записи до організації, вилучивши можливість особистої власності." + "message": "Зобов'язувати учасників зберігати записи до організації, вилучивши параметр особистого сховища." }, "personalOwnershipExemption": { "message": "Власники організації та адміністратори звільняються від дотримання цієї політики." @@ -3892,10 +3910,10 @@ "message": "У зв'язку з корпоративною політикою, вам не дозволено зберігати записи до особистого сховища. Змініть налаштування власності на організацію та виберіть серед доступних збірок." }, "disableSend": { - "message": "Вимкнути відправлення" + "message": "Вилучити відправлення" }, "disableSendPolicyDesc": { - "message": "Не дозволяти користувачам створювати чи змінювати відправлення Bitwarden. Видалення наявних відправлень все ще дозволяється.", + "message": "Не дозволяти учасникам створювати чи змінювати відправлення.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "disableSendExemption": { @@ -3921,7 +3939,7 @@ "message": "Користувачі організації, які можуть керувати політиками організації, звільняються від дотримання цієї політики." }, "disableHideEmail": { - "message": "Не дозволяти користувачам приховувати свою адресу електронної пошти від отримувачів під час створення чи редагування відправлень.", + "message": "Завжди показувати отримувачам адресу е-пошти учасників під час створення чи редагування відправлень.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendOptionsPolicyInEffect": { @@ -4004,7 +4022,7 @@ "message": "Керувати скиданням пароля" }, "disableRequiredError": { - "message": "Перш ніж вимкнути цю політику, ви повинні вручну вимкнути політику $POLICYNAME$.", + "message": "Перш ніж вимкнути цю політику, вам необхідно вручну вимкнути політику $POLICYNAME$.", "placeholders": { "policyName": { "content": "$1", @@ -4220,10 +4238,10 @@ "message": "Скидання головного пароля" }, "resetPasswordPolicyDescription": { - "message": "Дозволити адміністраторам організації скидати головний пароль користувачів." + "message": "Дозволити адміністраторам скидати головний пароль учасників." }, "resetPasswordPolicyWarning": { - "message": "Користувачі в організації повинні виконати самостійне розгортання, або отримати автоматичне розгортання, перш ніж адміністратори зможуть скинути їхній пароль." + "message": "Користувачі в організації мають виконати самостійне розгортання, або отримати автоматичне розгортання, перш ніж адміністратори зможуть скинути їхній пароль." }, "resetPasswordPolicyAutoEnroll": { "message": "Автоматичне розгортання" @@ -4331,7 +4349,7 @@ "message": "Помилка" }, "resetPasswordManageUsers": { - "message": "Керування користувачами повинно також бути увімкнено з дозволом Керувати скиданням пароля" + "message": "Керування користувачами має також бути увімкнено з дозволом Керувати скиданням пароля" }, "setupProvider": { "message": "Налаштування постачальника" @@ -4458,16 +4476,16 @@ "message": "Оновити головний пароль" }, "updateMasterPasswordWarning": { - "message": "Ваш головний пароль нещодавно був змінений адміністратором організації. Щоб отримати доступ до сховища, ви повинні оновити свій головний пароль зараз. Продовживши, ви вийдете з поточного сеансу, після чого необхідно буде повторно виконати вхід. Сеанси на інших пристроях можуть залишатися активними протягом однієї години." + "message": "Ваш головний пароль нещодавно був змінений адміністратором організації. Щоб отримати доступ до сховища, вам необхідно оновити свій головний пароль зараз. Продовживши, ви вийдете з поточного сеансу, після чого потрібно буде повторно виконати вхід. Сеанси на інших пристроях можуть залишатися активними протягом однієї години." }, "masterPasswordInvalidWarning": { - "message": "Ваш головний пароль не відповідає вимогам політики цієї організації. Щоб приєднатися до організації, ви повинні оновити свій головний пароль зараз. Продовживши, ви вийдете з поточного сеансу, після чого необхідно буде повторно виконати вхід. Сеанси на інших пристроях можуть залишатися активними протягом однієї години." + "message": "Ваш головний пароль не відповідає вимогам політики цієї організації. Щоб приєднатися до організації, необхідно оновити свій головний пароль зараз. Продовживши, ви вийдете з поточного сеансу, після чого потрібно буде повторно виконати вхід. Сеанси на інших пристроях можуть залишатися активними протягом однієї години." }, "maximumVaultTimeout": { "message": "Час очікування сховища" }, "maximumVaultTimeoutDesc": { - "message": "Налаштувати максимальний час очікування сховища для всіх користувачів." + "message": "Встановити максимальний час очікування сховища для учасників." }, "maximumVaultTimeoutLabel": { "message": "Максимальний час очікування сховища" @@ -4507,10 +4525,10 @@ "message": "Час очікування сховища поза межами дозволеного діапазону." }, "disablePersonalVaultExport": { - "message": "Вимкнути експорт особистого сховища" + "message": "Вилучити експорт особистого сховища" }, "disablePersonalVaultExportDesc": { - "message": "Забороняє користувачам експортувати їхні особисті дані сховища." + "message": "Заборонити учасникам експортувати дані їхнього особистого сховища." }, "vaultExportDisabled": { "message": "Експорт сховища вимкнено" @@ -4801,16 +4819,16 @@ "message": "Після налаштування вашу конфігурацію буде збережено та учасники зможуть авторизуватися з використанням облікових даних їхнього постачальника." }, "ssoPolicyHelpStart": { - "message": "Увімкнути", - "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Enable the SSO Authentication policy to require all members to log in with SSO.'" + "message": "Використовувати", + "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Use the require single-sign-on authentication policy to require all members to log in with SSO.'" }, "ssoPolicyHelpLink": { - "message": "Політика авторизації SSO", - "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Enable the SSO Authentication policy to require all members to log in with SSO.'" + "message": "обов'язкову політику єдиного входу (SSO)", + "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Use the require single-sign-on authentication policy to require all members to log in with SSO.'" }, "ssoPolicyHelpEnd": { "message": "щоб вимагати в усіх учасників виконувати вхід з SSO.", - "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Enable the SSO Authentication policy to require all members to log in with SSO.'" + "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Use the require single-sign-on authentication policy to require all members to log in with SSO.'" }, "ssoPolicyHelpKeyConnector": { "message": "Для встановлення розшифрування Key Connector необхідні політики авторизації SSO та єдиної організації." @@ -5165,5 +5183,35 @@ "example": "My Email" } } + }, + "inputRequired": { + "message": "Необхідно ввести дані." + }, + "inputEmail": { + "message": "Введені дані не є адресою е-пошти." + }, + "inputMinLength": { + "message": "Введені дані мають бути довжиною принаймні $COUNT$ символів.", + "placeholders": { + "count": { + "content": "$1", + "example": "8" + } + } + }, + "fieldsNeedAttention": { + "message": "$COUNT$ поле (поля) вище потребують вашої уваги.", + "placeholders": { + "count": { + "content": "$1", + "example": "4" + } + } + }, + "turnOn": { + "message": "Увімкнути" + }, + "on": { + "message": "Увімкнено" } } diff --git a/apps/web/src/locales/vi/messages.json b/apps/web/src/locales/vi/messages.json index be946bbb524..03efc589d3c 100644 --- a/apps/web/src/locales/vi/messages.json +++ b/apps/web/src/locales/vi/messages.json @@ -572,6 +572,9 @@ "createAccount": { "message": "Tạo tài khoản" }, + "startTrial": { + "message": "Start Trial" + }, "logIn": { "message": "Đăng nhập" }, @@ -593,6 +596,9 @@ "masterPassDesc": { "message": "Mật khẩu chính là mật khẩu cho kho mật khẩu của bạn. Mật khẩu này rất quan trọng và bạn không nên quên nó của mình. Bạn sẽ không thể khôi phục lại mật khẩu chính của bạn nếu bạn quên nó." }, + "masterPassImportant": { + "message": "Master passwords cannot be recovered if you forget it!" + }, "masterPassHintDesc": { "message": "Gợi ý mật khẩu có thể giúp bạn nhớ lại mật khẩu chính của mình nếu bạn quên nó." }, @@ -623,11 +629,14 @@ "invalidEmail": { "message": "Địa chỉ email không hợp lệ." }, - "masterPassRequired": { - "message": "Cần phải có mật khẩu chính." + "masterPasswordRequired": { + "message": "Master password is required." }, - "masterPassLength": { - "message": "Mật khẩu chính phải có ít nhất 8 kí tự." + "confirmMasterPasswordRequired": { + "message": "Master password retype is required." + }, + "masterPasswordMinLength": { + "message": "Master password must be at least 8 characters long." }, "masterPassDoesntMatch": { "message": "Xác minh mật khẩu chính không đúng." @@ -3159,7 +3168,7 @@ "acceptPolicies": { "message": "By checking this box you agree to the following:" }, - "acceptPoliciesError": { + "acceptPoliciesRequired": { "message": "Terms of Service and Privacy Policy have not been acknowledged." }, "termsOfService": { @@ -3209,6 +3218,9 @@ "organizationIsDisabled": { "message": "Organization is disabled." }, + "disabledOrganizationFilterError": { + "message": "Items in disabled Organizations cannot be accessed. Contact your Organization owner for assistance." + }, "licenseIsExpired": { "message": "License is expired." }, @@ -3333,20 +3345,26 @@ "clone": { "message": "Clone" }, + "masterPassPolicyTitle": { + "message": "Master password requirements" + }, "masterPassPolicyDesc": { - "message": "Set minimum requirements for master password strength." + "message": "Set requirements for master password strength." + }, + "twoStepLoginPolicyTitle": { + "message": "Require two-step login" }, "twoStepLoginPolicyDesc": { - "message": "Require users to set up two-step login on their personal accounts." + "message": "Require members to set up two-step login." }, "twoStepLoginPolicyWarning": { - "message": "Organization members who are not Owners or Administrators and do not have two-step login enabled for their personal account will be removed from the organization and will receive an email notifying them about the change." + "message": "Organization members who are not Owners or Administrators and do not have two-step login turned on for their account will be removed from the organization and will receive an email notifying them about the change." }, "twoStepLoginPolicyUserWarning": { "message": "You are a member of an organization that requires two-step login to be enabled on your user account. If you disable all two-step login providers you will be automatically removed from these organizations." }, "passwordGeneratorPolicyDesc": { - "message": "Set minimum requirements for password generator configuration." + "message": "Set requirements for password generator." }, "passwordGeneratorPolicyInEffect": { "message": "One or more organization policies are affecting your generator settings." @@ -3564,10 +3582,10 @@ "message": "Link SSO" }, "singleOrg": { - "message": "Single Organization" + "message": "Single organization" }, "singleOrgDesc": { - "message": "Restrict users from being able to join any other organizations." + "message": "Restrict members from joining other organizations." }, "singleOrgBlockCreateMessage": { "message": "Your current organization has a policy that does not allow you to join more than one organization. Please contact your organization admins or sign up from a different Bitwarden account." @@ -3576,16 +3594,16 @@ "message": "Organization members who are not Owners or Administrators and are already a member of another organization will be removed from your organization." }, "requireSso": { - "message": "Single Sign-On Authentication" + "message": "Require single sign-on authentication" }, "requireSsoPolicyDesc": { - "message": "Require users to log in with the Enterprise Single Sign-On method." + "message": "Require members to log in with the Enterprise Single Sign-On method." }, "prerequisite": { "message": "Prerequisite" }, "requireSsoPolicyReq": { - "message": "The Single Organization enterprise policy must be enabled before activating this policy." + "message": "The Single Organization enterprise policy must be turned on before activating this policy." }, "requireSsoPolicyReqError": { "message": "Single Organization policy not enabled." @@ -3880,10 +3898,10 @@ } }, "personalOwnership": { - "message": "Personal Ownership" + "message": "Remove individual vault" }, "personalOwnershipPolicyDesc": { - "message": "Require users to save vault items to an organization by removing the personal ownership option." + "message": "Require members to save items to an organization by removing the individual vault option." }, "personalOwnershipExemption": { "message": "Organization Owners and Administrators are exempt from this policy's enforcement." @@ -3895,7 +3913,7 @@ "message": "Tắt Send" }, "disableSendPolicyDesc": { - "message": "Do not allow users to create or edit a Bitwarden Send. Deleting an existing Send is still allowed.", + "message": "Do not allow members to create or edit sends.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "disableSendExemption": { @@ -3910,7 +3928,7 @@ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendOptions": { - "message": "Send Options", + "message": "Send options", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendOptionsPolicyDesc": { @@ -3921,7 +3939,7 @@ "message": "Organization users that can manage the organization's policies are exempt from this policy's enforcement." }, "disableHideEmail": { - "message": "Do not allow users to hide their email address from recipients when creating or editing a Send.", + "message": "Always show member’s email address with recipients when creating or editing a send.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendOptionsPolicyInEffect": { @@ -4217,10 +4235,10 @@ "message": "Enrollment will allow organization administrators to change your master password" }, "resetPasswordPolicy": { - "message": "Master Password Reset" + "message": "Master password reset" }, "resetPasswordPolicyDescription": { - "message": "Allow administrators in the organization to reset organization users' master password." + "message": "Allow admins to reset master passwords for members." }, "resetPasswordPolicyWarning": { "message": "Users in the organization will need to self-enroll or be auto-enrolled before administrators can reset their master password." @@ -4464,10 +4482,10 @@ "message": "Your Master Password does not meet the policy requirements of this organization. In order to join the organization, you must update your Master Password now. Proceeding will log you out of your current session, requiring you to log back in. Active sessions on other devices may continue to remain active for up to one hour." }, "maximumVaultTimeout": { - "message": "Vault Timeout" + "message": "Vault timeout" }, "maximumVaultTimeoutDesc": { - "message": "Configure a maximum vault timeout for all users." + "message": "Set a maximum vault timeout for members." }, "maximumVaultTimeoutLabel": { "message": "Maximum Vault Timeout" @@ -4507,10 +4525,10 @@ "message": "Vault Timeout is not within allowed range." }, "disablePersonalVaultExport": { - "message": "Disable Personal Vault Export" + "message": "Remove individual vault export" }, "disablePersonalVaultExportDesc": { - "message": "Prohibits users from exporting their private vault data." + "message": "Do not allow members to export their individual vault data." }, "vaultExportDisabled": { "message": "Vault Export Disabled" @@ -4801,19 +4819,19 @@ "message": "Once set up, your configuration will be saved and members will be able to authenticate using their Identity Provider credentials." }, "ssoPolicyHelpStart": { - "message": "Enable the", - "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Enable the SSO Authentication policy to require all members to log in with SSO.'" + "message": "Use the", + "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Use the require single-sign-on authentication policy to require all members to log in with SSO.'" }, "ssoPolicyHelpLink": { - "message": "SSO Authentication policy", - "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Enable the SSO Authentication policy to require all members to log in with SSO.'" + "message": "require single-sign-on authentication policy", + "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Use the require single-sign-on authentication policy to require all members to log in with SSO.'" }, "ssoPolicyHelpEnd": { "message": "to require all members to log in with SSO.", - "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Enable the SSO Authentication policy to require all members to log in with SSO.'" + "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Use the require single-sign-on authentication policy to require all members to log in with SSO.'" }, "ssoPolicyHelpKeyConnector": { - "message": "SSO Authentication and Single Organization policies are required to set up Key Connector decryption." + "message": "The require SSO authentication and single organization policies are required to set up Key Connector decryption." }, "memberDecryptionOption": { "message": "Member Decryption Options" @@ -5165,5 +5183,35 @@ "example": "My Email" } } + }, + "inputRequired": { + "message": "Input is required." + }, + "inputEmail": { + "message": "Input is not an email-address." + }, + "inputMinLength": { + "message": "Input must be at least $COUNT$ characters long.", + "placeholders": { + "count": { + "content": "$1", + "example": "8" + } + } + }, + "fieldsNeedAttention": { + "message": "$COUNT$ field(s) above need your attention.", + "placeholders": { + "count": { + "content": "$1", + "example": "4" + } + } + }, + "turnOn": { + "message": "Turn on" + }, + "on": { + "message": "On" } } diff --git a/apps/web/src/locales/zh_CN/messages.json b/apps/web/src/locales/zh_CN/messages.json index 5ef2219034c..cb7f2442ce9 100644 --- a/apps/web/src/locales/zh_CN/messages.json +++ b/apps/web/src/locales/zh_CN/messages.json @@ -572,6 +572,9 @@ "createAccount": { "message": "创建账户" }, + "startTrial": { + "message": "开始试用" + }, "logIn": { "message": "登录" }, @@ -593,6 +596,9 @@ "masterPassDesc": { "message": "主密码是您访问密码库的密码。它非常重要,请您不要忘记。一旦忘记,无任何办法恢复此密码。" }, + "masterPassImportant": { + "message": "主密码忘记后,将无法恢复!" + }, "masterPassHintDesc": { "message": "主密码提示可以在你忘记密码时帮你回忆起来。" }, @@ -623,10 +629,13 @@ "invalidEmail": { "message": "无效的电子邮件地址。" }, - "masterPassRequired": { + "masterPasswordRequired": { "message": "必须填写主密码。" }, - "masterPassLength": { + "confirmMasterPasswordRequired": { + "message": "必须填写确认主密码。" + }, + "masterPasswordMinLength": { "message": "主密码至少需要 8 个字符。" }, "masterPassDoesntMatch": { @@ -645,7 +654,7 @@ "message": "电子邮件地址" }, "yourVaultIsLocked": { - "message": "您的密码库已被锁定,请验证您的主密码以继续。" + "message": "您的密码库已锁定,请验证您的主密码以继续。" }, "unlock": { "message": "解锁​​​​" @@ -1067,7 +1076,7 @@ "message": "删除账户" }, "deleteAccountDesc": { - "message": "接下来的操作会删除您的账户和所有相关数据。" + "message": "接下来的操作会删除您的账户和所有密码库数据。" }, "deleteAccountWarning": { "message": "删除账户是永久性的。不能被撤消。" @@ -1076,7 +1085,7 @@ "message": "账户已删除" }, "accountDeletedDesc": { - "message": "您的账户已关闭,所有相关数据也已被删除。" + "message": "您的 Bitwarden 账户和密码库数据已被永久删除。" }, "myAccount": { "message": "我的账户" @@ -3159,7 +3168,7 @@ "acceptPolicies": { "message": "选中此框表示您同意:" }, - "acceptPoliciesError": { + "acceptPoliciesRequired": { "message": "尚未同意服务条款和隐私政策。" }, "termsOfService": { @@ -3209,6 +3218,9 @@ "organizationIsDisabled": { "message": "该组织已被禁用。" }, + "disabledOrganizationFilterError": { + "message": "无法访问已禁用组织中的项目。请联系您的组织所有者获取协助。" + }, "licenseIsExpired": { "message": "授权已过期" }, @@ -3333,20 +3345,26 @@ "clone": { "message": "克隆" }, + "masterPassPolicyTitle": { + "message": "主密码要求" + }, "masterPassPolicyDesc": { - "message": "设置主密码强度的最低要求。" + "message": "设置主密码强度要求。" + }, + "twoStepLoginPolicyTitle": { + "message": "需要两步登录" }, "twoStepLoginPolicyDesc": { - "message": "要求用户在个人账户上设置两步登录。" + "message": "要求成员设置两步登录。" }, "twoStepLoginPolicyWarning": { - "message": "非所有者或管理员并且其个人账户未启用两步登录的组织成员将从组织中移除,并将收到一封关于此更改的电子邮件通知。" + "message": "非所有者或管理员并且其账户未启用两步登录的组织成员将从组织中移除,并将收到一封关于此更改的电子邮件通知。" }, "twoStepLoginPolicyUserWarning": { "message": "您的组织要求您在您的个人账户上启用两步登录。如果您禁用所有两步登录提供程序,您将自动从这些组织中移除。" }, "passwordGeneratorPolicyDesc": { - "message": "设置密码生成器配置的最低要求。" + "message": "设置密码生成器要求。" }, "passwordGeneratorPolicyInEffect": { "message": "一个或多个组织策略正在影响您的生成器设置。" @@ -3567,7 +3585,7 @@ "message": "单一组织" }, "singleOrgDesc": { - "message": "限制用户加入任何其他组织。" + "message": "限制成员加入其他组织。" }, "singleOrgBlockCreateMessage": { "message": "您当前的组织策略禁止您加入多个组织。请联系您的组织管理员,或从其他 Bitwarden 账户注册。" @@ -3576,16 +3594,16 @@ "message": "非所有者或管理员并且已是其他组织成员的组织成员将从您的组织中移除。" }, "requireSso": { - "message": "单点登录身份验证" + "message": "要求单点登录(SSO)验证" }, "requireSsoPolicyDesc": { - "message": "要求用户使用企业单点登录方式登录。" + "message": "要求成员使用企业单点登录方式登录。" }, "prerequisite": { "message": "先决条件" }, "requireSsoPolicyReq": { - "message": "启用此策略前,需先启用「单一组织」企业策略。" + "message": "激活此策略前,需先启用「单一组织」企业策略。" }, "requireSsoPolicyReqError": { "message": "单一组织策略未启用。" @@ -3880,10 +3898,10 @@ } }, "personalOwnership": { - "message": "个人所有权" + "message": "移除个人密码库" }, "personalOwnershipPolicyDesc": { - "message": "通过移除个人所有权选项,要求用户将密码库项目保存到组织。" + "message": "通过禁用个人密码库选项,要求成员将项目保存到组织。" }, "personalOwnershipExemption": { "message": "组织的所有者和管理员豁免此策略。" @@ -3895,7 +3913,7 @@ "message": "禁用 Send" }, "disableSendPolicyDesc": { - "message": "不允许用户创建和编辑 Bitwarden Send。但允许删除现有的 Send。", + "message": "不允许成员创建或编辑 Send。", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "disableSendExemption": { @@ -3921,7 +3939,7 @@ "message": "可以管理组织策略的组织用户豁免此策略的执行。" }, "disableHideEmail": { - "message": "不允许用户在创建或编辑 Send 时隐藏他们的电子邮件地址。", + "message": "在创建或编辑 Send 时始终显示成员的电子邮件地址。", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendOptionsPolicyInEffect": { @@ -4220,7 +4238,7 @@ "message": "主密码重置" }, "resetPasswordPolicyDescription": { - "message": "允许组织管理员重置组织用户的主密码。" + "message": "允许管理员重置成员的主密码。" }, "resetPasswordPolicyWarning": { "message": "组织中的用户自行注册或被自动注册后,管理员才能重置他们的主密码。" @@ -4467,7 +4485,7 @@ "message": "密码库超时时间" }, "maximumVaultTimeoutDesc": { - "message": "为所有用户配置最大密码库超时时间。" + "message": "为成员配置最大密码库超时时间。" }, "maximumVaultTimeoutLabel": { "message": "最大密码库超时时间" @@ -4510,7 +4528,7 @@ "message": "禁用个人密码库导出" }, "disablePersonalVaultExportDesc": { - "message": "禁止用户导出个人密码库数据。" + "message": "不允许成员导出他们的个人密码库数据。" }, "vaultExportDisabled": { "message": "密码库导出已禁用" @@ -4801,19 +4819,19 @@ "message": "设置后,您的配置将被保存,成员将能够使用他们的身份提供程序凭据进行身份验证。" }, "ssoPolicyHelpStart": { - "message": "启用", - "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Enable the SSO Authentication policy to require all members to log in with SSO.'" + "message": "使用", + "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Use the require single-sign-on authentication policy to require all members to log in with SSO.'" }, "ssoPolicyHelpLink": { "message": "SSO 身份验证策略", - "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Enable the SSO Authentication policy to require all members to log in with SSO.'" + "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Use the require single-sign-on authentication policy to require all members to log in with SSO.'" }, "ssoPolicyHelpEnd": { "message": "将要求所有会员使用 SSO 登录。", - "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Enable the SSO Authentication policy to require all members to log in with SSO.'" + "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Use the require single-sign-on authentication policy to require all members to log in with SSO.'" }, "ssoPolicyHelpKeyConnector": { - "message": "需要先设置 Key Connector 解密,然后才能启用 SSO 身份验证和单一组织策略。" + "message": "设置 Key Connector 解密之前,需要先启用 SSO 身份验证和单一组织策略。" }, "memberDecryptionOption": { "message": "成员解密选项" @@ -5165,5 +5183,35 @@ "example": "My Email" } } + }, + "inputRequired": { + "message": "必须输入内容。" + }, + "inputEmail": { + "message": "输入的不是电子邮件地址。" + }, + "inputMinLength": { + "message": "至少输入 $COUNT$ 个字符。", + "placeholders": { + "count": { + "content": "$1", + "example": "8" + } + } + }, + "fieldsNeedAttention": { + "message": "上面的 $COUNT$ 个字段需要您注意。", + "placeholders": { + "count": { + "content": "$1", + "example": "4" + } + } + }, + "turnOn": { + "message": "打开" + }, + "on": { + "message": "开启" } } diff --git a/apps/web/src/locales/zh_TW/messages.json b/apps/web/src/locales/zh_TW/messages.json index 02b8c47d376..1b44cf91025 100644 --- a/apps/web/src/locales/zh_TW/messages.json +++ b/apps/web/src/locales/zh_TW/messages.json @@ -572,6 +572,9 @@ "createAccount": { "message": "建立帳戶" }, + "startTrial": { + "message": "立即試用" + }, "logIn": { "message": "登入" }, @@ -593,6 +596,9 @@ "masterPassDesc": { "message": "主密碼是用於存取密碼庫的密碼。它非常重要,請您不要忘記它。若您忘記了主密碼,沒有任何方法能將其復原。" }, + "masterPassImportant": { + "message": "如果您忘記主密碼,沒有復原的方法!" + }, "masterPassHintDesc": { "message": "主密碼提示可以在您忘記主密碼時幫助您回憶主密碼。" }, @@ -623,10 +629,13 @@ "invalidEmail": { "message": "無效的電子郵件地址。" }, - "masterPassRequired": { - "message": "必須填入主密碼。" + "masterPasswordRequired": { + "message": "必須填寫主密碼。" }, - "masterPassLength": { + "confirmMasterPasswordRequired": { + "message": "必須再次輸入主密碼。" + }, + "masterPasswordMinLength": { "message": "主密碼需要至少 8 個字元。" }, "masterPassDoesntMatch": { @@ -1067,7 +1076,7 @@ "message": "刪除帳戶" }, "deleteAccountDesc": { - "message": "接下來的操作將刪除您的帳戶及所有相關資料。" + "message": "接下來的操作將刪除您的帳戶及所有密碼庫資料。" }, "deleteAccountWarning": { "message": "刪除您的帳戶是永久性的。並且無法復原。" @@ -1076,7 +1085,7 @@ "message": "已刪除帳戶" }, "accountDeletedDesc": { - "message": "您的帳戶已經關閉,所有關聯的資料已經被刪除。" + "message": "您的 Bitwarden 帳戶和密碼庫資料已被永久刪除。" }, "myAccount": { "message": "我的帳戶" @@ -1165,7 +1174,7 @@ "message": "載入 gravatar.com 上的頭像圖片。" }, "enableFullWidth": { - "message": "顯示全寬度版面配置", + "message": "顯示全寬度佈局", "description": "Allows scaling the web vault UI's width" }, "enableFullWidthDesc": { @@ -3159,7 +3168,7 @@ "acceptPolicies": { "message": "一旦核取此方塊,即表示您同意下列條款:" }, - "acceptPoliciesError": { + "acceptPoliciesRequired": { "message": "尚未接受服務條款與隱私權政策。" }, "termsOfService": { @@ -3209,6 +3218,9 @@ "organizationIsDisabled": { "message": "已停用組織。" }, + "disabledOrganizationFilterError": { + "message": "無法存取已停用組織中的項目。請聯絡您組織的所有者以獲取協助。" + }, "licenseIsExpired": { "message": "授權已逾期。" }, @@ -3333,20 +3345,26 @@ "clone": { "message": "複製" }, + "masterPassPolicyTitle": { + "message": "主密碼要求" + }, "masterPassPolicyDesc": { - "message": "設定對主密碼強度的最低要求。" + "message": "設定主密碼強度要求。" + }, + "twoStepLoginPolicyTitle": { + "message": "需要兩步驟登入" }, "twoStepLoginPolicyDesc": { - "message": "要求使用者對個人帳戶設定兩步驟登入。" + "message": "要求成員設定兩步驟登入。" }, "twoStepLoginPolicyWarning": { - "message": "非擁有者或管理員,並且其個人帳戶未啟用兩步驟登入的組織成員將從組織中移除,他們將收到一封關於此變更的電子郵件通知。" + "message": "非擁有者或管理員,並且其帳戶未啟用兩步驟登入的組織成員將從組織中移除,他們將收到一封關於此變更的電子郵件通知。" }, "twoStepLoginPolicyUserWarning": { "message": "您是組織成員,而組織要求您的使用者帳戶啟用兩步驟登入。如果停用所有兩步驟登入方式,您將被自動從這些組織移除。" }, "passwordGeneratorPolicyDesc": { - "message": "設定密碼產生器設定的最低要求。" + "message": "設定密碼產生器要求。" }, "passwordGeneratorPolicyInEffect": { "message": "一個或多個組織原則正影響密碼產生器設定。" @@ -3567,7 +3585,7 @@ "message": "單一組織" }, "singleOrgDesc": { - "message": "限制使用者加入任何其他組織。" + "message": "限制成員加入其他組織。" }, "singleOrgBlockCreateMessage": { "message": "您目前的組織原則不允許您加入多個組織。請聯絡您的組織管理員或從其他 Bitwarden 帳戶註冊。" @@ -3576,7 +3594,7 @@ "message": "不是擁有者或管理員並且已經是其他組織的成員的組織成員將從您的組織中移除。" }, "requireSso": { - "message": "單一登入驗證" + "message": "要求單一登入認證" }, "requireSsoPolicyDesc": { "message": "要求使用者以企業單一登入方法登入。" @@ -3895,7 +3913,7 @@ "message": "停用 Send" }, "disableSendPolicyDesc": { - "message": "不允許使用者建立或編輯 Bitwarden Send。但允許刪除現有的 Send。", + "message": "不允許成員建立或編輯 Send。", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "disableSendExemption": { @@ -4467,7 +4485,7 @@ "message": "密碼庫逾時時間" }, "maximumVaultTimeoutDesc": { - "message": "為所有使用者設定最大密碼庫逾時時間。" + "message": "為成員設定最大密碼庫逾時時間。" }, "maximumVaultTimeoutLabel": { "message": "最大密碼庫逾時時間" @@ -4510,7 +4528,7 @@ "message": "停用個人密碼庫匯出" }, "disablePersonalVaultExportDesc": { - "message": "禁止使用者匯出個人密碼庫資料。" + "message": "禁止成員匯出個人密碼庫資料。" }, "vaultExportDisabled": { "message": "已停用密碼庫匯出" @@ -4801,16 +4819,16 @@ "message": "設定後,您的設定將被儲存,成員將可以使用他們的識別提供者憑證進行身分驗證。" }, "ssoPolicyHelpStart": { - "message": "啟用", - "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Enable the SSO Authentication policy to require all members to log in with SSO.'" + "message": "使用", + "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Use the require single-sign-on authentication policy to require all members to log in with SSO.'" }, "ssoPolicyHelpLink": { - "message": "SSO 驗證原則", - "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Enable the SSO Authentication policy to require all members to log in with SSO.'" + "message": "要求 SSO 驗證原則", + "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Use the require single-sign-on authentication policy to require all members to log in with SSO.'" }, "ssoPolicyHelpEnd": { "message": "將要求所有成員皆使用 SSO 登入。", - "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Enable the SSO Authentication policy to require all members to log in with SSO.'" + "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Use the require single-sign-on authentication policy to require all members to log in with SSO.'" }, "ssoPolicyHelpKeyConnector": { "message": "SSO 驗證及單一組織原則需要先設定 Key Connector 解密方式後才能啟用。" @@ -5165,5 +5183,35 @@ "example": "My Email" } } + }, + "inputRequired": { + "message": "必須輸入內容。" + }, + "inputEmail": { + "message": "輸入的不是電子郵件地址。" + }, + "inputMinLength": { + "message": "必須輸入至少 $COUNT$ 個字元。", + "placeholders": { + "count": { + "content": "$1", + "example": "8" + } + } + }, + "fieldsNeedAttention": { + "message": "您需注意上方的 $COUNT$ 個欄位。", + "placeholders": { + "count": { + "content": "$1", + "example": "4" + } + } + }, + "turnOn": { + "message": "打開" + }, + "on": { + "message": "開啟" } } diff --git a/apps/web/src/scss/buttons.scss b/apps/web/src/scss/buttons.scss index 6713a97abe1..9c854806cb7 100644 --- a/apps/web/src/scss/buttons.scss +++ b/apps/web/src/scss/buttons.scss @@ -202,52 +202,3 @@ button.no-btn { color: inherit; } } - -.badge-primary { - @include themify($themes) { - background-color: themed("badgePrimaryBackground"); - color: themed("badgePrimaryText"); - } - - &:hover { - @include themify($themes) { - background-color: themed("badgePrimaryBackgroundHover"); - color: themed("badgePrimaryText"); - } - } -} - -.badge-secondary { - @include themify($themes) { - background-color: themed("badgeSecondaryBackground"); - color: themed("badgeSecondaryText"); - } -} - -.badge-info { - @include themify($themes) { - background-color: themed("badgeInfoBackground"); - color: themed("badgeInfoText"); - } -} - -.badge-danger { - @include themify($themes) { - background-color: themed("badgeDangerBackground"); - color: themed("badgeDangerText"); - } -} - -.badge-warning { - @include themify($themes) { - background-color: themed("warning"); - color: themed("textWarningColor"); - } -} - -.badge-success { - @include themify($themes) { - background-color: themed("success"); - color: themed("textSuccessColor"); - } -} diff --git a/apps/web/src/scss/styles.scss b/apps/web/src/scss/styles.scss index d218ee1d763..dc1c740b4b2 100644 --- a/apps/web/src/scss/styles.scss +++ b/apps/web/src/scss/styles.scss @@ -21,25 +21,24 @@ @import "~bootstrap/scss/_dropdown"; @import "~bootstrap/scss/_button-group"; @import "~bootstrap/scss/_input-group"; -@import "~bootstrap/scss/_custom-forms"; +// @import "~bootstrap/scss/_custom-forms"; @import "~bootstrap/scss/_nav"; @import "~bootstrap/scss/_navbar"; @import "~bootstrap/scss/_card"; -@import "~bootstrap/scss/_breadcrumb"; -@import "~bootstrap/scss/_pagination"; -@import "~bootstrap/scss/_badge"; -@import "~bootstrap/scss/_jumbotron"; -@import "~bootstrap/scss/_alert"; +// @import "~bootstrap/scss/_breadcrumb"; +// @import "~bootstrap/scss/_pagination"; +// @import "~bootstrap/scss/_jumbotron"; +// @import "~bootstrap/scss/_alert"; @import "~bootstrap/scss/_progress"; -@import "~bootstrap/scss/_media"; +// @import "~bootstrap/scss/_media"; @import "~bootstrap/scss/_list-group"; @import "~bootstrap/scss/_close"; //@import "~bootstrap/scss/_toasts"; @import "~bootstrap/scss/_modal"; @import "~bootstrap/scss/_tooltip"; @import "~bootstrap/scss/_popover"; -@import "~bootstrap/scss/_carousel"; -@import "~bootstrap/scss/_spinners"; +// @import "~bootstrap/scss/_carousel"; +// @import "~bootstrap/scss/_spinners"; @import "~bootstrap/scss/_utilities"; @import "~bootstrap/scss/_print"; diff --git a/apps/web/src/utils/flags.ts b/apps/web/src/utils/flags.ts new file mode 100644 index 00000000000..5e7671e8b37 --- /dev/null +++ b/apps/web/src/utils/flags.ts @@ -0,0 +1,20 @@ +export type Flags = { + showTrial?: boolean; + scim?: boolean; +}; + +export type FlagName = keyof Flags; + +export function flagEnabled(flag: FlagName): boolean { + return flags()[flag] == null || flags()[flag]; +} + +function flags(): Flags { + const envFlags = process.env.FLAGS as string | Flags; + + if (typeof envFlags === "string") { + return JSON.parse(envFlags) as Flags; + } else { + return envFlags as Flags; + } +} diff --git a/apps/web/webpack.config.js b/apps/web/webpack.config.js index 4aae92a2ebd..65caccc1cb4 100644 --- a/apps/web/webpack.config.js +++ b/apps/web/webpack.config.js @@ -151,6 +151,7 @@ const plugins = [ STRIPE_KEY: envConfig["stripeKey"] ?? "", BRAINTREE_KEY: envConfig["braintreeKey"] ?? "", PAYPAL_CONFIG: envConfig["paypal"] ?? {}, + FLAGS: envConfig["flags"] ?? {}, }), new webpack.ProvidePlugin({ process: "process/browser", diff --git a/bitwarden_license/bit-web/src/app/organizations/manage/scim.component.html b/bitwarden_license/bit-web/src/app/organizations/manage/scim.component.html new file mode 100644 index 00000000000..54fe44e073c --- /dev/null +++ b/bitwarden_license/bit-web/src/app/organizations/manage/scim.component.html @@ -0,0 +1,87 @@ + + +

    {{ "scimDescription" | i18n }}

    + +
    + + {{ "loading" | i18n }} +
    + +
    +
    + + +
    + {{ "scimEnabledCheckboxDescHelpText" | i18n }} +
    +
    +
    + + + {{ "scimUrl" | i18n }} + + + + + + {{ "scimApiKey" | i18n }} + + + + + + {{ "scimApiKeyHelperText" | i18n }} + + + + {{ "save" | i18n }} + + diff --git a/bitwarden_license/bit-web/src/app/organizations/manage/scim.component.ts b/bitwarden_license/bit-web/src/app/organizations/manage/scim.component.ts new file mode 100644 index 00000000000..26c93af18a1 --- /dev/null +++ b/bitwarden_license/bit-web/src/app/organizations/manage/scim.component.ts @@ -0,0 +1,161 @@ +import { Component, OnInit } from "@angular/core"; +import { FormBuilder, FormControl } from "@angular/forms"; +import { ActivatedRoute } from "@angular/router"; + +import { ApiService } from "@bitwarden/common/abstractions/api.service"; +import { EnvironmentService } from "@bitwarden/common/abstractions/environment.service"; +import { I18nService } from "@bitwarden/common/abstractions/i18n.service"; +import { PlatformUtilsService } from "@bitwarden/common/abstractions/platformUtils.service"; +import { OrganizationApiKeyType } from "@bitwarden/common/enums/organizationApiKeyType"; +import { OrganizationConnectionType } from "@bitwarden/common/enums/organizationConnectionType"; +import { ScimConfigApi } from "@bitwarden/common/models/api/scimConfigApi"; +import { OrganizationApiKeyRequest } from "@bitwarden/common/models/request/organizationApiKeyRequest"; +import { OrganizationConnectionRequest } from "@bitwarden/common/models/request/organizationConnectionRequest"; +import { ScimConfigRequest } from "@bitwarden/common/models/request/scimConfigRequest"; +import { OrganizationConnectionResponse } from "@bitwarden/common/models/response/organizationConnectionResponse"; + +@Component({ + selector: "app-org-manage-scim", + templateUrl: "scim.component.html", +}) +export class ScimComponent implements OnInit { + loading = true; + organizationId: string; + existingConnectionId: string; + formPromise: Promise; + rotatePromise: Promise; + enabled = new FormControl(false); + showScimSettings = false; + + formData = this.formBuilder.group({ + endpointUrl: new FormControl({ value: "", disabled: true }), + clientSecret: new FormControl({ value: "", disabled: true }), + }); + + constructor( + private formBuilder: FormBuilder, + private route: ActivatedRoute, + private apiService: ApiService, + private platformUtilsService: PlatformUtilsService, + private i18nService: I18nService, + private environmentService: EnvironmentService + ) {} + + async ngOnInit() { + this.route.parent.parent.params.subscribe(async (params) => { + this.organizationId = params.organizationId; + await this.load(); + }); + } + + async load() { + const connection = await this.apiService.getOrganizationConnection( + this.organizationId, + OrganizationConnectionType.Scim, + ScimConfigApi + ); + await this.setConnectionFormValues(connection); + } + + async loadApiKey() { + const apiKeyRequest = new OrganizationApiKeyRequest(); + apiKeyRequest.type = OrganizationApiKeyType.Scim; + apiKeyRequest.masterPasswordHash = "N/A"; + const apiKeyResponse = await this.apiService.postOrganizationApiKey( + this.organizationId, + apiKeyRequest + ); + this.formData.setValue({ + endpointUrl: this.getScimEndpointUrl(), + clientSecret: apiKeyResponse.apiKey, + }); + } + + async copyScimUrl() { + this.platformUtilsService.copyToClipboard(this.getScimEndpointUrl()); + } + + async rotateScimKey() { + const confirmed = await this.platformUtilsService.showDialog( + this.i18nService.t("rotateScimKeyWarning"), + this.i18nService.t("rotateScimKey"), + this.i18nService.t("rotateKey"), + this.i18nService.t("cancel"), + "warning" + ); + if (!confirmed) { + return false; + } + + const request = new OrganizationApiKeyRequest(); + request.type = OrganizationApiKeyType.Scim; + request.masterPasswordHash = "N/A"; + + this.rotatePromise = this.apiService.postOrganizationRotateApiKey(this.organizationId, request); + + try { + const response = await this.rotatePromise; + this.formData.setValue({ + endpointUrl: this.getScimEndpointUrl(), + clientSecret: response.apiKey, + }); + this.platformUtilsService.showToast("success", null, this.i18nService.t("scimApiKeyRotated")); + } catch { + // Logged by appApiAction, do nothing + } + + this.rotatePromise = null; + } + + async copyScimKey() { + this.platformUtilsService.copyToClipboard(this.formData.get("clientSecret").value); + } + + async submit() { + try { + const request = new OrganizationConnectionRequest( + this.organizationId, + OrganizationConnectionType.Scim, + true, + new ScimConfigRequest(this.enabled.value) + ); + if (this.existingConnectionId == null) { + this.formPromise = this.apiService.createOrganizationConnection(request, ScimConfigApi); + } else { + this.formPromise = this.apiService.updateOrganizationConnection( + request, + ScimConfigApi, + this.existingConnectionId + ); + } + const response = (await this.formPromise) as OrganizationConnectionResponse; + await this.setConnectionFormValues(response); + this.platformUtilsService.showToast("success", null, this.i18nService.t("scimSettingsSaved")); + } catch (e) { + // Logged by appApiAction, do nothing + } + + this.formPromise = null; + } + + getScimEndpointUrl() { + return this.environmentService.getScimUrl() + "/" + this.organizationId; + } + + private async setConnectionFormValues(connection: OrganizationConnectionResponse) { + this.existingConnectionId = connection?.id; + if (connection !== null && connection.config?.enabled) { + this.showScimSettings = true; + this.enabled.setValue(true); + this.formData.setValue({ + endpointUrl: this.getScimEndpointUrl(), + clientSecret: "", + }); + await this.loadApiKey(); + } else { + this.showScimSettings = false; + this.enabled.setValue(false); + } + this.loading = false; + } +} diff --git a/bitwarden_license/bit-web/src/app/organizations/organizations-routing.module.ts b/bitwarden_license/bit-web/src/app/organizations/organizations-routing.module.ts index 0052f0d67b2..1bfd51b7d30 100644 --- a/bitwarden_license/bit-web/src/app/organizations/organizations-routing.module.ts +++ b/bitwarden_license/bit-web/src/app/organizations/organizations-routing.module.ts @@ -9,6 +9,7 @@ import { OrganizationLayoutComponent } from "src/app/organizations/layouts/organ import { ManageComponent } from "src/app/organizations/manage/manage.component"; import { NavigationPermissionsService } from "src/app/organizations/services/navigation-permissions.service"; +import { ScimComponent } from "./manage/scim.component"; import { SsoComponent } from "./manage/sso.component"; const routes: Routes = [ @@ -33,6 +34,14 @@ const routes: Routes = [ permissions: [Permissions.ManageSso], }, }, + { + path: "scim", + component: ScimComponent, + canActivate: [PermissionsGuard], + data: { + permissions: [Permissions.ManageScim], + }, + }, ], }, ], diff --git a/bitwarden_license/bit-web/src/app/organizations/organizations.module.ts b/bitwarden_license/bit-web/src/app/organizations/organizations.module.ts index 0833e2ef9d5..1e9876b2877 100644 --- a/bitwarden_license/bit-web/src/app/organizations/organizations.module.ts +++ b/bitwarden_license/bit-web/src/app/organizations/organizations.module.ts @@ -2,12 +2,13 @@ import { CommonModule } from "@angular/common"; import { NgModule } from "@angular/core"; import { FormsModule, ReactiveFormsModule } from "@angular/forms"; -import { JslibModule } from "@bitwarden/angular/jslib.module"; +import { SharedModule } from "src/app/modules/shared.module"; import { InputCheckboxComponent } from "./components/input-checkbox.component"; import { InputTextReadOnlyComponent } from "./components/input-text-readonly.component"; import { InputTextComponent } from "./components/input-text.component"; import { SelectComponent } from "./components/select.component"; +import { ScimComponent } from "./manage/scim.component"; import { SsoComponent } from "./manage/sso.component"; import { OrganizationsRoutingModule } from "./organizations-routing.module"; @@ -18,7 +19,7 @@ import { OrganizationsRoutingModule } from "./organizations-routing.module"; CommonModule, FormsModule, ReactiveFormsModule, - JslibModule, + SharedModule, OrganizationsRoutingModule, ], declarations: [ @@ -27,6 +28,7 @@ import { OrganizationsRoutingModule } from "./organizations-routing.module"; InputTextReadOnlyComponent, SelectComponent, SsoComponent, + ScimComponent, ], }) export class OrganizationsModule {} diff --git a/bitwarden_license/bit-web/src/app/policies/disable-personal-vault-export.component.html b/bitwarden_license/bit-web/src/app/policies/disable-personal-vault-export.component.html index 317a9c8f1d4..3db81efc48a 100644 --- a/bitwarden_license/bit-web/src/app/policies/disable-personal-vault-export.component.html +++ b/bitwarden_license/bit-web/src/app/policies/disable-personal-vault-export.component.html @@ -7,6 +7,6 @@ [formControl]="enabled" name="Enabled" /> - +
    diff --git a/bitwarden_license/bit-web/src/app/policies/maximum-vault-timeout.component.html b/bitwarden_license/bit-web/src/app/policies/maximum-vault-timeout.component.html index 344cf009ec0..c2c42718e2f 100644 --- a/bitwarden_license/bit-web/src/app/policies/maximum-vault-timeout.component.html +++ b/bitwarden_license/bit-web/src/app/policies/maximum-vault-timeout.component.html @@ -11,7 +11,7 @@ [formControl]="enabled" name="Enabled" /> - +
    diff --git a/bitwarden_license/bit-web/src/app/providers/manage/bulk/bulk-remove.component.ts b/bitwarden_license/bit-web/src/app/providers/manage/bulk/bulk-remove.component.ts index bf2bb611187..3bc70541f08 100644 --- a/bitwarden_license/bit-web/src/app/providers/manage/bulk/bulk-remove.component.ts +++ b/bitwarden_license/bit-web/src/app/providers/manage/bulk/bulk-remove.component.ts @@ -15,4 +15,8 @@ export class BulkRemoveComponent extends OrganizationBulkRemoveComponent { const request = new ProviderUserBulkRequest(this.users.map((user) => user.id)); return await this.apiService.deleteManyProviderUsers(this.providerId, request); } + + protected get removeUsersWarning() { + return this.i18nService.t("removeUsersWarning"); + } } diff --git a/bitwarden_license/bit-web/src/app/providers/manage/people.component.html b/bitwarden_license/bit-web/src/app/providers/manage/people.component.html index 884a6bafb13..0171948e5b0 100644 --- a/bitwarden_license/bit-web/src/app/providers/manage/people.component.html +++ b/bitwarden_license/bit-web/src/app/providers/manage/people.component.html @@ -9,7 +9,7 @@ (click)="filter(null)" > {{ "all" | i18n }} - {{ allCount }} + {{ allCount }}
    @@ -137,10 +135,10 @@
    {{ u.email }} - {{ + {{ "invited" | i18n }} - {{ + {{ "accepted" | i18n }} {{ u.name }} diff --git a/libs/angular/src/components/add-edit.component.ts b/libs/angular/src/components/add-edit.component.ts index aa6ec4aee14..da7862cc017 100644 --- a/libs/angular/src/components/add-edit.component.ts +++ b/libs/angular/src/components/add-edit.component.ts @@ -1,10 +1,11 @@ import { Directive, EventEmitter, Input, OnInit, Output } from "@angular/core"; +import { Observable } from "rxjs"; import { AuditService } from "@bitwarden/common/abstractions/audit.service"; import { CipherService } from "@bitwarden/common/abstractions/cipher.service"; import { CollectionService } from "@bitwarden/common/abstractions/collection.service"; import { EventService } from "@bitwarden/common/abstractions/event.service"; -import { FolderService } from "@bitwarden/common/abstractions/folder.service"; +import { FolderService } from "@bitwarden/common/abstractions/folder/folder.service.abstraction"; import { I18nService } from "@bitwarden/common/abstractions/i18n.service"; import { LogService } from "@bitwarden/common/abstractions/log.service"; import { MessagingService } from "@bitwarden/common/abstractions/messaging.service"; @@ -51,7 +52,7 @@ export class AddEditComponent implements OnInit { editMode = false; cipher: CipherView; - folders: FolderView[]; + folders$: Observable; collections: CollectionView[] = []; title: string; formPromise: Promise; @@ -109,6 +110,7 @@ export class AddEditComponent implements OnInit { { name: "Maestro", value: "Maestro" }, { name: "UnionPay", value: "UnionPay" }, { name: "RuPay", value: "RuPay" }, + { name: i18nService.t("cardBrandMir"), value: "Mir" }, { name: i18nService.t("other"), value: "Other" }, ]; this.cardExpMonthOptions = [ @@ -243,7 +245,7 @@ export class AddEditComponent implements OnInit { } } - this.folders = await this.folderService.getAllDecrypted(); + this.folders$ = this.folderService.folderViews$; if (this.editMode && this.previousCipherId !== this.cipherId) { this.eventService.collect(EventType.Cipher_ClientViewed, this.cipherId); diff --git a/libs/angular/src/components/folder-add-edit.component.ts b/libs/angular/src/components/folder-add-edit.component.ts index 9668f372ecd..2558482c2da 100644 --- a/libs/angular/src/components/folder-add-edit.component.ts +++ b/libs/angular/src/components/folder-add-edit.component.ts @@ -1,6 +1,7 @@ import { Directive, EventEmitter, Input, OnInit, Output } from "@angular/core"; -import { FolderService } from "@bitwarden/common/abstractions/folder.service"; +import { FolderApiServiceAbstraction } from "@bitwarden/common/abstractions/folder/folder-api.service.abstraction"; +import { FolderService } from "@bitwarden/common/abstractions/folder/folder.service.abstraction"; import { I18nService } from "@bitwarden/common/abstractions/i18n.service"; import { LogService } from "@bitwarden/common/abstractions/log.service"; import { PlatformUtilsService } from "@bitwarden/common/abstractions/platformUtils.service"; @@ -20,6 +21,7 @@ export class FolderAddEditComponent implements OnInit { constructor( protected folderService: FolderService, + protected folderApiService: FolderApiServiceAbstraction, protected i18nService: I18nService, protected platformUtilsService: PlatformUtilsService, private logService: LogService @@ -41,7 +43,7 @@ export class FolderAddEditComponent implements OnInit { try { const folder = await this.folderService.encrypt(this.folder); - this.formPromise = this.folderService.saveWithServer(folder); + this.formPromise = this.folderApiService.save(folder); await this.formPromise; this.platformUtilsService.showToast( "success", @@ -70,7 +72,7 @@ export class FolderAddEditComponent implements OnInit { } try { - this.deletePromise = this.folderService.deleteWithServer(this.folder.id); + this.deletePromise = this.folderApiService.delete(this.folder.id); await this.deletePromise; this.platformUtilsService.showToast("success", null, this.i18nService.t("deletedFolder")); this.onDeletedFolder.emit(this.folder); diff --git a/libs/angular/src/components/icon.component.ts b/libs/angular/src/components/icon.component.ts index e715c57ec8d..0696649e1f9 100644 --- a/libs/angular/src/components/icon.component.ts +++ b/libs/angular/src/components/icon.component.ts @@ -20,6 +20,7 @@ const cardIcons: Record = { Maestro: "card-maestro", UnionPay: "card-union-pay", RuPay: "card-ru-pay", + Mir: "card-mir", }; @Component({ diff --git a/libs/angular/src/components/register.component.ts b/libs/angular/src/components/register.component.ts index 3f5339c9165..bdfc45fcc1a 100644 --- a/libs/angular/src/components/register.component.ts +++ b/libs/angular/src/components/register.component.ts @@ -1,16 +1,23 @@ -import { Directive, OnInit } from "@angular/core"; +import { Directive, EventEmitter, Input, OnInit, Output } from "@angular/core"; +import { AbstractControl, FormBuilder, ValidatorFn, Validators } from "@angular/forms"; import { Router } from "@angular/router"; +import { InputsFieldMatch } from "@bitwarden/angular/validators/inputsFieldMatch.validator"; import { ApiService } from "@bitwarden/common/abstractions/api.service"; import { AuthService } from "@bitwarden/common/abstractions/auth.service"; import { CryptoService } from "@bitwarden/common/abstractions/crypto.service"; import { EnvironmentService } from "@bitwarden/common/abstractions/environment.service"; +import { + AllValidationErrors, + FormValidationErrorsService, +} from "@bitwarden/common/abstractions/formValidationErrors.service"; import { I18nService } from "@bitwarden/common/abstractions/i18n.service"; import { LogService } from "@bitwarden/common/abstractions/log.service"; import { PasswordGenerationService } from "@bitwarden/common/abstractions/passwordGeneration.service"; import { PlatformUtilsService } from "@bitwarden/common/abstractions/platformUtils.service"; import { StateService } from "@bitwarden/common/abstractions/state.service"; import { DEFAULT_KDF_ITERATIONS, DEFAULT_KDF_TYPE } from "@bitwarden/common/enums/kdfType"; +import { PasswordLogInCredentials } from "@bitwarden/common/models/domain/logInCredentials"; import { KeysRequest } from "@bitwarden/common/models/request/keysRequest"; import { ReferenceEventRequest } from "@bitwarden/common/models/request/referenceEventRequest"; import { RegisterRequest } from "@bitwarden/common/models/request/registerRequest"; @@ -19,22 +26,48 @@ import { CaptchaProtectedComponent } from "./captchaProtected.component"; @Directive() export class RegisterComponent extends CaptchaProtectedComponent implements OnInit { - name = ""; - email = ""; - masterPassword = ""; - confirmMasterPassword = ""; - hint = ""; + @Input() isInTrialFlow = false; + @Output() createdAccount = new EventEmitter(); + showPassword = false; formPromise: Promise; masterPasswordScore: number; referenceData: ReferenceEventRequest; showTerms = true; - acceptPolicies = false; + showErrorSummary = false; + + formGroup = this.formBuilder.group( + { + email: ["", [Validators.required, Validators.email]], + name: [""], + masterPassword: ["", [Validators.required, Validators.minLength(8)]], + confirmMasterPassword: ["", [Validators.required, Validators.minLength(8)]], + hint: [ + null, + [ + InputsFieldMatch.validateInputsDoesntMatch( + "masterPassword", + this.i18nService.t("hintEqualsPassword") + ), + ], + ], + acceptPolicies: [false, [this.acceptPoliciesValidation()]], + }, + { + validator: InputsFieldMatch.validateFormInputsMatch( + "masterPassword", + "confirmMasterPassword", + this.i18nService.t("masterPassDoesntMatch") + ), + } + ); protected successRoute = "login"; private masterPasswordStrengthTimeout: any; constructor( + protected formValidationErrorService: FormValidationErrorsService, + protected formBuilder: FormBuilder, protected authService: AuthService, protected router: Router, i18nService: I18nService, @@ -84,59 +117,38 @@ export class RegisterComponent extends CaptchaProtectedComponent implements OnIn } } - async submit() { - if (!this.acceptPolicies && this.showTerms) { + async submit(showToast = true) { + let email = this.formGroup.get("email")?.value; + let name = this.formGroup.get("name")?.value; + const masterPassword = this.formGroup.get("masterPassword")?.value; + const hint = this.formGroup.get("hint")?.value; + + this.formGroup.markAllAsTouched(); + this.showErrorSummary = true; + + if (this.formGroup.get("acceptPolicies").hasError("required")) { this.platformUtilsService.showToast( "error", this.i18nService.t("errorOccurred"), - this.i18nService.t("acceptPoliciesError") + this.i18nService.t("acceptPoliciesRequired") ); return; } - if (this.email == null || this.email === "") { - this.platformUtilsService.showToast( - "error", - this.i18nService.t("errorOccurred"), - this.i18nService.t("emailRequired") - ); + //web + if (this.formGroup.invalid && !showToast) { return; } - if (this.email.indexOf("@") === -1) { - this.platformUtilsService.showToast( - "error", - this.i18nService.t("errorOccurred"), - this.i18nService.t("invalidEmail") - ); - return; - } - if (this.masterPassword == null || this.masterPassword === "") { - this.platformUtilsService.showToast( - "error", - this.i18nService.t("errorOccurred"), - this.i18nService.t("masterPassRequired") - ); - return; - } - if (this.masterPassword.length < 8) { - this.platformUtilsService.showToast( - "error", - this.i18nService.t("errorOccurred"), - this.i18nService.t("masterPassLength") - ); - return; - } - if (this.masterPassword !== this.confirmMasterPassword) { - this.platformUtilsService.showToast( - "error", - this.i18nService.t("errorOccurred"), - this.i18nService.t("masterPassDoesntMatch") - ); + + //desktop, browser + if (this.formGroup.invalid && showToast) { + const errorText = this.getErrorToastMessage(); + this.platformUtilsService.showToast("error", this.i18nService.t("errorOccurred"), errorText); return; } const strengthResult = this.passwordGenerationService.passwordStrength( - this.masterPassword, + masterPassword, this.getPasswordStrengthUserInput() ); if (strengthResult != null && strengthResult.score < 3) { @@ -152,33 +164,19 @@ export class RegisterComponent extends CaptchaProtectedComponent implements OnIn } } - if (this.hint === this.masterPassword) { - this.platformUtilsService.showToast( - "error", - this.i18nService.t("errorOccurred"), - this.i18nService.t("hintEqualsPassword") - ); - return; - } - - this.name = this.name === "" ? null : this.name; - this.email = this.email.trim().toLowerCase(); + name = name === "" ? null : name; + email = email.trim().toLowerCase(); const kdf = DEFAULT_KDF_TYPE; const kdfIterations = DEFAULT_KDF_ITERATIONS; - const key = await this.cryptoService.makeKey( - this.masterPassword, - this.email, - kdf, - kdfIterations - ); + const key = await this.cryptoService.makeKey(masterPassword, email, kdf, kdfIterations); const encKey = await this.cryptoService.makeEncKey(key); - const hashedPassword = await this.cryptoService.hashPassword(this.masterPassword, key); + const hashedPassword = await this.cryptoService.hashPassword(masterPassword, key); const keys = await this.cryptoService.makeKeyPair(encKey[0]); const request = new RegisterRequest( - this.email, - this.name, + email, + name, hashedPassword, - this.hint, + hint, encKey[1].encryptedString, kdf, kdfIterations, @@ -203,25 +201,49 @@ export class RegisterComponent extends CaptchaProtectedComponent implements OnIn throw e; } } - this.platformUtilsService.showToast("success", null, this.i18nService.t("newAccountCreated")); - this.router.navigate([this.successRoute], { queryParams: { email: this.email } }); + + if (this.isInTrialFlow) { + this.platformUtilsService.showToast( + "success", + null, + this.i18nService.t("trialAccountCreated") + ); + //login user here + const credentials = new PasswordLogInCredentials( + email, + masterPassword, + this.captchaToken, + null + ); + await this.authService.logIn(credentials); + + this.createdAccount.emit(this.formGroup.get("email")?.value); + } else { + this.platformUtilsService.showToast( + "success", + null, + this.i18nService.t("newAccountCreated") + ); + this.router.navigate([this.successRoute], { queryParams: { email: email } }); + } } catch (e) { this.logService.error(e); } } - togglePassword(confirmField: boolean) { + togglePassword() { this.showPassword = !this.showPassword; - document.getElementById(confirmField ? "masterPasswordRetype" : "masterPassword").focus(); } updatePasswordStrength() { + const masterPassword = this.formGroup.get("masterPassword")?.value; + if (this.masterPasswordStrengthTimeout != null) { clearTimeout(this.masterPasswordStrengthTimeout); } this.masterPasswordStrengthTimeout = setTimeout(() => { const strengthResult = this.passwordGenerationService.passwordStrength( - this.masterPassword, + masterPassword, this.getPasswordStrengthUserInput() ); this.masterPasswordScore = strengthResult == null ? null : strengthResult.score; @@ -230,19 +252,56 @@ export class RegisterComponent extends CaptchaProtectedComponent implements OnIn private getPasswordStrengthUserInput() { let userInput: string[] = []; - const atPosition = this.email.indexOf("@"); + const email = this.formGroup.get("email")?.value; + const name = this.formGroup.get("name").value; + const atPosition = email.indexOf("@"); if (atPosition > -1) { userInput = userInput.concat( - this.email + email .substr(0, atPosition) .trim() .toLowerCase() .split(/[^A-Za-z0-9]/) ); } - if (this.name != null && this.name !== "") { - userInput = userInput.concat(this.name.trim().toLowerCase().split(" ")); + if (name != null && name !== "") { + userInput = userInput.concat(name.trim().toLowerCase().split(" ")); } return userInput; } + + private getErrorToastMessage() { + const error: AllValidationErrors = this.formValidationErrorService + .getFormValidationErrors(this.formGroup.controls) + .shift(); + + if (error) { + switch (error.errorName) { + case "email": + return this.i18nService.t("invalidEmail"); + case "inputsDoesntMatchError": + return this.i18nService.t("masterPassDoesntMatch"); + case "inputsMatchError": + return this.i18nService.t("hintEqualsPassword"); + default: + return this.i18nService.t(this.errorTag(error)); + } + } + + return; + } + + private errorTag(error: AllValidationErrors): string { + const name = error.errorName.charAt(0).toUpperCase() + error.errorName.slice(1); + return `${error.controlName}${name}`; + } + + //validation would be ignored on selfhosted + private acceptPoliciesValidation(): ValidatorFn { + return (control: AbstractControl) => { + const ctrlValue = control.value; + + return !ctrlValue && this.showTerms ? { required: true } : null; + }; + } } diff --git a/libs/angular/src/components/set-password.component.ts b/libs/angular/src/components/set-password.component.ts index 9ae12b9ebb6..3db85a65475 100644 --- a/libs/angular/src/components/set-password.component.ts +++ b/libs/angular/src/components/set-password.component.ts @@ -128,6 +128,7 @@ export class SetPasswordComponent extends BaseChangePasswordComponent { ); const resetRequest = new OrganizationUserResetPasswordEnrollmentRequest(); + resetRequest.masterPasswordHash = masterPasswordHash; resetRequest.resetPasswordKey = encryptedKey.encryptedString; return this.apiService.putOrganizationUserResetPasswordEnrollment( diff --git a/libs/angular/src/images/cards/mir-dark.png b/libs/angular/src/images/cards/mir-dark.png new file mode 100644 index 00000000000..e158470db06 Binary files /dev/null and b/libs/angular/src/images/cards/mir-dark.png differ diff --git a/libs/angular/src/images/cards/mir-light.png b/libs/angular/src/images/cards/mir-light.png new file mode 100644 index 00000000000..e4997415205 Binary files /dev/null and b/libs/angular/src/images/cards/mir-light.png differ diff --git a/libs/angular/src/modules/vault-filter/components/collection-filter.component.ts b/libs/angular/src/modules/vault-filter/components/collection-filter.component.ts index ed35390daee..313db3f04c5 100644 --- a/libs/angular/src/modules/vault-filter/components/collection-filter.component.ts +++ b/libs/angular/src/modules/vault-filter/components/collection-filter.component.ts @@ -41,6 +41,7 @@ export class CollectionFilterComponent { applyFilter(collection: CollectionView) { this.activeFilter.resetFilter(); + this.activeFilter.selectedCollection = true; this.activeFilter.selectedCollectionId = collection.id; this.onFilterChange.emit(this.activeFilter); } diff --git a/libs/angular/src/modules/vault-filter/models/vault-filter.model.spec.ts b/libs/angular/src/modules/vault-filter/models/vault-filter.model.spec.ts new file mode 100644 index 00000000000..1c63481ab70 --- /dev/null +++ b/libs/angular/src/modules/vault-filter/models/vault-filter.model.spec.ts @@ -0,0 +1,237 @@ +import { CipherType } from "@bitwarden/common/enums/cipherType"; +import { CipherView } from "@bitwarden/common/models/view/cipherView"; + +import { VaultFilter } from "./vault-filter.model"; + +describe("VaultFilter", () => { + describe("filterFunction", () => { + describe("generic cipher", () => { + it("should return true when not filtering for anything specific", () => { + const cipher = createCipher(); + const filterFunction = createFilterFunction({ status: "all" }); + + const result = filterFunction(cipher); + + expect(result).toBe(true); + }); + }); + + describe("given a favorite cipher", () => { + const cipher = createCipher({ favorite: true }); + + it("should return true when filtering for favorites", () => { + const filterFunction = createFilterFunction({ status: "favorites" }); + + const result = filterFunction(cipher); + + expect(result).toBe(true); + }); + + it("should return false when filtering for trash", () => { + const filterFunction = createFilterFunction({ status: "trash" }); + + const result = filterFunction(cipher); + + expect(result).toBe(false); + }); + }); + + describe("given a deleted cipher", () => { + const cipher = createCipher({ deletedDate: new Date() }); + + it("should return true when filtering for trash", () => { + const filterFunction = createFilterFunction({ status: "trash" }); + + const result = filterFunction(cipher); + + expect(result).toBe(true); + }); + + it("should return false when filtering for favorites", () => { + const filterFunction = createFilterFunction({ status: "favorites" }); + + const result = filterFunction(cipher); + + expect(result).toBe(false); + }); + }); + + describe("given a cipher with type", () => { + it("should return true when filter matches cipher type", () => { + const cipher = createCipher({ type: CipherType.Identity }); + const filterFunction = createFilterFunction({ cipherType: CipherType.Identity }); + + const result = filterFunction(cipher); + + expect(result).toBe(true); + }); + + it("should return false when filter does not match cipher type", () => { + const cipher = createCipher({ type: CipherType.Card }); + const filterFunction = createFilterFunction({ cipherType: CipherType.Identity }); + + const result = filterFunction(cipher); + + expect(result).toBe(false); + }); + }); + + describe("given a cipher with folder id", () => { + it("should return true when filter matches folder id", () => { + const cipher = createCipher({ folderId: "folderId" }); + const filterFunction = createFilterFunction({ + selectedFolder: true, + selectedFolderId: "folderId", + }); + + const result = filterFunction(cipher); + + expect(result).toBe(true); + }); + + it("should return false when filter does not match folder id", () => { + const cipher = createCipher({ folderId: "folderId" }); + const filterFunction = createFilterFunction({ + selectedFolder: true, + selectedFolderId: "anotherFolderId", + }); + + const result = filterFunction(cipher); + + expect(result).toBe(false); + }); + }); + + describe("given a cipher without folder", () => { + const cipher = createCipher({ folderId: null }); + + it("should return true when filtering on unassigned folder", () => { + const filterFunction = createFilterFunction({ + selectedFolder: true, + selectedFolderId: null, + }); + + const result = filterFunction(cipher); + + expect(result).toBe(true); + }); + }); + + describe("given an organizational cipher (with organization and collections)", () => { + const cipher = createCipher({ + organizationId: "organizationId", + collectionIds: ["collectionId", "anotherId"], + }); + + it("should return true when filter matches collection id", () => { + const filterFunction = createFilterFunction({ + selectedCollection: true, + selectedCollectionId: "collectionId", + }); + + const result = filterFunction(cipher); + + expect(result).toBe(true); + }); + + it("should return false when filter does not match collection id", () => { + const filterFunction = createFilterFunction({ + selectedCollection: true, + selectedCollectionId: "nonMatchingId", + }); + + const result = filterFunction(cipher); + + expect(result).toBe(false); + }); + + it("should return false when filter does not match organization id", () => { + const filterFunction = createFilterFunction({ + selectedOrganizationId: "anotherOrganizationId", + }); + + const result = filterFunction(cipher); + + expect(result).toBe(false); + }); + + it("should return false when filtering for my vault only", () => { + const filterFunction = createFilterFunction({ + myVaultOnly: true, + }); + + const result = filterFunction(cipher); + + expect(result).toBe(false); + }); + }); + + describe("given an unassigned organizational cipher (with organization, without collection)", () => { + const cipher = createCipher({ organizationId: "organizationId", collectionIds: [] }); + + it("should return true when filtering for unassigned collection", () => { + const filterFunction = createFilterFunction({ + selectedCollection: true, + selectedCollectionId: null, + }); + + const result = filterFunction(cipher); + + expect(result).toBe(true); + }); + + it("should return true when filter matches organization id", () => { + const filterFunction = createFilterFunction({ + selectedOrganizationId: "organizationId", + }); + + const result = filterFunction(cipher); + + expect(result).toBe(true); + }); + }); + + describe("given an individual cipher (without organization or collection)", () => { + const cipher = createCipher({ organizationId: null, collectionIds: [] }); + + it("should return false when filtering for unassigned collection", () => { + const filterFunction = createFilterFunction({ + selectedCollection: true, + selectedCollectionId: null, + }); + + const result = filterFunction(cipher); + + expect(result).toBe(false); + }); + + it("should return true when filtering for my vault only", () => { + const cipher = createCipher({ organizationId: null }); + const filterFunction = createFilterFunction({ + myVaultOnly: true, + }); + + const result = filterFunction(cipher); + + expect(result).toBe(true); + }); + }); + }); +}); + +function createFilterFunction(options: Partial = {}) { + return new VaultFilter(options).buildFilter(); +} + +function createCipher(options: Partial = {}) { + const cipher = new CipherView(); + + cipher.favorite = options.favorite ?? false; + cipher.deletedDate = options.deletedDate; + cipher.type = options.type; + cipher.folderId = options.folderId; + cipher.collectionIds = options.collectionIds; + cipher.organizationId = options.organizationId; + + return cipher; +} diff --git a/libs/angular/src/modules/vault-filter/models/vault-filter.model.ts b/libs/angular/src/modules/vault-filter/models/vault-filter.model.ts index f28cd20336e..942704f1285 100644 --- a/libs/angular/src/modules/vault-filter/models/vault-filter.model.ts +++ b/libs/angular/src/modules/vault-filter/models/vault-filter.model.ts @@ -1,9 +1,13 @@ import { CipherType } from "@bitwarden/common/enums/cipherType"; +import { CipherView } from "@bitwarden/common/models/view/cipherView"; import { CipherStatus } from "./cipher-status.model"; +export type VaultFilterFunction = (cipher: CipherView) => boolean; + export class VaultFilter { cipherType?: CipherType; + selectedCollection = false; // This is needed because of how the "Unassigned" collection works. It has a null id. selectedCollectionId?: string; status?: CipherStatus; selectedFolder = false; // This is needed because of how the "No Folder" folder works. It has a null id. @@ -19,6 +23,7 @@ export class VaultFilter { resetFilter() { this.cipherType = null; this.status = null; + this.selectedCollection = false; this.selectedCollectionId = null; this.selectedFolder = false; this.selectedFolderId = null; @@ -29,4 +34,41 @@ export class VaultFilter { this.selectedOrganizationId = null; this.resetFilter(); } + + buildFilter(): VaultFilterFunction { + return (cipher) => { + let cipherPassesFilter = true; + if (this.status === "favorites" && cipherPassesFilter) { + cipherPassesFilter = cipher.favorite; + } + if (this.status === "trash" && cipherPassesFilter) { + cipherPassesFilter = cipher.isDeleted; + } + if (this.cipherType != null && cipherPassesFilter) { + cipherPassesFilter = cipher.type === this.cipherType; + } + if (this.selectedFolder && this.selectedFolderId == null && cipherPassesFilter) { + cipherPassesFilter = cipher.folderId == null; + } + if (this.selectedFolder && this.selectedFolderId != null && cipherPassesFilter) { + cipherPassesFilter = cipher.folderId === this.selectedFolderId; + } + if (this.selectedCollection && this.selectedCollectionId == null && cipherPassesFilter) { + cipherPassesFilter = + cipher.organizationId != null && + (cipher.collectionIds == null || cipher.collectionIds.length === 0); + } + if (this.selectedCollection && this.selectedCollectionId != null && cipherPassesFilter) { + cipherPassesFilter = + cipher.collectionIds != null && cipher.collectionIds.includes(this.selectedCollectionId); + } + if (this.selectedOrganizationId != null && cipherPassesFilter) { + cipherPassesFilter = cipher.organizationId === this.selectedOrganizationId; + } + if (this.myVaultOnly && cipherPassesFilter) { + cipherPassesFilter = cipher.organizationId === null; + } + return cipherPassesFilter; + }; + } } diff --git a/libs/angular/src/modules/vault-filter/vault-filter.component.ts b/libs/angular/src/modules/vault-filter/vault-filter.component.ts index b620ed82e2d..84396472efc 100644 --- a/libs/angular/src/modules/vault-filter/vault-filter.component.ts +++ b/libs/angular/src/modules/vault-filter/vault-filter.component.ts @@ -1,4 +1,5 @@ import { Directive, EventEmitter, Input, OnInit, Output } from "@angular/core"; +import { firstValueFrom, Observable } from "rxjs"; import { Organization } from "@bitwarden/common/models/domain/organization"; import { ITreeNodeObject } from "@bitwarden/common/models/domain/treeNode"; @@ -28,7 +29,7 @@ export class VaultFilterComponent implements OnInit { activePersonalOwnershipPolicy: boolean; activeSingleOrganizationPolicy: boolean; collections: DynamicTreeNode; - folders: DynamicTreeNode; + folders$: Observable>; constructor(protected vaultFilterService: VaultFilterService) {} @@ -45,7 +46,7 @@ export class VaultFilterComponent implements OnInit { this.activeSingleOrganizationPolicy = await this.vaultFilterService.checkForSingleOrganizationPolicy(); } - this.folders = await this.vaultFilterService.buildFolders(); + this.folders$ = await this.vaultFilterService.buildNestedFolders(); this.collections = await this.initCollections(); this.isLoaded = true; } @@ -67,13 +68,13 @@ export class VaultFilterComponent implements OnInit { async applyFilter(filter: VaultFilter) { if (filter.refreshCollectionsAndFolders) { await this.reloadCollectionsAndFolders(filter); - filter = this.pruneInvalidatedFilterSelections(filter); + filter = await this.pruneInvalidatedFilterSelections(filter); } this.onFilterChange.emit(filter); } async reloadCollectionsAndFolders(filter: VaultFilter) { - this.folders = await this.vaultFilterService.buildFolders(filter.selectedOrganizationId); + this.folders$ = await this.vaultFilterService.buildNestedFolders(filter.selectedOrganizationId); this.collections = filter.myVaultOnly ? null : await this.vaultFilterService.buildCollections(filter.selectedOrganizationId); @@ -95,14 +96,17 @@ export class VaultFilterComponent implements OnInit { this.onEditFolder.emit(folder); } - protected pruneInvalidatedFilterSelections(filter: VaultFilter): VaultFilter { - filter = this.pruneInvalidFolderSelection(filter); + protected async pruneInvalidatedFilterSelections(filter: VaultFilter): Promise { + filter = await this.pruneInvalidFolderSelection(filter); filter = this.pruneInvalidCollectionSelection(filter); return filter; } - protected pruneInvalidFolderSelection(filter: VaultFilter): VaultFilter { - if (filter.selectedFolder && !this.folders?.hasId(filter.selectedFolderId)) { + protected async pruneInvalidFolderSelection(filter: VaultFilter): Promise { + if ( + filter.selectedFolder && + !(await firstValueFrom(this.folders$))?.hasId(filter.selectedFolderId) + ) { filter.selectedFolder = false; filter.selectedFolderId = null; } @@ -111,9 +115,12 @@ export class VaultFilterComponent implements OnInit { protected pruneInvalidCollectionSelection(filter: VaultFilter): VaultFilter { if ( - filter.selectedCollectionId != null && - !this.collections?.hasId(filter.selectedCollectionId) + filter.myVaultOnly || + (filter.selectedCollection && + filter.selectedCollectionId != null && + !this.collections?.hasId(filter.selectedCollectionId)) ) { + filter.selectedCollection = false; filter.selectedCollectionId = null; } return filter; diff --git a/libs/angular/src/modules/vault-filter/vault-filter.service.ts b/libs/angular/src/modules/vault-filter/vault-filter.service.ts index ea5f52ee909..38757d042c8 100644 --- a/libs/angular/src/modules/vault-filter/vault-filter.service.ts +++ b/libs/angular/src/modules/vault-filter/vault-filter.service.ts @@ -1,18 +1,23 @@ import { Injectable } from "@angular/core"; +import { firstValueFrom, from, mergeMap, Observable } from "rxjs"; import { CipherService } from "@bitwarden/common/abstractions/cipher.service"; import { CollectionService } from "@bitwarden/common/abstractions/collection.service"; -import { FolderService } from "@bitwarden/common/abstractions/folder.service"; +import { FolderService } from "@bitwarden/common/abstractions/folder/folder.service.abstraction"; import { OrganizationService } from "@bitwarden/common/abstractions/organization.service"; import { PolicyService } from "@bitwarden/common/abstractions/policy.service"; import { StateService } from "@bitwarden/common/abstractions/state.service"; import { PolicyType } from "@bitwarden/common/enums/policyType"; +import { ServiceUtils } from "@bitwarden/common/misc/serviceUtils"; import { Organization } from "@bitwarden/common/models/domain/organization"; +import { TreeNode } from "@bitwarden/common/models/domain/treeNode"; import { CollectionView } from "@bitwarden/common/models/view/collectionView"; import { FolderView } from "@bitwarden/common/models/view/folderView"; import { DynamicTreeNode } from "./models/dynamic-tree-node.model"; +const NestingDelimiter = "/"; + @Injectable() export class VaultFilterService { constructor( @@ -36,25 +41,30 @@ export class VaultFilterService { return await this.organizationService.getAll(); } - async buildFolders(organizationId?: string): Promise> { - const storedFolders = await this.folderService.getAllDecrypted(); - let folders: FolderView[]; - if (organizationId != null) { - const ciphers = await this.cipherService.getAllDecrypted(); - const orgCiphers = ciphers.filter((c) => c.organizationId == organizationId); - folders = storedFolders.filter( - (f) => - orgCiphers.filter((oc) => oc.folderId == f.id).length > 0 || - ciphers.filter((c) => c.folderId == f.id).length < 1 - ); - } else { - folders = storedFolders; - } - const nestedFolders = await this.folderService.getAllNested(folders); - return new DynamicTreeNode({ - fullList: folders, - nestedList: nestedFolders, - }); + buildNestedFolders(organizationId?: string): Observable> { + const transformation = async (storedFolders: FolderView[]) => { + let folders: FolderView[]; + if (organizationId != null) { + const ciphers = await this.cipherService.getAllDecrypted(); + const orgCiphers = ciphers.filter((c) => c.organizationId == organizationId); + folders = storedFolders.filter( + (f) => + orgCiphers.filter((oc) => oc.folderId == f.id).length > 0 || + ciphers.filter((c) => c.folderId == f.id).length < 1 + ); + } else { + folders = storedFolders; + } + const nestedFolders = await this.getAllFoldersNested(folders); + return new DynamicTreeNode({ + fullList: folders, + nestedList: nestedFolders, + }); + }; + + return this.folderService.folderViews$.pipe( + mergeMap((folders) => from(transformation(folders))) + ); } async buildCollections(organizationId?: string): Promise> { @@ -79,4 +89,23 @@ export class VaultFilterService { async checkForPersonalOwnershipPolicy(): Promise { return await this.policyService.policyAppliesToUser(PolicyType.PersonalOwnership); } + + protected async getAllFoldersNested(folders: FolderView[]): Promise[]> { + const nodes: TreeNode[] = []; + folders.forEach((f) => { + const folderCopy = new FolderView(); + folderCopy.id = f.id; + folderCopy.revisionDate = f.revisionDate; + const parts = f.name != null ? f.name.replace(/^\/+|\/+$/g, "").split(NestingDelimiter) : []; + ServiceUtils.nestedTraverse(nodes, 0, parts, folderCopy, null, NestingDelimiter); + }); + return nodes; + } + + async getFolderNested(id: string): Promise> { + const folders = await this.getAllFoldersNested( + await firstValueFrom(this.folderService.folderViews$) + ); + return ServiceUtils.getTreeNodeObject(folders, id) as TreeNode; + } } diff --git a/libs/angular/src/pipes/credit-card-number.pipe.ts b/libs/angular/src/pipes/credit-card-number.pipe.ts index 11500ef9510..a90ae9724d3 100644 --- a/libs/angular/src/pipes/credit-card-number.pipe.ts +++ b/libs/angular/src/pipes/credit-card-number.pipe.ts @@ -25,6 +25,12 @@ const numberFormats: Record = { { cardLength: 19, blocks: [6, 13] }, ], Amex: [{ cardLength: 15, blocks: [4, 6, 5] }], + Mir: [ + { cardLength: 16, blocks: [4, 4, 4, 4] }, + { cardLength: 17, blocks: [5, 4, 4, 4] }, + { cardLength: 18, blocks: [6, 4, 4, 4] }, + { cardLength: 19, blocks: [7, 4, 4, 4] }, + ], Other: [{ cardLength: 16, blocks: [4, 4, 4, 4] }], }; diff --git a/libs/angular/src/scss/icons.scss b/libs/angular/src/scss/icons.scss index 58c860ff7ed..eaf061912d3 100644 --- a/libs/angular/src/scss/icons.scss +++ b/libs/angular/src/scss/icons.scss @@ -9,6 +9,7 @@ $card-icons: ( "mastercard": $card-icons-base + "mastercard-light.png", "union-pay": $card-icons-base + "union_pay-light.png", "ru-pay": $card-icons-base + "ru_pay-light.png", + "mir": $card-icons-base + "mir-light.png", ); $card-icons-dark: ( @@ -21,6 +22,7 @@ $card-icons-dark: ( "mastercard": $card-icons-base + "mastercard-dark.png", "union-pay": $card-icons-base + "union_pay-dark.png", "ru-pay": $card-icons-base + "ru_pay-dark.png", + "mir": $card-icons-base + "mir-dark.png", ); .credit-card-icon { diff --git a/libs/angular/src/services/jslib-services.module.ts b/libs/angular/src/services/jslib-services.module.ts index 1314abf4dac..e90acd075e7 100644 --- a/libs/angular/src/services/jslib-services.module.ts +++ b/libs/angular/src/services/jslib-services.module.ts @@ -16,7 +16,12 @@ import { EnvironmentService as EnvironmentServiceAbstraction } from "@bitwarden/ import { EventService as EventServiceAbstraction } from "@bitwarden/common/abstractions/event.service"; import { ExportService as ExportServiceAbstraction } from "@bitwarden/common/abstractions/export.service"; import { FileUploadService as FileUploadServiceAbstraction } from "@bitwarden/common/abstractions/fileUpload.service"; -import { FolderService as FolderServiceAbstraction } from "@bitwarden/common/abstractions/folder.service"; +import { FolderApiServiceAbstraction } from "@bitwarden/common/abstractions/folder/folder-api.service.abstraction"; +import { + FolderService as FolderServiceAbstraction, + InternalFolderService, +} from "@bitwarden/common/abstractions/folder/folder.service.abstraction"; +import { FormValidationErrorsService as FormValidationErrorsServiceAbstraction } from "@bitwarden/common/abstractions/formValidationErrors.service"; import { I18nService as I18nServiceAbstraction } from "@bitwarden/common/abstractions/i18n.service"; import { KeyConnectorService as KeyConnectorServiceAbstraction } from "@bitwarden/common/abstractions/keyConnector.service"; import { LogService } from "@bitwarden/common/abstractions/log.service"; @@ -57,7 +62,9 @@ import { EnvironmentService } from "@bitwarden/common/services/environment.servi import { EventService } from "@bitwarden/common/services/event.service"; import { ExportService } from "@bitwarden/common/services/export.service"; import { FileUploadService } from "@bitwarden/common/services/fileUpload.service"; -import { FolderService } from "@bitwarden/common/services/folder.service"; +import { FolderApiService } from "@bitwarden/common/services/folder/folder-api.service"; +import { FolderService } from "@bitwarden/common/services/folder/folder.service"; +import { FormValidationErrorsService } from "@bitwarden/common/services/formValidationErrors.service"; import { KeyConnectorService } from "@bitwarden/common/services/keyConnector.service"; import { NotificationsService } from "@bitwarden/common/services/notifications.service"; import { OrganizationService } from "@bitwarden/common/services/organization.service"; @@ -213,12 +220,20 @@ export const LOG_MAC_FAILURES = new InjectionToken("LOG_MAC_FAILURES"); useClass: FolderService, deps: [ CryptoServiceAbstraction, - ApiServiceAbstraction, I18nServiceAbstraction, CipherServiceAbstraction, StateServiceAbstraction, ], }, + { + provide: InternalFolderService, + useExisting: FolderServiceAbstraction, + }, + { + provide: FolderApiServiceAbstraction, + useClass: FolderApiService, + deps: [FolderServiceAbstraction, ApiServiceAbstraction], + }, { provide: LogService, useFactory: () => new ConsoleLogService(false) }, { provide: CollectionServiceAbstraction, @@ -291,6 +306,7 @@ export const LOG_MAC_FAILURES = new InjectionToken("LOG_MAC_FAILURES"); StateServiceAbstraction, OrganizationServiceAbstraction, ProviderServiceAbstraction, + FolderApiServiceAbstraction, LOGOUT_CALLBACK, ], }, @@ -444,6 +460,10 @@ export const LOG_MAC_FAILURES = new InjectionToken("LOG_MAC_FAILURES"); provide: AbstractThemingService, useClass: ThemingService, }, + { + provide: FormValidationErrorsServiceAbstraction, + useClass: FormValidationErrorsService, + }, ], }) export class JslibServicesModule {} diff --git a/libs/angular/src/services/theming/theming.service.ts b/libs/angular/src/services/theming/theming.service.ts index 7d67503694c..38eb574a725 100644 --- a/libs/angular/src/services/theming/theming.service.ts +++ b/libs/angular/src/services/theming/theming.service.ts @@ -1,4 +1,3 @@ -import { MediaMatcher } from "@angular/cdk/layout"; import { DOCUMENT } from "@angular/common"; import { Inject, Injectable } from "@angular/core"; import { BehaviorSubject, filter, fromEvent, Observable } from "rxjs"; @@ -6,6 +5,8 @@ import { BehaviorSubject, filter, fromEvent, Observable } from "rxjs"; import { StateService } from "@bitwarden/common/abstractions/state.service"; import { ThemeType } from "@bitwarden/common/enums/themeType"; +import { WINDOW } from "../jslib-services.module"; + import { Theme } from "./theme"; import { ThemeBuilder } from "./themeBuilder"; import { AbstractThemingService } from "./theming.service.abstraction"; @@ -17,7 +18,7 @@ export class ThemingService implements AbstractThemingService { constructor( private stateService: StateService, - private mediaMatcher: MediaMatcher, + @Inject(WINDOW) private window: Window, @Inject(DOCUMENT) private document: Document ) { this.monitorThemeChanges(); @@ -55,14 +56,14 @@ export class ThemingService implements AbstractThemingService { // We use a media match query for monitoring the system theme on web and browser, but this doesn't work for electron apps on Linux. // In desktop we override these methods to track systemTheme with the electron renderer instead, which works for all OSs. protected async getSystemTheme(): Promise { - return this.mediaMatcher.matchMedia("(prefers-color-scheme: dark)").matches + return this.window.matchMedia("(prefers-color-scheme: dark)").matches ? ThemeType.Dark : ThemeType.Light; } protected monitorSystemThemeChanges(): void { fromEvent( - this.mediaMatcher.matchMedia("(prefers-color-scheme: dark)"), + this.window.matchMedia("(prefers-color-scheme: dark)"), "change" ).subscribe((event) => { this.updateSystemTheme(event.matches ? ThemeType.Dark : ThemeType.Light); diff --git a/libs/angular/src/validators/inputsFieldMatch.validator.ts b/libs/angular/src/validators/inputsFieldMatch.validator.ts new file mode 100644 index 00000000000..9ef1ab789df --- /dev/null +++ b/libs/angular/src/validators/inputsFieldMatch.validator.ts @@ -0,0 +1,57 @@ +import { AbstractControl, FormGroup, ValidatorFn } from "@angular/forms"; + +import { FormGroupControls } from "@bitwarden/common/abstractions/formValidationErrors.service"; + +export class InputsFieldMatch { + //check to ensure two fields do not have the same value + static validateInputsDoesntMatch(matchTo: string, errorMessage: string): ValidatorFn { + return (control: AbstractControl) => { + if (control.parent && control.parent.controls) { + return control?.value === (control?.parent?.controls as FormGroupControls)[matchTo].value + ? { + inputsMatchError: { + message: errorMessage, + }, + } + : null; + } + + return null; + }; + } + + //check to ensure two fields have the same value + static validateInputsMatch(matchTo: string, errorMessage: string): ValidatorFn { + return (control: AbstractControl) => { + if (control.parent && control.parent.controls) { + return control?.value === (control?.parent?.controls as FormGroupControls)[matchTo].value + ? null + : { + inputsDoesntMatchError: { + message: errorMessage, + }, + }; + } + + return null; + }; + } + + //checks the formGroup if two fields have the same value and validation is controlled from either field + static validateFormInputsMatch(field: string, fieldMatchTo: string, errorMessage: string) { + return (formGroup: FormGroup) => { + const fieldCtrl = formGroup.controls[field]; + const fieldMatchToCtrl = formGroup.controls[fieldMatchTo]; + + if (fieldCtrl.value !== fieldMatchToCtrl.value) { + fieldMatchToCtrl.setErrors({ + inputsDoesntMatchError: { + message: errorMessage, + }, + }); + } else { + fieldMatchToCtrl.setErrors(null); + } + }; + } +} diff --git a/libs/common/spec/services/export.service.spec.ts b/libs/common/spec/services/export.service.spec.ts index 7c0a20c4507..bad26ab351e 100644 --- a/libs/common/spec/services/export.service.spec.ts +++ b/libs/common/spec/services/export.service.spec.ts @@ -1,10 +1,11 @@ import { Arg, Substitute, SubstituteOf } from "@fluffy-spoon/substitute"; +import { BehaviorSubject } from "rxjs"; import { ApiService } from "@bitwarden/common/abstractions/api.service"; import { CipherService } from "@bitwarden/common/abstractions/cipher.service"; import { CryptoService } from "@bitwarden/common/abstractions/crypto.service"; import { CryptoFunctionService } from "@bitwarden/common/abstractions/cryptoFunction.service"; -import { FolderService } from "@bitwarden/common/abstractions/folder.service"; +import { FolderService } from "@bitwarden/common/abstractions/folder/folder.service.abstraction"; import { CipherType } from "@bitwarden/common/enums/cipherType"; import { KdfType } from "@bitwarden/common/enums/kdfType"; import { Utils } from "@bitwarden/common/misc/utils"; @@ -97,8 +98,8 @@ describe("ExportService", () => { folderService = Substitute.for(); cryptoService = Substitute.for(); - folderService.getAllDecrypted().resolves([]); - folderService.getAll().resolves([]); + folderService.folderViews$.returns(new BehaviorSubject([])); + folderService.folders$.returns(new BehaviorSubject([])); exportService = new ExportService( folderService, diff --git a/libs/common/spec/services/folder.service.spec.ts b/libs/common/spec/services/folder.service.spec.ts new file mode 100644 index 00000000000..e4f269b5361 --- /dev/null +++ b/libs/common/spec/services/folder.service.spec.ts @@ -0,0 +1,195 @@ +import { Arg, Substitute, SubstituteOf } from "@fluffy-spoon/substitute"; +import { BehaviorSubject, firstValueFrom } from "rxjs"; + +import { BroadcasterService } from "@bitwarden/common/abstractions/broadcaster.service"; +import { CipherService } from "@bitwarden/common/abstractions/cipher.service"; +import { CryptoService } from "@bitwarden/common/abstractions/crypto.service"; +import { I18nService } from "@bitwarden/common/abstractions/i18n.service"; +import { FolderData } from "@bitwarden/common/models/data/folderData"; +import { EncString } from "@bitwarden/common/models/domain/encString"; +import { FolderView } from "@bitwarden/common/models/view/folderView"; +import { ContainerService } from "@bitwarden/common/services/container.service"; +import { FolderService } from "@bitwarden/common/services/folder/folder.service"; +import { StateService } from "@bitwarden/common/services/state.service"; + +describe("Folder Service", () => { + let folderService: FolderService; + + let cryptoService: SubstituteOf; + let i18nService: SubstituteOf; + let cipherService: SubstituteOf; + let stateService: SubstituteOf; + let broadcasterService: SubstituteOf; + let activeAccount: BehaviorSubject; + + beforeEach(() => { + cryptoService = Substitute.for(); + i18nService = Substitute.for(); + cipherService = Substitute.for(); + stateService = Substitute.for(); + broadcasterService = Substitute.for(); + activeAccount = new BehaviorSubject("123"); + + stateService.getEncryptedFolders().resolves({ + "1": folderData("1", "test"), + }); + stateService.activeAccount.returns(activeAccount); + (window as any).bitwardenContainerService = new ContainerService(cryptoService); + + folderService = new FolderService( + cryptoService, + i18nService, + cipherService, + stateService, + broadcasterService + ); + }); + + it("encrypt", async () => { + const model = new FolderView(); + model.id = "2"; + model.name = "Test Folder"; + + cryptoService.encrypt(Arg.any()).resolves(new EncString("ENC")); + cryptoService.decryptToUtf8(Arg.any()).resolves("DEC"); + + const result = await folderService.encrypt(model); + + expect(result).toEqual({ + id: "2", + name: { + encryptedString: "ENC", + encryptionType: 0, + }, + }); + }); + + describe("get", () => { + it("exists", async () => { + const result = await folderService.get("1"); + + expect(result).toEqual({ + id: "1", + name: { + decryptedValue: [], + encryptedString: "test", + encryptionType: 0, + }, + revisionDate: null, + }); + }); + + it("not exists", async () => { + const result = await folderService.get("2"); + + expect(result).toBe(undefined); + }); + }); + + it("upsert", async () => { + await folderService.upsert(folderData("2", "test 2")); + + expect(await firstValueFrom(folderService.folders$)).toEqual([ + { + id: "1", + name: { + decryptedValue: [], + encryptedString: "test", + encryptionType: 0, + }, + revisionDate: null, + }, + { + id: "2", + name: { + decryptedValue: [], + encryptedString: "test 2", + encryptionType: 0, + }, + revisionDate: null, + }, + ]); + + expect(await firstValueFrom(folderService.folderViews$)).toEqual([ + { id: "1", name: [], revisionDate: null }, + { id: "2", name: [], revisionDate: null }, + { id: null, name: [], revisionDate: null }, + ]); + }); + + it("replace", async () => { + await folderService.replace({ "2": folderData("2", "test 2") }); + + expect(await firstValueFrom(folderService.folders$)).toEqual([ + { + id: "2", + name: { + decryptedValue: [], + encryptedString: "test 2", + encryptionType: 0, + }, + revisionDate: null, + }, + ]); + + expect(await firstValueFrom(folderService.folderViews$)).toEqual([ + { id: "2", name: [], revisionDate: null }, + { id: null, name: [], revisionDate: null }, + ]); + }); + + it("delete", async () => { + await folderService.delete("1"); + + expect((await firstValueFrom(folderService.folders$)).length).toBe(0); + + expect(await firstValueFrom(folderService.folderViews$)).toEqual([ + { id: null, name: [], revisionDate: null }, + ]); + }); + + it("clearCache", async () => { + await folderService.clearCache(); + + expect((await firstValueFrom(folderService.folders$)).length).toBe(1); + expect((await firstValueFrom(folderService.folderViews$)).length).toBe(0); + }); + + describe("clear", () => { + it("null userId", async () => { + await folderService.clear(); + + stateService.received(1).setEncryptedFolders(Arg.any(), Arg.any()); + + expect((await firstValueFrom(folderService.folders$)).length).toBe(0); + expect((await firstValueFrom(folderService.folderViews$)).length).toBe(0); + }); + + it("matching userId", async () => { + stateService.getUserId().resolves("1"); + await folderService.clear("1"); + + stateService.received(1).setEncryptedFolders(Arg.any(), Arg.any()); + + expect((await firstValueFrom(folderService.folders$)).length).toBe(0); + expect((await firstValueFrom(folderService.folderViews$)).length).toBe(0); + }); + + it("missmatching userId", async () => { + await folderService.clear("12"); + + stateService.received(1).setEncryptedFolders(Arg.any(), Arg.any()); + + expect((await firstValueFrom(folderService.folders$)).length).toBe(1); + expect((await firstValueFrom(folderService.folderViews$)).length).toBe(2); + }); + }); + + function folderData(id: string, name: string) { + const data = new FolderData({} as any); + data.id = id; + data.name = name; + + return data; + } +}); diff --git a/libs/common/spec/services/import.service.spec.ts b/libs/common/spec/services/import.service.spec.ts index 5f0789943b5..34646565684 100644 --- a/libs/common/spec/services/import.service.spec.ts +++ b/libs/common/spec/services/import.service.spec.ts @@ -4,7 +4,7 @@ import { ApiService } from "@bitwarden/common/abstractions/api.service"; import { CipherService } from "@bitwarden/common/abstractions/cipher.service"; import { CollectionService } from "@bitwarden/common/abstractions/collection.service"; import { CryptoService } from "@bitwarden/common/abstractions/crypto.service"; -import { FolderService } from "@bitwarden/common/abstractions/folder.service"; +import { FolderService } from "@bitwarden/common/abstractions/folder/folder.service.abstraction"; import { I18nService } from "@bitwarden/common/abstractions/i18n.service"; import { PlatformUtilsService } from "@bitwarden/common/abstractions/platformUtils.service"; import { BitwardenPasswordProtectedImporter } from "@bitwarden/common/importers/bitwardenPasswordProtectedImporter"; diff --git a/libs/common/spec/services/stateMigration.service.spec.ts b/libs/common/spec/services/stateMigration.service.spec.ts index 46fb13d70a1..7ac12f51e30 100644 --- a/libs/common/spec/services/stateMigration.service.spec.ts +++ b/libs/common/spec/services/stateMigration.service.spec.ts @@ -9,6 +9,9 @@ import { StateMigrationService } from "@bitwarden/common/services/stateMigration const userId = "USER_ID"; +// Note: each test calls the private migration method for that migration, +// so that we don't accidentally run all following migrations as well + describe("State Migration Service", () => { let storageService: SubstituteOf; let secureStorageService: SubstituteOf; @@ -66,13 +69,13 @@ describe("State Migration Service", () => { storageService.get(userId, Arg.any()).resolves(accountVersion3); - await stateMigrationService.migrate(); + await (stateMigrationService as any).migrateStateFrom3To4(); storageService.received(1).save(userId, expectedAccountVersion4, Arg.any()); }); it("updates StateVersion number", async () => { - await stateMigrationService.migrate(); + await (stateMigrationService as any).migrateStateFrom3To4(); storageService.received(1).save( "global", @@ -81,4 +84,47 @@ describe("State Migration Service", () => { ); }); }); + + describe("StateVersion 4 to 5 migration", () => { + it("migrates organization keys to new format", async () => { + const accountVersion4 = new Account({ + keys: { + organizationKeys: { + encrypted: { + orgOneId: "orgOneEncKey", + orgTwoId: "orgTwoEncKey", + orgThreeId: "orgThreeEncKey", + }, + }, + }, + } as any); + + const expectedAccount = new Account({ + keys: { + organizationKeys: { + encrypted: { + orgOneId: { + type: "organization", + key: "orgOneEncKey", + }, + orgTwoId: { + type: "organization", + key: "orgTwoEncKey", + }, + orgThreeId: { + type: "organization", + key: "orgThreeEncKey", + }, + }, + }, + }, + }); + + const migratedAccount = await (stateMigrationService as any).migrateAccountFrom4To5( + accountVersion4 + ); + + expect(migratedAccount).toEqual(expectedAccount); + }); + }); }); diff --git a/libs/common/src/abstractions/api.service.ts b/libs/common/src/abstractions/api.service.ts index d485328d0d2..365e3cd43dc 100644 --- a/libs/common/src/abstractions/api.service.ts +++ b/libs/common/src/abstractions/api.service.ts @@ -1,3 +1,4 @@ +import { OrganizationApiKeyType } from "../enums/organizationApiKeyType"; import { OrganizationConnectionType } from "../enums/organizationConnectionType"; import { PolicyType } from "../enums/policyType"; import { SetKeyConnectorKeyRequest } from "../models/request/account/setKeyConnectorKeyRequest"; @@ -23,7 +24,6 @@ import { EmergencyAccessInviteRequest } from "../models/request/emergencyAccessI import { EmergencyAccessPasswordRequest } from "../models/request/emergencyAccessPasswordRequest"; import { EmergencyAccessUpdateRequest } from "../models/request/emergencyAccessUpdateRequest"; import { EventRequest } from "../models/request/eventRequest"; -import { FolderRequest } from "../models/request/folderRequest"; import { GroupRequest } from "../models/request/groupRequest"; import { IapCheckRequest } from "../models/request/iapCheckRequest"; import { ApiTokenRequest } from "../models/request/identityToken/apiTokenRequest"; @@ -117,7 +117,6 @@ import { EmergencyAccessViewResponse, } from "../models/response/emergencyAccessResponse"; import { EventResponse } from "../models/response/eventResponse"; -import { FolderResponse } from "../models/response/folderResponse"; import { GroupDetailsResponse, GroupResponse } from "../models/response/groupResponse"; import { IdentityCaptchaResponse } from "../models/response/identityCaptchaResponse"; import { IdentityTokenResponse } from "../models/response/identityTokenResponse"; @@ -182,6 +181,16 @@ import { UserKeyResponse } from "../models/response/userKeyResponse"; import { SendAccessView } from "../models/view/sendAccessView"; export abstract class ApiService { + send: ( + method: "GET" | "POST" | "PUT" | "DELETE", + path: string, + body: any, + authed: boolean, + hasResponse: boolean, + apiUrl?: string, + alterHeaders?: (headers: Headers) => void + ) => Promise; + postIdentityToken: ( request: PasswordTokenRequest | SsoTokenRequest | ApiTokenRequest ) => Promise; @@ -228,11 +237,6 @@ export abstract class ApiService { getUserBillingHistory: () => Promise; getUserBillingPayment: () => Promise; - getFolder: (id: string) => Promise; - postFolder: (request: FolderRequest) => Promise; - putFolder: (id: string, request: FolderRequest) => Promise; - deleteFolder: (id: string) => Promise; - getSend: (id: string) => Promise; postSendAccess: ( id: string, @@ -259,6 +263,7 @@ export abstract class ApiService { renewSendFileUploadUrl: (sendId: string, fileId: string) => Promise; getCipher: (id: string) => Promise; + getFullCipherDetails: (id: string) => Promise; getCipherAdmin: (id: string) => Promise; getAttachmentData: ( cipherId: string, @@ -569,7 +574,8 @@ export abstract class ApiService { request: OrganizationApiKeyRequest ) => Promise; getOrganizationApiKeyInformation: ( - id: string + id: string, + type?: OrganizationApiKeyType ) => Promise>; postOrganizationRotateApiKey: ( id: string, diff --git a/libs/common/src/abstractions/environment.service.ts b/libs/common/src/abstractions/environment.service.ts index 8398b4c634e..84bceaa1972 100644 --- a/libs/common/src/abstractions/environment.service.ts +++ b/libs/common/src/abstractions/environment.service.ts @@ -9,6 +9,7 @@ export type Urls = { notifications?: string; events?: string; keyConnector?: string; + scim?: string; }; export type PayPalConfig = { @@ -28,6 +29,7 @@ export abstract class EnvironmentService { getIdentityUrl: () => string; getEventsUrl: () => string; getKeyConnectorUrl: () => string; + getScimUrl: () => string; setUrlsFromStorage: () => Promise; setUrls: (urls: Urls) => Promise; getUrls: () => Urls; diff --git a/libs/common/src/abstractions/folder.service.ts b/libs/common/src/abstractions/folder.service.ts deleted file mode 100644 index f848de90920..00000000000 --- a/libs/common/src/abstractions/folder.service.ts +++ /dev/null @@ -1,21 +0,0 @@ -import { FolderData } from "../models/data/folderData"; -import { Folder } from "../models/domain/folder"; -import { SymmetricCryptoKey } from "../models/domain/symmetricCryptoKey"; -import { TreeNode } from "../models/domain/treeNode"; -import { FolderView } from "../models/view/folderView"; - -export abstract class FolderService { - clearCache: (userId?: string) => Promise; - encrypt: (model: FolderView, key?: SymmetricCryptoKey) => Promise; - get: (id: string) => Promise; - getAll: () => Promise; - getAllDecrypted: () => Promise; - getAllNested: (folders?: FolderView[]) => Promise[]>; - getNested: (id: string) => Promise>; - saveWithServer: (folder: Folder) => Promise; - upsert: (folder: FolderData | FolderData[]) => Promise; - replace: (folders: { [id: string]: FolderData }) => Promise; - clear: (userId: string) => Promise; - delete: (id: string | string[]) => Promise; - deleteWithServer: (id: string) => Promise; -} diff --git a/libs/common/src/abstractions/folder/folder-api.service.abstraction.ts b/libs/common/src/abstractions/folder/folder-api.service.abstraction.ts new file mode 100644 index 00000000000..97f3b724afe --- /dev/null +++ b/libs/common/src/abstractions/folder/folder-api.service.abstraction.ts @@ -0,0 +1,8 @@ +import { Folder } from "@bitwarden/common/models/domain/folder"; +import { FolderResponse } from "@bitwarden/common/models/response/folderResponse"; + +export class FolderApiServiceAbstraction { + save: (folder: Folder) => Promise; + delete: (id: string) => Promise; + get: (id: string) => Promise; +} diff --git a/libs/common/src/abstractions/folder/folder.service.abstraction.ts b/libs/common/src/abstractions/folder/folder.service.abstraction.ts new file mode 100644 index 00000000000..42e0420f9b3 --- /dev/null +++ b/libs/common/src/abstractions/folder/folder.service.abstraction.ts @@ -0,0 +1,26 @@ +import { Observable } from "rxjs"; + +import { FolderData } from "../../models/data/folderData"; +import { Folder } from "../../models/domain/folder"; +import { SymmetricCryptoKey } from "../../models/domain/symmetricCryptoKey"; +import { FolderView } from "../../models/view/folderView"; + +export abstract class FolderService { + folders$: Observable; + folderViews$: Observable; + + clearCache: () => Promise; + encrypt: (model: FolderView, key?: SymmetricCryptoKey) => Promise; + get: (id: string) => Promise; + /** + * @deprecated Only use in CLI! + */ + getAllDecryptedFromState: () => Promise; +} + +export abstract class InternalFolderService extends FolderService { + upsert: (folder: FolderData | FolderData[]) => Promise; + replace: (folders: { [id: string]: FolderData }) => Promise; + clear: (userId: string) => Promise; + delete: (id: string | string[]) => Promise; +} diff --git a/libs/common/src/abstractions/formValidationErrors.service.ts b/libs/common/src/abstractions/formValidationErrors.service.ts new file mode 100644 index 00000000000..08a12443a0c --- /dev/null +++ b/libs/common/src/abstractions/formValidationErrors.service.ts @@ -0,0 +1,13 @@ +import { AbstractControl } from "@angular/forms"; +export interface AllValidationErrors { + controlName: string; + errorName: string; +} + +export interface FormGroupControls { + [key: string]: AbstractControl; +} + +export abstract class FormValidationErrorsService { + getFormValidationErrors: (controls: FormGroupControls) => AllValidationErrors[]; +} diff --git a/libs/common/src/abstractions/i18n.service.ts b/libs/common/src/abstractions/i18n.service.ts index 4706e0d1aa8..23f2d4fd235 100644 --- a/libs/common/src/abstractions/i18n.service.ts +++ b/libs/common/src/abstractions/i18n.service.ts @@ -1,5 +1,7 @@ +import { Observable } from "rxjs"; + export abstract class I18nService { - locale: string; + locale$: Observable; supportedTranslationLocales: string[]; translationLocale: string; collator: Intl.Collator; diff --git a/libs/common/src/abstractions/state.service.ts b/libs/common/src/abstractions/state.service.ts index ec24884e3c4..b88926635cb 100644 --- a/libs/common/src/abstractions/state.service.ts +++ b/libs/common/src/abstractions/state.service.ts @@ -1,10 +1,11 @@ -import { BehaviorSubject } from "rxjs"; +import { BehaviorSubject, Observable } from "rxjs"; import { KdfType } from "../enums/kdfType"; import { ThemeType } from "../enums/themeType"; import { UriMatchType } from "../enums/uriMatchType"; import { CipherData } from "../models/data/cipherData"; import { CollectionData } from "../models/data/collectionData"; +import { EncryptedOrganizationKeyData } from "../models/data/encryptedOrganizationKeyData"; import { EventData } from "../models/data/eventData"; import { FolderData } from "../models/data/folderData"; import { OrganizationData } from "../models/data/organizationData"; @@ -21,13 +22,14 @@ import { SymmetricCryptoKey } from "../models/domain/symmetricCryptoKey"; import { WindowState } from "../models/domain/windowState"; import { CipherView } from "../models/view/cipherView"; import { CollectionView } from "../models/view/collectionView"; -import { FolderView } from "../models/view/folderView"; import { SendView } from "../models/view/sendView"; export abstract class StateService { accounts: BehaviorSubject<{ [userId: string]: T }>; activeAccount: BehaviorSubject; + activeAccountUnlocked: Observable; + addAccount: (account: T) => Promise; setActiveUser: (userId: string) => Promise; clean: (options?: StorageOptions) => Promise; @@ -88,8 +90,6 @@ export abstract class StateService { value: SymmetricCryptoKey, options?: StorageOptions ) => Promise; - getDecryptedFolders: (options?: StorageOptions) => Promise; - setDecryptedFolders: (value: FolderView[], options?: StorageOptions) => Promise; getDecryptedOrganizationKeys: ( options?: StorageOptions ) => Promise>; @@ -183,14 +183,22 @@ export abstract class StateService { ) => Promise; getEncryptedCryptoSymmetricKey: (options?: StorageOptions) => Promise; setEncryptedCryptoSymmetricKey: (value: string, options?: StorageOptions) => Promise; + /** + * @deprecated Do not call this directly, use FolderService + */ getEncryptedFolders: (options?: StorageOptions) => Promise<{ [id: string]: FolderData }>; + /** + * @deprecated Do not call this directly, use FolderService + */ setEncryptedFolders: ( value: { [id: string]: FolderData }, options?: StorageOptions ) => Promise; - getEncryptedOrganizationKeys: (options?: StorageOptions) => Promise; + getEncryptedOrganizationKeys: ( + options?: StorageOptions + ) => Promise<{ [orgId: string]: EncryptedOrganizationKeyData }>; setEncryptedOrganizationKeys: ( - value: Map, + value: { [orgId: string]: EncryptedOrganizationKeyData }, options?: StorageOptions ) => Promise; getEncryptedPasswordGenerationHistory: ( diff --git a/libs/common/src/enums/eventType.ts b/libs/common/src/enums/eventType.ts index d6268aea559..43a45fc32d9 100644 --- a/libs/common/src/enums/eventType.ts +++ b/libs/common/src/enums/eventType.ts @@ -48,6 +48,8 @@ export enum EventType { OrganizationUser_AdminResetPassword = 1508, OrganizationUser_ResetSsoLink = 1509, OrganizationUser_FirstSsoLogin = 1510, + OrganizationUser_Deactivated = 1511, + OrganizationUser_Activated = 1512, Organization_Updated = 1600, Organization_PurgedVault = 1601, diff --git a/libs/common/src/enums/organizationApiKeyType.ts b/libs/common/src/enums/organizationApiKeyType.ts index 27479a8de02..44ba7f8391d 100644 --- a/libs/common/src/enums/organizationApiKeyType.ts +++ b/libs/common/src/enums/organizationApiKeyType.ts @@ -1,4 +1,5 @@ export enum OrganizationApiKeyType { Default = 0, BillingSync = 1, + Scim = 2, } diff --git a/libs/common/src/enums/organizationConnectionType.ts b/libs/common/src/enums/organizationConnectionType.ts index 1291874370a..d2f9700a6a0 100644 --- a/libs/common/src/enums/organizationConnectionType.ts +++ b/libs/common/src/enums/organizationConnectionType.ts @@ -1,3 +1,4 @@ export enum OrganizationConnectionType { CloudBillingSync = 1, + Scim = 2, } diff --git a/libs/common/src/enums/permissions.ts b/libs/common/src/enums/permissions.ts index bb0021506a9..46ee9066203 100644 --- a/libs/common/src/enums/permissions.ts +++ b/libs/common/src/enums/permissions.ts @@ -25,4 +25,5 @@ export enum Permissions { DeleteAssignedCollections, ManageSso, ManageBilling, + ManageScim, } diff --git a/libs/common/src/enums/scimProviderType.ts b/libs/common/src/enums/scimProviderType.ts new file mode 100644 index 00000000000..43c518fdfbf --- /dev/null +++ b/libs/common/src/enums/scimProviderType.ts @@ -0,0 +1,9 @@ +export enum ScimProviderType { + Default = 0, + AzureAd = 1, + Okta = 2, + OneLogin = 3, + JumpCloud = 4, + GoogleWorkspace = 5, + Rippling = 6, +} diff --git a/libs/common/src/enums/stateVersion.ts b/libs/common/src/enums/stateVersion.ts index 5aeb02e5409..cc36f53f57f 100644 --- a/libs/common/src/enums/stateVersion.ts +++ b/libs/common/src/enums/stateVersion.ts @@ -3,5 +3,6 @@ export enum StateVersion { Two = 2, // Move to a typed State object Three = 3, // Fix migration of users' premium status Four = 4, // Fix 'Never Lock' option by removing stale data - Latest = Four, + Five = 5, // Migrate to new storage of encrypted organization keys + Latest = Five, } diff --git a/libs/common/src/importers/baseImporter.ts b/libs/common/src/importers/baseImporter.ts index 122b34724d8..0e1192a652b 100644 --- a/libs/common/src/importers/baseImporter.ts +++ b/libs/common/src/importers/baseImporter.ts @@ -301,6 +301,12 @@ export abstract class BaseImporter { return "Visa"; } + // Mir + re = new RegExp("^220[0-4]"); + if (cardNum.match(re) != null) { + return "Mir"; + } + return null; } diff --git a/libs/common/src/models/api/permissionsApi.ts b/libs/common/src/models/api/permissionsApi.ts index bac79bd3cf1..c35cb69cb54 100644 --- a/libs/common/src/models/api/permissionsApi.ts +++ b/libs/common/src/models/api/permissionsApi.ts @@ -25,6 +25,7 @@ export class PermissionsApi extends BaseResponse { managePolicies: boolean; manageUsers: boolean; manageResetPassword: boolean; + manageScim: boolean; constructor(data: any = null) { super(data); @@ -51,5 +52,6 @@ export class PermissionsApi extends BaseResponse { this.managePolicies = this.getResponseProperty("ManagePolicies"); this.manageUsers = this.getResponseProperty("ManageUsers"); this.manageResetPassword = this.getResponseProperty("ManageResetPassword"); + this.manageScim = this.getResponseProperty("ManageScim"); } } diff --git a/libs/common/src/models/api/scimConfigApi.ts b/libs/common/src/models/api/scimConfigApi.ts new file mode 100644 index 00000000000..2269ac59691 --- /dev/null +++ b/libs/common/src/models/api/scimConfigApi.ts @@ -0,0 +1,17 @@ +import { ScimProviderType } from "@bitwarden/common/enums/scimProviderType"; + +import { BaseResponse } from "../response/baseResponse"; + +export class ScimConfigApi extends BaseResponse { + enabled: boolean; + scimProvider: ScimProviderType; + + constructor(data: any) { + super(data); + if (data == null) { + return; + } + this.enabled = this.getResponseProperty("Enabled"); + this.scimProvider = this.getResponseProperty("ScimProvider"); + } +} diff --git a/libs/common/src/models/data/encryptedOrganizationKeyData.ts b/libs/common/src/models/data/encryptedOrganizationKeyData.ts new file mode 100644 index 00000000000..8ecbeefb814 --- /dev/null +++ b/libs/common/src/models/data/encryptedOrganizationKeyData.ts @@ -0,0 +1,14 @@ +export type EncryptedOrganizationKeyData = + | OrganizationEncryptedOrganizationKeyData + | ProviderEncryptedOrganizationKeyData; + +type OrganizationEncryptedOrganizationKeyData = { + type: "organization"; + key: string; +}; + +type ProviderEncryptedOrganizationKeyData = { + type: "provider"; + key: string; + providerId: string; +}; diff --git a/libs/common/src/models/data/organizationData.ts b/libs/common/src/models/data/organizationData.ts index d093821fc31..5d5e5229594 100644 --- a/libs/common/src/models/data/organizationData.ts +++ b/libs/common/src/models/data/organizationData.ts @@ -19,6 +19,7 @@ export class OrganizationData { useApi: boolean; useSso: boolean; useKeyConnector: boolean; + useScim: boolean; useResetPassword: boolean; selfHost: boolean; usersGetPremium: boolean; @@ -58,6 +59,7 @@ export class OrganizationData { this.useApi = response.useApi; this.useSso = response.useSso; this.useKeyConnector = response.useKeyConnector; + this.useScim = response.useScim; this.useResetPassword = response.useResetPassword; this.selfHost = response.selfHost; this.usersGetPremium = response.usersGetPremium; diff --git a/libs/common/src/models/domain/account.ts b/libs/common/src/models/domain/account.ts index 7d2077960fd..ff4b60345d8 100644 --- a/libs/common/src/models/domain/account.ts +++ b/libs/common/src/models/domain/account.ts @@ -3,6 +3,7 @@ import { KdfType } from "../../enums/kdfType"; import { UriMatchType } from "../../enums/uriMatchType"; import { CipherData } from "../data/cipherData"; import { CollectionData } from "../data/collectionData"; +import { EncryptedOrganizationKeyData } from "../data/encryptedOrganizationKeyData"; import { EventData } from "../data/eventData"; import { FolderData } from "../data/folderData"; import { OrganizationData } from "../data/organizationData"; @@ -11,7 +12,6 @@ import { ProviderData } from "../data/providerData"; import { SendData } from "../data/sendData"; import { CipherView } from "../view/cipherView"; import { CollectionView } from "../view/collectionView"; -import { FolderView } from "../view/folderView"; import { SendView } from "../view/sendView"; import { EncString } from "./encString"; @@ -31,15 +31,19 @@ export class DataEncryptionPair { decrypted?: TDecrypted[]; } +// This is a temporary structure to handle migrated `DataEncryptionPair` to +// avoid needing a data migration at this stage. It should be replaced with +// proper data migrations when `DataEncryptionPair` is deprecated. +export class TemporaryDataEncryption { + encrypted?: { [id: string]: TEncrypted }; +} + export class AccountData { ciphers?: DataEncryptionPair = new DataEncryptionPair< CipherData, CipherView >(); - folders?: DataEncryptionPair = new DataEncryptionPair< - FolderData, - FolderView - >(); + folders? = new TemporaryDataEncryption(); localData?: any; sends?: DataEncryptionPair = new DataEncryptionPair(); collections?: DataEncryptionPair = new DataEncryptionPair< @@ -66,8 +70,11 @@ export class AccountKeys { string, SymmetricCryptoKey >(); - organizationKeys?: EncryptionPair> = new EncryptionPair< - any, + organizationKeys?: EncryptionPair< + { [orgId: string]: EncryptedOrganizationKeyData }, + Map + > = new EncryptionPair< + { [orgId: string]: EncryptedOrganizationKeyData }, Map >(); providerKeys?: EncryptionPair> = new EncryptionPair< diff --git a/libs/common/src/models/domain/encryptedOrganizationKey.ts b/libs/common/src/models/domain/encryptedOrganizationKey.ts new file mode 100644 index 00000000000..25a49aab148 --- /dev/null +++ b/libs/common/src/models/domain/encryptedOrganizationKey.ts @@ -0,0 +1,56 @@ +import { CryptoService } from "../../abstractions/crypto.service"; +import { EncryptedOrganizationKeyData } from "../../models/data/encryptedOrganizationKeyData"; + +import { EncString } from "./encString"; +import { SymmetricCryptoKey } from "./symmetricCryptoKey"; + +export abstract class BaseEncryptedOrganizationKey { + decrypt: (cryptoService: CryptoService) => Promise; + + static fromData(data: EncryptedOrganizationKeyData) { + switch (data.type) { + case "organization": + return new EncryptedOrganizationKey(data.key); + + case "provider": + return new ProviderEncryptedOrganizationKey(data.key, data.providerId); + + default: + return null; + } + } +} + +export class EncryptedOrganizationKey implements BaseEncryptedOrganizationKey { + constructor(private key: string) {} + + async decrypt(cryptoService: CryptoService) { + const decValue = await cryptoService.rsaDecrypt(this.key); + return new SymmetricCryptoKey(decValue); + } + + toData(): EncryptedOrganizationKeyData { + return { + type: "organization", + key: this.key, + }; + } +} + +export class ProviderEncryptedOrganizationKey implements BaseEncryptedOrganizationKey { + constructor(private key: string, private providerId: string) {} + + async decrypt(cryptoService: CryptoService) { + const providerKey = await cryptoService.getProviderKey(this.providerId); + const decValue = await cryptoService.decryptToBytes(new EncString(this.key), providerKey); + return new SymmetricCryptoKey(decValue); + } + + toData(): EncryptedOrganizationKeyData { + return { + type: "provider", + key: this.key, + providerId: this.providerId, + }; + } +} diff --git a/libs/common/src/models/domain/organization.ts b/libs/common/src/models/domain/organization.ts index ba1c8e1a173..c15d936234f 100644 --- a/libs/common/src/models/domain/organization.ts +++ b/libs/common/src/models/domain/organization.ts @@ -20,6 +20,7 @@ export class Organization { useApi: boolean; useSso: boolean; useKeyConnector: boolean; + useScim: boolean; useResetPassword: boolean; selfHost: boolean; usersGetPremium: boolean; @@ -63,6 +64,7 @@ export class Organization { this.useApi = obj.useApi; this.useSso = obj.useSso; this.useKeyConnector = obj.useKeyConnector; + this.useScim = obj.useScim; this.useResetPassword = obj.useResetPassword; this.selfHost = obj.selfHost; this.usersGetPremium = obj.usersGetPremium; @@ -173,6 +175,10 @@ export class Organization { return this.isAdmin || this.permissions.manageSso; } + get canManageScim() { + return this.isAdmin || this.permissions.manageScim; + } + get canManagePolicies() { return this.isAdmin || this.permissions.managePolicies; } @@ -207,6 +213,7 @@ export class Organization { (permissions.includes(Permissions.ManageUsers) && this.canManageUsers) || (permissions.includes(Permissions.ManageUsersPassword) && this.canManageUsersPassword) || (permissions.includes(Permissions.ManageSso) && this.canManageSso) || + (permissions.includes(Permissions.ManageScim) && this.canManageScim) || (permissions.includes(Permissions.ManageBilling) && this.canManageBilling); return specifiedPermissions && (this.enabled || this.isOwner); diff --git a/libs/common/src/models/request/organizationConnectionRequest.ts b/libs/common/src/models/request/organizationConnectionRequest.ts index 69964cb09e6..2506ac1d080 100644 --- a/libs/common/src/models/request/organizationConnectionRequest.ts +++ b/libs/common/src/models/request/organizationConnectionRequest.ts @@ -1,9 +1,10 @@ import { OrganizationConnectionType } from "../../enums/organizationConnectionType"; import { BillingSyncConfigRequest } from "./billingSyncConfigRequest"; +import { ScimConfigRequest } from "./scimConfigRequest"; /**API request config types for OrganizationConnectionRequest */ -export type OrganizationConnectionRequestConfigs = BillingSyncConfigRequest; +export type OrganizationConnectionRequestConfigs = BillingSyncConfigRequest | ScimConfigRequest; export class OrganizationConnectionRequest { constructor( diff --git a/libs/common/src/models/request/passwordRequest.ts b/libs/common/src/models/request/passwordRequest.ts index 9f7df7df373..eb3498a27f5 100644 --- a/libs/common/src/models/request/passwordRequest.ts +++ b/libs/common/src/models/request/passwordRequest.ts @@ -2,5 +2,6 @@ import { SecretVerificationRequest } from "./secretVerificationRequest"; export class PasswordRequest extends SecretVerificationRequest { newMasterPasswordHash: string; + masterPasswordHint: string; key: string; } diff --git a/libs/common/src/models/request/scimConfigRequest.ts b/libs/common/src/models/request/scimConfigRequest.ts new file mode 100644 index 00000000000..7549661cdd1 --- /dev/null +++ b/libs/common/src/models/request/scimConfigRequest.ts @@ -0,0 +1,5 @@ +import { ScimProviderType } from "@bitwarden/common/enums/scimProviderType"; + +export class ScimConfigRequest { + constructor(private enabled: boolean, private scimProvider: ScimProviderType = null) {} +} diff --git a/libs/common/src/models/response/errorResponse.ts b/libs/common/src/models/response/errorResponse.ts index 3a0d22e695d..859803b441f 100644 --- a/libs/common/src/models/response/errorResponse.ts +++ b/libs/common/src/models/response/errorResponse.ts @@ -21,15 +21,13 @@ export class ErrorResponse extends BaseResponse { } } - if (errorModel) { + if (status === 429) { + this.message = "Rate limit exceeded. Try again later."; + } else if (errorModel) { this.message = this.getResponseProperty("Message", errorModel); this.validationErrors = this.getResponseProperty("ValidationErrors", errorModel); this.captchaSiteKey = this.validationErrors?.HCaptcha_SiteKey?.[0]; this.captchaRequired = !Utils.isNullOrWhitespace(this.captchaSiteKey); - } else { - if (status === 429) { - this.message = "Rate limit exceeded. Try again later."; - } } this.statusCode = status; } diff --git a/libs/common/src/models/response/organizationConnectionResponse.ts b/libs/common/src/models/response/organizationConnectionResponse.ts index a1e9a3de679..7f39d250f3b 100644 --- a/libs/common/src/models/response/organizationConnectionResponse.ts +++ b/libs/common/src/models/response/organizationConnectionResponse.ts @@ -1,10 +1,11 @@ import { OrganizationConnectionType } from "../../enums/organizationConnectionType"; import { BillingSyncConfigApi } from "../api/billingSyncConfigApi"; +import { ScimConfigApi } from "../api/scimConfigApi"; import { BaseResponse } from "./baseResponse"; /**API response config types for OrganizationConnectionResponse */ -export type OrganizationConnectionConfigApis = BillingSyncConfigApi; +export type OrganizationConnectionConfigApis = BillingSyncConfigApi | ScimConfigApi; export class OrganizationConnectionResponse< TConfig extends OrganizationConnectionConfigApis diff --git a/libs/common/src/models/response/profileOrganizationResponse.ts b/libs/common/src/models/response/profileOrganizationResponse.ts index 39b7644caaf..0287ae96c99 100644 --- a/libs/common/src/models/response/profileOrganizationResponse.ts +++ b/libs/common/src/models/response/profileOrganizationResponse.ts @@ -17,6 +17,7 @@ export class ProfileOrganizationResponse extends BaseResponse { useApi: boolean; useSso: boolean; useKeyConnector: boolean; + useScim: boolean; useResetPassword: boolean; selfHost: boolean; usersGetPremium: boolean; @@ -57,6 +58,7 @@ export class ProfileOrganizationResponse extends BaseResponse { this.useApi = this.getResponseProperty("UseApi"); this.useSso = this.getResponseProperty("UseSso"); this.useKeyConnector = this.getResponseProperty("UseKeyConnector") ?? false; + this.useScim = this.getResponseProperty("UseScim") ?? false; this.useResetPassword = this.getResponseProperty("UseResetPassword"); this.selfHost = this.getResponseProperty("SelfHost"); this.usersGetPremium = this.getResponseProperty("UsersGetPremium"); diff --git a/libs/common/src/services/api.service.ts b/libs/common/src/services/api.service.ts index 9f2108663cf..9950bfdef19 100644 --- a/libs/common/src/services/api.service.ts +++ b/libs/common/src/services/api.service.ts @@ -4,6 +4,7 @@ import { EnvironmentService } from "../abstractions/environment.service"; import { PlatformUtilsService } from "../abstractions/platformUtils.service"; import { TokenService } from "../abstractions/token.service"; import { DeviceType } from "../enums/deviceType"; +import { OrganizationApiKeyType } from "../enums/organizationApiKeyType"; import { OrganizationConnectionType } from "../enums/organizationConnectionType"; import { PolicyType } from "../enums/policyType"; import { Utils } from "../misc/utils"; @@ -30,7 +31,6 @@ import { EmergencyAccessInviteRequest } from "../models/request/emergencyAccessI import { EmergencyAccessPasswordRequest } from "../models/request/emergencyAccessPasswordRequest"; import { EmergencyAccessUpdateRequest } from "../models/request/emergencyAccessUpdateRequest"; import { EventRequest } from "../models/request/eventRequest"; -import { FolderRequest } from "../models/request/folderRequest"; import { GroupRequest } from "../models/request/groupRequest"; import { IapCheckRequest } from "../models/request/iapCheckRequest"; import { ApiTokenRequest } from "../models/request/identityToken/apiTokenRequest"; @@ -126,7 +126,6 @@ import { } from "../models/response/emergencyAccessResponse"; import { ErrorResponse } from "../models/response/errorResponse"; import { EventResponse } from "../models/response/eventResponse"; -import { FolderResponse } from "../models/response/folderResponse"; import { GroupDetailsResponse, GroupResponse } from "../models/response/groupResponse"; import { IdentityCaptchaResponse } from "../models/response/identityCaptchaResponse"; import { IdentityTokenResponse } from "../models/response/identityTokenResponse"; @@ -487,27 +486,6 @@ export class ApiService implements ApiServiceAbstraction { return new BillingPaymentResponse(r); } - // Folder APIs - - async getFolder(id: string): Promise { - const r = await this.send("GET", "/folders/" + id, null, true, true); - return new FolderResponse(r); - } - - async postFolder(request: FolderRequest): Promise { - const r = await this.send("POST", "/folders", request, true, true); - return new FolderResponse(r); - } - - async putFolder(id: string, request: FolderRequest): Promise { - const r = await this.send("PUT", "/folders/" + id, request, true, true); - return new FolderResponse(r); - } - - deleteFolder(id: string): Promise { - return this.send("DELETE", "/folders/" + id, null, true, false); - } - // Send APIs async getSend(id: string): Promise { @@ -612,6 +590,11 @@ export class ApiService implements ApiServiceAbstraction { return new CipherResponse(r); } + async getFullCipherDetails(id: string): Promise { + const r = await this.send("GET", "/ciphers/" + id + "/details", null, true, true); + return new CipherResponse(r); + } + async getCipherAdmin(id: string): Promise { const r = await this.send("GET", "/ciphers/" + id + "/admin", null, true, true); return new CipherResponse(r); @@ -1412,7 +1395,7 @@ export class ApiService implements ApiServiceAbstraction { // Plan APIs async getPlans(): Promise> { - const r = await this.send("GET", "/plans/", null, true, true); + const r = await this.send("GET", "/plans/", null, false, true); return new ListResponse(r, PlanResponse); } @@ -1840,15 +1823,14 @@ export class ApiService implements ApiServiceAbstraction { } async getOrganizationApiKeyInformation( - id: string + id: string, + type: OrganizationApiKeyType = null ): Promise> { - const r = await this.send( - "GET", - "/organizations/" + id + "/api-key-information", - null, - true, - true - ); + const uri = + type === null + ? "/organizations/" + id + "/api-key-information" + : "/organizations/" + id + "/api-key-information/" + type; + const r = await this.send("GET", uri, null, true, true); return new ListResponse(r, OrganizationApiKeyInformationResponse); } @@ -2566,7 +2548,7 @@ export class ApiService implements ApiServiceAbstraction { await this.tokenService.setToken(response.accessToken); } - private async send( + async send( method: "GET" | "POST" | "PUT" | "DELETE", path: string, body: any, diff --git a/libs/common/src/services/collection.service.ts b/libs/common/src/services/collection.service.ts index 4d3563d7c5d..12054916e01 100644 --- a/libs/common/src/services/collection.service.ts +++ b/libs/common/src/services/collection.service.ts @@ -86,6 +86,7 @@ export class CollectionService implements CollectionServiceAbstraction { const collections = await this.getAll(); decryptedCollections = await this.decryptMany(collections); + await this.stateService.setDecryptedCollections(decryptedCollections); return decryptedCollections; } diff --git a/libs/common/src/services/crypto.service.ts b/libs/common/src/services/crypto.service.ts index d4f9bd1de17..0d625295e42 100644 --- a/libs/common/src/services/crypto.service.ts +++ b/libs/common/src/services/crypto.service.ts @@ -13,9 +13,11 @@ import { KeySuffixOptions } from "../enums/keySuffixOptions"; import { sequentialize } from "../misc/sequentialize"; import { Utils } from "../misc/utils"; import { EEFLongWordList } from "../misc/wordlist"; +import { EncryptedOrganizationKeyData } from "../models/data/encryptedOrganizationKeyData"; import { EncArrayBuffer } from "../models/domain/encArrayBuffer"; import { EncString } from "../models/domain/encString"; import { EncryptedObject } from "../models/domain/encryptedObject"; +import { BaseEncryptedOrganizationKey } from "../models/domain/encryptedOrganizationKey"; import { SymmetricCryptoKey } from "../models/domain/symmetricCryptoKey"; import { ProfileOrganizationResponse } from "../models/response/profileOrganizationResponse"; import { ProfileProviderOrganizationResponse } from "../models/response/profileProviderOrganizationResponse"; @@ -58,23 +60,28 @@ export class CryptoService implements CryptoServiceAbstraction { } async setOrgKeys( - orgs: ProfileOrganizationResponse[], - providerOrgs: ProfileProviderOrganizationResponse[] + orgs: ProfileOrganizationResponse[] = [], + providerOrgs: ProfileProviderOrganizationResponse[] = [] ): Promise { - const orgKeys: any = {}; + const encOrgKeyData: { [orgId: string]: EncryptedOrganizationKeyData } = {}; + orgs.forEach((org) => { - orgKeys[org.id] = org.key; + encOrgKeyData[org.id] = { + type: "organization", + key: org.key, + }; }); - for (const providerOrg of providerOrgs) { - // Convert provider encrypted keys to user encrypted. - const providerKey = await this.getProviderKey(providerOrg.providerId); - const decValue = await this.decryptToBytes(new EncString(providerOrg.key), providerKey); - orgKeys[providerOrg.id] = (await this.rsaEncrypt(decValue)).encryptedString; - } + providerOrgs.forEach((org) => { + encOrgKeyData[org.id] = { + type: "provider", + providerId: org.providerId, + key: org.key, + }; + }); await this.stateService.setDecryptedOrganizationKeys(null); - return await this.stateService.setEncryptedOrganizationKeys(orgKeys); + return await this.stateService.setEncryptedOrganizationKeys(encOrgKeyData); } async setProviderKeys(providers: ProfileProviderResponse[]): Promise { @@ -211,35 +218,36 @@ export class CryptoService implements CryptoServiceAbstraction { @sequentialize(() => "getOrgKeys") async getOrgKeys(): Promise> { - const orgKeys: Map = new Map(); + const result: Map = new Map(); const decryptedOrganizationKeys = await this.stateService.getDecryptedOrganizationKeys(); if (decryptedOrganizationKeys != null && decryptedOrganizationKeys.size > 0) { return decryptedOrganizationKeys; } - const encOrgKeys = await this.stateService.getEncryptedOrganizationKeys(); - if (encOrgKeys == null) { + const encOrgKeyData = await this.stateService.getEncryptedOrganizationKeys(); + if (encOrgKeyData == null) { return null; } let setKey = false; - for (const orgId in encOrgKeys) { - // eslint-disable-next-line - if (!encOrgKeys.hasOwnProperty(orgId)) { + for (const orgId of Object.keys(encOrgKeyData)) { + if (result.has(orgId)) { continue; } - const decValue = await this.rsaDecrypt(encOrgKeys[orgId]); - orgKeys.set(orgId, new SymmetricCryptoKey(decValue)); + const encOrgKey = BaseEncryptedOrganizationKey.fromData(encOrgKeyData[orgId]); + const decOrgKey = await encOrgKey.decrypt(this); + result.set(orgId, decOrgKey); + setKey = true; } if (setKey) { - await this.stateService.setDecryptedOrganizationKeys(orgKeys); + await this.stateService.setDecryptedOrganizationKeys(result); } - return orgKeys; + return result; } async getOrgKey(orgId: string): Promise { diff --git a/libs/common/src/services/environment.service.ts b/libs/common/src/services/environment.service.ts index b13afd59acd..c22d7d85e62 100644 --- a/libs/common/src/services/environment.service.ts +++ b/libs/common/src/services/environment.service.ts @@ -19,6 +19,7 @@ export class EnvironmentService implements EnvironmentServiceAbstraction { private notificationsUrl: string; private eventsUrl: string; private keyConnectorUrl: string; + private scimUrl: string = null; constructor(private stateService: StateService) { this.stateService.activeAccount.subscribe(async () => { @@ -111,6 +112,16 @@ export class EnvironmentService implements EnvironmentServiceAbstraction { return this.keyConnectorUrl; } + getScimUrl() { + if (this.scimUrl != null) { + return this.scimUrl + "/v2"; + } + + return this.getWebVaultUrl() === "https://vault.bitwarden.com" + ? "https://scim.bitwarden.com/v2" + : this.getWebVaultUrl() + "/scim/v2"; + } + async setUrlsFromStorage(): Promise { const urls: any = await this.stateService.getEnvironmentUrls(); const envUrls = new EnvironmentUrls(); @@ -123,6 +134,7 @@ export class EnvironmentService implements EnvironmentServiceAbstraction { this.notificationsUrl = urls.notifications; this.eventsUrl = envUrls.events = urls.events; this.keyConnectorUrl = urls.keyConnector; + // scimUrl is not saved to storage } async setUrls(urls: Urls): Promise { @@ -135,6 +147,9 @@ export class EnvironmentService implements EnvironmentServiceAbstraction { urls.events = this.formatUrl(urls.events); urls.keyConnector = this.formatUrl(urls.keyConnector); + // scimUrl cannot be cleared + urls.scim = this.formatUrl(urls.scim) ?? this.scimUrl; + await this.stateService.setEnvironmentUrls({ base: urls.base, api: urls.api, @@ -144,6 +159,7 @@ export class EnvironmentService implements EnvironmentServiceAbstraction { notifications: urls.notifications, events: urls.events, keyConnector: urls.keyConnector, + // scimUrl is not saved to storage }); this.baseUrl = urls.base; @@ -154,6 +170,7 @@ export class EnvironmentService implements EnvironmentServiceAbstraction { this.notificationsUrl = urls.notifications; this.eventsUrl = urls.events; this.keyConnectorUrl = urls.keyConnector; + this.scimUrl = urls.scim; this.urlsSubject.next(urls); @@ -170,6 +187,7 @@ export class EnvironmentService implements EnvironmentServiceAbstraction { notifications: this.notificationsUrl, events: this.eventsUrl, keyConnector: this.keyConnectorUrl, + scim: this.scimUrl, }; } diff --git a/libs/common/src/services/export.service.ts b/libs/common/src/services/export.service.ts index c6f08be6d26..11695936196 100644 --- a/libs/common/src/services/export.service.ts +++ b/libs/common/src/services/export.service.ts @@ -1,4 +1,5 @@ import * as papa from "papaparse"; +import { firstValueFrom } from "rxjs"; import { ApiService } from "../abstractions/api.service"; import { CipherService } from "../abstractions/cipher.service"; @@ -8,7 +9,7 @@ import { ExportFormat, ExportService as ExportServiceAbstraction, } from "../abstractions/export.service"; -import { FolderService } from "../abstractions/folder.service"; +import { FolderService } from "../abstractions/folder/folder.service.abstraction"; import { CipherType } from "../enums/cipherType"; import { DEFAULT_KDF_ITERATIONS, KdfType } from "../enums/kdfType"; import { Utils } from "../misc/utils"; @@ -115,7 +116,7 @@ export class ExportService implements ExportServiceAbstraction { const promises = []; promises.push( - this.folderService.getAllDecrypted().then((folders) => { + firstValueFrom(this.folderService.folderViews$).then((folders) => { decFolders = folders; }) ); @@ -191,7 +192,7 @@ export class ExportService implements ExportServiceAbstraction { const promises = []; promises.push( - this.folderService.getAll().then((f) => { + firstValueFrom(this.folderService.folders$).then((f) => { folders = f; }) ); diff --git a/libs/common/src/services/folder.service.ts b/libs/common/src/services/folder.service.ts deleted file mode 100644 index f791c07f4d2..00000000000 --- a/libs/common/src/services/folder.service.ts +++ /dev/null @@ -1,193 +0,0 @@ -import { ApiService } from "../abstractions/api.service"; -import { CipherService } from "../abstractions/cipher.service"; -import { CryptoService } from "../abstractions/crypto.service"; -import { FolderService as FolderServiceAbstraction } from "../abstractions/folder.service"; -import { I18nService } from "../abstractions/i18n.service"; -import { StateService } from "../abstractions/state.service"; -import { ServiceUtils } from "../misc/serviceUtils"; -import { Utils } from "../misc/utils"; -import { CipherData } from "../models/data/cipherData"; -import { FolderData } from "../models/data/folderData"; -import { Folder } from "../models/domain/folder"; -import { SymmetricCryptoKey } from "../models/domain/symmetricCryptoKey"; -import { TreeNode } from "../models/domain/treeNode"; -import { FolderRequest } from "../models/request/folderRequest"; -import { FolderResponse } from "../models/response/folderResponse"; -import { FolderView } from "../models/view/folderView"; - -const NestingDelimiter = "/"; - -export class FolderService implements FolderServiceAbstraction { - constructor( - private cryptoService: CryptoService, - private apiService: ApiService, - private i18nService: I18nService, - private cipherService: CipherService, - private stateService: StateService - ) {} - - async clearCache(userId?: string): Promise { - await this.stateService.setDecryptedFolders(null, { userId: userId }); - } - - async encrypt(model: FolderView, key?: SymmetricCryptoKey): Promise { - const folder = new Folder(); - folder.id = model.id; - folder.name = await this.cryptoService.encrypt(model.name, key); - return folder; - } - - async get(id: string): Promise { - const folders = await this.stateService.getEncryptedFolders(); - // eslint-disable-next-line - if (folders == null || !folders.hasOwnProperty(id)) { - return null; - } - - return new Folder(folders[id]); - } - - async getAll(): Promise { - const folders = await this.stateService.getEncryptedFolders(); - const response: Folder[] = []; - for (const id in folders) { - // eslint-disable-next-line - if (folders.hasOwnProperty(id)) { - response.push(new Folder(folders[id])); - } - } - return response; - } - - async getAllDecrypted(): Promise { - const decryptedFolders = await this.stateService.getDecryptedFolders(); - if (decryptedFolders != null) { - return decryptedFolders; - } - - const hasKey = await this.cryptoService.hasKey(); - if (!hasKey) { - throw new Error("No key."); - } - - const decFolders: FolderView[] = []; - const promises: Promise[] = []; - const folders = await this.getAll(); - folders.forEach((folder) => { - promises.push(folder.decrypt().then((f) => decFolders.push(f))); - }); - - await Promise.all(promises); - decFolders.sort(Utils.getSortFunction(this.i18nService, "name")); - - const noneFolder = new FolderView(); - noneFolder.name = this.i18nService.t("noneFolder"); - decFolders.push(noneFolder); - - await this.stateService.setDecryptedFolders(decFolders); - return decFolders; - } - - async getAllNested(folders?: FolderView[]): Promise[]> { - folders = folders ?? (await this.getAllDecrypted()); - const nodes: TreeNode[] = []; - folders.forEach((f) => { - const folderCopy = new FolderView(); - folderCopy.id = f.id; - folderCopy.revisionDate = f.revisionDate; - const parts = f.name != null ? f.name.replace(/^\/+|\/+$/g, "").split(NestingDelimiter) : []; - ServiceUtils.nestedTraverse(nodes, 0, parts, folderCopy, null, NestingDelimiter); - }); - return nodes; - } - - async getNested(id: string): Promise> { - const folders = await this.getAllNested(); - return ServiceUtils.getTreeNodeObject(folders, id) as TreeNode; - } - - async saveWithServer(folder: Folder): Promise { - const request = new FolderRequest(folder); - - let response: FolderResponse; - if (folder.id == null) { - response = await this.apiService.postFolder(request); - folder.id = response.id; - } else { - response = await this.apiService.putFolder(folder.id, request); - } - - const data = new FolderData(response); - await this.upsert(data); - } - - async upsert(folder: FolderData | FolderData[]): Promise { - let folders = await this.stateService.getEncryptedFolders(); - if (folders == null) { - folders = {}; - } - - if (folder instanceof FolderData) { - const f = folder as FolderData; - folders[f.id] = f; - } else { - (folder as FolderData[]).forEach((f) => { - folders[f.id] = f; - }); - } - - await this.stateService.setDecryptedFolders(null); - await this.stateService.setEncryptedFolders(folders); - } - - async replace(folders: { [id: string]: FolderData }): Promise { - await this.stateService.setDecryptedFolders(null); - await this.stateService.setEncryptedFolders(folders); - } - - async clear(userId?: string): Promise { - await this.stateService.setDecryptedFolders(null, { userId: userId }); - await this.stateService.setEncryptedFolders(null, { userId: userId }); - } - - async delete(id: string | string[]): Promise { - const folders = await this.stateService.getEncryptedFolders(); - if (folders == null) { - return; - } - - if (typeof id === "string") { - if (folders[id] == null) { - return; - } - delete folders[id]; - } else { - (id as string[]).forEach((i) => { - delete folders[i]; - }); - } - - await this.stateService.setDecryptedFolders(null); - await this.stateService.setEncryptedFolders(folders); - - // Items in a deleted folder are re-assigned to "No Folder" - const ciphers = await this.stateService.getEncryptedCiphers(); - if (ciphers != null) { - const updates: CipherData[] = []; - for (const cId in ciphers) { - if (ciphers[cId].folderId === id) { - ciphers[cId].folderId = null; - updates.push(ciphers[cId]); - } - } - if (updates.length > 0) { - this.cipherService.upsert(updates); - } - } - } - - async deleteWithServer(id: string): Promise { - await this.apiService.deleteFolder(id); - await this.delete(id); - } -} diff --git a/libs/common/src/services/folder/folder-api.service.ts b/libs/common/src/services/folder/folder-api.service.ts new file mode 100644 index 00000000000..d855c063539 --- /dev/null +++ b/libs/common/src/services/folder/folder-api.service.ts @@ -0,0 +1,50 @@ +import { ApiService } from "@bitwarden/common/abstractions/api.service"; +import { FolderApiServiceAbstraction } from "@bitwarden/common/abstractions/folder/folder-api.service.abstraction"; +import { InternalFolderService } from "@bitwarden/common/abstractions/folder/folder.service.abstraction"; +import { FolderData } from "@bitwarden/common/models/data/folderData"; +import { Folder } from "@bitwarden/common/models/domain/folder"; +import { FolderRequest } from "@bitwarden/common/models/request/folderRequest"; +import { FolderResponse } from "@bitwarden/common/models/response/folderResponse"; + +export class FolderApiService implements FolderApiServiceAbstraction { + constructor(private folderService: InternalFolderService, private apiService: ApiService) {} + + async save(folder: Folder): Promise { + const request = new FolderRequest(folder); + + let response: FolderResponse; + if (folder.id == null) { + response = await this.postFolder(request); + folder.id = response.id; + } else { + response = await this.putFolder(folder.id, request); + } + + const data = new FolderData(response); + await this.folderService.upsert(data); + } + + async delete(id: string): Promise { + await this.deleteFolder(id); + await this.folderService.delete(id); + } + + async get(id: string): Promise { + const r = await this.apiService.send("GET", "/folders/" + id, null, true, true); + return new FolderResponse(r); + } + + private async postFolder(request: FolderRequest): Promise { + const r = await this.apiService.send("POST", "/folders", request, true, true); + return new FolderResponse(r); + } + + async putFolder(id: string, request: FolderRequest): Promise { + const r = await this.apiService.send("PUT", "/folders/" + id, request, true, true); + return new FolderResponse(r); + } + + private deleteFolder(id: string): Promise { + return this.apiService.send("DELETE", "/folders/" + id, null, true, false); + } +} diff --git a/libs/common/src/services/folder/folder.service.ts b/libs/common/src/services/folder/folder.service.ts new file mode 100644 index 00000000000..222ea44fb35 --- /dev/null +++ b/libs/common/src/services/folder/folder.service.ts @@ -0,0 +1,163 @@ +import { BehaviorSubject } from "rxjs"; + +import { CipherService } from "../../abstractions/cipher.service"; +import { CryptoService } from "../../abstractions/crypto.service"; +import { InternalFolderService as InternalFolderServiceAbstraction } from "../../abstractions/folder/folder.service.abstraction"; +import { I18nService } from "../../abstractions/i18n.service"; +import { StateService } from "../../abstractions/state.service"; +import { Utils } from "../../misc/utils"; +import { CipherData } from "../../models/data/cipherData"; +import { FolderData } from "../../models/data/folderData"; +import { Folder } from "../../models/domain/folder"; +import { SymmetricCryptoKey } from "../../models/domain/symmetricCryptoKey"; +import { FolderView } from "../../models/view/folderView"; + +export class FolderService implements InternalFolderServiceAbstraction { + private _folders: BehaviorSubject = new BehaviorSubject([]); + private _folderViews: BehaviorSubject = new BehaviorSubject([]); + + folders$ = this._folders.asObservable(); + folderViews$ = this._folderViews.asObservable(); + + constructor( + private cryptoService: CryptoService, + private i18nService: I18nService, + private cipherService: CipherService, + private stateService: StateService + ) { + this.stateService.activeAccountUnlocked.subscribe(async (unlocked) => { + if ((Utils.global as any).bitwardenContainerService == null) { + return; + } + + if (!unlocked) { + this._folders.next([]); + this._folderViews.next([]); + return; + } + + const data = await this.stateService.getEncryptedFolders(); + + await this.updateObservables(data); + }); + } + + async clearCache(): Promise { + this._folderViews.next([]); + } + + // TODO: This should be moved to EncryptService or something + async encrypt(model: FolderView, key?: SymmetricCryptoKey): Promise { + const folder = new Folder(); + folder.id = model.id; + folder.name = await this.cryptoService.encrypt(model.name, key); + return folder; + } + + async get(id: string): Promise { + const folders = this._folders.getValue(); + + return folders.find((folder) => folder.id === id); + } + + /** + * @deprecated Only use in CLI! + */ + async getAllDecryptedFromState(): Promise { + const data = await this.stateService.getEncryptedFolders(); + const folders = Object.values(data || {}).map((f) => new Folder(f)); + + return this.decryptFolders(folders); + } + + async upsert(folder: FolderData | FolderData[]): Promise { + let folders = await this.stateService.getEncryptedFolders(); + if (folders == null) { + folders = {}; + } + + if (folder instanceof FolderData) { + const f = folder as FolderData; + folders[f.id] = f; + } else { + (folder as FolderData[]).forEach((f) => { + folders[f.id] = f; + }); + } + + await this.updateObservables(folders); + await this.stateService.setEncryptedFolders(folders); + } + + async replace(folders: { [id: string]: FolderData }): Promise { + await this.updateObservables(folders); + await this.stateService.setEncryptedFolders(folders); + } + + async clear(userId?: string): Promise { + if (userId == null || userId == (await this.stateService.getUserId())) { + this._folders.next([]); + this._folderViews.next([]); + } + await this.stateService.setEncryptedFolders(null, { userId: userId }); + } + + async delete(id: string | string[]): Promise { + const folders = await this.stateService.getEncryptedFolders(); + if (folders == null) { + return; + } + + if (typeof id === "string") { + if (folders[id] == null) { + return; + } + delete folders[id]; + } else { + (id as string[]).forEach((i) => { + delete folders[i]; + }); + } + + await this.updateObservables(folders); + await this.stateService.setEncryptedFolders(folders); + + // Items in a deleted folder are re-assigned to "No Folder" + const ciphers = await this.stateService.getEncryptedCiphers(); + if (ciphers != null) { + const updates: CipherData[] = []; + for (const cId in ciphers) { + if (ciphers[cId].folderId === id) { + ciphers[cId].folderId = null; + updates.push(ciphers[cId]); + } + } + if (updates.length > 0) { + this.cipherService.upsert(updates); + } + } + } + + private async updateObservables(foldersMap: { [id: string]: FolderData }) { + const folders = Object.values(foldersMap || {}).map((f) => new Folder(f)); + + this._folders.next(folders); + + if (await this.cryptoService.hasKey()) { + this._folderViews.next(await this.decryptFolders(folders)); + } + } + + private async decryptFolders(folders: Folder[]) { + const decryptFolderPromises = folders.map((f) => f.decrypt()); + const decryptedFolders = await Promise.all(decryptFolderPromises); + + decryptedFolders.sort(Utils.getSortFunction(this.i18nService, "name")); + + const noneFolder = new FolderView(); + noneFolder.name = this.i18nService.t("noneFolder"); + decryptedFolders.push(noneFolder); + + return decryptedFolders; + } +} diff --git a/libs/common/src/services/formValidationErrors.service.ts b/libs/common/src/services/formValidationErrors.service.ts new file mode 100644 index 00000000000..c5ce5377eb8 --- /dev/null +++ b/libs/common/src/services/formValidationErrors.service.ts @@ -0,0 +1,31 @@ +import { FormGroup, ValidationErrors } from "@angular/forms"; + +import { + FormGroupControls, + FormValidationErrorsService as FormValidationErrorsAbstraction, + AllValidationErrors, +} from "../abstractions/formValidationErrors.service"; + +export class FormValidationErrorsService implements FormValidationErrorsAbstraction { + getFormValidationErrors(controls: FormGroupControls): AllValidationErrors[] { + let errors: AllValidationErrors[] = []; + Object.keys(controls).forEach((key) => { + const control = controls[key]; + if (control instanceof FormGroup) { + errors = errors.concat(this.getFormValidationErrors(control.controls)); + } + + const controlErrors: ValidationErrors = controls[key].errors; + if (controlErrors !== null) { + Object.keys(controlErrors).forEach((keyError) => { + errors.push({ + controlName: key, + errorName: keyError, + }); + }); + } + }); + + return errors; + } +} diff --git a/libs/common/src/services/i18n.service.ts b/libs/common/src/services/i18n.service.ts index fda8f839ead..9281cc8cf4d 100644 --- a/libs/common/src/services/i18n.service.ts +++ b/libs/common/src/services/i18n.service.ts @@ -1,7 +1,10 @@ +import { Observable, ReplaySubject } from "rxjs"; + import { I18nService as I18nServiceAbstraction } from "../abstractions/i18n.service"; export class I18nService implements I18nServiceAbstraction { - locale: string; + private _locale = new ReplaySubject(1); + locale$: Observable = this._locale.asObservable(); // First locale is the default (English) supportedTranslationLocales: string[] = ["en"]; translationLocale: string; @@ -85,10 +88,14 @@ export class I18nService implements I18nServiceAbstraction { } this.inited = true; - this.locale = this.translationLocale = locale != null ? locale : this.systemLanguage; + this.translationLocale = locale != null ? locale : this.systemLanguage; + this._locale.next(this.translationLocale); try { - this.collator = new Intl.Collator(this.locale, { numeric: true, sensitivity: "base" }); + this.collator = new Intl.Collator(this.translationLocale, { + numeric: true, + sensitivity: "base", + }); } catch { this.collator = null; } diff --git a/libs/common/src/services/import.service.ts b/libs/common/src/services/import.service.ts index 86226d7d6a7..2b1b7bd5678 100644 --- a/libs/common/src/services/import.service.ts +++ b/libs/common/src/services/import.service.ts @@ -2,7 +2,7 @@ import { ApiService } from "../abstractions/api.service"; import { CipherService } from "../abstractions/cipher.service"; import { CollectionService } from "../abstractions/collection.service"; import { CryptoService } from "../abstractions/crypto.service"; -import { FolderService } from "../abstractions/folder.service"; +import { FolderService } from "../abstractions/folder/folder.service.abstraction"; import { I18nService } from "../abstractions/i18n.service"; import { ImportService as ImportServiceAbstraction } from "../abstractions/import.service"; import { PlatformUtilsService } from "../abstractions/platformUtils.service"; diff --git a/libs/common/src/services/search.service.ts b/libs/common/src/services/search.service.ts index c020dd299f9..fe2c87c33d8 100644 --- a/libs/common/src/services/search.service.ts +++ b/libs/common/src/services/search.service.ts @@ -14,16 +14,23 @@ export class SearchService implements SearchServiceAbstraction { indexedEntityId?: string = null; private indexing = false; private index: lunr.Index = null; - private searchableMinLength = 2; + private readonly immediateSearchLocales: string[] = ["zh-CN", "zh-TW", "ja", "ko", "vi"]; + private readonly defaultSearchableMinLength: number = 2; + private searchableMinLength: number = this.defaultSearchableMinLength; constructor( private cipherService: CipherService, private logService: LogService, private i18nService: I18nService ) { - if (["zh-CN", "zh-TW"].indexOf(i18nService.locale) !== -1) { - this.searchableMinLength = 1; - } + this.i18nService.locale$.subscribe((locale) => { + if (this.immediateSearchLocales.indexOf(locale) !== -1) { + this.searchableMinLength = 1; + } else { + this.searchableMinLength = this.defaultSearchableMinLength; + } + }); + //register lunr pipeline function lunr.Pipeline.registerFunction(this.normalizeAccentsPipelineFunction, "normalizeAccents"); } diff --git a/libs/common/src/services/state.service.ts b/libs/common/src/services/state.service.ts index c2ae787482a..8fe91210f64 100644 --- a/libs/common/src/services/state.service.ts +++ b/libs/common/src/services/state.service.ts @@ -13,6 +13,7 @@ import { StateFactory } from "../factories/stateFactory"; import { Utils } from "../misc/utils"; import { CipherData } from "../models/data/cipherData"; import { CollectionData } from "../models/data/collectionData"; +import { EncryptedOrganizationKeyData } from "../models/data/encryptedOrganizationKeyData"; import { EventData } from "../models/data/eventData"; import { FolderData } from "../models/data/folderData"; import { OrganizationData } from "../models/data/organizationData"; @@ -31,7 +32,6 @@ import { SymmetricCryptoKey } from "../models/domain/symmetricCryptoKey"; import { WindowState } from "../models/domain/windowState"; import { CipherView } from "../models/view/cipherView"; import { CollectionView } from "../models/view/collectionView"; -import { FolderView } from "../models/view/folderView"; import { SendView } from "../models/view/sendView"; const keys = { @@ -56,6 +56,7 @@ export class StateService< { accounts = new BehaviorSubject<{ [userId: string]: TAccount }>({}); activeAccount = new BehaviorSubject(null); + activeAccountUnlocked = new BehaviorSubject(false); private hasBeenInited = false; private isRecoveredSession = false; @@ -70,7 +71,21 @@ export class StateService< protected stateMigrationService: StateMigrationService, protected stateFactory: StateFactory, protected useAccountCache: boolean = true - ) {} + ) { + // If the account gets changed, verify the new account is unlocked + this.activeAccount.subscribe(async (userId) => { + if (userId == null && this.activeAccountUnlocked.getValue() == false) { + return; + } else if (userId == null) { + this.activeAccountUnlocked.next(false); + } + + // FIXME: This should be refactored into AuthService or a similar service, + // as checking for the existance of the crypto key is a low level + // implementation detail. + this.activeAccountUnlocked.next((await this.getCryptoMasterKey()) != null); + }); + } async init(): Promise { if (this.hasBeenInited) { @@ -499,6 +514,15 @@ export class StateService< account, this.reconcileOptions(options, await this.defaultInMemoryOptions()) ); + + if (options.userId == this.activeAccount.getValue()) { + const nextValue = value != null; + + // Avoid emitting if we are already unlocked + if (this.activeAccountUnlocked.getValue() != nextValue) { + this.activeAccountUnlocked.next(nextValue); + } + } } async getCryptoMasterKeyAuto(options?: StorageOptions): Promise { @@ -658,24 +682,6 @@ export class StateService< ); } - @withPrototypeForArrayMembers(FolderView) - async getDecryptedFolders(options?: StorageOptions): Promise { - return ( - await this.getAccount(this.reconcileOptions(options, await this.defaultInMemoryOptions())) - )?.data?.folders?.decrypted; - } - - async setDecryptedFolders(value: FolderView[], options?: StorageOptions): Promise { - const account = await this.getAccount( - this.reconcileOptions(options, await this.defaultInMemoryOptions()) - ); - account.data.folders.decrypted = value; - await this.saveAccount( - account, - this.reconcileOptions(options, await this.defaultInMemoryOptions()) - ); - } - @withPrototypeForMap(SymmetricCryptoKey, SymmetricCryptoKey.initFromJson) async getDecryptedOrganizationKeys( options?: StorageOptions @@ -1363,14 +1369,16 @@ export class StateService< ); } - async getEncryptedOrganizationKeys(options?: StorageOptions): Promise { + async getEncryptedOrganizationKeys( + options?: StorageOptions + ): Promise<{ [orgId: string]: EncryptedOrganizationKeyData }> { return ( await this.getAccount(this.reconcileOptions(options, await this.defaultOnDiskOptions())) )?.keys?.organizationKeys.encrypted; } async setEncryptedOrganizationKeys( - value: Map, + value: { [orgId: string]: EncryptedOrganizationKeyData }, options?: StorageOptions ): Promise { const account = await this.getAccount( @@ -1940,52 +1948,52 @@ export class StateService< async getPasswordGenerationOptions(options?: StorageOptions): Promise { return ( - await this.getAccount(this.reconcileOptions(options, await this.defaultOnDiskOptions())) + await this.getAccount(this.reconcileOptions(options, await this.defaultOnDiskLocalOptions())) )?.settings?.passwordGenerationOptions; } async setPasswordGenerationOptions(value: any, options?: StorageOptions): Promise { const account = await this.getAccount( - this.reconcileOptions(options, await this.defaultOnDiskOptions()) + this.reconcileOptions(options, await this.defaultOnDiskLocalOptions()) ); account.settings.passwordGenerationOptions = value; await this.saveAccount( account, - this.reconcileOptions(options, await this.defaultOnDiskOptions()) + this.reconcileOptions(options, await this.defaultOnDiskLocalOptions()) ); } async getUsernameGenerationOptions(options?: StorageOptions): Promise { return ( - await this.getAccount(this.reconcileOptions(options, await this.defaultOnDiskOptions())) + await this.getAccount(this.reconcileOptions(options, await this.defaultOnDiskLocalOptions())) )?.settings?.usernameGenerationOptions; } async setUsernameGenerationOptions(value: any, options?: StorageOptions): Promise { const account = await this.getAccount( - this.reconcileOptions(options, await this.defaultOnDiskOptions()) + this.reconcileOptions(options, await this.defaultOnDiskLocalOptions()) ); account.settings.usernameGenerationOptions = value; await this.saveAccount( account, - this.reconcileOptions(options, await this.defaultOnDiskOptions()) + this.reconcileOptions(options, await this.defaultOnDiskLocalOptions()) ); } async getGeneratorOptions(options?: StorageOptions): Promise { return ( - await this.getAccount(this.reconcileOptions(options, await this.defaultOnDiskOptions())) + await this.getAccount(this.reconcileOptions(options, await this.defaultOnDiskLocalOptions())) )?.settings?.generatorOptions; } async setGeneratorOptions(value: any, options?: StorageOptions): Promise { const account = await this.getAccount( - this.reconcileOptions(options, await this.defaultOnDiskOptions()) + this.reconcileOptions(options, await this.defaultOnDiskLocalOptions()) ); account.settings.generatorOptions = value; await this.saveAccount( account, - this.reconcileOptions(options, await this.defaultOnDiskOptions()) + this.reconcileOptions(options, await this.defaultOnDiskLocalOptions()) ); } diff --git a/libs/common/src/services/stateMigration.service.ts b/libs/common/src/services/stateMigration.service.ts index 0fc38aa2976..0d723e98473 100644 --- a/libs/common/src/services/stateMigration.service.ts +++ b/libs/common/src/services/stateMigration.service.ts @@ -155,6 +155,15 @@ export class StateMigrationService< case StateVersion.Three: await this.migrateStateFrom3To4(); break; + case StateVersion.Four: { + const authenticatedAccounts = await this.getAuthenticatedAccounts(); + for (const account of authenticatedAccounts) { + const migratedAccount = await this.migrateAccountFrom4To5(account); + await this.set(account.profile.userId, migratedAccount); + } + await this.setCurrentStateVersion(StateVersion.Five); + break; + } } currentStateVersion += 1; @@ -488,6 +497,20 @@ export class StateMigrationService< await this.set(keys.global, globals); } + protected async migrateAccountFrom4To5(account: TAccount): Promise { + const encryptedOrgKeys = account.keys?.organizationKeys?.encrypted; + if (encryptedOrgKeys != null) { + for (const [orgId, encKey] of Object.entries(encryptedOrgKeys)) { + encryptedOrgKeys[orgId] = { + type: "organization", + key: encKey as unknown as string, // Account v4 does not reflect the current account model so we have to cast + }; + } + } + + return account; + } + protected get options(): StorageOptions { return { htmlStorageLocation: HtmlStorageLocation.Local }; } @@ -510,4 +533,15 @@ export class StateMigrationService< protected async getCurrentStateVersion(): Promise { return (await this.getGlobals())?.stateVersion ?? StateVersion.One; } + + protected async setCurrentStateVersion(newVersion: StateVersion): Promise { + const globals = await this.getGlobals(); + globals.stateVersion = newVersion; + await this.set(keys.global, globals); + } + + protected async getAuthenticatedAccounts(): Promise { + const authenticatedUserIds = await this.get(keys.authenticatedAccounts); + return Promise.all(authenticatedUserIds.map((id) => this.get(id))); + } } diff --git a/libs/common/src/services/sync.service.ts b/libs/common/src/services/sync.service.ts index c054a211f1c..b96ff24d392 100644 --- a/libs/common/src/services/sync.service.ts +++ b/libs/common/src/services/sync.service.ts @@ -2,7 +2,8 @@ import { ApiService } from "../abstractions/api.service"; import { CipherService } from "../abstractions/cipher.service"; import { CollectionService } from "../abstractions/collection.service"; import { CryptoService } from "../abstractions/crypto.service"; -import { FolderService } from "../abstractions/folder.service"; +import { FolderApiServiceAbstraction } from "../abstractions/folder/folder-api.service.abstraction"; +import { InternalFolderService } from "../abstractions/folder/folder.service.abstraction"; import { KeyConnectorService } from "../abstractions/keyConnector.service"; import { LogService } from "../abstractions/log.service"; import { MessagingService } from "../abstractions/messaging.service"; @@ -40,7 +41,7 @@ export class SyncService implements SyncServiceAbstraction { constructor( private apiService: ApiService, private settingsService: SettingsService, - private folderService: FolderService, + private folderService: InternalFolderService, private cipherService: CipherService, private cryptoService: CryptoService, private collectionService: CollectionService, @@ -52,6 +53,7 @@ export class SyncService implements SyncServiceAbstraction { private stateService: StateService, private organizationService: OrganizationService, private providerService: ProviderService, + private folderApiService: FolderApiServiceAbstraction, private logoutCallback: (expired: boolean) => Promise ) {} @@ -127,7 +129,7 @@ export class SyncService implements SyncServiceAbstraction { (!isEdit && localFolder == null) || (isEdit && localFolder != null && localFolder.revisionDate < notification.revisionDate) ) { - const remoteFolder = await this.apiService.getFolder(notification.id); + const remoteFolder = await this.folderApiService.get(notification.id); if (remoteFolder != null) { await this.folderService.upsert(new FolderData(remoteFolder)); this.messagingService.send("syncedUpsertedFolder", { folderId: notification.id }); @@ -196,7 +198,7 @@ export class SyncService implements SyncServiceAbstraction { } if (shouldUpdate) { - const remoteCipher = await this.apiService.getCipher(notification.id); + const remoteCipher = await this.apiService.getFullCipherDetails(notification.id); if (remoteCipher != null) { await this.cipherService.upsert(new CipherData(remoteCipher)); this.messagingService.send("syncedUpsertedCipher", { cipherId: notification.id }); diff --git a/libs/common/src/services/vaultTimeout.service.ts b/libs/common/src/services/vaultTimeout.service.ts index 935c55d8e6b..d087ab4277c 100644 --- a/libs/common/src/services/vaultTimeout.service.ts +++ b/libs/common/src/services/vaultTimeout.service.ts @@ -2,7 +2,7 @@ import { AuthService } from "../abstractions/auth.service"; import { CipherService } from "../abstractions/cipher.service"; import { CollectionService } from "../abstractions/collection.service"; import { CryptoService } from "../abstractions/crypto.service"; -import { FolderService } from "../abstractions/folder.service"; +import { FolderService } from "../abstractions/folder/folder.service.abstraction"; import { KeyConnectorService } from "../abstractions/keyConnector.service"; import { MessagingService } from "../abstractions/messaging.service"; import { PlatformUtilsService } from "../abstractions/platformUtils.service"; @@ -80,6 +80,7 @@ export class VaultTimeoutService implements VaultTimeoutServiceAbstraction { if (userId == null || userId === (await this.stateService.getUserId())) { this.searchService.clearIndex(); + await this.folderService.clearCache(); } await this.stateService.setEverBeenUnlocked(true, { userId: userId }); @@ -91,7 +92,6 @@ export class VaultTimeoutService implements VaultTimeoutServiceAbstraction { await this.cryptoService.clearKeyPair(true, userId); await this.cryptoService.clearEncKey(true, userId); - await this.folderService.clearCache(userId); await this.cipherService.clearCache(userId); await this.collectionService.clearCache(userId); diff --git a/libs/components/src/badge/badge.directive.ts b/libs/components/src/badge/badge.directive.ts index 4d949bc6811..352da9c41fd 100644 --- a/libs/components/src/badge/badge.directive.ts +++ b/libs/components/src/badge/badge.directive.ts @@ -26,11 +26,10 @@ const hoverStyles: Record = { export class BadgeDirective { @HostBinding("class") get classList() { return [ - "tw-inline-block", - "tw-py-1", + "tw-inline", + "tw-py-0.5", "tw-px-1.5", "tw-font-bold", - "tw-leading-none", "tw-text-center", "!tw-text-contrast", "tw-rounded", diff --git a/libs/components/src/form-field/error.component.ts b/libs/components/src/form-field/error.component.ts index 26c1eec78f5..5cf95545e2a 100644 --- a/libs/components/src/form-field/error.component.ts +++ b/libs/components/src/form-field/error.component.ts @@ -26,6 +26,8 @@ export class BitErrorComponent { return this.i18nService.t("inputRequired"); case "email": return this.i18nService.t("inputEmail"); + case "minlength": + return this.i18nService.t("inputMinLength", this.error[1]?.requiredLength); default: // Attempt to show a custom error message. if (this.error[1]?.message) { diff --git a/libs/components/src/form-field/form-field.stories.ts b/libs/components/src/form-field/form-field.stories.ts index 96cacb97645..d1d00c59175 100644 --- a/libs/components/src/form-field/form-field.stories.ts +++ b/libs/components/src/form-field/form-field.stories.ts @@ -180,6 +180,27 @@ const ButtonGroupTemplate: Story = (args: BitFormFieldCom export const ButtonInputGroup = ButtonGroupTemplate.bind({}); ButtonInputGroup.args = {}; +const DisabledButtonInputGroupTemplate: Story = ( + args: BitFormFieldComponent +) => ({ + props: args, + template: ` + + Label + + + + + `, +}); + +export const DisabledButtonInputGroup = DisabledButtonInputGroupTemplate.bind({}); +DisabledButtonInputGroup.args = {}; + const SelectTemplate: Story = (args: BitFormFieldComponent) => ({ props: args, template: ` diff --git a/libs/components/src/form-field/prefix.directive.ts b/libs/components/src/form-field/prefix.directive.ts index 010dbc056e5..edf600d4e7f 100644 --- a/libs/components/src/form-field/prefix.directive.ts +++ b/libs/components/src/form-field/prefix.directive.ts @@ -10,6 +10,8 @@ export const PrefixClasses = [ "tw-border-secondary-500", "tw-text-muted", "tw-rounded-none", + "disabled:!tw-text-muted", + "disabled:tw-border-secondary-500", ]; @Directive({ diff --git a/libs/components/src/index.ts b/libs/components/src/index.ts index cb45e12228e..5ccceae874c 100644 --- a/libs/components/src/index.ts +++ b/libs/components/src/index.ts @@ -1,8 +1,10 @@ export * from "./badge"; export * from "./banner"; export * from "./button"; +export * from "./toggle-group"; export * from "./callout"; export * from "./form-field"; export * from "./menu"; export * from "./utils/i18n-mock.service"; +export * from "./tabs"; export * from "./submit-button"; diff --git a/libs/components/src/stories/icons.stories.mdx b/libs/components/src/stories/icons.stories.mdx new file mode 100644 index 00000000000..516fc090705 --- /dev/null +++ b/libs/components/src/stories/icons.stories.mdx @@ -0,0 +1,188 @@ + + +import { Meta } from "@storybook/addon-docs/"; + + + +# Iconography + +Avoid using icons to convey information unless paired with meaningful, clear text. If an icon must be used and text cannot be displayed visually along with the icon, use an `aria-label` to provide the text to screen readers, and a `title` attribute to provide the text visually through a tool tip. Note: this pattern should only be followed for very common iconography such as, a settings cog icon or an options menu icon. + +## Status Indicators + +| Icon | bwi-name | Usage | +| -------------------------------------------- | ------------------------ | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| | bwi-ban | option or feature not available. Example: send maximum access count was reached | +| | bwi-check | confirmation action (Example: "confirm member"), successful confirmation (toast or callout), or shows currently selected option in a menu. Use with success color variable if applicable. | +| | bwi-error | error; used in form field error states and error toasts, banners, and callouts. Do not use as a close or clear icon. Use with danger color variable. | +| | bwi-exclamation-circle | deprecated error icon; use bwi-error | +| | bwi-exclamation-triangle | warning; used in warning callouts, banners, and toasts. Use with warning color variable. | +| | bwi-info-circle | information; used in info callouts, banners, and toasts. Use with info color variable. | +| | bwi-question-circle | link to help documentation or hover tooltip | +| | bwi-spinner | loading | + +## Bitwarden Objects + +| Icon | bwi-name | Usage | +| ----------------------------------- | --------------- | --------------------------------------------------- | +| | bwi-business | organization or vault for Free, Teams or Enterprise | +| | bwi-collection | collection | +| | bwi-credit-card | card item type | +| | bwi-family | family vault or organization | +| | bwi-folder | folder | +| | bwi-globe | login item type | +| | bwi-id-card | identity item type | +| | bwi-send | send action or feature | +| | bwi-send-f | - | +| | bwi-sticky-note | secure note item type | +| | bwi-users | user group | +| | bwi-vault | general vault | + +## Actions + +| Icon | bwi-name | Usage | +| ------------------------------------- | ----------------- | -------------------------------------------- | +| | bwi-check-circle | check if password has been exposed | +| | bwi-check-square | select all action | +| | bwi-clone | copy to clipboard action | +| | bwi-close | close action | +| | bwi-cog | settings | +| | bwi-cog-f | settings | +| | bwi-cogs | deprecated; do not use in app. | +| | bwi-download | download or export | +| | bwi-envelope | action related to emailing a user | +| | bwi-external-link | open in new window or popout | +| | bwi-eye | show icon for password fields | +| | bwi-eye-slash | hide icon for password fields | +| | bwi-files | clone action / duplicate an item | +| | bwi-generate | generate action in edit item forms | +| | bwi-generate-f | generate feature or action | +| | bwi-lock | lock vault action | +| | bwi-lock-f | - | +| | bwi-minus-circle | remove action | +| | bwi-minus-square | unselect all action | +| | bwi-paste | paste from clipbaord action | +| | bwi-pencil-square | edit action | +| | bwi-play | start or play action | +| | bwi-plus | new or add option in contained buttons/links | +| | bwi-plus-circle | new or add option in text buttons/links | +| | bwi-plus-square | - | +| | bwi-refresh | "re"-action; such as refresh or regenerate | +| | bwi-refresh-tab | - | +| | bwi-save | alternate download action | +| | bwi-save-changes | save changes action | +| | bwi-search | search action | +| | bwi-share | - | +| | bwi-share-arrow | - | +| | bwi-share-square | avoid using; use external-link instead | +| | bwi-sign-in | sign-in action | +| | bwi-sign-out | sign-out action | +| | bwi-star | favorite action | +| | bwi-star-f | favorited / unfavorite action | +| | bwi-stop | stop action | +| | bwi-trash | delete action or trash area | +| | bwi-undo | restore action | +| | bwi-unlock | unlocked | + +## Directional and Menu Indicators + +| Icon | bwi-name | Usage | +| ------------------------------------------ | ---------------------- | ------------------------------------------------------- | +| | bwi-angle-down | drop down or expandable options | +| | bwi-angle-left | - | +| | bwi-angle-right | collapsed section that can be expanded | +| | bwi-arrow-circle-down | table sort order | +| | bwi-arrow-circle-left | - | +| | bwi-arrow-circle-right | - | +| | bwi-arrow-circle-up | table sort order | +| | bwi-caret-down | - | +| | bwi-caret-right | - | +| | bwi-chevron-up | - | +| | bwi-dbl-angle-left | - | +| | bwi-dbl-angle-right | - | +| | bwi-ellipsis-h | more options menu horizontal; used in mobile list items | +| | bwi-ellipsis-v | more optioins menu vertical; used primarily in tables | +| | bwi-filter | Product switcher | +| | bwi-hamburger | navigation indicator | +| | bwi-list | toggle list/grid view | +| | bwi-list-alt | view item action in extension | +| | bwi-long-arrow-right | - | +| | bwi-numbered-list | toggle numbered list view | + +## Misc Objects + +| Icon | bwi-name | Usage | +| ----------------------------------------- | --------------------- | ---------------------------------------------- | +| | bwi-bank | - | +| | bwi-billing | billing options | +| | bwi-bitcoin | crypto | +| | bwi-bolt | deprecated "danger" icon | +| | bwi-bookmark | bookmark or save related actions | +| | bwi-browser | web browser | +| | bwi-bug | test or debug action | +| | bwi-camera | actions related to camera use | +| | bwi-chain-broken | unlink action | +| | bwi-chat | - | +| | bwi-cli | cli client or code | +| | bwi-clock | use for time based actions or views | +| | bwi-cut | cut or omit actions | +| | bwi-dashboard | statuses or dashboard views | +| | bwi-desktop | desktop client | +| | bwi-dollar | account credit | +| | bwi-file | file related objects or actions | +| | bwi-file-pdf | PDF related object or actions | +| | bwi-file-text | text related objects or actions | +| | bwi-bw-folder-open-f1 | - | +| | bwi-folder-closed-f | - | +| | bwi-folder-open | - | +| | bwi-frown | - | +| | bwi-hashtag | link to specific id | +| | bwi-key | key or password related objects or actions | +| | bwi-learning | learning center | +| | bwi-lightbulb | - | +| | bwi-link | link action | +| | bwi-mobile | mobile client | +| | bwi-money | - | +| | bwi-paperclip | attachments | +| | bwi-pencil | editing | +| | bwi-provider | relates to provider or provider portal | +| | bwi-providers | - | +| | bwi-puzzle | - | +| | bwi-rocket | - | +| | bwi-rss | - | +| | bwi-server | - | +| | bwi-shield | - | +| | bwi-sitemap | - | +| | bwi-sliders | reporting or filtering | +| | bwi-square | - | +| | bwi-tag | labels | +| | bwi-thumb-tack | - | +| | bwi-thumbs-up | - | +| | bwi-universal-access | use for accessiblity related actions | +| | bwi-user | relates to current user or organization member | +| | bwi-user-circle | - | +| | bwi-user-f | - | +| | bwi-wrench | tools or aditional configuration options | + +## Platforms and Logos + +| Icon | bwi-name | Usage | +| --------------------------------- | ------------- | ---------------------------- | +| | bwi-android | android support | +| | bwi-apple | apple/IOS support | +| | bwi-chrome | chrome support | +| | bwi-discourse | community forum | +| | bwi-edge | edge support | +| | bwi-facebook | link to our facebook page | +| | bwi-firefox | support for firefox | +| | bwi-github | link to our github page | +| | bwi-google | link to our google page | +| | bwi-linkedin | link to our linkedIn page | +| | bwi-linux | linux support | +| | bwi-opera | support for Opera | +| | bwi-paypal | PayPal | +| | bwi-reddit | link to our reddit community | +| | bwi-safari | safari support | +| | bwi-twitter | link to our twitter page | +| | bwi-windows | support for windows | +| | bwi-youtube | link to our youtube page | diff --git a/libs/components/src/tabs/index.ts b/libs/components/src/tabs/index.ts new file mode 100644 index 00000000000..9b45ff1d43b --- /dev/null +++ b/libs/components/src/tabs/index.ts @@ -0,0 +1,3 @@ +export * from "./tabs.module"; +export * from "./tab-group.component"; +export * from "./tab-item.component"; diff --git a/libs/components/src/tabs/tab-group.component.html b/libs/components/src/tabs/tab-group.component.html new file mode 100644 index 00000000000..ad681b168f0 --- /dev/null +++ b/libs/components/src/tabs/tab-group.component.html @@ -0,0 +1,6 @@ +
    + +
    diff --git a/libs/components/src/tabs/tab-group.component.ts b/libs/components/src/tabs/tab-group.component.ts new file mode 100644 index 00000000000..856ab1f1e22 --- /dev/null +++ b/libs/components/src/tabs/tab-group.component.ts @@ -0,0 +1,7 @@ +import { Component } from "@angular/core"; + +@Component({ + selector: "bit-tab-group", + templateUrl: "./tab-group.component.html", +}) +export class TabGroupComponent {} diff --git a/libs/components/src/tabs/tab-item.component.html b/libs/components/src/tabs/tab-item.component.html new file mode 100644 index 00000000000..951cfb3be18 --- /dev/null +++ b/libs/components/src/tabs/tab-item.component.html @@ -0,0 +1,26 @@ + + + + + + + + + diff --git a/libs/components/src/tabs/tab-item.component.ts b/libs/components/src/tabs/tab-item.component.ts new file mode 100644 index 00000000000..cda332e26d5 --- /dev/null +++ b/libs/components/src/tabs/tab-item.component.ts @@ -0,0 +1,54 @@ +import { Component, Input } from "@angular/core"; + +@Component({ + selector: "bit-tab-item", + templateUrl: "./tab-item.component.html", +}) +export class TabItemComponent { + @Input() route: string; // ['/route'] + @Input() disabled = false; + + get baseClassList(): string[] { + return [ + "tw-block", + "tw-relative", + "tw-py-2", + "tw-px-4", + "tw-font-semibold", + "tw-transition", + "tw-rounded-t", + "tw-border-0", + "tw-border-x", + "tw-border-t-4", + "tw-border-transparent", + "tw-border-solid", + "!tw-text-main", + "hover:tw-underline", + "hover:!tw-text-main", + "focus:tw-z-10", + "focus:tw-outline-none", + "focus:tw-ring-2", + "focus:tw-ring-primary-700", + "disabled:tw-bg-secondary-100", + "disabled:!tw-text-muted", + "disabled:tw-no-underline", + "disabled:tw-cursor-not-allowed", + ]; + } + + get activeClassList(): string { + return [ + "tw--mb-px", + "tw-border-x-secondary-300", + "tw-border-t-primary-500", + "tw-border-b", + "tw-border-b-background", + "tw-bg-background", + "!tw-text-primary-500", + "hover:tw-border-t-primary-700", + "hover:!tw-text-primary-700", + "focus:tw-border-t-primary-700", + "focus:!tw-text-primary-700", + ].join(" "); + } +} diff --git a/libs/components/src/tabs/tabs.module.ts b/libs/components/src/tabs/tabs.module.ts new file mode 100644 index 00000000000..016bde504a5 --- /dev/null +++ b/libs/components/src/tabs/tabs.module.ts @@ -0,0 +1,13 @@ +import { CommonModule } from "@angular/common"; +import { NgModule } from "@angular/core"; +import { RouterModule } from "@angular/router"; + +import { TabGroupComponent } from "./tab-group.component"; +import { TabItemComponent } from "./tab-item.component"; + +@NgModule({ + imports: [CommonModule, RouterModule], + exports: [TabGroupComponent, TabItemComponent], + declarations: [TabGroupComponent, TabItemComponent], +}) +export class TabsModule {} diff --git a/libs/components/src/tabs/tabs.stories.ts b/libs/components/src/tabs/tabs.stories.ts new file mode 100644 index 00000000000..15ee57fa7d5 --- /dev/null +++ b/libs/components/src/tabs/tabs.stories.ts @@ -0,0 +1,84 @@ +import { CommonModule } from "@angular/common"; +import { Component } from "@angular/core"; +import { RouterModule } from "@angular/router"; +import { Meta, moduleMetadata, Story } from "@storybook/angular"; + +import { TabGroupComponent } from "./tab-group.component"; +import { TabItemComponent } from "./tab-item.component"; + +@Component({ + selector: "bit-tab-active-dummy", + template: "Router - Active selected", +}) +class ActiveDummyComponent {} + +@Component({ + selector: "bit-tab-item-2-dummy", + template: "Router - Item 2 selected", +}) +class ItemTwoDummyComponent {} + +@Component({ + selector: "bit-tab-item-3-dummy", + template: "Router - Item 3 selected", +}) +class ItemThreeDummyComponent {} + +@Component({ + selector: "bit-tab-disabled-dummy", + template: "Router - Disabled selected", +}) +class DisabledDummyComponent {} + +export default { + title: "Component Library/Tabs", + component: TabGroupComponent, + decorators: [ + moduleMetadata({ + declarations: [ + TabGroupComponent, + TabItemComponent, + ActiveDummyComponent, + ItemTwoDummyComponent, + ItemThreeDummyComponent, + DisabledDummyComponent, + ], + imports: [ + CommonModule, + RouterModule.forRoot( + [ + { path: "", redirectTo: "active", pathMatch: "full" }, + { path: "active", component: ActiveDummyComponent }, + { path: "item-2", component: ItemTwoDummyComponent }, + { path: "item-3", component: ItemThreeDummyComponent }, + { path: "disabled", component: DisabledDummyComponent }, + ], + { useHash: true } + ), + ], + }), + ], + parameters: { + design: { + type: "figma", + url: "https://www.figma.com/file/Zt3YSeb6E6lebAffrNLa0h/Tailwind-Component-Library?node-id=1881%3A17922", + }, + }, +} as Meta; + +const TabGroupTemplate: Story = (args: TabGroupComponent) => ({ + props: args, + template: ` + + Active + Item 2 + Item 3 + Disabled + +
    + +
    + `, +}); + +export const TabGroup = TabGroupTemplate.bind({}); diff --git a/libs/components/src/toggle-group/index.ts b/libs/components/src/toggle-group/index.ts new file mode 100644 index 00000000000..bb7dba253e1 --- /dev/null +++ b/libs/components/src/toggle-group/index.ts @@ -0,0 +1,2 @@ +export * from "./toggle-group.component"; +export * from "./toggle-group.module"; diff --git a/libs/components/src/toggle-group/toggle-group.component.html b/libs/components/src/toggle-group/toggle-group.component.html new file mode 100644 index 00000000000..6dbc7430638 --- /dev/null +++ b/libs/components/src/toggle-group/toggle-group.component.html @@ -0,0 +1 @@ + diff --git a/libs/components/src/toggle-group/toggle-group.component.spec.ts b/libs/components/src/toggle-group/toggle-group.component.spec.ts new file mode 100644 index 00000000000..3bce3472e81 --- /dev/null +++ b/libs/components/src/toggle-group/toggle-group.component.spec.ts @@ -0,0 +1,69 @@ +import { Component } from "@angular/core"; +import { ComponentFixture, TestBed, waitForAsync } from "@angular/core/testing"; +import { By } from "@angular/platform-browser"; + +import { ToggleGroupModule } from "./toggle-group.module"; +import { ToggleComponent } from "./toggle.component"; + +describe("Button", () => { + let fixture: ComponentFixture; + let testAppComponent: TestApp; + let buttonElements: ToggleComponent[]; + let radioButtons: HTMLInputElement[]; + + beforeEach(waitForAsync(() => { + TestBed.configureTestingModule({ + imports: [ToggleGroupModule], + declarations: [TestApp], + }); + + TestBed.compileComponents(); + fixture = TestBed.createComponent(TestApp); + testAppComponent = fixture.debugElement.componentInstance; + buttonElements = fixture.debugElement + .queryAll(By.css("bit-toggle")) + .map((e) => e.componentInstance); + radioButtons = fixture.debugElement + .queryAll(By.css("input[type=radio]")) + .map((e) => e.nativeElement); + + fixture.detectChanges(); + })); + + it("should select second element when setting selected to second", () => { + testAppComponent.selected = "second"; + fixture.detectChanges(); + + expect(buttonElements[1].selected).toBe(true); + }); + + it("should not select second element when setting selected to third", () => { + testAppComponent.selected = "third"; + fixture.detectChanges(); + + expect(buttonElements[1].selected).toBe(false); + }); + + it("should emit new value when changing selection by clicking on radio button", () => { + testAppComponent.selected = "first"; + fixture.detectChanges(); + + radioButtons[1].click(); + + expect(testAppComponent.selected).toBe("second"); + }); +}); + +@Component({ + selector: "test-app", + template: ` + + First + Second + Third + + `, +}) +class TestApp { + selected?: string; +} diff --git a/libs/components/src/toggle-group/toggle-group.component.ts b/libs/components/src/toggle-group/toggle-group.component.ts new file mode 100644 index 00000000000..adaed4bdb01 --- /dev/null +++ b/libs/components/src/toggle-group/toggle-group.component.ts @@ -0,0 +1,24 @@ +import { Component, EventEmitter, HostBinding, Input, Output } from "@angular/core"; + +let nextId = 0; + +@Component({ + selector: "bit-toggle-group", + templateUrl: "./toggle-group.component.html", + preserveWhitespaces: false, +}) +export class ToggleGroupComponent { + private id = nextId++; + name = `bit-toggle-group-${this.id}`; + + @Input() selected?: unknown; + @Output() selectedChange = new EventEmitter(); + + @HostBinding("attr.role") role = "radiogroup"; + @HostBinding("class") classList = ["tw-flex"]; + + onInputInteraction(value: unknown) { + this.selected = value; + this.selectedChange.emit(value); + } +} diff --git a/libs/components/src/toggle-group/toggle-group.module.ts b/libs/components/src/toggle-group/toggle-group.module.ts new file mode 100644 index 00000000000..fe1ce0ec52f --- /dev/null +++ b/libs/components/src/toggle-group/toggle-group.module.ts @@ -0,0 +1,14 @@ +import { CommonModule } from "@angular/common"; +import { NgModule } from "@angular/core"; + +import { BadgeModule } from "../badge"; + +import { ToggleGroupComponent } from "./toggle-group.component"; +import { ToggleComponent } from "./toggle.component"; + +@NgModule({ + imports: [CommonModule, BadgeModule], + exports: [ToggleGroupComponent, ToggleComponent], + declarations: [ToggleGroupComponent, ToggleComponent], +}) +export class ToggleGroupModule {} diff --git a/libs/components/src/toggle-group/toggle-group.stories.ts b/libs/components/src/toggle-group/toggle-group.stories.ts new file mode 100644 index 00000000000..8cc06f8c32d --- /dev/null +++ b/libs/components/src/toggle-group/toggle-group.stories.ts @@ -0,0 +1,54 @@ +import { Meta, moduleMetadata, Story } from "@storybook/angular"; + +import { BadgeModule } from "../badge"; + +import { ToggleGroupComponent } from "./toggle-group.component"; +import { ToggleComponent } from "./toggle.component"; + +export default { + title: "Component Library/Toggle Group", + component: ToggleGroupComponent, + args: { + selected: "all", + }, + decorators: [ + moduleMetadata({ + declarations: [ToggleGroupComponent, ToggleComponent], + imports: [BadgeModule], + }), + ], + parameters: { + design: { + type: "figma", + url: "https://www.figma.com/file/Zt3YSeb6E6lebAffrNLa0h/Tailwind-Component-Library?node-id=1881%3A17157", + }, + }, +} as Meta; + +const Template: Story = (args: ToggleGroupComponent) => ({ + props: args, + template: ` + + + All 3 + + + + Invited + + + + Accepted 2 + + + + Deactivated + + + `, +}); + +export const Default = Template.bind({}); +Default.args = { + selected: "all", +}; diff --git a/libs/components/src/toggle-group/toggle.component.html b/libs/components/src/toggle-group/toggle.component.html new file mode 100644 index 00000000000..471ed5f0c03 --- /dev/null +++ b/libs/components/src/toggle-group/toggle.component.html @@ -0,0 +1,11 @@ + + diff --git a/libs/components/src/toggle-group/toggle.component.spec.ts b/libs/components/src/toggle-group/toggle.component.spec.ts new file mode 100644 index 00000000000..37c2e2ac101 --- /dev/null +++ b/libs/components/src/toggle-group/toggle.component.spec.ts @@ -0,0 +1,71 @@ +import { Component } from "@angular/core"; +import { ComponentFixture, TestBed, waitForAsync } from "@angular/core/testing"; +import { By } from "@angular/platform-browser"; + +import { ToggleGroupComponent } from "./toggle-group.component"; +import { ToggleGroupModule } from "./toggle-group.module"; + +describe("Button", () => { + let mockGroupComponent: MockedButtonGroupComponent; + let fixture: ComponentFixture; + let testAppComponent: TestApp; + let radioButton: HTMLInputElement; + + beforeEach(waitForAsync(() => { + mockGroupComponent = new MockedButtonGroupComponent(); + + TestBed.configureTestingModule({ + imports: [ToggleGroupModule], + declarations: [TestApp], + providers: [{ provide: ToggleGroupComponent, useValue: mockGroupComponent }], + }); + + TestBed.compileComponents(); + fixture = TestBed.createComponent(TestApp); + testAppComponent = fixture.debugElement.componentInstance; + radioButton = fixture.debugElement.query(By.css("input[type=radio]")).nativeElement; + })); + + it("should emit value when clicking on radio button", () => { + testAppComponent.value = "value"; + fixture.detectChanges(); + + radioButton.click(); + fixture.detectChanges(); + + expect(mockGroupComponent.onInputInteraction).toHaveBeenCalledWith("value"); + }); + + it("should check radio button when selected matches value", () => { + testAppComponent.value = "value"; + fixture.detectChanges(); + + mockGroupComponent.selected = "value"; + fixture.detectChanges(); + + expect(radioButton.checked).toBe(true); + }); + + it("should not check radio button when selected does not match value", () => { + testAppComponent.value = "value"; + fixture.detectChanges(); + + mockGroupComponent.selected = "nonMatchingValue"; + fixture.detectChanges(); + + expect(radioButton.checked).toBe(false); + }); +}); + +class MockedButtonGroupComponent implements Partial { + onInputInteraction = jest.fn(); + selected = null; +} + +@Component({ + selector: "test-app", + template: ` Element`, +}) +class TestApp { + value?: string; +} diff --git a/libs/components/src/toggle-group/toggle.component.ts b/libs/components/src/toggle-group/toggle.component.ts new file mode 100644 index 00000000000..557ab38b386 --- /dev/null +++ b/libs/components/src/toggle-group/toggle.component.ts @@ -0,0 +1,80 @@ +import { HostBinding, Component, Input } from "@angular/core"; + +import { ToggleGroupComponent } from "./toggle-group.component"; + +let nextId = 0; + +@Component({ + selector: "bit-toggle", + templateUrl: "./toggle.component.html", + preserveWhitespaces: false, +}) +export class ToggleComponent { + id = nextId++; + + @Input() value?: string; + + constructor(private groupComponent: ToggleGroupComponent) {} + + @HostBinding("tabIndex") tabIndex = "-1"; + @HostBinding("class") classList = ["tw-group"]; + + get name() { + return this.groupComponent.name; + } + + get selected() { + return this.groupComponent.selected === this.value; + } + + get inputClasses() { + return ["tw-peer", "tw-appearance-none", "tw-outline-none"]; + } + + get labelClasses() { + return [ + "!tw-font-semibold", + "tw-transition", + "tw-text-center", + "tw-border-text-muted", + "!tw-text-muted", + "tw-border-solid", + "tw-border-y", + "tw-border-r", + "tw-border-l-0", + "tw-cursor-pointer", + "group-first-of-type:tw-border-l", + "group-first-of-type:tw-rounded-l", + "group-last-of-type:tw-rounded-r", + + "peer-focus:tw-outline-none", + "peer-focus:tw-ring", + "peer-focus:tw-ring-offset-2", + "peer-focus:tw-ring-primary-500", + "peer-focus:tw-z-10", + "peer-focus:tw-bg-primary-500", + "peer-focus:tw-border-primary-500", + "peer-focus:!tw-text-contrast", + + "hover:tw-no-underline", + "hover:tw-bg-text-muted", + "hover:tw-border-text-muted", + "hover:!tw-text-contrast", + + "peer-checked:tw-bg-primary-500", + "peer-checked:tw-border-primary-500", + "peer-checked:!tw-text-contrast", + "tw-py-1.5", + "tw-px-3", + + // Fix for badge being pushed slightly lower when inside a button. + // Insipired by bootstrap, which does the same. + "[&>[bitBadge]]:tw-relative", + "[&>[bitBadge]]:-tw-top-[1px]", + ]; + } + + onInputInteraction() { + this.groupComponent.onInputInteraction(this.value); + } +} diff --git a/libs/components/src/utils/i18n-mock.service.ts b/libs/components/src/utils/i18n-mock.service.ts index ffc2b031d37..19f756fc360 100644 --- a/libs/components/src/utils/i18n-mock.service.ts +++ b/libs/components/src/utils/i18n-mock.service.ts @@ -1,7 +1,9 @@ +import { Observable } from "rxjs"; + import { I18nService } from "@bitwarden/common/abstractions/i18n.service"; export class I18nMockService implements I18nService { - locale: string; + locale$: Observable; supportedTranslationLocales: string[]; translationLocale: string; collator: Intl.Collator; diff --git a/libs/components/tailwind.config.base.js b/libs/components/tailwind.config.base.js index fd0caec7490..31ff19cb501 100644 --- a/libs/components/tailwind.config.base.js +++ b/libs/components/tailwind.config.base.js @@ -60,6 +60,8 @@ module.exports = { info: "var(--color-info-500)", primary: { 300: "var(--color-primary-300)", + 500: "var(--color-primary-500)", + 700: "var(--color-primary-700)", }, }, ringOffsetColor: ({ theme }) => ({ diff --git a/libs/shared/eslintrc.json b/libs/shared/eslintrc.json deleted file mode 100644 index 70c61bc7c4c..00000000000 --- a/libs/shared/eslintrc.json +++ /dev/null @@ -1,29 +0,0 @@ -{ - "parser": "@typescript-eslint/parser", - "plugins": ["@typescript-eslint"], - "extends": [ - "eslint:recommended", - "plugin:@typescript-eslint/recommended", - "plugin:import/recommended", - "plugin:import/typescript", - "prettier" - ], - "rules": { - "@typescript-eslint/no-explicit-any": "off", // TODO: This should be re-enabled - "@typescript-eslint/no-unused-vars": ["warn", { "args": "none" }], - "@typescript-eslint/explicit-member-accessibility": [ - "error", - { - "accessibility": "no-public" - } - ], - "@typescript-eslint/no-this-alias": [ - "error", - { - "allowedNames": ["self"] - } - ], - "no-console": "warn", - "import/no-unresolved": "off" // TODO: Look into turning off once each package is an actual package. - } -} diff --git a/package-lock.json b/package-lock.json index da511d2ed33..3e99454453c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -121,14 +121,14 @@ "cross-env": "^7.0.3", "css-loader": "^6.5.1", "del": "^6.0.0", - "electron": "16.2.7", - "electron-builder": "22.11.10", - "electron-log": "^4.4.7", + "electron": "^19.0.8", + "electron-builder": "^22.11.10", + "electron-log": "^4.4.8", "electron-notarize": "^1.2.1", "electron-rebuild": "^3.2.7", "electron-reload": "^2.0.0-alpha.1", - "electron-store": "^8.0.1", - "electron-updater": "^5.0.1", + "electron-store": "^8.0.2", + "electron-updater": "^5.0.5", "eslint": "^8.14.0", "eslint-config-prettier": "^8.5.0", "eslint-import-resolver-typescript": "^2.7.1", @@ -186,7 +186,7 @@ }, "apps/cli": { "name": "@bitwarden/cli", - "version": "1.22.1", + "version": "2022.6.2", "license": "GPL-3.0-only", "dependencies": { "@koa/multer": "^3.0.0", @@ -227,7 +227,7 @@ }, "apps/web": { "name": "@bitwarden/web-vault", - "version": "2022.6.0" + "version": "2022.6.1" }, "libs/angular": { "name": "@bitwarden/angular", @@ -15740,6 +15740,19 @@ "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", "dev": true }, + "node_modules/app-builder-lib/node_modules/builder-util-runtime": { + "version": "8.7.9", + "resolved": "https://registry.npmjs.org/builder-util-runtime/-/builder-util-runtime-8.7.9.tgz", + "integrity": "sha512-HCOkbKncb6eZSjnw1XnGgiXs7CQzORZit8zPK8IMHpU5GnZi6htS6KQdSMXU4ekDprfW3JLTRBHK9uxU2x++/g==", + "dev": true, + "dependencies": { + "debug": "^4.3.2", + "sax": "^1.2.4" + }, + "engines": { + "node": ">=12.0.0" + } + }, "node_modules/app-builder-lib/node_modules/js-yaml": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", @@ -17732,6 +17745,42 @@ } }, "node_modules/builder-util-runtime": { + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/builder-util-runtime/-/builder-util-runtime-9.0.2.tgz", + "integrity": "sha512-xF55W/8mgfT6+sMbX0TeiJkTusA5GMOzckM4rajN4KirFcUIuLTH8oEaTYmM86YwVCZaTwa/7GyFhauXaEICwA==", + "dev": true, + "dependencies": { + "debug": "^4.3.4", + "sax": "^1.2.4" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/builder-util-runtime/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/builder-util/node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, + "node_modules/builder-util/node_modules/builder-util-runtime": { "version": "8.7.9", "resolved": "https://registry.npmjs.org/builder-util-runtime/-/builder-util-runtime-8.7.9.tgz", "integrity": "sha512-HCOkbKncb6eZSjnw1XnGgiXs7CQzORZit8zPK8IMHpU5GnZi6htS6KQdSMXU4ekDprfW3JLTRBHK9uxU2x++/g==", @@ -17744,12 +17793,6 @@ "node": ">=12.0.0" } }, - "node_modules/builder-util/node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true - }, "node_modules/builder-util/node_modules/js-yaml": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", @@ -21183,6 +21226,19 @@ "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", "dev": true }, + "node_modules/dmg-builder/node_modules/builder-util-runtime": { + "version": "8.7.9", + "resolved": "https://registry.npmjs.org/builder-util-runtime/-/builder-util-runtime-8.7.9.tgz", + "integrity": "sha512-HCOkbKncb6eZSjnw1XnGgiXs7CQzORZit8zPK8IMHpU5GnZi6htS6KQdSMXU4ekDprfW3JLTRBHK9uxU2x++/g==", + "dev": true, + "dependencies": { + "debug": "^4.3.2", + "sax": "^1.2.4" + }, + "engines": { + "node": ">=12.0.0" + } + }, "node_modules/dmg-builder/node_modules/js-yaml": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", @@ -21199,7 +21255,6 @@ "version": "1.0.11", "resolved": "https://registry.npmjs.org/dmg-license/-/dmg-license-1.0.11.tgz", "integrity": "sha512-ZdzmqwKmECOWJpqefloC5OJy1+WZBBse5+MR88z9g9Zn4VY+WYUkAyojmhzJckH5YbbZGcYIuGAkY5/Ys5OM2Q==", - "deprecated": "Disk image license agreements are deprecated by Apple and will probably be removed in a future macOS release. Discussion at: https://github.com/argv-minus-one/dmg-license/issues/11", "dev": true, "optional": true, "os": [ @@ -21602,14 +21657,14 @@ } }, "node_modules/electron": { - "version": "16.2.7", - "resolved": "https://registry.npmjs.org/electron/-/electron-16.2.7.tgz", - "integrity": "sha512-aZKF3b00+rqW/HGs8lJM5DhPNj+mOfCuhLSiFXV6J9dQCIRhctJTmToOrwXfbCxvXK8as8eQTNl5uSfnHmH6tA==", + "version": "19.0.8", + "resolved": "https://registry.npmjs.org/electron/-/electron-19.0.8.tgz", + "integrity": "sha512-OWK3P/NbDFfBUv+wbYv1/OV4jehY5DQPT7n1maQJfN9hsnrWTMktXS/bmS05eSUAjNAzHmKPKfiKH2c1Yr7nGw==", "dev": true, "hasInstallScript": true, "dependencies": { - "@electron/get": "^1.13.0", - "@types/node": "^14.6.2", + "@electron/get": "^1.14.1", + "@types/node": "^16.11.26", "extract-zip": "^1.0.3" }, "bin": { @@ -21655,10 +21710,23 @@ "@types/yargs-parser": "*" } }, + "node_modules/electron-builder/node_modules/builder-util-runtime": { + "version": "8.7.9", + "resolved": "https://registry.npmjs.org/builder-util-runtime/-/builder-util-runtime-8.7.9.tgz", + "integrity": "sha512-HCOkbKncb6eZSjnw1XnGgiXs7CQzORZit8zPK8IMHpU5GnZi6htS6KQdSMXU4ekDprfW3JLTRBHK9uxU2x++/g==", + "dev": true, + "dependencies": { + "debug": "^4.3.2", + "sax": "^1.2.4" + }, + "engines": { + "node": ">=12.0.0" + } + }, "node_modules/electron-log": { - "version": "4.4.7", - "resolved": "https://registry.npmjs.org/electron-log/-/electron-log-4.4.7.tgz", - "integrity": "sha512-uFZQdgevOp9Fn5lDOrJMU/bmmYxDLZitbIHJM7VXN+cpB59ZnPt1FQL4bOf/Dl2gaIMPYJEfXx38GvJma5iV6A==", + "version": "4.4.8", + "resolved": "https://registry.npmjs.org/electron-log/-/electron-log-4.4.8.tgz", + "integrity": "sha512-QQ4GvrXO+HkgqqEOYbi+DHL7hj5JM+nHi/j+qrN9zeeXVKy8ZABgbu4CnG+BBqDZ2+tbeq9tUC4DZfIWFU5AZA==", "dev": true }, "node_modules/electron-notarize": { @@ -21752,6 +21820,19 @@ "mime": "^2.5.2" } }, + "node_modules/electron-publish/node_modules/builder-util-runtime": { + "version": "8.7.9", + "resolved": "https://registry.npmjs.org/builder-util-runtime/-/builder-util-runtime-8.7.9.tgz", + "integrity": "sha512-HCOkbKncb6eZSjnw1XnGgiXs7CQzORZit8zPK8IMHpU5GnZi6htS6KQdSMXU4ekDprfW3JLTRBHK9uxU2x++/g==", + "dev": true, + "dependencies": { + "debug": "^4.3.2", + "sax": "^1.2.4" + }, + "engines": { + "node": ">=12.0.0" + } + }, "node_modules/electron-rebuild": { "version": "3.2.7", "resolved": "https://registry.npmjs.org/electron-rebuild/-/electron-rebuild-3.2.7.tgz", @@ -22016,19 +22097,20 @@ "dev": true }, "node_modules/electron-updater": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/electron-updater/-/electron-updater-5.0.1.tgz", - "integrity": "sha512-dNnXPCqYmergXy3jgg4UICuD50Orug9GQe/5xfHy+BE2Fy0icB0QE+y6iQWdCDf7yeONxwMBf4HgIkGG5pIaVg==", + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/electron-updater/-/electron-updater-5.0.5.tgz", + "integrity": "sha512-YcKEI9zpU+c0sNXTpjw3UpzP8Pfuuwo70T42oLYm0hHc0dy41ih51oENlhxgooa2+uzzpXhoCOyrpG+w6CB0Pw==", "dev": true, "dependencies": { "@types/semver": "^7.3.6", - "builder-util-runtime": "9.0.0", + "builder-util-runtime": "9.0.2", "fs-extra": "^10.0.0", "js-yaml": "^4.1.0", "lazy-val": "^1.0.5", "lodash.escaperegexp": "^4.1.2", "lodash.isequal": "^4.5.0", - "semver": "^7.3.5" + "semver": "^7.3.5", + "typed-emitter": "^2.1.0" } }, "node_modules/electron-updater/node_modules/argparse": { @@ -22037,19 +22119,6 @@ "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", "dev": true }, - "node_modules/electron-updater/node_modules/builder-util-runtime": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/builder-util-runtime/-/builder-util-runtime-9.0.0.tgz", - "integrity": "sha512-SkpEtSmTkREDHRJnxKEv43aAYp8sYWY8fxYBhGLBLOBIRXeaIp6Kv3lBgSD7uR8jQtC7CA659sqJrpSV6zNvSA==", - "dev": true, - "dependencies": { - "debug": "^4.3.2", - "sax": "^1.2.4" - }, - "engines": { - "node": ">=12.0.0" - } - }, "node_modules/electron-updater/node_modules/js-yaml": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", @@ -22062,12 +22131,6 @@ "js-yaml": "bin/js-yaml.js" } }, - "node_modules/electron/node_modules/@types/node": { - "version": "14.18.21", - "resolved": "https://registry.npmjs.org/@types/node/-/node-14.18.21.tgz", - "integrity": "sha512-x5W9s+8P4XteaxT/jKF0PSb7XEvo5VmqEWgsMlyeY4ZlLK8I6aH6g5TPPyDlLAep+GYf4kefb7HFyc7PAO3m+Q==", - "dev": true - }, "node_modules/element-resize-detector": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/element-resize-detector/-/element-resize-detector-1.2.4.tgz", @@ -43512,6 +43575,15 @@ "node": ">= 0.6" } }, + "node_modules/typed-emitter": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/typed-emitter/-/typed-emitter-2.1.0.tgz", + "integrity": "sha512-g/KzbYKbH5C2vPkaXGu8DJlHrGKHLsM25Zg9WuC9pMGfuvT+X25tZQWo5fK1BjBm8+UrVE9LDCvaY0CQk+fXDA==", + "dev": true, + "optionalDependencies": { + "rxjs": "*" + } + }, "node_modules/typedarray": { "version": "0.0.6", "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", @@ -51639,7 +51711,7 @@ "postcss": "^7.0.36", "postcss-loader": "^4.2.0", "raw-loader": "^4.0.2", - "react": "^18.0.0", + "react": "^16.14.0", "react-dom": "^16.14.0", "read-pkg-up": "^7.0.1", "regenerator-runtime": "^0.13.7", @@ -57874,6 +57946,16 @@ "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", "dev": true }, + "builder-util-runtime": { + "version": "8.7.9", + "resolved": "https://registry.npmjs.org/builder-util-runtime/-/builder-util-runtime-8.7.9.tgz", + "integrity": "sha512-HCOkbKncb6eZSjnw1XnGgiXs7CQzORZit8zPK8IMHpU5GnZi6htS6KQdSMXU4ekDprfW3JLTRBHK9uxU2x++/g==", + "dev": true, + "requires": { + "debug": "^4.3.2", + "sax": "^1.2.4" + } + }, "js-yaml": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", @@ -59464,6 +59546,16 @@ "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", "dev": true }, + "builder-util-runtime": { + "version": "8.7.9", + "resolved": "https://registry.npmjs.org/builder-util-runtime/-/builder-util-runtime-8.7.9.tgz", + "integrity": "sha512-HCOkbKncb6eZSjnw1XnGgiXs7CQzORZit8zPK8IMHpU5GnZi6htS6KQdSMXU4ekDprfW3JLTRBHK9uxU2x++/g==", + "dev": true, + "requires": { + "debug": "^4.3.2", + "sax": "^1.2.4" + } + }, "js-yaml": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", @@ -59476,13 +59568,24 @@ } }, "builder-util-runtime": { - "version": "8.7.9", - "resolved": "https://registry.npmjs.org/builder-util-runtime/-/builder-util-runtime-8.7.9.tgz", - "integrity": "sha512-HCOkbKncb6eZSjnw1XnGgiXs7CQzORZit8zPK8IMHpU5GnZi6htS6KQdSMXU4ekDprfW3JLTRBHK9uxU2x++/g==", + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/builder-util-runtime/-/builder-util-runtime-9.0.2.tgz", + "integrity": "sha512-xF55W/8mgfT6+sMbX0TeiJkTusA5GMOzckM4rajN4KirFcUIuLTH8oEaTYmM86YwVCZaTwa/7GyFhauXaEICwA==", "dev": true, "requires": { - "debug": "^4.3.2", + "debug": "^4.3.4", "sax": "^1.2.4" + }, + "dependencies": { + "debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + } } }, "builtin-status-codes": { @@ -62134,6 +62237,16 @@ "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", "dev": true }, + "builder-util-runtime": { + "version": "8.7.9", + "resolved": "https://registry.npmjs.org/builder-util-runtime/-/builder-util-runtime-8.7.9.tgz", + "integrity": "sha512-HCOkbKncb6eZSjnw1XnGgiXs7CQzORZit8zPK8IMHpU5GnZi6htS6KQdSMXU4ekDprfW3JLTRBHK9uxU2x++/g==", + "dev": true, + "requires": { + "debug": "^4.3.2", + "sax": "^1.2.4" + } + }, "js-yaml": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", @@ -62479,22 +62592,14 @@ } }, "electron": { - "version": "16.2.7", - "resolved": "https://registry.npmjs.org/electron/-/electron-16.2.7.tgz", - "integrity": "sha512-aZKF3b00+rqW/HGs8lJM5DhPNj+mOfCuhLSiFXV6J9dQCIRhctJTmToOrwXfbCxvXK8as8eQTNl5uSfnHmH6tA==", + "version": "19.0.8", + "resolved": "https://registry.npmjs.org/electron/-/electron-19.0.8.tgz", + "integrity": "sha512-OWK3P/NbDFfBUv+wbYv1/OV4jehY5DQPT7n1maQJfN9hsnrWTMktXS/bmS05eSUAjNAzHmKPKfiKH2c1Yr7nGw==", "dev": true, "requires": { - "@electron/get": "^1.13.0", - "@types/node": "^14.6.2", + "@electron/get": "^1.14.1", + "@types/node": "^16.11.26", "extract-zip": "^1.0.3" - }, - "dependencies": { - "@types/node": { - "version": "14.18.21", - "resolved": "https://registry.npmjs.org/@types/node/-/node-14.18.21.tgz", - "integrity": "sha512-x5W9s+8P4XteaxT/jKF0PSb7XEvo5VmqEWgsMlyeY4ZlLK8I6aH6g5TPPyDlLAep+GYf4kefb7HFyc7PAO3m+Q==", - "dev": true - } } }, "electron-builder": { @@ -62525,13 +62630,23 @@ "requires": { "@types/yargs-parser": "*" } + }, + "builder-util-runtime": { + "version": "8.7.9", + "resolved": "https://registry.npmjs.org/builder-util-runtime/-/builder-util-runtime-8.7.9.tgz", + "integrity": "sha512-HCOkbKncb6eZSjnw1XnGgiXs7CQzORZit8zPK8IMHpU5GnZi6htS6KQdSMXU4ekDprfW3JLTRBHK9uxU2x++/g==", + "dev": true, + "requires": { + "debug": "^4.3.2", + "sax": "^1.2.4" + } } } }, "electron-log": { - "version": "4.4.7", - "resolved": "https://registry.npmjs.org/electron-log/-/electron-log-4.4.7.tgz", - "integrity": "sha512-uFZQdgevOp9Fn5lDOrJMU/bmmYxDLZitbIHJM7VXN+cpB59ZnPt1FQL4bOf/Dl2gaIMPYJEfXx38GvJma5iV6A==", + "version": "4.4.8", + "resolved": "https://registry.npmjs.org/electron-log/-/electron-log-4.4.8.tgz", + "integrity": "sha512-QQ4GvrXO+HkgqqEOYbi+DHL7hj5JM+nHi/j+qrN9zeeXVKy8ZABgbu4CnG+BBqDZ2+tbeq9tUC4DZfIWFU5AZA==", "dev": true }, "electron-notarize": { @@ -62611,6 +62726,18 @@ "fs-extra": "^10.0.0", "lazy-val": "^1.0.5", "mime": "^2.5.2" + }, + "dependencies": { + "builder-util-runtime": { + "version": "8.7.9", + "resolved": "https://registry.npmjs.org/builder-util-runtime/-/builder-util-runtime-8.7.9.tgz", + "integrity": "sha512-HCOkbKncb6eZSjnw1XnGgiXs7CQzORZit8zPK8IMHpU5GnZi6htS6KQdSMXU4ekDprfW3JLTRBHK9uxU2x++/g==", + "dev": true, + "requires": { + "debug": "^4.3.2", + "sax": "^1.2.4" + } + } } }, "electron-rebuild": { @@ -62802,19 +62929,20 @@ "dev": true }, "electron-updater": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/electron-updater/-/electron-updater-5.0.1.tgz", - "integrity": "sha512-dNnXPCqYmergXy3jgg4UICuD50Orug9GQe/5xfHy+BE2Fy0icB0QE+y6iQWdCDf7yeONxwMBf4HgIkGG5pIaVg==", + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/electron-updater/-/electron-updater-5.0.5.tgz", + "integrity": "sha512-YcKEI9zpU+c0sNXTpjw3UpzP8Pfuuwo70T42oLYm0hHc0dy41ih51oENlhxgooa2+uzzpXhoCOyrpG+w6CB0Pw==", "dev": true, "requires": { "@types/semver": "^7.3.6", - "builder-util-runtime": "9.0.0", + "builder-util-runtime": "9.0.2", "fs-extra": "^10.0.0", "js-yaml": "^4.1.0", "lazy-val": "^1.0.5", "lodash.escaperegexp": "^4.1.2", "lodash.isequal": "^4.5.0", - "semver": "^7.3.5" + "semver": "^7.3.5", + "typed-emitter": "^2.1.0" }, "dependencies": { "argparse": { @@ -62823,16 +62951,6 @@ "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", "dev": true }, - "builder-util-runtime": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/builder-util-runtime/-/builder-util-runtime-9.0.0.tgz", - "integrity": "sha512-SkpEtSmTkREDHRJnxKEv43aAYp8sYWY8fxYBhGLBLOBIRXeaIp6Kv3lBgSD7uR8jQtC7CA659sqJrpSV6zNvSA==", - "dev": true, - "requires": { - "debug": "^4.3.2", - "sax": "^1.2.4" - } - }, "js-yaml": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", @@ -79569,6 +79687,15 @@ "mime-types": "~2.1.24" } }, + "typed-emitter": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/typed-emitter/-/typed-emitter-2.1.0.tgz", + "integrity": "sha512-g/KzbYKbH5C2vPkaXGu8DJlHrGKHLsM25Zg9WuC9pMGfuvT+X25tZQWo5fK1BjBm8+UrVE9LDCvaY0CQk+fXDA==", + "dev": true, + "requires": { + "rxjs": "*" + } + }, "typedarray": { "version": "0.0.6", "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", diff --git a/package.json b/package.json index ac70e52938b..10e1d9f76ca 100644 --- a/package.json +++ b/package.json @@ -82,14 +82,14 @@ "cross-env": "^7.0.3", "css-loader": "^6.5.1", "del": "^6.0.0", - "electron": "16.2.7", + "electron": "19.0.8", "electron-builder": "22.11.10", - "electron-log": "^4.4.7", + "electron-log": "^4.4.8", "electron-notarize": "^1.2.1", "electron-rebuild": "^3.2.7", "electron-reload": "^2.0.0-alpha.1", - "electron-store": "^8.0.1", - "electron-updater": "^5.0.1", + "electron-store": "^8.0.2", + "electron-updater": "^5.0.5", "eslint": "^8.14.0", "eslint-config-prettier": "^8.5.0", "eslint-import-resolver-typescript": "^2.7.1", diff --git a/tsconfig.json b/tsconfig.json index 158581cb3a4..23d9a8f46da 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -27,5 +27,5 @@ } ] }, - "include": ["apps/*/src/*", "libs/*/src/*"] + "include": ["apps/*/src/*", "libs/*/src/**/*"] }