diff --git a/.eslintrc.json b/.eslintrc.json index 61bebbf4836..2b52485689a 100644 --- a/.eslintrc.json +++ b/.eslintrc.json @@ -262,6 +262,12 @@ } ] } + }, + { + "files": ["bitwarden_license/bit-common/src/**/*.ts"], + "rules": { + "no-restricted-imports": ["error", { "patterns": ["@bitwarden/bit-common/*", "src/**/*"] }] + } } ] } diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index aba7d4e0e0e..2ec9d3b1b40 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -87,6 +87,10 @@ apps/web/src/translation-constants.ts @bitwarden/team-platform-dev apps/browser/src/autofill @bitwarden/team-autofill-dev apps/desktop/src/autofill @bitwarden/team-autofill-dev libs/common/src/autofill @bitwarden/team-autofill-dev +# DuckDuckGo integration +apps/desktop/native-messaging-test-runner @bitwarden/team-autofill-dev +apps/desktop/src/services/native-message-handler.service.ts @bitwarden/team-autofill-dev +apps/desktop/src/services/native-messaging.service.ts @bitwarden/team-autofill-dev ## Component Library ## .storybook @bitwarden/team-component-library diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md index a2ff0baf25f..edbc9d98cc9 100644 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -1,33 +1,35 @@ -## Type of change +## 🎟️ Tracking - + -``` -- [ ] Bug fix -- [ ] New feature development -- [ ] Tech debt (refactoring, code cleanup, dependency upgrades, etc) -- [ ] Build/deploy pipeline (DevOps) -- [ ] Other -``` +## 📔 Objective -## Objective + - +## 📸 Screenshots -## Code changes + - - +## ⏰ Reminders before review -- **file.ext:** Description of what was changed and why +- Contributor guidelines followed +- All formatters and local linters executed and passed +- Written new unit and / or integration tests where applicable +- Protected functional changes with optionality (feature flags) +- Used internationalization (i18n) for all UI strings +- CI builds passed +- Communicated to DevOps any deployment requirements +- Updated any necessary documentation (Confluence, contributing docs) or informed the documentation team -## Screenshots +## 🦮 Reviewer guidelines - + -## Before you submit - -- Please add **unit tests** where it makes sense to do so (encouraged but not required) -- If this change requires a **documentation update** - notify the documentation team -- If this change has particular **deployment requirements** - notify the DevOps team -- Ensure that all UI additions follow [WCAG AA requirements](https://contributing.bitwarden.com/contributing/accessibility/) +- 👍 (`:+1:`) or similar for great changes +- 📝 (`:memo:`) or ℹ️ (`:information_source:`) for notes or general info +- ❓ (`:question:`) for questions +- 🤔 (`:thinking:`) or 💭 (`:thought_balloon:`) for more open inquiry that's not quite a confirmed issue and could potentially benefit from discussion +- 🎨 (`:art:`) for suggestions / improvements +- ❌ (`:x:`) or ⚠️ (`:warning:`) for more significant problems or concerns needing attention +- 🌱 (`:seedling:`) or ♻️ (`:recycle:`) for future improvements or indications of technical debt +- ⛏ (`:pick:`) for minor or nitpick changes diff --git a/.github/workflows/build-cli.yml b/.github/workflows/build-cli.yml index 2c3ea3982aa..5436f976842 100644 --- a/.github/workflows/build-cli.yml +++ b/.github/workflows/build-cli.yml @@ -59,11 +59,20 @@ jobs: cli: - name: Build CLI ${{ matrix.os }} + name: "${{ matrix.os.base }} - ${{ matrix.license_type.readable }}" strategy: matrix: - os: [ubuntu-22.04, macos-11] - runs-on: ${{ matrix.os }} + os: + [ + { base: "linux", distro: "ubuntu-22.04" }, + { base: "mac", distro: "macos-11" } + ] + license_type: + [ + { prefix: "oss", readable: "open source license" }, + { prefix: "bit", readable: "commercial license"} + ] + runs-on: ${{ matrix.os.distro }} needs: - setup env: @@ -93,16 +102,16 @@ jobs: working-directory: ./ - name: Build & Package Unix - run: npm run dist:${{ env.SHORT_RUNNER_OS }} --quiet + run: npm run dist:${{ matrix.license_type.prefix }}:${{ env.SHORT_RUNNER_OS }} --quiet - name: Zip Unix run: | - cd ./dist/${{ env.LOWER_RUNNER_OS }} - zip ../bw-${{ env.LOWER_RUNNER_OS }}-${{ env._PACKAGE_VERSION }}.zip ./bw + cd ./dist/${{ matrix.license_type.prefix }}/${{ env.LOWER_RUNNER_OS }} + zip ../../bw-${{ matrix.license_type.prefix }}-${{ env.LOWER_RUNNER_OS }}-${{ env._PACKAGE_VERSION }}.zip ./bw - name: Version Test run: | - unzip "./dist/bw-${{ env.LOWER_RUNNER_OS }}-${{ env._PACKAGE_VERSION }}.zip" -d "./test" + unzip "./dist/bw-${{ matrix.license_type.prefix }}-${{ env.LOWER_RUNNER_OS }}-${{ env._PACKAGE_VERSION }}.zip" -d "./test" testVersion=$(./test/bw -v) echo "version: $_PACKAGE_VERSION" echo "testVersion: $testVersion" @@ -114,25 +123,32 @@ jobs: - name: Create checksums Unix run: | cd ./dist - shasum -a 256 bw-${{ env.LOWER_RUNNER_OS }}-${{ env._PACKAGE_VERSION }}.zip \ - | awk '{split($0, a); print a[1]}' > bw-${{ env.LOWER_RUNNER_OS }}-sha256-${{ env._PACKAGE_VERSION }}.txt + shasum -a 256 bw-${{ matrix.license_type.prefix }}-${{ env.LOWER_RUNNER_OS }}-${{ env._PACKAGE_VERSION }}.zip \ + | awk '{split($0, a); print a[1]}' > bw-${{ matrix.license_type.prefix }}-${{ env.LOWER_RUNNER_OS }}-sha256-${{ env._PACKAGE_VERSION }}.txt - name: Upload unix zip asset uses: actions/upload-artifact@5d5d22a31266ced268874388b861e4b58bb5c2f3 # v4.3.1 with: - name: bw-${{ env.LOWER_RUNNER_OS }}-${{ env._PACKAGE_VERSION }}.zip - path: apps/cli/dist/bw-${{ env.LOWER_RUNNER_OS }}-${{ env._PACKAGE_VERSION }}.zip + name: bw-${{ matrix.license_type.prefix }}-${{ env.LOWER_RUNNER_OS }}-${{ env._PACKAGE_VERSION }}.zip + path: apps/cli/dist/bw-${{ matrix.license_type.prefix }}-${{ env.LOWER_RUNNER_OS }}-${{ env._PACKAGE_VERSION }}.zip if-no-files-found: error - name: Upload unix checksum asset uses: actions/upload-artifact@5d5d22a31266ced268874388b861e4b58bb5c2f3 # v4.3.1 with: - name: bw-${{ env.LOWER_RUNNER_OS }}-sha256-${{ env._PACKAGE_VERSION }}.txt - path: apps/cli/dist/bw-${{ env.LOWER_RUNNER_OS }}-sha256-${{ env._PACKAGE_VERSION }}.txt + name: bw-${{ matrix.license_type.prefix }}-${{ env.LOWER_RUNNER_OS }}-sha256-${{ env._PACKAGE_VERSION }}.txt + path: apps/cli/dist/bw-${{ matrix.license_type.prefix }}-${{ env.LOWER_RUNNER_OS }}-sha256-${{ env._PACKAGE_VERSION }}.txt if-no-files-found: error cli-windows: - name: Build CLI Windows + name: "windows - ${{ matrix.license_type.readable }}" + strategy: + matrix: + license_type: + [ + { prefix: "oss", readable: "open source license" }, + { prefix: "bit", readable: "commercial license"} + ] runs-on: windows-2022 needs: - setup @@ -218,25 +234,26 @@ jobs: working-directory: ./ - name: Build & Package Windows - run: npm run dist:win --quiet + run: npm run dist:${{ matrix.license_type.prefix }}:win --quiet - name: Package Chocolatey shell: pwsh + if: ${{ matrix.license_type.prefix }} == 'oss' run: | Copy-Item -Path stores/chocolatey -Destination dist/chocolatey -Recurse - Copy-Item dist/windows/bw.exe -Destination dist/chocolatey/tools + Copy-Item dist/${{ matrix.license_type.prefix }}/windows/bw.exe -Destination dist/chocolatey/tools Copy-Item ${{ github.workspace }}/LICENSE.txt -Destination dist/chocolatey/tools choco pack dist/chocolatey/bitwarden-cli.nuspec --version ${{ env._PACKAGE_VERSION }} --out dist/chocolatey - name: Zip Windows shell: cmd - run: 7z a ./dist/bw-windows-%_PACKAGE_VERSION%.zip ./dist/windows/bw.exe + run: 7z a ./dist/bw-${{ matrix.license_type.prefix }}-windows-%_PACKAGE_VERSION%.zip ./dist/${{ matrix.license_type.prefix }}/windows/bw.exe - name: Version Test run: | dir ./dist/ - Expand-Archive -Path "./dist/bw-windows-${env:_PACKAGE_VERSION}.zip" -DestinationPath "./test/windows" - $testVersion = Invoke-Expression '& ./test/windows/bw.exe -v' + Expand-Archive -Path "./dist/bw-${{ matrix.license_type.prefix }}-windows-${env:_PACKAGE_VERSION}.zip" -DestinationPath "./test/${{ matrix.license_type.prefix }}/windows" + $testVersion = Invoke-Expression '& ./test/${{ matrix.license_type.prefix }}/windows/bw.exe -v' echo "version: $env:_PACKAGE_VERSION" echo "testVersion: $testVersion" if($testVersion -ne $env:_PACKAGE_VERSION) { @@ -245,24 +262,25 @@ jobs: - name: Create checksums Windows run: | - checksum -f="./dist/bw-windows-${env:_PACKAGE_VERSION}.zip" ` - -t sha256 | Out-File -Encoding ASCII ./dist/bw-windows-sha256-${env:_PACKAGE_VERSION}.txt + checksum -f="./dist/bw-${{ matrix.license_type.prefix }}-windows-${env:_PACKAGE_VERSION}.zip" ` + -t sha256 | Out-File -Encoding ASCII ./dist/bw-${{ matrix.license_type.prefix }}-windows-sha256-${env:_PACKAGE_VERSION}.txt - name: Upload windows zip asset uses: actions/upload-artifact@5d5d22a31266ced268874388b861e4b58bb5c2f3 # v4.3.1 with: - name: bw-windows-${{ env._PACKAGE_VERSION }}.zip - path: apps/cli/dist/bw-windows-${{ env._PACKAGE_VERSION }}.zip + name: bw-${{ matrix.license_type.prefix }}-windows-${{ env._PACKAGE_VERSION }}.zip + path: apps/cli/dist/bw-${{ matrix.license_type.prefix }}-windows-${{ env._PACKAGE_VERSION }}.zip if-no-files-found: error - name: Upload windows checksum asset uses: actions/upload-artifact@5d5d22a31266ced268874388b861e4b58bb5c2f3 # v4.3.1 with: - name: bw-windows-sha256-${{ env._PACKAGE_VERSION }}.txt - path: apps/cli/dist/bw-windows-sha256-${{ env._PACKAGE_VERSION }}.txt + name: bw-${{ matrix.license_type.prefix }}-windows-sha256-${{ env._PACKAGE_VERSION }}.txt + path: apps/cli/dist/bw-${{ matrix.license_type.prefix }}-windows-sha256-${{ env._PACKAGE_VERSION }}.txt if-no-files-found: error - name: Upload Chocolatey asset + if: matrix.license_type.prefix == 'oss' uses: actions/upload-artifact@5d5d22a31266ced268874388b861e4b58bb5c2f3 # v4.3.1 with: name: bitwarden-cli.${{ env._PACKAGE_VERSION }}.nupkg @@ -270,6 +288,7 @@ jobs: if-no-files-found: error - name: Upload NPM Build Directory asset + if: matrix.license_type.prefix == 'oss' uses: actions/upload-artifact@5d5d22a31266ced268874388b861e4b58bb5c2f3 # v4.3.1 with: name: bitwarden-cli-${{ env._PACKAGE_VERSION }}-npm-build.zip @@ -299,9 +318,14 @@ jobs: - name: Get bw linux cli uses: actions/download-artifact@c850b930e6ba138125429b7e5c93fc707a7f8427 # v4.1.4 with: - name: bw-linux-${{ env._PACKAGE_VERSION }}.zip + name: bw-oss-linux-${{ env._PACKAGE_VERSION }}.zip path: apps/cli/dist/snap + - name: Rename snap artifact + run: | + cd dist/snap + mv bw-oss-linux-${{ env._PACKAGE_VERSION }}.zip bw-linux-${{ env._PACKAGE_VERSION }}.zip + - name: Setup Snap Package run: | cp -r stores/snap/* -t dist/snap diff --git a/.github/workflows/deploy-web.yml b/.github/workflows/deploy-web.yml index b034136f585..1ff67671419 100644 --- a/.github/workflows/deploy-web.yml +++ b/.github/workflows/deploy-web.yml @@ -224,7 +224,7 @@ jobs: project: Clients environment: ${{ needs.setup.outputs.environment-name }} tag: ${{ inputs.branch-or-tag }} - slack-channel: team-eng-qa-devops + slack-channel: alerts-deploy-qa event: 'start' commit-sha: ${{ needs.artifact-check.outputs.artifact-build-commit }} url: https://github.com/bitwarden/clients/actions/runs/${{ github.run_id }} diff --git a/.github/workflows/release-cli.yml b/.github/workflows/release-cli.yml index add0c539e99..5b511cd1d95 100644 --- a/.github/workflows/release-cli.yml +++ b/.github/workflows/release-cli.yml @@ -100,12 +100,18 @@ jobs: env: PKG_VERSION: ${{ steps.version.outputs.version }} with: - artifacts: "apps/cli/bw-windows-${{ env.PKG_VERSION }}.zip, - apps/cli/bw-windows-sha256-${{ env.PKG_VERSION }}.txt, - apps/cli/bw-macos-${{ env.PKG_VERSION }}.zip, - apps/cli/bw-macos-sha256-${{ env.PKG_VERSION }}.txt, - apps/cli/bw-linux-${{ env.PKG_VERSION }}.zip, - apps/cli/bw-linux-sha256-${{ env.PKG_VERSION }}.txt, + artifacts: "apps/cli/bw-oss-windows-${{ env.PKG_VERSION }}.zip, + apps/cli/bw-oss-windows-sha256-${{ env.PKG_VERSION }}.txt, + apps/cli/bw-bit-windows-${{ env.PKG_VERSION }}.zip, + apps/cli/bw-bit-windows-sha256-${{ env.PKG_VERSION }}.txt, + apps/cli/bw-oss-macos-${{ env.PKG_VERSION }}.zip, + apps/cli/bw-oss-macos-sha256-${{ env.PKG_VERSION }}.txt, + apps/cli/bw-bit-macos-${{ env.PKG_VERSION }}.zip, + apps/cli/bw-bit-macos-sha256-${{ env.PKG_VERSION }}.txt, + apps/cli/bw-oss-linux-${{ env.PKG_VERSION }}.zip, + apps/cli/bw-oss-linux-sha256-${{ env.PKG_VERSION }}.txt, + apps/cli/bw-bit-linux-${{ env.PKG_VERSION }}.zip, + apps/cli/bw-bit-linux-sha256-${{ env.PKG_VERSION }}.txt, apps/cli/bitwarden-cli.${{ env.PKG_VERSION }}.nupkg, apps/cli/bw_${{ env.PKG_VERSION }}_amd64.snap, apps/cli/bw-snap-sha256-${{ env.PKG_VERSION }}.txt" diff --git a/.github/workflows/version-auto-bump.yml b/.github/workflows/version-auto-bump.yml index d0d028e570f..f10abee300d 100644 --- a/.github/workflows/version-auto-bump.yml +++ b/.github/workflows/version-auto-bump.yml @@ -27,9 +27,9 @@ jobs: env: GH_TOKEN: ${{ steps.retrieve-bot-secrets.outputs.github-pat-bitwarden-devops-bot-repo-scope }} run: | - echo '{"cut_rc_branch": "false", \ - "bump_browser": "false", \ - "bump_cli": "false", \ - "bump_desktop": "true", \ + echo '{"cut_rc_branch": "false", + "bump_browser": "false", + "bump_cli": "false", + "bump_desktop": "true", "bump_web": "false"}' | \ gh workflow run version-bump.yml --json --repo bitwarden/clients diff --git a/.github/workflows/version-bump.yml b/.github/workflows/version-bump.yml index 246ca9a533d..15041aaa5d8 100644 --- a/.github/workflows/version-bump.yml +++ b/.github/workflows/version-bump.yml @@ -402,10 +402,7 @@ jobs: - name: Commit files if: ${{ steps.version-changed.outputs.changes_to_commit == 'TRUE' }} - env: - CLIENT: ${{ steps.create-branch.outputs.client }} - VERSION: ${{ steps.set-final-version-output.outputs.version }} - run: git commit -m "Bumped ${CLIENT} version to ${VERSION}" -a + run: git commit -m "Bumped client version(s)" -a - name: Push changes if: ${{ steps.version-changed.outputs.changes_to_commit == 'TRUE' }} @@ -413,13 +410,38 @@ jobs: PR_BRANCH: ${{ steps.create-branch.outputs.name }} run: git push -u origin $PR_BRANCH + - name: Generate PR message + if: ${{ steps.version-changed.outputs.changes_to_commit == 'TRUE' }} + id: pr-message + run: | + MESSAGE="" + if [[ "${{ inputs.bump_browser }}" == "true" ]]; then + MESSAGE+=$' Browser version bump to ${{ steps.set-final-version-output.outputs.version_browser }}\n' + fi + + if [[ "${{ inputs.bump_cli }}" == "true" ]]; then + MESSAGE+=$' CLI version bump to ${{ steps.set-final-version-output.outputs.version_cli }}\n' + fi + + if [[ "${{ inputs.bump_desktop }}" == "true" ]]; then + MESSAGE+=$' Desktop version bump to ${{ steps.set-final-version-output.outputs.version_desktop }}\n' + fi + + if [[ "${{ inputs.bump_web }}" == "true" ]]; then + MESSAGE+=$' Web version bump to ${{ steps.set-final-version-output.outputs.version_web }}\n' + fi + + echo "MESSAGE<> $GITHUB_ENV + echo "$MESSAGE" >> $GITHUB_ENV + echo "EOF" >> $GITHUB_ENV + - name: Create Version PR if: ${{ steps.version-changed.outputs.changes_to_commit == 'TRUE' }} id: create-pr env: GH_TOKEN: ${{ steps.retrieve-secrets.outputs.github-pat-bitwarden-devops-bot-repo-scope }} PR_BRANCH: ${{ steps.create-branch.outputs.name }} - TITLE: "Bump ${{ steps.create-branch.outputs.client }} version to ${{ steps.set-final-version-output.outputs.version }}" + TITLE: "Bump client(s) version" run: | PR_URL=$(gh pr create --title "$TITLE" \ --base "main" \ @@ -435,7 +457,8 @@ jobs: - [X] Other ## Objective - Automated ${{ steps.create-branch.outputs.client }} version bump to ${{ steps.set-final-version-output.outputs.version }}") + $MESSAGE") + echo "pr_number=${PR_URL##*/}" >> $GITHUB_OUTPUT - name: Approve PR @@ -452,6 +475,38 @@ jobs: PR_NUMBER: ${{ steps.create-pr.outputs.pr_number }} run: gh pr merge $PR_NUMBER --squash --auto --delete-branch + - name: Report upcoming browser release version to Slack + if: ${{ steps.version-changed.outputs.changes_to_commit == 'TRUE' && steps.set-final-version-output.outputs.version_browser != '' }} + uses: bitwarden/gh-actions/report-upcoming-release-version@main + with: + version: ${{ steps.set-final-version-output.outputs.version_browser }} + project: browser + AZURE_KV_CI_SERVICE_PRINCIPAL: ${{ secrets.AZURE_KV_CI_SERVICE_PRINCIPAL }} + + - name: Report upcoming cli release version to Slack + if: ${{ steps.version-changed.outputs.changes_to_commit == 'TRUE' && steps.set-final-version-output.outputs.version_cli != '' }} + uses: bitwarden/gh-actions/report-upcoming-release-version@main + with: + version: ${{ steps.set-final-version-output.outputs.version_cli }} + project: cli + AZURE_KV_CI_SERVICE_PRINCIPAL: ${{ secrets.AZURE_KV_CI_SERVICE_PRINCIPAL }} + + - name: Report upcoming desktop release version to Slack + if: ${{ steps.version-changed.outputs.changes_to_commit == 'TRUE' && steps.set-final-version-output.outputs.version_desktop != '' }} + uses: bitwarden/gh-actions/report-upcoming-release-version@main + with: + version: ${{ steps.set-final-version-output.outputs.version_desktop }} + project: desktop + AZURE_KV_CI_SERVICE_PRINCIPAL: ${{ secrets.AZURE_KV_CI_SERVICE_PRINCIPAL }} + + - name: Report upcoming web release version to Slack + if: ${{ steps.version-changed.outputs.changes_to_commit == 'TRUE' && steps.set-final-version-output.outputs.version_web != '' }} + uses: bitwarden/gh-actions/report-upcoming-release-version@main + with: + version: ${{ steps.set-final-version-output.outputs.version_web }} + project: web + AZURE_KV_CI_SERVICE_PRINCIPAL: ${{ secrets.AZURE_KV_CI_SERVICE_PRINCIPAL }} + cut_rc: name: Cut RC branch if: ${{ inputs.cut_rc_branch == true }} diff --git a/apps/browser/src/_locales/ar/messages.json b/apps/browser/src/_locales/ar/messages.json index 42c16140223..fc61b8010f3 100644 --- a/apps/browser/src/_locales/ar/messages.json +++ b/apps/browser/src/_locales/ar/messages.json @@ -166,15 +166,21 @@ "confirmIdentity": { "message": "قم بتأكيد هويتك للمتابعة." }, - "account": { - "message": "الحساب" - }, "changeMasterPassword": { "message": "تغيير كلمة المرور الرئيسية" }, "continueToWebApp": { "message": "Continue to web app?" }, + "continueToWebAppDesc": { + "message": "Explore more features of your Bitwarden account on the web app." + }, + "continueToHelpCenter": { + "message": "Continue to Help Center?" + }, + "continueToHelpCenterDesc": { + "message": "Learn more about how to use Bitwarden on the Help Center." + }, "changeMasterPasswordOnWebConfirmation": { "message": "You can change your master password on the Bitwarden web app." }, @@ -192,9 +198,45 @@ "logOut": { "message": "تسجيل الخروج" }, + "aboutBitwarden": { + "message": "About Bitwarden" + }, "about": { "message": "عن التطبيق" }, + "moreFromBitwarden": { + "message": "More from Bitwarden" + }, + "continueToBitwardenDotCom": { + "message": "Continue to bitwarden.com?" + }, + "bitwardenForBusiness": { + "message": "Bitwarden for Business" + }, + "bitwardenAuthenticator": { + "message": "Bitwarden Authenticator" + }, + "continueToAuthenticatorPageDesc": { + "message": "Bitwarden Authenticator allows you to store authenticator keys and generate TOTP codes for 2-step verification flows. Learn more on the bitwarden.com website" + }, + "bitwardenSecretsManager": { + "message": "Bitwarden Secrets Manager" + }, + "continueToSecretsManagerPageDesc": { + "message": "Securely store, manage, and share developer secrets with Bitwarden Secrets Manager. Learn more on the bitwarden.com website." + }, + "passwordlessDotDev": { + "message": "Passwordless.dev" + }, + "continueToPasswordlessDotDevPageDesc": { + "message": "Create smooth and secure login experiences free from traditional passwords with Passwordless.dev. Learn more on the bitwarden.com website." + }, + "freeBitwardenFamilies": { + "message": "Free Bitwarden Families" + }, + "freeBitwardenFamiliesPageDesc": { + "message": "You are eligible for Free Bitwarden Families. Redeem this offer today in the web app." + }, "version": { "message": "الإصدار" }, @@ -253,8 +295,8 @@ "passGenInfo": { "message": "قم بإنشاء كلمات مرور قوية وفريدة لتسجيلات الدخول الخاصة بك." }, - "bitWebVault": { - "message": "خزنة الويب Bitwarden" + "bitWebVaultApp": { + "message": "Bitwarden web app" }, "importItems": { "message": "استيراد العناصر" @@ -779,11 +821,8 @@ "shared": { "message": "مشترك" }, - "learnOrg": { - "message": "تعرف على المؤسسات" - }, - "learnOrgConfirmation": { - "message": "يسمح لك Bitwarden بمشاركة عناصر خزنتك مع الآخرين باستخدام حساب المؤسسة. هل ترغب في زيارة موقع bitwarden.com لمعرفة المزيد؟" + "bitwardenForBusinessPageDesc": { + "message": "Bitwarden for Business allows you to share your vault items with others by using an organization. Learn more on the bitwarden.com website." }, "moveToOrganization": { "message": "الانتقال إلى مؤسسة" @@ -1714,6 +1753,12 @@ "biometricsNotSupportedDesc": { "message": "القياسات الحيوية للمتصفح غير مدعومة على هذا الجهاز." }, + "biometricsNotUnlockedTitle": { + "message": "User locked or logged out" + }, + "biometricsNotUnlockedDesc": { + "message": "Please unlock this user in the desktop application and try again." + }, "biometricsFailedTitle": { "message": "فشل القياسات الحيوية" }, @@ -2177,6 +2222,108 @@ "forwardedEmailDesc": { "message": "إنشاء بريد إلكتروني مستعار مع خدمة إعادة توجيه خارجية." }, + "forwarderError": { + "message": "$SERVICENAME$ error: $ERRORMESSAGE$", + "description": "Reports an error returned by a forwarding service to the user.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + }, + "errormessage": { + "content": "$2", + "example": "Invalid characters in domain name." + } + } + }, + "forwarderGeneratedBy": { + "message": "Generated by Bitwarden.", + "description": "Displayed with the address on the forwarding service's configuration screen." + }, + "forwarderGeneratedByWithWebsite": { + "message": "Website: $WEBSITE$. Generated by Bitwarden.", + "description": "Displayed with the address on the forwarding service's configuration screen.", + "placeholders": { + "WEBSITE": { + "content": "$1", + "example": "www.example.com" + } + } + }, + "forwaderInvalidToken": { + "message": "Invalid $SERVICENAME$ API token", + "description": "Displayed when the user's API token is empty or rejected by the forwarding service.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwaderInvalidTokenWithMessage": { + "message": "Invalid $SERVICENAME$ API token: $ERRORMESSAGE$", + "description": "Displayed when the user's API token is rejected by the forwarding service with an error message.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + }, + "errormessage": { + "content": "$2", + "example": "Please verify your email address to continue." + } + } + }, + "forwarderNoAccountId": { + "message": "Unable to obtain $SERVICENAME$ masked email account ID.", + "description": "Displayed when the forwarding service fails to return an account ID.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderNoDomain": { + "message": "Invalid $SERVICENAME$ domain.", + "description": "Displayed when the domain is empty or domain authorization failed at the forwarding service.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderNoUrl": { + "message": "Invalid $SERVICENAME$ url.", + "description": "Displayed when the url of the forwarding service wasn't supplied.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderUnknownError": { + "message": "Unknown $SERVICENAME$ error occurred.", + "description": "Displayed when the forwarding service failed due to an unknown error.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderUnknownForwarder": { + "message": "Unknown forwarder: '$SERVICENAME$'.", + "description": "Displayed when the forwarding service is not supported.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "JustTrust.us" + } + } + }, "hostname": { "message": "اسم المضيف", "description": "Part of a URL." @@ -3029,6 +3176,41 @@ "message": "to make them visible.", "description": "This will be part of a larger sentence, which will read like so: Assign these items to a collection from the Admin Console to make them visible." }, + "autofillSuggestions": { + "message": "Auto-fill suggestions" + }, + "autofillSuggestionsTip": { + "message": "Save a login item for this site to auto-fill" + }, + "yourVaultIsEmpty": { + "message": "Your vault is empty" + }, + "noItemsMatchSearch": { + "message": "No items match your search" + }, + "clearFiltersOrTryAnother": { + "message": "Clear filters or try another search term" + }, + "copyInfo": { + "message": "Copy info, $ITEMNAME$", + "description": "Aria label for a button that opens a menu with options to copy information from an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "moreOptions": { + "message": "More options, $ITEMNAME$", + "description": "Aria label for a button that opens a menu with more options for an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, "adminConsole": { "message": "Admin Console" }, @@ -3046,5 +3228,38 @@ }, "errorAssigningTargetFolder": { "message": "Error assigning target folder." + }, + "viewItemsIn": { + "message": "View items in $NAME$", + "description": "Button to view the contents of a folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "backTo": { + "message": "Back to $NAME$", + "description": "Navigate back to a previous folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "new": { + "message": "New" + }, + "removeItem": { + "message": "Remove $NAME$", + "description": "Remove a selected option, such as a folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } } } diff --git a/apps/browser/src/_locales/az/messages.json b/apps/browser/src/_locales/az/messages.json index 6ac5c64ddd2..8b65adc90a8 100644 --- a/apps/browser/src/_locales/az/messages.json +++ b/apps/browser/src/_locales/az/messages.json @@ -166,15 +166,21 @@ "confirmIdentity": { "message": "Davam etmək üçün kimliyinizi təsdiqləyin." }, - "account": { - "message": "Hesab" - }, "changeMasterPassword": { "message": "Ana parolu dəyişdir" }, "continueToWebApp": { "message": "Veb tətbiqlə davam edilsin?" }, + "continueToWebAppDesc": { + "message": "Explore more features of your Bitwarden account on the web app." + }, + "continueToHelpCenter": { + "message": "Continue to Help Center?" + }, + "continueToHelpCenterDesc": { + "message": "Learn more about how to use Bitwarden on the Help Center." + }, "changeMasterPasswordOnWebConfirmation": { "message": "Ana parolunuzu Bitwarden veb tətbiqində dəyişdirə bilərsiniz." }, @@ -192,9 +198,45 @@ "logOut": { "message": "Çıxış" }, + "aboutBitwarden": { + "message": "About Bitwarden" + }, "about": { "message": "Haqqında" }, + "moreFromBitwarden": { + "message": "More from Bitwarden" + }, + "continueToBitwardenDotCom": { + "message": "Continue to bitwarden.com?" + }, + "bitwardenForBusiness": { + "message": "Bitwarden for Business" + }, + "bitwardenAuthenticator": { + "message": "Bitwarden Authenticator" + }, + "continueToAuthenticatorPageDesc": { + "message": "Bitwarden Authenticator allows you to store authenticator keys and generate TOTP codes for 2-step verification flows. Learn more on the bitwarden.com website" + }, + "bitwardenSecretsManager": { + "message": "Bitwarden Secrets Manager" + }, + "continueToSecretsManagerPageDesc": { + "message": "Securely store, manage, and share developer secrets with Bitwarden Secrets Manager. Learn more on the bitwarden.com website." + }, + "passwordlessDotDev": { + "message": "Passwordless.dev" + }, + "continueToPasswordlessDotDevPageDesc": { + "message": "Create smooth and secure login experiences free from traditional passwords with Passwordless.dev. Learn more on the bitwarden.com website." + }, + "freeBitwardenFamilies": { + "message": "Free Bitwarden Families" + }, + "freeBitwardenFamiliesPageDesc": { + "message": "You are eligible for Free Bitwarden Families. Redeem this offer today in the web app." + }, "version": { "message": "Versiya" }, @@ -253,8 +295,8 @@ "passGenInfo": { "message": "Hesablarınız üçün avtomatik olaraq güclü, unikal parollar yaradın." }, - "bitWebVault": { - "message": "Bitwarden veb anbarı" + "bitWebVaultApp": { + "message": "Bitwarden web app" }, "importItems": { "message": "Elementləri daxilə köçür" @@ -779,11 +821,8 @@ "shared": { "message": "Paylaşılan" }, - "learnOrg": { - "message": "Təşkilatlar barədə daha ətraflı" - }, - "learnOrgConfirmation": { - "message": "Bitwarden, bir təşkilat hesabı istifadə edərək anbar elementlərinizi başqaları ilə paylaşmağınıza icazə verir. Daha ətraflı məlumat üçün bitwarden.com saytını ziyarət etmək istəyirsiniz?" + "bitwardenForBusinessPageDesc": { + "message": "Bitwarden for Business allows you to share your vault items with others by using an organization. Learn more on the bitwarden.com website." }, "moveToOrganization": { "message": "Təşkilata daşı" @@ -1714,6 +1753,12 @@ "biometricsNotSupportedDesc": { "message": "Brauzer biometrikləri bu cihazda dəstəklənmir." }, + "biometricsNotUnlockedTitle": { + "message": "İstifadəçi kilidlənib və ya hesabdan çıxış edib" + }, + "biometricsNotUnlockedDesc": { + "message": "Lütfən bu istifadəçinin kilidini masaüstü tətbiqində açıb yenidən sınayın." + }, "biometricsFailedTitle": { "message": "Biometrik uğursuzdur" }, @@ -2177,6 +2222,108 @@ "forwardedEmailDesc": { "message": "Xarici yönləndirmə xidməti ilə e-poçt ləqəbi yaradın." }, + "forwarderError": { + "message": "$SERVICENAME$ xətası: $ERRORMESSAGE$", + "description": "Reports an error returned by a forwarding service to the user.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + }, + "errormessage": { + "content": "$2", + "example": "Invalid characters in domain name." + } + } + }, + "forwarderGeneratedBy": { + "message": "Bitwarden tərəfindən yaradılıb.", + "description": "Displayed with the address on the forwarding service's configuration screen." + }, + "forwarderGeneratedByWithWebsite": { + "message": "Veb sayt: $WEBSITE$. Bitwarden tərəfindən yaradılıb.", + "description": "Displayed with the address on the forwarding service's configuration screen.", + "placeholders": { + "WEBSITE": { + "content": "$1", + "example": "www.example.com" + } + } + }, + "forwaderInvalidToken": { + "message": "Yararsız $SERVICENAME$ API jetonu", + "description": "Displayed when the user's API token is empty or rejected by the forwarding service.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwaderInvalidTokenWithMessage": { + "message": "Yararsız $SERVICENAME$ API jetonu: $ERRORMESSAGE$", + "description": "Displayed when the user's API token is rejected by the forwarding service with an error message.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + }, + "errormessage": { + "content": "$2", + "example": "Please verify your email address to continue." + } + } + }, + "forwarderNoAccountId": { + "message": "$SERVICENAME$ maskalı e-poçt hesab kimliyi alına bilmir.", + "description": "Displayed when the forwarding service fails to return an account ID.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderNoDomain": { + "message": "Yararsız $SERVICENAME$ domeni.", + "description": "Displayed when the domain is empty or domain authorization failed at the forwarding service.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderNoUrl": { + "message": "Yararsız $SERVICENAME$ url-si.", + "description": "Displayed when the url of the forwarding service wasn't supplied.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderUnknownError": { + "message": "Bilinməyən $SERVICENAME$ xətası baş verdi.", + "description": "Displayed when the forwarding service failed due to an unknown error.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderUnknownForwarder": { + "message": "Bilinməyən yönləndirici: '$SERVICENAME$'.", + "description": "Displayed when the forwarding service is not supported.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "JustTrust.us" + } + } + }, "hostname": { "message": "Host adı", "description": "Part of a URL." @@ -3029,6 +3176,41 @@ "message": "bir kolleksiyaya təyin edin.", "description": "This will be part of a larger sentence, which will read like so: Assign these items to a collection from the Admin Console to make them visible." }, + "autofillSuggestions": { + "message": "Avto-doldurma təklifləri" + }, + "autofillSuggestionsTip": { + "message": "Bu saytın avto-doldurması üçün giriş elementini saxlayın" + }, + "yourVaultIsEmpty": { + "message": "Anbarınız boşdur" + }, + "noItemsMatchSearch": { + "message": "Axtarışınızla uyuşan heç bir element yoxdur" + }, + "clearFiltersOrTryAnother": { + "message": "Filtrləri təmizləyin və ya başqa bir axtarış terminini sınayın" + }, + "copyInfo": { + "message": "Məlumatları kopyala, $ITEMNAME$", + "description": "Aria label for a button that opens a menu with options to copy information from an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "moreOptions": { + "message": "Daha çox seçim, $ITEMNAME$", + "description": "Aria label for a button that opens a menu with more options for an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, "adminConsole": { "message": "Admin Konsolu" }, @@ -3046,5 +3228,38 @@ }, "errorAssigningTargetFolder": { "message": "Hədəf qovluğa təyin etmə xətası." + }, + "viewItemsIn": { + "message": "View items in $NAME$", + "description": "Button to view the contents of a folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "backTo": { + "message": "Back to $NAME$", + "description": "Navigate back to a previous folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "new": { + "message": "Yeni" + }, + "removeItem": { + "message": "Remove $NAME$", + "description": "Remove a selected option, such as a folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } } } diff --git a/apps/browser/src/_locales/be/messages.json b/apps/browser/src/_locales/be/messages.json index fb99a0a95d7..4e7be1f47fc 100644 --- a/apps/browser/src/_locales/be/messages.json +++ b/apps/browser/src/_locales/be/messages.json @@ -166,15 +166,21 @@ "confirmIdentity": { "message": "Пацвердзіце сваю асобу для працягу." }, - "account": { - "message": "Уліковы запіс" - }, "changeMasterPassword": { "message": "Змяніць асноўны пароль" }, "continueToWebApp": { "message": "Continue to web app?" }, + "continueToWebAppDesc": { + "message": "Explore more features of your Bitwarden account on the web app." + }, + "continueToHelpCenter": { + "message": "Continue to Help Center?" + }, + "continueToHelpCenterDesc": { + "message": "Learn more about how to use Bitwarden on the Help Center." + }, "changeMasterPasswordOnWebConfirmation": { "message": "You can change your master password on the Bitwarden web app." }, @@ -192,9 +198,45 @@ "logOut": { "message": "Выйсці" }, + "aboutBitwarden": { + "message": "About Bitwarden" + }, "about": { "message": "Пра Bitwarden" }, + "moreFromBitwarden": { + "message": "More from Bitwarden" + }, + "continueToBitwardenDotCom": { + "message": "Continue to bitwarden.com?" + }, + "bitwardenForBusiness": { + "message": "Bitwarden for Business" + }, + "bitwardenAuthenticator": { + "message": "Bitwarden Authenticator" + }, + "continueToAuthenticatorPageDesc": { + "message": "Bitwarden Authenticator allows you to store authenticator keys and generate TOTP codes for 2-step verification flows. Learn more on the bitwarden.com website" + }, + "bitwardenSecretsManager": { + "message": "Bitwarden Secrets Manager" + }, + "continueToSecretsManagerPageDesc": { + "message": "Securely store, manage, and share developer secrets with Bitwarden Secrets Manager. Learn more on the bitwarden.com website." + }, + "passwordlessDotDev": { + "message": "Passwordless.dev" + }, + "continueToPasswordlessDotDevPageDesc": { + "message": "Create smooth and secure login experiences free from traditional passwords with Passwordless.dev. Learn more on the bitwarden.com website." + }, + "freeBitwardenFamilies": { + "message": "Free Bitwarden Families" + }, + "freeBitwardenFamiliesPageDesc": { + "message": "You are eligible for Free Bitwarden Families. Redeem this offer today in the web app." + }, "version": { "message": "Версія" }, @@ -253,8 +295,8 @@ "passGenInfo": { "message": "Аўтаматычна генерыруйце надзейныя і ўнікальныя паролі для вашых лагінаў." }, - "bitWebVault": { - "message": "Вэб-сховішча Bitwarden" + "bitWebVaultApp": { + "message": "Bitwarden web app" }, "importItems": { "message": "Імпартаванне элементаў" @@ -779,11 +821,8 @@ "shared": { "message": "Абагуленыя" }, - "learnOrg": { - "message": "Даведацца пра арганізацыі" - }, - "learnOrgConfirmation": { - "message": "Bitwarden дазваляе абагуліць элементы вашага сховішча з іншымі карыстальнікамі, выкарыстоўваючы арганізацыю. Хочаце наведаць сайт bitwarden.com, каб даведацца больш?" + "bitwardenForBusinessPageDesc": { + "message": "Bitwarden for Business allows you to share your vault items with others by using an organization. Learn more on the bitwarden.com website." }, "moveToOrganization": { "message": "Перамясціць у арганізацыю" @@ -1714,6 +1753,12 @@ "biometricsNotSupportedDesc": { "message": "Біяметрыя ў браўзеры не падтрымліваецца на гэтай прыладзе." }, + "biometricsNotUnlockedTitle": { + "message": "User locked or logged out" + }, + "biometricsNotUnlockedDesc": { + "message": "Please unlock this user in the desktop application and try again." + }, "biometricsFailedTitle": { "message": "Biometrics failed" }, @@ -2177,6 +2222,108 @@ "forwardedEmailDesc": { "message": "Генерыраваць псеўданім электроннай пошты са знешнім сэрвісам перасылкі." }, + "forwarderError": { + "message": "$SERVICENAME$ error: $ERRORMESSAGE$", + "description": "Reports an error returned by a forwarding service to the user.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + }, + "errormessage": { + "content": "$2", + "example": "Invalid characters in domain name." + } + } + }, + "forwarderGeneratedBy": { + "message": "Generated by Bitwarden.", + "description": "Displayed with the address on the forwarding service's configuration screen." + }, + "forwarderGeneratedByWithWebsite": { + "message": "Website: $WEBSITE$. Generated by Bitwarden.", + "description": "Displayed with the address on the forwarding service's configuration screen.", + "placeholders": { + "WEBSITE": { + "content": "$1", + "example": "www.example.com" + } + } + }, + "forwaderInvalidToken": { + "message": "Invalid $SERVICENAME$ API token", + "description": "Displayed when the user's API token is empty or rejected by the forwarding service.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwaderInvalidTokenWithMessage": { + "message": "Invalid $SERVICENAME$ API token: $ERRORMESSAGE$", + "description": "Displayed when the user's API token is rejected by the forwarding service with an error message.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + }, + "errormessage": { + "content": "$2", + "example": "Please verify your email address to continue." + } + } + }, + "forwarderNoAccountId": { + "message": "Unable to obtain $SERVICENAME$ masked email account ID.", + "description": "Displayed when the forwarding service fails to return an account ID.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderNoDomain": { + "message": "Invalid $SERVICENAME$ domain.", + "description": "Displayed when the domain is empty or domain authorization failed at the forwarding service.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderNoUrl": { + "message": "Invalid $SERVICENAME$ url.", + "description": "Displayed when the url of the forwarding service wasn't supplied.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderUnknownError": { + "message": "Unknown $SERVICENAME$ error occurred.", + "description": "Displayed when the forwarding service failed due to an unknown error.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderUnknownForwarder": { + "message": "Unknown forwarder: '$SERVICENAME$'.", + "description": "Displayed when the forwarding service is not supported.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "JustTrust.us" + } + } + }, "hostname": { "message": "Назва вузла", "description": "Part of a URL." @@ -3029,6 +3176,41 @@ "message": "to make them visible.", "description": "This will be part of a larger sentence, which will read like so: Assign these items to a collection from the Admin Console to make them visible." }, + "autofillSuggestions": { + "message": "Auto-fill suggestions" + }, + "autofillSuggestionsTip": { + "message": "Save a login item for this site to auto-fill" + }, + "yourVaultIsEmpty": { + "message": "Your vault is empty" + }, + "noItemsMatchSearch": { + "message": "No items match your search" + }, + "clearFiltersOrTryAnother": { + "message": "Clear filters or try another search term" + }, + "copyInfo": { + "message": "Copy info, $ITEMNAME$", + "description": "Aria label for a button that opens a menu with options to copy information from an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "moreOptions": { + "message": "More options, $ITEMNAME$", + "description": "Aria label for a button that opens a menu with more options for an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, "adminConsole": { "message": "Admin Console" }, @@ -3046,5 +3228,38 @@ }, "errorAssigningTargetFolder": { "message": "Error assigning target folder." + }, + "viewItemsIn": { + "message": "View items in $NAME$", + "description": "Button to view the contents of a folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "backTo": { + "message": "Back to $NAME$", + "description": "Navigate back to a previous folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "new": { + "message": "New" + }, + "removeItem": { + "message": "Remove $NAME$", + "description": "Remove a selected option, such as a folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } } } diff --git a/apps/browser/src/_locales/bg/messages.json b/apps/browser/src/_locales/bg/messages.json index 609131a66a1..9b3add9ad5f 100644 --- a/apps/browser/src/_locales/bg/messages.json +++ b/apps/browser/src/_locales/bg/messages.json @@ -166,15 +166,21 @@ "confirmIdentity": { "message": "Потвърдете самоличността си, за да продължите." }, - "account": { - "message": "Регистрация" - }, "changeMasterPassword": { "message": "Промяна на главната парола" }, "continueToWebApp": { "message": "Продължаване към уеб приложението?" }, + "continueToWebAppDesc": { + "message": "Разгледайте още от възможностите на регистрацията си в Битуорден в уеб приложението." + }, + "continueToHelpCenter": { + "message": "Продължаване към помощния център?" + }, + "continueToHelpCenterDesc": { + "message": "Научете повече относно това как да използвате Битуорден в помощния център." + }, "changeMasterPasswordOnWebConfirmation": { "message": "Може да промените главната си парола в уеб приложението на Битуорден." }, @@ -192,9 +198,45 @@ "logOut": { "message": "Отписване" }, + "aboutBitwarden": { + "message": "Относно Битуорден" + }, "about": { "message": "Относно" }, + "moreFromBitwarden": { + "message": "Още от Битуорден" + }, + "continueToBitwardenDotCom": { + "message": "Продължаване към bitwarden.com?" + }, + "bitwardenForBusiness": { + "message": "Битуорден за бизнеса" + }, + "bitwardenAuthenticator": { + "message": "Удостоверител на Битуорден" + }, + "continueToAuthenticatorPageDesc": { + "message": "Удостоверителя на Битуорден позволява да запазвате ключове за удостоверяване, както и да произвеждате еднократни кодове за достъп за местата, където се изисква удостоверяване в 2 стъпки. Научете повече в уеб сайта bitwarden.com" + }, + "bitwardenSecretsManager": { + "message": "Управление на тайни" + }, + "continueToSecretsManagerPageDesc": { + "message": "Съхранявайте, управлявайте и споделяйте тайните по време на разработка с Управлението на тайни на Битуорден. Научете повече в уеб сайта bitwarden.com." + }, + "passwordlessDotDev": { + "message": "Passwordless.dev" + }, + "continueToPasswordlessDotDevPageDesc": { + "message": "Създавайте лесни за ползване, но защитени процеси за вписване без нужда от традиционни пароли с помощта на Passwordless.dev. Научете повече в уеб сайта bitwarden.com." + }, + "freeBitwardenFamilies": { + "message": "Безплатен Битуорден за семейства" + }, + "freeBitwardenFamiliesPageDesc": { + "message": "Може да се активирате Битуорден за семейства безплатно. Възползвайте се от предложението в уеб приложението." + }, "version": { "message": "Версия" }, @@ -253,8 +295,8 @@ "passGenInfo": { "message": "Автоматично създаване на силни и неповторими пароли." }, - "bitWebVault": { - "message": "Уебтрезорът на Bitwarden" + "bitWebVaultApp": { + "message": "Уеб приложение" }, "importItems": { "message": "Внасяне на елементи" @@ -779,11 +821,8 @@ "shared": { "message": "Споделено" }, - "learnOrg": { - "message": "Научете за организациите" - }, - "learnOrgConfirmation": { - "message": "Битуорден позволява да споделяте елементи от трезора си а други, използвайки организация. Бихте ли посетили сайта bitwarden.com, за да научите повече?" + "bitwardenForBusinessPageDesc": { + "message": "Битуорден за бизнеса позволява да споделяте части от трезора си чрез използването на организация. Научете повече в уеб сайта bitwarden.com." }, "moveToOrganization": { "message": "Преместване в организация" @@ -1714,6 +1753,12 @@ "biometricsNotSupportedDesc": { "message": "Устройството не поддържа потвърждаване с биометрични данни." }, + "biometricsNotUnlockedTitle": { + "message": "Потребителят е заключен или отписан" + }, + "biometricsNotUnlockedDesc": { + "message": "Отключете потребителя в настолното приложение и опитайте отново." + }, "biometricsFailedTitle": { "message": "Неуспешно удостоверяване чрез биометрични данни" }, @@ -2177,6 +2222,108 @@ "forwardedEmailDesc": { "message": "Създайте псевдоним на е-поща с външна услуга за препращане." }, + "forwarderError": { + "message": "Грешка от $SERVICENAME$: $ERRORMESSAGE$", + "description": "Reports an error returned by a forwarding service to the user.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + }, + "errormessage": { + "content": "$2", + "example": "Invalid characters in domain name." + } + } + }, + "forwarderGeneratedBy": { + "message": "Създадено от Битуорден.", + "description": "Displayed with the address on the forwarding service's configuration screen." + }, + "forwarderGeneratedByWithWebsite": { + "message": "Уебсайт: $WEBSITE$. Създадено от Битуорден.", + "description": "Displayed with the address on the forwarding service's configuration screen.", + "placeholders": { + "WEBSITE": { + "content": "$1", + "example": "www.example.com" + } + } + }, + "forwaderInvalidToken": { + "message": "Неправилен идентификатор за ППИ на $SERVICENAME$", + "description": "Displayed when the user's API token is empty or rejected by the forwarding service.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwaderInvalidTokenWithMessage": { + "message": "Неправилен идентификатор за ППИ на $SERVICENAME$: $ERRORMESSAGE$", + "description": "Displayed when the user's API token is rejected by the forwarding service with an error message.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + }, + "errormessage": { + "content": "$2", + "example": "Please verify your email address to continue." + } + } + }, + "forwarderNoAccountId": { + "message": "Не може да бъде получен идентификатор на маскиран чрез е-поща акаунт от $SERVICENAME$.", + "description": "Displayed when the forwarding service fails to return an account ID.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderNoDomain": { + "message": "Неправилен домейн за $SERVICENAME$.", + "description": "Displayed when the domain is empty or domain authorization failed at the forwarding service.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderNoUrl": { + "message": "Неправилен адрес на $SERVICENAME$.", + "description": "Displayed when the url of the forwarding service wasn't supplied.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderUnknownError": { + "message": "Възникна неочаквана грешка свързана с $SERVICENAME$.", + "description": "Displayed when the forwarding service failed due to an unknown error.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderUnknownForwarder": { + "message": "Неизвестна пренасочваща услуга: „$SERVICENAME$“.", + "description": "Displayed when the forwarding service is not supported.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "JustTrust.us" + } + } + }, "hostname": { "message": "Име на сървъра", "description": "Part of a URL." @@ -3029,6 +3176,41 @@ "message": "за да ги направите видими.", "description": "This will be part of a larger sentence, which will read like so: Assign these items to a collection from the Admin Console to make them visible." }, + "autofillSuggestions": { + "message": "Автоматично попълване на предложения" + }, + "autofillSuggestionsTip": { + "message": "Запазване на елемент за вписване за този уеб сайт, за авт. попълване" + }, + "yourVaultIsEmpty": { + "message": "Трезорът е празен" + }, + "noItemsMatchSearch": { + "message": "Няма елементи, отговарящи на търсенето" + }, + "clearFiltersOrTryAnother": { + "message": "Изчистете филтрите или опитайте да търсите нещо друго" + }, + "copyInfo": { + "message": "Копиране на информацията, $ITEMNAME$", + "description": "Aria label for a button that opens a menu with options to copy information from an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "moreOptions": { + "message": "Още опции, $ITEMNAME$", + "description": "Aria label for a button that opens a menu with more options for an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, "adminConsole": { "message": "Административна конзола" }, @@ -3046,5 +3228,38 @@ }, "errorAssigningTargetFolder": { "message": "Грешка при задаването на целева папка." + }, + "viewItemsIn": { + "message": "View items in $NAME$", + "description": "Button to view the contents of a folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "backTo": { + "message": "Back to $NAME$", + "description": "Navigate back to a previous folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "new": { + "message": "Ново" + }, + "removeItem": { + "message": "Remove $NAME$", + "description": "Remove a selected option, such as a folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } } } diff --git a/apps/browser/src/_locales/bn/messages.json b/apps/browser/src/_locales/bn/messages.json index c0ccd92d7a8..41fcdb980a3 100644 --- a/apps/browser/src/_locales/bn/messages.json +++ b/apps/browser/src/_locales/bn/messages.json @@ -166,15 +166,21 @@ "confirmIdentity": { "message": "Confirm your identity to continue." }, - "account": { - "message": "অ্যাকাউন্ট" - }, "changeMasterPassword": { "message": "মূল পাসওয়ার্ড পরিবর্তন" }, "continueToWebApp": { "message": "Continue to web app?" }, + "continueToWebAppDesc": { + "message": "Explore more features of your Bitwarden account on the web app." + }, + "continueToHelpCenter": { + "message": "Continue to Help Center?" + }, + "continueToHelpCenterDesc": { + "message": "Learn more about how to use Bitwarden on the Help Center." + }, "changeMasterPasswordOnWebConfirmation": { "message": "You can change your master password on the Bitwarden web app." }, @@ -192,9 +198,45 @@ "logOut": { "message": "লগ আউট" }, + "aboutBitwarden": { + "message": "About Bitwarden" + }, "about": { "message": "সম্বন্ধে" }, + "moreFromBitwarden": { + "message": "More from Bitwarden" + }, + "continueToBitwardenDotCom": { + "message": "Continue to bitwarden.com?" + }, + "bitwardenForBusiness": { + "message": "Bitwarden for Business" + }, + "bitwardenAuthenticator": { + "message": "Bitwarden Authenticator" + }, + "continueToAuthenticatorPageDesc": { + "message": "Bitwarden Authenticator allows you to store authenticator keys and generate TOTP codes for 2-step verification flows. Learn more on the bitwarden.com website" + }, + "bitwardenSecretsManager": { + "message": "Bitwarden Secrets Manager" + }, + "continueToSecretsManagerPageDesc": { + "message": "Securely store, manage, and share developer secrets with Bitwarden Secrets Manager. Learn more on the bitwarden.com website." + }, + "passwordlessDotDev": { + "message": "Passwordless.dev" + }, + "continueToPasswordlessDotDevPageDesc": { + "message": "Create smooth and secure login experiences free from traditional passwords with Passwordless.dev. Learn more on the bitwarden.com website." + }, + "freeBitwardenFamilies": { + "message": "Free Bitwarden Families" + }, + "freeBitwardenFamiliesPageDesc": { + "message": "You are eligible for Free Bitwarden Families. Redeem this offer today in the web app." + }, "version": { "message": "সংস্করণ" }, @@ -253,8 +295,8 @@ "passGenInfo": { "message": "আপনার লগইনগুলির জন্য স্বয়ংক্রিয়ভাবে শক্তিশালী, অদ্বিতীয় পাসওয়ার্ড তৈরি করুন।" }, - "bitWebVault": { - "message": "Bitwarden ওয়েব ভল্ট" + "bitWebVaultApp": { + "message": "Bitwarden web app" }, "importItems": { "message": "বস্তু আমদানি" @@ -779,11 +821,8 @@ "shared": { "message": "ভাগকৃত" }, - "learnOrg": { - "message": "Learn about organizations" - }, - "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?" + "bitwardenForBusinessPageDesc": { + "message": "Bitwarden for Business allows you to share your vault items with others by using an organization. Learn more on the bitwarden.com website." }, "moveToOrganization": { "message": "Move to organization" @@ -1714,6 +1753,12 @@ "biometricsNotSupportedDesc": { "message": "ব্রাউজার বায়োমেট্রিক্স এই ডিভাইসে সমর্থিত নয়।" }, + "biometricsNotUnlockedTitle": { + "message": "User locked or logged out" + }, + "biometricsNotUnlockedDesc": { + "message": "Please unlock this user in the desktop application and try again." + }, "biometricsFailedTitle": { "message": "Biometrics failed" }, @@ -2177,6 +2222,108 @@ "forwardedEmailDesc": { "message": "Generate an email alias with an external forwarding service." }, + "forwarderError": { + "message": "$SERVICENAME$ error: $ERRORMESSAGE$", + "description": "Reports an error returned by a forwarding service to the user.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + }, + "errormessage": { + "content": "$2", + "example": "Invalid characters in domain name." + } + } + }, + "forwarderGeneratedBy": { + "message": "Generated by Bitwarden.", + "description": "Displayed with the address on the forwarding service's configuration screen." + }, + "forwarderGeneratedByWithWebsite": { + "message": "Website: $WEBSITE$. Generated by Bitwarden.", + "description": "Displayed with the address on the forwarding service's configuration screen.", + "placeholders": { + "WEBSITE": { + "content": "$1", + "example": "www.example.com" + } + } + }, + "forwaderInvalidToken": { + "message": "Invalid $SERVICENAME$ API token", + "description": "Displayed when the user's API token is empty or rejected by the forwarding service.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwaderInvalidTokenWithMessage": { + "message": "Invalid $SERVICENAME$ API token: $ERRORMESSAGE$", + "description": "Displayed when the user's API token is rejected by the forwarding service with an error message.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + }, + "errormessage": { + "content": "$2", + "example": "Please verify your email address to continue." + } + } + }, + "forwarderNoAccountId": { + "message": "Unable to obtain $SERVICENAME$ masked email account ID.", + "description": "Displayed when the forwarding service fails to return an account ID.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderNoDomain": { + "message": "Invalid $SERVICENAME$ domain.", + "description": "Displayed when the domain is empty or domain authorization failed at the forwarding service.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderNoUrl": { + "message": "Invalid $SERVICENAME$ url.", + "description": "Displayed when the url of the forwarding service wasn't supplied.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderUnknownError": { + "message": "Unknown $SERVICENAME$ error occurred.", + "description": "Displayed when the forwarding service failed due to an unknown error.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderUnknownForwarder": { + "message": "Unknown forwarder: '$SERVICENAME$'.", + "description": "Displayed when the forwarding service is not supported.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "JustTrust.us" + } + } + }, "hostname": { "message": "Hostname", "description": "Part of a URL." @@ -3029,6 +3176,41 @@ "message": "to make them visible.", "description": "This will be part of a larger sentence, which will read like so: Assign these items to a collection from the Admin Console to make them visible." }, + "autofillSuggestions": { + "message": "Auto-fill suggestions" + }, + "autofillSuggestionsTip": { + "message": "Save a login item for this site to auto-fill" + }, + "yourVaultIsEmpty": { + "message": "Your vault is empty" + }, + "noItemsMatchSearch": { + "message": "No items match your search" + }, + "clearFiltersOrTryAnother": { + "message": "Clear filters or try another search term" + }, + "copyInfo": { + "message": "Copy info, $ITEMNAME$", + "description": "Aria label for a button that opens a menu with options to copy information from an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "moreOptions": { + "message": "More options, $ITEMNAME$", + "description": "Aria label for a button that opens a menu with more options for an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, "adminConsole": { "message": "Admin Console" }, @@ -3046,5 +3228,38 @@ }, "errorAssigningTargetFolder": { "message": "Error assigning target folder." + }, + "viewItemsIn": { + "message": "View items in $NAME$", + "description": "Button to view the contents of a folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "backTo": { + "message": "Back to $NAME$", + "description": "Navigate back to a previous folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "new": { + "message": "New" + }, + "removeItem": { + "message": "Remove $NAME$", + "description": "Remove a selected option, such as a folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } } } diff --git a/apps/browser/src/_locales/bs/messages.json b/apps/browser/src/_locales/bs/messages.json index 53c5c4ed44e..7b85e5c3619 100644 --- a/apps/browser/src/_locales/bs/messages.json +++ b/apps/browser/src/_locales/bs/messages.json @@ -166,15 +166,21 @@ "confirmIdentity": { "message": "Confirm your identity to continue." }, - "account": { - "message": "Account" - }, "changeMasterPassword": { "message": "Change master password" }, "continueToWebApp": { "message": "Continue to web app?" }, + "continueToWebAppDesc": { + "message": "Explore more features of your Bitwarden account on the web app." + }, + "continueToHelpCenter": { + "message": "Continue to Help Center?" + }, + "continueToHelpCenterDesc": { + "message": "Learn more about how to use Bitwarden on the Help Center." + }, "changeMasterPasswordOnWebConfirmation": { "message": "You can change your master password on the Bitwarden web app." }, @@ -192,9 +198,45 @@ "logOut": { "message": "Log out" }, + "aboutBitwarden": { + "message": "About Bitwarden" + }, "about": { "message": "About" }, + "moreFromBitwarden": { + "message": "More from Bitwarden" + }, + "continueToBitwardenDotCom": { + "message": "Continue to bitwarden.com?" + }, + "bitwardenForBusiness": { + "message": "Bitwarden for Business" + }, + "bitwardenAuthenticator": { + "message": "Bitwarden Authenticator" + }, + "continueToAuthenticatorPageDesc": { + "message": "Bitwarden Authenticator allows you to store authenticator keys and generate TOTP codes for 2-step verification flows. Learn more on the bitwarden.com website" + }, + "bitwardenSecretsManager": { + "message": "Bitwarden Secrets Manager" + }, + "continueToSecretsManagerPageDesc": { + "message": "Securely store, manage, and share developer secrets with Bitwarden Secrets Manager. Learn more on the bitwarden.com website." + }, + "passwordlessDotDev": { + "message": "Passwordless.dev" + }, + "continueToPasswordlessDotDevPageDesc": { + "message": "Create smooth and secure login experiences free from traditional passwords with Passwordless.dev. Learn more on the bitwarden.com website." + }, + "freeBitwardenFamilies": { + "message": "Free Bitwarden Families" + }, + "freeBitwardenFamiliesPageDesc": { + "message": "You are eligible for Free Bitwarden Families. Redeem this offer today in the web app." + }, "version": { "message": "Version" }, @@ -253,8 +295,8 @@ "passGenInfo": { "message": "Automatically generate strong, unique passwords for your logins." }, - "bitWebVault": { - "message": "Bitwarden web vault" + "bitWebVaultApp": { + "message": "Bitwarden web app" }, "importItems": { "message": "Import items" @@ -779,11 +821,8 @@ "shared": { "message": "Shared" }, - "learnOrg": { - "message": "Learn about organizations" - }, - "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?" + "bitwardenForBusinessPageDesc": { + "message": "Bitwarden for Business allows you to share your vault items with others by using an organization. Learn more on the bitwarden.com website." }, "moveToOrganization": { "message": "Move to organization" @@ -1714,6 +1753,12 @@ "biometricsNotSupportedDesc": { "message": "Browser biometrics is not supported on this device." }, + "biometricsNotUnlockedTitle": { + "message": "User locked or logged out" + }, + "biometricsNotUnlockedDesc": { + "message": "Please unlock this user in the desktop application and try again." + }, "biometricsFailedTitle": { "message": "Biometrics failed" }, @@ -2177,6 +2222,108 @@ "forwardedEmailDesc": { "message": "Generate an email alias with an external forwarding service." }, + "forwarderError": { + "message": "$SERVICENAME$ error: $ERRORMESSAGE$", + "description": "Reports an error returned by a forwarding service to the user.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + }, + "errormessage": { + "content": "$2", + "example": "Invalid characters in domain name." + } + } + }, + "forwarderGeneratedBy": { + "message": "Generated by Bitwarden.", + "description": "Displayed with the address on the forwarding service's configuration screen." + }, + "forwarderGeneratedByWithWebsite": { + "message": "Website: $WEBSITE$. Generated by Bitwarden.", + "description": "Displayed with the address on the forwarding service's configuration screen.", + "placeholders": { + "WEBSITE": { + "content": "$1", + "example": "www.example.com" + } + } + }, + "forwaderInvalidToken": { + "message": "Invalid $SERVICENAME$ API token", + "description": "Displayed when the user's API token is empty or rejected by the forwarding service.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwaderInvalidTokenWithMessage": { + "message": "Invalid $SERVICENAME$ API token: $ERRORMESSAGE$", + "description": "Displayed when the user's API token is rejected by the forwarding service with an error message.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + }, + "errormessage": { + "content": "$2", + "example": "Please verify your email address to continue." + } + } + }, + "forwarderNoAccountId": { + "message": "Unable to obtain $SERVICENAME$ masked email account ID.", + "description": "Displayed when the forwarding service fails to return an account ID.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderNoDomain": { + "message": "Invalid $SERVICENAME$ domain.", + "description": "Displayed when the domain is empty or domain authorization failed at the forwarding service.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderNoUrl": { + "message": "Invalid $SERVICENAME$ url.", + "description": "Displayed when the url of the forwarding service wasn't supplied.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderUnknownError": { + "message": "Unknown $SERVICENAME$ error occurred.", + "description": "Displayed when the forwarding service failed due to an unknown error.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderUnknownForwarder": { + "message": "Unknown forwarder: '$SERVICENAME$'.", + "description": "Displayed when the forwarding service is not supported.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "JustTrust.us" + } + } + }, "hostname": { "message": "Hostname", "description": "Part of a URL." @@ -3029,6 +3176,41 @@ "message": "to make them visible.", "description": "This will be part of a larger sentence, which will read like so: Assign these items to a collection from the Admin Console to make them visible." }, + "autofillSuggestions": { + "message": "Auto-fill suggestions" + }, + "autofillSuggestionsTip": { + "message": "Save a login item for this site to auto-fill" + }, + "yourVaultIsEmpty": { + "message": "Your vault is empty" + }, + "noItemsMatchSearch": { + "message": "No items match your search" + }, + "clearFiltersOrTryAnother": { + "message": "Clear filters or try another search term" + }, + "copyInfo": { + "message": "Copy info, $ITEMNAME$", + "description": "Aria label for a button that opens a menu with options to copy information from an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "moreOptions": { + "message": "More options, $ITEMNAME$", + "description": "Aria label for a button that opens a menu with more options for an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, "adminConsole": { "message": "Admin Console" }, @@ -3046,5 +3228,38 @@ }, "errorAssigningTargetFolder": { "message": "Error assigning target folder." + }, + "viewItemsIn": { + "message": "View items in $NAME$", + "description": "Button to view the contents of a folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "backTo": { + "message": "Back to $NAME$", + "description": "Navigate back to a previous folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "new": { + "message": "New" + }, + "removeItem": { + "message": "Remove $NAME$", + "description": "Remove a selected option, such as a folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } } } diff --git a/apps/browser/src/_locales/ca/messages.json b/apps/browser/src/_locales/ca/messages.json index 2e282e30ee1..cac7ecc1520 100644 --- a/apps/browser/src/_locales/ca/messages.json +++ b/apps/browser/src/_locales/ca/messages.json @@ -166,15 +166,21 @@ "confirmIdentity": { "message": "Confirmeu la vostra identitat per continuar." }, - "account": { - "message": "Compte" - }, "changeMasterPassword": { "message": "Canvia la contrasenya mestra" }, "continueToWebApp": { "message": "Continua cap a l'aplicació web?" }, + "continueToWebAppDesc": { + "message": "Explore more features of your Bitwarden account on the web app." + }, + "continueToHelpCenter": { + "message": "Continue to Help Center?" + }, + "continueToHelpCenterDesc": { + "message": "Learn more about how to use Bitwarden on the Help Center." + }, "changeMasterPasswordOnWebConfirmation": { "message": "Podeu canviar la vostra contrasenya mestra a l'aplicació web de Bitwarden." }, @@ -192,9 +198,45 @@ "logOut": { "message": "Tanca la sessió" }, + "aboutBitwarden": { + "message": "About Bitwarden" + }, "about": { "message": "Quant a" }, + "moreFromBitwarden": { + "message": "More from Bitwarden" + }, + "continueToBitwardenDotCom": { + "message": "Continue to bitwarden.com?" + }, + "bitwardenForBusiness": { + "message": "Bitwarden for Business" + }, + "bitwardenAuthenticator": { + "message": "Bitwarden Authenticator" + }, + "continueToAuthenticatorPageDesc": { + "message": "Bitwarden Authenticator allows you to store authenticator keys and generate TOTP codes for 2-step verification flows. Learn more on the bitwarden.com website" + }, + "bitwardenSecretsManager": { + "message": "Bitwarden Secrets Manager" + }, + "continueToSecretsManagerPageDesc": { + "message": "Securely store, manage, and share developer secrets with Bitwarden Secrets Manager. Learn more on the bitwarden.com website." + }, + "passwordlessDotDev": { + "message": "Passwordless.dev" + }, + "continueToPasswordlessDotDevPageDesc": { + "message": "Create smooth and secure login experiences free from traditional passwords with Passwordless.dev. Learn more on the bitwarden.com website." + }, + "freeBitwardenFamilies": { + "message": "Free Bitwarden Families" + }, + "freeBitwardenFamiliesPageDesc": { + "message": "You are eligible for Free Bitwarden Families. Redeem this offer today in the web app." + }, "version": { "message": "Versió" }, @@ -253,8 +295,8 @@ "passGenInfo": { "message": "Genera automàticament contrasenyes fortes i úniques per als vostres inicis de sessió." }, - "bitWebVault": { - "message": "Caixa forta web de Bitwarden" + "bitWebVaultApp": { + "message": "Bitwarden web app" }, "importItems": { "message": "Importa elements" @@ -375,7 +417,7 @@ "message": "Altres" }, "unlockMethods": { - "message": "Unlock options" + "message": "Opcions de desbloqueig" }, "unlockMethodNeededToChangeTimeoutActionDesc": { "message": "Configura un mètode de desbloqueig per canviar l'acció del temps d'espera de la caixa forta." @@ -384,10 +426,10 @@ "message": "Configura un mètode de desbloqueig a Configuració" }, "sessionTimeoutHeader": { - "message": "Session timeout" + "message": "Temps de sessió" }, "otherOptions": { - "message": "Other options" + "message": "Altres opcions" }, "rateExtension": { "message": "Valora aquesta extensió" @@ -779,11 +821,8 @@ "shared": { "message": "Compartit" }, - "learnOrg": { - "message": "Més informació sobre les organitzacions" - }, - "learnOrgConfirmation": { - "message": "Bitwarden us permet compartir els elements de la vostra caixa forta amb altres usuaris mitjançant una organització. Voleu visitar el lloc web de bitwarden.com per obtenir més informació?" + "bitwardenForBusinessPageDesc": { + "message": "Bitwarden for Business allows you to share your vault items with others by using an organization. Learn more on the bitwarden.com website." }, "moveToOrganization": { "message": "Desplaça a l'organització" @@ -1714,6 +1753,12 @@ "biometricsNotSupportedDesc": { "message": "La biometria del navegador no és compatible amb aquest dispositiu." }, + "biometricsNotUnlockedTitle": { + "message": "User locked or logged out" + }, + "biometricsNotUnlockedDesc": { + "message": "Please unlock this user in the desktop application and try again." + }, "biometricsFailedTitle": { "message": "La biometria ha fallat" }, @@ -2177,6 +2222,108 @@ "forwardedEmailDesc": { "message": "Genera un àlies de correu electrònic amb un servei de reenviament extern." }, + "forwarderError": { + "message": "Error de $SERVICENAME$: $ERRORMESSAGE$", + "description": "Reports an error returned by a forwarding service to the user.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + }, + "errormessage": { + "content": "$2", + "example": "Invalid characters in domain name." + } + } + }, + "forwarderGeneratedBy": { + "message": "Generat per Bitwarden.", + "description": "Displayed with the address on the forwarding service's configuration screen." + }, + "forwarderGeneratedByWithWebsite": { + "message": "Lloc web: $WEBSITE$. Generat per Bitwarden.", + "description": "Displayed with the address on the forwarding service's configuration screen.", + "placeholders": { + "WEBSITE": { + "content": "$1", + "example": "www.example.com" + } + } + }, + "forwaderInvalidToken": { + "message": "Invalid $SERVICENAME$ API token", + "description": "Displayed when the user's API token is empty or rejected by the forwarding service.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwaderInvalidTokenWithMessage": { + "message": "Invalid $SERVICENAME$ API token: $ERRORMESSAGE$", + "description": "Displayed when the user's API token is rejected by the forwarding service with an error message.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + }, + "errormessage": { + "content": "$2", + "example": "Please verify your email address to continue." + } + } + }, + "forwarderNoAccountId": { + "message": "Unable to obtain $SERVICENAME$ masked email account ID.", + "description": "Displayed when the forwarding service fails to return an account ID.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderNoDomain": { + "message": "Invalid $SERVICENAME$ domain.", + "description": "Displayed when the domain is empty or domain authorization failed at the forwarding service.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderNoUrl": { + "message": "Invalid $SERVICENAME$ url.", + "description": "Displayed when the url of the forwarding service wasn't supplied.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderUnknownError": { + "message": "Unknown $SERVICENAME$ error occurred.", + "description": "Displayed when the forwarding service failed due to an unknown error.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderUnknownForwarder": { + "message": "Unknown forwarder: '$SERVICENAME$'.", + "description": "Displayed when the forwarding service is not supported.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "JustTrust.us" + } + } + }, "hostname": { "message": "Nom de l'amfitrió", "description": "Part of a URL." @@ -3029,6 +3176,41 @@ "message": "per fer-los visibles.", "description": "This will be part of a larger sentence, which will read like so: Assign these items to a collection from the Admin Console to make them visible." }, + "autofillSuggestions": { + "message": "Auto-fill suggestions" + }, + "autofillSuggestionsTip": { + "message": "Save a login item for this site to auto-fill" + }, + "yourVaultIsEmpty": { + "message": "Your vault is empty" + }, + "noItemsMatchSearch": { + "message": "No items match your search" + }, + "clearFiltersOrTryAnother": { + "message": "Clear filters or try another search term" + }, + "copyInfo": { + "message": "Copy info, $ITEMNAME$", + "description": "Aria label for a button that opens a menu with options to copy information from an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "moreOptions": { + "message": "More options, $ITEMNAME$", + "description": "Aria label for a button that opens a menu with more options for an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, "adminConsole": { "message": "Consola d'administració" }, @@ -3046,5 +3228,38 @@ }, "errorAssigningTargetFolder": { "message": "S'ha produït un error en assignar la carpeta de destinació." + }, + "viewItemsIn": { + "message": "View items in $NAME$", + "description": "Button to view the contents of a folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "backTo": { + "message": "Back to $NAME$", + "description": "Navigate back to a previous folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "new": { + "message": "New" + }, + "removeItem": { + "message": "Remove $NAME$", + "description": "Remove a selected option, such as a folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } } } diff --git a/apps/browser/src/_locales/cs/messages.json b/apps/browser/src/_locales/cs/messages.json index 794e2d995da..12cfcf1fd74 100644 --- a/apps/browser/src/_locales/cs/messages.json +++ b/apps/browser/src/_locales/cs/messages.json @@ -166,15 +166,21 @@ "confirmIdentity": { "message": "Pro pokračování potvrďte svou identitu." }, - "account": { - "message": "Účet" - }, "changeMasterPassword": { "message": "Změnit hlavní heslo" }, "continueToWebApp": { "message": "Pokračovat do webové aplikace?" }, + "continueToWebAppDesc": { + "message": "Prozkoumejte další funkce Vašeho účtu Bitwarden ve webové aplikaci." + }, + "continueToHelpCenter": { + "message": "Pokračovat do Centra nápovědy?" + }, + "continueToHelpCenterDesc": { + "message": "Přečtěte si více o tom, jak používat Bitwarden v Centru nápovědy." + }, "changeMasterPasswordOnWebConfirmation": { "message": "Hlavní heslo můžete změnit ve webové aplikaci Bitwardenu." }, @@ -192,9 +198,45 @@ "logOut": { "message": "Odhlásit se" }, + "aboutBitwarden": { + "message": "O Bitwardenu" + }, "about": { "message": "O rozšíření" }, + "moreFromBitwarden": { + "message": "Více od Bitwardenu" + }, + "continueToBitwardenDotCom": { + "message": "Pokračovat na bitwarden.com?" + }, + "bitwardenForBusiness": { + "message": "Bitwarden pro byznys" + }, + "bitwardenAuthenticator": { + "message": "Autentifikátor Bitwarden" + }, + "continueToAuthenticatorPageDesc": { + "message": "Autentifikátor Bitwarden umožňuje ukládat ověřovací klíče a generovat TOTP kódy pro 2-fázové ověřování. Další informace naleznete na stránkách bitwarden.com" + }, + "bitwardenSecretsManager": { + "message": "Správce tajných klíčů Bitwardenu" + }, + "continueToSecretsManagerPageDesc": { + "message": "Bezpečně ukládá, spravuje a sdílí tajné klíče vývojáře se správcem tajných klíčů Bitwardenu. Více informací naleznete na stránkách bitwarden.com." + }, + "passwordlessDotDev": { + "message": "Passwordless.dev" + }, + "continueToPasswordlessDotDevPageDesc": { + "message": "S heslem Passwordless.dev vytvoří hladký a bezpečný přístup bez tradičních hesel. Další informace naleznete na stránkách bitwarden.com." + }, + "freeBitwardenFamilies": { + "message": "Bitwarden pro rodinu zdarma" + }, + "freeBitwardenFamiliesPageDesc": { + "message": "Máte nárok na Bitwarden pro rodinu zdarma. Uplatněte tuto nabídku ještě dnes ve webové aplikaci." + }, "version": { "message": "Verze" }, @@ -253,8 +295,8 @@ "passGenInfo": { "message": "Vygenerujte si silné a unikátní heslo pro přihlašovací údaje." }, - "bitWebVault": { - "message": "Webový trezor Bitwardenu" + "bitWebVaultApp": { + "message": "Webová aplikace Bitwardenu" }, "importItems": { "message": "Importovat položky" @@ -779,11 +821,8 @@ "shared": { "message": "Sdílené" }, - "learnOrg": { - "message": "Více o organizacích" - }, - "learnOrgConfirmation": { - "message": "Bitwarden Vám umožňuje sdílet položky v trezoru s ostatními prostřednictvím organizace. Chcete přejít na bitwarden.com a dozvědět se více?" + "bitwardenForBusinessPageDesc": { + "message": "Bitwarden pro bvyznys Vám umožňuje sdílet položky v trezoru s ostatními prostřednictvím organizace. Více informací naleznete na bitwarden.com." }, "moveToOrganization": { "message": "Přesunout do organizace" @@ -1714,6 +1753,12 @@ "biometricsNotSupportedDesc": { "message": "Biometrie v prohlížeči není na tomto zařízení podporována." }, + "biometricsNotUnlockedTitle": { + "message": "Uživatel uzamčen nebo odhlášen" + }, + "biometricsNotUnlockedDesc": { + "message": "Odemkněte tohoto uživatele v programu pro počítač a zkuste to znovu." + }, "biometricsFailedTitle": { "message": "Biometrika selhala" }, @@ -2177,6 +2222,108 @@ "forwardedEmailDesc": { "message": "Vygenerovat e-mailový alias pomocí externí služby pro přesměrování." }, + "forwarderError": { + "message": "Chyba $SERVICENAME$: $ERRORMESSAGE$", + "description": "Reports an error returned by a forwarding service to the user.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + }, + "errormessage": { + "content": "$2", + "example": "Invalid characters in domain name." + } + } + }, + "forwarderGeneratedBy": { + "message": "Vygenerováno Bitwardenem.", + "description": "Displayed with the address on the forwarding service's configuration screen." + }, + "forwarderGeneratedByWithWebsite": { + "message": "Webová stránka: $WEBSITE$. Vygenerováno Bitwardenem.", + "description": "Displayed with the address on the forwarding service's configuration screen.", + "placeholders": { + "WEBSITE": { + "content": "$1", + "example": "www.example.com" + } + } + }, + "forwaderInvalidToken": { + "message": "Neplatný token API $SERVICENAME$", + "description": "Displayed when the user's API token is empty or rejected by the forwarding service.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwaderInvalidTokenWithMessage": { + "message": "Neplatný token API $SERVICENAME$: $ERRORMESSAGE$", + "description": "Displayed when the user's API token is rejected by the forwarding service with an error message.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + }, + "errormessage": { + "content": "$2", + "example": "Please verify your email address to continue." + } + } + }, + "forwarderNoAccountId": { + "message": "Nelze získat maskované ID e-mailového účtu $SERVICENAME$.", + "description": "Displayed when the forwarding service fails to return an account ID.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderNoDomain": { + "message": "Neplatná doména $SERVICENAME$.", + "description": "Displayed when the domain is empty or domain authorization failed at the forwarding service.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderNoUrl": { + "message": "Neplatné URL $SERVICENAME$.", + "description": "Displayed when the url of the forwarding service wasn't supplied.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderUnknownError": { + "message": "Došlo k neznámé chybě $SERVICENAME$.", + "description": "Displayed when the forwarding service failed due to an unknown error.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderUnknownForwarder": { + "message": "Neznámý přeposílatel: $SERVICENAME$.", + "description": "Displayed when the forwarding service is not supported.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "JustTrust.us" + } + } + }, "hostname": { "message": "Název hostitele", "description": "Part of a URL." @@ -3029,6 +3176,41 @@ "message": "aby byly viditelné.", "description": "This will be part of a larger sentence, which will read like so: Assign these items to a collection from the Admin Console to make them visible." }, + "autofillSuggestions": { + "message": "Návrhy automatického vyplňování" + }, + "autofillSuggestionsTip": { + "message": "Uložit přihlašovací údaje pro tuto stránku do automatického vyplňování" + }, + "yourVaultIsEmpty": { + "message": "Váš trezor je prázdný" + }, + "noItemsMatchSearch": { + "message": "Hledání neodpovídají žádné položky" + }, + "clearFiltersOrTryAnother": { + "message": "Vymažte filtry nebo zkuste jiný hledaný výraz" + }, + "copyInfo": { + "message": "Kopírovat informace, $ITEMNAME$", + "description": "Aria label for a button that opens a menu with options to copy information from an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "moreOptions": { + "message": "Více voleb, $ITEMNAME$", + "description": "Aria label for a button that opens a menu with more options for an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, "adminConsole": { "message": "Konzole správce" }, @@ -3046,5 +3228,38 @@ }, "errorAssigningTargetFolder": { "message": "Chyba při přiřazování cílové složky." + }, + "viewItemsIn": { + "message": "View items in $NAME$", + "description": "Button to view the contents of a folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "backTo": { + "message": "Back to $NAME$", + "description": "Navigate back to a previous folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "new": { + "message": "Nové" + }, + "removeItem": { + "message": "Remove $NAME$", + "description": "Remove a selected option, such as a folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } } } diff --git a/apps/browser/src/_locales/cy/messages.json b/apps/browser/src/_locales/cy/messages.json index d43cb2b25dc..664a2f83f02 100644 --- a/apps/browser/src/_locales/cy/messages.json +++ b/apps/browser/src/_locales/cy/messages.json @@ -166,15 +166,21 @@ "confirmIdentity": { "message": "Cadarnhewch eich hunaniaeth i barhau." }, - "account": { - "message": "Cyfrif" - }, "changeMasterPassword": { "message": "Newid y prif gyfrinair" }, "continueToWebApp": { "message": "Continue to web app?" }, + "continueToWebAppDesc": { + "message": "Explore more features of your Bitwarden account on the web app." + }, + "continueToHelpCenter": { + "message": "Continue to Help Center?" + }, + "continueToHelpCenterDesc": { + "message": "Learn more about how to use Bitwarden on the Help Center." + }, "changeMasterPasswordOnWebConfirmation": { "message": "You can change your master password on the Bitwarden web app." }, @@ -192,9 +198,45 @@ "logOut": { "message": "Allgofnodi" }, + "aboutBitwarden": { + "message": "About Bitwarden" + }, "about": { "message": "Ynghylch" }, + "moreFromBitwarden": { + "message": "More from Bitwarden" + }, + "continueToBitwardenDotCom": { + "message": "Continue to bitwarden.com?" + }, + "bitwardenForBusiness": { + "message": "Bitwarden for Business" + }, + "bitwardenAuthenticator": { + "message": "Bitwarden Authenticator" + }, + "continueToAuthenticatorPageDesc": { + "message": "Bitwarden Authenticator allows you to store authenticator keys and generate TOTP codes for 2-step verification flows. Learn more on the bitwarden.com website" + }, + "bitwardenSecretsManager": { + "message": "Bitwarden Secrets Manager" + }, + "continueToSecretsManagerPageDesc": { + "message": "Securely store, manage, and share developer secrets with Bitwarden Secrets Manager. Learn more on the bitwarden.com website." + }, + "passwordlessDotDev": { + "message": "Passwordless.dev" + }, + "continueToPasswordlessDotDevPageDesc": { + "message": "Create smooth and secure login experiences free from traditional passwords with Passwordless.dev. Learn more on the bitwarden.com website." + }, + "freeBitwardenFamilies": { + "message": "Free Bitwarden Families" + }, + "freeBitwardenFamiliesPageDesc": { + "message": "You are eligible for Free Bitwarden Families. Redeem this offer today in the web app." + }, "version": { "message": "Fersiwn" }, @@ -253,8 +295,8 @@ "passGenInfo": { "message": "Cynhyrchu cyfrineiriau cryf ac unigryw ar gyfer eich cyfrifon yn awtomatig." }, - "bitWebVault": { - "message": "Cell we Bitwarden" + "bitWebVaultApp": { + "message": "Bitwarden web app" }, "importItems": { "message": "Mewnforio eitemau" @@ -779,11 +821,8 @@ "shared": { "message": "Shared" }, - "learnOrg": { - "message": "Dysgu am sefydliadau" - }, - "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?" + "bitwardenForBusinessPageDesc": { + "message": "Bitwarden for Business allows you to share your vault items with others by using an organization. Learn more on the bitwarden.com website." }, "moveToOrganization": { "message": "Move to organization" @@ -1714,6 +1753,12 @@ "biometricsNotSupportedDesc": { "message": "Browser biometrics is not supported on this device." }, + "biometricsNotUnlockedTitle": { + "message": "User locked or logged out" + }, + "biometricsNotUnlockedDesc": { + "message": "Please unlock this user in the desktop application and try again." + }, "biometricsFailedTitle": { "message": "Biometrics failed" }, @@ -2177,6 +2222,108 @@ "forwardedEmailDesc": { "message": "Generate an email alias with an external forwarding service." }, + "forwarderError": { + "message": "$SERVICENAME$ error: $ERRORMESSAGE$", + "description": "Reports an error returned by a forwarding service to the user.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + }, + "errormessage": { + "content": "$2", + "example": "Invalid characters in domain name." + } + } + }, + "forwarderGeneratedBy": { + "message": "Generated by Bitwarden.", + "description": "Displayed with the address on the forwarding service's configuration screen." + }, + "forwarderGeneratedByWithWebsite": { + "message": "Website: $WEBSITE$. Generated by Bitwarden.", + "description": "Displayed with the address on the forwarding service's configuration screen.", + "placeholders": { + "WEBSITE": { + "content": "$1", + "example": "www.example.com" + } + } + }, + "forwaderInvalidToken": { + "message": "Invalid $SERVICENAME$ API token", + "description": "Displayed when the user's API token is empty or rejected by the forwarding service.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwaderInvalidTokenWithMessage": { + "message": "Invalid $SERVICENAME$ API token: $ERRORMESSAGE$", + "description": "Displayed when the user's API token is rejected by the forwarding service with an error message.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + }, + "errormessage": { + "content": "$2", + "example": "Please verify your email address to continue." + } + } + }, + "forwarderNoAccountId": { + "message": "Unable to obtain $SERVICENAME$ masked email account ID.", + "description": "Displayed when the forwarding service fails to return an account ID.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderNoDomain": { + "message": "Invalid $SERVICENAME$ domain.", + "description": "Displayed when the domain is empty or domain authorization failed at the forwarding service.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderNoUrl": { + "message": "Invalid $SERVICENAME$ url.", + "description": "Displayed when the url of the forwarding service wasn't supplied.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderUnknownError": { + "message": "Unknown $SERVICENAME$ error occurred.", + "description": "Displayed when the forwarding service failed due to an unknown error.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderUnknownForwarder": { + "message": "Unknown forwarder: '$SERVICENAME$'.", + "description": "Displayed when the forwarding service is not supported.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "JustTrust.us" + } + } + }, "hostname": { "message": "Hostname", "description": "Part of a URL." @@ -3029,6 +3176,41 @@ "message": "to make them visible.", "description": "This will be part of a larger sentence, which will read like so: Assign these items to a collection from the Admin Console to make them visible." }, + "autofillSuggestions": { + "message": "Auto-fill suggestions" + }, + "autofillSuggestionsTip": { + "message": "Save a login item for this site to auto-fill" + }, + "yourVaultIsEmpty": { + "message": "Your vault is empty" + }, + "noItemsMatchSearch": { + "message": "No items match your search" + }, + "clearFiltersOrTryAnother": { + "message": "Clear filters or try another search term" + }, + "copyInfo": { + "message": "Copy info, $ITEMNAME$", + "description": "Aria label for a button that opens a menu with options to copy information from an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "moreOptions": { + "message": "More options, $ITEMNAME$", + "description": "Aria label for a button that opens a menu with more options for an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, "adminConsole": { "message": "Admin Console" }, @@ -3046,5 +3228,38 @@ }, "errorAssigningTargetFolder": { "message": "Error assigning target folder." + }, + "viewItemsIn": { + "message": "View items in $NAME$", + "description": "Button to view the contents of a folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "backTo": { + "message": "Back to $NAME$", + "description": "Navigate back to a previous folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "new": { + "message": "New" + }, + "removeItem": { + "message": "Remove $NAME$", + "description": "Remove a selected option, such as a folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } } } diff --git a/apps/browser/src/_locales/da/messages.json b/apps/browser/src/_locales/da/messages.json index 57f87d7a8eb..fbee1390d24 100644 --- a/apps/browser/src/_locales/da/messages.json +++ b/apps/browser/src/_locales/da/messages.json @@ -166,15 +166,21 @@ "confirmIdentity": { "message": "Bekræft din identitet for at fortsætte." }, - "account": { - "message": "Konto" - }, "changeMasterPassword": { "message": "Skift hovedadgangskode" }, "continueToWebApp": { "message": "Fortsæt til web-app?" }, + "continueToWebAppDesc": { + "message": "Tjek flere funktioner ud i Bitwarden-kontoen på web-appen." + }, + "continueToHelpCenter": { + "message": "Fortsæt til Hjælpecenter?" + }, + "continueToHelpCenterDesc": { + "message": "Læs mere i Hjælpecenter om, hvordan man bruger Bitwarden." + }, "changeMasterPasswordOnWebConfirmation": { "message": "Hovedadgangskoden kan ændres via Bitwarden web-appen." }, @@ -192,9 +198,45 @@ "logOut": { "message": "Log ud" }, + "aboutBitwarden": { + "message": "Om Bitwarden" + }, "about": { "message": "Om" }, + "moreFromBitwarden": { + "message": "Mere fra Bitwarden" + }, + "continueToBitwardenDotCom": { + "message": "Fortsæt til bitwarden.com?" + }, + "bitwardenForBusiness": { + "message": "Bitwarden Business" + }, + "bitwardenAuthenticator": { + "message": "Bitwarden Authenticator" + }, + "continueToAuthenticatorPageDesc": { + "message": "Bitwarden Authenticator muliggør at gemme godkendelsesnøgler og generere TOTP-koder til 2-trinsbekræftelsesstrømme. Få mere at vide på bitwarden.com-webstedet" + }, + "bitwardenSecretsManager": { + "message": "Bitwarden Secrets Manager" + }, + "continueToSecretsManagerPageDesc": { + "message": "Gem, håndtér og del udviklerhemmeligheder på sikker vis med Bitwarden Secrets Manager. Få mere at vide på bitwarden.com-webstedet." + }, + "passwordlessDotDev": { + "message": "Passwordless.dev" + }, + "continueToPasswordlessDotDevPageDesc": { + "message": "Skab problemfrie og sikre loginoplevelser uden traditionelle adgangskoder med Passwordless.dev. Find ud af mere på bitwarden.com-webstedet." + }, + "freeBitwardenFamilies": { + "message": "Gratis Bitwarden Families" + }, + "freeBitwardenFamiliesPageDesc": { + "message": "Du er berettiget til Gratis Bitwarden Families. Indløs dette tilbud i dag i web-appen." + }, "version": { "message": "Version" }, @@ -253,8 +295,8 @@ "passGenInfo": { "message": "Opret automatisk stærke, unikke adgangskoder til dine logins." }, - "bitWebVault": { - "message": "Bitwarden web-boks" + "bitWebVaultApp": { + "message": "Bitwarden web-app" }, "importItems": { "message": "Importér elementer" @@ -779,11 +821,8 @@ "shared": { "message": "Delt" }, - "learnOrg": { - "message": "Få mere at vide om organisationer" - }, - "learnOrgConfirmation": { - "message": "Bitwarden giver dig mulighed for at dele elementer i din boks med andre ved hjælp af en organisation. Vil du besøge bitwarden.com-webstedet for at få mere at vide?" + "bitwardenForBusinessPageDesc": { + "message": "Bitwarden Business muliggør deling af emner i din Boks med andre vha. en organisation. Find ud af mere på bitwarden.com-webstedet." }, "moveToOrganization": { "message": "Flyt til organisation" @@ -1714,6 +1753,12 @@ "biometricsNotSupportedDesc": { "message": "Browserbiometri understøttes ikke på denne enhed." }, + "biometricsNotUnlockedTitle": { + "message": "Bruger låst eller logget ud" + }, + "biometricsNotUnlockedDesc": { + "message": "Oplås denne bruger op i computerprogrammet og forsøg igen." + }, "biometricsFailedTitle": { "message": "Biometri mislykkedes" }, @@ -2177,6 +2222,108 @@ "forwardedEmailDesc": { "message": "Generér et e-mail alias med en ekstern viderestillingstjeneste." }, + "forwarderError": { + "message": "$SERVICENAME$-fejl: $ERRORMESSAGE$", + "description": "Reports an error returned by a forwarding service to the user.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + }, + "errormessage": { + "content": "$2", + "example": "Invalid characters in domain name." + } + } + }, + "forwarderGeneratedBy": { + "message": "Genereret af Bitwarden.", + "description": "Displayed with the address on the forwarding service's configuration screen." + }, + "forwarderGeneratedByWithWebsite": { + "message": "Websted: $WEBSITE$. Genereret af Bitwarden.", + "description": "Displayed with the address on the forwarding service's configuration screen.", + "placeholders": { + "WEBSITE": { + "content": "$1", + "example": "www.example.com" + } + } + }, + "forwaderInvalidToken": { + "message": "Ugyldigt $SERVICENAME$ API-token", + "description": "Displayed when the user's API token is empty or rejected by the forwarding service.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwaderInvalidTokenWithMessage": { + "message": "Ugyldigt $SERVICENAME$ API-token: $ERRORMESSAGE$", + "description": "Displayed when the user's API token is rejected by the forwarding service with an error message.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + }, + "errormessage": { + "content": "$2", + "example": "Please verify your email address to continue." + } + } + }, + "forwarderNoAccountId": { + "message": "Kan ikke få $SERVICENAME$ maskeret e-mailkonto-ID.", + "description": "Displayed when the forwarding service fails to return an account ID.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderNoDomain": { + "message": "Ugyldigt $SERVICENAME$-domæne.", + "description": "Displayed when the domain is empty or domain authorization failed at the forwarding service.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderNoUrl": { + "message": "Ugyldig $SERVICENAME$-URL.", + "description": "Displayed when the url of the forwarding service wasn't supplied.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderUnknownError": { + "message": "Ukendt $SERVICENAME$-fejl opstod.", + "description": "Displayed when the forwarding service failed due to an unknown error.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderUnknownForwarder": { + "message": "Ukendt videresender: '$SERVICENAME$'.", + "description": "Displayed when the forwarding service is not supported.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "JustTrust.us" + } + } + }, "hostname": { "message": "Værtsnavn", "description": "Part of a URL." @@ -3029,6 +3176,41 @@ "message": "for at gøre dem synlige.", "description": "This will be part of a larger sentence, which will read like so: Assign these items to a collection from the Admin Console to make them visible." }, + "autofillSuggestions": { + "message": "Autoudfyldningsforslag" + }, + "autofillSuggestionsTip": { + "message": "Gem et loginemne for dette websted til autoudfyldning" + }, + "yourVaultIsEmpty": { + "message": "Boksen er tom" + }, + "noItemsMatchSearch": { + "message": "Ingen emner matcher søgningen" + }, + "clearFiltersOrTryAnother": { + "message": "Ryd filtre eller prøv med et andet søgeord" + }, + "copyInfo": { + "message": "Kopiér info, $ITEMNAME$", + "description": "Aria label for a button that opens a menu with options to copy information from an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "moreOptions": { + "message": "Flere valgmuligheder, $ITEMNAME$", + "description": "Aria label for a button that opens a menu with more options for an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, "adminConsole": { "message": "Admin-konsol" }, @@ -3046,5 +3228,38 @@ }, "errorAssigningTargetFolder": { "message": "Fejl ved tildeling af målmappe." + }, + "viewItemsIn": { + "message": "Vis emner i $NAME$", + "description": "Button to view the contents of a folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "backTo": { + "message": "Retur til $NAME$", + "description": "Navigate back to a previous folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "new": { + "message": "Ny/Nyt" + }, + "removeItem": { + "message": "Fjern $NAME$", + "description": "Remove a selected option, such as a folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } } } diff --git a/apps/browser/src/_locales/de/messages.json b/apps/browser/src/_locales/de/messages.json index 58e0f17053e..a204822e3b4 100644 --- a/apps/browser/src/_locales/de/messages.json +++ b/apps/browser/src/_locales/de/messages.json @@ -7,7 +7,7 @@ "description": "Extension name, MUST be less than 40 characters (Safari restriction)" }, "extDesc": { - "message": "Zu Hause, am Arbeitsplatz oder unterwegs schützt Bitwarden Passwörter, Passkeys und vertrauliche Informationen", + "message": "Bitwarden schützt alle deine Passwörter, Passkeys und vertrauliche Informationen - egal, wo du bist.", "description": "Extension description, MUST be less than 112 characters (Safari restriction)" }, "loginOrCreateNewAccount": { @@ -166,15 +166,21 @@ "confirmIdentity": { "message": "Bestätige deine Identität, um fortzufahren." }, - "account": { - "message": "Konto" - }, "changeMasterPassword": { "message": "Master-Passwort ändern" }, "continueToWebApp": { "message": "Weiter zur Web-App?" }, + "continueToWebAppDesc": { + "message": "Entdecke weitere Funktionen deines Bitwarden-Kontos in der Web-App." + }, + "continueToHelpCenter": { + "message": "Weiter zum Hilfezentrum?" + }, + "continueToHelpCenterDesc": { + "message": "Erfahre mehr über die Verwendung von Bitwarden im Hilfezentrum." + }, "changeMasterPasswordOnWebConfirmation": { "message": "Du kannst dein Master-Passwort in der Bitwarden Web-App ändern." }, @@ -192,9 +198,45 @@ "logOut": { "message": "Abmelden" }, + "aboutBitwarden": { + "message": "Über Bitwarden" + }, "about": { "message": "Über uns" }, + "moreFromBitwarden": { + "message": "Mehr von Bitwarden" + }, + "continueToBitwardenDotCom": { + "message": "Weiter zu bitwarden.com?" + }, + "bitwardenForBusiness": { + "message": "Bitwarden für Unternehmen" + }, + "bitwardenAuthenticator": { + "message": "Bitwarden Authenticator" + }, + "continueToAuthenticatorPageDesc": { + "message": "Mit dem Bitwarden Authenticator kannst du Authentifizierungsschlüssel speichern und TOTP-Codes für Zwei-Faktor-Verifizierungsprozesse generieren. Erfahre mehr auf der bitwarden.com Website" + }, + "bitwardenSecretsManager": { + "message": "Bitwarden Secrets Manager" + }, + "continueToSecretsManagerPageDesc": { + "message": "Speicher, verwalte und teile Entwicklergeheimnisse sicher mit dem Bitwarden Secrets Manager. Erfahre mehr auf der bitwarden.com Website." + }, + "passwordlessDotDev": { + "message": "Passwordless.dev" + }, + "continueToPasswordlessDotDevPageDesc": { + "message": "Erstelle reibungslose und sichere Anmeldeerfahrungen ohne herkömmliche Passwörter mit Passwordless.dev. Erfahre mehr auf der bitwarden.com Website." + }, + "freeBitwardenFamilies": { + "message": "Free Bitwarden Families" + }, + "freeBitwardenFamiliesPageDesc": { + "message": "Du bist für Free Bitwarden Families berechtigt. Löse dieses Angebot heute in der Web-App ein." + }, "version": { "message": "Version" }, @@ -253,8 +295,8 @@ "passGenInfo": { "message": "Generiert automatisch ein starkes und einzigartiges Passwort." }, - "bitWebVault": { - "message": "Bitwarden Web-Tresor" + "bitWebVaultApp": { + "message": "Bitwarden Web-App" }, "importItems": { "message": "Einträge importieren" @@ -779,11 +821,8 @@ "shared": { "message": "Geteilt" }, - "learnOrg": { - "message": "Erfahre mehr über Organisationen" - }, - "learnOrgConfirmation": { - "message": "Bitwarden erlaubt es dir deine Tresor Einträge mit anderen zu teilen, wenn du einen Organisations Account hast. Möchtest du bitwarden.com besuchen, um mehr zu erfahren?" + "bitwardenForBusinessPageDesc": { + "message": "Bitwarden für Unternehmen erlaubt es dir, deine Tresor-Einträge mit anderen zu teilen, indem du eine Organisation verwendest. Erfahre mehr auf der bitwarden.com Website." }, "moveToOrganization": { "message": "In Organisation verschieben" @@ -1714,6 +1753,12 @@ "biometricsNotSupportedDesc": { "message": "Biometrie im Browser wird auf diesem Gerät nicht unterstützt." }, + "biometricsNotUnlockedTitle": { + "message": "Nutzer gesperrt oder abgemeldet" + }, + "biometricsNotUnlockedDesc": { + "message": "Bitte entsperren Sie diesen Nutzer in der Desktop-Anwendung und versuchen Sie es erneut." + }, "biometricsFailedTitle": { "message": "Biometrie fehlgeschlagen" }, @@ -2177,6 +2222,108 @@ "forwardedEmailDesc": { "message": "Generiere ein E-Mail-Alias mit einem externen Weiterleitungsdienst." }, + "forwarderError": { + "message": "$SERVICENAME$ Fehler: $ERRORMESSAGE$", + "description": "Reports an error returned by a forwarding service to the user.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + }, + "errormessage": { + "content": "$2", + "example": "Invalid characters in domain name." + } + } + }, + "forwarderGeneratedBy": { + "message": "Von Bitwarden generiert.", + "description": "Displayed with the address on the forwarding service's configuration screen." + }, + "forwarderGeneratedByWithWebsite": { + "message": "Webseite: $WEBSITE$. Von Bitwarden generiert.", + "description": "Displayed with the address on the forwarding service's configuration screen.", + "placeholders": { + "WEBSITE": { + "content": "$1", + "example": "www.example.com" + } + } + }, + "forwaderInvalidToken": { + "message": "Ungültiger API-Token von $SERVICENAME$", + "description": "Displayed when the user's API token is empty or rejected by the forwarding service.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwaderInvalidTokenWithMessage": { + "message": "Ungültiger API-Token von $SERVICENAME$: $ERRORMESSAGE$", + "description": "Displayed when the user's API token is rejected by the forwarding service with an error message.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + }, + "errormessage": { + "content": "$2", + "example": "Please verify your email address to continue." + } + } + }, + "forwarderNoAccountId": { + "message": "Maskierte E-Mail-Konto-ID für $SERVICENAME$ konnte nicht abgerufen werden.", + "description": "Displayed when the forwarding service fails to return an account ID.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderNoDomain": { + "message": "Ungültige $SERVICENAME$-Domain.", + "description": "Displayed when the domain is empty or domain authorization failed at the forwarding service.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderNoUrl": { + "message": "Ungültige $SERVICENAME$-URL.", + "description": "Displayed when the url of the forwarding service wasn't supplied.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderUnknownError": { + "message": "Unbekannter $SERVICENAME$-Fehler aufgetreten.", + "description": "Displayed when the forwarding service failed due to an unknown error.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderUnknownForwarder": { + "message": "Unbekannter Weiterleitungsdienst: '$SERVICENAME$'.", + "description": "Displayed when the forwarding service is not supported.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "JustTrust.us" + } + } + }, "hostname": { "message": "Hostname", "description": "Part of a URL." @@ -3029,6 +3176,41 @@ "message": "zu, um sie sichtbar zu machen.", "description": "This will be part of a larger sentence, which will read like so: Assign these items to a collection from the Admin Console to make them visible." }, + "autofillSuggestions": { + "message": "Vorschläge zum Auto-Ausfüllen" + }, + "autofillSuggestionsTip": { + "message": "Speichere einen Login-Eintrag für diese Seite zum automatischen Ausfüllen" + }, + "yourVaultIsEmpty": { + "message": "Ihr Tresor hat keine Einträge" + }, + "noItemsMatchSearch": { + "message": "Deine Suche ergab keine Treffer" + }, + "clearFiltersOrTryAnother": { + "message": "Entferne die Filter oder versuche einen anderen Suchbegriff" + }, + "copyInfo": { + "message": "Information kopieren, $ITEMNAME$", + "description": "Aria label for a button that opens a menu with options to copy information from an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "moreOptions": { + "message": "Weitere Optionen, $ITEMNAME$", + "description": "Aria label for a button that opens a menu with more options for an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, "adminConsole": { "message": "Administrator-Konsole" }, @@ -3046,5 +3228,38 @@ }, "errorAssigningTargetFolder": { "message": "Fehler beim Zuweisen des Ziel-Ordners." + }, + "viewItemsIn": { + "message": "View items in $NAME$", + "description": "Button to view the contents of a folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "backTo": { + "message": "Back to $NAME$", + "description": "Navigate back to a previous folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "new": { + "message": "Neu" + }, + "removeItem": { + "message": "Remove $NAME$", + "description": "Remove a selected option, such as a folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } } } diff --git a/apps/browser/src/_locales/el/messages.json b/apps/browser/src/_locales/el/messages.json index 60659eeb657..4453114be1e 100644 --- a/apps/browser/src/_locales/el/messages.json +++ b/apps/browser/src/_locales/el/messages.json @@ -166,15 +166,21 @@ "confirmIdentity": { "message": "Επιβεβαιώστε την ταυτότητα σας για να συνεχίσετε." }, - "account": { - "message": "Λογαριασμός" - }, "changeMasterPassword": { "message": "Αλλαγή Κύριου Κωδικού" }, "continueToWebApp": { "message": "Continue to web app?" }, + "continueToWebAppDesc": { + "message": "Explore more features of your Bitwarden account on the web app." + }, + "continueToHelpCenter": { + "message": "Continue to Help Center?" + }, + "continueToHelpCenterDesc": { + "message": "Learn more about how to use Bitwarden on the Help Center." + }, "changeMasterPasswordOnWebConfirmation": { "message": "You can change your master password on the Bitwarden web app." }, @@ -192,9 +198,45 @@ "logOut": { "message": "Αποσύνδεση" }, + "aboutBitwarden": { + "message": "About Bitwarden" + }, "about": { "message": "Σχετικά" }, + "moreFromBitwarden": { + "message": "More from Bitwarden" + }, + "continueToBitwardenDotCom": { + "message": "Continue to bitwarden.com?" + }, + "bitwardenForBusiness": { + "message": "Bitwarden for Business" + }, + "bitwardenAuthenticator": { + "message": "Bitwarden Authenticator" + }, + "continueToAuthenticatorPageDesc": { + "message": "Bitwarden Authenticator allows you to store authenticator keys and generate TOTP codes for 2-step verification flows. Learn more on the bitwarden.com website" + }, + "bitwardenSecretsManager": { + "message": "Bitwarden Secrets Manager" + }, + "continueToSecretsManagerPageDesc": { + "message": "Securely store, manage, and share developer secrets with Bitwarden Secrets Manager. Learn more on the bitwarden.com website." + }, + "passwordlessDotDev": { + "message": "Passwordless.dev" + }, + "continueToPasswordlessDotDevPageDesc": { + "message": "Create smooth and secure login experiences free from traditional passwords with Passwordless.dev. Learn more on the bitwarden.com website." + }, + "freeBitwardenFamilies": { + "message": "Free Bitwarden Families" + }, + "freeBitwardenFamiliesPageDesc": { + "message": "You are eligible for Free Bitwarden Families. Redeem this offer today in the web app." + }, "version": { "message": "Έκδοση" }, @@ -253,8 +295,8 @@ "passGenInfo": { "message": "Δημιουργήστε αυτόματα ισχυρούς και μοναδικούς κωδικούς πρόσβασης για τις συνδέσεις σας." }, - "bitWebVault": { - "message": "Bitwarden Web Vault" + "bitWebVaultApp": { + "message": "Bitwarden web app" }, "importItems": { "message": "Εισαγωγή στοιχείων" @@ -779,11 +821,8 @@ "shared": { "message": "Κοινοποιήθηκε" }, - "learnOrg": { - "message": "Μάθετε για τους Οργανισμούς" - }, - "learnOrgConfirmation": { - "message": "Το Bitwarden επιτρέπει να μοιράζεστε τα στοιχεία του vault σας με άλλους χρησιμοποιώντας ένα λογαριασμό οργανισμού. Θέλετε να επισκεφθείτε την ιστοσελίδα bitwarden.com για να μάθετε περισσότερα;" + "bitwardenForBusinessPageDesc": { + "message": "Bitwarden for Business allows you to share your vault items with others by using an organization. Learn more on the bitwarden.com website." }, "moveToOrganization": { "message": "Μετακίνηση σε οργανισμό" @@ -1714,6 +1753,12 @@ "biometricsNotSupportedDesc": { "message": "Τα βιομετρικά στοιχεία του προγράμματος περιήγησης δεν υποστηρίζονται σε αυτήν τη συσκευή." }, + "biometricsNotUnlockedTitle": { + "message": "User locked or logged out" + }, + "biometricsNotUnlockedDesc": { + "message": "Please unlock this user in the desktop application and try again." + }, "biometricsFailedTitle": { "message": "Ο βιομετρικός έλεγχος απέτυχε" }, @@ -2177,6 +2222,108 @@ "forwardedEmailDesc": { "message": "Δημιουργήστε ένα alias email με μια εξωτερική υπηρεσία προώθησης." }, + "forwarderError": { + "message": "$SERVICENAME$ error: $ERRORMESSAGE$", + "description": "Reports an error returned by a forwarding service to the user.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + }, + "errormessage": { + "content": "$2", + "example": "Invalid characters in domain name." + } + } + }, + "forwarderGeneratedBy": { + "message": "Generated by Bitwarden.", + "description": "Displayed with the address on the forwarding service's configuration screen." + }, + "forwarderGeneratedByWithWebsite": { + "message": "Website: $WEBSITE$. Generated by Bitwarden.", + "description": "Displayed with the address on the forwarding service's configuration screen.", + "placeholders": { + "WEBSITE": { + "content": "$1", + "example": "www.example.com" + } + } + }, + "forwaderInvalidToken": { + "message": "Invalid $SERVICENAME$ API token", + "description": "Displayed when the user's API token is empty or rejected by the forwarding service.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwaderInvalidTokenWithMessage": { + "message": "Invalid $SERVICENAME$ API token: $ERRORMESSAGE$", + "description": "Displayed when the user's API token is rejected by the forwarding service with an error message.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + }, + "errormessage": { + "content": "$2", + "example": "Please verify your email address to continue." + } + } + }, + "forwarderNoAccountId": { + "message": "Unable to obtain $SERVICENAME$ masked email account ID.", + "description": "Displayed when the forwarding service fails to return an account ID.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderNoDomain": { + "message": "Invalid $SERVICENAME$ domain.", + "description": "Displayed when the domain is empty or domain authorization failed at the forwarding service.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderNoUrl": { + "message": "Invalid $SERVICENAME$ url.", + "description": "Displayed when the url of the forwarding service wasn't supplied.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderUnknownError": { + "message": "Unknown $SERVICENAME$ error occurred.", + "description": "Displayed when the forwarding service failed due to an unknown error.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderUnknownForwarder": { + "message": "Unknown forwarder: '$SERVICENAME$'.", + "description": "Displayed when the forwarding service is not supported.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "JustTrust.us" + } + } + }, "hostname": { "message": "Hostname", "description": "Part of a URL." @@ -3029,6 +3176,41 @@ "message": "to make them visible.", "description": "This will be part of a larger sentence, which will read like so: Assign these items to a collection from the Admin Console to make them visible." }, + "autofillSuggestions": { + "message": "Auto-fill suggestions" + }, + "autofillSuggestionsTip": { + "message": "Save a login item for this site to auto-fill" + }, + "yourVaultIsEmpty": { + "message": "Your vault is empty" + }, + "noItemsMatchSearch": { + "message": "No items match your search" + }, + "clearFiltersOrTryAnother": { + "message": "Clear filters or try another search term" + }, + "copyInfo": { + "message": "Copy info, $ITEMNAME$", + "description": "Aria label for a button that opens a menu with options to copy information from an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "moreOptions": { + "message": "More options, $ITEMNAME$", + "description": "Aria label for a button that opens a menu with more options for an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, "adminConsole": { "message": "Admin Console" }, @@ -3046,5 +3228,38 @@ }, "errorAssigningTargetFolder": { "message": "Error assigning target folder." + }, + "viewItemsIn": { + "message": "View items in $NAME$", + "description": "Button to view the contents of a folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "backTo": { + "message": "Back to $NAME$", + "description": "Navigate back to a previous folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "new": { + "message": "New" + }, + "removeItem": { + "message": "Remove $NAME$", + "description": "Remove a selected option, such as a folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } } } diff --git a/apps/browser/src/_locales/en/messages.json b/apps/browser/src/_locales/en/messages.json index 828cca3c855..bb672ea61d7 100644 --- a/apps/browser/src/_locales/en/messages.json +++ b/apps/browser/src/_locales/en/messages.json @@ -166,15 +166,27 @@ "confirmIdentity": { "message": "Confirm your identity to continue." }, - "account": { - "message": "Account" - }, "changeMasterPassword": { "message": "Change master password" }, "continueToWebApp": { "message": "Continue to web app?" }, + "continueToWebAppDesc": { + "message": "Explore more features of your Bitwarden account on the web app." + }, + "continueToHelpCenter": { + "message": "Continue to Help Center?" + }, + "continueToHelpCenterDesc": { + "message": "Learn more about how to use Bitwarden on the Help Center." + }, + "continueToBrowserExtensionStore": { + "message": "Continue to browser extension store?" + }, + "continueToBrowserExtensionStoreDesc": { + "message": "Help others find out if Bitwarden is right for them. Visit your browser's extension store and leave a rating now." + }, "changeMasterPasswordOnWebConfirmation": { "message": "You can change your master password on the Bitwarden web app." }, @@ -192,9 +204,45 @@ "logOut": { "message": "Log out" }, + "aboutBitwarden": { + "message": "About Bitwarden" + }, "about": { "message": "About" }, + "moreFromBitwarden": { + "message": "More from Bitwarden" + }, + "continueToBitwardenDotCom": { + "message": "Continue to bitwarden.com?" + }, + "bitwardenForBusiness": { + "message": "Bitwarden for Business" + }, + "bitwardenAuthenticator": { + "message": "Bitwarden Authenticator" + }, + "continueToAuthenticatorPageDesc": { + "message": "Bitwarden Authenticator allows you to store authenticator keys and generate TOTP codes for 2-step verification flows. Learn more on the bitwarden.com website" + }, + "bitwardenSecretsManager": { + "message": "Bitwarden Secrets Manager" + }, + "continueToSecretsManagerPageDesc": { + "message": "Securely store, manage, and share developer secrets with Bitwarden Secrets Manager. Learn more on the bitwarden.com website." + }, + "passwordlessDotDev": { + "message": "Passwordless.dev" + }, + "continueToPasswordlessDotDevPageDesc": { + "message": "Create smooth and secure login experiences free from traditional passwords with Passwordless.dev. Learn more on the bitwarden.com website." + }, + "freeBitwardenFamilies": { + "message": "Free Bitwarden Families" + }, + "freeBitwardenFamiliesPageDesc": { + "message": "You are eligible for Free Bitwarden Families. Redeem this offer today in the web app." + }, "version": { "message": "Version" }, @@ -253,8 +301,8 @@ "passGenInfo": { "message": "Automatically generate strong, unique passwords for your logins." }, - "bitWebVault": { - "message": "Bitwarden web vault" + "bitWebVaultApp": { + "message": "Bitwarden web app" }, "importItems": { "message": "Import items" @@ -779,11 +827,8 @@ "shared": { "message": "Shared" }, - "learnOrg": { - "message": "Learn about organizations" - }, - "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?" + "bitwardenForBusinessPageDesc": { + "message": "Bitwarden for Business allows you to share your vault items with others by using an organization. Learn more on the bitwarden.com website." }, "moveToOrganization": { "message": "Move to organization" @@ -1561,6 +1606,9 @@ "restoredItem": { "message": "Item restored" }, + "alreadyHaveAccount": { + "message": "Already have an account?" + }, "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?" }, @@ -1714,6 +1762,12 @@ "biometricsNotSupportedDesc": { "message": "Browser biometrics is not supported on this device." }, + "biometricsNotUnlockedTitle": { + "message": "User locked or logged out" + }, + "biometricsNotUnlockedDesc": { + "message": "Please unlock this user in the desktop application and try again." + }, "biometricsFailedTitle": { "message": "Biometrics failed" }, @@ -2490,6 +2544,27 @@ "ssoIdentifierRequired": { "message": "Organization SSO identifier is required." }, + "creatingAccountOn": { + "message": "Creating account on" + }, + "checkYourEmail": { + "message": "Check your email" + }, + "followTheLinkInTheEmailSentTo": { + "message": "Follow the link in the email sent to" + }, + "andContinueCreatingYourAccount": { + "message": "and continue creating your account." + }, + "noEmail": { + "message": "No email?" + }, + "goBack": { + "message": "Go back" + }, + "toEditYourEmailAddress": { + "message": "to edit your email address." + }, "eu": { "message": "EU", "description": "European Union" @@ -3131,6 +3206,41 @@ "message": "to make them visible.", "description": "This will be part of a larger sentence, which will read like so: Assign these items to a collection from the Admin Console to make them visible." }, + "autofillSuggestions": { + "message": "Auto-fill suggestions" + }, + "autofillSuggestionsTip": { + "message": "Save a login item for this site to auto-fill" + }, + "yourVaultIsEmpty": { + "message": "Your vault is empty" + }, + "noItemsMatchSearch": { + "message": "No items match your search" + }, + "clearFiltersOrTryAnother": { + "message": "Clear filters or try another search term" + }, + "copyInfo": { + "message": "Copy info, $ITEMNAME$", + "description": "Aria label for a button that opens a menu with options to copy information from an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "moreOptions": { + "message": "More options, $ITEMNAME$", + "description": "Aria label for a button that opens a menu with more options for an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, "adminConsole": { "message": "Admin Console" }, @@ -3148,5 +3258,38 @@ }, "errorAssigningTargetFolder": { "message": "Error assigning target folder." + }, + "viewItemsIn": { + "message": "View items in $NAME$", + "description": "Button to view the contents of a folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "backTo": { + "message": "Back to $NAME$", + "description": "Navigate back to a previous folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "new": { + "message": "New" + }, + "removeItem": { + "message": "Remove $NAME$", + "description": "Remove a selected option, such as a folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } } } diff --git a/apps/browser/src/_locales/en_GB/messages.json b/apps/browser/src/_locales/en_GB/messages.json index bbaf77b714c..06cf083567a 100644 --- a/apps/browser/src/_locales/en_GB/messages.json +++ b/apps/browser/src/_locales/en_GB/messages.json @@ -166,15 +166,21 @@ "confirmIdentity": { "message": "Confirm your identity to continue." }, - "account": { - "message": "Account" - }, "changeMasterPassword": { "message": "Change master password" }, "continueToWebApp": { "message": "Continue to web app?" }, + "continueToWebAppDesc": { + "message": "Explore more features of your Bitwarden account on the web app." + }, + "continueToHelpCenter": { + "message": "Continue to Help Centre?" + }, + "continueToHelpCenterDesc": { + "message": "Learn more about how to use Bitwarden on the Help Centre." + }, "changeMasterPasswordOnWebConfirmation": { "message": "You can change your master password on the Bitwarden web app." }, @@ -192,9 +198,45 @@ "logOut": { "message": "Log out" }, + "aboutBitwarden": { + "message": "About Bitwarden" + }, "about": { "message": "About" }, + "moreFromBitwarden": { + "message": "More from Bitwarden" + }, + "continueToBitwardenDotCom": { + "message": "Continue to bitwarden.com?" + }, + "bitwardenForBusiness": { + "message": "Bitwarden for Business" + }, + "bitwardenAuthenticator": { + "message": "Bitwarden Authenticator" + }, + "continueToAuthenticatorPageDesc": { + "message": "Bitwarden Authenticator allows you to store authenticator keys and generate TOTP codes for 2-step verification flows. Learn more on the bitwarden.com website" + }, + "bitwardenSecretsManager": { + "message": "Bitwarden Secrets Manager" + }, + "continueToSecretsManagerPageDesc": { + "message": "Securely store, manage, and share developer secrets with Bitwarden Secrets Manager. Learn more on the bitwarden.com website." + }, + "passwordlessDotDev": { + "message": "Passwordless.dev" + }, + "continueToPasswordlessDotDevPageDesc": { + "message": "Create smooth and secure login experiences free from traditional passwords with Passwordless.dev. Learn more on the bitwarden.com website." + }, + "freeBitwardenFamilies": { + "message": "Free Bitwarden Families" + }, + "freeBitwardenFamiliesPageDesc": { + "message": "You are eligible for Free Bitwarden Families. Redeem this offer today in the web app." + }, "version": { "message": "Version" }, @@ -253,8 +295,8 @@ "passGenInfo": { "message": "Automatically generate strong, unique passwords for your logins." }, - "bitWebVault": { - "message": "Bitwarden web vault" + "bitWebVaultApp": { + "message": "Bitwarden web app" }, "importItems": { "message": "Import items" @@ -779,11 +821,8 @@ "shared": { "message": "Shared" }, - "learnOrg": { - "message": "Learn about organisations" - }, - "learnOrgConfirmation": { - "message": "Bitwarden allows you to share your vault items with others by using an organisation. Would you like to visit the bitwarden.com website to learn more?" + "bitwardenForBusinessPageDesc": { + "message": "Bitwarden for Business allows you to share your vault items with others by using an organisation. Learn more on the bitwarden.com website." }, "moveToOrganization": { "message": "Move to organisation" @@ -1714,6 +1753,12 @@ "biometricsNotSupportedDesc": { "message": "Browser biometrics is not supported on this device." }, + "biometricsNotUnlockedTitle": { + "message": "User locked or logged out" + }, + "biometricsNotUnlockedDesc": { + "message": "Please unlock this user in the desktop application and try again." + }, "biometricsFailedTitle": { "message": "Biometrics failed" }, @@ -2177,6 +2222,108 @@ "forwardedEmailDesc": { "message": "Generate an email alias with an external forwarding service." }, + "forwarderError": { + "message": "$SERVICENAME$ error: $ERRORMESSAGE$", + "description": "Reports an error returned by a forwarding service to the user.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + }, + "errormessage": { + "content": "$2", + "example": "Invalid characters in domain name." + } + } + }, + "forwarderGeneratedBy": { + "message": "Generated by Bitwarden.", + "description": "Displayed with the address on the forwarding service's configuration screen." + }, + "forwarderGeneratedByWithWebsite": { + "message": "Website: $WEBSITE$. Generated by Bitwarden.", + "description": "Displayed with the address on the forwarding service's configuration screen.", + "placeholders": { + "WEBSITE": { + "content": "$1", + "example": "www.example.com" + } + } + }, + "forwaderInvalidToken": { + "message": "Invalid $SERVICENAME$ API token", + "description": "Displayed when the user's API token is empty or rejected by the forwarding service.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwaderInvalidTokenWithMessage": { + "message": "Invalid $SERVICENAME$ API token: $ERRORMESSAGE$", + "description": "Displayed when the user's API token is rejected by the forwarding service with an error message.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + }, + "errormessage": { + "content": "$2", + "example": "Please verify your email address to continue." + } + } + }, + "forwarderNoAccountId": { + "message": "Unable to obtain $SERVICENAME$ masked email account ID.", + "description": "Displayed when the forwarding service fails to return an account ID.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderNoDomain": { + "message": "Invalid $SERVICENAME$ domain.", + "description": "Displayed when the domain is empty or domain authorization failed at the forwarding service.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderNoUrl": { + "message": "Invalid $SERVICENAME$ url.", + "description": "Displayed when the url of the forwarding service wasn't supplied.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderUnknownError": { + "message": "Unknown $SERVICENAME$ error occurred.", + "description": "Displayed when the forwarding service failed due to an unknown error.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderUnknownForwarder": { + "message": "Unknown forwarder: '$SERVICENAME$'.", + "description": "Displayed when the forwarding service is not supported.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "JustTrust.us" + } + } + }, "hostname": { "message": "Hostname", "description": "Part of a URL." @@ -3029,6 +3176,41 @@ "message": "to make them visible.", "description": "This will be part of a larger sentence, which will read like so: Assign these items to a collection from the Admin Console to make them visible." }, + "autofillSuggestions": { + "message": "Auto-fill suggestions" + }, + "autofillSuggestionsTip": { + "message": "Save a login item for this site to auto-fill" + }, + "yourVaultIsEmpty": { + "message": "Your vault is empty" + }, + "noItemsMatchSearch": { + "message": "No items match your search" + }, + "clearFiltersOrTryAnother": { + "message": "Clear filters or try another search term" + }, + "copyInfo": { + "message": "Copy info, $ITEMNAME$", + "description": "Aria label for a button that opens a menu with options to copy information from an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "moreOptions": { + "message": "More options, $ITEMNAME$", + "description": "Aria label for a button that opens a menu with more options for an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, "adminConsole": { "message": "Admin Console" }, @@ -3046,5 +3228,38 @@ }, "errorAssigningTargetFolder": { "message": "Error assigning target folder." + }, + "viewItemsIn": { + "message": "View items in $NAME$", + "description": "Button to view the contents of a folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "backTo": { + "message": "Back to $NAME$", + "description": "Navigate back to a previous folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "new": { + "message": "New" + }, + "removeItem": { + "message": "Remove $NAME$", + "description": "Remove a selected option, such as a folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } } } diff --git a/apps/browser/src/_locales/en_IN/messages.json b/apps/browser/src/_locales/en_IN/messages.json index 9e154437ffc..be2b1b0055e 100644 --- a/apps/browser/src/_locales/en_IN/messages.json +++ b/apps/browser/src/_locales/en_IN/messages.json @@ -166,15 +166,21 @@ "confirmIdentity": { "message": "Confirm your identity to continue." }, - "account": { - "message": "Account" - }, "changeMasterPassword": { "message": "Change master password" }, "continueToWebApp": { "message": "Continue to web app?" }, + "continueToWebAppDesc": { + "message": "Explore more features of your Bitwarden account on the web app." + }, + "continueToHelpCenter": { + "message": "Continue to Help Center?" + }, + "continueToHelpCenterDesc": { + "message": "Learn more about how to use Bitwarden on the Help Center." + }, "changeMasterPasswordOnWebConfirmation": { "message": "You can change your master password on the Bitwarden web app." }, @@ -192,9 +198,45 @@ "logOut": { "message": "Log out" }, + "aboutBitwarden": { + "message": "About Bitwarden" + }, "about": { "message": "About" }, + "moreFromBitwarden": { + "message": "More from Bitwarden" + }, + "continueToBitwardenDotCom": { + "message": "Continue to bitwarden.com?" + }, + "bitwardenForBusiness": { + "message": "Bitwarden for Business" + }, + "bitwardenAuthenticator": { + "message": "Bitwarden Authenticator" + }, + "continueToAuthenticatorPageDesc": { + "message": "Bitwarden Authenticator allows you to store authenticator keys and generate TOTP codes for 2-step verification flows. Learn more on the bitwarden.com website" + }, + "bitwardenSecretsManager": { + "message": "Bitwarden Secrets Manager" + }, + "continueToSecretsManagerPageDesc": { + "message": "Securely store, manage, and share developer secrets with Bitwarden Secrets Manager. Learn more on the bitwarden.com website." + }, + "passwordlessDotDev": { + "message": "Passwordless.dev" + }, + "continueToPasswordlessDotDevPageDesc": { + "message": "Create smooth and secure login experiences free from traditional passwords with Passwordless.dev. Learn more on the bitwarden.com website." + }, + "freeBitwardenFamilies": { + "message": "Free Bitwarden Families" + }, + "freeBitwardenFamiliesPageDesc": { + "message": "You are eligible for Free Bitwarden Families. Redeem this offer today in the web app." + }, "version": { "message": "Version" }, @@ -253,8 +295,8 @@ "passGenInfo": { "message": "Automatically generate strong, unique passwords for your logins." }, - "bitWebVault": { - "message": "Bitwarden web vault" + "bitWebVaultApp": { + "message": "Bitwarden web app" }, "importItems": { "message": "Import items" @@ -779,11 +821,8 @@ "shared": { "message": "Shared" }, - "learnOrg": { - "message": "Learn about Organisations" - }, - "learnOrgConfirmation": { - "message": "Bitwarden allows you to share your vault items with others by using an organisation. Would you like to visit the bitwarden.com website to learn more?" + "bitwardenForBusinessPageDesc": { + "message": "Bitwarden for Business allows you to share your vault items with others by using an organization. Learn more on the bitwarden.com website." }, "moveToOrganization": { "message": "Move to organisation" @@ -1714,6 +1753,12 @@ "biometricsNotSupportedDesc": { "message": "Browser biometrics is not supported on this device." }, + "biometricsNotUnlockedTitle": { + "message": "User locked or logged out" + }, + "biometricsNotUnlockedDesc": { + "message": "Please unlock this user in the desktop application and try again." + }, "biometricsFailedTitle": { "message": "Biometrics failed" }, @@ -2177,6 +2222,108 @@ "forwardedEmailDesc": { "message": "Generate an email alias with an external forwarding service." }, + "forwarderError": { + "message": "$SERVICENAME$ error: $ERRORMESSAGE$", + "description": "Reports an error returned by a forwarding service to the user.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + }, + "errormessage": { + "content": "$2", + "example": "Invalid characters in domain name." + } + } + }, + "forwarderGeneratedBy": { + "message": "Generated by Bitwarden.", + "description": "Displayed with the address on the forwarding service's configuration screen." + }, + "forwarderGeneratedByWithWebsite": { + "message": "Website: $WEBSITE$. Generated by Bitwarden.", + "description": "Displayed with the address on the forwarding service's configuration screen.", + "placeholders": { + "WEBSITE": { + "content": "$1", + "example": "www.example.com" + } + } + }, + "forwaderInvalidToken": { + "message": "Invalid $SERVICENAME$ API token", + "description": "Displayed when the user's API token is empty or rejected by the forwarding service.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwaderInvalidTokenWithMessage": { + "message": "Invalid $SERVICENAME$ API token: $ERRORMESSAGE$", + "description": "Displayed when the user's API token is rejected by the forwarding service with an error message.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + }, + "errormessage": { + "content": "$2", + "example": "Please verify your email address to continue." + } + } + }, + "forwarderNoAccountId": { + "message": "Unable to obtain $SERVICENAME$ masked email account ID.", + "description": "Displayed when the forwarding service fails to return an account ID.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderNoDomain": { + "message": "Invalid $SERVICENAME$ domain.", + "description": "Displayed when the domain is empty or domain authorization failed at the forwarding service.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderNoUrl": { + "message": "Invalid $SERVICENAME$ url.", + "description": "Displayed when the url of the forwarding service wasn't supplied.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderUnknownError": { + "message": "Unknown $SERVICENAME$ error occurred.", + "description": "Displayed when the forwarding service failed due to an unknown error.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderUnknownForwarder": { + "message": "Unknown forwarder: '$SERVICENAME$'.", + "description": "Displayed when the forwarding service is not supported.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "JustTrust.us" + } + } + }, "hostname": { "message": "Hostname", "description": "Part of a URL." @@ -3029,6 +3176,41 @@ "message": "to make them visible.", "description": "This will be part of a larger sentence, which will read like so: Assign these items to a collection from the Admin Console to make them visible." }, + "autofillSuggestions": { + "message": "Auto-fill suggestions" + }, + "autofillSuggestionsTip": { + "message": "Save a login item for this site to auto-fill" + }, + "yourVaultIsEmpty": { + "message": "Your vault is empty" + }, + "noItemsMatchSearch": { + "message": "No items match your search" + }, + "clearFiltersOrTryAnother": { + "message": "Clear filters or try another search term" + }, + "copyInfo": { + "message": "Copy info, $ITEMNAME$", + "description": "Aria label for a button that opens a menu with options to copy information from an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "moreOptions": { + "message": "More options, $ITEMNAME$", + "description": "Aria label for a button that opens a menu with more options for an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, "adminConsole": { "message": "Admin Console" }, @@ -3046,5 +3228,38 @@ }, "errorAssigningTargetFolder": { "message": "Error assigning target folder." + }, + "viewItemsIn": { + "message": "View items in $NAME$", + "description": "Button to view the contents of a folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "backTo": { + "message": "Back to $NAME$", + "description": "Navigate back to a previous folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "new": { + "message": "New" + }, + "removeItem": { + "message": "Remove $NAME$", + "description": "Remove a selected option, such as a folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } } } diff --git a/apps/browser/src/_locales/es/messages.json b/apps/browser/src/_locales/es/messages.json index d460a54ac88..fdbbe165465 100644 --- a/apps/browser/src/_locales/es/messages.json +++ b/apps/browser/src/_locales/es/messages.json @@ -125,7 +125,7 @@ "message": "Agregar identidad" }, "unlockVaultMenu": { - "message": "Desbloquea la caja fuerte" + "message": "Desbloquea tu caja fuerte" }, "loginToVaultMenu": { "message": "Inicia sesión en tu caja fuerte" @@ -166,15 +166,21 @@ "confirmIdentity": { "message": "Confirme su identidad para continuar." }, - "account": { - "message": "Cuenta" - }, "changeMasterPassword": { "message": "Cambiar contraseña maestra" }, "continueToWebApp": { "message": "¿Continuar a la aplicación web?" }, + "continueToWebAppDesc": { + "message": "Explora más funcionalidades de tu cuenta de Bitwarden en la aplicación web." + }, + "continueToHelpCenter": { + "message": "¿Continuar al Centro de Ayuda?" + }, + "continueToHelpCenterDesc": { + "message": "Obtén más sobre cómo utilizar Bitwarden en el Centro de Ayuda." + }, "changeMasterPasswordOnWebConfirmation": { "message": "Puedes cambiar la contraseña maestra en la aplicación web de Bitwarden." }, @@ -192,9 +198,45 @@ "logOut": { "message": "Cerrar sesión" }, + "aboutBitwarden": { + "message": "Acerca de Bitwarden" + }, "about": { "message": "Acerca de" }, + "moreFromBitwarden": { + "message": "Más de Bitwarden" + }, + "continueToBitwardenDotCom": { + "message": "¿Continuar a bitwarden.com?" + }, + "bitwardenForBusiness": { + "message": "Bitwarden para Empresas" + }, + "bitwardenAuthenticator": { + "message": "Bitwarden Authenticator" + }, + "continueToAuthenticatorPageDesc": { + "message": "Bitwarden Authenticator te permite almacenar claves de autenticación y generar códigos TOTP para flujos de verificación de 2 pasos. Más información en el sitio web de bitwarden.com" + }, + "bitwardenSecretsManager": { + "message": "Bitwarden Secrets Manager" + }, + "continueToSecretsManagerPageDesc": { + "message": "Almacena, administra y comparte de forma segura secretos de desarrollador con Bitwarden Secrets Manager. Obtén más información en el sitio web de bitwarden.com." + }, + "passwordlessDotDev": { + "message": "Passwordless.dev" + }, + "continueToPasswordlessDotDevPageDesc": { + "message": "Crea experiencias de inicio de sesión fluidas y seguras, libres de contraseñas tradicionales, con Passwordless.dev. Obtén más información en el sitio web de bitwarden.com." + }, + "freeBitwardenFamilies": { + "message": "Bitwarden Familias gratis" + }, + "freeBitwardenFamiliesPageDesc": { + "message": "Eres elegible para Bitwarden Familias Gratis. Canjea esta oferta hoy mismo en la aplicación web." + }, "version": { "message": "Versión" }, @@ -229,7 +271,7 @@ "message": "Centro de ayuda de Bitwarden" }, "communityForums": { - "message": "Explorar los foros de la comunidad Bitwarden" + "message": "Explora los foros de la comunidad Bitwarden" }, "contactSupport": { "message": "Contactar al soporte de Bitwarden" @@ -253,8 +295,8 @@ "passGenInfo": { "message": "Genera automáticamente contraseñas fuertes y únicas para tus accesos." }, - "bitWebVault": { - "message": "Caja fuerte web de Bitwarden" + "bitWebVaultApp": { + "message": "Aplicación web de Bitwarden" }, "importItems": { "message": "Importar elementos" @@ -384,7 +426,7 @@ "message": "Configure un método de desbloqueo en Configuración" }, "sessionTimeoutHeader": { - "message": "Session timeout" + "message": "Tiempo de sesión agotado" }, "otherOptions": { "message": "Otras opciones" @@ -685,7 +727,7 @@ "message": "¿Debería Bitwarden recordar esta contraseña por ti?" }, "notificationAddSave": { - "message": "Sí, guardar ahora" + "message": "Guardar" }, "enableChangedPasswordNotification": { "message": "Solicitar la actualización de los datos de inicio de sesión existentes" @@ -700,7 +742,7 @@ "message": "Solicitar guardar y usar claves de acceso" }, "usePasskeysDesc": { - "message": "Solicitar guardar claves de paso nuevas o acceder con claves de paso almacenadas en su caja fuerte. Se aplica a todas las cuentas accedidas." + "message": "Solicita guardar nuevas claves de acceso o inicia sesión con claves de acceso almacenadas en tu caja fuerte. Se aplica a todas las cuentas que hayan iniciado sesión." }, "notificationChangeDesc": { "message": "¿Desea actualizar esta contraseña en Bitwarden?" @@ -709,7 +751,7 @@ "message": "Actualizar" }, "notificationUnlockDesc": { - "message": "Desbloquea tu bóveda Bitwarden para completar la solicitud de autollenado." + "message": "Desbloquea tu caja fuerte de Bitwarden para completar la solicitud de autocompletado." }, "notificationUnlock": { "message": "Desbloquear" @@ -779,11 +821,8 @@ "shared": { "message": "Compartido" }, - "learnOrg": { - "message": "Aprende sobre Organizaciones" - }, - "learnOrgConfirmation": { - "message": "Bitwarden te permite compartir objetos de tu caja fuerte con otros usando una organización. ¿Quieres visitar el sitio web de bitwarden.com para saber más?" + "bitwardenForBusinessPageDesc": { + "message": "Bitwarden para Empresas te permite compartir los elementos de tu caja fuerte con otras personas mediante una organización. Obtén más información en el sitio web de bitwarden.com." }, "moveToOrganization": { "message": "Mover a la Organización" @@ -1714,6 +1753,12 @@ "biometricsNotSupportedDesc": { "message": "La biometría del navegador no es compatible con este dispositivo." }, + "biometricsNotUnlockedTitle": { + "message": "Usuario bloqueado o desconectado" + }, + "biometricsNotUnlockedDesc": { + "message": "Por favor, desbloquea a este usuario en la aplicación de escritorio e inténtalo de nuevo." + }, "biometricsFailedTitle": { "message": "Fallo de biométrica" }, @@ -2177,6 +2222,108 @@ "forwardedEmailDesc": { "message": "Genera un alias de correo electrónico con un servicio de reenvío externo." }, + "forwarderError": { + "message": "$SERVICENAME$ error: $ERRORMESSAGE$", + "description": "Reports an error returned by a forwarding service to the user.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + }, + "errormessage": { + "content": "$2", + "example": "Invalid characters in domain name." + } + } + }, + "forwarderGeneratedBy": { + "message": "Generado por Bitwarden.", + "description": "Displayed with the address on the forwarding service's configuration screen." + }, + "forwarderGeneratedByWithWebsite": { + "message": "Sitio web: $WEBSITE$. Generado por Bitwarden.", + "description": "Displayed with the address on the forwarding service's configuration screen.", + "placeholders": { + "WEBSITE": { + "content": "$1", + "example": "www.example.com" + } + } + }, + "forwaderInvalidToken": { + "message": "Token de API $SERVICENAME$ no válido", + "description": "Displayed when the user's API token is empty or rejected by the forwarding service.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwaderInvalidTokenWithMessage": { + "message": "Token de API $SERVICENAME$ no válido: $ERRORMESSAGE$", + "description": "Displayed when the user's API token is rejected by the forwarding service with an error message.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + }, + "errormessage": { + "content": "$2", + "example": "Please verify your email address to continue." + } + } + }, + "forwarderNoAccountId": { + "message": "No se puede obtener el ID de la cuenta de correo electrónico enmascarado de $SERVICENAME$.", + "description": "Displayed when the forwarding service fails to return an account ID.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderNoDomain": { + "message": "Dominio $SERVICENAME$ no válido.", + "description": "Displayed when the domain is empty or domain authorization failed at the forwarding service.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderNoUrl": { + "message": "URL $SERVICENAME$ no válida.", + "description": "Displayed when the url of the forwarding service wasn't supplied.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderUnknownError": { + "message": "Se ha producido un error $SERVICENAME$ desconocido.", + "description": "Displayed when the forwarding service failed due to an unknown error.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderUnknownForwarder": { + "message": "Redirigidor desconocido: '$SERVICENAME$'.", + "description": "Displayed when the forwarding service is not supported.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "JustTrust.us" + } + } + }, "hostname": { "message": "Nombre del servidor", "description": "Part of a URL." @@ -2804,13 +2951,13 @@ "message": "Verificación requerida por el sitio inicial. Esta característica aún no está implementada para cuentas sin contraseña maestra." }, "logInWithPasskey": { - "message": "¿Iniciar sesión con contraseña?" + "message": "¿Iniciar sesión con clave de acceso?" }, "passkeyAlreadyExists": { "message": "Ya existe una clave de acceso para esta aplicación." }, "noPasskeysFoundForThisApplication": { - "message": "No se encontraron contraseñas para esta aplicación." + "message": "No se encontraron claves de acceso para esta aplicación." }, "noMatchingPasskeyLogin": { "message": "No tiene un inicio de sesión que coincida para este sitio." @@ -2819,10 +2966,10 @@ "message": "Confirmar" }, "savePasskey": { - "message": "Guardar clave" + "message": "Guardar clave de acceso" }, "savePasskeyNewLogin": { - "message": "Guardar contraseña como nuevo inicio de sesión" + "message": "Guardar clave de acceso como nuevo inicio de sesión" }, "choosePasskey": { "message": "Elija un inicio de sesión para guardar esta clave de acceso" @@ -2831,7 +2978,7 @@ "message": "Elemento de clave de acceso" }, "overwritePasskey": { - "message": "¿Sobrescribir contraseña?" + "message": "¿Sobrescribir clave de acceso?" }, "overwritePasskeyAlert": { "message": "Este elemento ya contiene una clave de acceso. ¿Está seguro de que desea sobrescribir la contraseña actual?" @@ -3010,16 +3157,16 @@ "message": "Éxito" }, "removePasskey": { - "message": "Eliminar passkey" + "message": "Eliminar clave de acceso" }, "passkeyRemoved": { - "message": "Passkey eliminada" + "message": "Clave de acceso eliminada" }, "unassignedItemsBannerNotice": { - "message": "Notice: Unassigned organization items are no longer visible in the All Vaults view and only accessible via the Admin Console." + "message": "Aviso: Los elementos de organización no asignados ya no son visibles en la vista de Todas las cajas fuertes y solo son accesibles a través de la Consola de Administrador." }, "unassignedItemsBannerSelfHostNotice": { - "message": "Notice: On May 16, 2024, unassigned organization items will no longer be visible in the All Vaults view and will only be accessible via the Admin Console." + "message": "Aviso: El 16 de mayo de 2024, los elementos de organización no asignados no serán visibles en la vista de Todas las cajas fuertes y solo serán accesibles a través de la Consola de Administrador." }, "unassignedItemsBannerCTAPartOne": { "message": "Asignar estos elementos a una colección de", @@ -3029,6 +3176,41 @@ "message": "para hcerlos visibles.", "description": "This will be part of a larger sentence, which will read like so: Assign these items to a collection from the Admin Console to make them visible." }, + "autofillSuggestions": { + "message": "Autocompletar sugerencias" + }, + "autofillSuggestionsTip": { + "message": "Guarda un elemento de inicio de sesión para este sitio para autocompletar" + }, + "yourVaultIsEmpty": { + "message": "Tu caja fuerte está vacía" + }, + "noItemsMatchSearch": { + "message": "No hay elementos que coincidan con tu búsqueda" + }, + "clearFiltersOrTryAnother": { + "message": "Limpia los filtros o prueba otro término de búsqueda" + }, + "copyInfo": { + "message": "Copiar información, $ITEMNAME$", + "description": "Aria label for a button that opens a menu with options to copy information from an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "moreOptions": { + "message": "Más información, $ITEMNAME$", + "description": "Aria label for a button that opens a menu with more options for an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, "adminConsole": { "message": "Consola de administrador" }, @@ -3046,5 +3228,38 @@ }, "errorAssigningTargetFolder": { "message": "Error al asignar la carpeta de destino." + }, + "viewItemsIn": { + "message": "View items in $NAME$", + "description": "Button to view the contents of a folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "backTo": { + "message": "Back to $NAME$", + "description": "Navigate back to a previous folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "new": { + "message": "Nuevo" + }, + "removeItem": { + "message": "Remove $NAME$", + "description": "Remove a selected option, such as a folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } } } diff --git a/apps/browser/src/_locales/et/messages.json b/apps/browser/src/_locales/et/messages.json index 40b127f0591..0d38859fead 100644 --- a/apps/browser/src/_locales/et/messages.json +++ b/apps/browser/src/_locales/et/messages.json @@ -166,15 +166,21 @@ "confirmIdentity": { "message": "Jätkamiseks kinnita oma identiteet." }, - "account": { - "message": "Konto" - }, "changeMasterPassword": { "message": "Muuda ülemparooli" }, "continueToWebApp": { "message": "Continue to web app?" }, + "continueToWebAppDesc": { + "message": "Explore more features of your Bitwarden account on the web app." + }, + "continueToHelpCenter": { + "message": "Continue to Help Center?" + }, + "continueToHelpCenterDesc": { + "message": "Learn more about how to use Bitwarden on the Help Center." + }, "changeMasterPasswordOnWebConfirmation": { "message": "You can change your master password on the Bitwarden web app." }, @@ -192,9 +198,45 @@ "logOut": { "message": "Logi välja" }, + "aboutBitwarden": { + "message": "About Bitwarden" + }, "about": { "message": "Rakenduse info" }, + "moreFromBitwarden": { + "message": "More from Bitwarden" + }, + "continueToBitwardenDotCom": { + "message": "Continue to bitwarden.com?" + }, + "bitwardenForBusiness": { + "message": "Bitwarden for Business" + }, + "bitwardenAuthenticator": { + "message": "Bitwarden Authenticator" + }, + "continueToAuthenticatorPageDesc": { + "message": "Bitwarden Authenticator allows you to store authenticator keys and generate TOTP codes for 2-step verification flows. Learn more on the bitwarden.com website" + }, + "bitwardenSecretsManager": { + "message": "Bitwarden Secrets Manager" + }, + "continueToSecretsManagerPageDesc": { + "message": "Securely store, manage, and share developer secrets with Bitwarden Secrets Manager. Learn more on the bitwarden.com website." + }, + "passwordlessDotDev": { + "message": "Passwordless.dev" + }, + "continueToPasswordlessDotDevPageDesc": { + "message": "Create smooth and secure login experiences free from traditional passwords with Passwordless.dev. Learn more on the bitwarden.com website." + }, + "freeBitwardenFamilies": { + "message": "Free Bitwarden Families" + }, + "freeBitwardenFamiliesPageDesc": { + "message": "You are eligible for Free Bitwarden Families. Redeem this offer today in the web app." + }, "version": { "message": "Versioon" }, @@ -253,8 +295,8 @@ "passGenInfo": { "message": "Loo oma kontodele tugevaid ja unikaalseid paroole." }, - "bitWebVault": { - "message": "Bitwardeni Veebihoidla" + "bitWebVaultApp": { + "message": "Bitwarden web app" }, "importItems": { "message": "Impordi andmed" @@ -779,11 +821,8 @@ "shared": { "message": "Jagatud" }, - "learnOrg": { - "message": "Info organisatsioonide kohta" - }, - "learnOrgConfirmation": { - "message": "Bitwarden võimaldab sul hoidla sisu teiste kasutajatega jagada, kasutades selleks organisatsiooni kontot. Soovid külastada lehekülge bitwarden.com ja selle kohta rohkem lugeda?" + "bitwardenForBusinessPageDesc": { + "message": "Bitwarden for Business allows you to share your vault items with others by using an organization. Learn more on the bitwarden.com website." }, "moveToOrganization": { "message": "Teisalda organisatsiooni" @@ -1714,6 +1753,12 @@ "biometricsNotSupportedDesc": { "message": "Brauseri biomeetria ei ole selles seadmes toetatud" }, + "biometricsNotUnlockedTitle": { + "message": "User locked or logged out" + }, + "biometricsNotUnlockedDesc": { + "message": "Please unlock this user in the desktop application and try again." + }, "biometricsFailedTitle": { "message": "Biomeetria nurjus" }, @@ -2177,6 +2222,108 @@ "forwardedEmailDesc": { "message": "Genereeri e-posti alias, kasutades selleks välist teenuspakkujat." }, + "forwarderError": { + "message": "$SERVICENAME$ error: $ERRORMESSAGE$", + "description": "Reports an error returned by a forwarding service to the user.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + }, + "errormessage": { + "content": "$2", + "example": "Invalid characters in domain name." + } + } + }, + "forwarderGeneratedBy": { + "message": "Generated by Bitwarden.", + "description": "Displayed with the address on the forwarding service's configuration screen." + }, + "forwarderGeneratedByWithWebsite": { + "message": "Website: $WEBSITE$. Generated by Bitwarden.", + "description": "Displayed with the address on the forwarding service's configuration screen.", + "placeholders": { + "WEBSITE": { + "content": "$1", + "example": "www.example.com" + } + } + }, + "forwaderInvalidToken": { + "message": "Invalid $SERVICENAME$ API token", + "description": "Displayed when the user's API token is empty or rejected by the forwarding service.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwaderInvalidTokenWithMessage": { + "message": "Invalid $SERVICENAME$ API token: $ERRORMESSAGE$", + "description": "Displayed when the user's API token is rejected by the forwarding service with an error message.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + }, + "errormessage": { + "content": "$2", + "example": "Please verify your email address to continue." + } + } + }, + "forwarderNoAccountId": { + "message": "Unable to obtain $SERVICENAME$ masked email account ID.", + "description": "Displayed when the forwarding service fails to return an account ID.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderNoDomain": { + "message": "Invalid $SERVICENAME$ domain.", + "description": "Displayed when the domain is empty or domain authorization failed at the forwarding service.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderNoUrl": { + "message": "Invalid $SERVICENAME$ url.", + "description": "Displayed when the url of the forwarding service wasn't supplied.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderUnknownError": { + "message": "Unknown $SERVICENAME$ error occurred.", + "description": "Displayed when the forwarding service failed due to an unknown error.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderUnknownForwarder": { + "message": "Unknown forwarder: '$SERVICENAME$'.", + "description": "Displayed when the forwarding service is not supported.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "JustTrust.us" + } + } + }, "hostname": { "message": "Hosti nimi", "description": "Part of a URL." @@ -3029,6 +3176,41 @@ "message": "to make them visible.", "description": "This will be part of a larger sentence, which will read like so: Assign these items to a collection from the Admin Console to make them visible." }, + "autofillSuggestions": { + "message": "Auto-fill suggestions" + }, + "autofillSuggestionsTip": { + "message": "Save a login item for this site to auto-fill" + }, + "yourVaultIsEmpty": { + "message": "Your vault is empty" + }, + "noItemsMatchSearch": { + "message": "No items match your search" + }, + "clearFiltersOrTryAnother": { + "message": "Clear filters or try another search term" + }, + "copyInfo": { + "message": "Copy info, $ITEMNAME$", + "description": "Aria label for a button that opens a menu with options to copy information from an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "moreOptions": { + "message": "More options, $ITEMNAME$", + "description": "Aria label for a button that opens a menu with more options for an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, "adminConsole": { "message": "Admin Console" }, @@ -3046,5 +3228,38 @@ }, "errorAssigningTargetFolder": { "message": "Error assigning target folder." + }, + "viewItemsIn": { + "message": "View items in $NAME$", + "description": "Button to view the contents of a folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "backTo": { + "message": "Back to $NAME$", + "description": "Navigate back to a previous folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "new": { + "message": "New" + }, + "removeItem": { + "message": "Remove $NAME$", + "description": "Remove a selected option, such as a folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } } } diff --git a/apps/browser/src/_locales/eu/messages.json b/apps/browser/src/_locales/eu/messages.json index 0d4790b2711..03703412b86 100644 --- a/apps/browser/src/_locales/eu/messages.json +++ b/apps/browser/src/_locales/eu/messages.json @@ -166,15 +166,21 @@ "confirmIdentity": { "message": "Jarraitzeko, berretsi zure identitatea." }, - "account": { - "message": "Kontua" - }, "changeMasterPassword": { "message": "Aldatu pasahitz nagusia" }, "continueToWebApp": { "message": "Continue to web app?" }, + "continueToWebAppDesc": { + "message": "Explore more features of your Bitwarden account on the web app." + }, + "continueToHelpCenter": { + "message": "Continue to Help Center?" + }, + "continueToHelpCenterDesc": { + "message": "Learn more about how to use Bitwarden on the Help Center." + }, "changeMasterPasswordOnWebConfirmation": { "message": "You can change your master password on the Bitwarden web app." }, @@ -192,9 +198,45 @@ "logOut": { "message": "Itxi saioa" }, + "aboutBitwarden": { + "message": "About Bitwarden" + }, "about": { "message": "Honi buruz" }, + "moreFromBitwarden": { + "message": "More from Bitwarden" + }, + "continueToBitwardenDotCom": { + "message": "Continue to bitwarden.com?" + }, + "bitwardenForBusiness": { + "message": "Bitwarden for Business" + }, + "bitwardenAuthenticator": { + "message": "Bitwarden Authenticator" + }, + "continueToAuthenticatorPageDesc": { + "message": "Bitwarden Authenticator allows you to store authenticator keys and generate TOTP codes for 2-step verification flows. Learn more on the bitwarden.com website" + }, + "bitwardenSecretsManager": { + "message": "Bitwarden Secrets Manager" + }, + "continueToSecretsManagerPageDesc": { + "message": "Securely store, manage, and share developer secrets with Bitwarden Secrets Manager. Learn more on the bitwarden.com website." + }, + "passwordlessDotDev": { + "message": "Passwordless.dev" + }, + "continueToPasswordlessDotDevPageDesc": { + "message": "Create smooth and secure login experiences free from traditional passwords with Passwordless.dev. Learn more on the bitwarden.com website." + }, + "freeBitwardenFamilies": { + "message": "Free Bitwarden Families" + }, + "freeBitwardenFamiliesPageDesc": { + "message": "You are eligible for Free Bitwarden Families. Redeem this offer today in the web app." + }, "version": { "message": "\nBertsioa" }, @@ -253,8 +295,8 @@ "passGenInfo": { "message": "Automatikoki pasahitz sendo eta bakarrak sortzen ditu zure saio-hasieratarako." }, - "bitWebVault": { - "message": "Bitwarden kutxa gotorra" + "bitWebVaultApp": { + "message": "Bitwarden web app" }, "importItems": { "message": "Inportatu elementuak" @@ -779,11 +821,8 @@ "shared": { "message": "Partekatua" }, - "learnOrg": { - "message": "Erakundeak ezagutu" - }, - "learnOrgConfirmation": { - "message": "Bitwardek kutxa gotorreko elementuak beste batzuekin partekatzeko aukera ematen dizu erakunde bat erabiliz. Gehiago jakiteko, bitwarden.com webgunea bisitatu nahi duzu?" + "bitwardenForBusinessPageDesc": { + "message": "Bitwarden for Business allows you to share your vault items with others by using an organization. Learn more on the bitwarden.com website." }, "moveToOrganization": { "message": "Mugitu erakundera" @@ -1714,6 +1753,12 @@ "biometricsNotSupportedDesc": { "message": "Nabigatzailearen biometria ezin da gailu honetan erabili." }, + "biometricsNotUnlockedTitle": { + "message": "User locked or logged out" + }, + "biometricsNotUnlockedDesc": { + "message": "Please unlock this user in the desktop application and try again." + }, "biometricsFailedTitle": { "message": "Biometrics failed" }, @@ -2177,6 +2222,108 @@ "forwardedEmailDesc": { "message": "Emaileko ezizen bat sortu kanpoko bidalketa zerbitzu batekin." }, + "forwarderError": { + "message": "$SERVICENAME$ error: $ERRORMESSAGE$", + "description": "Reports an error returned by a forwarding service to the user.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + }, + "errormessage": { + "content": "$2", + "example": "Invalid characters in domain name." + } + } + }, + "forwarderGeneratedBy": { + "message": "Generated by Bitwarden.", + "description": "Displayed with the address on the forwarding service's configuration screen." + }, + "forwarderGeneratedByWithWebsite": { + "message": "Website: $WEBSITE$. Generated by Bitwarden.", + "description": "Displayed with the address on the forwarding service's configuration screen.", + "placeholders": { + "WEBSITE": { + "content": "$1", + "example": "www.example.com" + } + } + }, + "forwaderInvalidToken": { + "message": "Invalid $SERVICENAME$ API token", + "description": "Displayed when the user's API token is empty or rejected by the forwarding service.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwaderInvalidTokenWithMessage": { + "message": "Invalid $SERVICENAME$ API token: $ERRORMESSAGE$", + "description": "Displayed when the user's API token is rejected by the forwarding service with an error message.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + }, + "errormessage": { + "content": "$2", + "example": "Please verify your email address to continue." + } + } + }, + "forwarderNoAccountId": { + "message": "Unable to obtain $SERVICENAME$ masked email account ID.", + "description": "Displayed when the forwarding service fails to return an account ID.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderNoDomain": { + "message": "Invalid $SERVICENAME$ domain.", + "description": "Displayed when the domain is empty or domain authorization failed at the forwarding service.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderNoUrl": { + "message": "Invalid $SERVICENAME$ url.", + "description": "Displayed when the url of the forwarding service wasn't supplied.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderUnknownError": { + "message": "Unknown $SERVICENAME$ error occurred.", + "description": "Displayed when the forwarding service failed due to an unknown error.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderUnknownForwarder": { + "message": "Unknown forwarder: '$SERVICENAME$'.", + "description": "Displayed when the forwarding service is not supported.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "JustTrust.us" + } + } + }, "hostname": { "message": "Ostalariaren izena", "description": "Part of a URL." @@ -3029,6 +3176,41 @@ "message": "to make them visible.", "description": "This will be part of a larger sentence, which will read like so: Assign these items to a collection from the Admin Console to make them visible." }, + "autofillSuggestions": { + "message": "Auto-fill suggestions" + }, + "autofillSuggestionsTip": { + "message": "Save a login item for this site to auto-fill" + }, + "yourVaultIsEmpty": { + "message": "Your vault is empty" + }, + "noItemsMatchSearch": { + "message": "No items match your search" + }, + "clearFiltersOrTryAnother": { + "message": "Clear filters or try another search term" + }, + "copyInfo": { + "message": "Copy info, $ITEMNAME$", + "description": "Aria label for a button that opens a menu with options to copy information from an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "moreOptions": { + "message": "More options, $ITEMNAME$", + "description": "Aria label for a button that opens a menu with more options for an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, "adminConsole": { "message": "Admin Console" }, @@ -3046,5 +3228,38 @@ }, "errorAssigningTargetFolder": { "message": "Error assigning target folder." + }, + "viewItemsIn": { + "message": "View items in $NAME$", + "description": "Button to view the contents of a folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "backTo": { + "message": "Back to $NAME$", + "description": "Navigate back to a previous folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "new": { + "message": "New" + }, + "removeItem": { + "message": "Remove $NAME$", + "description": "Remove a selected option, such as a folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } } } diff --git a/apps/browser/src/_locales/fa/messages.json b/apps/browser/src/_locales/fa/messages.json index 6620f33c1e0..ef8893b87c2 100644 --- a/apps/browser/src/_locales/fa/messages.json +++ b/apps/browser/src/_locales/fa/messages.json @@ -166,15 +166,21 @@ "confirmIdentity": { "message": "برای ادامه، هویت خود را تأیید کنید." }, - "account": { - "message": "حساب" - }, "changeMasterPassword": { "message": "تغییر کلمه عبور اصلی" }, "continueToWebApp": { "message": "Continue to web app?" }, + "continueToWebAppDesc": { + "message": "Explore more features of your Bitwarden account on the web app." + }, + "continueToHelpCenter": { + "message": "Continue to Help Center?" + }, + "continueToHelpCenterDesc": { + "message": "Learn more about how to use Bitwarden on the Help Center." + }, "changeMasterPasswordOnWebConfirmation": { "message": "You can change your master password on the Bitwarden web app." }, @@ -192,9 +198,45 @@ "logOut": { "message": "خروج" }, + "aboutBitwarden": { + "message": "About Bitwarden" + }, "about": { "message": "درباره" }, + "moreFromBitwarden": { + "message": "More from Bitwarden" + }, + "continueToBitwardenDotCom": { + "message": "Continue to bitwarden.com?" + }, + "bitwardenForBusiness": { + "message": "Bitwarden for Business" + }, + "bitwardenAuthenticator": { + "message": "Bitwarden Authenticator" + }, + "continueToAuthenticatorPageDesc": { + "message": "Bitwarden Authenticator allows you to store authenticator keys and generate TOTP codes for 2-step verification flows. Learn more on the bitwarden.com website" + }, + "bitwardenSecretsManager": { + "message": "Bitwarden Secrets Manager" + }, + "continueToSecretsManagerPageDesc": { + "message": "Securely store, manage, and share developer secrets with Bitwarden Secrets Manager. Learn more on the bitwarden.com website." + }, + "passwordlessDotDev": { + "message": "Passwordless.dev" + }, + "continueToPasswordlessDotDevPageDesc": { + "message": "Create smooth and secure login experiences free from traditional passwords with Passwordless.dev. Learn more on the bitwarden.com website." + }, + "freeBitwardenFamilies": { + "message": "Free Bitwarden Families" + }, + "freeBitwardenFamiliesPageDesc": { + "message": "You are eligible for Free Bitwarden Families. Redeem this offer today in the web app." + }, "version": { "message": "نسخه" }, @@ -253,8 +295,8 @@ "passGenInfo": { "message": "به طور خودکار کلمه‌های عبور قوی و منحصر به فرد برای ورود به سیستم خود ایجاد کنید." }, - "bitWebVault": { - "message": "گاوصندوق وب Bitwarden" + "bitWebVaultApp": { + "message": "Bitwarden web app" }, "importItems": { "message": "درون ریزی موارد" @@ -779,11 +821,8 @@ "shared": { "message": "اشتراک گذاری شد" }, - "learnOrg": { - "message": "درباره سازمان‌ها اطلاعات کسب کنید" - }, - "learnOrgConfirmation": { - "message": "Bitwarden به شما اجازه می‌دهد با استفاده از سازمان، موارد گاوصندوق خود را با دیگران به اشتراک بگذارید. آیا مایل به بازدید از وب سایت bitwarden.com برای کسب اطلاعات بیشتر هستید؟" + "bitwardenForBusinessPageDesc": { + "message": "Bitwarden for Business allows you to share your vault items with others by using an organization. Learn more on the bitwarden.com website." }, "moveToOrganization": { "message": "انتقال به سازمان" @@ -1714,6 +1753,12 @@ "biometricsNotSupportedDesc": { "message": "بیومتریک مرورگر در این دستگاه پشتیبانی نمی‌شود." }, + "biometricsNotUnlockedTitle": { + "message": "User locked or logged out" + }, + "biometricsNotUnlockedDesc": { + "message": "Please unlock this user in the desktop application and try again." + }, "biometricsFailedTitle": { "message": "زیست‌سنجی ناموفق بود" }, @@ -2177,6 +2222,108 @@ "forwardedEmailDesc": { "message": "یک نام مستعار ایمیل با یک سرویس ارسال خارجی ایجاد کنید." }, + "forwarderError": { + "message": "$SERVICENAME$ error: $ERRORMESSAGE$", + "description": "Reports an error returned by a forwarding service to the user.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + }, + "errormessage": { + "content": "$2", + "example": "Invalid characters in domain name." + } + } + }, + "forwarderGeneratedBy": { + "message": "Generated by Bitwarden.", + "description": "Displayed with the address on the forwarding service's configuration screen." + }, + "forwarderGeneratedByWithWebsite": { + "message": "Website: $WEBSITE$. Generated by Bitwarden.", + "description": "Displayed with the address on the forwarding service's configuration screen.", + "placeholders": { + "WEBSITE": { + "content": "$1", + "example": "www.example.com" + } + } + }, + "forwaderInvalidToken": { + "message": "Invalid $SERVICENAME$ API token", + "description": "Displayed when the user's API token is empty or rejected by the forwarding service.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwaderInvalidTokenWithMessage": { + "message": "Invalid $SERVICENAME$ API token: $ERRORMESSAGE$", + "description": "Displayed when the user's API token is rejected by the forwarding service with an error message.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + }, + "errormessage": { + "content": "$2", + "example": "Please verify your email address to continue." + } + } + }, + "forwarderNoAccountId": { + "message": "Unable to obtain $SERVICENAME$ masked email account ID.", + "description": "Displayed when the forwarding service fails to return an account ID.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderNoDomain": { + "message": "Invalid $SERVICENAME$ domain.", + "description": "Displayed when the domain is empty or domain authorization failed at the forwarding service.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderNoUrl": { + "message": "Invalid $SERVICENAME$ url.", + "description": "Displayed when the url of the forwarding service wasn't supplied.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderUnknownError": { + "message": "Unknown $SERVICENAME$ error occurred.", + "description": "Displayed when the forwarding service failed due to an unknown error.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderUnknownForwarder": { + "message": "Unknown forwarder: '$SERVICENAME$'.", + "description": "Displayed when the forwarding service is not supported.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "JustTrust.us" + } + } + }, "hostname": { "message": "نام میزبان", "description": "Part of a URL." @@ -3029,6 +3176,41 @@ "message": "to make them visible.", "description": "This will be part of a larger sentence, which will read like so: Assign these items to a collection from the Admin Console to make them visible." }, + "autofillSuggestions": { + "message": "Auto-fill suggestions" + }, + "autofillSuggestionsTip": { + "message": "Save a login item for this site to auto-fill" + }, + "yourVaultIsEmpty": { + "message": "Your vault is empty" + }, + "noItemsMatchSearch": { + "message": "No items match your search" + }, + "clearFiltersOrTryAnother": { + "message": "Clear filters or try another search term" + }, + "copyInfo": { + "message": "Copy info, $ITEMNAME$", + "description": "Aria label for a button that opens a menu with options to copy information from an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "moreOptions": { + "message": "More options, $ITEMNAME$", + "description": "Aria label for a button that opens a menu with more options for an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, "adminConsole": { "message": "Admin Console" }, @@ -3046,5 +3228,38 @@ }, "errorAssigningTargetFolder": { "message": "Error assigning target folder." + }, + "viewItemsIn": { + "message": "View items in $NAME$", + "description": "Button to view the contents of a folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "backTo": { + "message": "Back to $NAME$", + "description": "Navigate back to a previous folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "new": { + "message": "New" + }, + "removeItem": { + "message": "Remove $NAME$", + "description": "Remove a selected option, such as a folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } } } diff --git a/apps/browser/src/_locales/fi/messages.json b/apps/browser/src/_locales/fi/messages.json index 7af0c95a1d2..c1647843c26 100644 --- a/apps/browser/src/_locales/fi/messages.json +++ b/apps/browser/src/_locales/fi/messages.json @@ -7,7 +7,7 @@ "description": "Extension name, MUST be less than 40 characters (Safari restriction)" }, "extDesc": { - "message": "Kotona, töissä tai reissussa, Bitwarden suojaa helposti salasanasi, suojausavaimesi ja arkaluonteiset tietosi.", + "message": "Kotona, töissä tai reissussa, Bitwarden suojaa salasanasi, suojausavaimesi ja arkaluonteiset tietosi helposti.", "description": "Extension description, MUST be less than 112 characters (Safari restriction)" }, "loginOrCreateNewAccount": { @@ -166,15 +166,21 @@ "confirmIdentity": { "message": "Jatka vahvistamalla henkilöllisyytesi." }, - "account": { - "message": "Käyttäjätili" - }, "changeMasterPassword": { "message": "Vaihda pääsalasana" }, "continueToWebApp": { "message": "Avataanko verkkosovellus?" }, + "continueToWebAppDesc": { + "message": "Explore more features of your Bitwarden account on the web app." + }, + "continueToHelpCenter": { + "message": "Continue to Help Center?" + }, + "continueToHelpCenterDesc": { + "message": "Learn more about how to use Bitwarden on the Help Center." + }, "changeMasterPasswordOnWebConfirmation": { "message": "Voit vaihtaa pääsalasanasi Bitwardenin verkkosovelluksessa." }, @@ -192,9 +198,45 @@ "logOut": { "message": "Kirjaudu ulos" }, + "aboutBitwarden": { + "message": "About Bitwarden" + }, "about": { "message": "Tietoja" }, + "moreFromBitwarden": { + "message": "More from Bitwarden" + }, + "continueToBitwardenDotCom": { + "message": "Continue to bitwarden.com?" + }, + "bitwardenForBusiness": { + "message": "Bitwarden for Business" + }, + "bitwardenAuthenticator": { + "message": "Bitwarden Authenticator" + }, + "continueToAuthenticatorPageDesc": { + "message": "Bitwarden Authenticator allows you to store authenticator keys and generate TOTP codes for 2-step verification flows. Learn more on the bitwarden.com website" + }, + "bitwardenSecretsManager": { + "message": "Bitwarden Secrets Manager" + }, + "continueToSecretsManagerPageDesc": { + "message": "Securely store, manage, and share developer secrets with Bitwarden Secrets Manager. Learn more on the bitwarden.com website." + }, + "passwordlessDotDev": { + "message": "Passwordless.dev" + }, + "continueToPasswordlessDotDevPageDesc": { + "message": "Create smooth and secure login experiences free from traditional passwords with Passwordless.dev. Learn more on the bitwarden.com website." + }, + "freeBitwardenFamilies": { + "message": "Free Bitwarden Families" + }, + "freeBitwardenFamiliesPageDesc": { + "message": "You are eligible for Free Bitwarden Families. Redeem this offer today in the web app." + }, "version": { "message": "Versio" }, @@ -253,8 +295,8 @@ "passGenInfo": { "message": "Luo kirjautumistiedoillesi automaattisesti vahvoja, ainutlaatuisia salasanoja." }, - "bitWebVault": { - "message": "Bitwarden Verkkoholvi" + "bitWebVaultApp": { + "message": "Bitwarden web app" }, "importItems": { "message": "Tuo kohteita" @@ -697,10 +739,10 @@ "message": "Tarjoa kirjautumistiedon salasanan päivitystä, kun verkkosivustolla havaitaan uusi salasana. Koskee kaikkia kirjautuneita tilejä." }, "enableUsePasskeys": { - "message": "Tarjoa salausavainten tallennusta ja käyttöä" + "message": "Tarjoa suojausvainten tallennusta ja käyttöä" }, "usePasskeysDesc": { - "message": "Tarjoa tallennusta uusille salausavaimille tai kirjautumista holvissasi olevilla salausavaimilla. Koskee kaikkia kirjautuneita tilejä." + "message": "Tarjoa tallennusta uusille suojausavaimille tai kirjautumista holvissasi olevilla salausavaimilla. Koskee kaikkia kirjautuneita tilejä." }, "notificationChangeDesc": { "message": "Haluatko päivittää salasanan Bitwardeniin?" @@ -779,11 +821,8 @@ "shared": { "message": "Jaettu" }, - "learnOrg": { - "message": "Lisätietoja organisaatioista" - }, - "learnOrgConfirmation": { - "message": "Bitwarden mahdollistaa holvin sisällön jaon organisaatiotilin avulla. Haluatko lukea lisää bitwarden.com-sivustolta?" + "bitwardenForBusinessPageDesc": { + "message": "Bitwarden for Business allows you to share your vault items with others by using an organization. Learn more on the bitwarden.com website." }, "moveToOrganization": { "message": "Siirrä organisaatiolle" @@ -1714,6 +1753,12 @@ "biometricsNotSupportedDesc": { "message": "Selaimen biometriaa ei tueta tällä laitteella." }, + "biometricsNotUnlockedTitle": { + "message": "User locked or logged out" + }, + "biometricsNotUnlockedDesc": { + "message": "Please unlock this user in the desktop application and try again." + }, "biometricsFailedTitle": { "message": "Biometria epäonnistui" }, @@ -2172,11 +2217,113 @@ "message": "Palvelu" }, "forwardedEmail": { - "message": "Sähköpostialias välitykseen" + "message": "Sähköpostialias ohjaukseen" }, "forwardedEmailDesc": { "message": "Luo sähköpostialias ulkoisella ohjauspalvelulla." }, + "forwarderError": { + "message": "$SERVICENAME$ -virhe: $ERRORMESSAGE$", + "description": "Reports an error returned by a forwarding service to the user.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + }, + "errormessage": { + "content": "$2", + "example": "Invalid characters in domain name." + } + } + }, + "forwarderGeneratedBy": { + "message": "Bitwardenin luoma.", + "description": "Displayed with the address on the forwarding service's configuration screen." + }, + "forwarderGeneratedByWithWebsite": { + "message": "Verkkosivusto: $WEBSITE$. Bitwardenin luoma.", + "description": "Displayed with the address on the forwarding service's configuration screen.", + "placeholders": { + "WEBSITE": { + "content": "$1", + "example": "www.example.com" + } + } + }, + "forwaderInvalidToken": { + "message": "Virheellinen $SERVICENAME$ -rajapinnan tunniste", + "description": "Displayed when the user's API token is empty or rejected by the forwarding service.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwaderInvalidTokenWithMessage": { + "message": "Virheellinen $SERVICENAME$ -rajapinnan tunniste: $ERRORMESSAGE$", + "description": "Displayed when the user's API token is rejected by the forwarding service with an error message.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + }, + "errormessage": { + "content": "$2", + "example": "Please verify your email address to continue." + } + } + }, + "forwarderNoAccountId": { + "message": "$SERVICENAME$ -palvelun peittämän sähköpostitilin tunnistetta ei saatu.", + "description": "Displayed when the forwarding service fails to return an account ID.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderNoDomain": { + "message": "Virheellinen $SERVICENAME$ -verkkotunnus.", + "description": "Displayed when the domain is empty or domain authorization failed at the forwarding service.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderNoUrl": { + "message": "Virheellinen $SERVICENAME$ -URL.", + "description": "Displayed when the url of the forwarding service wasn't supplied.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderUnknownError": { + "message": "Tapahtui tuntematon $SERVICENAME$ -virhe.", + "description": "Displayed when the forwarding service failed due to an unknown error.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderUnknownForwarder": { + "message": "Tuntematon ohjaaja: $SERVICENAME$.", + "description": "Displayed when the forwarding service is not supported.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "JustTrust.us" + } + } + }, "hostname": { "message": "Isäntä", "description": "Part of a URL." @@ -3029,6 +3176,41 @@ "message": ", jotta ne näkyvät.", "description": "This will be part of a larger sentence, which will read like so: Assign these items to a collection from the Admin Console to make them visible." }, + "autofillSuggestions": { + "message": "Auto-fill suggestions" + }, + "autofillSuggestionsTip": { + "message": "Save a login item for this site to auto-fill" + }, + "yourVaultIsEmpty": { + "message": "Your vault is empty" + }, + "noItemsMatchSearch": { + "message": "No items match your search" + }, + "clearFiltersOrTryAnother": { + "message": "Clear filters or try another search term" + }, + "copyInfo": { + "message": "Copy info, $ITEMNAME$", + "description": "Aria label for a button that opens a menu with options to copy information from an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "moreOptions": { + "message": "More options, $ITEMNAME$", + "description": "Aria label for a button that opens a menu with more options for an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, "adminConsole": { "message": "Hallintapaneelista" }, @@ -3046,5 +3228,38 @@ }, "errorAssigningTargetFolder": { "message": "Virhe määritettäessä kohdekansiota." + }, + "viewItemsIn": { + "message": "View items in $NAME$", + "description": "Button to view the contents of a folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "backTo": { + "message": "Back to $NAME$", + "description": "Navigate back to a previous folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "new": { + "message": "New" + }, + "removeItem": { + "message": "Remove $NAME$", + "description": "Remove a selected option, such as a folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } } } diff --git a/apps/browser/src/_locales/fil/messages.json b/apps/browser/src/_locales/fil/messages.json index 6e52afd7db6..c75700da1c5 100644 --- a/apps/browser/src/_locales/fil/messages.json +++ b/apps/browser/src/_locales/fil/messages.json @@ -166,15 +166,21 @@ "confirmIdentity": { "message": "Kumpirmahin ang iyong identididad upang magpatuloy." }, - "account": { - "message": "Account" - }, "changeMasterPassword": { "message": "Baguhin ang Master Password" }, "continueToWebApp": { "message": "Continue to web app?" }, + "continueToWebAppDesc": { + "message": "Explore more features of your Bitwarden account on the web app." + }, + "continueToHelpCenter": { + "message": "Continue to Help Center?" + }, + "continueToHelpCenterDesc": { + "message": "Learn more about how to use Bitwarden on the Help Center." + }, "changeMasterPasswordOnWebConfirmation": { "message": "You can change your master password on the Bitwarden web app." }, @@ -192,9 +198,45 @@ "logOut": { "message": "Mag-Log Out" }, + "aboutBitwarden": { + "message": "About Bitwarden" + }, "about": { "message": "Tungkol" }, + "moreFromBitwarden": { + "message": "More from Bitwarden" + }, + "continueToBitwardenDotCom": { + "message": "Continue to bitwarden.com?" + }, + "bitwardenForBusiness": { + "message": "Bitwarden for Business" + }, + "bitwardenAuthenticator": { + "message": "Bitwarden Authenticator" + }, + "continueToAuthenticatorPageDesc": { + "message": "Bitwarden Authenticator allows you to store authenticator keys and generate TOTP codes for 2-step verification flows. Learn more on the bitwarden.com website" + }, + "bitwardenSecretsManager": { + "message": "Bitwarden Secrets Manager" + }, + "continueToSecretsManagerPageDesc": { + "message": "Securely store, manage, and share developer secrets with Bitwarden Secrets Manager. Learn more on the bitwarden.com website." + }, + "passwordlessDotDev": { + "message": "Passwordless.dev" + }, + "continueToPasswordlessDotDevPageDesc": { + "message": "Create smooth and secure login experiences free from traditional passwords with Passwordless.dev. Learn more on the bitwarden.com website." + }, + "freeBitwardenFamilies": { + "message": "Free Bitwarden Families" + }, + "freeBitwardenFamiliesPageDesc": { + "message": "You are eligible for Free Bitwarden Families. Redeem this offer today in the web app." + }, "version": { "message": "Bersyon" }, @@ -253,8 +295,8 @@ "passGenInfo": { "message": "Automatiko na gumawa ng mga malakas at natatanging mga password para sa iyong mga logins." }, - "bitWebVault": { - "message": "Bitwarden web vault" + "bitWebVaultApp": { + "message": "Bitwarden web app" }, "importItems": { "message": "Isingit ang Vault ngayon" @@ -779,11 +821,8 @@ "shared": { "message": "Iniimbak" }, - "learnOrg": { - "message": "Matuto tungkol sa mga organisasyon" - }, - "learnOrgConfirmation": { - "message": "Pinapahintulutan ka ng Bitwarden na i-share ang iyong mga item sa vault sa iba pang tao gamit ang isang organisasyon. Gusto mo bang bisitahin ang website ng bitwarden.com upang matuto nang higit pa?" + "bitwardenForBusinessPageDesc": { + "message": "Bitwarden for Business allows you to share your vault items with others by using an organization. Learn more on the bitwarden.com website." }, "moveToOrganization": { "message": "Lumipat sa organisasyon" @@ -1714,6 +1753,12 @@ "biometricsNotSupportedDesc": { "message": "Ang browser biometrics ay hindi sinusuportahan sa device na ito." }, + "biometricsNotUnlockedTitle": { + "message": "User locked or logged out" + }, + "biometricsNotUnlockedDesc": { + "message": "Please unlock this user in the desktop application and try again." + }, "biometricsFailedTitle": { "message": "Biometrics failed" }, @@ -2177,6 +2222,108 @@ "forwardedEmailDesc": { "message": "Bumuo ng isang email alias na may isang panlabas na serbisyo sa pagpapasa." }, + "forwarderError": { + "message": "$SERVICENAME$ error: $ERRORMESSAGE$", + "description": "Reports an error returned by a forwarding service to the user.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + }, + "errormessage": { + "content": "$2", + "example": "Invalid characters in domain name." + } + } + }, + "forwarderGeneratedBy": { + "message": "Generated by Bitwarden.", + "description": "Displayed with the address on the forwarding service's configuration screen." + }, + "forwarderGeneratedByWithWebsite": { + "message": "Website: $WEBSITE$. Generated by Bitwarden.", + "description": "Displayed with the address on the forwarding service's configuration screen.", + "placeholders": { + "WEBSITE": { + "content": "$1", + "example": "www.example.com" + } + } + }, + "forwaderInvalidToken": { + "message": "Invalid $SERVICENAME$ API token", + "description": "Displayed when the user's API token is empty or rejected by the forwarding service.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwaderInvalidTokenWithMessage": { + "message": "Invalid $SERVICENAME$ API token: $ERRORMESSAGE$", + "description": "Displayed when the user's API token is rejected by the forwarding service with an error message.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + }, + "errormessage": { + "content": "$2", + "example": "Please verify your email address to continue." + } + } + }, + "forwarderNoAccountId": { + "message": "Unable to obtain $SERVICENAME$ masked email account ID.", + "description": "Displayed when the forwarding service fails to return an account ID.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderNoDomain": { + "message": "Invalid $SERVICENAME$ domain.", + "description": "Displayed when the domain is empty or domain authorization failed at the forwarding service.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderNoUrl": { + "message": "Invalid $SERVICENAME$ url.", + "description": "Displayed when the url of the forwarding service wasn't supplied.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderUnknownError": { + "message": "Unknown $SERVICENAME$ error occurred.", + "description": "Displayed when the forwarding service failed due to an unknown error.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderUnknownForwarder": { + "message": "Unknown forwarder: '$SERVICENAME$'.", + "description": "Displayed when the forwarding service is not supported.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "JustTrust.us" + } + } + }, "hostname": { "message": "Pangalan ng Hostname", "description": "Part of a URL." @@ -3029,6 +3176,41 @@ "message": "to make them visible.", "description": "This will be part of a larger sentence, which will read like so: Assign these items to a collection from the Admin Console to make them visible." }, + "autofillSuggestions": { + "message": "Auto-fill suggestions" + }, + "autofillSuggestionsTip": { + "message": "Save a login item for this site to auto-fill" + }, + "yourVaultIsEmpty": { + "message": "Your vault is empty" + }, + "noItemsMatchSearch": { + "message": "No items match your search" + }, + "clearFiltersOrTryAnother": { + "message": "Clear filters or try another search term" + }, + "copyInfo": { + "message": "Copy info, $ITEMNAME$", + "description": "Aria label for a button that opens a menu with options to copy information from an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "moreOptions": { + "message": "More options, $ITEMNAME$", + "description": "Aria label for a button that opens a menu with more options for an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, "adminConsole": { "message": "Admin Console" }, @@ -3046,5 +3228,38 @@ }, "errorAssigningTargetFolder": { "message": "Error assigning target folder." + }, + "viewItemsIn": { + "message": "View items in $NAME$", + "description": "Button to view the contents of a folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "backTo": { + "message": "Back to $NAME$", + "description": "Navigate back to a previous folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "new": { + "message": "New" + }, + "removeItem": { + "message": "Remove $NAME$", + "description": "Remove a selected option, such as a folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } } } diff --git a/apps/browser/src/_locales/fr/messages.json b/apps/browser/src/_locales/fr/messages.json index d53961be291..4ace8752b3c 100644 --- a/apps/browser/src/_locales/fr/messages.json +++ b/apps/browser/src/_locales/fr/messages.json @@ -166,15 +166,21 @@ "confirmIdentity": { "message": "Confirmez votre identité pour continuer." }, - "account": { - "message": "Compte" - }, "changeMasterPassword": { "message": "Changer le mot de passe principal" }, "continueToWebApp": { "message": "Poursuivre vers l'application web ?" }, + "continueToWebAppDesc": { + "message": "Explore more features of your Bitwarden account on the web app." + }, + "continueToHelpCenter": { + "message": "Continue to Help Center?" + }, + "continueToHelpCenterDesc": { + "message": "Learn more about how to use Bitwarden on the Help Center." + }, "changeMasterPasswordOnWebConfirmation": { "message": "Vous pouvez modifier votre mot de passe principal sur l'application web de Bitwarden." }, @@ -192,9 +198,45 @@ "logOut": { "message": "Se déconnecter" }, + "aboutBitwarden": { + "message": "About Bitwarden" + }, "about": { "message": "À propos" }, + "moreFromBitwarden": { + "message": "More from Bitwarden" + }, + "continueToBitwardenDotCom": { + "message": "Continue to bitwarden.com?" + }, + "bitwardenForBusiness": { + "message": "Bitwarden for Business" + }, + "bitwardenAuthenticator": { + "message": "Bitwarden Authenticator" + }, + "continueToAuthenticatorPageDesc": { + "message": "Bitwarden Authenticator allows you to store authenticator keys and generate TOTP codes for 2-step verification flows. Learn more on the bitwarden.com website" + }, + "bitwardenSecretsManager": { + "message": "Bitwarden Secrets Manager" + }, + "continueToSecretsManagerPageDesc": { + "message": "Securely store, manage, and share developer secrets with Bitwarden Secrets Manager. Learn more on the bitwarden.com website." + }, + "passwordlessDotDev": { + "message": "Passwordless.dev" + }, + "continueToPasswordlessDotDevPageDesc": { + "message": "Create smooth and secure login experiences free from traditional passwords with Passwordless.dev. Learn more on the bitwarden.com website." + }, + "freeBitwardenFamilies": { + "message": "Free Bitwarden Families" + }, + "freeBitwardenFamiliesPageDesc": { + "message": "You are eligible for Free Bitwarden Families. Redeem this offer today in the web app." + }, "version": { "message": "Version" }, @@ -253,8 +295,8 @@ "passGenInfo": { "message": "Générer automatiquement des mots de passe robustes et uniques pour vos identifiants." }, - "bitWebVault": { - "message": "Coffre web bitwarden" + "bitWebVaultApp": { + "message": "Bitwarden web app" }, "importItems": { "message": "Importer des éléments" @@ -779,11 +821,8 @@ "shared": { "message": "Partagé" }, - "learnOrg": { - "message": "En savoir plus sur les organisations" - }, - "learnOrgConfirmation": { - "message": "Bitwarden vous permet de partager des éléments de votre coffre avec d'autres personnes en utilisant un compte d'organisation. Souhaitez-vous visiter le site web bitwarden.com pour en savoir plus ?" + "bitwardenForBusinessPageDesc": { + "message": "Bitwarden for Business allows you to share your vault items with others by using an organization. Learn more on the bitwarden.com website." }, "moveToOrganization": { "message": "Déplacer vers l'organisation" @@ -1714,6 +1753,12 @@ "biometricsNotSupportedDesc": { "message": "Le déverrouillage biométrique dans le navigateur n’est pas pris en charge sur cet appareil" }, + "biometricsNotUnlockedTitle": { + "message": "User locked or logged out" + }, + "biometricsNotUnlockedDesc": { + "message": "Please unlock this user in the desktop application and try again." + }, "biometricsFailedTitle": { "message": "Le déverrouillage biométique a échoué\n" }, @@ -2177,6 +2222,108 @@ "forwardedEmailDesc": { "message": "Générer un alias de courriel avec un service de transfert externe." }, + "forwarderError": { + "message": "$SERVICENAME$ error: $ERRORMESSAGE$", + "description": "Reports an error returned by a forwarding service to the user.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + }, + "errormessage": { + "content": "$2", + "example": "Invalid characters in domain name." + } + } + }, + "forwarderGeneratedBy": { + "message": "Generated by Bitwarden.", + "description": "Displayed with the address on the forwarding service's configuration screen." + }, + "forwarderGeneratedByWithWebsite": { + "message": "Website: $WEBSITE$. Generated by Bitwarden.", + "description": "Displayed with the address on the forwarding service's configuration screen.", + "placeholders": { + "WEBSITE": { + "content": "$1", + "example": "www.example.com" + } + } + }, + "forwaderInvalidToken": { + "message": "Invalid $SERVICENAME$ API token", + "description": "Displayed when the user's API token is empty or rejected by the forwarding service.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwaderInvalidTokenWithMessage": { + "message": "Invalid $SERVICENAME$ API token: $ERRORMESSAGE$", + "description": "Displayed when the user's API token is rejected by the forwarding service with an error message.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + }, + "errormessage": { + "content": "$2", + "example": "Please verify your email address to continue." + } + } + }, + "forwarderNoAccountId": { + "message": "Unable to obtain $SERVICENAME$ masked email account ID.", + "description": "Displayed when the forwarding service fails to return an account ID.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderNoDomain": { + "message": "Invalid $SERVICENAME$ domain.", + "description": "Displayed when the domain is empty or domain authorization failed at the forwarding service.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderNoUrl": { + "message": "Invalid $SERVICENAME$ url.", + "description": "Displayed when the url of the forwarding service wasn't supplied.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderUnknownError": { + "message": "Unknown $SERVICENAME$ error occurred.", + "description": "Displayed when the forwarding service failed due to an unknown error.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderUnknownForwarder": { + "message": "Unknown forwarder: '$SERVICENAME$'.", + "description": "Displayed when the forwarding service is not supported.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "JustTrust.us" + } + } + }, "hostname": { "message": "Nom d'hôte", "description": "Part of a URL." @@ -3029,6 +3176,41 @@ "message": "pour les rendre visibles.", "description": "This will be part of a larger sentence, which will read like so: Assign these items to a collection from the Admin Console to make them visible." }, + "autofillSuggestions": { + "message": "Auto-fill suggestions" + }, + "autofillSuggestionsTip": { + "message": "Save a login item for this site to auto-fill" + }, + "yourVaultIsEmpty": { + "message": "Your vault is empty" + }, + "noItemsMatchSearch": { + "message": "No items match your search" + }, + "clearFiltersOrTryAnother": { + "message": "Clear filters or try another search term" + }, + "copyInfo": { + "message": "Copy info, $ITEMNAME$", + "description": "Aria label for a button that opens a menu with options to copy information from an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "moreOptions": { + "message": "More options, $ITEMNAME$", + "description": "Aria label for a button that opens a menu with more options for an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, "adminConsole": { "message": "Console Admin" }, @@ -3046,5 +3228,38 @@ }, "errorAssigningTargetFolder": { "message": "Error assigning target folder." + }, + "viewItemsIn": { + "message": "View items in $NAME$", + "description": "Button to view the contents of a folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "backTo": { + "message": "Back to $NAME$", + "description": "Navigate back to a previous folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "new": { + "message": "New" + }, + "removeItem": { + "message": "Remove $NAME$", + "description": "Remove a selected option, such as a folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } } } diff --git a/apps/browser/src/_locales/gl/messages.json b/apps/browser/src/_locales/gl/messages.json index 0c2ce6114a3..873e8196888 100644 --- a/apps/browser/src/_locales/gl/messages.json +++ b/apps/browser/src/_locales/gl/messages.json @@ -166,249 +166,291 @@ "confirmIdentity": { "message": "Confirma a túa identidade para continuar." }, - "account": { - "message": "Conta" - }, "changeMasterPassword": { "message": "Cambiar o contrasinal mestre" }, "continueToWebApp": { "message": "Continuar á aplicación web?" }, + "continueToWebAppDesc": { + "message": "Explore more features of your Bitwarden account on the web app." + }, + "continueToHelpCenter": { + "message": "Continue to Help Center?" + }, + "continueToHelpCenterDesc": { + "message": "Learn more about how to use Bitwarden on the Help Center." + }, "changeMasterPasswordOnWebConfirmation": { - "message": "You can change your master password on the Bitwarden web app." + "message": "Podes cambiar o teu contrasinal mestre na aplicación web de Bitwarden." }, "fingerprintPhrase": { - "message": "Fingerprint phrase", + "message": "Frase de pegada dactilar", "description": "A 'fingerprint phrase' is a unique word phrase (similar to a passphrase) that a user can use to authenticate their public key with another user, for the purposes of sharing." }, "yourAccountsFingerprint": { - "message": "Your account's fingerprint phrase", + "message": "Frase de pegada dactilar da túa conta", "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": "Two-step login" + "message": "Autenticación en dous pasos" }, "logOut": { - "message": "Log out" + "message": "Pechar sesión" + }, + "aboutBitwarden": { + "message": "About Bitwarden" }, "about": { - "message": "About" + "message": "Acerca de" + }, + "moreFromBitwarden": { + "message": "More from Bitwarden" + }, + "continueToBitwardenDotCom": { + "message": "Continue to bitwarden.com?" + }, + "bitwardenForBusiness": { + "message": "Bitwarden for Business" + }, + "bitwardenAuthenticator": { + "message": "Bitwarden Authenticator" + }, + "continueToAuthenticatorPageDesc": { + "message": "Bitwarden Authenticator allows you to store authenticator keys and generate TOTP codes for 2-step verification flows. Learn more on the bitwarden.com website" + }, + "bitwardenSecretsManager": { + "message": "Bitwarden Secrets Manager" + }, + "continueToSecretsManagerPageDesc": { + "message": "Securely store, manage, and share developer secrets with Bitwarden Secrets Manager. Learn more on the bitwarden.com website." + }, + "passwordlessDotDev": { + "message": "Passwordless.dev" + }, + "continueToPasswordlessDotDevPageDesc": { + "message": "Create smooth and secure login experiences free from traditional passwords with Passwordless.dev. Learn more on the bitwarden.com website." + }, + "freeBitwardenFamilies": { + "message": "Free Bitwarden Families" + }, + "freeBitwardenFamiliesPageDesc": { + "message": "You are eligible for Free Bitwarden Families. Redeem this offer today in the web app." }, "version": { - "message": "Version" + "message": "Versión" }, "save": { - "message": "Save" + "message": "Gardar" }, "move": { - "message": "Move" + "message": "Mover" }, "addFolder": { - "message": "Add folder" + "message": "Engadir cartafol" }, "name": { - "message": "Name" + "message": "Nome" }, "editFolder": { - "message": "Edit folder" + "message": "Editar cartafol" }, "deleteFolder": { - "message": "Delete folder" + "message": "Eliminar cartafol" }, "folders": { - "message": "Folders" + "message": "Cartafois" }, "noFolders": { - "message": "There are no folders to list." + "message": "Non hai cartafois que listar." }, "helpFeedback": { - "message": "Help & feedback" + "message": "Axuda e comentarios" }, "helpCenter": { - "message": "Bitwarden Help center" + "message": "Centro de axuda de Bitwarden" }, "communityForums": { - "message": "Explore Bitwarden community forums" + "message": "Explorar os foros da comunidade de Bitwarden" }, "contactSupport": { - "message": "Contact Bitwarden support" + "message": "Contactar co soporte de Bitwarden" }, "sync": { - "message": "Sync" + "message": "Sincronizar" }, "syncVaultNow": { - "message": "Sync vault now" + "message": "Sincronizar caixa forte agora" }, "lastSync": { - "message": "Last sync:" + "message": "Última sincronización:" }, "passGen": { - "message": "Password generator" + "message": "Xerador de contrasinais" }, "generator": { - "message": "Generator", + "message": "Xerador", "description": "Short for 'Password Generator'." }, "passGenInfo": { - "message": "Automatically generate strong, unique passwords for your logins." + "message": "Xera automaticamente contrasinais fortes e únicos para os seus inicios de sesión." }, - "bitWebVault": { - "message": "Bitwarden web vault" + "bitWebVaultApp": { + "message": "Bitwarden web app" }, "importItems": { - "message": "Import items" + "message": "Importar elementos" }, "select": { - "message": "Select" + "message": "Seleccionar" }, "generatePassword": { - "message": "Generate password" + "message": "Xerar contrasinal" }, "regeneratePassword": { - "message": "Regenerate password" + "message": "Volver xerar contrasinal" }, "options": { - "message": "Options" + "message": "Opcións" }, "length": { - "message": "Length" + "message": "Lonxitude" }, "passwordMinLength": { - "message": "Minimum password length" + "message": "Lonxitude mínima do contrasinal" }, "uppercase": { - "message": "Uppercase (A-Z)" + "message": "Maiúsculas (A-Z)" }, "lowercase": { - "message": "Lowercase (a-z)" + "message": "Minúsculas (a-z)" }, "numbers": { - "message": "Numbers (0-9)" + "message": "Números (0-9)" }, "specialCharacters": { - "message": "Special characters (!@#$%^&*)" + "message": "Caracteres especiais (!@#$%^&*)" }, "numWords": { - "message": "Number of words" + "message": "Número de palabras" }, "wordSeparator": { - "message": "Word separator" + "message": "Separador de palabras" }, "capitalize": { - "message": "Capitalize", + "message": "Facer a primeira letra da palabra maiúscula", "description": "Make the first letter of a work uppercase." }, "includeNumber": { - "message": "Include number" + "message": "Incluír número" }, "minNumbers": { - "message": "Minimum numbers" + "message": "Mínimo de números" }, "minSpecial": { - "message": "Minimum special" + "message": "Mínimo de caracteres especiais" }, "avoidAmbChar": { - "message": "Avoid ambiguous characters" + "message": "Evitar caracteres ambiguos" }, "searchVault": { - "message": "Search vault" + "message": "Buscar na caixa forte" }, "edit": { - "message": "Edit" + "message": "Editar" }, "view": { - "message": "View" + "message": "Ver" }, "noItemsInList": { - "message": "There are no items to list." + "message": "Non hai elementos que listar." }, "itemInformation": { - "message": "Item information" + "message": "Información do elemento" }, "username": { - "message": "Username" + "message": "Nome de usuario" }, "password": { - "message": "Password" + "message": "Contrasinal" }, "totp": { - "message": "Authenticator secret" + "message": "Secreto de autenticador" }, "passphrase": { - "message": "Passphrase" + "message": "Frase de contrasinal" }, "favorite": { - "message": "Favorite" + "message": "Favorito" }, "notes": { - "message": "Notes" + "message": "Notas" }, "note": { - "message": "Note" + "message": "Nota" }, "editItem": { - "message": "Edit item" + "message": "Editar elemento" }, "folder": { - "message": "Folder" + "message": "Cartafol" }, "deleteItem": { - "message": "Delete item" + "message": "Eliminar elemento" }, "viewItem": { - "message": "View item" + "message": "Ver elemento" }, "launch": { - "message": "Launch" + "message": "Iniciar" }, "website": { - "message": "Website" + "message": "Sitio web" }, "toggleVisibility": { - "message": "Toggle visibility" + "message": "Alternar visibilidade" }, "manage": { - "message": "Manage" + "message": "Xestionar" }, "other": { - "message": "Other" + "message": "Outro" }, "unlockMethods": { - "message": "Unlock options" + "message": "Opcións de desbloqueo" }, "unlockMethodNeededToChangeTimeoutActionDesc": { - "message": "Set up an unlock method to change your vault timeout action." + "message": "Configura un método de desbloqueo para cambiar a túa acción de peche de sesión da caixa forte." }, "unlockMethodNeeded": { - "message": "Set up an unlock method in Settings" + "message": "Configura un método de desbloqueo nos axustes" }, "sessionTimeoutHeader": { - "message": "Session timeout" + "message": "Tempo de sesión esgotado" }, "otherOptions": { - "message": "Other options" + "message": "Outras opcións" }, "rateExtension": { - "message": "Rate the extension" + "message": "Valorar a extensión" }, "rateExtensionDesc": { - "message": "Please consider helping us out with a good review!" + "message": "Por favor, considera axudarnos cunha boa recensión!" }, "browserNotSupportClipboard": { - "message": "Your web browser does not support easy clipboard copying. Copy it manually instead." + "message": "O teu navegador web non soporta copia doada ao portapapeis. Cópiao manualmente no seu lugar." }, "verifyIdentity": { - "message": "Verify identity" + "message": "Verificar identidade" }, "yourVaultIsLocked": { - "message": "Your vault is locked. Verify your identity to continue." + "message": "A túa caixa forte está bloqueada. Verifica a túa identidade para continuar." }, "unlock": { - "message": "Unlock" + "message": "Desbloquear" }, "loggedInAsOn": { - "message": "Logged in as $EMAIL$ on $HOSTNAME$.", + "message": "Conectado coma $EMAIL$ en $HOSTNAME$.", "placeholders": { "email": { "content": "$1", @@ -421,79 +463,79 @@ } }, "invalidMasterPassword": { - "message": "Invalid master password" + "message": "Contrasinal mestre non válido" }, "vaultTimeout": { - "message": "Vault timeout" + "message": "Tempo de espera da caixa forte" }, "lockNow": { - "message": "Lock now" + "message": "Bloquear agora" }, "lockAll": { - "message": "Lock all" + "message": "Bloquear todo" }, "immediately": { - "message": "Immediately" + "message": "Inmediatamente" }, "tenSeconds": { - "message": "10 seconds" + "message": "10 segundos" }, "twentySeconds": { - "message": "20 seconds" + "message": "20 segundos" }, "thirtySeconds": { - "message": "30 seconds" + "message": "30 segundos" }, "oneMinute": { - "message": "1 minute" + "message": "1 minuto" }, "twoMinutes": { - "message": "2 minutes" + "message": "2 minutos" }, "fiveMinutes": { - "message": "5 minutes" + "message": "5 minutos" }, "fifteenMinutes": { - "message": "15 minutes" + "message": "15 minutos" }, "thirtyMinutes": { - "message": "30 minutes" + "message": "30 minutos" }, "oneHour": { - "message": "1 hour" + "message": "1 hora" }, "fourHours": { - "message": "4 hours" + "message": "4 horas" }, "onLocked": { - "message": "On system lock" + "message": "Ao bloquear o sistema" }, "onRestart": { - "message": "On browser restart" + "message": "Ao reiniciar o navegador" }, "never": { - "message": "Never" + "message": "Nunca" }, "security": { - "message": "Security" + "message": "Seguridade" }, "errorOccurred": { - "message": "An error has occurred" + "message": "Produciuse un erro" }, "emailRequired": { - "message": "Email address is required." + "message": "É preciso un enderezo de correo electrónico." }, "invalidEmail": { - "message": "Invalid email address." + "message": "Enderezo de correo electrónico non válido." }, "masterPasswordRequired": { - "message": "Master password is required." + "message": "É preciso o contrasinal mestre." }, "confirmMasterPasswordRequired": { - "message": "Master password retype is required." + "message": "É preciso volver escribir o contrasinal mestre." }, "masterPasswordMinlength": { - "message": "Master password must be at least $VALUE$ characters long.", + "message": "O contrasinal mestre debe ter polo menos $VALUE$ caracteres de lonxitude.", "description": "The Master Password must be at least a specific number of characters long.", "placeholders": { "value": { @@ -503,28 +545,28 @@ } }, "masterPassDoesntMatch": { - "message": "Master password confirmation does not match." + "message": "A confirmación de contrasinal mestre non coincide." }, "newAccountCreated": { - "message": "Your new account has been created! You may now log in." + "message": "A túa nova conta foi creada! Podes iniciar sesión agora." }, "youSuccessfullyLoggedIn": { - "message": "You successfully logged in" + "message": "Iniciaches sesión correctamente" }, "youMayCloseThisWindow": { - "message": "You may close this window" + "message": "Podes pechar está ventá" }, "masterPassSent": { - "message": "We've sent you an email with your master password hint." + "message": "Enviámoste un correo electrónico coa túa pista de contrasinal mestre." }, "verificationCodeRequired": { - "message": "Verification code is required." + "message": "É preciso código de verificación." }, "invalidVerificationCode": { - "message": "Invalid verification code" + "message": "Código de verificación non válido" }, "valueCopied": { - "message": "$VALUE$ copied", + "message": "$VALUE$ copiado", "description": "Value has been copied to the clipboard.", "placeholders": { "value": { @@ -534,70 +576,70 @@ } }, "autofillError": { - "message": "Unable to auto-fill the selected item on this page. Copy and paste the information instead." + "message": "Incapaz de encher automaticamente o elemento seleccionado nesta páxina. Copia e pega a información no seu lugar." }, "totpCaptureError": { - "message": "Unable to scan QR code from the current webpage" + "message": "Incapaz escanear o código QR da páxina web actual" }, "totpCaptureSuccess": { - "message": "Authenticator key added" + "message": "Clave de autenticación engadida" }, "totpCapture": { - "message": "Scan authenticator QR code from current webpage" + "message": "Escanea o código QR autenticador da páxina web actual" }, "copyTOTP": { - "message": "Copy Authenticator key (TOTP)" + "message": "Copiar clave de autenticación (TOTP)" }, "loggedOut": { - "message": "Logged out" + "message": "Sesión pechada" }, "loginExpired": { - "message": "Your login session has expired." + "message": "A túa sesión caducou." }, "logOutConfirmation": { "message": "Are you sure you want to log out?" }, "yes": { - "message": "Yes" + "message": "Si" }, "no": { - "message": "No" + "message": "Non" }, "unexpectedError": { - "message": "An unexpected error has occurred." + "message": "Produciuse un erro inesperado." }, "nameRequired": { - "message": "Name is required." + "message": "Requírese o nome." }, "addedFolder": { - "message": "Folder added" + "message": "Cartafol engadido" }, "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 set up on the bitwarden.com web vault. Do you want to visit the website now?" }, "editedFolder": { - "message": "Folder saved" + "message": "Cartafol gardado" }, "deleteFolderConfirmation": { - "message": "Are you sure you want to delete this folder?" + "message": "Estás seguro de que queres eliminar este cartafol?" }, "deletedFolder": { - "message": "Folder deleted" + "message": "Cartafol eliminado" }, "gettingStartedTutorial": { - "message": "Getting started tutorial" + "message": "Tutorial introdutivo" }, "gettingStartedTutorialVideo": { "message": "Watch our getting started tutorial to learn how to get the most out of the browser extension." }, "syncingComplete": { - "message": "Syncing complete" + "message": "Sincronización completa" }, "syncingFailed": { - "message": "Syncing failed" + "message": "Sincronización fallida" }, "passwordCopied": { - "message": "Password copied" + "message": "Contrasinal copiado" }, "uri": { "message": "URI" @@ -613,47 +655,47 @@ } }, "newUri": { - "message": "New URI" + "message": "Nova URI" }, "addedItem": { - "message": "Item added" + "message": "Elemento engadido" }, "editedItem": { - "message": "Item saved" + "message": "Elemento gardado" }, "deleteItemConfirmation": { - "message": "Do you really want to send to the trash?" + "message": "Realmente queres enviar ao lixo?" }, "deletedItem": { - "message": "Item sent to trash" + "message": "Elemento enviado ao lixo" }, "overwritePassword": { - "message": "Overwrite password" + "message": "Sobrescribir contrasinal" }, "overwritePasswordConfirmation": { - "message": "Are you sure you want to overwrite the current password?" + "message": "Estás seguro de que queres sobrescribir o contrasinal actual?" }, "overwriteUsername": { - "message": "Overwrite username" + "message": "Sobrescribir nome de usuario" }, "overwriteUsernameConfirmation": { - "message": "Are you sure you want to overwrite the current username?" + "message": "Estás seguro de que queres sobrescribir o nome de usuario actual?" }, "searchFolder": { - "message": "Search folder" + "message": "Buscar cartafol" }, "searchCollection": { - "message": "Search collection" + "message": "Buscar colección" }, "searchType": { - "message": "Search type" + "message": "Buscar tipo" }, "noneFolder": { - "message": "No folder", + "message": "Sen cartafol", "description": "This is the folder for uncategorized items" }, "enableAddLoginNotification": { - "message": "Ask to add login" + "message": "Solicita engadir inicio de sesión" }, "addLoginNotificationDesc": { "message": "Ask to add an item if one isn't found in your vault." @@ -662,19 +704,19 @@ "message": "Ask to add an item if one isn't found in your vault. Applies to all logged in accounts." }, "showCardsCurrentTab": { - "message": "Show cards on Tab page" + "message": "Amosar tarxetas no separador" }, "showCardsCurrentTabDesc": { - "message": "List card items on the Tab page for easy auto-fill." + "message": "Lista os elementos de tarxeta no separador para fácil auto-completado." }, "showIdentitiesCurrentTab": { - "message": "Show identities on Tab page" + "message": "Mostrar identidades no separador" }, "showIdentitiesCurrentTabDesc": { - "message": "List identity items on the Tab page for easy auto-fill." + "message": "Lista os elementos de identidade no separador para fácil auto-completado." }, "clearClipboard": { - "message": "Clear clipboard", + "message": "Limpar portapapeis", "description": "Clipboard is the operating system thing where you copy/paste data to on your device." }, "clearClipboardDesc": { @@ -685,7 +727,7 @@ "message": "Should Bitwarden remember this password for you?" }, "notificationAddSave": { - "message": "Save" + "message": "Gardar" }, "enableChangedPasswordNotification": { "message": "Ask to update existing login" @@ -706,13 +748,13 @@ "message": "Do you want to update this password in Bitwarden?" }, "notificationChangeSave": { - "message": "Update" + "message": "Actualizar" }, "notificationUnlockDesc": { "message": "Unlock your Bitwarden vault to complete the auto-fill request." }, "notificationUnlock": { - "message": "Unlock" + "message": "Desbloquear" }, "enableContextMenuItem": { "message": "Show context menu options" @@ -731,7 +773,7 @@ "message": "Choose the default way that URI match detection is handled for logins when performing actions such as auto-fill." }, "theme": { - "message": "Theme" + "message": "Tema" }, "themeDesc": { "message": "Change the application's color theme." @@ -740,25 +782,25 @@ "message": "Change the application's color theme. Applies to all logged in accounts." }, "dark": { - "message": "Dark", + "message": "Escuro", "description": "Dark color" }, "light": { - "message": "Light", + "message": "Claro", "description": "Light color" }, "solarizedDark": { - "message": "Solarized dark", + "message": "Solarizado escuro", "description": "'Solarized' is a noun and the name of a color scheme. It should not be translated." }, "exportVault": { - "message": "Export vault" + "message": "Exportar caixa forte" }, "fileFormat": { - "message": "File format" + "message": "Formato de ficheiro" }, "warning": { - "message": "WARNING", + "message": "ADVERTENCIA", "description": "WARNING (should stay in capitalized letters if the language permits)" }, "confirmVaultExport": { @@ -777,19 +819,16 @@ "message": "Enter your master password to export your vault data." }, "shared": { - "message": "Shared" + "message": "Compartido" }, - "learnOrg": { - "message": "Learn about organizations" - }, - "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?" + "bitwardenForBusinessPageDesc": { + "message": "Bitwarden for Business allows you to share your vault items with others by using an organization. Learn more on the bitwarden.com website." }, "moveToOrganization": { "message": "Move to organization" }, "share": { - "message": "Share" + "message": "Compartir" }, "movedItemToOrg": { "message": "$ITEMNAME$ moved to $ORGNAME$", @@ -808,58 +847,58 @@ "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." }, "learnMore": { - "message": "Learn more" + "message": "Máis información" }, "authenticatorKeyTotp": { - "message": "Authenticator key (TOTP)" + "message": "Clave de autenticación (TOTP)" }, "verificationCodeTotp": { - "message": "Verification code (TOTP)" + "message": "Código de verificación (TOTP)" }, "copyVerificationCode": { - "message": "Copy verification code" + "message": "Copiar código de verificación" }, "attachments": { - "message": "Attachments" + "message": "Anexos" }, "deleteAttachment": { - "message": "Delete attachment" + "message": "Eliminar anexos" }, "deleteAttachmentConfirmation": { - "message": "Are you sure you want to delete this attachment?" + "message": "Estás seguro de que queres eliminar este anexo?" }, "deletedAttachment": { - "message": "Attachment deleted" + "message": "Anexo eliminado" }, "newAttachment": { - "message": "Add new attachment" + "message": "Engadir novo anexo" }, "noAttachments": { - "message": "No attachments." + "message": "Sen anexos." }, "attachmentSaved": { - "message": "Attachment saved" + "message": "Anexo gardado" }, "file": { - "message": "File" + "message": "Ficheiro" }, "selectFile": { - "message": "Select a file" + "message": "Selecciona un ficheiro" }, "maxFileSize": { - "message": "Maximum file size is 500 MB." + "message": "O tamaño máximo de ficheiro é de 500 MB." }, "featureUnavailable": { - "message": "Feature unavailable" + "message": "Característica non dispoñible" }, "encryptionKeyMigrationRequired": { "message": "Encryption key migration required. Please login through the web vault to update your encryption key." }, "premiumMembership": { - "message": "Premium membership" + "message": "Membresía de luxo" }, "premiumManage": { - "message": "Manage membership" + "message": "Xestionar membresía" }, "premiumManageAlert": { "message": "You can manage your membership on the bitwarden.com web vault. Do you want to visit the website now?" @@ -952,7 +991,7 @@ } }, "rememberMe": { - "message": "Remember me" + "message": "Lémbrame" }, "sendVerificationCodeEmailAgain": { "message": "Send verification code email again" @@ -970,13 +1009,13 @@ "message": "To start the WebAuthn 2FA verification. Click the button below to open a new tab and follow the instructions provided in the new tab." }, "webAuthnNewTabOpen": { - "message": "Open new tab" + "message": "Abrir novo separador" }, "webAuthnAuthenticate": { - "message": "Authenticate WebAuthn" + "message": "Autenticar con WebAuthn" }, "loginUnavailable": { - "message": "Login unavailable" + "message": "Inicio de sesión non dispoñíbel" }, "noTwoStepProviders": { "message": "This account has two-step login set up, however, none of the configured two-step providers are supported by this web browser." @@ -985,16 +1024,16 @@ "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)." }, "twoStepOptions": { - "message": "Two-step login options" + "message": "Opcións de inicio de sesión en dous pasos" }, "recoveryCodeDesc": { "message": "Lost access to all of your two-factor providers? Use your recovery code to turn off all two-factor providers from your account." }, "recoveryCodeTitle": { - "message": "Recovery code" + "message": "Código de recuperación" }, "authenticatorAppTitle": { - "message": "Authenticator app" + "message": "Aplicación de autenticación" }, "authenticatorAppDesc": { "message": "Use an authenticator app (such as Authy or Google Authenticator) to generate time-based verification codes.", @@ -1021,43 +1060,43 @@ "message": "Use any WebAuthn compatible security key to access your account." }, "emailTitle": { - "message": "Email" + "message": "Correo electrónico" }, "emailDesc": { "message": "Verification codes will be emailed to you." }, "selfHostedEnvironment": { - "message": "Self-hosted environment" + "message": "Entorno de auto-aloxamento" }, "selfHostedEnvironmentFooter": { "message": "Specify the base URL of your on-premises hosted Bitwarden installation." }, "customEnvironment": { - "message": "Custom environment" + "message": "Entorno personalizado" }, "customEnvironmentFooter": { - "message": "For advanced users. You can specify the base URL of each service independently." + "message": "Para usuarios avanzados. Poder especificar o URL base de cada servizo de xeito independente." }, "baseUrl": { - "message": "Server URL" + "message": "URL do servidor" }, "apiUrl": { - "message": "API server URL" + "message": "URL do servidor da API" }, "webVaultUrl": { - "message": "Web vault server URL" + "message": "URL do servidor da caixa forte web" }, "identityUrl": { - "message": "Identity server URL" + "message": "URL do servidor de identidade" }, "notificationsUrl": { - "message": "Notifications server URL" + "message": "URL do servidor de notificacións" }, "iconsUrl": { - "message": "Icons server URL" + "message": "URL do servidor de iconas" }, "environmentSaved": { - "message": "Environment URLs saved" + "message": "URLs do entorno gardadas" }, "showAutoFillMenuOnFormFields": { "message": "Show auto-fill menu on form fields", @@ -1073,7 +1112,7 @@ "message": "Edit browser settings." }, "autofillOverlayVisibilityOff": { - "message": "Off", + "message": "Apagado", "description": "Overlay setting select option for disabling autofill overlay" }, "autofillOverlayVisibilityOnFieldFocus": { @@ -1130,35 +1169,35 @@ "message": "Lock the vault" }, "customFields": { - "message": "Custom fields" + "message": "Campos personalizados" }, "copyValue": { - "message": "Copy value" + "message": "Copiar valor" }, "value": { - "message": "Value" + "message": "Valor" }, "newCustomField": { - "message": "New custom field" + "message": "Novo campo personalizado" }, "dragToSort": { - "message": "Drag to sort" + "message": "Arrastra para ordenar" }, "cfTypeText": { - "message": "Text" + "message": "Texto" }, "cfTypeHidden": { - "message": "Hidden" + "message": "Agochado" }, "cfTypeBoolean": { - "message": "Boolean" + "message": "Booleano" }, "cfTypeLinked": { - "message": "Linked", + "message": "Vinculado", "description": "This describes a field that is 'linked' (tied) to another field." }, "linkedValue": { - "message": "Linked value", + "message": "Valor vinculado", "description": "This describes a value that is 'linked' (tied) to another value." }, "popup2faCloseMessage": { @@ -1183,76 +1222,76 @@ "message": "Indicate how many logins you have for the current web page." }, "cardholderName": { - "message": "Cardholder name" + "message": "Nome do titular da tarxeta" }, "number": { - "message": "Number" + "message": "Número" }, "brand": { - "message": "Brand" + "message": "Marca" }, "expirationMonth": { - "message": "Expiration month" + "message": "Mes de expiración" }, "expirationYear": { - "message": "Expiration year" + "message": "Ano de vencemento" }, "expiration": { - "message": "Expiration" + "message": "Vencemento" }, "january": { - "message": "January" + "message": "Xaneiro" }, "february": { - "message": "February" + "message": "Febreiro" }, "march": { - "message": "March" + "message": "Marzo" }, "april": { - "message": "April" + "message": "Abril" }, "may": { - "message": "May" + "message": "Maio" }, "june": { - "message": "June" + "message": "Xuño" }, "july": { - "message": "July" + "message": "Xullo" }, "august": { - "message": "August" + "message": "Agosto" }, "september": { - "message": "September" + "message": "Setembro" }, "october": { - "message": "October" + "message": "Outubro" }, "november": { - "message": "November" + "message": "Novembro" }, "december": { - "message": "December" + "message": "Decembro" }, "securityCode": { - "message": "Security code" + "message": "Código de seguridade" }, "ex": { "message": "ex." }, "title": { - "message": "Title" + "message": "Título" }, "mr": { - "message": "Mr" + "message": "Sr" }, "mrs": { - "message": "Mrs" + "message": "Sra" }, "ms": { - "message": "Ms" + "message": "Srta" }, "dr": { "message": "Dr" @@ -1261,112 +1300,112 @@ "message": "Mx" }, "firstName": { - "message": "First name" + "message": "Nome" }, "middleName": { - "message": "Middle name" + "message": "Segundo nome" }, "lastName": { - "message": "Last name" + "message": "Apelido" }, "fullName": { - "message": "Full name" + "message": "Nome completo" }, "identityName": { - "message": "Identity name" + "message": "Nome de identidade" }, "company": { - "message": "Company" + "message": "Empresa" }, "ssn": { - "message": "Social Security number" + "message": "Número da seguridade social" }, "passportNumber": { - "message": "Passport number" + "message": "Número de pasaporte" }, "licenseNumber": { - "message": "License number" + "message": "Número de licencia" }, "email": { - "message": "Email" + "message": "Correo electrónico" }, "phone": { - "message": "Phone" + "message": "Teléfono" }, "address": { - "message": "Address" + "message": "Enderezo" }, "address1": { - "message": "Address 1" + "message": "Enderezo 1" }, "address2": { - "message": "Address 2" + "message": "Enderezo 2" }, "address3": { - "message": "Address 3" + "message": "Enderezo 3" }, "cityTown": { - "message": "City / Town" + "message": "Localidade" }, "stateProvince": { - "message": "State / Province" + "message": "Estado / Provincia" }, "zipPostalCode": { - "message": "Zip / Postal code" + "message": "Código postal" }, "country": { - "message": "Country" + "message": "País" }, "type": { - "message": "Type" + "message": "Tipo" }, "typeLogin": { - "message": "Login" + "message": "Inicio de sesión" }, "typeLogins": { - "message": "Logins" + "message": "Inicios se sesión" }, "typeSecureNote": { - "message": "Secure note" + "message": "Nota segura" }, "typeCard": { - "message": "Card" + "message": "Tarxeta" }, "typeIdentity": { - "message": "Identity" + "message": "Identidade" }, "passwordHistory": { - "message": "Password history" + "message": "Historial de contrasinais" }, "back": { - "message": "Back" + "message": "Atrás" }, "collections": { - "message": "Collections" + "message": "Coleccións" }, "favorites": { - "message": "Favorites" + "message": "Favoritos" }, "popOutNewWindow": { "message": "Pop out to a new window" }, "refresh": { - "message": "Refresh" + "message": "Actualizar" }, "cards": { - "message": "Cards" + "message": "Tarxetas" }, "identities": { - "message": "Identities" + "message": "Identidades" }, "logins": { - "message": "Logins" + "message": "Inicios de sesión" }, "secureNotes": { - "message": "Secure notes" + "message": "Notas seguras" }, "clear": { - "message": "Clear", + "message": "Limpar", "description": "To clear something out. example: To clear browser history." }, "checkPassword": { @@ -1385,25 +1424,25 @@ "message": "This password was not found in any known data breaches. It should be safe to use." }, "baseDomain": { - "message": "Base domain", + "message": "Dominio base", "description": "Domain name. Ex. website.com" }, "domainName": { - "message": "Domain name", + "message": "Nome de dominio", "description": "Domain name. Ex. website.com" }, "host": { - "message": "Host", + "message": "Anfitrión", "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": "Exacto" }, "startsWith": { - "message": "Starts with" + "message": "Comeza por" }, "regEx": { - "message": "Regular expression", + "message": "Expresión regular", "description": "A programming term, also known as 'RegEx'." }, "matchDetection": { @@ -1422,38 +1461,38 @@ "description": "Toggle the display of the URIs of the currently open tabs in the browser." }, "currentUri": { - "message": "Current URI", + "message": "URI actual", "description": "The URI of one of the current open tabs in the browser." }, "organization": { - "message": "Organization", + "message": "Organización", "description": "An entity of multiple related people (ex. a team or business organization)." }, "types": { - "message": "Types" + "message": "Tipos" }, "allItems": { - "message": "All items" + "message": "Todos os elementos" }, "noPasswordsInList": { - "message": "There are no passwords to list." + "message": "Non hai contrasinais que listar." }, "remove": { - "message": "Remove" + "message": "Eliminar" }, "default": { - "message": "Default" + "message": "Por defecto" }, "dateUpdated": { - "message": "Updated", + "message": "Actualizado", "description": "ex. Date this item was updated" }, "dateCreated": { - "message": "Created", + "message": "Creado", "description": "ex. Date this item was created" }, "datePasswordUpdated": { - "message": "Password updated", + "message": "Contrasinal actualizado", "description": "ex. Date this password was updated" }, "neverLockWarning": { @@ -1466,25 +1505,25 @@ "message": "There are no collections to list." }, "ownership": { - "message": "Ownership" + "message": "Propiedade" }, "whoOwnsThisItem": { - "message": "Who owns this item?" + "message": "Quen posúe este elemento?" }, "strong": { - "message": "Strong", + "message": "Forte", "description": "ex. A strong password. Scale: Weak -> Good -> Strong" }, "good": { - "message": "Good", + "message": "Boa", "description": "ex. A good password. Scale: Weak -> Good -> Strong" }, "weak": { - "message": "Weak", + "message": "Feble", "description": "ex. A weak password. Scale: Weak -> Good -> Strong" }, "weakMasterPassword": { - "message": "Weak master password" + "message": "Contrasinal mestre feble" }, "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?" @@ -1524,10 +1563,10 @@ "message": "You must select at least one collection." }, "cloneItem": { - "message": "Clone item" + "message": "Clonar elemento" }, "clone": { - "message": "Clone" + "message": "Clonar" }, "passwordGeneratorPolicyInEffect": { "message": "One or more organization policies are affecting your generator settings." @@ -1536,11 +1575,11 @@ "message": "Vault timeout action" }, "lock": { - "message": "Lock", + "message": "Bloquear", "description": "Verb form: to make secure or inaccesible by" }, "trash": { - "message": "Trash", + "message": "Lixo", "description": "Noun: a special folder to hold deleted items" }, "searchTrash": { @@ -1714,6 +1753,12 @@ "biometricsNotSupportedDesc": { "message": "Browser biometrics is not supported on this device." }, + "biometricsNotUnlockedTitle": { + "message": "User locked or logged out" + }, + "biometricsNotUnlockedDesc": { + "message": "Please unlock this user in the desktop application and try again." + }, "biometricsFailedTitle": { "message": "Biometrics failed" }, @@ -1764,21 +1809,21 @@ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "searchSends": { - "message": "Search Sends", + "message": "Buscar Sends", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "addSend": { - "message": "Add Send", + "message": "Engadir Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendTypeText": { - "message": "Text" + "message": "Texto" }, "sendTypeFile": { - "message": "File" + "message": "Ficheiro" }, "allSends": { - "message": "All Sends", + "message": "Todos os Sends", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "maxAccessCountReached": { @@ -1786,7 +1831,7 @@ "description": "This text will be displayed after a Send has been accessed the maximum amount of times." }, "expired": { - "message": "Expired" + "message": "Caducado" }, "pendingDeletion": { "message": "Pending deletion" @@ -1795,24 +1840,24 @@ "message": "Password protected" }, "copySendLink": { - "message": "Copy Send link", + "message": "Copiar ligazón Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "removePassword": { "message": "Remove Password" }, "delete": { - "message": "Delete" + "message": "Eliminar" }, "removedPassword": { "message": "Password removed" }, "deletedSend": { - "message": "Send deleted", + "message": "Send 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": "Ligazón Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "disabled": { @@ -1822,7 +1867,7 @@ "message": "Are you sure you want to remove the password?" }, "deleteSend": { - "message": "Delete Send", + "message": "Eliminar Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "deleteSendConfirmation": { @@ -1830,7 +1875,7 @@ "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 Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendTypeHeader": { @@ -1859,10 +1904,10 @@ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "oneDay": { - "message": "1 day" + "message": "1 día" }, "days": { - "message": "$DAYS$ days", + "message": "$DAYS$ días", "placeholders": { "days": { "content": "$1", @@ -1871,7 +1916,7 @@ } }, "custom": { - "message": "Custom" + "message": "Personalizado" }, "maximumAccessCount": { "message": "Maximum Access Count" @@ -1907,14 +1952,14 @@ "message": "Current access count" }, "createSend": { - "message": "New Send", + "message": "Novo Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "newPassword": { - "message": "New password" + "message": "Novo contrasinal" }, "sendDisabled": { - "message": "Send removed", + "message": "Send eliminado", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendDisabledWarning": { @@ -1922,11 +1967,11 @@ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "createdSend": { - "message": "Send created", + "message": "Send creado", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "editedSend": { - "message": "Send saved", + "message": "Send gardado", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendLinuxChromiumFileWarning": { @@ -2027,10 +2072,10 @@ "description": "Default title for the user verification dialog." }, "hours": { - "message": "Hours" + "message": "Horas" }, "minutes": { - "message": "Minutes" + "message": "Minutos" }, "vaultTimeoutPolicyInEffect": { "message": "Your organization policies have set your maximum allowed vault timeout to $HOURS$ hour(s) and $MINUTES$ minute(s).", @@ -2129,7 +2174,7 @@ } }, "error": { - "message": "Error" + "message": "Erro" }, "regenerateUsername": { "message": "Regenerate username" @@ -2154,13 +2199,13 @@ "message": "Use your domain's configured catch-all inbox." }, "random": { - "message": "Random" + "message": "Aleatorio" }, "randomWord": { - "message": "Random word" + "message": "Palabra aleatoria" }, "websiteName": { - "message": "Website name" + "message": "Nome do sitio web" }, "whatWouldYouLikeToGenerate": { "message": "What would you like to generate?" @@ -2177,15 +2222,117 @@ "forwardedEmailDesc": { "message": "Generate an email alias with an external forwarding service." }, + "forwarderError": { + "message": "$SERVICENAME$ error: $ERRORMESSAGE$", + "description": "Reports an error returned by a forwarding service to the user.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + }, + "errormessage": { + "content": "$2", + "example": "Invalid characters in domain name." + } + } + }, + "forwarderGeneratedBy": { + "message": "Generated by Bitwarden.", + "description": "Displayed with the address on the forwarding service's configuration screen." + }, + "forwarderGeneratedByWithWebsite": { + "message": "Website: $WEBSITE$. Generated by Bitwarden.", + "description": "Displayed with the address on the forwarding service's configuration screen.", + "placeholders": { + "WEBSITE": { + "content": "$1", + "example": "www.example.com" + } + } + }, + "forwaderInvalidToken": { + "message": "Invalid $SERVICENAME$ API token", + "description": "Displayed when the user's API token is empty or rejected by the forwarding service.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwaderInvalidTokenWithMessage": { + "message": "Invalid $SERVICENAME$ API token: $ERRORMESSAGE$", + "description": "Displayed when the user's API token is rejected by the forwarding service with an error message.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + }, + "errormessage": { + "content": "$2", + "example": "Please verify your email address to continue." + } + } + }, + "forwarderNoAccountId": { + "message": "Unable to obtain $SERVICENAME$ masked email account ID.", + "description": "Displayed when the forwarding service fails to return an account ID.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderNoDomain": { + "message": "Invalid $SERVICENAME$ domain.", + "description": "Displayed when the domain is empty or domain authorization failed at the forwarding service.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderNoUrl": { + "message": "Invalid $SERVICENAME$ url.", + "description": "Displayed when the url of the forwarding service wasn't supplied.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderUnknownError": { + "message": "Unknown $SERVICENAME$ error occurred.", + "description": "Displayed when the forwarding service failed due to an unknown error.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderUnknownForwarder": { + "message": "Unknown forwarder: '$SERVICENAME$'.", + "description": "Displayed when the forwarding service is not supported.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "JustTrust.us" + } + } + }, "hostname": { - "message": "Hostname", + "message": "Nome do anfitrión", "description": "Part of a URL." }, "apiAccessToken": { - "message": "API Access Token" + "message": "Token de acceso á API" }, "apiKey": { - "message": "API Key" + "message": "Clave da API" }, "ssoKeyConnectorError": { "message": "Key connector error: make sure key connector is available and working correctly." @@ -2221,7 +2368,7 @@ "message": "Server version" }, "selfHostedServer": { - "message": "self-hosted" + "message": "autoaloxado" }, "thirdParty": { "message": "Third-party" @@ -2389,17 +2536,17 @@ "message": "Organization SSO identifier is required." }, "eu": { - "message": "EU", + "message": "UE", "description": "European Union" }, "accessDenied": { "message": "Access denied. You do not have permission to view this page." }, "general": { - "message": "General" + "message": "Xeral" }, "display": { - "message": "Display" + "message": "Amosar" }, "accountSuccessfullyCreated": { "message": "Account successfully created!" @@ -3019,7 +3166,7 @@ "message": "Notice: Unassigned organization items are no longer visible in the All Vaults view and only accessible via the Admin Console." }, "unassignedItemsBannerSelfHostNotice": { - "message": "Notice: On May 16, 2024, unassigned organization items will no longer be visible in the All Vaults view and will only be accessible via the Admin Console." + "message": "Aviso: O 16 de maio de 2024, os elementos de organización non asignados non serán visíbeis na vista de Todas as caixas fortes e só serán accesíbeis a través da Consola de Administrador." }, "unassignedItemsBannerCTAPartOne": { "message": "Assign these items to a collection from the", @@ -3029,6 +3176,41 @@ "message": "to make them visible.", "description": "This will be part of a larger sentence, which will read like so: Assign these items to a collection from the Admin Console to make them visible." }, + "autofillSuggestions": { + "message": "Auto-fill suggestions" + }, + "autofillSuggestionsTip": { + "message": "Save a login item for this site to auto-fill" + }, + "yourVaultIsEmpty": { + "message": "Your vault is empty" + }, + "noItemsMatchSearch": { + "message": "No items match your search" + }, + "clearFiltersOrTryAnother": { + "message": "Clear filters or try another search term" + }, + "copyInfo": { + "message": "Copy info, $ITEMNAME$", + "description": "Aria label for a button that opens a menu with options to copy information from an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "moreOptions": { + "message": "More options, $ITEMNAME$", + "description": "Aria label for a button that opens a menu with more options for an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, "adminConsole": { "message": "Admin Console" }, @@ -3046,5 +3228,38 @@ }, "errorAssigningTargetFolder": { "message": "Error assigning target folder." + }, + "viewItemsIn": { + "message": "View items in $NAME$", + "description": "Button to view the contents of a folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "backTo": { + "message": "Back to $NAME$", + "description": "Navigate back to a previous folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "new": { + "message": "New" + }, + "removeItem": { + "message": "Remove $NAME$", + "description": "Remove a selected option, such as a folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } } } diff --git a/apps/browser/src/_locales/he/messages.json b/apps/browser/src/_locales/he/messages.json index d8b9b1ec9ee..3a31c9f4edf 100644 --- a/apps/browser/src/_locales/he/messages.json +++ b/apps/browser/src/_locales/he/messages.json @@ -166,15 +166,21 @@ "confirmIdentity": { "message": "יש לאשר את זהותך כדי להמשיך." }, - "account": { - "message": "חשבון" - }, "changeMasterPassword": { "message": "החלף סיסמה ראשית" }, "continueToWebApp": { "message": "Continue to web app?" }, + "continueToWebAppDesc": { + "message": "Explore more features of your Bitwarden account on the web app." + }, + "continueToHelpCenter": { + "message": "Continue to Help Center?" + }, + "continueToHelpCenterDesc": { + "message": "Learn more about how to use Bitwarden on the Help Center." + }, "changeMasterPasswordOnWebConfirmation": { "message": "You can change your master password on the Bitwarden web app." }, @@ -192,9 +198,45 @@ "logOut": { "message": "התנתק" }, + "aboutBitwarden": { + "message": "About Bitwarden" + }, "about": { "message": "אודות" }, + "moreFromBitwarden": { + "message": "More from Bitwarden" + }, + "continueToBitwardenDotCom": { + "message": "Continue to bitwarden.com?" + }, + "bitwardenForBusiness": { + "message": "Bitwarden for Business" + }, + "bitwardenAuthenticator": { + "message": "Bitwarden Authenticator" + }, + "continueToAuthenticatorPageDesc": { + "message": "Bitwarden Authenticator allows you to store authenticator keys and generate TOTP codes for 2-step verification flows. Learn more on the bitwarden.com website" + }, + "bitwardenSecretsManager": { + "message": "Bitwarden Secrets Manager" + }, + "continueToSecretsManagerPageDesc": { + "message": "Securely store, manage, and share developer secrets with Bitwarden Secrets Manager. Learn more on the bitwarden.com website." + }, + "passwordlessDotDev": { + "message": "Passwordless.dev" + }, + "continueToPasswordlessDotDevPageDesc": { + "message": "Create smooth and secure login experiences free from traditional passwords with Passwordless.dev. Learn more on the bitwarden.com website." + }, + "freeBitwardenFamilies": { + "message": "Free Bitwarden Families" + }, + "freeBitwardenFamiliesPageDesc": { + "message": "You are eligible for Free Bitwarden Families. Redeem this offer today in the web app." + }, "version": { "message": "גירסה" }, @@ -253,8 +295,8 @@ "passGenInfo": { "message": "צור אוטומטית סיסמאות חזקות ויחודיות עבור פרטי הכניסה שלך." }, - "bitWebVault": { - "message": "כספת באתר Bitwarden" + "bitWebVaultApp": { + "message": "Bitwarden web app" }, "importItems": { "message": "יבא פריטים" @@ -779,11 +821,8 @@ "shared": { "message": "משותף" }, - "learnOrg": { - "message": "מידע על ארגונים" - }, - "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?" + "bitwardenForBusinessPageDesc": { + "message": "Bitwarden for Business allows you to share your vault items with others by using an organization. Learn more on the bitwarden.com website." }, "moveToOrganization": { "message": "Move to organization" @@ -1714,6 +1753,12 @@ "biometricsNotSupportedDesc": { "message": "מכשיר זה לא תומך בזיהוי ביומטרי בדפדפן." }, + "biometricsNotUnlockedTitle": { + "message": "User locked or logged out" + }, + "biometricsNotUnlockedDesc": { + "message": "Please unlock this user in the desktop application and try again." + }, "biometricsFailedTitle": { "message": "Biometrics failed" }, @@ -2177,6 +2222,108 @@ "forwardedEmailDesc": { "message": "יצירת כינוי דוא״ל עם שירות העברה חיצוני." }, + "forwarderError": { + "message": "$SERVICENAME$ error: $ERRORMESSAGE$", + "description": "Reports an error returned by a forwarding service to the user.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + }, + "errormessage": { + "content": "$2", + "example": "Invalid characters in domain name." + } + } + }, + "forwarderGeneratedBy": { + "message": "Generated by Bitwarden.", + "description": "Displayed with the address on the forwarding service's configuration screen." + }, + "forwarderGeneratedByWithWebsite": { + "message": "Website: $WEBSITE$. Generated by Bitwarden.", + "description": "Displayed with the address on the forwarding service's configuration screen.", + "placeholders": { + "WEBSITE": { + "content": "$1", + "example": "www.example.com" + } + } + }, + "forwaderInvalidToken": { + "message": "Invalid $SERVICENAME$ API token", + "description": "Displayed when the user's API token is empty or rejected by the forwarding service.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwaderInvalidTokenWithMessage": { + "message": "Invalid $SERVICENAME$ API token: $ERRORMESSAGE$", + "description": "Displayed when the user's API token is rejected by the forwarding service with an error message.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + }, + "errormessage": { + "content": "$2", + "example": "Please verify your email address to continue." + } + } + }, + "forwarderNoAccountId": { + "message": "Unable to obtain $SERVICENAME$ masked email account ID.", + "description": "Displayed when the forwarding service fails to return an account ID.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderNoDomain": { + "message": "Invalid $SERVICENAME$ domain.", + "description": "Displayed when the domain is empty or domain authorization failed at the forwarding service.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderNoUrl": { + "message": "Invalid $SERVICENAME$ url.", + "description": "Displayed when the url of the forwarding service wasn't supplied.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderUnknownError": { + "message": "Unknown $SERVICENAME$ error occurred.", + "description": "Displayed when the forwarding service failed due to an unknown error.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderUnknownForwarder": { + "message": "Unknown forwarder: '$SERVICENAME$'.", + "description": "Displayed when the forwarding service is not supported.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "JustTrust.us" + } + } + }, "hostname": { "message": "שם מארח", "description": "Part of a URL." @@ -3029,6 +3176,41 @@ "message": "to make them visible.", "description": "This will be part of a larger sentence, which will read like so: Assign these items to a collection from the Admin Console to make them visible." }, + "autofillSuggestions": { + "message": "Auto-fill suggestions" + }, + "autofillSuggestionsTip": { + "message": "Save a login item for this site to auto-fill" + }, + "yourVaultIsEmpty": { + "message": "Your vault is empty" + }, + "noItemsMatchSearch": { + "message": "No items match your search" + }, + "clearFiltersOrTryAnother": { + "message": "Clear filters or try another search term" + }, + "copyInfo": { + "message": "Copy info, $ITEMNAME$", + "description": "Aria label for a button that opens a menu with options to copy information from an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "moreOptions": { + "message": "More options, $ITEMNAME$", + "description": "Aria label for a button that opens a menu with more options for an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, "adminConsole": { "message": "Admin Console" }, @@ -3046,5 +3228,38 @@ }, "errorAssigningTargetFolder": { "message": "Error assigning target folder." + }, + "viewItemsIn": { + "message": "View items in $NAME$", + "description": "Button to view the contents of a folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "backTo": { + "message": "Back to $NAME$", + "description": "Navigate back to a previous folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "new": { + "message": "New" + }, + "removeItem": { + "message": "Remove $NAME$", + "description": "Remove a selected option, such as a folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } } } diff --git a/apps/browser/src/_locales/hi/messages.json b/apps/browser/src/_locales/hi/messages.json index 8b08a8a5c21..f70d97e3406 100644 --- a/apps/browser/src/_locales/hi/messages.json +++ b/apps/browser/src/_locales/hi/messages.json @@ -166,15 +166,21 @@ "confirmIdentity": { "message": "आगे बढ़ने के लिए अपने पहचान की पुष्टि करें" }, - "account": { - "message": "खाता" - }, "changeMasterPassword": { "message": "Change Master Password" }, "continueToWebApp": { "message": "Continue to web app?" }, + "continueToWebAppDesc": { + "message": "Explore more features of your Bitwarden account on the web app." + }, + "continueToHelpCenter": { + "message": "Continue to Help Center?" + }, + "continueToHelpCenterDesc": { + "message": "Learn more about how to use Bitwarden on the Help Center." + }, "changeMasterPasswordOnWebConfirmation": { "message": "You can change your master password on the Bitwarden web app." }, @@ -192,9 +198,45 @@ "logOut": { "message": "Log Out" }, + "aboutBitwarden": { + "message": "About Bitwarden" + }, "about": { "message": "जानकारी" }, + "moreFromBitwarden": { + "message": "More from Bitwarden" + }, + "continueToBitwardenDotCom": { + "message": "Continue to bitwarden.com?" + }, + "bitwardenForBusiness": { + "message": "Bitwarden for Business" + }, + "bitwardenAuthenticator": { + "message": "Bitwarden Authenticator" + }, + "continueToAuthenticatorPageDesc": { + "message": "Bitwarden Authenticator allows you to store authenticator keys and generate TOTP codes for 2-step verification flows. Learn more on the bitwarden.com website" + }, + "bitwardenSecretsManager": { + "message": "Bitwarden Secrets Manager" + }, + "continueToSecretsManagerPageDesc": { + "message": "Securely store, manage, and share developer secrets with Bitwarden Secrets Manager. Learn more on the bitwarden.com website." + }, + "passwordlessDotDev": { + "message": "Passwordless.dev" + }, + "continueToPasswordlessDotDevPageDesc": { + "message": "Create smooth and secure login experiences free from traditional passwords with Passwordless.dev. Learn more on the bitwarden.com website." + }, + "freeBitwardenFamilies": { + "message": "Free Bitwarden Families" + }, + "freeBitwardenFamiliesPageDesc": { + "message": "You are eligible for Free Bitwarden Families. Redeem this offer today in the web app." + }, "version": { "message": "संस्करण" }, @@ -253,8 +295,8 @@ "passGenInfo": { "message": "स्वचालित रूप से अपने लॉगिन के लिए मजबूत, अद्वितीय पासवर्ड उत्पन्न करते हैं।" }, - "bitWebVault": { - "message": "bitwarden Web Vault" + "bitWebVaultApp": { + "message": "Bitwarden web app" }, "importItems": { "message": "Import Items" @@ -779,11 +821,8 @@ "shared": { "message": "साझा किया गया" }, - "learnOrg": { - "message": "संगठनों के बारे में जानें" - }, - "learnOrgConfirmation": { - "message": "बिटवर्डन आपको एक संगठन का उपयोग करके अपनी तिजोरी वस्तुओं को दूसरों के साथ साझा करने की अनुमति देता है।क्या आप अधिक जानने के लिए bitwarden.com वेबसाइट पर जाना चाहेंगे?" + "bitwardenForBusinessPageDesc": { + "message": "Bitwarden for Business allows you to share your vault items with others by using an organization. Learn more on the bitwarden.com website." }, "moveToOrganization": { "message": "संगठन में ले जाएँ" @@ -1714,6 +1753,12 @@ "biometricsNotSupportedDesc": { "message": "ब्राउज़र बॉयोमीट्रिक्स इस डिवाइस पर समर्थित नहीं है।" }, + "biometricsNotUnlockedTitle": { + "message": "User locked or logged out" + }, + "biometricsNotUnlockedDesc": { + "message": "Please unlock this user in the desktop application and try again." + }, "biometricsFailedTitle": { "message": "Biometrics failed" }, @@ -2177,6 +2222,108 @@ "forwardedEmailDesc": { "message": "Generate an email alias with an external forwarding service." }, + "forwarderError": { + "message": "$SERVICENAME$ error: $ERRORMESSAGE$", + "description": "Reports an error returned by a forwarding service to the user.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + }, + "errormessage": { + "content": "$2", + "example": "Invalid characters in domain name." + } + } + }, + "forwarderGeneratedBy": { + "message": "Generated by Bitwarden.", + "description": "Displayed with the address on the forwarding service's configuration screen." + }, + "forwarderGeneratedByWithWebsite": { + "message": "Website: $WEBSITE$. Generated by Bitwarden.", + "description": "Displayed with the address on the forwarding service's configuration screen.", + "placeholders": { + "WEBSITE": { + "content": "$1", + "example": "www.example.com" + } + } + }, + "forwaderInvalidToken": { + "message": "Invalid $SERVICENAME$ API token", + "description": "Displayed when the user's API token is empty or rejected by the forwarding service.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwaderInvalidTokenWithMessage": { + "message": "Invalid $SERVICENAME$ API token: $ERRORMESSAGE$", + "description": "Displayed when the user's API token is rejected by the forwarding service with an error message.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + }, + "errormessage": { + "content": "$2", + "example": "Please verify your email address to continue." + } + } + }, + "forwarderNoAccountId": { + "message": "Unable to obtain $SERVICENAME$ masked email account ID.", + "description": "Displayed when the forwarding service fails to return an account ID.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderNoDomain": { + "message": "Invalid $SERVICENAME$ domain.", + "description": "Displayed when the domain is empty or domain authorization failed at the forwarding service.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderNoUrl": { + "message": "Invalid $SERVICENAME$ url.", + "description": "Displayed when the url of the forwarding service wasn't supplied.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderUnknownError": { + "message": "Unknown $SERVICENAME$ error occurred.", + "description": "Displayed when the forwarding service failed due to an unknown error.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderUnknownForwarder": { + "message": "Unknown forwarder: '$SERVICENAME$'.", + "description": "Displayed when the forwarding service is not supported.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "JustTrust.us" + } + } + }, "hostname": { "message": "Hostname", "description": "Part of a URL." @@ -3029,6 +3176,41 @@ "message": "to make them visible.", "description": "This will be part of a larger sentence, which will read like so: Assign these items to a collection from the Admin Console to make them visible." }, + "autofillSuggestions": { + "message": "Auto-fill suggestions" + }, + "autofillSuggestionsTip": { + "message": "Save a login item for this site to auto-fill" + }, + "yourVaultIsEmpty": { + "message": "Your vault is empty" + }, + "noItemsMatchSearch": { + "message": "No items match your search" + }, + "clearFiltersOrTryAnother": { + "message": "Clear filters or try another search term" + }, + "copyInfo": { + "message": "Copy info, $ITEMNAME$", + "description": "Aria label for a button that opens a menu with options to copy information from an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "moreOptions": { + "message": "More options, $ITEMNAME$", + "description": "Aria label for a button that opens a menu with more options for an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, "adminConsole": { "message": "Admin Console" }, @@ -3046,5 +3228,38 @@ }, "errorAssigningTargetFolder": { "message": "Error assigning target folder." + }, + "viewItemsIn": { + "message": "View items in $NAME$", + "description": "Button to view the contents of a folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "backTo": { + "message": "Back to $NAME$", + "description": "Navigate back to a previous folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "new": { + "message": "New" + }, + "removeItem": { + "message": "Remove $NAME$", + "description": "Remove a selected option, such as a folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } } } diff --git a/apps/browser/src/_locales/hr/messages.json b/apps/browser/src/_locales/hr/messages.json index d00e32b1397..9a4419c77ba 100644 --- a/apps/browser/src/_locales/hr/messages.json +++ b/apps/browser/src/_locales/hr/messages.json @@ -166,15 +166,21 @@ "confirmIdentity": { "message": "Potvrdite lozinku za nastavak." }, - "account": { - "message": "Račun" - }, "changeMasterPassword": { "message": "Promjeni glavnu lozinku" }, "continueToWebApp": { "message": "Continue to web app?" }, + "continueToWebAppDesc": { + "message": "Explore more features of your Bitwarden account on the web app." + }, + "continueToHelpCenter": { + "message": "Continue to Help Center?" + }, + "continueToHelpCenterDesc": { + "message": "Learn more about how to use Bitwarden on the Help Center." + }, "changeMasterPasswordOnWebConfirmation": { "message": "You can change your master password on the Bitwarden web app." }, @@ -192,9 +198,45 @@ "logOut": { "message": "Odjava" }, + "aboutBitwarden": { + "message": "About Bitwarden" + }, "about": { "message": "O aplikaciji" }, + "moreFromBitwarden": { + "message": "More from Bitwarden" + }, + "continueToBitwardenDotCom": { + "message": "Continue to bitwarden.com?" + }, + "bitwardenForBusiness": { + "message": "Bitwarden for Business" + }, + "bitwardenAuthenticator": { + "message": "Bitwarden Authenticator" + }, + "continueToAuthenticatorPageDesc": { + "message": "Bitwarden Authenticator allows you to store authenticator keys and generate TOTP codes for 2-step verification flows. Learn more on the bitwarden.com website" + }, + "bitwardenSecretsManager": { + "message": "Bitwarden Secrets Manager" + }, + "continueToSecretsManagerPageDesc": { + "message": "Securely store, manage, and share developer secrets with Bitwarden Secrets Manager. Learn more on the bitwarden.com website." + }, + "passwordlessDotDev": { + "message": "Passwordless.dev" + }, + "continueToPasswordlessDotDevPageDesc": { + "message": "Create smooth and secure login experiences free from traditional passwords with Passwordless.dev. Learn more on the bitwarden.com website." + }, + "freeBitwardenFamilies": { + "message": "Free Bitwarden Families" + }, + "freeBitwardenFamiliesPageDesc": { + "message": "You are eligible for Free Bitwarden Families. Redeem this offer today in the web app." + }, "version": { "message": "Verzija" }, @@ -253,8 +295,8 @@ "passGenInfo": { "message": "Automatski generiraj jake, jedinstvene lozinke." }, - "bitWebVault": { - "message": "Bitwarden web trezor" + "bitWebVaultApp": { + "message": "Bitwarden web app" }, "importItems": { "message": "Uvoz stavki" @@ -779,11 +821,8 @@ "shared": { "message": "Dijeljeno" }, - "learnOrg": { - "message": "Više o organizacijama" - }, - "learnOrgConfirmation": { - "message": "Bitwarden omogućuje dijeljenje trezora s drugima pomoću organizacijskog računa. Želiš li sada posjetiti bitwarden.com za više informacija?" + "bitwardenForBusinessPageDesc": { + "message": "Bitwarden for Business allows you to share your vault items with others by using an organization. Learn more on the bitwarden.com website." }, "moveToOrganization": { "message": "Premjesti u organizaciju" @@ -1714,6 +1753,12 @@ "biometricsNotSupportedDesc": { "message": "Biometrija preglednika nije podržana na ovom uređaju." }, + "biometricsNotUnlockedTitle": { + "message": "User locked or logged out" + }, + "biometricsNotUnlockedDesc": { + "message": "Please unlock this user in the desktop application and try again." + }, "biometricsFailedTitle": { "message": "Biometrija neuspješna" }, @@ -2177,6 +2222,108 @@ "forwardedEmailDesc": { "message": "Generiraj pseudonim e-pošte s vanjskom uslugom prosljeđivanja." }, + "forwarderError": { + "message": "$SERVICENAME$ error: $ERRORMESSAGE$", + "description": "Reports an error returned by a forwarding service to the user.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + }, + "errormessage": { + "content": "$2", + "example": "Invalid characters in domain name." + } + } + }, + "forwarderGeneratedBy": { + "message": "Generated by Bitwarden.", + "description": "Displayed with the address on the forwarding service's configuration screen." + }, + "forwarderGeneratedByWithWebsite": { + "message": "Website: $WEBSITE$. Generated by Bitwarden.", + "description": "Displayed with the address on the forwarding service's configuration screen.", + "placeholders": { + "WEBSITE": { + "content": "$1", + "example": "www.example.com" + } + } + }, + "forwaderInvalidToken": { + "message": "Invalid $SERVICENAME$ API token", + "description": "Displayed when the user's API token is empty or rejected by the forwarding service.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwaderInvalidTokenWithMessage": { + "message": "Invalid $SERVICENAME$ API token: $ERRORMESSAGE$", + "description": "Displayed when the user's API token is rejected by the forwarding service with an error message.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + }, + "errormessage": { + "content": "$2", + "example": "Please verify your email address to continue." + } + } + }, + "forwarderNoAccountId": { + "message": "Unable to obtain $SERVICENAME$ masked email account ID.", + "description": "Displayed when the forwarding service fails to return an account ID.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderNoDomain": { + "message": "Invalid $SERVICENAME$ domain.", + "description": "Displayed when the domain is empty or domain authorization failed at the forwarding service.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderNoUrl": { + "message": "Invalid $SERVICENAME$ url.", + "description": "Displayed when the url of the forwarding service wasn't supplied.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderUnknownError": { + "message": "Unknown $SERVICENAME$ error occurred.", + "description": "Displayed when the forwarding service failed due to an unknown error.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderUnknownForwarder": { + "message": "Unknown forwarder: '$SERVICENAME$'.", + "description": "Displayed when the forwarding service is not supported.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "JustTrust.us" + } + } + }, "hostname": { "message": "Naziv poslužitelja", "description": "Part of a URL." @@ -3029,6 +3176,41 @@ "message": "to make them visible.", "description": "This will be part of a larger sentence, which will read like so: Assign these items to a collection from the Admin Console to make them visible." }, + "autofillSuggestions": { + "message": "Auto-fill suggestions" + }, + "autofillSuggestionsTip": { + "message": "Save a login item for this site to auto-fill" + }, + "yourVaultIsEmpty": { + "message": "Your vault is empty" + }, + "noItemsMatchSearch": { + "message": "No items match your search" + }, + "clearFiltersOrTryAnother": { + "message": "Clear filters or try another search term" + }, + "copyInfo": { + "message": "Copy info, $ITEMNAME$", + "description": "Aria label for a button that opens a menu with options to copy information from an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "moreOptions": { + "message": "More options, $ITEMNAME$", + "description": "Aria label for a button that opens a menu with more options for an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, "adminConsole": { "message": "Admin Console" }, @@ -3046,5 +3228,38 @@ }, "errorAssigningTargetFolder": { "message": "Error assigning target folder." + }, + "viewItemsIn": { + "message": "View items in $NAME$", + "description": "Button to view the contents of a folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "backTo": { + "message": "Back to $NAME$", + "description": "Navigate back to a previous folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "new": { + "message": "New" + }, + "removeItem": { + "message": "Remove $NAME$", + "description": "Remove a selected option, such as a folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } } } diff --git a/apps/browser/src/_locales/hu/messages.json b/apps/browser/src/_locales/hu/messages.json index 65342fa51b0..d5276f341e6 100644 --- a/apps/browser/src/_locales/hu/messages.json +++ b/apps/browser/src/_locales/hu/messages.json @@ -166,15 +166,21 @@ "confirmIdentity": { "message": "A folytatáshoz meg kell erősíteni a személyazonosságot." }, - "account": { - "message": "Fiók" - }, "changeMasterPassword": { "message": "Mesterjelszó módosítása" }, "continueToWebApp": { "message": "Tovább a webes alkalmazáshoz?" }, + "continueToWebAppDesc": { + "message": "Fedezzük fel a Bitwarden-fiók további funkcióit a webalkalmazásban." + }, + "continueToHelpCenter": { + "message": "Tovább a Segítség Központhoz?" + }, + "continueToHelpCenterDesc": { + "message": "További információ a Bitwarden használatáról a Segítség Központban." + }, "changeMasterPasswordOnWebConfirmation": { "message": "A mesterjelszó a Bitwarden webalkalmazásban módosítható." }, @@ -192,9 +198,45 @@ "logOut": { "message": "Kijelentkezés" }, + "aboutBitwarden": { + "message": "Bitwarden névjegy" + }, "about": { "message": "Névjegy" }, + "moreFromBitwarden": { + "message": "További infó a Bitwardenről" + }, + "continueToBitwardenDotCom": { + "message": "Folytatás a bitwarden.com webhelyen?" + }, + "bitwardenForBusiness": { + "message": "Bitwarden for Business" + }, + "bitwardenAuthenticator": { + "message": "Bitwarden Authenticator" + }, + "continueToAuthenticatorPageDesc": { + "message": "A Bitwarden Authenticator lehetővé teszi hitelesítő kulcsok tárolását és TOTP-kódok generálását a kétlépcsős ellenőrzési folyamatokhoz. Tudjunk meg többet a bitwarden.com webhelyen." + }, + "bitwardenSecretsManager": { + "message": "Bitwarden Secrets Manager" + }, + "continueToSecretsManagerPageDesc": { + "message": "Biztonságosan tárolhatjuk, kezelhetjük és megoszthatjuk a fejlesztői titkos adatokat a Bitwarden Secrets Manager segítségével. Tudjunk meg többet a bitwarden.com webhelyen." + }, + "passwordlessDotDev": { + "message": "Passwordless.dev" + }, + "continueToPasswordlessDotDevPageDesc": { + "message": "Hozzunk létre zökkenőmentes és biztonságos bejelentkezési élményt hagyományos jelszavak nélkül a Passwordless.dev segítségével. Tudjunk meg többet a bitwarden.com webhelyen." + }, + "freeBitwardenFamilies": { + "message": "Ingyenes Bitwarden Families csomag" + }, + "freeBitwardenFamiliesPageDesc": { + "message": "Jogosult vagyunk az ingyenes Bitwarden Families csomagra. Váltsuk be ezt az ajánlatot még ma az internetes alkalmazásban." + }, "version": { "message": "Verzió" }, @@ -253,8 +295,8 @@ "passGenInfo": { "message": "Automatikusan létrehoz erős, egyedi jelszavakat a bejelentkezéseidhez." }, - "bitWebVault": { - "message": "Bitwarden webes széf" + "bitWebVaultApp": { + "message": "Bitwarden webes alkalmazás" }, "importItems": { "message": "Elemek importálása" @@ -779,11 +821,8 @@ "shared": { "message": "Megosztott" }, - "learnOrg": { - "message": "Információ szervezetekről" - }, - "learnOrgConfirmation": { - "message": "A Bitwarden lehetővé teszi a tároló elemeinek megosztását másokkal egy szervezet használatával. Szeretnénk ellátogatni a bitwarden.com webhelyre további információkét?" + "bitwardenForBusinessPageDesc": { + "message": "A Bitwarden for Business lehetővé teszi a széf elemeinek megosztását másokkal egy szervezet használatával. További információ a bitwarden.com webhelyen." }, "moveToOrganization": { "message": "Áthelyezés szervezethez" @@ -1714,6 +1753,12 @@ "biometricsNotSupportedDesc": { "message": "A böngésző biometrikus adatait ez az eszköz nem támogatja." }, + "biometricsNotUnlockedTitle": { + "message": "A felhasználó zárolva van vagy kijelentkezett." + }, + "biometricsNotUnlockedDesc": { + "message": "Oldjuk fel a felhasználó zárolását az asztali alkalmazásban és próbáljuk újra." + }, "biometricsFailedTitle": { "message": "A biometria nem sikerült." }, @@ -2177,6 +2222,108 @@ "forwardedEmailDesc": { "message": "Email álnév generálása külső továbbító szolgáltatással." }, + "forwarderError": { + "message": "$SERVICENAME$ hiba: $ERRORMESSAGE$", + "description": "Reports an error returned by a forwarding service to the user.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + }, + "errormessage": { + "content": "$2", + "example": "Invalid characters in domain name." + } + } + }, + "forwarderGeneratedBy": { + "message": "Generálta: Bitwarden.", + "description": "Displayed with the address on the forwarding service's configuration screen." + }, + "forwarderGeneratedByWithWebsite": { + "message": "Webhely: $WEBSITE$. Generálta: Bitwarden.", + "description": "Displayed with the address on the forwarding service's configuration screen.", + "placeholders": { + "WEBSITE": { + "content": "$1", + "example": "www.example.com" + } + } + }, + "forwaderInvalidToken": { + "message": "$SERVICENAME$ API vezérjel érvénytelen.", + "description": "Displayed when the user's API token is empty or rejected by the forwarding service.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwaderInvalidTokenWithMessage": { + "message": "$SERVICENAME$ API vezérjel érvénytelen: $ERRORMESSAGE$", + "description": "Displayed when the user's API token is rejected by the forwarding service with an error message.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + }, + "errormessage": { + "content": "$2", + "example": "Please verify your email address to continue." + } + } + }, + "forwarderNoAccountId": { + "message": "Nem lehet beolvasni $SERVICENAME$ maszkolt email fiók azonosítót.", + "description": "Displayed when the forwarding service fails to return an account ID.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderNoDomain": { + "message": "$SERVICENAME$ domain érvénytelen.", + "description": "Displayed when the domain is empty or domain authorization failed at the forwarding service.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderNoUrl": { + "message": "$SERVICENAME$ webcím érvénytelen.", + "description": "Displayed when the url of the forwarding service wasn't supplied.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderUnknownError": { + "message": "Ismeretlen $SERVICENAME$ hiba történt.", + "description": "Displayed when the forwarding service failed due to an unknown error.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderUnknownForwarder": { + "message": "Ismeretlen továbbító: '$SERVICENAME$'.", + "description": "Displayed when the forwarding service is not supported.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "JustTrust.us" + } + } + }, "hostname": { "message": "Kiszolglónév", "description": "Part of a URL." @@ -3029,6 +3176,41 @@ "message": "a láthatósághoz.", "description": "This will be part of a larger sentence, which will read like so: Assign these items to a collection from the Admin Console to make them visible." }, + "autofillSuggestions": { + "message": "Automatikus kitöltés javaslatok" + }, + "autofillSuggestionsTip": { + "message": "A bejelentkezési elem mentése ehhez a webhelyhez az automatikus kitöltéshez" + }, + "yourVaultIsEmpty": { + "message": "A széf üres." + }, + "noItemsMatchSearch": { + "message": "Nincsenek a keresésnek megfelelő elemek." + }, + "clearFiltersOrTryAnother": { + "message": "Töröljük a szűrőket vagy próbálkozzunk másik keresési kifejezéssel." + }, + "copyInfo": { + "message": "Adatok másolása, $ITEMNAME$", + "description": "Aria label for a button that opens a menu with options to copy information from an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "moreOptions": { + "message": "További opciók, $ITEMNAME$", + "description": "Aria label for a button that opens a menu with more options for an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, "adminConsole": { "message": "Adminisztrátori konzol" }, @@ -3046,5 +3228,38 @@ }, "errorAssigningTargetFolder": { "message": "Hiba történt a célmappa hozzárendelése során." + }, + "viewItemsIn": { + "message": "View items in $NAME$", + "description": "Button to view the contents of a folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "backTo": { + "message": "Back to $NAME$", + "description": "Navigate back to a previous folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "new": { + "message": "Új" + }, + "removeItem": { + "message": "Remove $NAME$", + "description": "Remove a selected option, such as a folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } } } diff --git a/apps/browser/src/_locales/id/messages.json b/apps/browser/src/_locales/id/messages.json index d0c317a1773..57915c8f4a3 100644 --- a/apps/browser/src/_locales/id/messages.json +++ b/apps/browser/src/_locales/id/messages.json @@ -3,11 +3,11 @@ "message": "Bitwarden" }, "extName": { - "message": "Bitwarden Password Manager", + "message": "Bitwarden Pengelola Sandi", "description": "Extension name, MUST be less than 40 characters (Safari restriction)" }, "extDesc": { - "message": "At home, at work, or on the go, Bitwarden easily secures all your passwords, passkeys, and sensitive information", + "message": "Bitwarden memudahkan Anda menyimpan kata sandi, kata kunci, dan informasi sensitif dimanapun Anda berada", "description": "Extension description, MUST be less than 112 characters (Safari restriction)" }, "loginOrCreateNewAccount": { @@ -92,13 +92,13 @@ "message": "Isi otomatis" }, "autoFillLogin": { - "message": "Auto-fill login" + "message": "Autofill masuk" }, "autoFillCard": { - "message": "Auto-fill card" + "message": "Autofill kartu" }, "autoFillIdentity": { - "message": "Auto-fill identity" + "message": "Autofill identitas" }, "generatePasswordCopied": { "message": "Membuat Kata Sandi (tersalin)" @@ -110,19 +110,19 @@ "message": "Tidak ada info masuk yang cocok." }, "noCards": { - "message": "No cards" + "message": "Tanpa kartu" }, "noIdentities": { - "message": "No identities" + "message": "Tanpa identitas" }, "addLoginMenu": { - "message": "Add login" + "message": "Tambahkan Info Masuk" }, "addCardMenu": { - "message": "Add card" + "message": "Tambahkan kartu" }, "addIdentityMenu": { - "message": "Add identity" + "message": "Tambahkan identitas" }, "unlockVaultMenu": { "message": "Buka brankas Anda" @@ -166,17 +166,23 @@ "confirmIdentity": { "message": "Konfirmasi identitas Anda untuk melanjutkan." }, - "account": { - "message": "Akun" - }, "changeMasterPassword": { "message": "Ubah Kata Sandi Utama" }, "continueToWebApp": { - "message": "Continue to web app?" + "message": "Lanjut ke aplikasi web?" + }, + "continueToWebAppDesc": { + "message": "Explore more features of your Bitwarden account on the web app." + }, + "continueToHelpCenter": { + "message": "Continue to Help Center?" + }, + "continueToHelpCenterDesc": { + "message": "Learn more about how to use Bitwarden on the Help Center." }, "changeMasterPasswordOnWebConfirmation": { - "message": "You can change your master password on the Bitwarden web app." + "message": "Anda dapat merubah sandi utama di aplikasi Bitwarden web." }, "fingerprintPhrase": { "message": "Frasa Sidik Jari", @@ -192,9 +198,45 @@ "logOut": { "message": "Keluar" }, + "aboutBitwarden": { + "message": "About Bitwarden" + }, "about": { "message": "Tentang" }, + "moreFromBitwarden": { + "message": "More from Bitwarden" + }, + "continueToBitwardenDotCom": { + "message": "Continue to bitwarden.com?" + }, + "bitwardenForBusiness": { + "message": "Bitwarden for Business" + }, + "bitwardenAuthenticator": { + "message": "Bitwarden Authenticator" + }, + "continueToAuthenticatorPageDesc": { + "message": "Bitwarden Authenticator allows you to store authenticator keys and generate TOTP codes for 2-step verification flows. Learn more on the bitwarden.com website" + }, + "bitwardenSecretsManager": { + "message": "Bitwarden Secrets Manager" + }, + "continueToSecretsManagerPageDesc": { + "message": "Securely store, manage, and share developer secrets with Bitwarden Secrets Manager. Learn more on the bitwarden.com website." + }, + "passwordlessDotDev": { + "message": "Passwordless.dev" + }, + "continueToPasswordlessDotDevPageDesc": { + "message": "Create smooth and secure login experiences free from traditional passwords with Passwordless.dev. Learn more on the bitwarden.com website." + }, + "freeBitwardenFamilies": { + "message": "Free Bitwarden Families" + }, + "freeBitwardenFamiliesPageDesc": { + "message": "You are eligible for Free Bitwarden Families. Redeem this offer today in the web app." + }, "version": { "message": "Versi" }, @@ -226,13 +268,13 @@ "message": "Bantuan & Umpan Balik" }, "helpCenter": { - "message": "Bitwarden Help center" + "message": "Pusat Bantuan Bitwarden" }, "communityForums": { - "message": "Explore Bitwarden community forums" + "message": "Telusuri forum Bitwarden" }, "contactSupport": { - "message": "Contact Bitwarden support" + "message": "Kontak dukungan Bitwarden" }, "sync": { "message": "Sinkronisasi" @@ -253,8 +295,8 @@ "passGenInfo": { "message": "Secara otomatis membuat sandi yang kuat dan unik untuk info masuk Anda." }, - "bitWebVault": { - "message": "Brankas Web Bitwarden" + "bitWebVaultApp": { + "message": "Bitwarden web app" }, "importItems": { "message": "Impor Item" @@ -275,7 +317,7 @@ "message": "Panjang" }, "passwordMinLength": { - "message": "Minimum password length" + "message": "Panjang kata sandi minimum" }, "uppercase": { "message": "Huruf besar (A-Z)" @@ -333,7 +375,7 @@ "message": "Kata Sandi" }, "totp": { - "message": "Authenticator secret" + "message": "Kode Autentikator" }, "passphrase": { "message": "Frasa Sandi" @@ -375,19 +417,19 @@ "message": "Lainnya" }, "unlockMethods": { - "message": "Unlock options" + "message": "Pilihan Penguncian" }, "unlockMethodNeededToChangeTimeoutActionDesc": { - "message": "Set up an unlock method to change your vault timeout action." + "message": "Mengatur metode pembukaan kunci untuk mengubah tindakan batas waktu brankas Anda." }, "unlockMethodNeeded": { - "message": "Set up an unlock method in Settings" + "message": "Mengatur metode penguncian di Pengaturan" }, "sessionTimeoutHeader": { - "message": "Session timeout" + "message": "Batas waktu sesi" }, "otherOptions": { - "message": "Other options" + "message": "Opsi lainnya" }, "rateExtension": { "message": "Nilai Ekstensi" @@ -430,7 +472,7 @@ "message": "Kunci Sekarang" }, "lockAll": { - "message": "Lock all" + "message": "Kunci semua" }, "immediately": { "message": "Segera" @@ -490,10 +532,10 @@ "message": "Kata sandi utama diperlukan." }, "confirmMasterPasswordRequired": { - "message": "Master password retype is required." + "message": "Sandi utama diperlukan." }, "masterPasswordMinlength": { - "message": "Master password must be at least $VALUE$ characters long.", + "message": "Kata sandi utama harus $VALUE$ karakter.", "description": "The Master Password must be at least a specific number of characters long.", "placeholders": { "value": { @@ -509,10 +551,10 @@ "message": "Akun baru Anda telah dibuat! Sekarang Anda bisa masuk." }, "youSuccessfullyLoggedIn": { - "message": "You successfully logged in" + "message": "Anda berhasil masuk" }, "youMayCloseThisWindow": { - "message": "You may close this window" + "message": "Anda dapat menutup jendela ini" }, "masterPassSent": { "message": "Kami telah mengirimi Anda email dengan petunjuk sandi utama Anda." @@ -537,16 +579,16 @@ "message": "Tidak dapat mengisi otomatis item yang dipilih pada laman ini. Salin dan tempel informasinya sebagai gantinya." }, "totpCaptureError": { - "message": "Unable to scan QR code from the current webpage" + "message": "Tidak dapat memindai kode QR dari laman ini" }, "totpCaptureSuccess": { - "message": "Authenticator key added" + "message": "Kunci Autentikator ditambahkan" }, "totpCapture": { - "message": "Scan authenticator QR code from current webpage" + "message": "Pindai kode QR autentikator dari laman ini" }, "copyTOTP": { - "message": "Copy Authenticator key (TOTP)" + "message": "Salin kunci Autentikator (TOTP)" }, "loggedOut": { "message": "Keluar" @@ -653,7 +695,7 @@ "description": "This is the folder for uncategorized items" }, "enableAddLoginNotification": { - "message": "Ask to add login" + "message": "Tanya untuk penambahan login" }, "addLoginNotificationDesc": { "message": "\"Notifikasi Penambahan Info Masuk\" secara otomatis akan meminta Anda untuk menyimpan info masuk baru ke brankas Anda saat Anda masuk untuk pertama kalinya." @@ -779,11 +821,8 @@ "shared": { "message": "Dibagikan" }, - "learnOrg": { - "message": "Pelajari tentang Organisasi" - }, - "learnOrgConfirmation": { - "message": "Bitwarden memungkinkan Anda berbagi item brankas Anda dengan orang lain menggunakan organisasi. Maukah Anda mengunjungi laman bitwarden.com untuk mempelajari lebih lanjut?" + "bitwardenForBusinessPageDesc": { + "message": "Bitwarden for Business allows you to share your vault items with others by using an organization. Learn more on the bitwarden.com website." }, "moveToOrganization": { "message": "Pindah ke Organisasi" @@ -1714,6 +1753,12 @@ "biometricsNotSupportedDesc": { "message": "Biometrik peramban tidak didukung di perangkat ini." }, + "biometricsNotUnlockedTitle": { + "message": "User locked or logged out" + }, + "biometricsNotUnlockedDesc": { + "message": "Please unlock this user in the desktop application and try again." + }, "biometricsFailedTitle": { "message": "Biometrics failed" }, @@ -2177,6 +2222,108 @@ "forwardedEmailDesc": { "message": "Generate an email alias with an external forwarding service." }, + "forwarderError": { + "message": "$SERVICENAME$ error: $ERRORMESSAGE$", + "description": "Reports an error returned by a forwarding service to the user.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + }, + "errormessage": { + "content": "$2", + "example": "Invalid characters in domain name." + } + } + }, + "forwarderGeneratedBy": { + "message": "Generated by Bitwarden.", + "description": "Displayed with the address on the forwarding service's configuration screen." + }, + "forwarderGeneratedByWithWebsite": { + "message": "Website: $WEBSITE$. Generated by Bitwarden.", + "description": "Displayed with the address on the forwarding service's configuration screen.", + "placeholders": { + "WEBSITE": { + "content": "$1", + "example": "www.example.com" + } + } + }, + "forwaderInvalidToken": { + "message": "Invalid $SERVICENAME$ API token", + "description": "Displayed when the user's API token is empty or rejected by the forwarding service.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwaderInvalidTokenWithMessage": { + "message": "Invalid $SERVICENAME$ API token: $ERRORMESSAGE$", + "description": "Displayed when the user's API token is rejected by the forwarding service with an error message.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + }, + "errormessage": { + "content": "$2", + "example": "Please verify your email address to continue." + } + } + }, + "forwarderNoAccountId": { + "message": "Unable to obtain $SERVICENAME$ masked email account ID.", + "description": "Displayed when the forwarding service fails to return an account ID.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderNoDomain": { + "message": "Invalid $SERVICENAME$ domain.", + "description": "Displayed when the domain is empty or domain authorization failed at the forwarding service.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderNoUrl": { + "message": "Invalid $SERVICENAME$ url.", + "description": "Displayed when the url of the forwarding service wasn't supplied.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderUnknownError": { + "message": "Unknown $SERVICENAME$ error occurred.", + "description": "Displayed when the forwarding service failed due to an unknown error.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderUnknownForwarder": { + "message": "Unknown forwarder: '$SERVICENAME$'.", + "description": "Displayed when the forwarding service is not supported.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "JustTrust.us" + } + } + }, "hostname": { "message": "Hostname", "description": "Part of a URL." @@ -3029,6 +3176,41 @@ "message": "to make them visible.", "description": "This will be part of a larger sentence, which will read like so: Assign these items to a collection from the Admin Console to make them visible." }, + "autofillSuggestions": { + "message": "Auto-fill suggestions" + }, + "autofillSuggestionsTip": { + "message": "Save a login item for this site to auto-fill" + }, + "yourVaultIsEmpty": { + "message": "Your vault is empty" + }, + "noItemsMatchSearch": { + "message": "No items match your search" + }, + "clearFiltersOrTryAnother": { + "message": "Clear filters or try another search term" + }, + "copyInfo": { + "message": "Copy info, $ITEMNAME$", + "description": "Aria label for a button that opens a menu with options to copy information from an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "moreOptions": { + "message": "More options, $ITEMNAME$", + "description": "Aria label for a button that opens a menu with more options for an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, "adminConsole": { "message": "Admin Console" }, @@ -3046,5 +3228,38 @@ }, "errorAssigningTargetFolder": { "message": "Error assigning target folder." + }, + "viewItemsIn": { + "message": "View items in $NAME$", + "description": "Button to view the contents of a folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "backTo": { + "message": "Back to $NAME$", + "description": "Navigate back to a previous folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "new": { + "message": "New" + }, + "removeItem": { + "message": "Remove $NAME$", + "description": "Remove a selected option, such as a folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } } } diff --git a/apps/browser/src/_locales/it/messages.json b/apps/browser/src/_locales/it/messages.json index 94e0e479151..b5f9a8760be 100644 --- a/apps/browser/src/_locales/it/messages.json +++ b/apps/browser/src/_locales/it/messages.json @@ -166,15 +166,21 @@ "confirmIdentity": { "message": "Conferma la tua identità per continuare." }, - "account": { - "message": "Account" - }, "changeMasterPassword": { "message": "Cambia password principale" }, "continueToWebApp": { "message": "Passa al sito web?" }, + "continueToWebAppDesc": { + "message": "Esplora altre funzionalità del tuo account Bitwarden sul sito web." + }, + "continueToHelpCenter": { + "message": "Continua sul centro assistenza?" + }, + "continueToHelpCenterDesc": { + "message": "Scopri di più su come usare Bitwarden nel centro assistenza." + }, "changeMasterPasswordOnWebConfirmation": { "message": "Puoi modificare la tua password principale sul sito web di Bitwarden." }, @@ -192,9 +198,45 @@ "logOut": { "message": "Esci" }, + "aboutBitwarden": { + "message": "Informazioni su Bitwarden" + }, "about": { "message": "Informazioni" }, + "moreFromBitwarden": { + "message": "Altro da Bitwarden" + }, + "continueToBitwardenDotCom": { + "message": "Continua su bitwarden.com?" + }, + "bitwardenForBusiness": { + "message": "Bitwarden for Business" + }, + "bitwardenAuthenticator": { + "message": "Bitwarden Authenticator" + }, + "continueToAuthenticatorPageDesc": { + "message": "Bitwarden Authenticator ti consente di memorizzare le chiavi di autenticazione e generare codici TOTP per la verifica in due passaggi. Scopri di più su bitwarden.com" + }, + "bitwardenSecretsManager": { + "message": "Bitwarden Secrets Manager" + }, + "continueToSecretsManagerPageDesc": { + "message": "Archivia, gestisci e condividi in modo sicuro i segreti degli sviluppatori con Bitwarden Secrets Manager. Scopri di più su bitwarden.com." + }, + "passwordlessDotDev": { + "message": "Passwordless.dev" + }, + "continueToPasswordlessDotDevPageDesc": { + "message": "Crea esperienze di accesso fluide e sicure, libere dalle password tradizionali con Passwordless.dev. Scopri di più su bitwarden.com." + }, + "freeBitwardenFamilies": { + "message": "Bitwarden Families gratis" + }, + "freeBitwardenFamiliesPageDesc": { + "message": "Sei idoneo a ricevere Bitwarden Families gratis. Riscatta questa offerta nella web app." + }, "version": { "message": "Versione" }, @@ -253,8 +295,8 @@ "passGenInfo": { "message": "Genera automaticamente password complesse e uniche per i tuoi login." }, - "bitWebVault": { - "message": "Cassaforte web di Bitwarden" + "bitWebVaultApp": { + "message": "Bitwarden web app" }, "importItems": { "message": "Importa elementi" @@ -779,11 +821,8 @@ "shared": { "message": "Condiviso" }, - "learnOrg": { - "message": "Ulteriori informazioni sulle organizzazioni" - }, - "learnOrgConfirmation": { - "message": "Bitwarden ti permette di condividere gli elementi della tua cassaforte con altri usando un'organizzazione. Vuoi visitare il sito bitwarden.com per saperne di più?" + "bitwardenForBusinessPageDesc": { + "message": "Bitwarden for Business ti consente di condividere gli elementi della tua cassaforte con altri usando un'organizzazione. Scopri di più su bitwarden.com." }, "moveToOrganization": { "message": "Sposta in organizzazione" @@ -1714,6 +1753,12 @@ "biometricsNotSupportedDesc": { "message": "L'autenticazione biometrica del browser non è supportata su questo dispositivo." }, + "biometricsNotUnlockedTitle": { + "message": "Utente bloccato o uscito" + }, + "biometricsNotUnlockedDesc": { + "message": "Sblocca questo utente nell'applicazione desktop e riprova." + }, "biometricsFailedTitle": { "message": "Autenticazione biometrica fallita" }, @@ -2177,6 +2222,108 @@ "forwardedEmailDesc": { "message": "Genera un alias email con un servizio di inoltro esterno." }, + "forwarderError": { + "message": "Errore $SERVICENAME$: $ERRORMESSAGE$", + "description": "Reports an error returned by a forwarding service to the user.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + }, + "errormessage": { + "content": "$2", + "example": "Invalid characters in domain name." + } + } + }, + "forwarderGeneratedBy": { + "message": "Generato da Bitwarden.", + "description": "Displayed with the address on the forwarding service's configuration screen." + }, + "forwarderGeneratedByWithWebsite": { + "message": "Sito web: $WEBSITE$. Generato da Bitwarden.", + "description": "Displayed with the address on the forwarding service's configuration screen.", + "placeholders": { + "WEBSITE": { + "content": "$1", + "example": "www.example.com" + } + } + }, + "forwaderInvalidToken": { + "message": "Token API $SERVICENAME$ non valido", + "description": "Displayed when the user's API token is empty or rejected by the forwarding service.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwaderInvalidTokenWithMessage": { + "message": "Token API $SERVICENAME$ non valido: $ERRORMESSAGE$", + "description": "Displayed when the user's API token is rejected by the forwarding service with an error message.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + }, + "errormessage": { + "content": "$2", + "example": "Please verify your email address to continue." + } + } + }, + "forwarderNoAccountId": { + "message": "Impossibile ottenere l'ID dell'account email mascherato di $SERVICENAME$.", + "description": "Displayed when the forwarding service fails to return an account ID.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderNoDomain": { + "message": "Dominio $SERVICENAME$ non valido.", + "description": "Displayed when the domain is empty or domain authorization failed at the forwarding service.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderNoUrl": { + "message": "URL $SERVICENAME$ non valido.", + "description": "Displayed when the url of the forwarding service wasn't supplied.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderUnknownError": { + "message": "Errore di $SERVICENAME$ sconosciuto.", + "description": "Displayed when the forwarding service failed due to an unknown error.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderUnknownForwarder": { + "message": "Mittente sconosciuto: \"$SERVICENAME$\".", + "description": "Displayed when the forwarding service is not supported.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "JustTrust.us" + } + } + }, "hostname": { "message": "Nome host", "description": "Part of a URL." @@ -3029,6 +3176,41 @@ "message": "per renderli visibili.", "description": "This will be part of a larger sentence, which will read like so: Assign these items to a collection from the Admin Console to make them visible." }, + "autofillSuggestions": { + "message": "Suggerimenti per il riempimento automatico" + }, + "autofillSuggestionsTip": { + "message": "Salva un elemento di accesso per questo sito da riempire automaticamente" + }, + "yourVaultIsEmpty": { + "message": "La tua cassaforte è vuota" + }, + "noItemsMatchSearch": { + "message": "Nessun risultato corrisponde alla tua ricerca" + }, + "clearFiltersOrTryAnother": { + "message": "Cancella i filtri o prova un altro termine di ricerca" + }, + "copyInfo": { + "message": "Copia informazioni, $ITEMNAME$", + "description": "Aria label for a button that opens a menu with options to copy information from an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "moreOptions": { + "message": "Più opzioni, $ITEMNAME$", + "description": "Aria label for a button that opens a menu with more options for an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, "adminConsole": { "message": "Console di amministrazione" }, @@ -3046,5 +3228,38 @@ }, "errorAssigningTargetFolder": { "message": "Errore nell'assegnazione della cartella di destinazione." + }, + "viewItemsIn": { + "message": "View items in $NAME$", + "description": "Button to view the contents of a folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "backTo": { + "message": "Back to $NAME$", + "description": "Navigate back to a previous folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "new": { + "message": "Nuovo" + }, + "removeItem": { + "message": "Remove $NAME$", + "description": "Remove a selected option, such as a folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } } } diff --git a/apps/browser/src/_locales/ja/messages.json b/apps/browser/src/_locales/ja/messages.json index 0bfe8a84b3d..877a678f5f5 100644 --- a/apps/browser/src/_locales/ja/messages.json +++ b/apps/browser/src/_locales/ja/messages.json @@ -3,11 +3,11 @@ "message": "Bitwarden" }, "extName": { - "message": "Bitwarden Password Manager", + "message": "Bitwarden パスワードマネージャー", "description": "Extension name, MUST be less than 40 characters (Safari restriction)" }, "extDesc": { - "message": "At home, at work, or on the go, Bitwarden easily secures all your passwords, passkeys, and sensitive information", + "message": "自宅、職場、または外出先でも、Bitwarden はすべてのパスワード、パスキー、機密情報を簡単に保護します。", "description": "Extension description, MUST be less than 112 characters (Safari restriction)" }, "loginOrCreateNewAccount": { @@ -166,15 +166,21 @@ "confirmIdentity": { "message": "続行するには本人確認を行ってください。" }, - "account": { - "message": "アカウント" - }, "changeMasterPassword": { "message": "マスターパスワードの変更" }, "continueToWebApp": { "message": "ウェブアプリに進みますか?" }, + "continueToWebAppDesc": { + "message": "Bitwarden アカウントの機能をウェブアプリでご確認ください。" + }, + "continueToHelpCenter": { + "message": "ヘルプセンターに進みますか?" + }, + "continueToHelpCenterDesc": { + "message": "Bitwarden のヘルプセンターで使用方法の詳細をご覧ください。" + }, "changeMasterPasswordOnWebConfirmation": { "message": "Bitwarden ウェブアプリでマスターパスワードを変更できます。" }, @@ -192,9 +198,45 @@ "logOut": { "message": "ログアウト" }, + "aboutBitwarden": { + "message": "Bitwarden について" + }, "about": { "message": "アプリについて" }, + "moreFromBitwarden": { + "message": "Bitwarden の詳細" + }, + "continueToBitwardenDotCom": { + "message": "bitwarden.com に進みますか?" + }, + "bitwardenForBusiness": { + "message": "Bitwarden for Business" + }, + "bitwardenAuthenticator": { + "message": "Bitwarden Authenticator" + }, + "continueToAuthenticatorPageDesc": { + "message": "Bitwarden Authenticator では認証キーを保存し、2段階認証フロー用の TOTP コードを生成できます。詳細は bitwarden.com ウェブサイトをご覧ください。" + }, + "bitwardenSecretsManager": { + "message": "Bitwarden シークレットマネージャー" + }, + "continueToSecretsManagerPageDesc": { + "message": "Bitwarden シークレットマネージャーで開発者向けシークレットを安全に保管、管理、共有できます。詳細は bitwarden.com ウェブサイトをご覧ください。" + }, + "passwordlessDotDev": { + "message": "Passwordless.dev" + }, + "continueToPasswordlessDotDevPageDesc": { + "message": "Passwordless.dev でスムーズで安全なログイン体験を無料で提供します。bitwarden.com のウェブサイトで詳細をご覧ください。" + }, + "freeBitwardenFamilies": { + "message": "無料 Bitwarden ファミリー" + }, + "freeBitwardenFamiliesPageDesc": { + "message": "無料 Bitwarden ファミリー特典を受け取る資格があります。ウェブアプリで受け取りできます。" + }, "version": { "message": "バージョン" }, @@ -253,8 +295,8 @@ "passGenInfo": { "message": "ログインのために強固なユニークパスワードを自動的に生成します。" }, - "bitWebVault": { - "message": "Bitwarden ウェブ保管庫" + "bitWebVaultApp": { + "message": "Bitwarden ウェブアプリ" }, "importItems": { "message": "アイテムのインポート" @@ -779,11 +821,8 @@ "shared": { "message": "共有" }, - "learnOrg": { - "message": "組織について学ぶ" - }, - "learnOrgConfirmation": { - "message": "Bitwarden は組織を使って保管庫アイテムを他の人と共有することができます。詳細は bitwarden.com ウェブサイトをご覧ください。" + "bitwardenForBusinessPageDesc": { + "message": "Bitwarden for Business は組織を使って保管庫アイテムを他の人と共有することができます。詳細は bitwarden.com ウェブサイトをご覧ください。" }, "moveToOrganization": { "message": "組織に移動" @@ -1714,6 +1753,12 @@ "biometricsNotSupportedDesc": { "message": "このデバイスではブラウザの生体認証に対応していません。" }, + "biometricsNotUnlockedTitle": { + "message": "ユーザーがロックまたはログアウトしました" + }, + "biometricsNotUnlockedDesc": { + "message": "デスクトップアプリでこのユーザーのロックを解除して、もう一度やり直してください。" + }, "biometricsFailedTitle": { "message": "生体認証に失敗しました" }, @@ -2177,6 +2222,108 @@ "forwardedEmailDesc": { "message": "外部転送サービスを使用してメールエイリアスを生成します。" }, + "forwarderError": { + "message": "$SERVICENAME$ エラー: $ERRORMESSAGE$", + "description": "Reports an error returned by a forwarding service to the user.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + }, + "errormessage": { + "content": "$2", + "example": "Invalid characters in domain name." + } + } + }, + "forwarderGeneratedBy": { + "message": "Bitwarden によって生成されました。", + "description": "Displayed with the address on the forwarding service's configuration screen." + }, + "forwarderGeneratedByWithWebsite": { + "message": "ウェブサイト: $WEBSITE$ Bitwarden によって生成されました。", + "description": "Displayed with the address on the forwarding service's configuration screen.", + "placeholders": { + "WEBSITE": { + "content": "$1", + "example": "www.example.com" + } + } + }, + "forwaderInvalidToken": { + "message": "不正な$SERVICENAME$ API トークン", + "description": "Displayed when the user's API token is empty or rejected by the forwarding service.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwaderInvalidTokenWithMessage": { + "message": "不正な$SERVICENAME$ API トークン: $ERRORMESSAGE$", + "description": "Displayed when the user's API token is rejected by the forwarding service with an error message.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + }, + "errormessage": { + "content": "$2", + "example": "Please verify your email address to continue." + } + } + }, + "forwarderNoAccountId": { + "message": "$SERVICENAME$ マスク済みメールアカウント ID を取得できませんでした。", + "description": "Displayed when the forwarding service fails to return an account ID.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderNoDomain": { + "message": "不正な $SERVICENAME$ ドメインです。", + "description": "Displayed when the domain is empty or domain authorization failed at the forwarding service.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderNoUrl": { + "message": "不正な $SERVICENAME$ URL です。", + "description": "Displayed when the url of the forwarding service wasn't supplied.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderUnknownError": { + "message": "不明な $SERVICENAME$ エラーが起きました。", + "description": "Displayed when the forwarding service failed due to an unknown error.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderUnknownForwarder": { + "message": "不明な転送先: '$SERVICENAME$'", + "description": "Displayed when the forwarding service is not supported.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "JustTrust.us" + } + } + }, "hostname": { "message": "ホスト名", "description": "Part of a URL." @@ -3029,6 +3176,41 @@ "message": "で実行すると表示できるようになります。", "description": "This will be part of a larger sentence, which will read like so: Assign these items to a collection from the Admin Console to make them visible." }, + "autofillSuggestions": { + "message": "候補を自動入力する" + }, + "autofillSuggestionsTip": { + "message": "自動入力するためにこのサイトのログインアイテムを保存します" + }, + "yourVaultIsEmpty": { + "message": "保管庫が空です" + }, + "noItemsMatchSearch": { + "message": "検索条件に一致するアイテムがありません" + }, + "clearFiltersOrTryAnother": { + "message": "フィルタをクリアするか、別の検索ワードをお試しください" + }, + "copyInfo": { + "message": "$ITEMNAME$ の情報をコピー", + "description": "Aria label for a button that opens a menu with options to copy information from an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "moreOptions": { + "message": "$ITEMNAME$ のその他のオプション", + "description": "Aria label for a button that opens a menu with more options for an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, "adminConsole": { "message": "管理コンソール" }, @@ -3046,5 +3228,38 @@ }, "errorAssigningTargetFolder": { "message": "ターゲットフォルダーの割り当てに失敗しました。" + }, + "viewItemsIn": { + "message": "View items in $NAME$", + "description": "Button to view the contents of a folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "backTo": { + "message": "Back to $NAME$", + "description": "Navigate back to a previous folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "new": { + "message": "新規作成" + }, + "removeItem": { + "message": "Remove $NAME$", + "description": "Remove a selected option, such as a folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } } } diff --git a/apps/browser/src/_locales/ka/messages.json b/apps/browser/src/_locales/ka/messages.json index 1ee37ad5de7..27883b2a07a 100644 --- a/apps/browser/src/_locales/ka/messages.json +++ b/apps/browser/src/_locales/ka/messages.json @@ -166,15 +166,21 @@ "confirmIdentity": { "message": "Confirm your identity to continue." }, - "account": { - "message": "ანგარიში" - }, "changeMasterPassword": { "message": "Change master password" }, "continueToWebApp": { "message": "Continue to web app?" }, + "continueToWebAppDesc": { + "message": "Explore more features of your Bitwarden account on the web app." + }, + "continueToHelpCenter": { + "message": "Continue to Help Center?" + }, + "continueToHelpCenterDesc": { + "message": "Learn more about how to use Bitwarden on the Help Center." + }, "changeMasterPasswordOnWebConfirmation": { "message": "You can change your master password on the Bitwarden web app." }, @@ -192,9 +198,45 @@ "logOut": { "message": "გამოსვლა" }, + "aboutBitwarden": { + "message": "About Bitwarden" + }, "about": { "message": "შესახებ" }, + "moreFromBitwarden": { + "message": "More from Bitwarden" + }, + "continueToBitwardenDotCom": { + "message": "Continue to bitwarden.com?" + }, + "bitwardenForBusiness": { + "message": "Bitwarden for Business" + }, + "bitwardenAuthenticator": { + "message": "Bitwarden Authenticator" + }, + "continueToAuthenticatorPageDesc": { + "message": "Bitwarden Authenticator allows you to store authenticator keys and generate TOTP codes for 2-step verification flows. Learn more on the bitwarden.com website" + }, + "bitwardenSecretsManager": { + "message": "Bitwarden Secrets Manager" + }, + "continueToSecretsManagerPageDesc": { + "message": "Securely store, manage, and share developer secrets with Bitwarden Secrets Manager. Learn more on the bitwarden.com website." + }, + "passwordlessDotDev": { + "message": "Passwordless.dev" + }, + "continueToPasswordlessDotDevPageDesc": { + "message": "Create smooth and secure login experiences free from traditional passwords with Passwordless.dev. Learn more on the bitwarden.com website." + }, + "freeBitwardenFamilies": { + "message": "Free Bitwarden Families" + }, + "freeBitwardenFamiliesPageDesc": { + "message": "You are eligible for Free Bitwarden Families. Redeem this offer today in the web app." + }, "version": { "message": "ვერსია" }, @@ -253,8 +295,8 @@ "passGenInfo": { "message": "Automatically generate strong, unique passwords for your logins." }, - "bitWebVault": { - "message": "Bitwarden web vault" + "bitWebVaultApp": { + "message": "Bitwarden web app" }, "importItems": { "message": "Import items" @@ -779,11 +821,8 @@ "shared": { "message": "Shared" }, - "learnOrg": { - "message": "Learn about organizations" - }, - "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?" + "bitwardenForBusinessPageDesc": { + "message": "Bitwarden for Business allows you to share your vault items with others by using an organization. Learn more on the bitwarden.com website." }, "moveToOrganization": { "message": "Move to organization" @@ -1714,6 +1753,12 @@ "biometricsNotSupportedDesc": { "message": "Browser biometrics is not supported on this device." }, + "biometricsNotUnlockedTitle": { + "message": "User locked or logged out" + }, + "biometricsNotUnlockedDesc": { + "message": "Please unlock this user in the desktop application and try again." + }, "biometricsFailedTitle": { "message": "Biometrics failed" }, @@ -2177,6 +2222,108 @@ "forwardedEmailDesc": { "message": "Generate an email alias with an external forwarding service." }, + "forwarderError": { + "message": "$SERVICENAME$ error: $ERRORMESSAGE$", + "description": "Reports an error returned by a forwarding service to the user.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + }, + "errormessage": { + "content": "$2", + "example": "Invalid characters in domain name." + } + } + }, + "forwarderGeneratedBy": { + "message": "Generated by Bitwarden.", + "description": "Displayed with the address on the forwarding service's configuration screen." + }, + "forwarderGeneratedByWithWebsite": { + "message": "Website: $WEBSITE$. Generated by Bitwarden.", + "description": "Displayed with the address on the forwarding service's configuration screen.", + "placeholders": { + "WEBSITE": { + "content": "$1", + "example": "www.example.com" + } + } + }, + "forwaderInvalidToken": { + "message": "Invalid $SERVICENAME$ API token", + "description": "Displayed when the user's API token is empty or rejected by the forwarding service.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwaderInvalidTokenWithMessage": { + "message": "Invalid $SERVICENAME$ API token: $ERRORMESSAGE$", + "description": "Displayed when the user's API token is rejected by the forwarding service with an error message.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + }, + "errormessage": { + "content": "$2", + "example": "Please verify your email address to continue." + } + } + }, + "forwarderNoAccountId": { + "message": "Unable to obtain $SERVICENAME$ masked email account ID.", + "description": "Displayed when the forwarding service fails to return an account ID.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderNoDomain": { + "message": "Invalid $SERVICENAME$ domain.", + "description": "Displayed when the domain is empty or domain authorization failed at the forwarding service.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderNoUrl": { + "message": "Invalid $SERVICENAME$ url.", + "description": "Displayed when the url of the forwarding service wasn't supplied.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderUnknownError": { + "message": "Unknown $SERVICENAME$ error occurred.", + "description": "Displayed when the forwarding service failed due to an unknown error.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderUnknownForwarder": { + "message": "Unknown forwarder: '$SERVICENAME$'.", + "description": "Displayed when the forwarding service is not supported.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "JustTrust.us" + } + } + }, "hostname": { "message": "Hostname", "description": "Part of a URL." @@ -3029,6 +3176,41 @@ "message": "to make them visible.", "description": "This will be part of a larger sentence, which will read like so: Assign these items to a collection from the Admin Console to make them visible." }, + "autofillSuggestions": { + "message": "Auto-fill suggestions" + }, + "autofillSuggestionsTip": { + "message": "Save a login item for this site to auto-fill" + }, + "yourVaultIsEmpty": { + "message": "Your vault is empty" + }, + "noItemsMatchSearch": { + "message": "No items match your search" + }, + "clearFiltersOrTryAnother": { + "message": "Clear filters or try another search term" + }, + "copyInfo": { + "message": "Copy info, $ITEMNAME$", + "description": "Aria label for a button that opens a menu with options to copy information from an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "moreOptions": { + "message": "More options, $ITEMNAME$", + "description": "Aria label for a button that opens a menu with more options for an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, "adminConsole": { "message": "Admin Console" }, @@ -3046,5 +3228,38 @@ }, "errorAssigningTargetFolder": { "message": "Error assigning target folder." + }, + "viewItemsIn": { + "message": "View items in $NAME$", + "description": "Button to view the contents of a folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "backTo": { + "message": "Back to $NAME$", + "description": "Navigate back to a previous folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "new": { + "message": "New" + }, + "removeItem": { + "message": "Remove $NAME$", + "description": "Remove a selected option, such as a folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } } } diff --git a/apps/browser/src/_locales/km/messages.json b/apps/browser/src/_locales/km/messages.json index b45fdef39e8..e042785011c 100644 --- a/apps/browser/src/_locales/km/messages.json +++ b/apps/browser/src/_locales/km/messages.json @@ -166,15 +166,21 @@ "confirmIdentity": { "message": "Confirm your identity to continue." }, - "account": { - "message": "Account" - }, "changeMasterPassword": { "message": "Change master password" }, "continueToWebApp": { "message": "Continue to web app?" }, + "continueToWebAppDesc": { + "message": "Explore more features of your Bitwarden account on the web app." + }, + "continueToHelpCenter": { + "message": "Continue to Help Center?" + }, + "continueToHelpCenterDesc": { + "message": "Learn more about how to use Bitwarden on the Help Center." + }, "changeMasterPasswordOnWebConfirmation": { "message": "You can change your master password on the Bitwarden web app." }, @@ -192,9 +198,45 @@ "logOut": { "message": "Log out" }, + "aboutBitwarden": { + "message": "About Bitwarden" + }, "about": { "message": "About" }, + "moreFromBitwarden": { + "message": "More from Bitwarden" + }, + "continueToBitwardenDotCom": { + "message": "Continue to bitwarden.com?" + }, + "bitwardenForBusiness": { + "message": "Bitwarden for Business" + }, + "bitwardenAuthenticator": { + "message": "Bitwarden Authenticator" + }, + "continueToAuthenticatorPageDesc": { + "message": "Bitwarden Authenticator allows you to store authenticator keys and generate TOTP codes for 2-step verification flows. Learn more on the bitwarden.com website" + }, + "bitwardenSecretsManager": { + "message": "Bitwarden Secrets Manager" + }, + "continueToSecretsManagerPageDesc": { + "message": "Securely store, manage, and share developer secrets with Bitwarden Secrets Manager. Learn more on the bitwarden.com website." + }, + "passwordlessDotDev": { + "message": "Passwordless.dev" + }, + "continueToPasswordlessDotDevPageDesc": { + "message": "Create smooth and secure login experiences free from traditional passwords with Passwordless.dev. Learn more on the bitwarden.com website." + }, + "freeBitwardenFamilies": { + "message": "Free Bitwarden Families" + }, + "freeBitwardenFamiliesPageDesc": { + "message": "You are eligible for Free Bitwarden Families. Redeem this offer today in the web app." + }, "version": { "message": "Version" }, @@ -253,8 +295,8 @@ "passGenInfo": { "message": "Automatically generate strong, unique passwords for your logins." }, - "bitWebVault": { - "message": "Bitwarden web vault" + "bitWebVaultApp": { + "message": "Bitwarden web app" }, "importItems": { "message": "Import items" @@ -779,11 +821,8 @@ "shared": { "message": "Shared" }, - "learnOrg": { - "message": "Learn about organizations" - }, - "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?" + "bitwardenForBusinessPageDesc": { + "message": "Bitwarden for Business allows you to share your vault items with others by using an organization. Learn more on the bitwarden.com website." }, "moveToOrganization": { "message": "Move to organization" @@ -1714,6 +1753,12 @@ "biometricsNotSupportedDesc": { "message": "Browser biometrics is not supported on this device." }, + "biometricsNotUnlockedTitle": { + "message": "User locked or logged out" + }, + "biometricsNotUnlockedDesc": { + "message": "Please unlock this user in the desktop application and try again." + }, "biometricsFailedTitle": { "message": "Biometrics failed" }, @@ -2177,6 +2222,108 @@ "forwardedEmailDesc": { "message": "Generate an email alias with an external forwarding service." }, + "forwarderError": { + "message": "$SERVICENAME$ error: $ERRORMESSAGE$", + "description": "Reports an error returned by a forwarding service to the user.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + }, + "errormessage": { + "content": "$2", + "example": "Invalid characters in domain name." + } + } + }, + "forwarderGeneratedBy": { + "message": "Generated by Bitwarden.", + "description": "Displayed with the address on the forwarding service's configuration screen." + }, + "forwarderGeneratedByWithWebsite": { + "message": "Website: $WEBSITE$. Generated by Bitwarden.", + "description": "Displayed with the address on the forwarding service's configuration screen.", + "placeholders": { + "WEBSITE": { + "content": "$1", + "example": "www.example.com" + } + } + }, + "forwaderInvalidToken": { + "message": "Invalid $SERVICENAME$ API token", + "description": "Displayed when the user's API token is empty or rejected by the forwarding service.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwaderInvalidTokenWithMessage": { + "message": "Invalid $SERVICENAME$ API token: $ERRORMESSAGE$", + "description": "Displayed when the user's API token is rejected by the forwarding service with an error message.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + }, + "errormessage": { + "content": "$2", + "example": "Please verify your email address to continue." + } + } + }, + "forwarderNoAccountId": { + "message": "Unable to obtain $SERVICENAME$ masked email account ID.", + "description": "Displayed when the forwarding service fails to return an account ID.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderNoDomain": { + "message": "Invalid $SERVICENAME$ domain.", + "description": "Displayed when the domain is empty or domain authorization failed at the forwarding service.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderNoUrl": { + "message": "Invalid $SERVICENAME$ url.", + "description": "Displayed when the url of the forwarding service wasn't supplied.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderUnknownError": { + "message": "Unknown $SERVICENAME$ error occurred.", + "description": "Displayed when the forwarding service failed due to an unknown error.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderUnknownForwarder": { + "message": "Unknown forwarder: '$SERVICENAME$'.", + "description": "Displayed when the forwarding service is not supported.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "JustTrust.us" + } + } + }, "hostname": { "message": "Hostname", "description": "Part of a URL." @@ -3029,6 +3176,41 @@ "message": "to make them visible.", "description": "This will be part of a larger sentence, which will read like so: Assign these items to a collection from the Admin Console to make them visible." }, + "autofillSuggestions": { + "message": "Auto-fill suggestions" + }, + "autofillSuggestionsTip": { + "message": "Save a login item for this site to auto-fill" + }, + "yourVaultIsEmpty": { + "message": "Your vault is empty" + }, + "noItemsMatchSearch": { + "message": "No items match your search" + }, + "clearFiltersOrTryAnother": { + "message": "Clear filters or try another search term" + }, + "copyInfo": { + "message": "Copy info, $ITEMNAME$", + "description": "Aria label for a button that opens a menu with options to copy information from an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "moreOptions": { + "message": "More options, $ITEMNAME$", + "description": "Aria label for a button that opens a menu with more options for an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, "adminConsole": { "message": "Admin Console" }, @@ -3046,5 +3228,38 @@ }, "errorAssigningTargetFolder": { "message": "Error assigning target folder." + }, + "viewItemsIn": { + "message": "View items in $NAME$", + "description": "Button to view the contents of a folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "backTo": { + "message": "Back to $NAME$", + "description": "Navigate back to a previous folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "new": { + "message": "New" + }, + "removeItem": { + "message": "Remove $NAME$", + "description": "Remove a selected option, such as a folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } } } diff --git a/apps/browser/src/_locales/kn/messages.json b/apps/browser/src/_locales/kn/messages.json index 275723e0cf4..f1d190ab5d8 100644 --- a/apps/browser/src/_locales/kn/messages.json +++ b/apps/browser/src/_locales/kn/messages.json @@ -166,15 +166,21 @@ "confirmIdentity": { "message": "Confirm your identity to continue." }, - "account": { - "message": "ಖಾತೆ" - }, "changeMasterPassword": { "message": "ಮಾಸ್ಟರ್ ಪಾಸ್ವರ್ಡ್ ಬದಲಾಯಿಸಿ" }, "continueToWebApp": { "message": "Continue to web app?" }, + "continueToWebAppDesc": { + "message": "Explore more features of your Bitwarden account on the web app." + }, + "continueToHelpCenter": { + "message": "Continue to Help Center?" + }, + "continueToHelpCenterDesc": { + "message": "Learn more about how to use Bitwarden on the Help Center." + }, "changeMasterPasswordOnWebConfirmation": { "message": "You can change your master password on the Bitwarden web app." }, @@ -192,9 +198,45 @@ "logOut": { "message": "ಲಾಗ್ ಔಟ್" }, + "aboutBitwarden": { + "message": "About Bitwarden" + }, "about": { "message": "ಬಗ್ಗೆ" }, + "moreFromBitwarden": { + "message": "More from Bitwarden" + }, + "continueToBitwardenDotCom": { + "message": "Continue to bitwarden.com?" + }, + "bitwardenForBusiness": { + "message": "Bitwarden for Business" + }, + "bitwardenAuthenticator": { + "message": "Bitwarden Authenticator" + }, + "continueToAuthenticatorPageDesc": { + "message": "Bitwarden Authenticator allows you to store authenticator keys and generate TOTP codes for 2-step verification flows. Learn more on the bitwarden.com website" + }, + "bitwardenSecretsManager": { + "message": "Bitwarden Secrets Manager" + }, + "continueToSecretsManagerPageDesc": { + "message": "Securely store, manage, and share developer secrets with Bitwarden Secrets Manager. Learn more on the bitwarden.com website." + }, + "passwordlessDotDev": { + "message": "Passwordless.dev" + }, + "continueToPasswordlessDotDevPageDesc": { + "message": "Create smooth and secure login experiences free from traditional passwords with Passwordless.dev. Learn more on the bitwarden.com website." + }, + "freeBitwardenFamilies": { + "message": "Free Bitwarden Families" + }, + "freeBitwardenFamiliesPageDesc": { + "message": "You are eligible for Free Bitwarden Families. Redeem this offer today in the web app." + }, "version": { "message": "ಆವೃತ್ತಿ" }, @@ -253,8 +295,8 @@ "passGenInfo": { "message": "ನಿಮ್ಮ ಲಾಗಿನ್‌ಗಳಿಗಾಗಿ ಬಲವಾದ, ಅನನ್ಯ ಪಾಸ್‌ವರ್ಡ್‌ಗಳನ್ನು ಸ್ವಯಂಚಾಲಿತವಾಗಿ ರಚಿಸಿ." }, - "bitWebVault": { - "message": "ಬಿಟ್ವಾರ್ಡೆನ್ ವೆಬ್ ವಾಲ್ಟ್" + "bitWebVaultApp": { + "message": "Bitwarden web app" }, "importItems": { "message": "ವಸ್ತುಗಳನ್ನು ಆಮದು ಮಾಡಿ" @@ -779,11 +821,8 @@ "shared": { "message": "ಹಂಚಿಕೊಳ್ಳಲಾಗಿದೆ" }, - "learnOrg": { - "message": "ಸಂಘಟನೆಗಳ ಬಗ್ಗೆ ತಿಳಿಯಿರಿ" - }, - "learnOrgConfirmation": { - "message": "ಸಂಸ್ಥೆಯೊಂದನ್ನು ಬಳಸಿಕೊಂಡು ನಿಮ್ಮ ಚಾವಣಿ ವಸ್ತುಗಳನ್ನು ಇತರರೊಂದಿಗೆ ಹಂಚಿಕೊಳ್ಳಲು ಬಿಟ್ವರ್ಡ್ಗಳು ನಿಮ್ಮನ್ನು ಅನುಮತಿಸುತ್ತದೆ. ನೀವು ಇನ್ನಷ್ಟು ತಿಳಿಯಲು Bitwarden.com ವೆಬ್ಸೈಟ್ಗೆ ಭೇಟಿ ನೀಡಲು ಬಯಸುವಿರಾ?" + "bitwardenForBusinessPageDesc": { + "message": "Bitwarden for Business allows you to share your vault items with others by using an organization. Learn more on the bitwarden.com website." }, "moveToOrganization": { "message": "ಸಂಸ್ಥೆಗೆ ಸರಿಸಿ" @@ -1714,6 +1753,12 @@ "biometricsNotSupportedDesc": { "message": "ಬ್ರೌಸರ್ ಬಯೋಮೆಟ್ರಿಕ್ಸ್ ಈ ಸಾಧನದಲ್ಲಿ ಬೆಂಬಲಿಸುವುದಿಲ್ಲ." }, + "biometricsNotUnlockedTitle": { + "message": "User locked or logged out" + }, + "biometricsNotUnlockedDesc": { + "message": "Please unlock this user in the desktop application and try again." + }, "biometricsFailedTitle": { "message": "Biometrics failed" }, @@ -2177,6 +2222,108 @@ "forwardedEmailDesc": { "message": "Generate an email alias with an external forwarding service." }, + "forwarderError": { + "message": "$SERVICENAME$ error: $ERRORMESSAGE$", + "description": "Reports an error returned by a forwarding service to the user.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + }, + "errormessage": { + "content": "$2", + "example": "Invalid characters in domain name." + } + } + }, + "forwarderGeneratedBy": { + "message": "Generated by Bitwarden.", + "description": "Displayed with the address on the forwarding service's configuration screen." + }, + "forwarderGeneratedByWithWebsite": { + "message": "Website: $WEBSITE$. Generated by Bitwarden.", + "description": "Displayed with the address on the forwarding service's configuration screen.", + "placeholders": { + "WEBSITE": { + "content": "$1", + "example": "www.example.com" + } + } + }, + "forwaderInvalidToken": { + "message": "Invalid $SERVICENAME$ API token", + "description": "Displayed when the user's API token is empty or rejected by the forwarding service.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwaderInvalidTokenWithMessage": { + "message": "Invalid $SERVICENAME$ API token: $ERRORMESSAGE$", + "description": "Displayed when the user's API token is rejected by the forwarding service with an error message.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + }, + "errormessage": { + "content": "$2", + "example": "Please verify your email address to continue." + } + } + }, + "forwarderNoAccountId": { + "message": "Unable to obtain $SERVICENAME$ masked email account ID.", + "description": "Displayed when the forwarding service fails to return an account ID.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderNoDomain": { + "message": "Invalid $SERVICENAME$ domain.", + "description": "Displayed when the domain is empty or domain authorization failed at the forwarding service.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderNoUrl": { + "message": "Invalid $SERVICENAME$ url.", + "description": "Displayed when the url of the forwarding service wasn't supplied.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderUnknownError": { + "message": "Unknown $SERVICENAME$ error occurred.", + "description": "Displayed when the forwarding service failed due to an unknown error.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderUnknownForwarder": { + "message": "Unknown forwarder: '$SERVICENAME$'.", + "description": "Displayed when the forwarding service is not supported.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "JustTrust.us" + } + } + }, "hostname": { "message": "Hostname", "description": "Part of a URL." @@ -3029,6 +3176,41 @@ "message": "to make them visible.", "description": "This will be part of a larger sentence, which will read like so: Assign these items to a collection from the Admin Console to make them visible." }, + "autofillSuggestions": { + "message": "Auto-fill suggestions" + }, + "autofillSuggestionsTip": { + "message": "Save a login item for this site to auto-fill" + }, + "yourVaultIsEmpty": { + "message": "Your vault is empty" + }, + "noItemsMatchSearch": { + "message": "No items match your search" + }, + "clearFiltersOrTryAnother": { + "message": "Clear filters or try another search term" + }, + "copyInfo": { + "message": "Copy info, $ITEMNAME$", + "description": "Aria label for a button that opens a menu with options to copy information from an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "moreOptions": { + "message": "More options, $ITEMNAME$", + "description": "Aria label for a button that opens a menu with more options for an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, "adminConsole": { "message": "Admin Console" }, @@ -3046,5 +3228,38 @@ }, "errorAssigningTargetFolder": { "message": "Error assigning target folder." + }, + "viewItemsIn": { + "message": "View items in $NAME$", + "description": "Button to view the contents of a folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "backTo": { + "message": "Back to $NAME$", + "description": "Navigate back to a previous folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "new": { + "message": "New" + }, + "removeItem": { + "message": "Remove $NAME$", + "description": "Remove a selected option, such as a folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } } } diff --git a/apps/browser/src/_locales/ko/messages.json b/apps/browser/src/_locales/ko/messages.json index 116c87a3116..c5aa76dca7c 100644 --- a/apps/browser/src/_locales/ko/messages.json +++ b/apps/browser/src/_locales/ko/messages.json @@ -166,15 +166,21 @@ "confirmIdentity": { "message": "계속하려면 암호를 확인하세요." }, - "account": { - "message": "계정" - }, "changeMasterPassword": { "message": "마스터 비밀번호 변경" }, "continueToWebApp": { "message": "웹 앱에서 계속하시겠용?" }, + "continueToWebAppDesc": { + "message": "Explore more features of your Bitwarden account on the web app." + }, + "continueToHelpCenter": { + "message": "Continue to Help Center?" + }, + "continueToHelpCenterDesc": { + "message": "Learn more about how to use Bitwarden on the Help Center." + }, "changeMasterPasswordOnWebConfirmation": { "message": "Bitwarden 웹 앱에서 마스터 비밀번호를 변경할 수 있습니다." }, @@ -192,9 +198,45 @@ "logOut": { "message": "로그아웃" }, + "aboutBitwarden": { + "message": "About Bitwarden" + }, "about": { "message": "정보" }, + "moreFromBitwarden": { + "message": "More from Bitwarden" + }, + "continueToBitwardenDotCom": { + "message": "Continue to bitwarden.com?" + }, + "bitwardenForBusiness": { + "message": "Bitwarden for Business" + }, + "bitwardenAuthenticator": { + "message": "Bitwarden Authenticator" + }, + "continueToAuthenticatorPageDesc": { + "message": "Bitwarden Authenticator allows you to store authenticator keys and generate TOTP codes for 2-step verification flows. Learn more on the bitwarden.com website" + }, + "bitwardenSecretsManager": { + "message": "Bitwarden Secrets Manager" + }, + "continueToSecretsManagerPageDesc": { + "message": "Securely store, manage, and share developer secrets with Bitwarden Secrets Manager. Learn more on the bitwarden.com website." + }, + "passwordlessDotDev": { + "message": "Passwordless.dev" + }, + "continueToPasswordlessDotDevPageDesc": { + "message": "Create smooth and secure login experiences free from traditional passwords with Passwordless.dev. Learn more on the bitwarden.com website." + }, + "freeBitwardenFamilies": { + "message": "Free Bitwarden Families" + }, + "freeBitwardenFamiliesPageDesc": { + "message": "You are eligible for Free Bitwarden Families. Redeem this offer today in the web app." + }, "version": { "message": "버전" }, @@ -253,8 +295,8 @@ "passGenInfo": { "message": "유일무이하고 강력한 비밀번호를 자동으로 생성합니다." }, - "bitWebVault": { - "message": "Bitwarden 웹 보관함" + "bitWebVaultApp": { + "message": "Bitwarden web app" }, "importItems": { "message": "항목 가져오기" @@ -779,11 +821,8 @@ "shared": { "message": "공유됨" }, - "learnOrg": { - "message": "조직에 대해 알아보기" - }, - "learnOrgConfirmation": { - "message": "Bitwarden은 조직용 계정을 사용하면 사용자의 보관함을 타인에게 공유할 수 있습니다. bitwarden.com 웹 사이트를 방문하여 더 자세히 알아보시겠습니까?" + "bitwardenForBusinessPageDesc": { + "message": "Bitwarden for Business allows you to share your vault items with others by using an organization. Learn more on the bitwarden.com website." }, "moveToOrganization": { "message": "조직으로 이동하기" @@ -1714,6 +1753,12 @@ "biometricsNotSupportedDesc": { "message": "이 기기에서는 생체 인식이 지원되지 않습니다." }, + "biometricsNotUnlockedTitle": { + "message": "User locked or logged out" + }, + "biometricsNotUnlockedDesc": { + "message": "Please unlock this user in the desktop application and try again." + }, "biometricsFailedTitle": { "message": "Biometrics failed" }, @@ -2177,6 +2222,108 @@ "forwardedEmailDesc": { "message": "Generate an email alias with an external forwarding service." }, + "forwarderError": { + "message": "$SERVICENAME$ error: $ERRORMESSAGE$", + "description": "Reports an error returned by a forwarding service to the user.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + }, + "errormessage": { + "content": "$2", + "example": "Invalid characters in domain name." + } + } + }, + "forwarderGeneratedBy": { + "message": "Generated by Bitwarden.", + "description": "Displayed with the address on the forwarding service's configuration screen." + }, + "forwarderGeneratedByWithWebsite": { + "message": "Website: $WEBSITE$. Generated by Bitwarden.", + "description": "Displayed with the address on the forwarding service's configuration screen.", + "placeholders": { + "WEBSITE": { + "content": "$1", + "example": "www.example.com" + } + } + }, + "forwaderInvalidToken": { + "message": "Invalid $SERVICENAME$ API token", + "description": "Displayed when the user's API token is empty or rejected by the forwarding service.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwaderInvalidTokenWithMessage": { + "message": "Invalid $SERVICENAME$ API token: $ERRORMESSAGE$", + "description": "Displayed when the user's API token is rejected by the forwarding service with an error message.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + }, + "errormessage": { + "content": "$2", + "example": "Please verify your email address to continue." + } + } + }, + "forwarderNoAccountId": { + "message": "Unable to obtain $SERVICENAME$ masked email account ID.", + "description": "Displayed when the forwarding service fails to return an account ID.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderNoDomain": { + "message": "Invalid $SERVICENAME$ domain.", + "description": "Displayed when the domain is empty or domain authorization failed at the forwarding service.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderNoUrl": { + "message": "Invalid $SERVICENAME$ url.", + "description": "Displayed when the url of the forwarding service wasn't supplied.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderUnknownError": { + "message": "Unknown $SERVICENAME$ error occurred.", + "description": "Displayed when the forwarding service failed due to an unknown error.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderUnknownForwarder": { + "message": "Unknown forwarder: '$SERVICENAME$'.", + "description": "Displayed when the forwarding service is not supported.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "JustTrust.us" + } + } + }, "hostname": { "message": "Hostname", "description": "Part of a URL." @@ -3029,6 +3176,41 @@ "message": "to make them visible.", "description": "This will be part of a larger sentence, which will read like so: Assign these items to a collection from the Admin Console to make them visible." }, + "autofillSuggestions": { + "message": "Auto-fill suggestions" + }, + "autofillSuggestionsTip": { + "message": "Save a login item for this site to auto-fill" + }, + "yourVaultIsEmpty": { + "message": "Your vault is empty" + }, + "noItemsMatchSearch": { + "message": "No items match your search" + }, + "clearFiltersOrTryAnother": { + "message": "Clear filters or try another search term" + }, + "copyInfo": { + "message": "Copy info, $ITEMNAME$", + "description": "Aria label for a button that opens a menu with options to copy information from an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "moreOptions": { + "message": "More options, $ITEMNAME$", + "description": "Aria label for a button that opens a menu with more options for an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, "adminConsole": { "message": "Admin Console" }, @@ -3046,5 +3228,38 @@ }, "errorAssigningTargetFolder": { "message": "Error assigning target folder." + }, + "viewItemsIn": { + "message": "View items in $NAME$", + "description": "Button to view the contents of a folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "backTo": { + "message": "Back to $NAME$", + "description": "Navigate back to a previous folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "new": { + "message": "New" + }, + "removeItem": { + "message": "Remove $NAME$", + "description": "Remove a selected option, such as a folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } } } diff --git a/apps/browser/src/_locales/lt/messages.json b/apps/browser/src/_locales/lt/messages.json index c160ae5788b..9dff31e617a 100644 --- a/apps/browser/src/_locales/lt/messages.json +++ b/apps/browser/src/_locales/lt/messages.json @@ -166,15 +166,21 @@ "confirmIdentity": { "message": "Norint tęsti, patvirtinkite tapatybę." }, - "account": { - "message": "Paskyra" - }, "changeMasterPassword": { "message": "Keisti pagrindinį slaptažodį" }, "continueToWebApp": { "message": "Tęsti į žiniatinklio programėlę?" }, + "continueToWebAppDesc": { + "message": "Explore more features of your Bitwarden account on the web app." + }, + "continueToHelpCenter": { + "message": "Continue to Help Center?" + }, + "continueToHelpCenterDesc": { + "message": "Learn more about how to use Bitwarden on the Help Center." + }, "changeMasterPasswordOnWebConfirmation": { "message": "Pagrindinį slaptažodį galite pakeisti „Bitwarden“ žiniatinklio programėlėje." }, @@ -192,9 +198,45 @@ "logOut": { "message": "Atsijungti" }, + "aboutBitwarden": { + "message": "About Bitwarden" + }, "about": { "message": "Apie" }, + "moreFromBitwarden": { + "message": "More from Bitwarden" + }, + "continueToBitwardenDotCom": { + "message": "Continue to bitwarden.com?" + }, + "bitwardenForBusiness": { + "message": "Bitwarden for Business" + }, + "bitwardenAuthenticator": { + "message": "Bitwarden Authenticator" + }, + "continueToAuthenticatorPageDesc": { + "message": "Bitwarden Authenticator allows you to store authenticator keys and generate TOTP codes for 2-step verification flows. Learn more on the bitwarden.com website" + }, + "bitwardenSecretsManager": { + "message": "Bitwarden Secrets Manager" + }, + "continueToSecretsManagerPageDesc": { + "message": "Securely store, manage, and share developer secrets with Bitwarden Secrets Manager. Learn more on the bitwarden.com website." + }, + "passwordlessDotDev": { + "message": "Passwordless.dev" + }, + "continueToPasswordlessDotDevPageDesc": { + "message": "Create smooth and secure login experiences free from traditional passwords with Passwordless.dev. Learn more on the bitwarden.com website." + }, + "freeBitwardenFamilies": { + "message": "Free Bitwarden Families" + }, + "freeBitwardenFamiliesPageDesc": { + "message": "You are eligible for Free Bitwarden Families. Redeem this offer today in the web app." + }, "version": { "message": "Versija" }, @@ -253,8 +295,8 @@ "passGenInfo": { "message": "Automatiškai generuokite stiprius, unikalius prisijungimo slaptažodžius." }, - "bitWebVault": { - "message": "„Bitwarden“ žiniatinklio saugykla" + "bitWebVaultApp": { + "message": "Bitwarden web app" }, "importItems": { "message": "Importuoti elementus" @@ -779,11 +821,8 @@ "shared": { "message": "Pasidalinti" }, - "learnOrg": { - "message": "Sužinoti apie organizacijas" - }, - "learnOrgConfirmation": { - "message": "„Bitwarden“ leidžia dalytis saugyklos elementais su kitais naudojantis organizacija. Ar norėtumėte apsilankyti „bitwarden.com“ svetainėje ir sužinoti daugiau?" + "bitwardenForBusinessPageDesc": { + "message": "Bitwarden for Business allows you to share your vault items with others by using an organization. Learn more on the bitwarden.com website." }, "moveToOrganization": { "message": "Perkelti į organizaciją" @@ -1714,6 +1753,12 @@ "biometricsNotSupportedDesc": { "message": "Šiame įrenginyje biometrikos negalima naudoti." }, + "biometricsNotUnlockedTitle": { + "message": "User locked or logged out" + }, + "biometricsNotUnlockedDesc": { + "message": "Please unlock this user in the desktop application and try again." + }, "biometricsFailedTitle": { "message": "Biometrika nepavyko" }, @@ -2177,6 +2222,108 @@ "forwardedEmailDesc": { "message": "Sugeneruoti el. pašto slapyvardį su išorine persiuntimo paslauga." }, + "forwarderError": { + "message": "$SERVICENAME$ error: $ERRORMESSAGE$", + "description": "Reports an error returned by a forwarding service to the user.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + }, + "errormessage": { + "content": "$2", + "example": "Invalid characters in domain name." + } + } + }, + "forwarderGeneratedBy": { + "message": "Generated by Bitwarden.", + "description": "Displayed with the address on the forwarding service's configuration screen." + }, + "forwarderGeneratedByWithWebsite": { + "message": "Website: $WEBSITE$. Generated by Bitwarden.", + "description": "Displayed with the address on the forwarding service's configuration screen.", + "placeholders": { + "WEBSITE": { + "content": "$1", + "example": "www.example.com" + } + } + }, + "forwaderInvalidToken": { + "message": "Invalid $SERVICENAME$ API token", + "description": "Displayed when the user's API token is empty or rejected by the forwarding service.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwaderInvalidTokenWithMessage": { + "message": "Invalid $SERVICENAME$ API token: $ERRORMESSAGE$", + "description": "Displayed when the user's API token is rejected by the forwarding service with an error message.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + }, + "errormessage": { + "content": "$2", + "example": "Please verify your email address to continue." + } + } + }, + "forwarderNoAccountId": { + "message": "Unable to obtain $SERVICENAME$ masked email account ID.", + "description": "Displayed when the forwarding service fails to return an account ID.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderNoDomain": { + "message": "Invalid $SERVICENAME$ domain.", + "description": "Displayed when the domain is empty or domain authorization failed at the forwarding service.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderNoUrl": { + "message": "Invalid $SERVICENAME$ url.", + "description": "Displayed when the url of the forwarding service wasn't supplied.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderUnknownError": { + "message": "Unknown $SERVICENAME$ error occurred.", + "description": "Displayed when the forwarding service failed due to an unknown error.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderUnknownForwarder": { + "message": "Unknown forwarder: '$SERVICENAME$'.", + "description": "Displayed when the forwarding service is not supported.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "JustTrust.us" + } + } + }, "hostname": { "message": "Pagrindinio kompiuterio vardas", "description": "Part of a URL." @@ -3029,6 +3176,41 @@ "message": ", kad jie būtų matomi.", "description": "This will be part of a larger sentence, which will read like so: Assign these items to a collection from the Admin Console to make them visible." }, + "autofillSuggestions": { + "message": "Auto-fill suggestions" + }, + "autofillSuggestionsTip": { + "message": "Save a login item for this site to auto-fill" + }, + "yourVaultIsEmpty": { + "message": "Your vault is empty" + }, + "noItemsMatchSearch": { + "message": "No items match your search" + }, + "clearFiltersOrTryAnother": { + "message": "Clear filters or try another search term" + }, + "copyInfo": { + "message": "Copy info, $ITEMNAME$", + "description": "Aria label for a button that opens a menu with options to copy information from an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "moreOptions": { + "message": "More options, $ITEMNAME$", + "description": "Aria label for a button that opens a menu with more options for an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, "adminConsole": { "message": "Administratoriaus konsolės" }, @@ -3046,5 +3228,38 @@ }, "errorAssigningTargetFolder": { "message": "Klaida priskiriant tikslinį aplanką." + }, + "viewItemsIn": { + "message": "View items in $NAME$", + "description": "Button to view the contents of a folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "backTo": { + "message": "Back to $NAME$", + "description": "Navigate back to a previous folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "new": { + "message": "New" + }, + "removeItem": { + "message": "Remove $NAME$", + "description": "Remove a selected option, such as a folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } } } diff --git a/apps/browser/src/_locales/lv/messages.json b/apps/browser/src/_locales/lv/messages.json index c7ec65403d9..33c390f9e03 100644 --- a/apps/browser/src/_locales/lv/messages.json +++ b/apps/browser/src/_locales/lv/messages.json @@ -3,11 +3,11 @@ "message": "Bitwarden" }, "extName": { - "message": "Bitwarden Password Manager", + "message": "Bitwarden paroļu pārvaldnieks", "description": "Extension name, MUST be less than 40 characters (Safari restriction)" }, "extDesc": { - "message": "At home, at work, or on the go, Bitwarden easily secures all your passwords, passkeys, and sensitive information", + "message": "Bitwarden viegli aizsargā visas paroles, paroļu atslēgas un jutīgu informāciju mājās, darbā vai ceļā", "description": "Extension description, MUST be less than 112 characters (Safari restriction)" }, "loginOrCreateNewAccount": { @@ -166,15 +166,21 @@ "confirmIdentity": { "message": "Jāapstiprina identitāte, lai turpinātu." }, - "account": { - "message": "Konts" - }, "changeMasterPassword": { "message": "Mainīt galveno paroli" }, "continueToWebApp": { "message": "Pāriet uz tīmekļa lietotni?" }, + "continueToWebAppDesc": { + "message": "Vairāk sava Bitwarden konta iespēju var izpētīt tīmekļa vietnē." + }, + "continueToHelpCenter": { + "message": "Pāriet uz palīdzības centru?" + }, + "continueToHelpCenterDesc": { + "message": "Vairāk par to, kā izmantot Bitwarden, var uzzināt palīdzības centrā." + }, "changeMasterPasswordOnWebConfirmation": { "message": "Savu galveno paroli var mainīt Bitwarden tīmekļa lietotnē." }, @@ -192,9 +198,45 @@ "logOut": { "message": "Atteikties" }, + "aboutBitwarden": { + "message": "Par Bitwarden" + }, "about": { "message": "Par" }, + "moreFromBitwarden": { + "message": "Vairāk no Bitwarden" + }, + "continueToBitwardenDotCom": { + "message": "Pāriet uz bitwarden.com?" + }, + "bitwardenForBusiness": { + "message": "Bitwarden uzņēmējdarbībai" + }, + "bitwardenAuthenticator": { + "message": "Bitwarden autentificētājs" + }, + "continueToAuthenticatorPageDesc": { + "message": "Bitwarden autentificētājs ļauj glabāt autentificētāja atslēgas un izveidot TOTP kodus divpakāpju apliecināšanas plūsmām. Vairāk var uzzināt tīmekļvietnē bitwarden.com" + }, + "bitwardenSecretsManager": { + "message": "Bitwarden noslēpumu pārvaldnieks" + }, + "continueToSecretsManagerPageDesc": { + "message": "Droša izstrādātāju noslēpumu uzglabāšana, pārvaldīšana un kopīgošana ar Bitwarden noslēpumu pārvaldnieku. Vairāk var uzzināt tīmekļvietnē bitwarden.com." + }, + "passwordlessDotDev": { + "message": "Passwordless.dev" + }, + "continueToPasswordlessDotDevPageDesc": { + "message": "Plūdenu un drošu pieteikšanās pieredžu, kas ir brīvas no ierastajām parolēm, izveidošana ar Passwordless.dev. Vairāk var uzzināt tīmekļvietnē bitwarden.com." + }, + "freeBitwardenFamilies": { + "message": "Bezmaksas Bitwarden ģimenēm" + }, + "freeBitwardenFamiliesPageDesc": { + "message": "Tev ir tiesības uz bezmaksas Bitwarden ģimenēm. Šo piedāvājumu šodien var pieņemt tīmekļa lietotnē." + }, "version": { "message": "Laidiens" }, @@ -253,8 +295,8 @@ "passGenInfo": { "message": "Automātiski veido spēcīgas, neatkārtojamas paroles visiem pieteikšanās vienumiem." }, - "bitWebVault": { - "message": "Bitwarden tīmekļa glabātava" + "bitWebVaultApp": { + "message": "Bitwarden tīmekļa lietotne" }, "importItems": { "message": "Ievietot vienumus" @@ -779,11 +821,8 @@ "shared": { "message": "Kopīgots" }, - "learnOrg": { - "message": "Uzzināt par apvienībām" - }, - "learnOrgConfirmation": { - "message": "Bitwarden nodrošina iespēju kopīgot glabātavas vienumus ar citiem, kad tiek izmantota apvienība. Vai apmeklēt bitwarden.com tīmekļvietni, lai uzzinātu vairāk?" + "bitwardenForBusinessPageDesc": { + "message": "Bitwarden uzņēmējdarbībai nodrošina iespēju kopīgot savas glabātavas vienumus ar citiem, kad tiek izmantota apvienība. Vairāk var uzzināt tīmekļvietnē bitwarden.com." }, "moveToOrganization": { "message": "Pārvietot uz apvienību" @@ -1714,6 +1753,12 @@ "biometricsNotSupportedDesc": { "message": "Šajā ierīcē netiek atbalstīta pārlūka biometrija." }, + "biometricsNotUnlockedTitle": { + "message": "Lietotājs aizslēgts vai izrakstījies" + }, + "biometricsNotUnlockedDesc": { + "message": "Lūgums atslēgt šo lietotāju darbvirsmas lietotnē un mēģināt vēlreiz." + }, "biometricsFailedTitle": { "message": "Biometrija neizdevās" }, @@ -2177,6 +2222,108 @@ "forwardedEmailDesc": { "message": "Izveidot e-pastu aizstājvārdu ar ārēju pārvirzīšanas pakalpojumu." }, + "forwarderError": { + "message": "$SERVICENAME$ kļūda: $ERRORMESSAGE$", + "description": "Reports an error returned by a forwarding service to the user.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + }, + "errormessage": { + "content": "$2", + "example": "Invalid characters in domain name." + } + } + }, + "forwarderGeneratedBy": { + "message": "Izveidoja Bitwarden.", + "description": "Displayed with the address on the forwarding service's configuration screen." + }, + "forwarderGeneratedByWithWebsite": { + "message": "Tīmekļvietne: $WEBSITE$. Izveidoja Bitwarden.", + "description": "Displayed with the address on the forwarding service's configuration screen.", + "placeholders": { + "WEBSITE": { + "content": "$1", + "example": "www.example.com" + } + } + }, + "forwaderInvalidToken": { + "message": "Nederīga $SERVICENAME$ API pilnvara", + "description": "Displayed when the user's API token is empty or rejected by the forwarding service.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwaderInvalidTokenWithMessage": { + "message": "Nederīga $SERVICENAME$ API pilnvara: $ERRORMESSAGE$", + "description": "Displayed when the user's API token is rejected by the forwarding service with an error message.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + }, + "errormessage": { + "content": "$2", + "example": "Please verify your email address to continue." + } + } + }, + "forwarderNoAccountId": { + "message": "Neizdevās iegūt $SERVICENAME$ aizsegta e-pasta konta Id.", + "description": "Displayed when the forwarding service fails to return an account ID.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderNoDomain": { + "message": "Nederīgs $SERVICENAME$ domēna vārds.", + "description": "Displayed when the domain is empty or domain authorization failed at the forwarding service.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderNoUrl": { + "message": "Nederīgs $SERVICENAME$ URL.", + "description": "Displayed when the url of the forwarding service wasn't supplied.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderUnknownError": { + "message": "Atgadījās nezināma $SERVICENAME$ kļūda.", + "description": "Displayed when the forwarding service failed due to an unknown error.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderUnknownForwarder": { + "message": "Nezināms pārsūtītājs: '$SERVICENAME$'.", + "description": "Displayed when the forwarding service is not supported.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "JustTrust.us" + } + } + }, "hostname": { "message": "Resursdatora nosaukums", "description": "Part of a URL." @@ -3029,6 +3176,41 @@ "message": "lai padarītu tos redzamus.", "description": "This will be part of a larger sentence, which will read like so: Assign these items to a collection from the Admin Console to make them visible." }, + "autofillSuggestions": { + "message": "Ieteikumi automātiskajai aizpildei" + }, + "autofillSuggestionsTip": { + "message": "Saglabāt pieteikšanās vienumi, ko automātiski aizpildīt šajā vietnē" + }, + "yourVaultIsEmpty": { + "message": "Glabātava ir tukša" + }, + "noItemsMatchSearch": { + "message": "Neviens vienums neatbilst meklētajam" + }, + "clearFiltersOrTryAnother": { + "message": "Jānotīra atlases vērtības vai jāmēģina cits meklēšanas vaicājums" + }, + "copyInfo": { + "message": "Kopēt informāciju, $ITEMNAME$", + "description": "Aria label for a button that opens a menu with options to copy information from an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "moreOptions": { + "message": "Vairāk iespēju, $ITEMNAME$", + "description": "Aria label for a button that opens a menu with more options for an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, "adminConsole": { "message": "pārvaldības konsolē," }, @@ -3046,5 +3228,38 @@ }, "errorAssigningTargetFolder": { "message": "Kļūda mērķa mapes piešķiršanā." + }, + "viewItemsIn": { + "message": "View items in $NAME$", + "description": "Button to view the contents of a folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "backTo": { + "message": "Back to $NAME$", + "description": "Navigate back to a previous folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "new": { + "message": "Jauns" + }, + "removeItem": { + "message": "Remove $NAME$", + "description": "Remove a selected option, such as a folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } } } diff --git a/apps/browser/src/_locales/ml/messages.json b/apps/browser/src/_locales/ml/messages.json index 0d7049b8552..24235587d0d 100644 --- a/apps/browser/src/_locales/ml/messages.json +++ b/apps/browser/src/_locales/ml/messages.json @@ -166,15 +166,21 @@ "confirmIdentity": { "message": "Confirm your identity to continue." }, - "account": { - "message": "അക്കൗണ്ട്" - }, "changeMasterPassword": { "message": "പ്രാഥമിക പാസ്‌വേഡ് മാറ്റുക" }, "continueToWebApp": { "message": "Continue to web app?" }, + "continueToWebAppDesc": { + "message": "Explore more features of your Bitwarden account on the web app." + }, + "continueToHelpCenter": { + "message": "Continue to Help Center?" + }, + "continueToHelpCenterDesc": { + "message": "Learn more about how to use Bitwarden on the Help Center." + }, "changeMasterPasswordOnWebConfirmation": { "message": "You can change your master password on the Bitwarden web app." }, @@ -192,9 +198,45 @@ "logOut": { "message": "ലോഗ് ഔട്ട്" }, + "aboutBitwarden": { + "message": "About Bitwarden" + }, "about": { "message": "ഇതിനെ കുറിച്ച്" }, + "moreFromBitwarden": { + "message": "More from Bitwarden" + }, + "continueToBitwardenDotCom": { + "message": "Continue to bitwarden.com?" + }, + "bitwardenForBusiness": { + "message": "Bitwarden for Business" + }, + "bitwardenAuthenticator": { + "message": "Bitwarden Authenticator" + }, + "continueToAuthenticatorPageDesc": { + "message": "Bitwarden Authenticator allows you to store authenticator keys and generate TOTP codes for 2-step verification flows. Learn more on the bitwarden.com website" + }, + "bitwardenSecretsManager": { + "message": "Bitwarden Secrets Manager" + }, + "continueToSecretsManagerPageDesc": { + "message": "Securely store, manage, and share developer secrets with Bitwarden Secrets Manager. Learn more on the bitwarden.com website." + }, + "passwordlessDotDev": { + "message": "Passwordless.dev" + }, + "continueToPasswordlessDotDevPageDesc": { + "message": "Create smooth and secure login experiences free from traditional passwords with Passwordless.dev. Learn more on the bitwarden.com website." + }, + "freeBitwardenFamilies": { + "message": "Free Bitwarden Families" + }, + "freeBitwardenFamiliesPageDesc": { + "message": "You are eligible for Free Bitwarden Families. Redeem this offer today in the web app." + }, "version": { "message": "വേർഷൻ " }, @@ -253,8 +295,8 @@ "passGenInfo": { "message": "യാന്ത്രികമായി ശക്തമായ പാസ്സ്‌വേർഡുകൾ നിങ്ങളുടെ ലോഗിന് വേണ്ടി നിർമിക്കുക " }, - "bitWebVault": { - "message": "Bitwarden വെബ് വാൾട് " + "bitWebVaultApp": { + "message": "Bitwarden web app" }, "importItems": { "message": "ഇനങ്ങൾ ഇമ്പോർട് ചെയ്യുക" @@ -779,11 +821,8 @@ "shared": { "message": "പങ്കിട്ടവ" }, - "learnOrg": { - "message": "Learn about organizations" - }, - "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?" + "bitwardenForBusinessPageDesc": { + "message": "Bitwarden for Business allows you to share your vault items with others by using an organization. Learn more on the bitwarden.com website." }, "moveToOrganization": { "message": "Move to organization" @@ -1714,6 +1753,12 @@ "biometricsNotSupportedDesc": { "message": "Browser biometrics is not supported on this device." }, + "biometricsNotUnlockedTitle": { + "message": "User locked or logged out" + }, + "biometricsNotUnlockedDesc": { + "message": "Please unlock this user in the desktop application and try again." + }, "biometricsFailedTitle": { "message": "Biometrics failed" }, @@ -2177,6 +2222,108 @@ "forwardedEmailDesc": { "message": "Generate an email alias with an external forwarding service." }, + "forwarderError": { + "message": "$SERVICENAME$ error: $ERRORMESSAGE$", + "description": "Reports an error returned by a forwarding service to the user.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + }, + "errormessage": { + "content": "$2", + "example": "Invalid characters in domain name." + } + } + }, + "forwarderGeneratedBy": { + "message": "Generated by Bitwarden.", + "description": "Displayed with the address on the forwarding service's configuration screen." + }, + "forwarderGeneratedByWithWebsite": { + "message": "Website: $WEBSITE$. Generated by Bitwarden.", + "description": "Displayed with the address on the forwarding service's configuration screen.", + "placeholders": { + "WEBSITE": { + "content": "$1", + "example": "www.example.com" + } + } + }, + "forwaderInvalidToken": { + "message": "Invalid $SERVICENAME$ API token", + "description": "Displayed when the user's API token is empty or rejected by the forwarding service.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwaderInvalidTokenWithMessage": { + "message": "Invalid $SERVICENAME$ API token: $ERRORMESSAGE$", + "description": "Displayed when the user's API token is rejected by the forwarding service with an error message.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + }, + "errormessage": { + "content": "$2", + "example": "Please verify your email address to continue." + } + } + }, + "forwarderNoAccountId": { + "message": "Unable to obtain $SERVICENAME$ masked email account ID.", + "description": "Displayed when the forwarding service fails to return an account ID.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderNoDomain": { + "message": "Invalid $SERVICENAME$ domain.", + "description": "Displayed when the domain is empty or domain authorization failed at the forwarding service.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderNoUrl": { + "message": "Invalid $SERVICENAME$ url.", + "description": "Displayed when the url of the forwarding service wasn't supplied.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderUnknownError": { + "message": "Unknown $SERVICENAME$ error occurred.", + "description": "Displayed when the forwarding service failed due to an unknown error.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderUnknownForwarder": { + "message": "Unknown forwarder: '$SERVICENAME$'.", + "description": "Displayed when the forwarding service is not supported.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "JustTrust.us" + } + } + }, "hostname": { "message": "Hostname", "description": "Part of a URL." @@ -3029,6 +3176,41 @@ "message": "to make them visible.", "description": "This will be part of a larger sentence, which will read like so: Assign these items to a collection from the Admin Console to make them visible." }, + "autofillSuggestions": { + "message": "Auto-fill suggestions" + }, + "autofillSuggestionsTip": { + "message": "Save a login item for this site to auto-fill" + }, + "yourVaultIsEmpty": { + "message": "Your vault is empty" + }, + "noItemsMatchSearch": { + "message": "No items match your search" + }, + "clearFiltersOrTryAnother": { + "message": "Clear filters or try another search term" + }, + "copyInfo": { + "message": "Copy info, $ITEMNAME$", + "description": "Aria label for a button that opens a menu with options to copy information from an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "moreOptions": { + "message": "More options, $ITEMNAME$", + "description": "Aria label for a button that opens a menu with more options for an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, "adminConsole": { "message": "Admin Console" }, @@ -3046,5 +3228,38 @@ }, "errorAssigningTargetFolder": { "message": "Error assigning target folder." + }, + "viewItemsIn": { + "message": "View items in $NAME$", + "description": "Button to view the contents of a folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "backTo": { + "message": "Back to $NAME$", + "description": "Navigate back to a previous folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "new": { + "message": "New" + }, + "removeItem": { + "message": "Remove $NAME$", + "description": "Remove a selected option, such as a folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } } } diff --git a/apps/browser/src/_locales/mr/messages.json b/apps/browser/src/_locales/mr/messages.json index f44649d1c30..dc0edb74e58 100644 --- a/apps/browser/src/_locales/mr/messages.json +++ b/apps/browser/src/_locales/mr/messages.json @@ -166,15 +166,21 @@ "confirmIdentity": { "message": "पुढे जाण्यासाठी तुमच्या ओळखीची पुष्टी करा." }, - "account": { - "message": "खाते" - }, "changeMasterPassword": { "message": "मुख्य पासवर्ड बदला" }, "continueToWebApp": { "message": "Continue to web app?" }, + "continueToWebAppDesc": { + "message": "Explore more features of your Bitwarden account on the web app." + }, + "continueToHelpCenter": { + "message": "Continue to Help Center?" + }, + "continueToHelpCenterDesc": { + "message": "Learn more about how to use Bitwarden on the Help Center." + }, "changeMasterPasswordOnWebConfirmation": { "message": "You can change your master password on the Bitwarden web app." }, @@ -192,9 +198,45 @@ "logOut": { "message": "बाहेर पडा" }, + "aboutBitwarden": { + "message": "About Bitwarden" + }, "about": { "message": "आमच्या विषयी" }, + "moreFromBitwarden": { + "message": "More from Bitwarden" + }, + "continueToBitwardenDotCom": { + "message": "Continue to bitwarden.com?" + }, + "bitwardenForBusiness": { + "message": "Bitwarden for Business" + }, + "bitwardenAuthenticator": { + "message": "Bitwarden Authenticator" + }, + "continueToAuthenticatorPageDesc": { + "message": "Bitwarden Authenticator allows you to store authenticator keys and generate TOTP codes for 2-step verification flows. Learn more on the bitwarden.com website" + }, + "bitwardenSecretsManager": { + "message": "Bitwarden Secrets Manager" + }, + "continueToSecretsManagerPageDesc": { + "message": "Securely store, manage, and share developer secrets with Bitwarden Secrets Manager. Learn more on the bitwarden.com website." + }, + "passwordlessDotDev": { + "message": "Passwordless.dev" + }, + "continueToPasswordlessDotDevPageDesc": { + "message": "Create smooth and secure login experiences free from traditional passwords with Passwordless.dev. Learn more on the bitwarden.com website." + }, + "freeBitwardenFamilies": { + "message": "Free Bitwarden Families" + }, + "freeBitwardenFamiliesPageDesc": { + "message": "You are eligible for Free Bitwarden Families. Redeem this offer today in the web app." + }, "version": { "message": "आवृत्ती" }, @@ -253,8 +295,8 @@ "passGenInfo": { "message": "Automatically generate strong, unique passwords for your logins." }, - "bitWebVault": { - "message": "Bitwarden web vault" + "bitWebVaultApp": { + "message": "Bitwarden web app" }, "importItems": { "message": "वस्तू आयात करा" @@ -779,11 +821,8 @@ "shared": { "message": "Shared" }, - "learnOrg": { - "message": "Learn about organizations" - }, - "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?" + "bitwardenForBusinessPageDesc": { + "message": "Bitwarden for Business allows you to share your vault items with others by using an organization. Learn more on the bitwarden.com website." }, "moveToOrganization": { "message": "Move to organization" @@ -1714,6 +1753,12 @@ "biometricsNotSupportedDesc": { "message": "Browser biometrics is not supported on this device." }, + "biometricsNotUnlockedTitle": { + "message": "User locked or logged out" + }, + "biometricsNotUnlockedDesc": { + "message": "Please unlock this user in the desktop application and try again." + }, "biometricsFailedTitle": { "message": "Biometrics failed" }, @@ -2177,6 +2222,108 @@ "forwardedEmailDesc": { "message": "Generate an email alias with an external forwarding service." }, + "forwarderError": { + "message": "$SERVICENAME$ error: $ERRORMESSAGE$", + "description": "Reports an error returned by a forwarding service to the user.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + }, + "errormessage": { + "content": "$2", + "example": "Invalid characters in domain name." + } + } + }, + "forwarderGeneratedBy": { + "message": "Generated by Bitwarden.", + "description": "Displayed with the address on the forwarding service's configuration screen." + }, + "forwarderGeneratedByWithWebsite": { + "message": "Website: $WEBSITE$. Generated by Bitwarden.", + "description": "Displayed with the address on the forwarding service's configuration screen.", + "placeholders": { + "WEBSITE": { + "content": "$1", + "example": "www.example.com" + } + } + }, + "forwaderInvalidToken": { + "message": "Invalid $SERVICENAME$ API token", + "description": "Displayed when the user's API token is empty or rejected by the forwarding service.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwaderInvalidTokenWithMessage": { + "message": "Invalid $SERVICENAME$ API token: $ERRORMESSAGE$", + "description": "Displayed when the user's API token is rejected by the forwarding service with an error message.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + }, + "errormessage": { + "content": "$2", + "example": "Please verify your email address to continue." + } + } + }, + "forwarderNoAccountId": { + "message": "Unable to obtain $SERVICENAME$ masked email account ID.", + "description": "Displayed when the forwarding service fails to return an account ID.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderNoDomain": { + "message": "Invalid $SERVICENAME$ domain.", + "description": "Displayed when the domain is empty or domain authorization failed at the forwarding service.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderNoUrl": { + "message": "Invalid $SERVICENAME$ url.", + "description": "Displayed when the url of the forwarding service wasn't supplied.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderUnknownError": { + "message": "Unknown $SERVICENAME$ error occurred.", + "description": "Displayed when the forwarding service failed due to an unknown error.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderUnknownForwarder": { + "message": "Unknown forwarder: '$SERVICENAME$'.", + "description": "Displayed when the forwarding service is not supported.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "JustTrust.us" + } + } + }, "hostname": { "message": "Hostname", "description": "Part of a URL." @@ -3029,6 +3176,41 @@ "message": "to make them visible.", "description": "This will be part of a larger sentence, which will read like so: Assign these items to a collection from the Admin Console to make them visible." }, + "autofillSuggestions": { + "message": "Auto-fill suggestions" + }, + "autofillSuggestionsTip": { + "message": "Save a login item for this site to auto-fill" + }, + "yourVaultIsEmpty": { + "message": "Your vault is empty" + }, + "noItemsMatchSearch": { + "message": "No items match your search" + }, + "clearFiltersOrTryAnother": { + "message": "Clear filters or try another search term" + }, + "copyInfo": { + "message": "Copy info, $ITEMNAME$", + "description": "Aria label for a button that opens a menu with options to copy information from an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "moreOptions": { + "message": "More options, $ITEMNAME$", + "description": "Aria label for a button that opens a menu with more options for an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, "adminConsole": { "message": "Admin Console" }, @@ -3046,5 +3228,38 @@ }, "errorAssigningTargetFolder": { "message": "Error assigning target folder." + }, + "viewItemsIn": { + "message": "View items in $NAME$", + "description": "Button to view the contents of a folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "backTo": { + "message": "Back to $NAME$", + "description": "Navigate back to a previous folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "new": { + "message": "New" + }, + "removeItem": { + "message": "Remove $NAME$", + "description": "Remove a selected option, such as a folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } } } diff --git a/apps/browser/src/_locales/my/messages.json b/apps/browser/src/_locales/my/messages.json index b45fdef39e8..e042785011c 100644 --- a/apps/browser/src/_locales/my/messages.json +++ b/apps/browser/src/_locales/my/messages.json @@ -166,15 +166,21 @@ "confirmIdentity": { "message": "Confirm your identity to continue." }, - "account": { - "message": "Account" - }, "changeMasterPassword": { "message": "Change master password" }, "continueToWebApp": { "message": "Continue to web app?" }, + "continueToWebAppDesc": { + "message": "Explore more features of your Bitwarden account on the web app." + }, + "continueToHelpCenter": { + "message": "Continue to Help Center?" + }, + "continueToHelpCenterDesc": { + "message": "Learn more about how to use Bitwarden on the Help Center." + }, "changeMasterPasswordOnWebConfirmation": { "message": "You can change your master password on the Bitwarden web app." }, @@ -192,9 +198,45 @@ "logOut": { "message": "Log out" }, + "aboutBitwarden": { + "message": "About Bitwarden" + }, "about": { "message": "About" }, + "moreFromBitwarden": { + "message": "More from Bitwarden" + }, + "continueToBitwardenDotCom": { + "message": "Continue to bitwarden.com?" + }, + "bitwardenForBusiness": { + "message": "Bitwarden for Business" + }, + "bitwardenAuthenticator": { + "message": "Bitwarden Authenticator" + }, + "continueToAuthenticatorPageDesc": { + "message": "Bitwarden Authenticator allows you to store authenticator keys and generate TOTP codes for 2-step verification flows. Learn more on the bitwarden.com website" + }, + "bitwardenSecretsManager": { + "message": "Bitwarden Secrets Manager" + }, + "continueToSecretsManagerPageDesc": { + "message": "Securely store, manage, and share developer secrets with Bitwarden Secrets Manager. Learn more on the bitwarden.com website." + }, + "passwordlessDotDev": { + "message": "Passwordless.dev" + }, + "continueToPasswordlessDotDevPageDesc": { + "message": "Create smooth and secure login experiences free from traditional passwords with Passwordless.dev. Learn more on the bitwarden.com website." + }, + "freeBitwardenFamilies": { + "message": "Free Bitwarden Families" + }, + "freeBitwardenFamiliesPageDesc": { + "message": "You are eligible for Free Bitwarden Families. Redeem this offer today in the web app." + }, "version": { "message": "Version" }, @@ -253,8 +295,8 @@ "passGenInfo": { "message": "Automatically generate strong, unique passwords for your logins." }, - "bitWebVault": { - "message": "Bitwarden web vault" + "bitWebVaultApp": { + "message": "Bitwarden web app" }, "importItems": { "message": "Import items" @@ -779,11 +821,8 @@ "shared": { "message": "Shared" }, - "learnOrg": { - "message": "Learn about organizations" - }, - "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?" + "bitwardenForBusinessPageDesc": { + "message": "Bitwarden for Business allows you to share your vault items with others by using an organization. Learn more on the bitwarden.com website." }, "moveToOrganization": { "message": "Move to organization" @@ -1714,6 +1753,12 @@ "biometricsNotSupportedDesc": { "message": "Browser biometrics is not supported on this device." }, + "biometricsNotUnlockedTitle": { + "message": "User locked or logged out" + }, + "biometricsNotUnlockedDesc": { + "message": "Please unlock this user in the desktop application and try again." + }, "biometricsFailedTitle": { "message": "Biometrics failed" }, @@ -2177,6 +2222,108 @@ "forwardedEmailDesc": { "message": "Generate an email alias with an external forwarding service." }, + "forwarderError": { + "message": "$SERVICENAME$ error: $ERRORMESSAGE$", + "description": "Reports an error returned by a forwarding service to the user.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + }, + "errormessage": { + "content": "$2", + "example": "Invalid characters in domain name." + } + } + }, + "forwarderGeneratedBy": { + "message": "Generated by Bitwarden.", + "description": "Displayed with the address on the forwarding service's configuration screen." + }, + "forwarderGeneratedByWithWebsite": { + "message": "Website: $WEBSITE$. Generated by Bitwarden.", + "description": "Displayed with the address on the forwarding service's configuration screen.", + "placeholders": { + "WEBSITE": { + "content": "$1", + "example": "www.example.com" + } + } + }, + "forwaderInvalidToken": { + "message": "Invalid $SERVICENAME$ API token", + "description": "Displayed when the user's API token is empty or rejected by the forwarding service.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwaderInvalidTokenWithMessage": { + "message": "Invalid $SERVICENAME$ API token: $ERRORMESSAGE$", + "description": "Displayed when the user's API token is rejected by the forwarding service with an error message.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + }, + "errormessage": { + "content": "$2", + "example": "Please verify your email address to continue." + } + } + }, + "forwarderNoAccountId": { + "message": "Unable to obtain $SERVICENAME$ masked email account ID.", + "description": "Displayed when the forwarding service fails to return an account ID.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderNoDomain": { + "message": "Invalid $SERVICENAME$ domain.", + "description": "Displayed when the domain is empty or domain authorization failed at the forwarding service.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderNoUrl": { + "message": "Invalid $SERVICENAME$ url.", + "description": "Displayed when the url of the forwarding service wasn't supplied.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderUnknownError": { + "message": "Unknown $SERVICENAME$ error occurred.", + "description": "Displayed when the forwarding service failed due to an unknown error.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderUnknownForwarder": { + "message": "Unknown forwarder: '$SERVICENAME$'.", + "description": "Displayed when the forwarding service is not supported.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "JustTrust.us" + } + } + }, "hostname": { "message": "Hostname", "description": "Part of a URL." @@ -3029,6 +3176,41 @@ "message": "to make them visible.", "description": "This will be part of a larger sentence, which will read like so: Assign these items to a collection from the Admin Console to make them visible." }, + "autofillSuggestions": { + "message": "Auto-fill suggestions" + }, + "autofillSuggestionsTip": { + "message": "Save a login item for this site to auto-fill" + }, + "yourVaultIsEmpty": { + "message": "Your vault is empty" + }, + "noItemsMatchSearch": { + "message": "No items match your search" + }, + "clearFiltersOrTryAnother": { + "message": "Clear filters or try another search term" + }, + "copyInfo": { + "message": "Copy info, $ITEMNAME$", + "description": "Aria label for a button that opens a menu with options to copy information from an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "moreOptions": { + "message": "More options, $ITEMNAME$", + "description": "Aria label for a button that opens a menu with more options for an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, "adminConsole": { "message": "Admin Console" }, @@ -3046,5 +3228,38 @@ }, "errorAssigningTargetFolder": { "message": "Error assigning target folder." + }, + "viewItemsIn": { + "message": "View items in $NAME$", + "description": "Button to view the contents of a folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "backTo": { + "message": "Back to $NAME$", + "description": "Navigate back to a previous folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "new": { + "message": "New" + }, + "removeItem": { + "message": "Remove $NAME$", + "description": "Remove a selected option, such as a folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } } } diff --git a/apps/browser/src/_locales/nb/messages.json b/apps/browser/src/_locales/nb/messages.json index 8d54140b0e6..92e8ff47c25 100644 --- a/apps/browser/src/_locales/nb/messages.json +++ b/apps/browser/src/_locales/nb/messages.json @@ -166,15 +166,21 @@ "confirmIdentity": { "message": "Bekreft identiteten din for å fortsette." }, - "account": { - "message": "Konto" - }, "changeMasterPassword": { "message": "Endre hovedpassordet" }, "continueToWebApp": { "message": "Continue to web app?" }, + "continueToWebAppDesc": { + "message": "Explore more features of your Bitwarden account on the web app." + }, + "continueToHelpCenter": { + "message": "Continue to Help Center?" + }, + "continueToHelpCenterDesc": { + "message": "Learn more about how to use Bitwarden on the Help Center." + }, "changeMasterPasswordOnWebConfirmation": { "message": "You can change your master password on the Bitwarden web app." }, @@ -192,9 +198,45 @@ "logOut": { "message": "Logg ut" }, + "aboutBitwarden": { + "message": "About Bitwarden" + }, "about": { "message": "Om" }, + "moreFromBitwarden": { + "message": "More from Bitwarden" + }, + "continueToBitwardenDotCom": { + "message": "Continue to bitwarden.com?" + }, + "bitwardenForBusiness": { + "message": "Bitwarden for Business" + }, + "bitwardenAuthenticator": { + "message": "Bitwarden Authenticator" + }, + "continueToAuthenticatorPageDesc": { + "message": "Bitwarden Authenticator allows you to store authenticator keys and generate TOTP codes for 2-step verification flows. Learn more on the bitwarden.com website" + }, + "bitwardenSecretsManager": { + "message": "Bitwarden Secrets Manager" + }, + "continueToSecretsManagerPageDesc": { + "message": "Securely store, manage, and share developer secrets with Bitwarden Secrets Manager. Learn more on the bitwarden.com website." + }, + "passwordlessDotDev": { + "message": "Passwordless.dev" + }, + "continueToPasswordlessDotDevPageDesc": { + "message": "Create smooth and secure login experiences free from traditional passwords with Passwordless.dev. Learn more on the bitwarden.com website." + }, + "freeBitwardenFamilies": { + "message": "Free Bitwarden Families" + }, + "freeBitwardenFamiliesPageDesc": { + "message": "You are eligible for Free Bitwarden Families. Redeem this offer today in the web app." + }, "version": { "message": "Versjon" }, @@ -253,8 +295,8 @@ "passGenInfo": { "message": "Generer automatisk sterke og unike passord for dine innlogginger." }, - "bitWebVault": { - "message": "Bitwarden netthvelv" + "bitWebVaultApp": { + "message": "Bitwarden web app" }, "importItems": { "message": "Importer elementer" @@ -779,11 +821,8 @@ "shared": { "message": "Delt" }, - "learnOrg": { - "message": "Lær om organisasjoner" - }, - "learnOrgConfirmation": { - "message": "Bitwarden lar deg dele dine hvelvelementer med andre ved å bruke en organisasjon. Vil du besøke bitwarden.com for å lære mer?" + "bitwardenForBusinessPageDesc": { + "message": "Bitwarden for Business allows you to share your vault items with others by using an organization. Learn more on the bitwarden.com website." }, "moveToOrganization": { "message": "Flytt til organisasjon" @@ -1714,6 +1753,12 @@ "biometricsNotSupportedDesc": { "message": "Biometri i nettleseren støttes ikke på denne enheten." }, + "biometricsNotUnlockedTitle": { + "message": "User locked or logged out" + }, + "biometricsNotUnlockedDesc": { + "message": "Please unlock this user in the desktop application and try again." + }, "biometricsFailedTitle": { "message": "Biometri mislyktes" }, @@ -2177,6 +2222,108 @@ "forwardedEmailDesc": { "message": "Generer et e-postalias med en ekstern videresendingstjeneste." }, + "forwarderError": { + "message": "$SERVICENAME$ error: $ERRORMESSAGE$", + "description": "Reports an error returned by a forwarding service to the user.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + }, + "errormessage": { + "content": "$2", + "example": "Invalid characters in domain name." + } + } + }, + "forwarderGeneratedBy": { + "message": "Generated by Bitwarden.", + "description": "Displayed with the address on the forwarding service's configuration screen." + }, + "forwarderGeneratedByWithWebsite": { + "message": "Website: $WEBSITE$. Generated by Bitwarden.", + "description": "Displayed with the address on the forwarding service's configuration screen.", + "placeholders": { + "WEBSITE": { + "content": "$1", + "example": "www.example.com" + } + } + }, + "forwaderInvalidToken": { + "message": "Invalid $SERVICENAME$ API token", + "description": "Displayed when the user's API token is empty or rejected by the forwarding service.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwaderInvalidTokenWithMessage": { + "message": "Invalid $SERVICENAME$ API token: $ERRORMESSAGE$", + "description": "Displayed when the user's API token is rejected by the forwarding service with an error message.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + }, + "errormessage": { + "content": "$2", + "example": "Please verify your email address to continue." + } + } + }, + "forwarderNoAccountId": { + "message": "Unable to obtain $SERVICENAME$ masked email account ID.", + "description": "Displayed when the forwarding service fails to return an account ID.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderNoDomain": { + "message": "Invalid $SERVICENAME$ domain.", + "description": "Displayed when the domain is empty or domain authorization failed at the forwarding service.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderNoUrl": { + "message": "Invalid $SERVICENAME$ url.", + "description": "Displayed when the url of the forwarding service wasn't supplied.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderUnknownError": { + "message": "Unknown $SERVICENAME$ error occurred.", + "description": "Displayed when the forwarding service failed due to an unknown error.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderUnknownForwarder": { + "message": "Unknown forwarder: '$SERVICENAME$'.", + "description": "Displayed when the forwarding service is not supported.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "JustTrust.us" + } + } + }, "hostname": { "message": "Vertsnavn ", "description": "Part of a URL." @@ -3029,6 +3176,41 @@ "message": "to make them visible.", "description": "This will be part of a larger sentence, which will read like so: Assign these items to a collection from the Admin Console to make them visible." }, + "autofillSuggestions": { + "message": "Auto-fill suggestions" + }, + "autofillSuggestionsTip": { + "message": "Save a login item for this site to auto-fill" + }, + "yourVaultIsEmpty": { + "message": "Your vault is empty" + }, + "noItemsMatchSearch": { + "message": "No items match your search" + }, + "clearFiltersOrTryAnother": { + "message": "Clear filters or try another search term" + }, + "copyInfo": { + "message": "Copy info, $ITEMNAME$", + "description": "Aria label for a button that opens a menu with options to copy information from an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "moreOptions": { + "message": "More options, $ITEMNAME$", + "description": "Aria label for a button that opens a menu with more options for an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, "adminConsole": { "message": "Admin Console" }, @@ -3046,5 +3228,38 @@ }, "errorAssigningTargetFolder": { "message": "Error assigning target folder." + }, + "viewItemsIn": { + "message": "View items in $NAME$", + "description": "Button to view the contents of a folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "backTo": { + "message": "Back to $NAME$", + "description": "Navigate back to a previous folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "new": { + "message": "New" + }, + "removeItem": { + "message": "Remove $NAME$", + "description": "Remove a selected option, such as a folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } } } diff --git a/apps/browser/src/_locales/ne/messages.json b/apps/browser/src/_locales/ne/messages.json index b45fdef39e8..e042785011c 100644 --- a/apps/browser/src/_locales/ne/messages.json +++ b/apps/browser/src/_locales/ne/messages.json @@ -166,15 +166,21 @@ "confirmIdentity": { "message": "Confirm your identity to continue." }, - "account": { - "message": "Account" - }, "changeMasterPassword": { "message": "Change master password" }, "continueToWebApp": { "message": "Continue to web app?" }, + "continueToWebAppDesc": { + "message": "Explore more features of your Bitwarden account on the web app." + }, + "continueToHelpCenter": { + "message": "Continue to Help Center?" + }, + "continueToHelpCenterDesc": { + "message": "Learn more about how to use Bitwarden on the Help Center." + }, "changeMasterPasswordOnWebConfirmation": { "message": "You can change your master password on the Bitwarden web app." }, @@ -192,9 +198,45 @@ "logOut": { "message": "Log out" }, + "aboutBitwarden": { + "message": "About Bitwarden" + }, "about": { "message": "About" }, + "moreFromBitwarden": { + "message": "More from Bitwarden" + }, + "continueToBitwardenDotCom": { + "message": "Continue to bitwarden.com?" + }, + "bitwardenForBusiness": { + "message": "Bitwarden for Business" + }, + "bitwardenAuthenticator": { + "message": "Bitwarden Authenticator" + }, + "continueToAuthenticatorPageDesc": { + "message": "Bitwarden Authenticator allows you to store authenticator keys and generate TOTP codes for 2-step verification flows. Learn more on the bitwarden.com website" + }, + "bitwardenSecretsManager": { + "message": "Bitwarden Secrets Manager" + }, + "continueToSecretsManagerPageDesc": { + "message": "Securely store, manage, and share developer secrets with Bitwarden Secrets Manager. Learn more on the bitwarden.com website." + }, + "passwordlessDotDev": { + "message": "Passwordless.dev" + }, + "continueToPasswordlessDotDevPageDesc": { + "message": "Create smooth and secure login experiences free from traditional passwords with Passwordless.dev. Learn more on the bitwarden.com website." + }, + "freeBitwardenFamilies": { + "message": "Free Bitwarden Families" + }, + "freeBitwardenFamiliesPageDesc": { + "message": "You are eligible for Free Bitwarden Families. Redeem this offer today in the web app." + }, "version": { "message": "Version" }, @@ -253,8 +295,8 @@ "passGenInfo": { "message": "Automatically generate strong, unique passwords for your logins." }, - "bitWebVault": { - "message": "Bitwarden web vault" + "bitWebVaultApp": { + "message": "Bitwarden web app" }, "importItems": { "message": "Import items" @@ -779,11 +821,8 @@ "shared": { "message": "Shared" }, - "learnOrg": { - "message": "Learn about organizations" - }, - "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?" + "bitwardenForBusinessPageDesc": { + "message": "Bitwarden for Business allows you to share your vault items with others by using an organization. Learn more on the bitwarden.com website." }, "moveToOrganization": { "message": "Move to organization" @@ -1714,6 +1753,12 @@ "biometricsNotSupportedDesc": { "message": "Browser biometrics is not supported on this device." }, + "biometricsNotUnlockedTitle": { + "message": "User locked or logged out" + }, + "biometricsNotUnlockedDesc": { + "message": "Please unlock this user in the desktop application and try again." + }, "biometricsFailedTitle": { "message": "Biometrics failed" }, @@ -2177,6 +2222,108 @@ "forwardedEmailDesc": { "message": "Generate an email alias with an external forwarding service." }, + "forwarderError": { + "message": "$SERVICENAME$ error: $ERRORMESSAGE$", + "description": "Reports an error returned by a forwarding service to the user.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + }, + "errormessage": { + "content": "$2", + "example": "Invalid characters in domain name." + } + } + }, + "forwarderGeneratedBy": { + "message": "Generated by Bitwarden.", + "description": "Displayed with the address on the forwarding service's configuration screen." + }, + "forwarderGeneratedByWithWebsite": { + "message": "Website: $WEBSITE$. Generated by Bitwarden.", + "description": "Displayed with the address on the forwarding service's configuration screen.", + "placeholders": { + "WEBSITE": { + "content": "$1", + "example": "www.example.com" + } + } + }, + "forwaderInvalidToken": { + "message": "Invalid $SERVICENAME$ API token", + "description": "Displayed when the user's API token is empty or rejected by the forwarding service.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwaderInvalidTokenWithMessage": { + "message": "Invalid $SERVICENAME$ API token: $ERRORMESSAGE$", + "description": "Displayed when the user's API token is rejected by the forwarding service with an error message.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + }, + "errormessage": { + "content": "$2", + "example": "Please verify your email address to continue." + } + } + }, + "forwarderNoAccountId": { + "message": "Unable to obtain $SERVICENAME$ masked email account ID.", + "description": "Displayed when the forwarding service fails to return an account ID.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderNoDomain": { + "message": "Invalid $SERVICENAME$ domain.", + "description": "Displayed when the domain is empty or domain authorization failed at the forwarding service.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderNoUrl": { + "message": "Invalid $SERVICENAME$ url.", + "description": "Displayed when the url of the forwarding service wasn't supplied.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderUnknownError": { + "message": "Unknown $SERVICENAME$ error occurred.", + "description": "Displayed when the forwarding service failed due to an unknown error.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderUnknownForwarder": { + "message": "Unknown forwarder: '$SERVICENAME$'.", + "description": "Displayed when the forwarding service is not supported.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "JustTrust.us" + } + } + }, "hostname": { "message": "Hostname", "description": "Part of a URL." @@ -3029,6 +3176,41 @@ "message": "to make them visible.", "description": "This will be part of a larger sentence, which will read like so: Assign these items to a collection from the Admin Console to make them visible." }, + "autofillSuggestions": { + "message": "Auto-fill suggestions" + }, + "autofillSuggestionsTip": { + "message": "Save a login item for this site to auto-fill" + }, + "yourVaultIsEmpty": { + "message": "Your vault is empty" + }, + "noItemsMatchSearch": { + "message": "No items match your search" + }, + "clearFiltersOrTryAnother": { + "message": "Clear filters or try another search term" + }, + "copyInfo": { + "message": "Copy info, $ITEMNAME$", + "description": "Aria label for a button that opens a menu with options to copy information from an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "moreOptions": { + "message": "More options, $ITEMNAME$", + "description": "Aria label for a button that opens a menu with more options for an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, "adminConsole": { "message": "Admin Console" }, @@ -3046,5 +3228,38 @@ }, "errorAssigningTargetFolder": { "message": "Error assigning target folder." + }, + "viewItemsIn": { + "message": "View items in $NAME$", + "description": "Button to view the contents of a folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "backTo": { + "message": "Back to $NAME$", + "description": "Navigate back to a previous folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "new": { + "message": "New" + }, + "removeItem": { + "message": "Remove $NAME$", + "description": "Remove a selected option, such as a folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } } } diff --git a/apps/browser/src/_locales/nl/messages.json b/apps/browser/src/_locales/nl/messages.json index 0319dea3a41..b69928f663f 100644 --- a/apps/browser/src/_locales/nl/messages.json +++ b/apps/browser/src/_locales/nl/messages.json @@ -166,15 +166,21 @@ "confirmIdentity": { "message": "Bevestig je identiteit om door te gaan." }, - "account": { - "message": "Account" - }, "changeMasterPassword": { "message": "Hoofdwachtwoord wijzigen" }, "continueToWebApp": { "message": "Doorgaan naar web-app?" }, + "continueToWebAppDesc": { + "message": "Explore more features of your Bitwarden account on the web app." + }, + "continueToHelpCenter": { + "message": "Continue to Help Center?" + }, + "continueToHelpCenterDesc": { + "message": "Learn more about how to use Bitwarden on the Help Center." + }, "changeMasterPasswordOnWebConfirmation": { "message": "Je kunt je hoofdwachtwoord wijzigen in de Bitwarden-webapp." }, @@ -192,9 +198,45 @@ "logOut": { "message": "Uitloggen" }, + "aboutBitwarden": { + "message": "About Bitwarden" + }, "about": { "message": "Over" }, + "moreFromBitwarden": { + "message": "More from Bitwarden" + }, + "continueToBitwardenDotCom": { + "message": "Continue to bitwarden.com?" + }, + "bitwardenForBusiness": { + "message": "Bitwarden for Business" + }, + "bitwardenAuthenticator": { + "message": "Bitwarden Authenticator" + }, + "continueToAuthenticatorPageDesc": { + "message": "Bitwarden Authenticator allows you to store authenticator keys and generate TOTP codes for 2-step verification flows. Learn more on the bitwarden.com website" + }, + "bitwardenSecretsManager": { + "message": "Bitwarden Secrets Manager" + }, + "continueToSecretsManagerPageDesc": { + "message": "Securely store, manage, and share developer secrets with Bitwarden Secrets Manager. Learn more on the bitwarden.com website." + }, + "passwordlessDotDev": { + "message": "Passwordless.dev" + }, + "continueToPasswordlessDotDevPageDesc": { + "message": "Create smooth and secure login experiences free from traditional passwords with Passwordless.dev. Learn more on the bitwarden.com website." + }, + "freeBitwardenFamilies": { + "message": "Free Bitwarden Families" + }, + "freeBitwardenFamiliesPageDesc": { + "message": "You are eligible for Free Bitwarden Families. Redeem this offer today in the web app." + }, "version": { "message": "Versie" }, @@ -253,8 +295,8 @@ "passGenInfo": { "message": "Automatisch sterke, unieke wachtwoorden voor je logins genereren." }, - "bitWebVault": { - "message": "Bitwarden Webkluis" + "bitWebVaultApp": { + "message": "Bitwarden web app" }, "importItems": { "message": "Items importeren" @@ -779,11 +821,8 @@ "shared": { "message": "Gedeeld" }, - "learnOrg": { - "message": "Meer over organisaties" - }, - "learnOrgConfirmation": { - "message": "Door een organisatie te gebruiken in Bitwarden kun je kluis-items delen met anderen. Wil je de website van bitwarden.com bezoeken voor meer informatie?" + "bitwardenForBusinessPageDesc": { + "message": "Bitwarden for Business allows you to share your vault items with others by using an organization. Learn more on the bitwarden.com website." }, "moveToOrganization": { "message": "Naar organisatie verplaatsen" @@ -1714,6 +1753,12 @@ "biometricsNotSupportedDesc": { "message": "Dit apparaat ondersteunt geen browserbiometrie." }, + "biometricsNotUnlockedTitle": { + "message": "User locked or logged out" + }, + "biometricsNotUnlockedDesc": { + "message": "Please unlock this user in the desktop application and try again." + }, "biometricsFailedTitle": { "message": "Biometrie mislukt" }, @@ -2177,6 +2222,108 @@ "forwardedEmailDesc": { "message": "Genereer een e-mailalias met een externe doorschakelservice." }, + "forwarderError": { + "message": "$SERVICENAME$ error: $ERRORMESSAGE$", + "description": "Reports an error returned by a forwarding service to the user.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + }, + "errormessage": { + "content": "$2", + "example": "Invalid characters in domain name." + } + } + }, + "forwarderGeneratedBy": { + "message": "Generated by Bitwarden.", + "description": "Displayed with the address on the forwarding service's configuration screen." + }, + "forwarderGeneratedByWithWebsite": { + "message": "Website: $WEBSITE$. Generated by Bitwarden.", + "description": "Displayed with the address on the forwarding service's configuration screen.", + "placeholders": { + "WEBSITE": { + "content": "$1", + "example": "www.example.com" + } + } + }, + "forwaderInvalidToken": { + "message": "Invalid $SERVICENAME$ API token", + "description": "Displayed when the user's API token is empty or rejected by the forwarding service.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwaderInvalidTokenWithMessage": { + "message": "Invalid $SERVICENAME$ API token: $ERRORMESSAGE$", + "description": "Displayed when the user's API token is rejected by the forwarding service with an error message.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + }, + "errormessage": { + "content": "$2", + "example": "Please verify your email address to continue." + } + } + }, + "forwarderNoAccountId": { + "message": "Unable to obtain $SERVICENAME$ masked email account ID.", + "description": "Displayed when the forwarding service fails to return an account ID.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderNoDomain": { + "message": "Invalid $SERVICENAME$ domain.", + "description": "Displayed when the domain is empty or domain authorization failed at the forwarding service.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderNoUrl": { + "message": "Invalid $SERVICENAME$ url.", + "description": "Displayed when the url of the forwarding service wasn't supplied.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderUnknownError": { + "message": "Unknown $SERVICENAME$ error occurred.", + "description": "Displayed when the forwarding service failed due to an unknown error.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderUnknownForwarder": { + "message": "Unknown forwarder: '$SERVICENAME$'.", + "description": "Displayed when the forwarding service is not supported.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "JustTrust.us" + } + } + }, "hostname": { "message": "Hostnaam", "description": "Part of a URL." @@ -3029,6 +3176,41 @@ "message": "to make them visible.", "description": "This will be part of a larger sentence, which will read like so: Assign these items to a collection from the Admin Console to make them visible." }, + "autofillSuggestions": { + "message": "Suggesties voor automatisch invullen" + }, + "autofillSuggestionsTip": { + "message": "Inlogitem opslaan voor automatisch invullen op deze site" + }, + "yourVaultIsEmpty": { + "message": "Je kluis is leeg" + }, + "noItemsMatchSearch": { + "message": "Geen items voldoen aan je zoekopdracht" + }, + "clearFiltersOrTryAnother": { + "message": "Wis filters of probeer een andere zoekterm" + }, + "copyInfo": { + "message": "Kopieer info, $ITEMNAME$", + "description": "Aria label for a button that opens a menu with options to copy information from an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "moreOptions": { + "message": "Meer opties, $ITEMNAME$", + "description": "Aria label for a button that opens a menu with more options for an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, "adminConsole": { "message": "Admin Console" }, @@ -3046,5 +3228,38 @@ }, "errorAssigningTargetFolder": { "message": "Fout bij toewijzen doelmap." + }, + "viewItemsIn": { + "message": "View items in $NAME$", + "description": "Button to view the contents of a folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "backTo": { + "message": "Back to $NAME$", + "description": "Navigate back to a previous folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "new": { + "message": "New" + }, + "removeItem": { + "message": "Remove $NAME$", + "description": "Remove a selected option, such as a folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } } } diff --git a/apps/browser/src/_locales/nn/messages.json b/apps/browser/src/_locales/nn/messages.json index b45fdef39e8..e042785011c 100644 --- a/apps/browser/src/_locales/nn/messages.json +++ b/apps/browser/src/_locales/nn/messages.json @@ -166,15 +166,21 @@ "confirmIdentity": { "message": "Confirm your identity to continue." }, - "account": { - "message": "Account" - }, "changeMasterPassword": { "message": "Change master password" }, "continueToWebApp": { "message": "Continue to web app?" }, + "continueToWebAppDesc": { + "message": "Explore more features of your Bitwarden account on the web app." + }, + "continueToHelpCenter": { + "message": "Continue to Help Center?" + }, + "continueToHelpCenterDesc": { + "message": "Learn more about how to use Bitwarden on the Help Center." + }, "changeMasterPasswordOnWebConfirmation": { "message": "You can change your master password on the Bitwarden web app." }, @@ -192,9 +198,45 @@ "logOut": { "message": "Log out" }, + "aboutBitwarden": { + "message": "About Bitwarden" + }, "about": { "message": "About" }, + "moreFromBitwarden": { + "message": "More from Bitwarden" + }, + "continueToBitwardenDotCom": { + "message": "Continue to bitwarden.com?" + }, + "bitwardenForBusiness": { + "message": "Bitwarden for Business" + }, + "bitwardenAuthenticator": { + "message": "Bitwarden Authenticator" + }, + "continueToAuthenticatorPageDesc": { + "message": "Bitwarden Authenticator allows you to store authenticator keys and generate TOTP codes for 2-step verification flows. Learn more on the bitwarden.com website" + }, + "bitwardenSecretsManager": { + "message": "Bitwarden Secrets Manager" + }, + "continueToSecretsManagerPageDesc": { + "message": "Securely store, manage, and share developer secrets with Bitwarden Secrets Manager. Learn more on the bitwarden.com website." + }, + "passwordlessDotDev": { + "message": "Passwordless.dev" + }, + "continueToPasswordlessDotDevPageDesc": { + "message": "Create smooth and secure login experiences free from traditional passwords with Passwordless.dev. Learn more on the bitwarden.com website." + }, + "freeBitwardenFamilies": { + "message": "Free Bitwarden Families" + }, + "freeBitwardenFamiliesPageDesc": { + "message": "You are eligible for Free Bitwarden Families. Redeem this offer today in the web app." + }, "version": { "message": "Version" }, @@ -253,8 +295,8 @@ "passGenInfo": { "message": "Automatically generate strong, unique passwords for your logins." }, - "bitWebVault": { - "message": "Bitwarden web vault" + "bitWebVaultApp": { + "message": "Bitwarden web app" }, "importItems": { "message": "Import items" @@ -779,11 +821,8 @@ "shared": { "message": "Shared" }, - "learnOrg": { - "message": "Learn about organizations" - }, - "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?" + "bitwardenForBusinessPageDesc": { + "message": "Bitwarden for Business allows you to share your vault items with others by using an organization. Learn more on the bitwarden.com website." }, "moveToOrganization": { "message": "Move to organization" @@ -1714,6 +1753,12 @@ "biometricsNotSupportedDesc": { "message": "Browser biometrics is not supported on this device." }, + "biometricsNotUnlockedTitle": { + "message": "User locked or logged out" + }, + "biometricsNotUnlockedDesc": { + "message": "Please unlock this user in the desktop application and try again." + }, "biometricsFailedTitle": { "message": "Biometrics failed" }, @@ -2177,6 +2222,108 @@ "forwardedEmailDesc": { "message": "Generate an email alias with an external forwarding service." }, + "forwarderError": { + "message": "$SERVICENAME$ error: $ERRORMESSAGE$", + "description": "Reports an error returned by a forwarding service to the user.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + }, + "errormessage": { + "content": "$2", + "example": "Invalid characters in domain name." + } + } + }, + "forwarderGeneratedBy": { + "message": "Generated by Bitwarden.", + "description": "Displayed with the address on the forwarding service's configuration screen." + }, + "forwarderGeneratedByWithWebsite": { + "message": "Website: $WEBSITE$. Generated by Bitwarden.", + "description": "Displayed with the address on the forwarding service's configuration screen.", + "placeholders": { + "WEBSITE": { + "content": "$1", + "example": "www.example.com" + } + } + }, + "forwaderInvalidToken": { + "message": "Invalid $SERVICENAME$ API token", + "description": "Displayed when the user's API token is empty or rejected by the forwarding service.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwaderInvalidTokenWithMessage": { + "message": "Invalid $SERVICENAME$ API token: $ERRORMESSAGE$", + "description": "Displayed when the user's API token is rejected by the forwarding service with an error message.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + }, + "errormessage": { + "content": "$2", + "example": "Please verify your email address to continue." + } + } + }, + "forwarderNoAccountId": { + "message": "Unable to obtain $SERVICENAME$ masked email account ID.", + "description": "Displayed when the forwarding service fails to return an account ID.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderNoDomain": { + "message": "Invalid $SERVICENAME$ domain.", + "description": "Displayed when the domain is empty or domain authorization failed at the forwarding service.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderNoUrl": { + "message": "Invalid $SERVICENAME$ url.", + "description": "Displayed when the url of the forwarding service wasn't supplied.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderUnknownError": { + "message": "Unknown $SERVICENAME$ error occurred.", + "description": "Displayed when the forwarding service failed due to an unknown error.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderUnknownForwarder": { + "message": "Unknown forwarder: '$SERVICENAME$'.", + "description": "Displayed when the forwarding service is not supported.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "JustTrust.us" + } + } + }, "hostname": { "message": "Hostname", "description": "Part of a URL." @@ -3029,6 +3176,41 @@ "message": "to make them visible.", "description": "This will be part of a larger sentence, which will read like so: Assign these items to a collection from the Admin Console to make them visible." }, + "autofillSuggestions": { + "message": "Auto-fill suggestions" + }, + "autofillSuggestionsTip": { + "message": "Save a login item for this site to auto-fill" + }, + "yourVaultIsEmpty": { + "message": "Your vault is empty" + }, + "noItemsMatchSearch": { + "message": "No items match your search" + }, + "clearFiltersOrTryAnother": { + "message": "Clear filters or try another search term" + }, + "copyInfo": { + "message": "Copy info, $ITEMNAME$", + "description": "Aria label for a button that opens a menu with options to copy information from an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "moreOptions": { + "message": "More options, $ITEMNAME$", + "description": "Aria label for a button that opens a menu with more options for an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, "adminConsole": { "message": "Admin Console" }, @@ -3046,5 +3228,38 @@ }, "errorAssigningTargetFolder": { "message": "Error assigning target folder." + }, + "viewItemsIn": { + "message": "View items in $NAME$", + "description": "Button to view the contents of a folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "backTo": { + "message": "Back to $NAME$", + "description": "Navigate back to a previous folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "new": { + "message": "New" + }, + "removeItem": { + "message": "Remove $NAME$", + "description": "Remove a selected option, such as a folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } } } diff --git a/apps/browser/src/_locales/or/messages.json b/apps/browser/src/_locales/or/messages.json index b45fdef39e8..e042785011c 100644 --- a/apps/browser/src/_locales/or/messages.json +++ b/apps/browser/src/_locales/or/messages.json @@ -166,15 +166,21 @@ "confirmIdentity": { "message": "Confirm your identity to continue." }, - "account": { - "message": "Account" - }, "changeMasterPassword": { "message": "Change master password" }, "continueToWebApp": { "message": "Continue to web app?" }, + "continueToWebAppDesc": { + "message": "Explore more features of your Bitwarden account on the web app." + }, + "continueToHelpCenter": { + "message": "Continue to Help Center?" + }, + "continueToHelpCenterDesc": { + "message": "Learn more about how to use Bitwarden on the Help Center." + }, "changeMasterPasswordOnWebConfirmation": { "message": "You can change your master password on the Bitwarden web app." }, @@ -192,9 +198,45 @@ "logOut": { "message": "Log out" }, + "aboutBitwarden": { + "message": "About Bitwarden" + }, "about": { "message": "About" }, + "moreFromBitwarden": { + "message": "More from Bitwarden" + }, + "continueToBitwardenDotCom": { + "message": "Continue to bitwarden.com?" + }, + "bitwardenForBusiness": { + "message": "Bitwarden for Business" + }, + "bitwardenAuthenticator": { + "message": "Bitwarden Authenticator" + }, + "continueToAuthenticatorPageDesc": { + "message": "Bitwarden Authenticator allows you to store authenticator keys and generate TOTP codes for 2-step verification flows. Learn more on the bitwarden.com website" + }, + "bitwardenSecretsManager": { + "message": "Bitwarden Secrets Manager" + }, + "continueToSecretsManagerPageDesc": { + "message": "Securely store, manage, and share developer secrets with Bitwarden Secrets Manager. Learn more on the bitwarden.com website." + }, + "passwordlessDotDev": { + "message": "Passwordless.dev" + }, + "continueToPasswordlessDotDevPageDesc": { + "message": "Create smooth and secure login experiences free from traditional passwords with Passwordless.dev. Learn more on the bitwarden.com website." + }, + "freeBitwardenFamilies": { + "message": "Free Bitwarden Families" + }, + "freeBitwardenFamiliesPageDesc": { + "message": "You are eligible for Free Bitwarden Families. Redeem this offer today in the web app." + }, "version": { "message": "Version" }, @@ -253,8 +295,8 @@ "passGenInfo": { "message": "Automatically generate strong, unique passwords for your logins." }, - "bitWebVault": { - "message": "Bitwarden web vault" + "bitWebVaultApp": { + "message": "Bitwarden web app" }, "importItems": { "message": "Import items" @@ -779,11 +821,8 @@ "shared": { "message": "Shared" }, - "learnOrg": { - "message": "Learn about organizations" - }, - "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?" + "bitwardenForBusinessPageDesc": { + "message": "Bitwarden for Business allows you to share your vault items with others by using an organization. Learn more on the bitwarden.com website." }, "moveToOrganization": { "message": "Move to organization" @@ -1714,6 +1753,12 @@ "biometricsNotSupportedDesc": { "message": "Browser biometrics is not supported on this device." }, + "biometricsNotUnlockedTitle": { + "message": "User locked or logged out" + }, + "biometricsNotUnlockedDesc": { + "message": "Please unlock this user in the desktop application and try again." + }, "biometricsFailedTitle": { "message": "Biometrics failed" }, @@ -2177,6 +2222,108 @@ "forwardedEmailDesc": { "message": "Generate an email alias with an external forwarding service." }, + "forwarderError": { + "message": "$SERVICENAME$ error: $ERRORMESSAGE$", + "description": "Reports an error returned by a forwarding service to the user.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + }, + "errormessage": { + "content": "$2", + "example": "Invalid characters in domain name." + } + } + }, + "forwarderGeneratedBy": { + "message": "Generated by Bitwarden.", + "description": "Displayed with the address on the forwarding service's configuration screen." + }, + "forwarderGeneratedByWithWebsite": { + "message": "Website: $WEBSITE$. Generated by Bitwarden.", + "description": "Displayed with the address on the forwarding service's configuration screen.", + "placeholders": { + "WEBSITE": { + "content": "$1", + "example": "www.example.com" + } + } + }, + "forwaderInvalidToken": { + "message": "Invalid $SERVICENAME$ API token", + "description": "Displayed when the user's API token is empty or rejected by the forwarding service.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwaderInvalidTokenWithMessage": { + "message": "Invalid $SERVICENAME$ API token: $ERRORMESSAGE$", + "description": "Displayed when the user's API token is rejected by the forwarding service with an error message.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + }, + "errormessage": { + "content": "$2", + "example": "Please verify your email address to continue." + } + } + }, + "forwarderNoAccountId": { + "message": "Unable to obtain $SERVICENAME$ masked email account ID.", + "description": "Displayed when the forwarding service fails to return an account ID.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderNoDomain": { + "message": "Invalid $SERVICENAME$ domain.", + "description": "Displayed when the domain is empty or domain authorization failed at the forwarding service.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderNoUrl": { + "message": "Invalid $SERVICENAME$ url.", + "description": "Displayed when the url of the forwarding service wasn't supplied.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderUnknownError": { + "message": "Unknown $SERVICENAME$ error occurred.", + "description": "Displayed when the forwarding service failed due to an unknown error.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderUnknownForwarder": { + "message": "Unknown forwarder: '$SERVICENAME$'.", + "description": "Displayed when the forwarding service is not supported.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "JustTrust.us" + } + } + }, "hostname": { "message": "Hostname", "description": "Part of a URL." @@ -3029,6 +3176,41 @@ "message": "to make them visible.", "description": "This will be part of a larger sentence, which will read like so: Assign these items to a collection from the Admin Console to make them visible." }, + "autofillSuggestions": { + "message": "Auto-fill suggestions" + }, + "autofillSuggestionsTip": { + "message": "Save a login item for this site to auto-fill" + }, + "yourVaultIsEmpty": { + "message": "Your vault is empty" + }, + "noItemsMatchSearch": { + "message": "No items match your search" + }, + "clearFiltersOrTryAnother": { + "message": "Clear filters or try another search term" + }, + "copyInfo": { + "message": "Copy info, $ITEMNAME$", + "description": "Aria label for a button that opens a menu with options to copy information from an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "moreOptions": { + "message": "More options, $ITEMNAME$", + "description": "Aria label for a button that opens a menu with more options for an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, "adminConsole": { "message": "Admin Console" }, @@ -3046,5 +3228,38 @@ }, "errorAssigningTargetFolder": { "message": "Error assigning target folder." + }, + "viewItemsIn": { + "message": "View items in $NAME$", + "description": "Button to view the contents of a folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "backTo": { + "message": "Back to $NAME$", + "description": "Navigate back to a previous folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "new": { + "message": "New" + }, + "removeItem": { + "message": "Remove $NAME$", + "description": "Remove a selected option, such as a folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } } } diff --git a/apps/browser/src/_locales/pl/messages.json b/apps/browser/src/_locales/pl/messages.json index b34ce5bf669..4ef2e8579c7 100644 --- a/apps/browser/src/_locales/pl/messages.json +++ b/apps/browser/src/_locales/pl/messages.json @@ -166,15 +166,21 @@ "confirmIdentity": { "message": "Potwierdź swoją tożsamość, aby kontynuować." }, - "account": { - "message": "Konto" - }, "changeMasterPassword": { "message": "Zmień hasło główne" }, "continueToWebApp": { "message": "Kontynuować do aplikacji internetowej?" }, + "continueToWebAppDesc": { + "message": "Odkryj więcej funkcji swojego konta Bitwarden w aplikacji internetowej." + }, + "continueToHelpCenter": { + "message": "Kontynuować do centrum pomocy?" + }, + "continueToHelpCenterDesc": { + "message": "Dowiedz się więcej o tym, jak korzystać z centrum pomocy Bitwarden." + }, "changeMasterPasswordOnWebConfirmation": { "message": "Możesz zmienić swoje hasło główne w aplikacji internetowej Bitwarden." }, @@ -192,9 +198,45 @@ "logOut": { "message": "Wyloguj się" }, + "aboutBitwarden": { + "message": "O Bitwarden" + }, "about": { "message": "O aplikacji" }, + "moreFromBitwarden": { + "message": "Więcej od Bitwarden" + }, + "continueToBitwardenDotCom": { + "message": "Kontynuować do bitwarden.com?" + }, + "bitwardenForBusiness": { + "message": "Bitwarden dla biznesu" + }, + "bitwardenAuthenticator": { + "message": "Bitwarden Authenticator" + }, + "continueToAuthenticatorPageDesc": { + "message": "Bitwarden Authenticator pozwala na przechowywanie kluczy uwierzytelniających i generowanie kodów TOTP do dwuetapowego procesu weryfikacji. Dowiedz się więcej na stronie bitwarden.com" + }, + "bitwardenSecretsManager": { + "message": "Menedżer sekretów Bitwarden" + }, + "continueToSecretsManagerPageDesc": { + "message": "Bezpiecznie przechowuj, zarządzaj i udostępniaj sekrety programistów z Menedżerem sekretów Bitwarden. Dowiedz się więcej na stronie bitwarden.com." + }, + "passwordlessDotDev": { + "message": "Passwordless.dev" + }, + "continueToPasswordlessDotDevPageDesc": { + "message": "Twórz przyjemne i bezpieczne doświadczenia z logowaniem wolne od tradycyjnych haseł za pomocą Passwordless.dev. Dowiedz się więcej na stronie bitwarden.com." + }, + "freeBitwardenFamilies": { + "message": "Darmowy plan rodzinny" + }, + "freeBitwardenFamiliesPageDesc": { + "message": "Masz prawo do bezpłatengo planu rodzinnego Bitwarden. Zrealizuj tę ofertę już dziś w aplikacji internetowej." + }, "version": { "message": "Wersja" }, @@ -253,8 +295,8 @@ "passGenInfo": { "message": "Automatycznie wygeneruj silne, unikatowe hasła dla swoich loginów." }, - "bitWebVault": { - "message": "Sejf internetowy Bitwarden" + "bitWebVaultApp": { + "message": "Aplikacja internetowa Bitwarden" }, "importItems": { "message": "Importuj elementy" @@ -779,11 +821,8 @@ "shared": { "message": "Udostępnione" }, - "learnOrg": { - "message": "Dowiedz się więcej o organizacjach" - }, - "learnOrgConfirmation": { - "message": "Bitwarden pozwala na udostępnianie zawartości sejfu innym osobom za pośrednictwem organizacji. Czy chcesz odwiedzić stronę bitwarden.com, aby dowiedzieć się więcej?" + "bitwardenForBusinessPageDesc": { + "message": "Bitwarden dla biznesu pozwala na udostępnianie zawartości sejfu innym osobom za pośrednictwem organizacji. Dowiedz się wiecej na bitwarden.com." }, "moveToOrganization": { "message": "Przenieś do organizacji" @@ -1714,6 +1753,12 @@ "biometricsNotSupportedDesc": { "message": "Dane biometryczne przeglądarki nie są obsługiwane na tym urządzeniu." }, + "biometricsNotUnlockedTitle": { + "message": "Użytkownik zablokowany lub wylogowany" + }, + "biometricsNotUnlockedDesc": { + "message": "Odblokuj tego użytkownika w aplikacji desktopowej i spróbuj ponownie." + }, "biometricsFailedTitle": { "message": "Dane biometryczne są błędne" }, @@ -2177,6 +2222,108 @@ "forwardedEmailDesc": { "message": "Wygeneruj alias adresu e-mail z zewnętrznej usługi przekierowania." }, + "forwarderError": { + "message": "Błąd $SERVICENAME$: $ERRORMESSAGE$", + "description": "Reports an error returned by a forwarding service to the user.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + }, + "errormessage": { + "content": "$2", + "example": "Invalid characters in domain name." + } + } + }, + "forwarderGeneratedBy": { + "message": "Wygenerowane przez Bitwarden.", + "description": "Displayed with the address on the forwarding service's configuration screen." + }, + "forwarderGeneratedByWithWebsite": { + "message": "Strona internetowa: $WEBSITE$. Wygenerowano przez Bitwarden.", + "description": "Displayed with the address on the forwarding service's configuration screen.", + "placeholders": { + "WEBSITE": { + "content": "$1", + "example": "www.example.com" + } + } + }, + "forwaderInvalidToken": { + "message": "Nieprawidłowy token API dla $SERVICENAME$", + "description": "Displayed when the user's API token is empty or rejected by the forwarding service.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwaderInvalidTokenWithMessage": { + "message": "Nieprawidłowy token API dla $SERVICENAME$, błąd: $ERRORMESSAGE$", + "description": "Displayed when the user's API token is rejected by the forwarding service with an error message.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + }, + "errormessage": { + "content": "$2", + "example": "Please verify your email address to continue." + } + } + }, + "forwarderNoAccountId": { + "message": "Nie można uzyskać ID maskowanego konta e-mail dla $SERVICENAME$.", + "description": "Displayed when the forwarding service fails to return an account ID.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderNoDomain": { + "message": "Nieprawidłowa domena $SERVICENAME$.", + "description": "Displayed when the domain is empty or domain authorization failed at the forwarding service.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderNoUrl": { + "message": "Nieprawidłowy adres URL $SERVICENAME$.", + "description": "Displayed when the url of the forwarding service wasn't supplied.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderUnknownError": { + "message": "Wystąpił nieznany błąd w $SERVICENAME$.", + "description": "Displayed when the forwarding service failed due to an unknown error.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderUnknownForwarder": { + "message": "Nieznana usługa przekierowania: '$SERVICENAME$'.", + "description": "Displayed when the forwarding service is not supported.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "JustTrust.us" + } + } + }, "hostname": { "message": "Nazwa hosta", "description": "Part of a URL." @@ -3029,6 +3176,41 @@ "message": ", aby były widoczne.", "description": "This will be part of a larger sentence, which will read like so: Assign these items to a collection from the Admin Console to make them visible." }, + "autofillSuggestions": { + "message": "Sugestie autouzupełnienia" + }, + "autofillSuggestionsTip": { + "message": "Zapisz element logowania dla tej witryny, aby automatycznie wypełnić" + }, + "yourVaultIsEmpty": { + "message": "Twój sejf jest pusty" + }, + "noItemsMatchSearch": { + "message": "Żaden element nie pasuje do Twojego wyszukiwania" + }, + "clearFiltersOrTryAnother": { + "message": "Wyczyść filtry lub użyj innej frazy" + }, + "copyInfo": { + "message": "Skopiuj informacje, $ITEMNAME$", + "description": "Aria label for a button that opens a menu with options to copy information from an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "moreOptions": { + "message": "Więcej opcji, $ITEMNAME$", + "description": "Aria label for a button that opens a menu with more options for an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, "adminConsole": { "message": "Konsola Administracyjna" }, @@ -3046,5 +3228,38 @@ }, "errorAssigningTargetFolder": { "message": "Wystąpił błąd podczas przypisywania folderu." + }, + "viewItemsIn": { + "message": "Zobacz elementy w $NAME$", + "description": "Button to view the contents of a folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "backTo": { + "message": "Wróć do $NAME$", + "description": "Navigate back to a previous folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "new": { + "message": "Nowy" + }, + "removeItem": { + "message": "Usuń $NAME$", + "description": "Remove a selected option, such as a folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } } } diff --git a/apps/browser/src/_locales/pt_BR/messages.json b/apps/browser/src/_locales/pt_BR/messages.json index c9ade42eb5d..3f1f2aa224d 100644 --- a/apps/browser/src/_locales/pt_BR/messages.json +++ b/apps/browser/src/_locales/pt_BR/messages.json @@ -166,15 +166,21 @@ "confirmIdentity": { "message": "Confirme a sua identidade para continuar." }, - "account": { - "message": "Conta" - }, "changeMasterPassword": { "message": "Alterar Senha Mestra" }, "continueToWebApp": { "message": "Continuar no aplicativo web?" }, + "continueToWebAppDesc": { + "message": "Explore more features of your Bitwarden account on the web app." + }, + "continueToHelpCenter": { + "message": "Continue to Help Center?" + }, + "continueToHelpCenterDesc": { + "message": "Learn more about how to use Bitwarden on the Help Center." + }, "changeMasterPasswordOnWebConfirmation": { "message": "Você pode alterar a sua senha mestra no aplicativo web Bitwarden." }, @@ -192,9 +198,45 @@ "logOut": { "message": "Encerrar Sessão" }, + "aboutBitwarden": { + "message": "About Bitwarden" + }, "about": { "message": "Sobre" }, + "moreFromBitwarden": { + "message": "More from Bitwarden" + }, + "continueToBitwardenDotCom": { + "message": "Continue to bitwarden.com?" + }, + "bitwardenForBusiness": { + "message": "Bitwarden for Business" + }, + "bitwardenAuthenticator": { + "message": "Bitwarden Authenticator" + }, + "continueToAuthenticatorPageDesc": { + "message": "Bitwarden Authenticator allows you to store authenticator keys and generate TOTP codes for 2-step verification flows. Learn more on the bitwarden.com website" + }, + "bitwardenSecretsManager": { + "message": "Bitwarden Secrets Manager" + }, + "continueToSecretsManagerPageDesc": { + "message": "Securely store, manage, and share developer secrets with Bitwarden Secrets Manager. Learn more on the bitwarden.com website." + }, + "passwordlessDotDev": { + "message": "Passwordless.dev" + }, + "continueToPasswordlessDotDevPageDesc": { + "message": "Create smooth and secure login experiences free from traditional passwords with Passwordless.dev. Learn more on the bitwarden.com website." + }, + "freeBitwardenFamilies": { + "message": "Free Bitwarden Families" + }, + "freeBitwardenFamiliesPageDesc": { + "message": "You are eligible for Free Bitwarden Families. Redeem this offer today in the web app." + }, "version": { "message": "Versão" }, @@ -253,8 +295,8 @@ "passGenInfo": { "message": "Gere automaticamente senhas fortes e únicas para as suas credenciais." }, - "bitWebVault": { - "message": "Cofre Web do Bitwarden" + "bitWebVaultApp": { + "message": "Bitwarden web app" }, "importItems": { "message": "Importar Itens" @@ -375,7 +417,7 @@ "message": "Outros" }, "unlockMethods": { - "message": "Unlock options" + "message": "Opções de desbloqueio" }, "unlockMethodNeededToChangeTimeoutActionDesc": { "message": "Configure um método de desbloqueio para alterar o tempo limite do cofre." @@ -384,10 +426,10 @@ "message": "Configure um método de desbloqueio nas Configurações" }, "sessionTimeoutHeader": { - "message": "Session timeout" + "message": "Tempo limite da sessão" }, "otherOptions": { - "message": "Other options" + "message": "Outras opções" }, "rateExtension": { "message": "Avaliar a Extensão" @@ -697,10 +739,10 @@ "message": "Pedir para atualizar a senha de uma credencial quando uma alteração for detectada em um site. Aplica-se a todas as contas conectadas." }, "enableUsePasskeys": { - "message": "Pedir para salvar e usar as senhas" + "message": "Pedir para salvar e usar chaves de acesso" }, "usePasskeysDesc": { - "message": "Pedir para salvar novas senhas ou entrar com as senhas armazenadas no seu cofre. Aplica-se a todas as contas conectadas." + "message": "Pedir para salvar novas chaves de acesso ou entrar com as mesmas armazenadas no seu cofre. Aplica-se a todas as contas conectadas." }, "notificationChangeDesc": { "message": "Você quer atualizar esta senha no Bitwarden?" @@ -779,11 +821,8 @@ "shared": { "message": "Compartilhado" }, - "learnOrg": { - "message": "Aprenda mais sobre as Organizações" - }, - "learnOrgConfirmation": { - "message": "O Bitwarden permite compartilhar os seus itens do cofre com outros ao utilizar uma organização. Gostaria de visitar o site bitwarden.com para saber mais?" + "bitwardenForBusinessPageDesc": { + "message": "Bitwarden for Business allows you to share your vault items with others by using an organization. Learn more on the bitwarden.com website." }, "moveToOrganization": { "message": "Mover para a Organização" @@ -1714,6 +1753,12 @@ "biometricsNotSupportedDesc": { "message": "A biometria com o navegador não é suportada neste dispositivo." }, + "biometricsNotUnlockedTitle": { + "message": "User locked or logged out" + }, + "biometricsNotUnlockedDesc": { + "message": "Please unlock this user in the desktop application and try again." + }, "biometricsFailedTitle": { "message": "Biometria falhou" }, @@ -2177,6 +2222,108 @@ "forwardedEmailDesc": { "message": "Gere um apelido de e-mail com um serviço de encaminhamento externo." }, + "forwarderError": { + "message": "Erro $SERVICENAME$: $ERRORMESSAGE$", + "description": "Reports an error returned by a forwarding service to the user.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + }, + "errormessage": { + "content": "$2", + "example": "Invalid characters in domain name." + } + } + }, + "forwarderGeneratedBy": { + "message": "Gerado pelo Bitwarden.", + "description": "Displayed with the address on the forwarding service's configuration screen." + }, + "forwarderGeneratedByWithWebsite": { + "message": "Site: $WEBSITE$. Gerado pelo Bitwarden.", + "description": "Displayed with the address on the forwarding service's configuration screen.", + "placeholders": { + "WEBSITE": { + "content": "$1", + "example": "www.example.com" + } + } + }, + "forwaderInvalidToken": { + "message": "Token de API $SERVICENAME$ inválido", + "description": "Displayed when the user's API token is empty or rejected by the forwarding service.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwaderInvalidTokenWithMessage": { + "message": "Token de API $SERVICENAME$ inválido: $ERRORMESSAGE$", + "description": "Displayed when the user's API token is rejected by the forwarding service with an error message.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + }, + "errormessage": { + "content": "$2", + "example": "Please verify your email address to continue." + } + } + }, + "forwarderNoAccountId": { + "message": "Não foi possível obter a máscara do ID da conta de email $SERVICENAME$.", + "description": "Displayed when the forwarding service fails to return an account ID.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderNoDomain": { + "message": "Domínio $SERVICENAME$ inválido.", + "description": "Displayed when the domain is empty or domain authorization failed at the forwarding service.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderNoUrl": { + "message": "URL $SERVICENAME$ inválida.", + "description": "Displayed when the url of the forwarding service wasn't supplied.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderUnknownError": { + "message": "Ocorreu um erro $SERVICENAME$ desconhecido.", + "description": "Displayed when the forwarding service failed due to an unknown error.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderUnknownForwarder": { + "message": "Encaminhador desconhecido: '$SERVICENAME$'.", + "description": "Displayed when the forwarding service is not supported.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "JustTrust.us" + } + } + }, "hostname": { "message": "Nome do host", "description": "Part of a URL." @@ -2795,22 +2942,22 @@ "message": "Chave de acesso" }, "passkeyNotCopied": { - "message": "A senha não será copiada" + "message": "A chave de acesso não será copiada" }, "passkeyNotCopiedAlert": { - "message": "A senha não será copiada para o item clonado. Deseja continuar clonando este item?" + "message": "A chave de acesso não será copiada para o item clonado. Deseja continuar clonando este item?" }, "passkeyFeatureIsNotImplementedForAccountsWithoutMasterPassword": { - "message": "Verificação exigida pelo site inicial. Esse recurso ainda não está implementado para contas sem senha mestra." + "message": "Verificação requerida pelo site que a iniciou. Esse recurso ainda não está implementado para contas sem senha mestra." }, "logInWithPasskey": { - "message": "Fazer login com a senha?" + "message": "Fazer login com chave de acesso?" }, "passkeyAlreadyExists": { - "message": "Uma senha já existe para este aplicativo." + "message": "Uma chave de acesso já existe para este aplicativo." }, "noPasskeysFoundForThisApplication": { - "message": "Nenhuma senha encontrada para este aplicativo." + "message": "Nenhuma chave de acesso encontrada para este aplicativo." }, "noMatchingPasskeyLogin": { "message": "Você não tem um login correspondente para este site." @@ -2819,22 +2966,22 @@ "message": "Confirmar" }, "savePasskey": { - "message": "Salvar senha" + "message": "Salvar chave de acesso" }, "savePasskeyNewLogin": { - "message": "Salvar senha como novo login" + "message": "Salvar chave de acesso como um novo login" }, "choosePasskey": { "message": "Escolha um login para salvar esta chave de acesso" }, "passkeyItem": { - "message": "Passkey Item" + "message": "Item de chave de acesso" }, "overwritePasskey": { - "message": "Sobrescrever senha?" + "message": "Sobrescrever chave de acesso?" }, "overwritePasskeyAlert": { - "message": "Este item já contém uma senha. Tem certeza que deseja substituir a senha de acesso atual?" + "message": "Este item já contém uma chave de acesso. Tem certeza que deseja substituir a atual?" }, "featureNotSupported": { "message": "Recurso ainda não suportado" @@ -3010,7 +3157,7 @@ "message": "Sucesso" }, "removePasskey": { - "message": "Remover senha" + "message": "Remover chave de acesso" }, "passkeyRemoved": { "message": "Chave de acesso removida" @@ -3029,22 +3176,90 @@ "message": "para torná-los visíveis.", "description": "This will be part of a larger sentence, which will read like so: Assign these items to a collection from the Admin Console to make them visible." }, + "autofillSuggestions": { + "message": "Auto-fill suggestions" + }, + "autofillSuggestionsTip": { + "message": "Save a login item for this site to auto-fill" + }, + "yourVaultIsEmpty": { + "message": "Your vault is empty" + }, + "noItemsMatchSearch": { + "message": "No items match your search" + }, + "clearFiltersOrTryAnother": { + "message": "Clear filters or try another search term" + }, + "copyInfo": { + "message": "Copy info, $ITEMNAME$", + "description": "Aria label for a button that opens a menu with options to copy information from an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "moreOptions": { + "message": "More options, $ITEMNAME$", + "description": "Aria label for a button that opens a menu with more options for an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, "adminConsole": { "message": "Painel de administração" }, "accountSecurity": { - "message": "Account security" + "message": "Segurança da conta" }, "notifications": { - "message": "Notifications" + "message": "Notificações" }, "appearance": { - "message": "Appearance" + "message": "Aparência" }, "errorAssigningTargetCollection": { "message": "Erro ao atribuir coleção de destino." }, "errorAssigningTargetFolder": { "message": "Erro ao atribuir pasta de destino." + }, + "viewItemsIn": { + "message": "View items in $NAME$", + "description": "Button to view the contents of a folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "backTo": { + "message": "Back to $NAME$", + "description": "Navigate back to a previous folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "new": { + "message": "New" + }, + "removeItem": { + "message": "Remove $NAME$", + "description": "Remove a selected option, such as a folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } } } diff --git a/apps/browser/src/_locales/pt_PT/messages.json b/apps/browser/src/_locales/pt_PT/messages.json index 3cb55214d6b..32425cb0fea 100644 --- a/apps/browser/src/_locales/pt_PT/messages.json +++ b/apps/browser/src/_locales/pt_PT/messages.json @@ -166,15 +166,21 @@ "confirmIdentity": { "message": "Confirme a sua identidade para continuar." }, - "account": { - "message": "Conta" - }, "changeMasterPassword": { "message": "Alterar palavra-passe mestra" }, "continueToWebApp": { "message": "Continuar para a aplicação Web?" }, + "continueToWebAppDesc": { + "message": "Explore mais funcionalidades da sua conta Bitwarden na aplicação Web." + }, + "continueToHelpCenter": { + "message": "Continuar para o Centro de ajuda?" + }, + "continueToHelpCenterDesc": { + "message": "Saiba mais sobre como utilizar o Bitwarden no Centro de ajuda." + }, "changeMasterPasswordOnWebConfirmation": { "message": "Pode alterar a sua palavra-passe mestra na aplicação Web Bitwarden." }, @@ -192,9 +198,45 @@ "logOut": { "message": "Terminar sessão" }, + "aboutBitwarden": { + "message": "Acerca do Bitwarden" + }, "about": { "message": "Acerca de" }, + "moreFromBitwarden": { + "message": "Mais do Bitwarden" + }, + "continueToBitwardenDotCom": { + "message": "Continuar para bitwarden.com?" + }, + "bitwardenForBusiness": { + "message": "Bitwarden para Empresas" + }, + "bitwardenAuthenticator": { + "message": "Autenticador Bitwarden" + }, + "continueToAuthenticatorPageDesc": { + "message": "O Autenticador Bitwarden permite-lhe armazenar chaves de autenticação e gerar códigos TOTP para fluxos de verificação de 2 passos. Saiba mais no site bitwarden.com" + }, + "bitwardenSecretsManager": { + "message": "Gestor de Segredos Bitwarden" + }, + "continueToSecretsManagerPageDesc": { + "message": "Armazene, gira e partilhe segredos de programador de forma segura com o Gestor de Segredos Bitwarden. Saiba mais no site bitwarden.com." + }, + "passwordlessDotDev": { + "message": "Passwordless.dev" + }, + "continueToPasswordlessDotDevPageDesc": { + "message": "Crie experiências de início de sessão suaves e seguras, livre de palavras-passe tradicionais, com o Passwordless.dev. Saiba mais no site bitwarden.com." + }, + "freeBitwardenFamilies": { + "message": "Plano Familiar gratuito Bitwarden" + }, + "freeBitwardenFamiliesPageDesc": { + "message": "É elegível para o Plano Familiar gratuito Bitwarden. Resgate esta oferta hoje na aplicação Web." + }, "version": { "message": "Versão" }, @@ -253,8 +295,8 @@ "passGenInfo": { "message": "Gera automaticamente palavras-passe fortes e únicas para as suas credenciais." }, - "bitWebVault": { - "message": "Cofre Web Bitwarden" + "bitWebVaultApp": { + "message": "Aplicação Web Bitwarden" }, "importItems": { "message": "Importar itens" @@ -779,11 +821,8 @@ "shared": { "message": "Partilhado" }, - "learnOrg": { - "message": "Saiba mais sobre as organizações" - }, - "learnOrgConfirmation": { - "message": "O Bitwarden permite-lhe partilhar os seus itens do cofre com outras pessoas através da utilização de uma organização. Gostaria de visitar o site bitwarden.com para saber mais?" + "bitwardenForBusinessPageDesc": { + "message": "O Bitwarden para Empresas permite-lhe partilhar os seus itens do cofre com outras pessoas através da utilização de uma organização. Saiba mais no site bitwarden.com." }, "moveToOrganization": { "message": "Mover para a organização" @@ -1339,7 +1378,7 @@ "message": "Histórico de palavras-passe" }, "back": { - "message": "Retroceder" + "message": "Voltar" }, "collections": { "message": "Coleções" @@ -1714,6 +1753,12 @@ "biometricsNotSupportedDesc": { "message": "A biometria do navegador não é suportada neste dispositivo." }, + "biometricsNotUnlockedTitle": { + "message": "Utilizador bloqueado ou com sessão terminada" + }, + "biometricsNotUnlockedDesc": { + "message": "Por favor, desbloqueie este utilizador na aplicação para computador e tente novamente." + }, "biometricsFailedTitle": { "message": "Falha na biometria" }, @@ -2177,6 +2222,108 @@ "forwardedEmailDesc": { "message": "Gerar um alias de e-mail com um serviço de reencaminhamento externo." }, + "forwarderError": { + "message": "Erro no $SERVICENAME$: $ERRORMESSAGE$", + "description": "Reports an error returned by a forwarding service to the user.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + }, + "errormessage": { + "content": "$2", + "example": "Invalid characters in domain name." + } + } + }, + "forwarderGeneratedBy": { + "message": "Gerado pelo Bitwarden.", + "description": "Displayed with the address on the forwarding service's configuration screen." + }, + "forwarderGeneratedByWithWebsite": { + "message": "Site: $WEBSITE$. Gerado pelo Bitwarden.", + "description": "Displayed with the address on the forwarding service's configuration screen.", + "placeholders": { + "WEBSITE": { + "content": "$1", + "example": "www.example.com" + } + } + }, + "forwaderInvalidToken": { + "message": "Token da API de $SERVICENAME$ inválido", + "description": "Displayed when the user's API token is empty or rejected by the forwarding service.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwaderInvalidTokenWithMessage": { + "message": "Token da API de $SERVICENAME$ inválido: $ERRORMESSAGE$", + "description": "Displayed when the user's API token is rejected by the forwarding service with an error message.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + }, + "errormessage": { + "content": "$2", + "example": "Please verify your email address to continue." + } + } + }, + "forwarderNoAccountId": { + "message": "Não foi possível obter o ID da conta de e-mail mascarada de $SERVICENAME$.", + "description": "Displayed when the forwarding service fails to return an account ID.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderNoDomain": { + "message": "Domínio de $SERVICENAME$ inválido.", + "description": "Displayed when the domain is empty or domain authorization failed at the forwarding service.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderNoUrl": { + "message": "URL de $SERVICENAME$ inválido.", + "description": "Displayed when the url of the forwarding service wasn't supplied.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderUnknownError": { + "message": "Ocorreu um erro desconhecido de $SERVICENAME$.", + "description": "Displayed when the forwarding service failed due to an unknown error.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderUnknownForwarder": { + "message": "Reencaminhador desconhecido: '$SERVICENAME$'.", + "description": "Displayed when the forwarding service is not supported.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "JustTrust.us" + } + } + }, "hostname": { "message": "Nome de domínio", "description": "Part of a URL." @@ -3029,6 +3176,41 @@ "message": "para os tornar visíveis.", "description": "This will be part of a larger sentence, which will read like so: Assign these items to a collection from the Admin Console to make them visible." }, + "autofillSuggestions": { + "message": "Sugestões de preenchimento automático" + }, + "autofillSuggestionsTip": { + "message": "Guarde uma credencial deste site para preenchimento automático" + }, + "yourVaultIsEmpty": { + "message": "O seu cofre está vazio" + }, + "noItemsMatchSearch": { + "message": "Nenhum item corresponde à sua pesquisa" + }, + "clearFiltersOrTryAnother": { + "message": "Limpe os filtros ou tente outro termo de pesquisa" + }, + "copyInfo": { + "message": "Copiar informações, $ITEMNAME$", + "description": "Aria label for a button that opens a menu with options to copy information from an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "moreOptions": { + "message": "Mais opções, $ITEMNAME$", + "description": "Aria label for a button that opens a menu with more options for an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, "adminConsole": { "message": "Consola de administração" }, @@ -3046,5 +3228,38 @@ }, "errorAssigningTargetFolder": { "message": "Erro ao atribuir a pasta de destino." + }, + "viewItemsIn": { + "message": "Ver itens em $NAME$", + "description": "Button to view the contents of a folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "backTo": { + "message": "Voltar a $NAME$", + "description": "Navigate back to a previous folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "new": { + "message": "Novo" + }, + "removeItem": { + "message": "Remover $NAME$", + "description": "Remove a selected option, such as a folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } } } diff --git a/apps/browser/src/_locales/ro/messages.json b/apps/browser/src/_locales/ro/messages.json index 8f02fd076db..af09c4b3a93 100644 --- a/apps/browser/src/_locales/ro/messages.json +++ b/apps/browser/src/_locales/ro/messages.json @@ -166,15 +166,21 @@ "confirmIdentity": { "message": "Confirmați-vă identitatea pentru a continua." }, - "account": { - "message": "Cont" - }, "changeMasterPassword": { "message": "Schimbare parolă principală" }, "continueToWebApp": { "message": "Continue to web app?" }, + "continueToWebAppDesc": { + "message": "Explore more features of your Bitwarden account on the web app." + }, + "continueToHelpCenter": { + "message": "Continue to Help Center?" + }, + "continueToHelpCenterDesc": { + "message": "Learn more about how to use Bitwarden on the Help Center." + }, "changeMasterPasswordOnWebConfirmation": { "message": "You can change your master password on the Bitwarden web app." }, @@ -192,9 +198,45 @@ "logOut": { "message": "Deconectare" }, + "aboutBitwarden": { + "message": "About Bitwarden" + }, "about": { "message": "Despre" }, + "moreFromBitwarden": { + "message": "More from Bitwarden" + }, + "continueToBitwardenDotCom": { + "message": "Continue to bitwarden.com?" + }, + "bitwardenForBusiness": { + "message": "Bitwarden for Business" + }, + "bitwardenAuthenticator": { + "message": "Bitwarden Authenticator" + }, + "continueToAuthenticatorPageDesc": { + "message": "Bitwarden Authenticator allows you to store authenticator keys and generate TOTP codes for 2-step verification flows. Learn more on the bitwarden.com website" + }, + "bitwardenSecretsManager": { + "message": "Bitwarden Secrets Manager" + }, + "continueToSecretsManagerPageDesc": { + "message": "Securely store, manage, and share developer secrets with Bitwarden Secrets Manager. Learn more on the bitwarden.com website." + }, + "passwordlessDotDev": { + "message": "Passwordless.dev" + }, + "continueToPasswordlessDotDevPageDesc": { + "message": "Create smooth and secure login experiences free from traditional passwords with Passwordless.dev. Learn more on the bitwarden.com website." + }, + "freeBitwardenFamilies": { + "message": "Free Bitwarden Families" + }, + "freeBitwardenFamiliesPageDesc": { + "message": "You are eligible for Free Bitwarden Families. Redeem this offer today in the web app." + }, "version": { "message": "Versiune" }, @@ -253,8 +295,8 @@ "passGenInfo": { "message": "Generează automat parole unice și puternice pentru autentificările dvs." }, - "bitWebVault": { - "message": "Seif web Bitwarden" + "bitWebVaultApp": { + "message": "Bitwarden web app" }, "importItems": { "message": "Import de articole" @@ -779,11 +821,8 @@ "shared": { "message": "Partajat" }, - "learnOrg": { - "message": "Aflați despre organizații" - }, - "learnOrgConfirmation": { - "message": "Bitwarden vă permite să vă partajați articolele seifului cu alte persoane utilizând o organizație. Doriți să vizitați site-ul bitwarden.com pentru a afla mai multe?" + "bitwardenForBusinessPageDesc": { + "message": "Bitwarden for Business allows you to share your vault items with others by using an organization. Learn more on the bitwarden.com website." }, "moveToOrganization": { "message": "Mutare la organizație" @@ -1714,6 +1753,12 @@ "biometricsNotSupportedDesc": { "message": "Biometria browserului nu este acceptată pe acest dispozitiv." }, + "biometricsNotUnlockedTitle": { + "message": "User locked or logged out" + }, + "biometricsNotUnlockedDesc": { + "message": "Please unlock this user in the desktop application and try again." + }, "biometricsFailedTitle": { "message": "Biometrica a eșuat" }, @@ -2177,6 +2222,108 @@ "forwardedEmailDesc": { "message": "Generați un alias de e-mail cu un serviciu de redirecționare extern." }, + "forwarderError": { + "message": "$SERVICENAME$ error: $ERRORMESSAGE$", + "description": "Reports an error returned by a forwarding service to the user.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + }, + "errormessage": { + "content": "$2", + "example": "Invalid characters in domain name." + } + } + }, + "forwarderGeneratedBy": { + "message": "Generated by Bitwarden.", + "description": "Displayed with the address on the forwarding service's configuration screen." + }, + "forwarderGeneratedByWithWebsite": { + "message": "Website: $WEBSITE$. Generated by Bitwarden.", + "description": "Displayed with the address on the forwarding service's configuration screen.", + "placeholders": { + "WEBSITE": { + "content": "$1", + "example": "www.example.com" + } + } + }, + "forwaderInvalidToken": { + "message": "Invalid $SERVICENAME$ API token", + "description": "Displayed when the user's API token is empty or rejected by the forwarding service.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwaderInvalidTokenWithMessage": { + "message": "Invalid $SERVICENAME$ API token: $ERRORMESSAGE$", + "description": "Displayed when the user's API token is rejected by the forwarding service with an error message.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + }, + "errormessage": { + "content": "$2", + "example": "Please verify your email address to continue." + } + } + }, + "forwarderNoAccountId": { + "message": "Unable to obtain $SERVICENAME$ masked email account ID.", + "description": "Displayed when the forwarding service fails to return an account ID.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderNoDomain": { + "message": "Invalid $SERVICENAME$ domain.", + "description": "Displayed when the domain is empty or domain authorization failed at the forwarding service.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderNoUrl": { + "message": "Invalid $SERVICENAME$ url.", + "description": "Displayed when the url of the forwarding service wasn't supplied.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderUnknownError": { + "message": "Unknown $SERVICENAME$ error occurred.", + "description": "Displayed when the forwarding service failed due to an unknown error.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderUnknownForwarder": { + "message": "Unknown forwarder: '$SERVICENAME$'.", + "description": "Displayed when the forwarding service is not supported.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "JustTrust.us" + } + } + }, "hostname": { "message": "Nume server", "description": "Part of a URL." @@ -3029,6 +3176,41 @@ "message": "to make them visible.", "description": "This will be part of a larger sentence, which will read like so: Assign these items to a collection from the Admin Console to make them visible." }, + "autofillSuggestions": { + "message": "Auto-fill suggestions" + }, + "autofillSuggestionsTip": { + "message": "Save a login item for this site to auto-fill" + }, + "yourVaultIsEmpty": { + "message": "Your vault is empty" + }, + "noItemsMatchSearch": { + "message": "No items match your search" + }, + "clearFiltersOrTryAnother": { + "message": "Clear filters or try another search term" + }, + "copyInfo": { + "message": "Copy info, $ITEMNAME$", + "description": "Aria label for a button that opens a menu with options to copy information from an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "moreOptions": { + "message": "More options, $ITEMNAME$", + "description": "Aria label for a button that opens a menu with more options for an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, "adminConsole": { "message": "Admin Console" }, @@ -3046,5 +3228,38 @@ }, "errorAssigningTargetFolder": { "message": "Error assigning target folder." + }, + "viewItemsIn": { + "message": "View items in $NAME$", + "description": "Button to view the contents of a folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "backTo": { + "message": "Back to $NAME$", + "description": "Navigate back to a previous folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "new": { + "message": "New" + }, + "removeItem": { + "message": "Remove $NAME$", + "description": "Remove a selected option, such as a folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } } } diff --git a/apps/browser/src/_locales/ru/messages.json b/apps/browser/src/_locales/ru/messages.json index 8f0d211056f..1b8d103c0e9 100644 --- a/apps/browser/src/_locales/ru/messages.json +++ b/apps/browser/src/_locales/ru/messages.json @@ -166,15 +166,21 @@ "confirmIdentity": { "message": "Подтвердите вашу личность, чтобы продолжить." }, - "account": { - "message": "Аккаунт" - }, "changeMasterPassword": { "message": "Изменить мастер-пароль" }, "continueToWebApp": { "message": "Перейти к веб-приложению?" }, + "continueToWebAppDesc": { + "message": "Изучите дополнительные возможности вашего аккаунта Bitwarden в веб-приложении." + }, + "continueToHelpCenter": { + "message": "Перейти в справочный центр?" + }, + "continueToHelpCenterDesc": { + "message": "Подробнее о том, как использовать Bitwarden, можно узнать в справочном центре." + }, "changeMasterPasswordOnWebConfirmation": { "message": "Изменить мастер-пароль можно в веб-приложении Bitwarden." }, @@ -192,9 +198,45 @@ "logOut": { "message": "Выход" }, + "aboutBitwarden": { + "message": "О Bitwarden" + }, "about": { "message": "О Bitwarden" }, + "moreFromBitwarden": { + "message": "Больше от Bitwarden" + }, + "continueToBitwardenDotCom": { + "message": "Продолжить на bitwarden.com?" + }, + "bitwardenForBusiness": { + "message": "Bitwarden для бизнеса" + }, + "bitwardenAuthenticator": { + "message": "Bitwarden Authenticator" + }, + "continueToAuthenticatorPageDesc": { + "message": "Bitwarden Authenticator позволяет хранить ключи и генерировать коды TOTP для двухэтапной аутентификации. Узнайте больше на bitwarden.com" + }, + "bitwardenSecretsManager": { + "message": "Менеджер секретов Bitwarden" + }, + "continueToSecretsManagerPageDesc": { + "message": "Храните, управляйте и делитесь секретами разработчиков с помощью менеджера секретов Bitwarden. Узнайте больше на bitwarden.com." + }, + "passwordlessDotDev": { + "message": "Passwordless.dev" + }, + "continueToPasswordlessDotDevPageDesc": { + "message": "Создавайте удобную и безопасную авторизацию без традиционных паролей с помощью Passwordless.dev. Узнайте больше на bitwarden.com." + }, + "freeBitwardenFamilies": { + "message": "Бесплатный план Bitwarden Families" + }, + "freeBitwardenFamiliesPageDesc": { + "message": "Вам доступно бесплатное предложение Bitwarden Families. Воспользуйтесь этим предложением сегодня в веб-приложении." + }, "version": { "message": "Версия" }, @@ -253,8 +295,8 @@ "passGenInfo": { "message": "Автоматическая генерация сильных и уникальных паролей для ваших логинов." }, - "bitWebVault": { - "message": "Веб-хранилище Bitwarden" + "bitWebVaultApp": { + "message": "Веб-приложение Bitwarden" }, "importItems": { "message": "Импорт элементов" @@ -779,11 +821,8 @@ "shared": { "message": "Общие" }, - "learnOrg": { - "message": "Узнать об организациях" - }, - "learnOrgConfirmation": { - "message": "Bitwarden позволяет делиться элементами вашего хранилища с другими пользователями с помощью организации. Хотите посетить сайт bitwarden.com, чтобы узнать больше?" + "bitwardenForBusinessPageDesc": { + "message": "Bitwarden для Бизнеса позволяет предоставлять доступ к элементам вашего хранилища другим пользователям с помощью организации. Более подробную информацию можно найти на сайте bitwarden.com." }, "moveToOrganization": { "message": "Переместить в организацию" @@ -1714,6 +1753,12 @@ "biometricsNotSupportedDesc": { "message": "Биометрия в браузере не поддерживается этом устройстве." }, + "biometricsNotUnlockedTitle": { + "message": "Пользователь заблокирован или отключился" + }, + "biometricsNotUnlockedDesc": { + "message": "Пожалуйста, разблокируйте этого пользователя в приложении для компьютера и повторите попытку." + }, "biometricsFailedTitle": { "message": "Сбой биометрии" }, @@ -2177,6 +2222,108 @@ "forwardedEmailDesc": { "message": "Создать псевдоним электронной почты для внешней службы пересылки." }, + "forwarderError": { + "message": "Ошибка $SERVICENAME$: $ERRORMESSAGE$", + "description": "Reports an error returned by a forwarding service to the user.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + }, + "errormessage": { + "content": "$2", + "example": "Invalid characters in domain name." + } + } + }, + "forwarderGeneratedBy": { + "message": "Создано Bitwarden.", + "description": "Displayed with the address on the forwarding service's configuration screen." + }, + "forwarderGeneratedByWithWebsite": { + "message": "Сайт: $WEBSITE$. Создано Bitwarden.", + "description": "Displayed with the address on the forwarding service's configuration screen.", + "placeholders": { + "WEBSITE": { + "content": "$1", + "example": "www.example.com" + } + } + }, + "forwaderInvalidToken": { + "message": "Неверный токен API $SERVICENAME$", + "description": "Displayed when the user's API token is empty or rejected by the forwarding service.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwaderInvalidTokenWithMessage": { + "message": "Неверный токен $SERVICENAME$ API: $ERRORMESSAGE$", + "description": "Displayed when the user's API token is rejected by the forwarding service with an error message.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + }, + "errormessage": { + "content": "$2", + "example": "Please verify your email address to continue." + } + } + }, + "forwarderNoAccountId": { + "message": "Не удалось получить скрытый идентификатор email аккаунта $SERVICENAME$.", + "description": "Displayed when the forwarding service fails to return an account ID.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderNoDomain": { + "message": "Недопустимый домен $SERVICENAME$.", + "description": "Displayed when the domain is empty or domain authorization failed at the forwarding service.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderNoUrl": { + "message": "Некорректный URL $SERVICENAME$.", + "description": "Displayed when the url of the forwarding service wasn't supplied.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderUnknownError": { + "message": "Произошла неизвестная ошибка $SERVICENAME$.", + "description": "Displayed when the forwarding service failed due to an unknown error.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderUnknownForwarder": { + "message": "Неизвестный форвардер: '$SERVICENAME$'.", + "description": "Displayed when the forwarding service is not supported.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "JustTrust.us" + } + } + }, "hostname": { "message": "Имя хоста", "description": "Part of a URL." @@ -3029,6 +3176,41 @@ "message": "чтобы сделать их видимыми.", "description": "This will be part of a larger sentence, which will read like so: Assign these items to a collection from the Admin Console to make them visible." }, + "autofillSuggestions": { + "message": "Предложения по автозаполнению" + }, + "autofillSuggestionsTip": { + "message": "Сохранить логин для этого сайта для автозаполнения" + }, + "yourVaultIsEmpty": { + "message": "Ваше хранилище пусто" + }, + "noItemsMatchSearch": { + "message": "Нет элементов, соответствующих вашему запросу" + }, + "clearFiltersOrTryAnother": { + "message": "Очистите фильтры или попробуйте другой поисковый запрос" + }, + "copyInfo": { + "message": "Скопировать информацию, $ITEMNAME$", + "description": "Aria label for a button that opens a menu with options to copy information from an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "moreOptions": { + "message": "Больше опций, $ITEMNAME$", + "description": "Aria label for a button that opens a menu with more options for an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, "adminConsole": { "message": "консоли администратора" }, @@ -3046,5 +3228,38 @@ }, "errorAssigningTargetFolder": { "message": "Ошибка при назначении целевой папки." + }, + "viewItemsIn": { + "message": "Просмотр элементов в $NAME$", + "description": "Button to view the contents of a folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "backTo": { + "message": "Вернуться к $NAME$", + "description": "Navigate back to a previous folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "new": { + "message": "Новый" + }, + "removeItem": { + "message": "Удалить $NAME$", + "description": "Remove a selected option, such as a folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } } } diff --git a/apps/browser/src/_locales/si/messages.json b/apps/browser/src/_locales/si/messages.json index f4f13a4f559..3196fbbe15a 100644 --- a/apps/browser/src/_locales/si/messages.json +++ b/apps/browser/src/_locales/si/messages.json @@ -166,15 +166,21 @@ "confirmIdentity": { "message": "දිගටම කරගෙන යාමට ඔබගේ අනන්යතාවය තහවුරු කරන්න." }, - "account": { - "message": "ගිණුම" - }, "changeMasterPassword": { "message": "ප්රධාන මුරපදය වෙනස්" }, "continueToWebApp": { "message": "Continue to web app?" }, + "continueToWebAppDesc": { + "message": "Explore more features of your Bitwarden account on the web app." + }, + "continueToHelpCenter": { + "message": "Continue to Help Center?" + }, + "continueToHelpCenterDesc": { + "message": "Learn more about how to use Bitwarden on the Help Center." + }, "changeMasterPasswordOnWebConfirmation": { "message": "You can change your master password on the Bitwarden web app." }, @@ -192,9 +198,45 @@ "logOut": { "message": "නික්මෙන්න" }, + "aboutBitwarden": { + "message": "About Bitwarden" + }, "about": { "message": "පිලිබඳව" }, + "moreFromBitwarden": { + "message": "More from Bitwarden" + }, + "continueToBitwardenDotCom": { + "message": "Continue to bitwarden.com?" + }, + "bitwardenForBusiness": { + "message": "Bitwarden for Business" + }, + "bitwardenAuthenticator": { + "message": "Bitwarden Authenticator" + }, + "continueToAuthenticatorPageDesc": { + "message": "Bitwarden Authenticator allows you to store authenticator keys and generate TOTP codes for 2-step verification flows. Learn more on the bitwarden.com website" + }, + "bitwardenSecretsManager": { + "message": "Bitwarden Secrets Manager" + }, + "continueToSecretsManagerPageDesc": { + "message": "Securely store, manage, and share developer secrets with Bitwarden Secrets Manager. Learn more on the bitwarden.com website." + }, + "passwordlessDotDev": { + "message": "Passwordless.dev" + }, + "continueToPasswordlessDotDevPageDesc": { + "message": "Create smooth and secure login experiences free from traditional passwords with Passwordless.dev. Learn more on the bitwarden.com website." + }, + "freeBitwardenFamilies": { + "message": "Free Bitwarden Families" + }, + "freeBitwardenFamiliesPageDesc": { + "message": "You are eligible for Free Bitwarden Families. Redeem this offer today in the web app." + }, "version": { "message": "අනුවාදය" }, @@ -253,8 +295,8 @@ "passGenInfo": { "message": "ඔබේ පිවිසුම් සඳහා ශක්තිමත්, අද්විතීය මුරපද ස්වයංක්රීයව ජනනය කරන්න." }, - "bitWebVault": { - "message": "බිට්වර්ඩන් වෙබ් සුරක්ෂිතාගාරය" + "bitWebVaultApp": { + "message": "Bitwarden web app" }, "importItems": { "message": "ආනයන අයිතම" @@ -779,11 +821,8 @@ "shared": { "message": "බෙදාගත්" }, - "learnOrg": { - "message": "සංවිධාන ගැන ඉගෙන ගන්න" - }, - "learnOrgConfirmation": { - "message": "සංවිධානයක් භාවිතා කිරීමෙන් ඔබේ සුරක්ෂිතාගාරය අයිතම අන් අය සමඟ බෙදා ගැනීමට Bitwarden ඔබට ඉඩ දෙයි. වැඩි විස්තර දැනගැනීම සඳහා bitwarden.com වෙබ් අඩවියට පිවිසීමට ඔබ කැමතිද?" + "bitwardenForBusinessPageDesc": { + "message": "Bitwarden for Business allows you to share your vault items with others by using an organization. Learn more on the bitwarden.com website." }, "moveToOrganization": { "message": "සංවිධානය වෙත ගෙනයන්න" @@ -1714,6 +1753,12 @@ "biometricsNotSupportedDesc": { "message": "බ්රව්සර් biometrics මෙම උපාංගය මත සහය නොදක්වයි." }, + "biometricsNotUnlockedTitle": { + "message": "User locked or logged out" + }, + "biometricsNotUnlockedDesc": { + "message": "Please unlock this user in the desktop application and try again." + }, "biometricsFailedTitle": { "message": "Biometrics failed" }, @@ -2177,6 +2222,108 @@ "forwardedEmailDesc": { "message": "Generate an email alias with an external forwarding service." }, + "forwarderError": { + "message": "$SERVICENAME$ error: $ERRORMESSAGE$", + "description": "Reports an error returned by a forwarding service to the user.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + }, + "errormessage": { + "content": "$2", + "example": "Invalid characters in domain name." + } + } + }, + "forwarderGeneratedBy": { + "message": "Generated by Bitwarden.", + "description": "Displayed with the address on the forwarding service's configuration screen." + }, + "forwarderGeneratedByWithWebsite": { + "message": "Website: $WEBSITE$. Generated by Bitwarden.", + "description": "Displayed with the address on the forwarding service's configuration screen.", + "placeholders": { + "WEBSITE": { + "content": "$1", + "example": "www.example.com" + } + } + }, + "forwaderInvalidToken": { + "message": "Invalid $SERVICENAME$ API token", + "description": "Displayed when the user's API token is empty or rejected by the forwarding service.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwaderInvalidTokenWithMessage": { + "message": "Invalid $SERVICENAME$ API token: $ERRORMESSAGE$", + "description": "Displayed when the user's API token is rejected by the forwarding service with an error message.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + }, + "errormessage": { + "content": "$2", + "example": "Please verify your email address to continue." + } + } + }, + "forwarderNoAccountId": { + "message": "Unable to obtain $SERVICENAME$ masked email account ID.", + "description": "Displayed when the forwarding service fails to return an account ID.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderNoDomain": { + "message": "Invalid $SERVICENAME$ domain.", + "description": "Displayed when the domain is empty or domain authorization failed at the forwarding service.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderNoUrl": { + "message": "Invalid $SERVICENAME$ url.", + "description": "Displayed when the url of the forwarding service wasn't supplied.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderUnknownError": { + "message": "Unknown $SERVICENAME$ error occurred.", + "description": "Displayed when the forwarding service failed due to an unknown error.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderUnknownForwarder": { + "message": "Unknown forwarder: '$SERVICENAME$'.", + "description": "Displayed when the forwarding service is not supported.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "JustTrust.us" + } + } + }, "hostname": { "message": "Hostname", "description": "Part of a URL." @@ -3029,6 +3176,41 @@ "message": "to make them visible.", "description": "This will be part of a larger sentence, which will read like so: Assign these items to a collection from the Admin Console to make them visible." }, + "autofillSuggestions": { + "message": "Auto-fill suggestions" + }, + "autofillSuggestionsTip": { + "message": "Save a login item for this site to auto-fill" + }, + "yourVaultIsEmpty": { + "message": "Your vault is empty" + }, + "noItemsMatchSearch": { + "message": "No items match your search" + }, + "clearFiltersOrTryAnother": { + "message": "Clear filters or try another search term" + }, + "copyInfo": { + "message": "Copy info, $ITEMNAME$", + "description": "Aria label for a button that opens a menu with options to copy information from an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "moreOptions": { + "message": "More options, $ITEMNAME$", + "description": "Aria label for a button that opens a menu with more options for an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, "adminConsole": { "message": "Admin Console" }, @@ -3046,5 +3228,38 @@ }, "errorAssigningTargetFolder": { "message": "Error assigning target folder." + }, + "viewItemsIn": { + "message": "View items in $NAME$", + "description": "Button to view the contents of a folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "backTo": { + "message": "Back to $NAME$", + "description": "Navigate back to a previous folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "new": { + "message": "New" + }, + "removeItem": { + "message": "Remove $NAME$", + "description": "Remove a selected option, such as a folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } } } diff --git a/apps/browser/src/_locales/sk/messages.json b/apps/browser/src/_locales/sk/messages.json index db11a308559..3716ec18144 100644 --- a/apps/browser/src/_locales/sk/messages.json +++ b/apps/browser/src/_locales/sk/messages.json @@ -166,15 +166,21 @@ "confirmIdentity": { "message": "Ak chcete pokračovať, potvrďte svoju identitu." }, - "account": { - "message": "Účet" - }, "changeMasterPassword": { "message": "Zmeniť hlavné heslo" }, "continueToWebApp": { "message": "Pokračovať vo webovej aplikácii?" }, + "continueToWebAppDesc": { + "message": "Preskúmajte ďalšie funkcie svojho účtu na Bitwarden vo webovej aplikácii." + }, + "continueToHelpCenter": { + "message": "Pokračovať v centre pomoci?" + }, + "continueToHelpCenterDesc": { + "message": "Viac informácií o používaní Bitwardenu nájdete v centre pomoci." + }, "changeMasterPasswordOnWebConfirmation": { "message": "Hlavné heslo si môžete zmeniť vo webovej aplikácii Bitwarden." }, @@ -192,9 +198,45 @@ "logOut": { "message": "Odhlásiť sa" }, + "aboutBitwarden": { + "message": "O Bitwarden" + }, "about": { "message": "O aplikácii" }, + "moreFromBitwarden": { + "message": "Viac od spoločnosti Bitwarden" + }, + "continueToBitwardenDotCom": { + "message": "Pokračovať na bitwarden.com?" + }, + "bitwardenForBusiness": { + "message": "Bitwarden pre podniky" + }, + "bitwardenAuthenticator": { + "message": "Bitwarden Authenticator" + }, + "continueToAuthenticatorPageDesc": { + "message": "Bitwarden Authenticator umožňuje uložiť overovacie kľúče a generovať kódy TOTP pre dvojstupňoveé overovanie. Viac informácií nájdete na webovej stránke bitwarden.com" + }, + "bitwardenSecretsManager": { + "message": "Bitwarden Secrets Manager" + }, + "continueToSecretsManagerPageDesc": { + "message": "Bezpečne ukladajte, spravujte a zdieľajte vývojárske tajomstvá s Bitwarden Secrets Manager. Viac sa môžete dozvedieť na stránke bitwarden.com." + }, + "passwordlessDotDev": { + "message": "Passwordless.dev" + }, + "continueToPasswordlessDotDevPageDesc": { + "message": "Vytvorte plynulé a bezpečné prihlásenie bez tradičných hesiel s Passwordless.dev. Viac sa môžete dozvedieť na stránke bitwarden.com." + }, + "freeBitwardenFamilies": { + "message": "Bitwarden pre Rodiny zadarmo" + }, + "freeBitwardenFamiliesPageDesc": { + "message": "Máte nárok na bezplatnú službu Bitwarden pre Rodiny. Využite túto ponuku ešte dnes vo webovej aplikácii." + }, "version": { "message": "Verzia" }, @@ -253,8 +295,8 @@ "passGenInfo": { "message": "Automaticky generovať silné a unikátne heslá k prihlasovacím údajom." }, - "bitWebVault": { - "message": "Webový trezor Bitwarden" + "bitWebVaultApp": { + "message": "Webová aplikácia Bitwarden" }, "importItems": { "message": "Importovať položky" @@ -779,11 +821,8 @@ "shared": { "message": "Zdieľané" }, - "learnOrg": { - "message": "Zistiť viac o organizáciách" - }, - "learnOrgConfirmation": { - "message": "Bitwarden vám umožňuje zdieľať vaše položky trezora s ostatnými pomocou organizácie. Chcete navštíviť webovú stránku bitwarden.com a dozvedieť sa viac?" + "bitwardenForBusinessPageDesc": { + "message": "Bitwarden pre podniky vám umožňuje zdieľať položky trezoru s ostatnými pomocou organizácie. Viac informácií nájdete na webovej stránke bitwarden.com." }, "moveToOrganization": { "message": "Presunúť do organizácie" @@ -1714,6 +1753,12 @@ "biometricsNotSupportedDesc": { "message": "Biometria v prehliadači nie je podporovaná na tomto zariadení." }, + "biometricsNotUnlockedTitle": { + "message": "Používateľ je zamknutý alebo odhlásený" + }, + "biometricsNotUnlockedDesc": { + "message": "Prosím, odomknite tohto používateľa v počítačovej aplikácii a skúste to znova." + }, "biometricsFailedTitle": { "message": "Biometria zlyhala" }, @@ -2177,6 +2222,108 @@ "forwardedEmailDesc": { "message": "Vytvoriť e-mailový alias pomocou externej služby preposielania." }, + "forwarderError": { + "message": "$SERVICENAME$ chyba: $ERRORMESSAGE$", + "description": "Reports an error returned by a forwarding service to the user.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + }, + "errormessage": { + "content": "$2", + "example": "Invalid characters in domain name." + } + } + }, + "forwarderGeneratedBy": { + "message": "Vygenerované Bitwardenom.", + "description": "Displayed with the address on the forwarding service's configuration screen." + }, + "forwarderGeneratedByWithWebsite": { + "message": "Webstránka: $WEBSITE$. Vygenerované Bitwardenom.", + "description": "Displayed with the address on the forwarding service's configuration screen.", + "placeholders": { + "WEBSITE": { + "content": "$1", + "example": "www.example.com" + } + } + }, + "forwaderInvalidToken": { + "message": "Neplatný token API $SERVICENAME$", + "description": "Displayed when the user's API token is empty or rejected by the forwarding service.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwaderInvalidTokenWithMessage": { + "message": "Neplatný token API $SERVICENAME$: $ERRORMESSAGE$", + "description": "Displayed when the user's API token is rejected by the forwarding service with an error message.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + }, + "errormessage": { + "content": "$2", + "example": "Please verify your email address to continue." + } + } + }, + "forwarderNoAccountId": { + "message": "Nepodarilo sa získať ID maskovaného e-mailového účtu $SERVICENAME$.", + "description": "Displayed when the forwarding service fails to return an account ID.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderNoDomain": { + "message": "Neplatná doména $SERVICENAME$.", + "description": "Displayed when the domain is empty or domain authorization failed at the forwarding service.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderNoUrl": { + "message": "Neplatná url adresa $SERVICENAME$.", + "description": "Displayed when the url of the forwarding service wasn't supplied.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderUnknownError": { + "message": "Vyskytla sa neznáma chyba $SERVICENAME$.", + "description": "Displayed when the forwarding service failed due to an unknown error.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderUnknownForwarder": { + "message": "Nepodporovaná služba: '$SERVICENAME$'.", + "description": "Displayed when the forwarding service is not supported.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "JustTrust.us" + } + } + }, "hostname": { "message": "Názov hostiteľa", "description": "Part of a URL." @@ -3029,6 +3176,41 @@ "message": ", aby boli viditeľné.", "description": "This will be part of a larger sentence, which will read like so: Assign these items to a collection from the Admin Console to make them visible." }, + "autofillSuggestions": { + "message": "Návrhy automatického vypĺňania" + }, + "autofillSuggestionsTip": { + "message": "Uložte položku prihlásenia pre tento web na automatické vyplnenie" + }, + "yourVaultIsEmpty": { + "message": "Váš trezor je prázdny" + }, + "noItemsMatchSearch": { + "message": "Vyhľadávaniu nezodpovedajú žiadne položky" + }, + "clearFiltersOrTryAnother": { + "message": "Vymažte filtre alebo zmeňte vyhľadávaný výraz" + }, + "copyInfo": { + "message": "Skopírovať info, $ITEMNAME$", + "description": "Aria label for a button that opens a menu with options to copy information from an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "moreOptions": { + "message": "Ďalšie možnosti, $ITEMNAME$", + "description": "Aria label for a button that opens a menu with more options for an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, "adminConsole": { "message": "Správcovská konzola" }, @@ -3046,5 +3228,38 @@ }, "errorAssigningTargetFolder": { "message": "Chyba pri priraďovaní cieľového priečinka." + }, + "viewItemsIn": { + "message": "View items in $NAME$", + "description": "Button to view the contents of a folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "backTo": { + "message": "Back to $NAME$", + "description": "Navigate back to a previous folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "new": { + "message": "Nová" + }, + "removeItem": { + "message": "Remove $NAME$", + "description": "Remove a selected option, such as a folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } } } diff --git a/apps/browser/src/_locales/sl/messages.json b/apps/browser/src/_locales/sl/messages.json index b098546de2d..35606e0b108 100644 --- a/apps/browser/src/_locales/sl/messages.json +++ b/apps/browser/src/_locales/sl/messages.json @@ -166,15 +166,21 @@ "confirmIdentity": { "message": "Za nadaljevanje potrdite svojo istovetnost." }, - "account": { - "message": "Račun" - }, "changeMasterPassword": { "message": "Spremeni glavno geslo" }, "continueToWebApp": { "message": "Continue to web app?" }, + "continueToWebAppDesc": { + "message": "Explore more features of your Bitwarden account on the web app." + }, + "continueToHelpCenter": { + "message": "Continue to Help Center?" + }, + "continueToHelpCenterDesc": { + "message": "Learn more about how to use Bitwarden on the Help Center." + }, "changeMasterPasswordOnWebConfirmation": { "message": "You can change your master password on the Bitwarden web app." }, @@ -192,9 +198,45 @@ "logOut": { "message": "Odjava" }, + "aboutBitwarden": { + "message": "About Bitwarden" + }, "about": { "message": "O programu" }, + "moreFromBitwarden": { + "message": "More from Bitwarden" + }, + "continueToBitwardenDotCom": { + "message": "Continue to bitwarden.com?" + }, + "bitwardenForBusiness": { + "message": "Bitwarden for Business" + }, + "bitwardenAuthenticator": { + "message": "Bitwarden Authenticator" + }, + "continueToAuthenticatorPageDesc": { + "message": "Bitwarden Authenticator allows you to store authenticator keys and generate TOTP codes for 2-step verification flows. Learn more on the bitwarden.com website" + }, + "bitwardenSecretsManager": { + "message": "Bitwarden Secrets Manager" + }, + "continueToSecretsManagerPageDesc": { + "message": "Securely store, manage, and share developer secrets with Bitwarden Secrets Manager. Learn more on the bitwarden.com website." + }, + "passwordlessDotDev": { + "message": "Passwordless.dev" + }, + "continueToPasswordlessDotDevPageDesc": { + "message": "Create smooth and secure login experiences free from traditional passwords with Passwordless.dev. Learn more on the bitwarden.com website." + }, + "freeBitwardenFamilies": { + "message": "Free Bitwarden Families" + }, + "freeBitwardenFamiliesPageDesc": { + "message": "You are eligible for Free Bitwarden Families. Redeem this offer today in the web app." + }, "version": { "message": "Različica" }, @@ -253,8 +295,8 @@ "passGenInfo": { "message": "Avtomatično generiraj močna, edinstvena gesla za vaše prijave." }, - "bitWebVault": { - "message": "Bitwarden spletni trezor" + "bitWebVaultApp": { + "message": "Bitwarden web app" }, "importItems": { "message": "Uvozi elemente" @@ -779,11 +821,8 @@ "shared": { "message": "V skupni rabi" }, - "learnOrg": { - "message": "Preberite več o organizacijah" - }, - "learnOrgConfirmation": { - "message": "Bitwarden omogoča, da elemente v svojem trezorju delite z drugimi z uporabo organizacije. Želite obskati spletišče bitwarden.com za več informacij?" + "bitwardenForBusinessPageDesc": { + "message": "Bitwarden for Business allows you to share your vault items with others by using an organization. Learn more on the bitwarden.com website." }, "moveToOrganization": { "message": "Premakni v organizacijo" @@ -1714,6 +1753,12 @@ "biometricsNotSupportedDesc": { "message": "Browser biometrics is not supported on this device." }, + "biometricsNotUnlockedTitle": { + "message": "User locked or logged out" + }, + "biometricsNotUnlockedDesc": { + "message": "Please unlock this user in the desktop application and try again." + }, "biometricsFailedTitle": { "message": "Biometrics failed" }, @@ -2177,6 +2222,108 @@ "forwardedEmailDesc": { "message": "Generate an email alias with an external forwarding service." }, + "forwarderError": { + "message": "$SERVICENAME$ error: $ERRORMESSAGE$", + "description": "Reports an error returned by a forwarding service to the user.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + }, + "errormessage": { + "content": "$2", + "example": "Invalid characters in domain name." + } + } + }, + "forwarderGeneratedBy": { + "message": "Generated by Bitwarden.", + "description": "Displayed with the address on the forwarding service's configuration screen." + }, + "forwarderGeneratedByWithWebsite": { + "message": "Website: $WEBSITE$. Generated by Bitwarden.", + "description": "Displayed with the address on the forwarding service's configuration screen.", + "placeholders": { + "WEBSITE": { + "content": "$1", + "example": "www.example.com" + } + } + }, + "forwaderInvalidToken": { + "message": "Invalid $SERVICENAME$ API token", + "description": "Displayed when the user's API token is empty or rejected by the forwarding service.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwaderInvalidTokenWithMessage": { + "message": "Invalid $SERVICENAME$ API token: $ERRORMESSAGE$", + "description": "Displayed when the user's API token is rejected by the forwarding service with an error message.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + }, + "errormessage": { + "content": "$2", + "example": "Please verify your email address to continue." + } + } + }, + "forwarderNoAccountId": { + "message": "Unable to obtain $SERVICENAME$ masked email account ID.", + "description": "Displayed when the forwarding service fails to return an account ID.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderNoDomain": { + "message": "Invalid $SERVICENAME$ domain.", + "description": "Displayed when the domain is empty or domain authorization failed at the forwarding service.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderNoUrl": { + "message": "Invalid $SERVICENAME$ url.", + "description": "Displayed when the url of the forwarding service wasn't supplied.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderUnknownError": { + "message": "Unknown $SERVICENAME$ error occurred.", + "description": "Displayed when the forwarding service failed due to an unknown error.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderUnknownForwarder": { + "message": "Unknown forwarder: '$SERVICENAME$'.", + "description": "Displayed when the forwarding service is not supported.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "JustTrust.us" + } + } + }, "hostname": { "message": "Hostname", "description": "Part of a URL." @@ -3029,6 +3176,41 @@ "message": "to make them visible.", "description": "This will be part of a larger sentence, which will read like so: Assign these items to a collection from the Admin Console to make them visible." }, + "autofillSuggestions": { + "message": "Auto-fill suggestions" + }, + "autofillSuggestionsTip": { + "message": "Save a login item for this site to auto-fill" + }, + "yourVaultIsEmpty": { + "message": "Your vault is empty" + }, + "noItemsMatchSearch": { + "message": "No items match your search" + }, + "clearFiltersOrTryAnother": { + "message": "Clear filters or try another search term" + }, + "copyInfo": { + "message": "Copy info, $ITEMNAME$", + "description": "Aria label for a button that opens a menu with options to copy information from an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "moreOptions": { + "message": "More options, $ITEMNAME$", + "description": "Aria label for a button that opens a menu with more options for an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, "adminConsole": { "message": "Admin Console" }, @@ -3046,5 +3228,38 @@ }, "errorAssigningTargetFolder": { "message": "Error assigning target folder." + }, + "viewItemsIn": { + "message": "View items in $NAME$", + "description": "Button to view the contents of a folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "backTo": { + "message": "Back to $NAME$", + "description": "Navigate back to a previous folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "new": { + "message": "New" + }, + "removeItem": { + "message": "Remove $NAME$", + "description": "Remove a selected option, such as a folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } } } diff --git a/apps/browser/src/_locales/sr/messages.json b/apps/browser/src/_locales/sr/messages.json index 621bd5953f3..240a13a785e 100644 --- a/apps/browser/src/_locales/sr/messages.json +++ b/apps/browser/src/_locales/sr/messages.json @@ -166,15 +166,21 @@ "confirmIdentity": { "message": "Потврдите свој идентитет да би наставили." }, - "account": { - "message": "Налог" - }, "changeMasterPassword": { "message": "Промени главну лозинку" }, "continueToWebApp": { "message": "Ићи на веб апликацију?" }, + "continueToWebAppDesc": { + "message": "Explore more features of your Bitwarden account on the web app." + }, + "continueToHelpCenter": { + "message": "Continue to Help Center?" + }, + "continueToHelpCenterDesc": { + "message": "Learn more about how to use Bitwarden on the Help Center." + }, "changeMasterPasswordOnWebConfirmation": { "message": "Можете променити главну лозинку на Bitwarden веб апликацији." }, @@ -192,9 +198,45 @@ "logOut": { "message": "Одјави се" }, + "aboutBitwarden": { + "message": "About Bitwarden" + }, "about": { "message": "О апликацији" }, + "moreFromBitwarden": { + "message": "More from Bitwarden" + }, + "continueToBitwardenDotCom": { + "message": "Continue to bitwarden.com?" + }, + "bitwardenForBusiness": { + "message": "Bitwarden for Business" + }, + "bitwardenAuthenticator": { + "message": "Bitwarden Authenticator" + }, + "continueToAuthenticatorPageDesc": { + "message": "Bitwarden Authenticator allows you to store authenticator keys and generate TOTP codes for 2-step verification flows. Learn more on the bitwarden.com website" + }, + "bitwardenSecretsManager": { + "message": "Bitwarden Secrets Manager" + }, + "continueToSecretsManagerPageDesc": { + "message": "Securely store, manage, and share developer secrets with Bitwarden Secrets Manager. Learn more on the bitwarden.com website." + }, + "passwordlessDotDev": { + "message": "Passwordless.dev" + }, + "continueToPasswordlessDotDevPageDesc": { + "message": "Create smooth and secure login experiences free from traditional passwords with Passwordless.dev. Learn more on the bitwarden.com website." + }, + "freeBitwardenFamilies": { + "message": "Free Bitwarden Families" + }, + "freeBitwardenFamiliesPageDesc": { + "message": "You are eligible for Free Bitwarden Families. Redeem this offer today in the web app." + }, "version": { "message": "Верзија" }, @@ -253,8 +295,8 @@ "passGenInfo": { "message": "Аутоматски генеришите јаке, јединствене лозинке за ваше пријаве." }, - "bitWebVault": { - "message": "Bitwarden Интернет Сеф" + "bitWebVaultApp": { + "message": "Bitwarden web app" }, "importItems": { "message": "Увоз ставки" @@ -375,7 +417,7 @@ "message": "Остало" }, "unlockMethods": { - "message": "Unlock options" + "message": "Опције деблокирања" }, "unlockMethodNeededToChangeTimeoutActionDesc": { "message": "Подесите метод откључавања да бисте променили радњу временског ограничења сефа." @@ -384,10 +426,10 @@ "message": "Подесите метод откључавања у подешавањима" }, "sessionTimeoutHeader": { - "message": "Session timeout" + "message": "Истек сесије" }, "otherOptions": { - "message": "Other options" + "message": "Остале опције" }, "rateExtension": { "message": "Оцени овај додатак" @@ -779,11 +821,8 @@ "shared": { "message": "Дељено" }, - "learnOrg": { - "message": "Сазнајте о организацијама" - }, - "learnOrgConfirmation": { - "message": "Bitwarden вам омогућава да делите ставке сефа са другима користећи организацију. Да ли желите да посетите веб локацију bitwarden.com да бисте сазнали више?" + "bitwardenForBusinessPageDesc": { + "message": "Bitwarden for Business allows you to share your vault items with others by using an organization. Learn more on the bitwarden.com website." }, "moveToOrganization": { "message": "Премести у организацију" @@ -1714,6 +1753,12 @@ "biometricsNotSupportedDesc": { "message": "Биометрија прегледача није подржана на овом уређају." }, + "biometricsNotUnlockedTitle": { + "message": "Корисник је закључан или одјављен" + }, + "biometricsNotUnlockedDesc": { + "message": "Откључајте овог корисника у десктоп апликацији и покушајте поново." + }, "biometricsFailedTitle": { "message": "Биометрија није успела" }, @@ -2177,6 +2222,108 @@ "forwardedEmailDesc": { "message": "Генеришите псеудоним е-поште помоћу екстерне услуге прослеђивања." }, + "forwarderError": { + "message": "$SERVICENAME$ грешка: $ERRORMESSAGE$", + "description": "Reports an error returned by a forwarding service to the user.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + }, + "errormessage": { + "content": "$2", + "example": "Invalid characters in domain name." + } + } + }, + "forwarderGeneratedBy": { + "message": "Генерисао Bitwarden.", + "description": "Displayed with the address on the forwarding service's configuration screen." + }, + "forwarderGeneratedByWithWebsite": { + "message": "Вебсајт: $WEBSITE$. Генерисао Bitwarden.", + "description": "Displayed with the address on the forwarding service's configuration screen.", + "placeholders": { + "WEBSITE": { + "content": "$1", + "example": "www.example.com" + } + } + }, + "forwaderInvalidToken": { + "message": "Погрешан АПИ токен $SERVICENAME$", + "description": "Displayed when the user's API token is empty or rejected by the forwarding service.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwaderInvalidTokenWithMessage": { + "message": "Погрешан АПИ токен $SERVICENAME$: $ERRORMESSAGE$", + "description": "Displayed when the user's API token is rejected by the forwarding service with an error message.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + }, + "errormessage": { + "content": "$2", + "example": "Please verify your email address to continue." + } + } + }, + "forwarderNoAccountId": { + "message": "Није могуће добити ИД налога маскираног имејла $SERVICENAME$.", + "description": "Displayed when the forwarding service fails to return an account ID.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderNoDomain": { + "message": "Погрешан домен $SERVICENAME$.", + "description": "Displayed when the domain is empty or domain authorization failed at the forwarding service.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderNoUrl": { + "message": "Погрешан УРЛ $SERVICENAME$.", + "description": "Displayed when the url of the forwarding service wasn't supplied.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderUnknownError": { + "message": "Непозната грешка $SERVICENAME$-а.", + "description": "Displayed when the forwarding service failed due to an unknown error.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderUnknownForwarder": { + "message": "Непознати шпедитер: '$SERVICENAME$'.", + "description": "Displayed when the forwarding service is not supported.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "JustTrust.us" + } + } + }, "hostname": { "message": "Име домаћина", "description": "Part of a URL." @@ -3029,22 +3176,90 @@ "message": "to make them visible.", "description": "This will be part of a larger sentence, which will read like so: Assign these items to a collection from the Admin Console to make them visible." }, + "autofillSuggestions": { + "message": "Auto-fill suggestions" + }, + "autofillSuggestionsTip": { + "message": "Save a login item for this site to auto-fill" + }, + "yourVaultIsEmpty": { + "message": "Your vault is empty" + }, + "noItemsMatchSearch": { + "message": "No items match your search" + }, + "clearFiltersOrTryAnother": { + "message": "Clear filters or try another search term" + }, + "copyInfo": { + "message": "Copy info, $ITEMNAME$", + "description": "Aria label for a button that opens a menu with options to copy information from an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "moreOptions": { + "message": "More options, $ITEMNAME$", + "description": "Aria label for a button that opens a menu with more options for an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, "adminConsole": { "message": "Администраторска конзола" }, "accountSecurity": { - "message": "Account security" + "message": "Безбедност налога" }, "notifications": { - "message": "Notifications" + "message": "Обавештења" }, "appearance": { - "message": "Appearance" + "message": "Изглед" }, "errorAssigningTargetCollection": { "message": "Грешка при додељивању циљне колекције." }, "errorAssigningTargetFolder": { "message": "Грешка при додељивању циљне фасцикле." + }, + "viewItemsIn": { + "message": "View items in $NAME$", + "description": "Button to view the contents of a folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "backTo": { + "message": "Back to $NAME$", + "description": "Navigate back to a previous folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "new": { + "message": "Ново" + }, + "removeItem": { + "message": "Remove $NAME$", + "description": "Remove a selected option, such as a folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } } } diff --git a/apps/browser/src/_locales/sv/messages.json b/apps/browser/src/_locales/sv/messages.json index 96776e70601..d6107818684 100644 --- a/apps/browser/src/_locales/sv/messages.json +++ b/apps/browser/src/_locales/sv/messages.json @@ -166,15 +166,21 @@ "confirmIdentity": { "message": "Bekräfta din identitet för att fortsätta." }, - "account": { - "message": "Konto" - }, "changeMasterPassword": { "message": "Ändra huvudlösenord" }, "continueToWebApp": { "message": "Continue to web app?" }, + "continueToWebAppDesc": { + "message": "Explore more features of your Bitwarden account on the web app." + }, + "continueToHelpCenter": { + "message": "Continue to Help Center?" + }, + "continueToHelpCenterDesc": { + "message": "Learn more about how to use Bitwarden on the Help Center." + }, "changeMasterPasswordOnWebConfirmation": { "message": "You can change your master password on the Bitwarden web app." }, @@ -192,9 +198,45 @@ "logOut": { "message": "Logga ut" }, + "aboutBitwarden": { + "message": "About Bitwarden" + }, "about": { "message": "Om" }, + "moreFromBitwarden": { + "message": "More from Bitwarden" + }, + "continueToBitwardenDotCom": { + "message": "Continue to bitwarden.com?" + }, + "bitwardenForBusiness": { + "message": "Bitwarden for Business" + }, + "bitwardenAuthenticator": { + "message": "Bitwarden Authenticator" + }, + "continueToAuthenticatorPageDesc": { + "message": "Bitwarden Authenticator allows you to store authenticator keys and generate TOTP codes for 2-step verification flows. Learn more on the bitwarden.com website" + }, + "bitwardenSecretsManager": { + "message": "Bitwarden Secrets Manager" + }, + "continueToSecretsManagerPageDesc": { + "message": "Securely store, manage, and share developer secrets with Bitwarden Secrets Manager. Learn more on the bitwarden.com website." + }, + "passwordlessDotDev": { + "message": "Passwordless.dev" + }, + "continueToPasswordlessDotDevPageDesc": { + "message": "Create smooth and secure login experiences free from traditional passwords with Passwordless.dev. Learn more on the bitwarden.com website." + }, + "freeBitwardenFamilies": { + "message": "Free Bitwarden Families" + }, + "freeBitwardenFamiliesPageDesc": { + "message": "You are eligible for Free Bitwarden Families. Redeem this offer today in the web app." + }, "version": { "message": "Version" }, @@ -253,8 +295,8 @@ "passGenInfo": { "message": "Skapa starka och unika lösenord automatiskt för dina inloggningar." }, - "bitWebVault": { - "message": "Bitwardens webbvalv" + "bitWebVaultApp": { + "message": "Bitwarden web app" }, "importItems": { "message": "Importera objekt" @@ -779,11 +821,8 @@ "shared": { "message": "Delad" }, - "learnOrg": { - "message": "Läs mer om organisationer" - }, - "learnOrgConfirmation": { - "message": "Bitwarden gör det möjligt för dig att dela objekt i valvet med andra genom att använda en organisation. Vill du besöka bitwarden.com för att lära dig mer?" + "bitwardenForBusinessPageDesc": { + "message": "Bitwarden for Business allows you to share your vault items with others by using an organization. Learn more on the bitwarden.com website." }, "moveToOrganization": { "message": "Flytta till organisation" @@ -1714,6 +1753,12 @@ "biometricsNotSupportedDesc": { "message": "Biometri i webbläsaren stöds inte på den här enheten." }, + "biometricsNotUnlockedTitle": { + "message": "User locked or logged out" + }, + "biometricsNotUnlockedDesc": { + "message": "Please unlock this user in the desktop application and try again." + }, "biometricsFailedTitle": { "message": "Biometri misslyckades" }, @@ -2177,6 +2222,108 @@ "forwardedEmailDesc": { "message": "Skapa ett e-postalias med en extern vidarebefordranstjänst." }, + "forwarderError": { + "message": "$SERVICENAME$-fel: $ERRORMESSAGE$", + "description": "Reports an error returned by a forwarding service to the user.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + }, + "errormessage": { + "content": "$2", + "example": "Invalid characters in domain name." + } + } + }, + "forwarderGeneratedBy": { + "message": "Generated by Bitwarden.", + "description": "Displayed with the address on the forwarding service's configuration screen." + }, + "forwarderGeneratedByWithWebsite": { + "message": "Website: $WEBSITE$. Generated by Bitwarden.", + "description": "Displayed with the address on the forwarding service's configuration screen.", + "placeholders": { + "WEBSITE": { + "content": "$1", + "example": "www.example.com" + } + } + }, + "forwaderInvalidToken": { + "message": "Invalid $SERVICENAME$ API token", + "description": "Displayed when the user's API token is empty or rejected by the forwarding service.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwaderInvalidTokenWithMessage": { + "message": "Invalid $SERVICENAME$ API token: $ERRORMESSAGE$", + "description": "Displayed when the user's API token is rejected by the forwarding service with an error message.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + }, + "errormessage": { + "content": "$2", + "example": "Please verify your email address to continue." + } + } + }, + "forwarderNoAccountId": { + "message": "Unable to obtain $SERVICENAME$ masked email account ID.", + "description": "Displayed when the forwarding service fails to return an account ID.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderNoDomain": { + "message": "Ogiltig $SERVICENAME$-domän.", + "description": "Displayed when the domain is empty or domain authorization failed at the forwarding service.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderNoUrl": { + "message": "Ogiltig $SERVICENAME$-URL.", + "description": "Displayed when the url of the forwarding service wasn't supplied.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderUnknownError": { + "message": "Unknown $SERVICENAME$ error occurred.", + "description": "Displayed when the forwarding service failed due to an unknown error.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderUnknownForwarder": { + "message": "Unknown forwarder: '$SERVICENAME$'.", + "description": "Displayed when the forwarding service is not supported.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "JustTrust.us" + } + } + }, "hostname": { "message": "Värdnamn", "description": "Part of a URL." @@ -3029,6 +3176,41 @@ "message": "to make them visible.", "description": "This will be part of a larger sentence, which will read like so: Assign these items to a collection from the Admin Console to make them visible." }, + "autofillSuggestions": { + "message": "Auto-fill suggestions" + }, + "autofillSuggestionsTip": { + "message": "Save a login item for this site to auto-fill" + }, + "yourVaultIsEmpty": { + "message": "Your vault is empty" + }, + "noItemsMatchSearch": { + "message": "No items match your search" + }, + "clearFiltersOrTryAnother": { + "message": "Clear filters or try another search term" + }, + "copyInfo": { + "message": "Copy info, $ITEMNAME$", + "description": "Aria label for a button that opens a menu with options to copy information from an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "moreOptions": { + "message": "More options, $ITEMNAME$", + "description": "Aria label for a button that opens a menu with more options for an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, "adminConsole": { "message": "Admin Console" }, @@ -3046,5 +3228,38 @@ }, "errorAssigningTargetFolder": { "message": "Error assigning target folder." + }, + "viewItemsIn": { + "message": "View items in $NAME$", + "description": "Button to view the contents of a folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "backTo": { + "message": "Back to $NAME$", + "description": "Navigate back to a previous folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "new": { + "message": "New" + }, + "removeItem": { + "message": "Remove $NAME$", + "description": "Remove a selected option, such as a folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } } } diff --git a/apps/browser/src/_locales/te/messages.json b/apps/browser/src/_locales/te/messages.json index b45fdef39e8..e042785011c 100644 --- a/apps/browser/src/_locales/te/messages.json +++ b/apps/browser/src/_locales/te/messages.json @@ -166,15 +166,21 @@ "confirmIdentity": { "message": "Confirm your identity to continue." }, - "account": { - "message": "Account" - }, "changeMasterPassword": { "message": "Change master password" }, "continueToWebApp": { "message": "Continue to web app?" }, + "continueToWebAppDesc": { + "message": "Explore more features of your Bitwarden account on the web app." + }, + "continueToHelpCenter": { + "message": "Continue to Help Center?" + }, + "continueToHelpCenterDesc": { + "message": "Learn more about how to use Bitwarden on the Help Center." + }, "changeMasterPasswordOnWebConfirmation": { "message": "You can change your master password on the Bitwarden web app." }, @@ -192,9 +198,45 @@ "logOut": { "message": "Log out" }, + "aboutBitwarden": { + "message": "About Bitwarden" + }, "about": { "message": "About" }, + "moreFromBitwarden": { + "message": "More from Bitwarden" + }, + "continueToBitwardenDotCom": { + "message": "Continue to bitwarden.com?" + }, + "bitwardenForBusiness": { + "message": "Bitwarden for Business" + }, + "bitwardenAuthenticator": { + "message": "Bitwarden Authenticator" + }, + "continueToAuthenticatorPageDesc": { + "message": "Bitwarden Authenticator allows you to store authenticator keys and generate TOTP codes for 2-step verification flows. Learn more on the bitwarden.com website" + }, + "bitwardenSecretsManager": { + "message": "Bitwarden Secrets Manager" + }, + "continueToSecretsManagerPageDesc": { + "message": "Securely store, manage, and share developer secrets with Bitwarden Secrets Manager. Learn more on the bitwarden.com website." + }, + "passwordlessDotDev": { + "message": "Passwordless.dev" + }, + "continueToPasswordlessDotDevPageDesc": { + "message": "Create smooth and secure login experiences free from traditional passwords with Passwordless.dev. Learn more on the bitwarden.com website." + }, + "freeBitwardenFamilies": { + "message": "Free Bitwarden Families" + }, + "freeBitwardenFamiliesPageDesc": { + "message": "You are eligible for Free Bitwarden Families. Redeem this offer today in the web app." + }, "version": { "message": "Version" }, @@ -253,8 +295,8 @@ "passGenInfo": { "message": "Automatically generate strong, unique passwords for your logins." }, - "bitWebVault": { - "message": "Bitwarden web vault" + "bitWebVaultApp": { + "message": "Bitwarden web app" }, "importItems": { "message": "Import items" @@ -779,11 +821,8 @@ "shared": { "message": "Shared" }, - "learnOrg": { - "message": "Learn about organizations" - }, - "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?" + "bitwardenForBusinessPageDesc": { + "message": "Bitwarden for Business allows you to share your vault items with others by using an organization. Learn more on the bitwarden.com website." }, "moveToOrganization": { "message": "Move to organization" @@ -1714,6 +1753,12 @@ "biometricsNotSupportedDesc": { "message": "Browser biometrics is not supported on this device." }, + "biometricsNotUnlockedTitle": { + "message": "User locked or logged out" + }, + "biometricsNotUnlockedDesc": { + "message": "Please unlock this user in the desktop application and try again." + }, "biometricsFailedTitle": { "message": "Biometrics failed" }, @@ -2177,6 +2222,108 @@ "forwardedEmailDesc": { "message": "Generate an email alias with an external forwarding service." }, + "forwarderError": { + "message": "$SERVICENAME$ error: $ERRORMESSAGE$", + "description": "Reports an error returned by a forwarding service to the user.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + }, + "errormessage": { + "content": "$2", + "example": "Invalid characters in domain name." + } + } + }, + "forwarderGeneratedBy": { + "message": "Generated by Bitwarden.", + "description": "Displayed with the address on the forwarding service's configuration screen." + }, + "forwarderGeneratedByWithWebsite": { + "message": "Website: $WEBSITE$. Generated by Bitwarden.", + "description": "Displayed with the address on the forwarding service's configuration screen.", + "placeholders": { + "WEBSITE": { + "content": "$1", + "example": "www.example.com" + } + } + }, + "forwaderInvalidToken": { + "message": "Invalid $SERVICENAME$ API token", + "description": "Displayed when the user's API token is empty or rejected by the forwarding service.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwaderInvalidTokenWithMessage": { + "message": "Invalid $SERVICENAME$ API token: $ERRORMESSAGE$", + "description": "Displayed when the user's API token is rejected by the forwarding service with an error message.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + }, + "errormessage": { + "content": "$2", + "example": "Please verify your email address to continue." + } + } + }, + "forwarderNoAccountId": { + "message": "Unable to obtain $SERVICENAME$ masked email account ID.", + "description": "Displayed when the forwarding service fails to return an account ID.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderNoDomain": { + "message": "Invalid $SERVICENAME$ domain.", + "description": "Displayed when the domain is empty or domain authorization failed at the forwarding service.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderNoUrl": { + "message": "Invalid $SERVICENAME$ url.", + "description": "Displayed when the url of the forwarding service wasn't supplied.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderUnknownError": { + "message": "Unknown $SERVICENAME$ error occurred.", + "description": "Displayed when the forwarding service failed due to an unknown error.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderUnknownForwarder": { + "message": "Unknown forwarder: '$SERVICENAME$'.", + "description": "Displayed when the forwarding service is not supported.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "JustTrust.us" + } + } + }, "hostname": { "message": "Hostname", "description": "Part of a URL." @@ -3029,6 +3176,41 @@ "message": "to make them visible.", "description": "This will be part of a larger sentence, which will read like so: Assign these items to a collection from the Admin Console to make them visible." }, + "autofillSuggestions": { + "message": "Auto-fill suggestions" + }, + "autofillSuggestionsTip": { + "message": "Save a login item for this site to auto-fill" + }, + "yourVaultIsEmpty": { + "message": "Your vault is empty" + }, + "noItemsMatchSearch": { + "message": "No items match your search" + }, + "clearFiltersOrTryAnother": { + "message": "Clear filters or try another search term" + }, + "copyInfo": { + "message": "Copy info, $ITEMNAME$", + "description": "Aria label for a button that opens a menu with options to copy information from an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "moreOptions": { + "message": "More options, $ITEMNAME$", + "description": "Aria label for a button that opens a menu with more options for an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, "adminConsole": { "message": "Admin Console" }, @@ -3046,5 +3228,38 @@ }, "errorAssigningTargetFolder": { "message": "Error assigning target folder." + }, + "viewItemsIn": { + "message": "View items in $NAME$", + "description": "Button to view the contents of a folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "backTo": { + "message": "Back to $NAME$", + "description": "Navigate back to a previous folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "new": { + "message": "New" + }, + "removeItem": { + "message": "Remove $NAME$", + "description": "Remove a selected option, such as a folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } } } diff --git a/apps/browser/src/_locales/th/messages.json b/apps/browser/src/_locales/th/messages.json index 6318d27189e..03e2f1036bb 100644 --- a/apps/browser/src/_locales/th/messages.json +++ b/apps/browser/src/_locales/th/messages.json @@ -166,15 +166,21 @@ "confirmIdentity": { "message": "ยืนยันตัวตนของคุณเพื่อดำเนินการต่อ" }, - "account": { - "message": "บัญชี" - }, "changeMasterPassword": { "message": "Change Master Password" }, "continueToWebApp": { "message": "Continue to web app?" }, + "continueToWebAppDesc": { + "message": "Explore more features of your Bitwarden account on the web app." + }, + "continueToHelpCenter": { + "message": "Continue to Help Center?" + }, + "continueToHelpCenterDesc": { + "message": "Learn more about how to use Bitwarden on the Help Center." + }, "changeMasterPasswordOnWebConfirmation": { "message": "You can change your master password on the Bitwarden web app." }, @@ -192,9 +198,45 @@ "logOut": { "message": "ออกจากระบบ" }, + "aboutBitwarden": { + "message": "About Bitwarden" + }, "about": { "message": "เกี่ยวกับ" }, + "moreFromBitwarden": { + "message": "More from Bitwarden" + }, + "continueToBitwardenDotCom": { + "message": "Continue to bitwarden.com?" + }, + "bitwardenForBusiness": { + "message": "Bitwarden for Business" + }, + "bitwardenAuthenticator": { + "message": "Bitwarden Authenticator" + }, + "continueToAuthenticatorPageDesc": { + "message": "Bitwarden Authenticator allows you to store authenticator keys and generate TOTP codes for 2-step verification flows. Learn more on the bitwarden.com website" + }, + "bitwardenSecretsManager": { + "message": "Bitwarden Secrets Manager" + }, + "continueToSecretsManagerPageDesc": { + "message": "Securely store, manage, and share developer secrets with Bitwarden Secrets Manager. Learn more on the bitwarden.com website." + }, + "passwordlessDotDev": { + "message": "Passwordless.dev" + }, + "continueToPasswordlessDotDevPageDesc": { + "message": "Create smooth and secure login experiences free from traditional passwords with Passwordless.dev. Learn more on the bitwarden.com website." + }, + "freeBitwardenFamilies": { + "message": "Free Bitwarden Families" + }, + "freeBitwardenFamiliesPageDesc": { + "message": "You are eligible for Free Bitwarden Families. Redeem this offer today in the web app." + }, "version": { "message": "เวอร์ชัน" }, @@ -253,8 +295,8 @@ "passGenInfo": { "message": "สร้างรหัสผ่านที่รัดกุมและไม่ซ้ำใครโดยอัตโนมัติสำหรับการเข้าสู่ระบบของคุณ" }, - "bitWebVault": { - "message": "bitwarden Web Vault" + "bitWebVaultApp": { + "message": "Bitwarden web app" }, "importItems": { "message": "Import Items" @@ -779,11 +821,8 @@ "shared": { "message": "แชร์แล้ว" }, - "learnOrg": { - "message": "เรียนรู้เกี่ยวกับองค์กร" - }, - "learnOrgConfirmation": { - "message": "Bitwarden อนุญาตให้คุณแชร์รายการตู้นิรภัยของคุณกับผู้อื่นโดยใช้องค์กร คุณต้องการเยี่ยมชมเว็บไซต์ bitwarden.com เพื่อเรียนรู้เพิ่มเติมหรือไม่?" + "bitwardenForBusinessPageDesc": { + "message": "Bitwarden for Business allows you to share your vault items with others by using an organization. Learn more on the bitwarden.com website." }, "moveToOrganization": { "message": "ย้ายไปยังแบบองค์กร" @@ -1714,6 +1753,12 @@ "biometricsNotSupportedDesc": { "message": "Browser biometrics is not supported on this device." }, + "biometricsNotUnlockedTitle": { + "message": "User locked or logged out" + }, + "biometricsNotUnlockedDesc": { + "message": "Please unlock this user in the desktop application and try again." + }, "biometricsFailedTitle": { "message": "Biometrics failed" }, @@ -2177,6 +2222,108 @@ "forwardedEmailDesc": { "message": "Generate an email alias with an external forwarding service." }, + "forwarderError": { + "message": "$SERVICENAME$ error: $ERRORMESSAGE$", + "description": "Reports an error returned by a forwarding service to the user.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + }, + "errormessage": { + "content": "$2", + "example": "Invalid characters in domain name." + } + } + }, + "forwarderGeneratedBy": { + "message": "Generated by Bitwarden.", + "description": "Displayed with the address on the forwarding service's configuration screen." + }, + "forwarderGeneratedByWithWebsite": { + "message": "Website: $WEBSITE$. Generated by Bitwarden.", + "description": "Displayed with the address on the forwarding service's configuration screen.", + "placeholders": { + "WEBSITE": { + "content": "$1", + "example": "www.example.com" + } + } + }, + "forwaderInvalidToken": { + "message": "Invalid $SERVICENAME$ API token", + "description": "Displayed when the user's API token is empty or rejected by the forwarding service.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwaderInvalidTokenWithMessage": { + "message": "Invalid $SERVICENAME$ API token: $ERRORMESSAGE$", + "description": "Displayed when the user's API token is rejected by the forwarding service with an error message.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + }, + "errormessage": { + "content": "$2", + "example": "Please verify your email address to continue." + } + } + }, + "forwarderNoAccountId": { + "message": "Unable to obtain $SERVICENAME$ masked email account ID.", + "description": "Displayed when the forwarding service fails to return an account ID.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderNoDomain": { + "message": "Invalid $SERVICENAME$ domain.", + "description": "Displayed when the domain is empty or domain authorization failed at the forwarding service.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderNoUrl": { + "message": "Invalid $SERVICENAME$ url.", + "description": "Displayed when the url of the forwarding service wasn't supplied.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderUnknownError": { + "message": "Unknown $SERVICENAME$ error occurred.", + "description": "Displayed when the forwarding service failed due to an unknown error.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderUnknownForwarder": { + "message": "Unknown forwarder: '$SERVICENAME$'.", + "description": "Displayed when the forwarding service is not supported.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "JustTrust.us" + } + } + }, "hostname": { "message": "Hostname", "description": "Part of a URL." @@ -3029,6 +3176,41 @@ "message": "to make them visible.", "description": "This will be part of a larger sentence, which will read like so: Assign these items to a collection from the Admin Console to make them visible." }, + "autofillSuggestions": { + "message": "Auto-fill suggestions" + }, + "autofillSuggestionsTip": { + "message": "Save a login item for this site to auto-fill" + }, + "yourVaultIsEmpty": { + "message": "Your vault is empty" + }, + "noItemsMatchSearch": { + "message": "No items match your search" + }, + "clearFiltersOrTryAnother": { + "message": "Clear filters or try another search term" + }, + "copyInfo": { + "message": "Copy info, $ITEMNAME$", + "description": "Aria label for a button that opens a menu with options to copy information from an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "moreOptions": { + "message": "More options, $ITEMNAME$", + "description": "Aria label for a button that opens a menu with more options for an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, "adminConsole": { "message": "Admin Console" }, @@ -3046,5 +3228,38 @@ }, "errorAssigningTargetFolder": { "message": "Error assigning target folder." + }, + "viewItemsIn": { + "message": "View items in $NAME$", + "description": "Button to view the contents of a folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "backTo": { + "message": "Back to $NAME$", + "description": "Navigate back to a previous folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "new": { + "message": "New" + }, + "removeItem": { + "message": "Remove $NAME$", + "description": "Remove a selected option, such as a folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } } } diff --git a/apps/browser/src/_locales/tr/messages.json b/apps/browser/src/_locales/tr/messages.json index e91397a6e21..f62f2759485 100644 --- a/apps/browser/src/_locales/tr/messages.json +++ b/apps/browser/src/_locales/tr/messages.json @@ -166,15 +166,21 @@ "confirmIdentity": { "message": "Devam etmek için kimliğinizi doğrulayın." }, - "account": { - "message": "Hesap" - }, "changeMasterPassword": { "message": "Ana parolayı değiştir" }, "continueToWebApp": { "message": "Web uygulamasına devam edilsin mi?" }, + "continueToWebAppDesc": { + "message": "Explore more features of your Bitwarden account on the web app." + }, + "continueToHelpCenter": { + "message": "Continue to Help Center?" + }, + "continueToHelpCenterDesc": { + "message": "Learn more about how to use Bitwarden on the Help Center." + }, "changeMasterPasswordOnWebConfirmation": { "message": "Ana parolanızı Bitwarden web uygulamasında değiştirebilirsiniz." }, @@ -192,9 +198,45 @@ "logOut": { "message": "Çıkış yap" }, + "aboutBitwarden": { + "message": "About Bitwarden" + }, "about": { "message": "Hakkında" }, + "moreFromBitwarden": { + "message": "More from Bitwarden" + }, + "continueToBitwardenDotCom": { + "message": "Continue to bitwarden.com?" + }, + "bitwardenForBusiness": { + "message": "Bitwarden for Business" + }, + "bitwardenAuthenticator": { + "message": "Bitwarden Authenticator" + }, + "continueToAuthenticatorPageDesc": { + "message": "Bitwarden Authenticator allows you to store authenticator keys and generate TOTP codes for 2-step verification flows. Learn more on the bitwarden.com website" + }, + "bitwardenSecretsManager": { + "message": "Bitwarden Secrets Manager" + }, + "continueToSecretsManagerPageDesc": { + "message": "Securely store, manage, and share developer secrets with Bitwarden Secrets Manager. Learn more on the bitwarden.com website." + }, + "passwordlessDotDev": { + "message": "Passwordless.dev" + }, + "continueToPasswordlessDotDevPageDesc": { + "message": "Create smooth and secure login experiences free from traditional passwords with Passwordless.dev. Learn more on the bitwarden.com website." + }, + "freeBitwardenFamilies": { + "message": "Free Bitwarden Families" + }, + "freeBitwardenFamiliesPageDesc": { + "message": "You are eligible for Free Bitwarden Families. Redeem this offer today in the web app." + }, "version": { "message": "Sürüm" }, @@ -253,8 +295,8 @@ "passGenInfo": { "message": "Hesaplarınız için otomatik olarak güçlü, özgün parolalar oluşturun." }, - "bitWebVault": { - "message": "Bitwarden web kasası" + "bitWebVaultApp": { + "message": "Bitwarden web app" }, "importItems": { "message": "Hesapları içe aktar" @@ -779,11 +821,8 @@ "shared": { "message": "Paylaşılan" }, - "learnOrg": { - "message": "Kuruluşlar hakkında bilgi al" - }, - "learnOrgConfirmation": { - "message": "Bitwarden'ın kuruluş özelliğini kullanarak kasanızdaki kayıtları başkalarıyla paylaşabilirsiniz. Daha fazla bilgi için bitwarden.com sitesini ziyaret etmek ister misiniz?" + "bitwardenForBusinessPageDesc": { + "message": "Bitwarden for Business allows you to share your vault items with others by using an organization. Learn more on the bitwarden.com website." }, "moveToOrganization": { "message": "Kuruluşa taşı" @@ -1714,6 +1753,12 @@ "biometricsNotSupportedDesc": { "message": "Tarayıcı biyometrisi bu cihazda desteklenmiyor." }, + "biometricsNotUnlockedTitle": { + "message": "Kullanıcı kilitlendi ve oturumu kapatıldı" + }, + "biometricsNotUnlockedDesc": { + "message": "Lütfen masaüstü uygulamasından bu kullanıcının kilidini açıp yeniden deneyin." + }, "biometricsFailedTitle": { "message": "Biyometri doğrulanamadı" }, @@ -2177,6 +2222,108 @@ "forwardedEmailDesc": { "message": "Harici bir yönlendirme servisiyle e-posta maskesi oluştur." }, + "forwarderError": { + "message": "$SERVICENAME$ hatası: $ERRORMESSAGE$", + "description": "Reports an error returned by a forwarding service to the user.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + }, + "errormessage": { + "content": "$2", + "example": "Invalid characters in domain name." + } + } + }, + "forwarderGeneratedBy": { + "message": "Bitwarden tarafından üretildi.", + "description": "Displayed with the address on the forwarding service's configuration screen." + }, + "forwarderGeneratedByWithWebsite": { + "message": "Web sitesi: $WEBSITE$. Bitwarden tarafından üretildi.", + "description": "Displayed with the address on the forwarding service's configuration screen.", + "placeholders": { + "WEBSITE": { + "content": "$1", + "example": "www.example.com" + } + } + }, + "forwaderInvalidToken": { + "message": "Invalid $SERVICENAME$ API token", + "description": "Displayed when the user's API token is empty or rejected by the forwarding service.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwaderInvalidTokenWithMessage": { + "message": "Invalid $SERVICENAME$ API token: $ERRORMESSAGE$", + "description": "Displayed when the user's API token is rejected by the forwarding service with an error message.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + }, + "errormessage": { + "content": "$2", + "example": "Please verify your email address to continue." + } + } + }, + "forwarderNoAccountId": { + "message": "Unable to obtain $SERVICENAME$ masked email account ID.", + "description": "Displayed when the forwarding service fails to return an account ID.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderNoDomain": { + "message": "Invalid $SERVICENAME$ domain.", + "description": "Displayed when the domain is empty or domain authorization failed at the forwarding service.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderNoUrl": { + "message": "Invalid $SERVICENAME$ url.", + "description": "Displayed when the url of the forwarding service wasn't supplied.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderUnknownError": { + "message": "Unknown $SERVICENAME$ error occurred.", + "description": "Displayed when the forwarding service failed due to an unknown error.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderUnknownForwarder": { + "message": "Unknown forwarder: '$SERVICENAME$'.", + "description": "Displayed when the forwarding service is not supported.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "JustTrust.us" + } + } + }, "hostname": { "message": "Sunucu", "description": "Part of a URL." @@ -3029,6 +3176,41 @@ "message": "to make them visible.", "description": "This will be part of a larger sentence, which will read like so: Assign these items to a collection from the Admin Console to make them visible." }, + "autofillSuggestions": { + "message": "Auto-fill suggestions" + }, + "autofillSuggestionsTip": { + "message": "Save a login item for this site to auto-fill" + }, + "yourVaultIsEmpty": { + "message": "Your vault is empty" + }, + "noItemsMatchSearch": { + "message": "No items match your search" + }, + "clearFiltersOrTryAnother": { + "message": "Clear filters or try another search term" + }, + "copyInfo": { + "message": "Copy info, $ITEMNAME$", + "description": "Aria label for a button that opens a menu with options to copy information from an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "moreOptions": { + "message": "More options, $ITEMNAME$", + "description": "Aria label for a button that opens a menu with more options for an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, "adminConsole": { "message": "Yönetici Konsolu" }, @@ -3036,15 +3218,48 @@ "message": "Hesap güvenliği" }, "notifications": { - "message": "Notifications" + "message": "Bildirimler" }, "appearance": { - "message": "Appearance" + "message": "Görünüm" }, "errorAssigningTargetCollection": { - "message": "Hedef koleksiyonu atama hatası." + "message": "Hedef koleksiyon atama hatası." }, "errorAssigningTargetFolder": { - "message": "Hedef klasörü atama hatası." + "message": "Hedef klasör atama hatası." + }, + "viewItemsIn": { + "message": "View items in $NAME$", + "description": "Button to view the contents of a folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "backTo": { + "message": "Back to $NAME$", + "description": "Navigate back to a previous folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "new": { + "message": "Yeni" + }, + "removeItem": { + "message": "Remove $NAME$", + "description": "Remove a selected option, such as a folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } } } diff --git a/apps/browser/src/_locales/uk/messages.json b/apps/browser/src/_locales/uk/messages.json index a92a68571e7..687d11df722 100644 --- a/apps/browser/src/_locales/uk/messages.json +++ b/apps/browser/src/_locales/uk/messages.json @@ -166,15 +166,21 @@ "confirmIdentity": { "message": "Підтвердьте свої облікові дані для продовження." }, - "account": { - "message": "Обліковий запис" - }, "changeMasterPassword": { "message": "Змінити головний пароль" }, "continueToWebApp": { "message": "Продовжити у вебпрограмі?" }, + "continueToWebAppDesc": { + "message": "Ознайомтеся з іншими функціями вашого облікового запису Bitwarden у вебпрограмі." + }, + "continueToHelpCenter": { + "message": "Перейти до довідкового центру?" + }, + "continueToHelpCenterDesc": { + "message": "Дізнайтеся більше про те, як використовувати Bitwarden в довідковому центрі." + }, "changeMasterPasswordOnWebConfirmation": { "message": "Ви можете змінити головний пароль у вебпрограмі Bitwarden." }, @@ -192,9 +198,45 @@ "logOut": { "message": "Вийти" }, + "aboutBitwarden": { + "message": "Про Bitwarden" + }, "about": { "message": "Про розширення" }, + "moreFromBitwarden": { + "message": "Більше від Bitwarden" + }, + "continueToBitwardenDotCom": { + "message": "Продовжити на bitwarden.com?" + }, + "bitwardenForBusiness": { + "message": "Bitwarden для бізнесу" + }, + "bitwardenAuthenticator": { + "message": "Bitwarden Authenticator" + }, + "continueToAuthenticatorPageDesc": { + "message": "Bitwarden Authenticator дозволяє зберігати ключі авторизації та генерувати одноразові коди TOTP для двоетапної перевірки. Дізнайтеся більше про це на вебсайті bitwarden.com" + }, + "bitwardenSecretsManager": { + "message": "Менеджер секретів Bitwarden" + }, + "continueToSecretsManagerPageDesc": { + "message": "Надійно зберігайте секретні ключі розробників та діліться ними за допомогою менеджера секретів Bitwarden. Докладніше на вебсайті bitwarden.com." + }, + "passwordlessDotDev": { + "message": "Passwordless.dev" + }, + "continueToPasswordlessDotDevPageDesc": { + "message": "Організуйте функціональну та безпечну роботу без використання традиційного методу входу з паролями за допомогою Passwordless.dev. Дізнайтеся більше на вебсайті bitwarden.com." + }, + "freeBitwardenFamilies": { + "message": "Bitwarden Families безплатно" + }, + "freeBitwardenFamiliesPageDesc": { + "message": "Для вас доступна безплатна можливість Bitwarden Families. Отримайте цю пропозицію у вебпрограмі." + }, "version": { "message": "Версія" }, @@ -253,8 +295,8 @@ "passGenInfo": { "message": "Автоматичне генерування стійких, унікальних паролів." }, - "bitWebVault": { - "message": "Веб сховище Bitwarden" + "bitWebVaultApp": { + "message": "Вебпрограма Bitwarden" }, "importItems": { "message": "Імпортувати записи" @@ -779,11 +821,8 @@ "shared": { "message": "Спільні" }, - "learnOrg": { - "message": "Докладніше про організації" - }, - "learnOrgConfirmation": { - "message": "Bitwarden дозволяє вам надавати доступ до записів свого сховища іншим за допомогою облікового запису організації. Бажаєте перейти на веб-сайт bitwarden.com, щоб дізнатися більше?" + "bitwardenForBusinessPageDesc": { + "message": "Bitwarden для бізнесу дозволяє доступ до записів сховища спільно з іншими користувачами за допомогою організації. Дізнайтеся більше про це на вебсайті bitwarden.com." }, "moveToOrganization": { "message": "Перемістити до організації" @@ -1714,6 +1753,12 @@ "biometricsNotSupportedDesc": { "message": "Біометрія в браузері не підтримується на цьому пристрої." }, + "biometricsNotUnlockedTitle": { + "message": "Користувач заблокований або вийшов із системи" + }, + "biometricsNotUnlockedDesc": { + "message": "Розблокуйте цього користувача в програмі для комп'ютера і повторіть спробу." + }, "biometricsFailedTitle": { "message": "Збій біометрії" }, @@ -2177,6 +2222,108 @@ "forwardedEmailDesc": { "message": "Згенеруйте псевдонім е-пошти зі стороннім сервісом пересилання." }, + "forwarderError": { + "message": "Помилка $SERVICENAME$: $ERRORMESSAGE$", + "description": "Reports an error returned by a forwarding service to the user.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + }, + "errormessage": { + "content": "$2", + "example": "Invalid characters in domain name." + } + } + }, + "forwarderGeneratedBy": { + "message": "Згенеровано Bitwarden.", + "description": "Displayed with the address on the forwarding service's configuration screen." + }, + "forwarderGeneratedByWithWebsite": { + "message": "Вебсайт: $WEBSITE$. Згенеровано Bitwarden.", + "description": "Displayed with the address on the forwarding service's configuration screen.", + "placeholders": { + "WEBSITE": { + "content": "$1", + "example": "www.example.com" + } + } + }, + "forwaderInvalidToken": { + "message": "Недійсний токен API для $SERVICENAME$", + "description": "Displayed when the user's API token is empty or rejected by the forwarding service.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwaderInvalidTokenWithMessage": { + "message": "Недійсний токен API для $SERVICENAME$: $ERRORMESSAGE$", + "description": "Displayed when the user's API token is rejected by the forwarding service with an error message.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + }, + "errormessage": { + "content": "$2", + "example": "Please verify your email address to continue." + } + } + }, + "forwarderNoAccountId": { + "message": "Не вдалося отримати ідентифікатор замаскованої е-пошти облікового запису для $SERVICENAME$.", + "description": "Displayed when the forwarding service fails to return an account ID.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderNoDomain": { + "message": "Недійсний домен для $SERVICENAME$.", + "description": "Displayed when the domain is empty or domain authorization failed at the forwarding service.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderNoUrl": { + "message": "Недійсна URL-адреса для $SERVICENAME$.", + "description": "Displayed when the url of the forwarding service wasn't supplied.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderUnknownError": { + "message": "Сталася невідома помилка $SERVICENAME$.", + "description": "Displayed when the forwarding service failed due to an unknown error.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderUnknownForwarder": { + "message": "Невідомий засіб переспрямування: '$SERVICENAME$'.", + "description": "Displayed when the forwarding service is not supported.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "JustTrust.us" + } + } + }, "hostname": { "message": "Ім'я вузла", "description": "Part of a URL." @@ -3029,6 +3176,41 @@ "message": "щоб зробити їх видимими.", "description": "This will be part of a larger sentence, which will read like so: Assign these items to a collection from the Admin Console to make them visible." }, + "autofillSuggestions": { + "message": "Пропозиції автозаповнення" + }, + "autofillSuggestionsTip": { + "message": "Зберегти дані входу цього сайту для автозаповнення" + }, + "yourVaultIsEmpty": { + "message": "Ваше сховище порожнє" + }, + "noItemsMatchSearch": { + "message": "За цим запитом нічого не знайдено" + }, + "clearFiltersOrTryAnother": { + "message": "Скиньте фільтри або спробуйте іншу умову пошуку" + }, + "copyInfo": { + "message": "Копіювати інформацію, $ITEMNAME$", + "description": "Aria label for a button that opens a menu with options to copy information from an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "moreOptions": { + "message": "Інші можливості, $ITEMNAME$", + "description": "Aria label for a button that opens a menu with more options for an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, "adminConsole": { "message": "консолі адміністратора," }, @@ -3046,5 +3228,38 @@ }, "errorAssigningTargetFolder": { "message": "Помилка призначення цільової теки." + }, + "viewItemsIn": { + "message": "View items in $NAME$", + "description": "Button to view the contents of a folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "backTo": { + "message": "Back to $NAME$", + "description": "Navigate back to a previous folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "new": { + "message": "Новий" + }, + "removeItem": { + "message": "Remove $NAME$", + "description": "Remove a selected option, such as a folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } } } diff --git a/apps/browser/src/_locales/vi/messages.json b/apps/browser/src/_locales/vi/messages.json index 77ce3ea507a..54913730736 100644 --- a/apps/browser/src/_locales/vi/messages.json +++ b/apps/browser/src/_locales/vi/messages.json @@ -166,15 +166,21 @@ "confirmIdentity": { "message": "Xác nhận danh tính của bạn để tiếp tục." }, - "account": { - "message": "Tài khoản" - }, "changeMasterPassword": { "message": "Thay đổi mật khẩu chính" }, "continueToWebApp": { "message": "Tiếp tục tới ứng dụng web?" }, + "continueToWebAppDesc": { + "message": "Explore more features of your Bitwarden account on the web app." + }, + "continueToHelpCenter": { + "message": "Continue to Help Center?" + }, + "continueToHelpCenterDesc": { + "message": "Learn more about how to use Bitwarden on the Help Center." + }, "changeMasterPasswordOnWebConfirmation": { "message": "Bạn có thể thay đổi mật khẩu chính của mình trên Bitwarden bản web." }, @@ -192,9 +198,45 @@ "logOut": { "message": "Đăng xuất" }, + "aboutBitwarden": { + "message": "About Bitwarden" + }, "about": { "message": "Thông tin" }, + "moreFromBitwarden": { + "message": "More from Bitwarden" + }, + "continueToBitwardenDotCom": { + "message": "Continue to bitwarden.com?" + }, + "bitwardenForBusiness": { + "message": "Bitwarden for Business" + }, + "bitwardenAuthenticator": { + "message": "Bitwarden Authenticator" + }, + "continueToAuthenticatorPageDesc": { + "message": "Bitwarden Authenticator allows you to store authenticator keys and generate TOTP codes for 2-step verification flows. Learn more on the bitwarden.com website" + }, + "bitwardenSecretsManager": { + "message": "Bitwarden Secrets Manager" + }, + "continueToSecretsManagerPageDesc": { + "message": "Securely store, manage, and share developer secrets with Bitwarden Secrets Manager. Learn more on the bitwarden.com website." + }, + "passwordlessDotDev": { + "message": "Passwordless.dev" + }, + "continueToPasswordlessDotDevPageDesc": { + "message": "Create smooth and secure login experiences free from traditional passwords with Passwordless.dev. Learn more on the bitwarden.com website." + }, + "freeBitwardenFamilies": { + "message": "Free Bitwarden Families" + }, + "freeBitwardenFamiliesPageDesc": { + "message": "You are eligible for Free Bitwarden Families. Redeem this offer today in the web app." + }, "version": { "message": "Phiên bản" }, @@ -253,8 +295,8 @@ "passGenInfo": { "message": "Tự động tạo mật khẩu mạnh mẽ, độc nhất cho đăng nhập của bạn." }, - "bitWebVault": { - "message": "Trang web kho lưu trữ Bitwarden" + "bitWebVaultApp": { + "message": "Bitwarden web app" }, "importItems": { "message": "Nhập mục" @@ -779,11 +821,8 @@ "shared": { "message": "Đã chia sẻ" }, - "learnOrg": { - "message": "Xem tổ chức của bạn" - }, - "learnOrgConfirmation": { - "message": "Bitwarden cho phép bạn chia sẻ các mục trong kho của mình với những người khác bằng cách sử dụng tài khoản tổ chức. Bạn có muốn truy cập trang web bitwarden.com để tìm hiểu thêm không?" + "bitwardenForBusinessPageDesc": { + "message": "Bitwarden for Business allows you to share your vault items with others by using an organization. Learn more on the bitwarden.com website." }, "moveToOrganization": { "message": "Di chuyển đến tổ chức" @@ -1714,6 +1753,12 @@ "biometricsNotSupportedDesc": { "message": "Nhận dạng sinh trắc học trên trình duyệt không được hỗ trợ trên thiết bị này" }, + "biometricsNotUnlockedTitle": { + "message": "User locked or logged out" + }, + "biometricsNotUnlockedDesc": { + "message": "Please unlock this user in the desktop application and try again." + }, "biometricsFailedTitle": { "message": "Biometrics failed" }, @@ -2177,6 +2222,108 @@ "forwardedEmailDesc": { "message": "Generate an email alias with an external forwarding service." }, + "forwarderError": { + "message": "$SERVICENAME$ error: $ERRORMESSAGE$", + "description": "Reports an error returned by a forwarding service to the user.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + }, + "errormessage": { + "content": "$2", + "example": "Invalid characters in domain name." + } + } + }, + "forwarderGeneratedBy": { + "message": "Generated by Bitwarden.", + "description": "Displayed with the address on the forwarding service's configuration screen." + }, + "forwarderGeneratedByWithWebsite": { + "message": "Website: $WEBSITE$. Generated by Bitwarden.", + "description": "Displayed with the address on the forwarding service's configuration screen.", + "placeholders": { + "WEBSITE": { + "content": "$1", + "example": "www.example.com" + } + } + }, + "forwaderInvalidToken": { + "message": "Invalid $SERVICENAME$ API token", + "description": "Displayed when the user's API token is empty or rejected by the forwarding service.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwaderInvalidTokenWithMessage": { + "message": "Invalid $SERVICENAME$ API token: $ERRORMESSAGE$", + "description": "Displayed when the user's API token is rejected by the forwarding service with an error message.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + }, + "errormessage": { + "content": "$2", + "example": "Please verify your email address to continue." + } + } + }, + "forwarderNoAccountId": { + "message": "Unable to obtain $SERVICENAME$ masked email account ID.", + "description": "Displayed when the forwarding service fails to return an account ID.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderNoDomain": { + "message": "Invalid $SERVICENAME$ domain.", + "description": "Displayed when the domain is empty or domain authorization failed at the forwarding service.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderNoUrl": { + "message": "Invalid $SERVICENAME$ url.", + "description": "Displayed when the url of the forwarding service wasn't supplied.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderUnknownError": { + "message": "Unknown $SERVICENAME$ error occurred.", + "description": "Displayed when the forwarding service failed due to an unknown error.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderUnknownForwarder": { + "message": "Unknown forwarder: '$SERVICENAME$'.", + "description": "Displayed when the forwarding service is not supported.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "JustTrust.us" + } + } + }, "hostname": { "message": "Tên máy chủ", "description": "Part of a URL." @@ -3029,6 +3176,41 @@ "message": "để làm cho chúng hiển thị.", "description": "This will be part of a larger sentence, which will read like so: Assign these items to a collection from the Admin Console to make them visible." }, + "autofillSuggestions": { + "message": "Auto-fill suggestions" + }, + "autofillSuggestionsTip": { + "message": "Save a login item for this site to auto-fill" + }, + "yourVaultIsEmpty": { + "message": "Your vault is empty" + }, + "noItemsMatchSearch": { + "message": "No items match your search" + }, + "clearFiltersOrTryAnother": { + "message": "Clear filters or try another search term" + }, + "copyInfo": { + "message": "Copy info, $ITEMNAME$", + "description": "Aria label for a button that opens a menu with options to copy information from an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "moreOptions": { + "message": "More options, $ITEMNAME$", + "description": "Aria label for a button that opens a menu with more options for an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, "adminConsole": { "message": "Bảng điều khiển dành cho quản trị viên" }, @@ -3046,5 +3228,38 @@ }, "errorAssigningTargetFolder": { "message": "Error assigning target folder." + }, + "viewItemsIn": { + "message": "View items in $NAME$", + "description": "Button to view the contents of a folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "backTo": { + "message": "Back to $NAME$", + "description": "Navigate back to a previous folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "new": { + "message": "New" + }, + "removeItem": { + "message": "Remove $NAME$", + "description": "Remove a selected option, such as a folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } } } diff --git a/apps/browser/src/_locales/zh_CN/messages.json b/apps/browser/src/_locales/zh_CN/messages.json index bedd9933838..7d5ef53fdd0 100644 --- a/apps/browser/src/_locales/zh_CN/messages.json +++ b/apps/browser/src/_locales/zh_CN/messages.json @@ -166,15 +166,21 @@ "confirmIdentity": { "message": "确认您的身份以继续。" }, - "account": { - "message": "账户" - }, "changeMasterPassword": { "message": "更改主密码" }, "continueToWebApp": { "message": "前往网页 App 吗?" }, + "continueToWebAppDesc": { + "message": "在网页应用上探索 Bitwarden 账户的更多功能。" + }, + "continueToHelpCenter": { + "message": "前往帮助中心吗?" + }, + "continueToHelpCenterDesc": { + "message": "访问帮助中心了解更多如何使用 Bitwarden 的信息。" + }, "changeMasterPasswordOnWebConfirmation": { "message": "您可以在 Bitwarden 网页应用上更改您的主密码。" }, @@ -192,9 +198,45 @@ "logOut": { "message": "注销" }, + "aboutBitwarden": { + "message": "关于 Bitwarden" + }, "about": { "message": "关于" }, + "moreFromBitwarden": { + "message": "更多来自 Bitwarden 的产品" + }, + "continueToBitwardenDotCom": { + "message": "前往 bitwarden.com 吗?" + }, + "bitwardenForBusiness": { + "message": "Bitwarden 商业版" + }, + "bitwardenAuthenticator": { + "message": "Bitwarden 验证器" + }, + "continueToAuthenticatorPageDesc": { + "message": "您可以使用 Bitwarden 验证器存储验证器密钥,并为两步验证流程生成 TOTP 代码。访问 bitwarden.com 网站了解更多信息。" + }, + "bitwardenSecretsManager": { + "message": "Bitwarden 机密管理器" + }, + "continueToSecretsManagerPageDesc": { + "message": "使用 Bitwarden 机密管理器安全地存储、管理以及共享开发人员的机密。访问 bitwarden.com 网站了解更多信息。" + }, + "passwordlessDotDev": { + "message": "Passwordless.dev" + }, + "continueToPasswordlessDotDevPageDesc": { + "message": "使用 Passwordless.dev 摆脱传统密码,创建流畅且安全的登录体验。访问 bitwarden.com 网站了解更多信息。" + }, + "freeBitwardenFamilies": { + "message": "免费 Bitwarden 家庭" + }, + "freeBitwardenFamiliesPageDesc": { + "message": "您有资格获得免费的 Bitwarden 家庭。立即在网页应用中兑换此优惠。" + }, "version": { "message": "版本" }, @@ -253,8 +295,8 @@ "passGenInfo": { "message": "自动生成安全可靠唯一的登录密码。" }, - "bitWebVault": { - "message": "Bitwarden 网页版密码库" + "bitWebVaultApp": { + "message": "Bitwarden 网页版应用" }, "importItems": { "message": "导入项目" @@ -779,11 +821,8 @@ "shared": { "message": "已共享" }, - "learnOrg": { - "message": "了解组织" - }, - "learnOrgConfirmation": { - "message": "Bitwarden 允许您使用组织与他人共享您的密码库项目。要访问 bitwarden.com 网站以了解更多内容吗?" + "bitwardenForBusinessPageDesc": { + "message": "Bitwarden 商业版允许您使用组织与他人共享您的密码库项目。访问 bitwarden.com 网站了解更多信息。" }, "moveToOrganization": { "message": "移动到组织" @@ -1714,6 +1753,12 @@ "biometricsNotSupportedDesc": { "message": "此设备不支持浏览器生物识别。" }, + "biometricsNotUnlockedTitle": { + "message": "用户已锁定或已注销" + }, + "biometricsNotUnlockedDesc": { + "message": "请在桌面应用程序中解锁此用户,然后重试。" + }, "biometricsFailedTitle": { "message": "生物识别失败" }, @@ -2177,6 +2222,108 @@ "forwardedEmailDesc": { "message": "使用外部转发服务生成一个电子邮件别名。" }, + "forwarderError": { + "message": "$SERVICENAME$ 错误:$ERRORMESSAGE$", + "description": "Reports an error returned by a forwarding service to the user.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + }, + "errormessage": { + "content": "$2", + "example": "Invalid characters in domain name." + } + } + }, + "forwarderGeneratedBy": { + "message": "由 Bitwarden 生成。", + "description": "Displayed with the address on the forwarding service's configuration screen." + }, + "forwarderGeneratedByWithWebsite": { + "message": "网站:$WEBSITE$。由 Bitwarden 生成。", + "description": "Displayed with the address on the forwarding service's configuration screen.", + "placeholders": { + "WEBSITE": { + "content": "$1", + "example": "www.example.com" + } + } + }, + "forwaderInvalidToken": { + "message": "无效的 $SERVICENAME$ API 令牌", + "description": "Displayed when the user's API token is empty or rejected by the forwarding service.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwaderInvalidTokenWithMessage": { + "message": "无效的 $SERVICENAME$ API 令牌:$ERRORMESSAGE$", + "description": "Displayed when the user's API token is rejected by the forwarding service with an error message.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + }, + "errormessage": { + "content": "$2", + "example": "Please verify your email address to continue." + } + } + }, + "forwarderNoAccountId": { + "message": "无法获取 $SERVICENAME$ 电子邮件账户 ID。", + "description": "Displayed when the forwarding service fails to return an account ID.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderNoDomain": { + "message": "无效的 $SERVICENAME$ 域名。", + "description": "Displayed when the domain is empty or domain authorization failed at the forwarding service.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderNoUrl": { + "message": "无效的 $SERVICENAME$ URL。", + "description": "Displayed when the url of the forwarding service wasn't supplied.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderUnknownError": { + "message": "发生未知的 $SERVICENAME$ 错误。", + "description": "Displayed when the forwarding service failed due to an unknown error.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderUnknownForwarder": { + "message": "未知的转发服务:$SERVICENAME$。", + "description": "Displayed when the forwarding service is not supported.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "JustTrust.us" + } + } + }, "hostname": { "message": "主机名", "description": "Part of a URL." @@ -3029,6 +3176,41 @@ "message": ",以使其可见。", "description": "This will be part of a larger sentence, which will read like so: Assign these items to a collection from the Admin Console to make them visible." }, + "autofillSuggestions": { + "message": "自动填充建议" + }, + "autofillSuggestionsTip": { + "message": "保存此站点的登录项目用来自动填充" + }, + "yourVaultIsEmpty": { + "message": "您的密码库是空的" + }, + "noItemsMatchSearch": { + "message": "没有搜索到匹配的项目" + }, + "clearFiltersOrTryAnother": { + "message": "清除筛选器或尝试另一个搜索词" + }, + "copyInfo": { + "message": "复制信息,$ITEMNAME$", + "description": "Aria label for a button that opens a menu with options to copy information from an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "moreOptions": { + "message": "更多选项,$ITEMNAME$", + "description": "Aria label for a button that opens a menu with more options for an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, "adminConsole": { "message": "管理控制台" }, @@ -3046,5 +3228,38 @@ }, "errorAssigningTargetFolder": { "message": "分配目标文件夹时出错。" + }, + "viewItemsIn": { + "message": "View items in $NAME$", + "description": "Button to view the contents of a folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "backTo": { + "message": "Back to $NAME$", + "description": "Navigate back to a previous folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "new": { + "message": "新建" + }, + "removeItem": { + "message": "Remove $NAME$", + "description": "Remove a selected option, such as a folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } } } diff --git a/apps/browser/src/_locales/zh_TW/messages.json b/apps/browser/src/_locales/zh_TW/messages.json index 4519e879818..bbb5352ad13 100644 --- a/apps/browser/src/_locales/zh_TW/messages.json +++ b/apps/browser/src/_locales/zh_TW/messages.json @@ -166,15 +166,21 @@ "confirmIdentity": { "message": "請先確認身分後再繼續。" }, - "account": { - "message": "帳戶" - }, "changeMasterPassword": { "message": "變更主密碼" }, "continueToWebApp": { "message": "Continue to web app?" }, + "continueToWebAppDesc": { + "message": "Explore more features of your Bitwarden account on the web app." + }, + "continueToHelpCenter": { + "message": "Continue to Help Center?" + }, + "continueToHelpCenterDesc": { + "message": "Learn more about how to use Bitwarden on the Help Center." + }, "changeMasterPasswordOnWebConfirmation": { "message": "You can change your master password on the Bitwarden web app." }, @@ -192,9 +198,45 @@ "logOut": { "message": "登出" }, + "aboutBitwarden": { + "message": "About Bitwarden" + }, "about": { "message": "關於" }, + "moreFromBitwarden": { + "message": "More from Bitwarden" + }, + "continueToBitwardenDotCom": { + "message": "Continue to bitwarden.com?" + }, + "bitwardenForBusiness": { + "message": "Bitwarden for Business" + }, + "bitwardenAuthenticator": { + "message": "Bitwarden Authenticator" + }, + "continueToAuthenticatorPageDesc": { + "message": "Bitwarden Authenticator allows you to store authenticator keys and generate TOTP codes for 2-step verification flows. Learn more on the bitwarden.com website" + }, + "bitwardenSecretsManager": { + "message": "Bitwarden Secrets Manager" + }, + "continueToSecretsManagerPageDesc": { + "message": "Securely store, manage, and share developer secrets with Bitwarden Secrets Manager. Learn more on the bitwarden.com website." + }, + "passwordlessDotDev": { + "message": "Passwordless.dev" + }, + "continueToPasswordlessDotDevPageDesc": { + "message": "Create smooth and secure login experiences free from traditional passwords with Passwordless.dev. Learn more on the bitwarden.com website." + }, + "freeBitwardenFamilies": { + "message": "Free Bitwarden Families" + }, + "freeBitwardenFamiliesPageDesc": { + "message": "You are eligible for Free Bitwarden Families. Redeem this offer today in the web app." + }, "version": { "message": "版本" }, @@ -253,8 +295,8 @@ "passGenInfo": { "message": "自動產生安全、唯一的登入密碼。" }, - "bitWebVault": { - "message": "Bitwarden 網頁版密碼庫" + "bitWebVaultApp": { + "message": "Bitwarden web app" }, "importItems": { "message": "匯入項目" @@ -779,11 +821,8 @@ "shared": { "message": "已共用" }, - "learnOrg": { - "message": "瞭解組織" - }, - "learnOrgConfirmation": { - "message": "Bitwarden 允許您使用組織與他人分享您的密碼庫項目。您想造訪 bitwarden.com 網站以深入了解內容嗎?" + "bitwardenForBusinessPageDesc": { + "message": "Bitwarden for Business allows you to share your vault items with others by using an organization. Learn more on the bitwarden.com website." }, "moveToOrganization": { "message": "移動至組織 " @@ -1714,6 +1753,12 @@ "biometricsNotSupportedDesc": { "message": "此裝置不支援瀏覽器生物特徵辨識。" }, + "biometricsNotUnlockedTitle": { + "message": "User locked or logged out" + }, + "biometricsNotUnlockedDesc": { + "message": "Please unlock this user in the desktop application and try again." + }, "biometricsFailedTitle": { "message": "生物特徵辨識失敗" }, @@ -2177,6 +2222,108 @@ "forwardedEmailDesc": { "message": "使用外部轉寄服務產生一個電子郵件別名。" }, + "forwarderError": { + "message": "$SERVICENAME$ error: $ERRORMESSAGE$", + "description": "Reports an error returned by a forwarding service to the user.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + }, + "errormessage": { + "content": "$2", + "example": "Invalid characters in domain name." + } + } + }, + "forwarderGeneratedBy": { + "message": "Generated by Bitwarden.", + "description": "Displayed with the address on the forwarding service's configuration screen." + }, + "forwarderGeneratedByWithWebsite": { + "message": "Website: $WEBSITE$. Generated by Bitwarden.", + "description": "Displayed with the address on the forwarding service's configuration screen.", + "placeholders": { + "WEBSITE": { + "content": "$1", + "example": "www.example.com" + } + } + }, + "forwaderInvalidToken": { + "message": "Invalid $SERVICENAME$ API token", + "description": "Displayed when the user's API token is empty or rejected by the forwarding service.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwaderInvalidTokenWithMessage": { + "message": "Invalid $SERVICENAME$ API token: $ERRORMESSAGE$", + "description": "Displayed when the user's API token is rejected by the forwarding service with an error message.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + }, + "errormessage": { + "content": "$2", + "example": "Please verify your email address to continue." + } + } + }, + "forwarderNoAccountId": { + "message": "Unable to obtain $SERVICENAME$ masked email account ID.", + "description": "Displayed when the forwarding service fails to return an account ID.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderNoDomain": { + "message": "Invalid $SERVICENAME$ domain.", + "description": "Displayed when the domain is empty or domain authorization failed at the forwarding service.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderNoUrl": { + "message": "Invalid $SERVICENAME$ url.", + "description": "Displayed when the url of the forwarding service wasn't supplied.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderUnknownError": { + "message": "Unknown $SERVICENAME$ error occurred.", + "description": "Displayed when the forwarding service failed due to an unknown error.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderUnknownForwarder": { + "message": "Unknown forwarder: '$SERVICENAME$'.", + "description": "Displayed when the forwarding service is not supported.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "JustTrust.us" + } + } + }, "hostname": { "message": "主機名稱", "description": "Part of a URL." @@ -3029,6 +3176,41 @@ "message": "to make them visible.", "description": "This will be part of a larger sentence, which will read like so: Assign these items to a collection from the Admin Console to make them visible." }, + "autofillSuggestions": { + "message": "Auto-fill suggestions" + }, + "autofillSuggestionsTip": { + "message": "Save a login item for this site to auto-fill" + }, + "yourVaultIsEmpty": { + "message": "Your vault is empty" + }, + "noItemsMatchSearch": { + "message": "No items match your search" + }, + "clearFiltersOrTryAnother": { + "message": "Clear filters or try another search term" + }, + "copyInfo": { + "message": "Copy info, $ITEMNAME$", + "description": "Aria label for a button that opens a menu with options to copy information from an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "moreOptions": { + "message": "More options, $ITEMNAME$", + "description": "Aria label for a button that opens a menu with more options for an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, "adminConsole": { "message": "Admin Console" }, @@ -3046,5 +3228,38 @@ }, "errorAssigningTargetFolder": { "message": "Error assigning target folder." + }, + "viewItemsIn": { + "message": "View items in $NAME$", + "description": "Button to view the contents of a folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "backTo": { + "message": "Back to $NAME$", + "description": "Navigate back to a previous folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "new": { + "message": "New" + }, + "removeItem": { + "message": "Remove $NAME$", + "description": "Remove a selected option, such as a folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } } } diff --git a/apps/browser/src/admin-console/background/service-factories/organization-service.factory.ts b/apps/browser/src/admin-console/background/service-factories/organization-service.factory.ts deleted file mode 100644 index b7f6f98ea23..00000000000 --- a/apps/browser/src/admin-console/background/service-factories/organization-service.factory.ts +++ /dev/null @@ -1,27 +0,0 @@ -import { OrganizationService as AbstractOrganizationService } from "@bitwarden/common/admin-console/abstractions/organization/organization.service.abstraction"; -import { OrganizationService } from "@bitwarden/common/admin-console/services/organization/organization.service"; - -import { - FactoryOptions, - CachedServices, - factory, -} from "../../../platform/background/service-factories/factory-options"; -import { stateProviderFactory } from "../../../platform/background/service-factories/state-provider.factory"; -import { StateServiceInitOptions } from "../../../platform/background/service-factories/state-service.factory"; - -type OrganizationServiceFactoryOptions = FactoryOptions; - -export type OrganizationServiceInitOptions = OrganizationServiceFactoryOptions & - StateServiceInitOptions; - -export function organizationServiceFactory( - cache: { organizationService?: AbstractOrganizationService } & CachedServices, - opts: OrganizationServiceInitOptions, -): Promise { - return factory( - cache, - "organizationService", - opts, - async () => new OrganizationService(await stateProviderFactory(cache, opts)), - ); -} diff --git a/apps/browser/src/admin-console/background/service-factories/policy-service.factory.ts b/apps/browser/src/admin-console/background/service-factories/policy-service.factory.ts deleted file mode 100644 index b00693bd564..00000000000 --- a/apps/browser/src/admin-console/background/service-factories/policy-service.factory.ts +++ /dev/null @@ -1,39 +0,0 @@ -import { PolicyService as AbstractPolicyService } from "@bitwarden/common/admin-console/abstractions/policy/policy.service.abstraction"; -import { PolicyService } from "@bitwarden/common/admin-console/services/policy/policy.service"; - -import { - CachedServices, - factory, - FactoryOptions, -} from "../../../platform/background/service-factories/factory-options"; -import { - stateProviderFactory, - StateProviderInitOptions, -} from "../../../platform/background/service-factories/state-provider.factory"; - -import { - organizationServiceFactory, - OrganizationServiceInitOptions, -} from "./organization-service.factory"; - -type PolicyServiceFactoryOptions = FactoryOptions; - -export type PolicyServiceInitOptions = PolicyServiceFactoryOptions & - StateProviderInitOptions & - OrganizationServiceInitOptions; - -export function policyServiceFactory( - cache: { policyService?: AbstractPolicyService } & CachedServices, - opts: PolicyServiceInitOptions, -): Promise { - return factory( - cache, - "policyService", - opts, - async () => - new PolicyService( - await stateProviderFactory(cache, opts), - await organizationServiceFactory(cache, opts), - ), - ); -} diff --git a/apps/browser/src/auth/background/service-factories/account-service.factory.ts b/apps/browser/src/auth/background/service-factories/account-service.factory.ts deleted file mode 100644 index 9b7ad05ec49..00000000000 --- a/apps/browser/src/auth/background/service-factories/account-service.factory.ts +++ /dev/null @@ -1,44 +0,0 @@ -import { AccountService } from "@bitwarden/common/auth/abstractions/account.service"; -import { AccountServiceImplementation } from "@bitwarden/common/auth/services/account.service"; - -import { - FactoryOptions, - CachedServices, - factory, -} from "../../../platform/background/service-factories/factory-options"; -import { - GlobalStateProviderInitOptions, - globalStateProviderFactory, -} from "../../../platform/background/service-factories/global-state-provider.factory"; -import { - LogServiceInitOptions, - logServiceFactory, -} from "../../../platform/background/service-factories/log-service.factory"; -import { - MessagingServiceInitOptions, - messagingServiceFactory, -} from "../../../platform/background/service-factories/messaging-service.factory"; - -type AccountServiceFactoryOptions = FactoryOptions; - -export type AccountServiceInitOptions = AccountServiceFactoryOptions & - MessagingServiceInitOptions & - LogServiceInitOptions & - GlobalStateProviderInitOptions; - -export function accountServiceFactory( - cache: { accountService?: AccountService } & CachedServices, - opts: AccountServiceInitOptions, -): Promise { - return factory( - cache, - "accountService", - opts, - async () => - new AccountServiceImplementation( - await messagingServiceFactory(cache, opts), - await logServiceFactory(cache, opts), - await globalStateProviderFactory(cache, opts), - ), - ); -} diff --git a/apps/browser/src/auth/background/service-factories/auth-request-service.factory.ts b/apps/browser/src/auth/background/service-factories/auth-request-service.factory.ts deleted file mode 100644 index c18fd1a112a..00000000000 --- a/apps/browser/src/auth/background/service-factories/auth-request-service.factory.ts +++ /dev/null @@ -1,59 +0,0 @@ -import { AuthRequestService, AuthRequestServiceAbstraction } from "@bitwarden/auth/common"; - -import { - apiServiceFactory, - ApiServiceInitOptions, -} from "../../../platform/background/service-factories/api-service.factory"; -import { - appIdServiceFactory, - AppIdServiceInitOptions, -} from "../../../platform/background/service-factories/app-id-service.factory"; -import { - CryptoServiceInitOptions, - cryptoServiceFactory, -} from "../../../platform/background/service-factories/crypto-service.factory"; -import { - CachedServices, - FactoryOptions, - factory, -} from "../../../platform/background/service-factories/factory-options"; -import { - stateProviderFactory, - StateProviderInitOptions, -} from "../../../platform/background/service-factories/state-provider.factory"; - -import { accountServiceFactory, AccountServiceInitOptions } from "./account-service.factory"; -import { - internalMasterPasswordServiceFactory, - MasterPasswordServiceInitOptions, -} from "./master-password-service.factory"; - -type AuthRequestServiceFactoryOptions = FactoryOptions; - -export type AuthRequestServiceInitOptions = AuthRequestServiceFactoryOptions & - AppIdServiceInitOptions & - AccountServiceInitOptions & - MasterPasswordServiceInitOptions & - CryptoServiceInitOptions & - ApiServiceInitOptions & - StateProviderInitOptions; - -export function authRequestServiceFactory( - cache: { authRequestService?: AuthRequestServiceAbstraction } & CachedServices, - opts: AuthRequestServiceInitOptions, -): Promise { - return factory( - cache, - "authRequestService", - opts, - async () => - new AuthRequestService( - await appIdServiceFactory(cache, opts), - await accountServiceFactory(cache, opts), - await internalMasterPasswordServiceFactory(cache, opts), - await cryptoServiceFactory(cache, opts), - await apiServiceFactory(cache, opts), - await stateProviderFactory(cache, opts), - ), - ); -} diff --git a/apps/browser/src/auth/background/service-factories/auth-service.factory.ts b/apps/browser/src/auth/background/service-factories/auth-service.factory.ts deleted file mode 100644 index f600efa18d5..00000000000 --- a/apps/browser/src/auth/background/service-factories/auth-service.factory.ts +++ /dev/null @@ -1,57 +0,0 @@ -import { AuthService as AbstractAuthService } from "@bitwarden/common/auth/abstractions/auth.service"; -import { AuthService } from "@bitwarden/common/auth/services/auth.service"; - -import { - ApiServiceInitOptions, - apiServiceFactory, -} from "../../../platform/background/service-factories/api-service.factory"; -import { - CryptoServiceInitOptions, - cryptoServiceFactory, -} from "../../../platform/background/service-factories/crypto-service.factory"; -import { - CachedServices, - FactoryOptions, - factory, -} from "../../../platform/background/service-factories/factory-options"; -import { - MessagingServiceInitOptions, - messagingServiceFactory, -} from "../../../platform/background/service-factories/messaging-service.factory"; -import { - StateServiceInitOptions, - stateServiceFactory, -} from "../../../platform/background/service-factories/state-service.factory"; - -import { AccountServiceInitOptions, accountServiceFactory } from "./account-service.factory"; -import { TokenServiceInitOptions, tokenServiceFactory } from "./token-service.factory"; - -type AuthServiceFactoryOptions = FactoryOptions; - -export type AuthServiceInitOptions = AuthServiceFactoryOptions & - AccountServiceInitOptions & - MessagingServiceInitOptions & - CryptoServiceInitOptions & - ApiServiceInitOptions & - StateServiceInitOptions & - TokenServiceInitOptions; - -export function authServiceFactory( - cache: { authService?: AbstractAuthService } & CachedServices, - opts: AuthServiceInitOptions, -): Promise { - return factory( - cache, - "authService", - opts, - async () => - new AuthService( - await accountServiceFactory(cache, opts), - await messagingServiceFactory(cache, opts), - await cryptoServiceFactory(cache, opts), - await apiServiceFactory(cache, opts), - await stateServiceFactory(cache, opts), - await tokenServiceFactory(cache, opts), - ), - ); -} diff --git a/apps/browser/src/auth/background/service-factories/avatar-service.factory.ts b/apps/browser/src/auth/background/service-factories/avatar-service.factory.ts deleted file mode 100644 index 456edfa93da..00000000000 --- a/apps/browser/src/auth/background/service-factories/avatar-service.factory.ts +++ /dev/null @@ -1,38 +0,0 @@ -import { AvatarService as AvatarServiceAbstraction } from "@bitwarden/common/auth/abstractions/avatar.service"; -import { AvatarService } from "@bitwarden/common/auth/services/avatar.service"; - -import { - ApiServiceInitOptions, - apiServiceFactory, -} from "../../../platform/background/service-factories/api-service.factory"; -import { - CachedServices, - factory, - FactoryOptions, -} from "../../../platform/background/service-factories/factory-options"; -import { - stateProviderFactory, - StateProviderInitOptions, -} from "../../../platform/background/service-factories/state-provider.factory"; - -type AvatarServiceFactoryOptions = FactoryOptions; - -export type AvatarServiceInitOptions = AvatarServiceFactoryOptions & - ApiServiceInitOptions & - StateProviderInitOptions; - -export function avatarServiceFactory( - cache: { avatarService?: AvatarServiceAbstraction } & CachedServices, - opts: AvatarServiceInitOptions, -): Promise { - return factory( - cache, - "avatarService", - opts, - async () => - new AvatarService( - await apiServiceFactory(cache, opts), - await stateProviderFactory(cache, opts), - ), - ); -} diff --git a/apps/browser/src/auth/background/service-factories/device-trust-service.factory.ts b/apps/browser/src/auth/background/service-factories/device-trust-service.factory.ts deleted file mode 100644 index 42a8232c3e6..00000000000 --- a/apps/browser/src/auth/background/service-factories/device-trust-service.factory.ts +++ /dev/null @@ -1,95 +0,0 @@ -import { DeviceTrustServiceAbstraction } from "@bitwarden/common/auth/abstractions/device-trust.service.abstraction"; -import { DeviceTrustService } from "@bitwarden/common/auth/services/device-trust.service.implementation"; - -import { - DevicesApiServiceInitOptions, - devicesApiServiceFactory, -} from "../../../background/service-factories/devices-api-service.factory"; -import { - AppIdServiceInitOptions, - appIdServiceFactory, -} from "../../../platform/background/service-factories/app-id-service.factory"; -import { - CryptoFunctionServiceInitOptions, - cryptoFunctionServiceFactory, -} from "../../../platform/background/service-factories/crypto-function-service.factory"; -import { - CryptoServiceInitOptions, - cryptoServiceFactory, -} from "../../../platform/background/service-factories/crypto-service.factory"; -import { - EncryptServiceInitOptions, - encryptServiceFactory, -} from "../../../platform/background/service-factories/encrypt-service.factory"; -import { - CachedServices, - FactoryOptions, - factory, -} from "../../../platform/background/service-factories/factory-options"; -import { - I18nServiceInitOptions, - i18nServiceFactory, -} from "../../../platform/background/service-factories/i18n-service.factory"; -import { - KeyGenerationServiceInitOptions, - keyGenerationServiceFactory, -} from "../../../platform/background/service-factories/key-generation-service.factory"; -import { logServiceFactory } from "../../../platform/background/service-factories/log-service.factory"; -import { - PlatformUtilsServiceInitOptions, - platformUtilsServiceFactory, -} from "../../../platform/background/service-factories/platform-utils-service.factory"; -import { - StateProviderInitOptions, - stateProviderFactory, -} from "../../../platform/background/service-factories/state-provider.factory"; -import { - SecureStorageServiceInitOptions, - secureStorageServiceFactory, -} from "../../../platform/background/service-factories/storage-service.factory"; - -import { - UserDecryptionOptionsServiceInitOptions, - userDecryptionOptionsServiceFactory, -} from "./user-decryption-options-service.factory"; - -type DeviceTrustServiceFactoryOptions = FactoryOptions; - -export type DeviceTrustServiceInitOptions = DeviceTrustServiceFactoryOptions & - KeyGenerationServiceInitOptions & - CryptoFunctionServiceInitOptions & - CryptoServiceInitOptions & - EncryptServiceInitOptions & - AppIdServiceInitOptions & - DevicesApiServiceInitOptions & - I18nServiceInitOptions & - PlatformUtilsServiceInitOptions & - StateProviderInitOptions & - SecureStorageServiceInitOptions & - UserDecryptionOptionsServiceInitOptions; - -export function deviceTrustServiceFactory( - cache: { deviceTrustService?: DeviceTrustServiceAbstraction } & CachedServices, - opts: DeviceTrustServiceInitOptions, -): Promise { - return factory( - cache, - "deviceTrustService", - opts, - async () => - new DeviceTrustService( - await keyGenerationServiceFactory(cache, opts), - await cryptoFunctionServiceFactory(cache, opts), - await cryptoServiceFactory(cache, opts), - await encryptServiceFactory(cache, opts), - await appIdServiceFactory(cache, opts), - await devicesApiServiceFactory(cache, opts), - await i18nServiceFactory(cache, opts), - await platformUtilsServiceFactory(cache, opts), - await stateProviderFactory(cache, opts), - await secureStorageServiceFactory(cache, opts), - await userDecryptionOptionsServiceFactory(cache, opts), - await logServiceFactory(cache, opts), - ), - ); -} diff --git a/apps/browser/src/auth/background/service-factories/kdf-config-service.factory.ts b/apps/browser/src/auth/background/service-factories/kdf-config-service.factory.ts deleted file mode 100644 index eb5ba3a264c..00000000000 --- a/apps/browser/src/auth/background/service-factories/kdf-config-service.factory.ts +++ /dev/null @@ -1,28 +0,0 @@ -import { KdfConfigService as AbstractKdfConfigService } from "@bitwarden/common/auth/abstractions/kdf-config.service"; -import { KdfConfigService } from "@bitwarden/common/auth/services/kdf-config.service"; - -import { - FactoryOptions, - CachedServices, - factory, -} from "../../../platform/background/service-factories/factory-options"; -import { - StateProviderInitOptions, - stateProviderFactory, -} from "../../../platform/background/service-factories/state-provider.factory"; - -type KdfConfigServiceFactoryOptions = FactoryOptions; - -export type KdfConfigServiceInitOptions = KdfConfigServiceFactoryOptions & StateProviderInitOptions; - -export function kdfConfigServiceFactory( - cache: { kdfConfigService?: AbstractKdfConfigService } & CachedServices, - opts: KdfConfigServiceInitOptions, -): Promise { - return factory( - cache, - "kdfConfigService", - opts, - async () => new KdfConfigService(await stateProviderFactory(cache, opts)), - ); -} diff --git a/apps/browser/src/auth/background/service-factories/key-connector-service.factory.ts b/apps/browser/src/auth/background/service-factories/key-connector-service.factory.ts deleted file mode 100644 index c602acadaed..00000000000 --- a/apps/browser/src/auth/background/service-factories/key-connector-service.factory.ts +++ /dev/null @@ -1,80 +0,0 @@ -import { KeyConnectorService as AbstractKeyConnectorService } from "@bitwarden/common/auth/abstractions/key-connector.service"; -import { KeyConnectorService } from "@bitwarden/common/auth/services/key-connector.service"; - -import { - OrganizationServiceInitOptions, - organizationServiceFactory, -} from "../../../admin-console/background/service-factories/organization-service.factory"; -import { - apiServiceFactory, - ApiServiceInitOptions, -} from "../../../platform/background/service-factories/api-service.factory"; -import { - CryptoServiceInitOptions, - cryptoServiceFactory, -} from "../../../platform/background/service-factories/crypto-service.factory"; -import { - FactoryOptions, - CachedServices, - factory, -} from "../../../platform/background/service-factories/factory-options"; -import { - KeyGenerationServiceInitOptions, - keyGenerationServiceFactory, -} from "../../../platform/background/service-factories/key-generation-service.factory"; -import { - logServiceFactory, - LogServiceInitOptions, -} from "../../../platform/background/service-factories/log-service.factory"; -import { - stateProviderFactory, - StateProviderInitOptions, -} from "../../../platform/background/service-factories/state-provider.factory"; - -import { accountServiceFactory, AccountServiceInitOptions } from "./account-service.factory"; -import { - internalMasterPasswordServiceFactory, - MasterPasswordServiceInitOptions, -} from "./master-password-service.factory"; -import { TokenServiceInitOptions, tokenServiceFactory } from "./token-service.factory"; - -type KeyConnectorServiceFactoryOptions = FactoryOptions & { - keyConnectorServiceOptions: { - logoutCallback: (expired: boolean, userId?: string) => Promise; - }; -}; - -export type KeyConnectorServiceInitOptions = KeyConnectorServiceFactoryOptions & - AccountServiceInitOptions & - MasterPasswordServiceInitOptions & - CryptoServiceInitOptions & - ApiServiceInitOptions & - TokenServiceInitOptions & - LogServiceInitOptions & - OrganizationServiceInitOptions & - KeyGenerationServiceInitOptions & - StateProviderInitOptions; - -export function keyConnectorServiceFactory( - cache: { keyConnectorService?: AbstractKeyConnectorService } & CachedServices, - opts: KeyConnectorServiceInitOptions, -): Promise { - return factory( - cache, - "keyConnectorService", - opts, - async () => - new KeyConnectorService( - await accountServiceFactory(cache, opts), - await internalMasterPasswordServiceFactory(cache, opts), - await cryptoServiceFactory(cache, opts), - await apiServiceFactory(cache, opts), - await tokenServiceFactory(cache, opts), - await logServiceFactory(cache, opts), - await organizationServiceFactory(cache, opts), - await keyGenerationServiceFactory(cache, opts), - opts.keyConnectorServiceOptions.logoutCallback, - await stateProviderFactory(cache, opts), - ), - ); -} diff --git a/apps/browser/src/auth/background/service-factories/login-email-service.factory.ts b/apps/browser/src/auth/background/service-factories/login-email-service.factory.ts deleted file mode 100644 index 6e98a9a8860..00000000000 --- a/apps/browser/src/auth/background/service-factories/login-email-service.factory.ts +++ /dev/null @@ -1,28 +0,0 @@ -import { LoginEmailServiceAbstraction, LoginEmailService } from "@bitwarden/auth/common"; - -import { - CachedServices, - factory, - FactoryOptions, -} from "../../../platform/background/service-factories/factory-options"; -import { - stateProviderFactory, - StateProviderInitOptions, -} from "../../../platform/background/service-factories/state-provider.factory"; - -type LoginEmailServiceFactoryOptions = FactoryOptions; - -export type LoginEmailServiceInitOptions = LoginEmailServiceFactoryOptions & - StateProviderInitOptions; - -export function loginEmailServiceFactory( - cache: { loginEmailService?: LoginEmailServiceAbstraction } & CachedServices, - opts: LoginEmailServiceInitOptions, -): Promise { - return factory( - cache, - "loginEmailService", - opts, - async () => new LoginEmailService(await stateProviderFactory(cache, opts)), - ); -} diff --git a/apps/browser/src/auth/background/service-factories/login-strategy-service.factory.ts b/apps/browser/src/auth/background/service-factories/login-strategy-service.factory.ts deleted file mode 100644 index 83ebcaa11e6..00000000000 --- a/apps/browser/src/auth/background/service-factories/login-strategy-service.factory.ts +++ /dev/null @@ -1,154 +0,0 @@ -import { LoginStrategyService, LoginStrategyServiceAbstraction } from "@bitwarden/auth/common"; - -import { - policyServiceFactory, - PolicyServiceInitOptions, -} from "../../../admin-console/background/service-factories/policy-service.factory"; -import { - vaultTimeoutSettingsServiceFactory, - VaultTimeoutSettingsServiceInitOptions, -} from "../../../background/service-factories/vault-timeout-settings-service.factory"; -import { - apiServiceFactory, - ApiServiceInitOptions, -} from "../../../platform/background/service-factories/api-service.factory"; -import { appIdServiceFactory } from "../../../platform/background/service-factories/app-id-service.factory"; -import { - billingAccountProfileStateServiceFactory, - BillingAccountProfileStateServiceInitOptions, -} from "../../../platform/background/service-factories/billing-account-profile-state-service.factory"; -import { - CryptoServiceInitOptions, - cryptoServiceFactory, -} from "../../../platform/background/service-factories/crypto-service.factory"; -import { - EncryptServiceInitOptions, - encryptServiceFactory, -} from "../../../platform/background/service-factories/encrypt-service.factory"; -import { - environmentServiceFactory, - EnvironmentServiceInitOptions, -} from "../../../platform/background/service-factories/environment-service.factory"; -import { - CachedServices, - factory, - FactoryOptions, -} from "../../../platform/background/service-factories/factory-options"; -import { - globalStateProviderFactory, - GlobalStateProviderInitOptions, -} from "../../../platform/background/service-factories/global-state-provider.factory"; -import { - i18nServiceFactory, - I18nServiceInitOptions, -} from "../../../platform/background/service-factories/i18n-service.factory"; -import { - logServiceFactory, - LogServiceInitOptions, -} from "../../../platform/background/service-factories/log-service.factory"; -import { - messagingServiceFactory, - MessagingServiceInitOptions, -} from "../../../platform/background/service-factories/messaging-service.factory"; -import { - platformUtilsServiceFactory, - PlatformUtilsServiceInitOptions, -} from "../../../platform/background/service-factories/platform-utils-service.factory"; -import { - stateServiceFactory, - StateServiceInitOptions, -} from "../../../platform/background/service-factories/state-service.factory"; -import { - passwordStrengthServiceFactory, - PasswordStrengthServiceInitOptions, -} from "../../../tools/background/service_factories/password-strength-service.factory"; - -import { accountServiceFactory, AccountServiceInitOptions } from "./account-service.factory"; -import { - authRequestServiceFactory, - AuthRequestServiceInitOptions, -} from "./auth-request-service.factory"; -import { - deviceTrustServiceFactory, - DeviceTrustServiceInitOptions, -} from "./device-trust-service.factory"; -import { kdfConfigServiceFactory, KdfConfigServiceInitOptions } from "./kdf-config-service.factory"; -import { - keyConnectorServiceFactory, - KeyConnectorServiceInitOptions, -} from "./key-connector-service.factory"; -import { - internalMasterPasswordServiceFactory, - MasterPasswordServiceInitOptions, -} from "./master-password-service.factory"; -import { tokenServiceFactory, TokenServiceInitOptions } from "./token-service.factory"; -import { twoFactorServiceFactory, TwoFactorServiceInitOptions } from "./two-factor-service.factory"; -import { - internalUserDecryptionOptionServiceFactory, - UserDecryptionOptionsServiceInitOptions, -} from "./user-decryption-options-service.factory"; - -type LoginStrategyServiceFactoryOptions = FactoryOptions; - -export type LoginStrategyServiceInitOptions = LoginStrategyServiceFactoryOptions & - AccountServiceInitOptions & - MasterPasswordServiceInitOptions & - CryptoServiceInitOptions & - ApiServiceInitOptions & - TokenServiceInitOptions & - PlatformUtilsServiceInitOptions & - MessagingServiceInitOptions & - LogServiceInitOptions & - KeyConnectorServiceInitOptions & - EnvironmentServiceInitOptions & - StateServiceInitOptions & - TwoFactorServiceInitOptions & - I18nServiceInitOptions & - EncryptServiceInitOptions & - PolicyServiceInitOptions & - PasswordStrengthServiceInitOptions & - DeviceTrustServiceInitOptions & - AuthRequestServiceInitOptions & - UserDecryptionOptionsServiceInitOptions & - GlobalStateProviderInitOptions & - BillingAccountProfileStateServiceInitOptions & - VaultTimeoutSettingsServiceInitOptions & - KdfConfigServiceInitOptions; - -export function loginStrategyServiceFactory( - cache: { loginStrategyService?: LoginStrategyServiceAbstraction } & CachedServices, - opts: LoginStrategyServiceInitOptions, -): Promise { - return factory( - cache, - "loginStrategyService", - opts, - async () => - new LoginStrategyService( - await accountServiceFactory(cache, opts), - await internalMasterPasswordServiceFactory(cache, opts), - await cryptoServiceFactory(cache, opts), - await apiServiceFactory(cache, opts), - await tokenServiceFactory(cache, opts), - await appIdServiceFactory(cache, opts), - await platformUtilsServiceFactory(cache, opts), - await messagingServiceFactory(cache, opts), - await logServiceFactory(cache, opts), - await keyConnectorServiceFactory(cache, opts), - await environmentServiceFactory(cache, opts), - await stateServiceFactory(cache, opts), - await twoFactorServiceFactory(cache, opts), - await i18nServiceFactory(cache, opts), - await encryptServiceFactory(cache, opts), - await passwordStrengthServiceFactory(cache, opts), - await policyServiceFactory(cache, opts), - await deviceTrustServiceFactory(cache, opts), - await authRequestServiceFactory(cache, opts), - await internalUserDecryptionOptionServiceFactory(cache, opts), - await globalStateProviderFactory(cache, opts), - await billingAccountProfileStateServiceFactory(cache, opts), - await vaultTimeoutSettingsServiceFactory(cache, opts), - await kdfConfigServiceFactory(cache, opts), - ), - ); -} diff --git a/apps/browser/src/auth/background/service-factories/master-password-service.factory.ts b/apps/browser/src/auth/background/service-factories/master-password-service.factory.ts deleted file mode 100644 index 37fcf789ff2..00000000000 --- a/apps/browser/src/auth/background/service-factories/master-password-service.factory.ts +++ /dev/null @@ -1,63 +0,0 @@ -import { - InternalMasterPasswordServiceAbstraction, - MasterPasswordServiceAbstraction, -} from "@bitwarden/common/auth/abstractions/master-password.service.abstraction"; -import { MasterPasswordService } from "@bitwarden/common/auth/services/master-password/master-password.service"; - -import { - encryptServiceFactory, - EncryptServiceInitOptions, -} from "../../../platform/background/service-factories/encrypt-service.factory"; -import { - CachedServices, - factory, - FactoryOptions, -} from "../../../platform/background/service-factories/factory-options"; -import { - keyGenerationServiceFactory, - KeyGenerationServiceInitOptions, -} from "../../../platform/background/service-factories/key-generation-service.factory"; -import { - stateProviderFactory, - StateProviderInitOptions, -} from "../../../platform/background/service-factories/state-provider.factory"; -import { - stateServiceFactory, - StateServiceInitOptions, -} from "../../../platform/background/service-factories/state-service.factory"; - -type MasterPasswordServiceFactoryOptions = FactoryOptions; - -export type MasterPasswordServiceInitOptions = MasterPasswordServiceFactoryOptions & - StateProviderInitOptions & - StateServiceInitOptions & - KeyGenerationServiceInitOptions & - EncryptServiceInitOptions; - -export function internalMasterPasswordServiceFactory( - cache: { masterPasswordService?: InternalMasterPasswordServiceAbstraction } & CachedServices, - opts: MasterPasswordServiceInitOptions, -): Promise { - return factory( - cache, - "masterPasswordService", - opts, - async () => - new MasterPasswordService( - await stateProviderFactory(cache, opts), - await stateServiceFactory(cache, opts), - await keyGenerationServiceFactory(cache, opts), - await encryptServiceFactory(cache, opts), - ), - ); -} - -export async function masterPasswordServiceFactory( - cache: { masterPasswordService?: InternalMasterPasswordServiceAbstraction } & CachedServices, - opts: MasterPasswordServiceInitOptions, -): Promise { - return (await internalMasterPasswordServiceFactory( - cache, - opts, - )) as MasterPasswordServiceAbstraction; -} diff --git a/apps/browser/src/auth/background/service-factories/pin-service.factory.ts b/apps/browser/src/auth/background/service-factories/pin-service.factory.ts deleted file mode 100644 index f15e7fe7620..00000000000 --- a/apps/browser/src/auth/background/service-factories/pin-service.factory.ts +++ /dev/null @@ -1,74 +0,0 @@ -import { PinServiceAbstraction, PinService } from "@bitwarden/auth/common"; - -import { - CryptoFunctionServiceInitOptions, - cryptoFunctionServiceFactory, -} from "../../../platform/background/service-factories/crypto-function-service.factory"; -import { - EncryptServiceInitOptions, - encryptServiceFactory, -} from "../../../platform/background/service-factories/encrypt-service.factory"; -import { - FactoryOptions, - CachedServices, - factory, -} from "../../../platform/background/service-factories/factory-options"; -import { - KeyGenerationServiceInitOptions, - keyGenerationServiceFactory, -} from "../../../platform/background/service-factories/key-generation-service.factory"; -import { - LogServiceInitOptions, - logServiceFactory, -} from "../../../platform/background/service-factories/log-service.factory"; -import { - StateProviderInitOptions, - stateProviderFactory, -} from "../../../platform/background/service-factories/state-provider.factory"; -import { - StateServiceInitOptions, - stateServiceFactory, -} from "../../../platform/background/service-factories/state-service.factory"; - -import { AccountServiceInitOptions, accountServiceFactory } from "./account-service.factory"; -import { KdfConfigServiceInitOptions, kdfConfigServiceFactory } from "./kdf-config-service.factory"; -import { - MasterPasswordServiceInitOptions, - masterPasswordServiceFactory, -} from "./master-password-service.factory"; - -type PinServiceFactoryOptions = FactoryOptions; - -export type PinServiceInitOptions = PinServiceFactoryOptions & - AccountServiceInitOptions & - CryptoFunctionServiceInitOptions & - EncryptServiceInitOptions & - KdfConfigServiceInitOptions & - KeyGenerationServiceInitOptions & - LogServiceInitOptions & - MasterPasswordServiceInitOptions & - StateProviderInitOptions & - StateServiceInitOptions; - -export function pinServiceFactory( - cache: { pinService?: PinServiceAbstraction } & CachedServices, - opts: PinServiceInitOptions, -): Promise { - return factory( - cache, - "pinService", - opts, - async () => - new PinService( - await accountServiceFactory(cache, opts), - await cryptoFunctionServiceFactory(cache, opts), - await encryptServiceFactory(cache, opts), - await kdfConfigServiceFactory(cache, opts), - await keyGenerationServiceFactory(cache, opts), - await logServiceFactory(cache, opts), - await masterPasswordServiceFactory(cache, opts), - await stateProviderFactory(cache, opts), - await stateServiceFactory(cache, opts), - ), - ); -} diff --git a/apps/browser/src/auth/background/service-factories/sso-login-service.factory.ts b/apps/browser/src/auth/background/service-factories/sso-login-service.factory.ts deleted file mode 100644 index 2747d9ff442..00000000000 --- a/apps/browser/src/auth/background/service-factories/sso-login-service.factory.ts +++ /dev/null @@ -1,28 +0,0 @@ -import { SsoLoginServiceAbstraction } from "@bitwarden/common/auth/abstractions/sso-login.service.abstraction"; -import { SsoLoginService } from "@bitwarden/common/auth/services/sso-login.service"; - -import { - CachedServices, - factory, - FactoryOptions, -} from "../../../platform/background/service-factories/factory-options"; -import { - stateProviderFactory, - StateProviderInitOptions, -} from "../../../platform/background/service-factories/state-provider.factory"; - -type SsoLoginServiceFactoryOptions = FactoryOptions; - -export type SsoLoginServiceInitOptions = SsoLoginServiceFactoryOptions & StateProviderInitOptions; - -export function ssoLoginServiceFactory( - cache: { ssoLoginService?: SsoLoginServiceAbstraction } & CachedServices, - opts: SsoLoginServiceInitOptions, -): Promise { - return factory( - cache, - "ssoLoginService", - opts, - async () => new SsoLoginService(await stateProviderFactory(cache, opts)), - ); -} diff --git a/apps/browser/src/auth/background/service-factories/token-service.factory.ts b/apps/browser/src/auth/background/service-factories/token-service.factory.ts deleted file mode 100644 index ba42998209e..00000000000 --- a/apps/browser/src/auth/background/service-factories/token-service.factory.ts +++ /dev/null @@ -1,68 +0,0 @@ -import { TokenService as AbstractTokenService } from "@bitwarden/common/auth/abstractions/token.service"; -import { TokenService } from "@bitwarden/common/auth/services/token.service"; - -import { - EncryptServiceInitOptions, - encryptServiceFactory, -} from "../../../platform/background/service-factories/encrypt-service.factory"; -import { - FactoryOptions, - CachedServices, - factory, -} from "../../../platform/background/service-factories/factory-options"; -import { - GlobalStateProviderInitOptions, - globalStateProviderFactory, -} from "../../../platform/background/service-factories/global-state-provider.factory"; -import { - KeyGenerationServiceInitOptions, - keyGenerationServiceFactory, -} from "../../../platform/background/service-factories/key-generation-service.factory"; -import { - LogServiceInitOptions, - logServiceFactory, -} from "../../../platform/background/service-factories/log-service.factory"; -import { - PlatformUtilsServiceInitOptions, - platformUtilsServiceFactory, -} from "../../../platform/background/service-factories/platform-utils-service.factory"; -import { - SingleUserStateProviderInitOptions, - singleUserStateProviderFactory, -} from "../../../platform/background/service-factories/single-user-state-provider.factory"; -import { - SecureStorageServiceInitOptions, - secureStorageServiceFactory, -} from "../../../platform/background/service-factories/storage-service.factory"; - -type TokenServiceFactoryOptions = FactoryOptions; - -export type TokenServiceInitOptions = TokenServiceFactoryOptions & - SingleUserStateProviderInitOptions & - GlobalStateProviderInitOptions & - PlatformUtilsServiceInitOptions & - SecureStorageServiceInitOptions & - KeyGenerationServiceInitOptions & - EncryptServiceInitOptions & - LogServiceInitOptions; - -export function tokenServiceFactory( - cache: { tokenService?: AbstractTokenService } & CachedServices, - opts: TokenServiceInitOptions, -): Promise { - return factory( - cache, - "tokenService", - opts, - async () => - new TokenService( - await singleUserStateProviderFactory(cache, opts), - await globalStateProviderFactory(cache, opts), - (await platformUtilsServiceFactory(cache, opts)).supportsSecureStorage(), - await secureStorageServiceFactory(cache, opts), - await keyGenerationServiceFactory(cache, opts), - await encryptServiceFactory(cache, opts), - await logServiceFactory(cache, opts), - ), - ); -} diff --git a/apps/browser/src/auth/background/service-factories/two-factor-service.factory.ts b/apps/browser/src/auth/background/service-factories/two-factor-service.factory.ts deleted file mode 100644 index 5af5eb00177..00000000000 --- a/apps/browser/src/auth/background/service-factories/two-factor-service.factory.ts +++ /dev/null @@ -1,44 +0,0 @@ -import { TwoFactorService as AbstractTwoFactorService } from "@bitwarden/common/auth/abstractions/two-factor.service"; -import { TwoFactorService } from "@bitwarden/common/auth/services/two-factor.service"; -import { GlobalStateProvider } from "@bitwarden/common/platform/state"; - -import { - FactoryOptions, - CachedServices, - factory, -} from "../../../platform/background/service-factories/factory-options"; -import { globalStateProviderFactory } from "../../../platform/background/service-factories/global-state-provider.factory"; -import { - I18nServiceInitOptions, - i18nServiceFactory, -} from "../../../platform/background/service-factories/i18n-service.factory"; -import { - PlatformUtilsServiceInitOptions, - platformUtilsServiceFactory, -} from "../../../platform/background/service-factories/platform-utils-service.factory"; - -type TwoFactorServiceFactoryOptions = FactoryOptions; - -export type TwoFactorServiceInitOptions = TwoFactorServiceFactoryOptions & - I18nServiceInitOptions & - PlatformUtilsServiceInitOptions & - GlobalStateProvider; - -export async function twoFactorServiceFactory( - cache: { twoFactorService?: AbstractTwoFactorService } & CachedServices, - opts: TwoFactorServiceInitOptions, -): Promise { - const service = await factory( - cache, - "twoFactorService", - opts, - async () => - new TwoFactorService( - await i18nServiceFactory(cache, opts), - await platformUtilsServiceFactory(cache, opts), - await globalStateProviderFactory(cache, opts), - ), - ); - service.init(); - return service; -} diff --git a/apps/browser/src/auth/background/service-factories/user-decryption-options-service.factory.ts b/apps/browser/src/auth/background/service-factories/user-decryption-options-service.factory.ts deleted file mode 100644 index 549639a3c78..00000000000 --- a/apps/browser/src/auth/background/service-factories/user-decryption-options-service.factory.ts +++ /dev/null @@ -1,46 +0,0 @@ -import { - InternalUserDecryptionOptionsServiceAbstraction, - UserDecryptionOptionsService, - UserDecryptionOptionsServiceAbstraction, -} from "@bitwarden/auth/common"; - -import { - CachedServices, - factory, - FactoryOptions, -} from "../../../platform/background/service-factories/factory-options"; -import { - stateProviderFactory, - StateProviderInitOptions, -} from "../../../platform/background/service-factories/state-provider.factory"; - -type UserDecryptionOptionsServiceFactoryOptions = FactoryOptions; - -export type UserDecryptionOptionsServiceInitOptions = UserDecryptionOptionsServiceFactoryOptions & - StateProviderInitOptions; - -export function userDecryptionOptionsServiceFactory( - cache: { - userDecryptionOptionsService?: InternalUserDecryptionOptionsServiceAbstraction; - } & CachedServices, - opts: UserDecryptionOptionsServiceInitOptions, -): Promise { - return factory( - cache, - "userDecryptionOptionsService", - opts, - async () => new UserDecryptionOptionsService(await stateProviderFactory(cache, opts)), - ); -} - -export async function internalUserDecryptionOptionServiceFactory( - cache: { - userDecryptionOptionsService?: InternalUserDecryptionOptionsServiceAbstraction; - } & CachedServices, - opts: UserDecryptionOptionsServiceInitOptions, -): Promise { - return (await userDecryptionOptionsServiceFactory( - cache, - opts, - )) as InternalUserDecryptionOptionsServiceAbstraction; -} diff --git a/apps/browser/src/auth/background/service-factories/user-verification-api-service.factory.ts b/apps/browser/src/auth/background/service-factories/user-verification-api-service.factory.ts deleted file mode 100644 index f8d43877632..00000000000 --- a/apps/browser/src/auth/background/service-factories/user-verification-api-service.factory.ts +++ /dev/null @@ -1,29 +0,0 @@ -import { UserVerificationApiServiceAbstraction } from "@bitwarden/common/auth/abstractions/user-verification/user-verification-api.service.abstraction"; -import { UserVerificationApiService } from "@bitwarden/common/auth/services/user-verification/user-verification-api.service"; - -import { - ApiServiceInitOptions, - apiServiceFactory, -} from "../../../platform/background/service-factories/api-service.factory"; -import { - FactoryOptions, - CachedServices, - factory, -} from "../../../platform/background/service-factories/factory-options"; - -type UserVerificationApiServiceFactoryOptions = FactoryOptions; - -export type UserVerificationApiServiceInitOptions = UserVerificationApiServiceFactoryOptions & - ApiServiceInitOptions; - -export function userVerificationApiServiceFactory( - cache: { userVerificationApiService?: UserVerificationApiServiceAbstraction } & CachedServices, - opts: UserVerificationApiServiceInitOptions, -): Promise { - return factory( - cache, - "userVerificationApiService", - opts, - async () => new UserVerificationApiService(await apiServiceFactory(cache, opts)), - ); -} diff --git a/apps/browser/src/auth/background/service-factories/user-verification-service.factory.ts b/apps/browser/src/auth/background/service-factories/user-verification-service.factory.ts deleted file mode 100644 index 5b5a4250454..00000000000 --- a/apps/browser/src/auth/background/service-factories/user-verification-service.factory.ts +++ /dev/null @@ -1,90 +0,0 @@ -import { UserVerificationService as AbstractUserVerificationService } from "@bitwarden/common/auth/abstractions/user-verification/user-verification.service.abstraction"; -import { UserVerificationService } from "@bitwarden/common/auth/services/user-verification/user-verification.service"; - -import { - VaultTimeoutSettingsServiceInitOptions, - vaultTimeoutSettingsServiceFactory, -} from "../../../background/service-factories/vault-timeout-settings-service.factory"; -import { - CryptoServiceInitOptions, - cryptoServiceFactory, -} from "../../../platform/background/service-factories/crypto-service.factory"; -import { - FactoryOptions, - CachedServices, - factory, -} from "../../../platform/background/service-factories/factory-options"; -import { - I18nServiceInitOptions, - i18nServiceFactory, -} from "../../../platform/background/service-factories/i18n-service.factory"; -import { - LogServiceInitOptions, - logServiceFactory, -} from "../../../platform/background/service-factories/log-service.factory"; -import { - platformUtilsServiceFactory, - PlatformUtilsServiceInitOptions, -} from "../../../platform/background/service-factories/platform-utils-service.factory"; -import { - StateServiceInitOptions, - stateServiceFactory, -} from "../../../platform/background/service-factories/state-service.factory"; - -import { accountServiceFactory, AccountServiceInitOptions } from "./account-service.factory"; -import { KdfConfigServiceInitOptions, kdfConfigServiceFactory } from "./kdf-config-service.factory"; -import { - internalMasterPasswordServiceFactory, - MasterPasswordServiceInitOptions, -} from "./master-password-service.factory"; -import { PinServiceInitOptions, pinServiceFactory } from "./pin-service.factory"; -import { - userDecryptionOptionsServiceFactory, - UserDecryptionOptionsServiceInitOptions, -} from "./user-decryption-options-service.factory"; -import { - UserVerificationApiServiceInitOptions, - userVerificationApiServiceFactory, -} from "./user-verification-api-service.factory"; - -type UserVerificationServiceFactoryOptions = FactoryOptions; - -export type UserVerificationServiceInitOptions = UserVerificationServiceFactoryOptions & - StateServiceInitOptions & - CryptoServiceInitOptions & - AccountServiceInitOptions & - MasterPasswordServiceInitOptions & - I18nServiceInitOptions & - UserVerificationApiServiceInitOptions & - UserDecryptionOptionsServiceInitOptions & - PinServiceInitOptions & - LogServiceInitOptions & - VaultTimeoutSettingsServiceInitOptions & - PlatformUtilsServiceInitOptions & - KdfConfigServiceInitOptions; - -export function userVerificationServiceFactory( - cache: { userVerificationService?: AbstractUserVerificationService } & CachedServices, - opts: UserVerificationServiceInitOptions, -): Promise { - return factory( - cache, - "userVerificationService", - opts, - async () => - new UserVerificationService( - await stateServiceFactory(cache, opts), - await cryptoServiceFactory(cache, opts), - await accountServiceFactory(cache, opts), - await internalMasterPasswordServiceFactory(cache, opts), - await i18nServiceFactory(cache, opts), - await userVerificationApiServiceFactory(cache, opts), - await userDecryptionOptionsServiceFactory(cache, opts), - await pinServiceFactory(cache, opts), - await logServiceFactory(cache, opts), - await vaultTimeoutSettingsServiceFactory(cache, opts), - await platformUtilsServiceFactory(cache, opts), - await kdfConfigServiceFactory(cache, opts), - ), - ); -} diff --git a/apps/browser/src/auth/popup/account-switching/current-account.component.ts b/apps/browser/src/auth/popup/account-switching/current-account.component.ts index 643c37b9aaa..6c7c1e7d92f 100644 --- a/apps/browser/src/auth/popup/account-switching/current-account.component.ts +++ b/apps/browser/src/auth/popup/account-switching/current-account.component.ts @@ -1,13 +1,15 @@ -import { Location } from "@angular/common"; +import { CommonModule, Location } from "@angular/common"; import { Component } from "@angular/core"; -import { ActivatedRoute, Router } from "@angular/router"; +import { ActivatedRoute, Router, RouterModule } from "@angular/router"; import { Observable, combineLatest, switchMap } from "rxjs"; +import { JslibModule } from "@bitwarden/angular/jslib.module"; import { AccountService } from "@bitwarden/common/auth/abstractions/account.service"; import { AuthService } from "@bitwarden/common/auth/abstractions/auth.service"; import { AvatarService } from "@bitwarden/common/auth/abstractions/avatar.service"; import { AuthenticationStatus } from "@bitwarden/common/auth/enums/authentication-status"; import { UserId } from "@bitwarden/common/types/guid"; +import { AvatarModule } from "@bitwarden/components"; export type CurrentAccount = { id: UserId; @@ -20,6 +22,8 @@ export type CurrentAccount = { @Component({ selector: "app-current-account", templateUrl: "current-account.component.html", + standalone: true, + imports: [CommonModule, JslibModule, AvatarModule, RouterModule], }) export class CurrentAccountComponent { currentAccount$: Observable; diff --git a/apps/browser/src/auth/popup/account-switching/services/account-switcher.service.spec.ts b/apps/browser/src/auth/popup/account-switching/services/account-switcher.service.spec.ts index be12d249441..6865adca393 100644 --- a/apps/browser/src/auth/popup/account-switching/services/account-switcher.service.spec.ts +++ b/apps/browser/src/auth/popup/account-switching/services/account-switcher.service.spec.ts @@ -153,7 +153,7 @@ describe("AccountSwitcherService", () => { await selectAccountPromise; - expect(accountService.switchAccount).toBeCalledWith(null); + expect(messagingService.send).toHaveBeenCalledWith("switchAccount", { userId: null }); expect(removeListenerSpy).toBeCalledTimes(1); }); @@ -176,7 +176,7 @@ describe("AccountSwitcherService", () => { await selectAccountPromise; - expect(accountService.switchAccount).toBeCalledWith("1"); + expect(messagingService.send).toHaveBeenCalledWith("switchAccount", { userId: "1" }); expect(messagingService.send).toBeCalledWith( "switchAccount", matches((payload) => { diff --git a/apps/browser/src/auth/popup/account-switching/services/account-switcher.service.ts b/apps/browser/src/auth/popup/account-switching/services/account-switcher.service.ts index 2650c2db4e4..d60b0dfaebc 100644 --- a/apps/browser/src/auth/popup/account-switching/services/account-switcher.service.ts +++ b/apps/browser/src/auth/popup/account-switching/services/account-switcher.service.ts @@ -134,7 +134,6 @@ export class AccountSwitcherService { const switchAccountFinishedPromise = this.listenForSwitchAccountFinish(userId); // Initiate the actions required to make account switching happen - await this.accountService.switchAccount(userId); this.messagingService.send("switchAccount", { userId }); // This message should cause switchAccountFinish to be sent // Wait until we receive the switchAccountFinished message diff --git a/apps/browser/src/auth/popup/login-via-auth-request.component.ts b/apps/browser/src/auth/popup/login-via-auth-request.component.ts index 158296058e5..69d3204701e 100644 --- a/apps/browser/src/auth/popup/login-via-auth-request.component.ts +++ b/apps/browser/src/auth/popup/login-via-auth-request.component.ts @@ -20,7 +20,6 @@ import { EnvironmentService } from "@bitwarden/common/platform/abstractions/envi import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; import { LogService } from "@bitwarden/common/platform/abstractions/log.service"; import { PlatformUtilsService } from "@bitwarden/common/platform/abstractions/platform-utils.service"; -import { StateService } from "@bitwarden/common/platform/abstractions/state.service"; import { ValidationService } from "@bitwarden/common/platform/abstractions/validation.service"; import { PasswordGenerationServiceAbstraction } from "@bitwarden/common/tools/generator/password"; import { SyncService } from "@bitwarden/common/vault/abstractions/sync/sync.service.abstraction"; @@ -44,7 +43,6 @@ export class LoginViaAuthRequestComponent extends BaseLoginWithDeviceComponent { platformUtilsService: PlatformUtilsService, anonymousHubService: AnonymousHubService, validationService: ValidationService, - stateService: StateService, loginEmailService: LoginEmailServiceAbstraction, syncService: SyncService, deviceTrustService: DeviceTrustServiceAbstraction, @@ -67,12 +65,11 @@ export class LoginViaAuthRequestComponent extends BaseLoginWithDeviceComponent { platformUtilsService, anonymousHubService, validationService, - stateService, + accountService, loginEmailService, deviceTrustService, authRequestService, loginStrategyService, - accountService, ); super.onSuccessfulLogin = async () => { await syncService.fullSync(true); diff --git a/apps/browser/src/autofill/background/overlay.background.spec.ts b/apps/browser/src/autofill/background/overlay.background.spec.ts index e65397a62b1..9f4da8f21f3 100644 --- a/apps/browser/src/autofill/background/overlay.background.spec.ts +++ b/apps/browser/src/autofill/background/overlay.background.spec.ts @@ -1,4 +1,4 @@ -import { mock, mockReset } from "jest-mock-extended"; +import { mock, MockProxy, mockReset } from "jest-mock-extended"; import { BehaviorSubject, of } from "rxjs"; import { AuthenticationStatus } from "@bitwarden/common/auth/enums/authentication-status"; @@ -62,7 +62,8 @@ describe("OverlayBackground", () => { let overlayBackground: OverlayBackground; const cipherService = mock(); const autofillService = mock(); - const authService = mock(); + let activeAccountStatusMock$: BehaviorSubject; + let authService: MockProxy; const environmentService = mock(); environmentService.environment$ = new BehaviorSubject( @@ -94,6 +95,9 @@ describe("OverlayBackground", () => { beforeEach(() => { domainSettingsService = new DefaultDomainSettingsService(fakeStateProvider); + activeAccountStatusMock$ = new BehaviorSubject(AuthenticationStatus.Unlocked); + authService = mock(); + authService.activeAccountStatus$ = activeAccountStatusMock$; overlayBackground = new OverlayBackground( cipherService, autofillService, @@ -166,11 +170,11 @@ describe("OverlayBackground", () => { }); beforeEach(() => { - overlayBackground["userAuthStatus"] = AuthenticationStatus.Unlocked; + activeAccountStatusMock$.next(AuthenticationStatus.Unlocked); }); it("ignores updating the overlay ciphers if the user's auth status is not unlocked", async () => { - overlayBackground["userAuthStatus"] = AuthenticationStatus.Locked; + activeAccountStatusMock$.next(AuthenticationStatus.Locked); jest.spyOn(BrowserApi, "getTabFromCurrentWindowId"); jest.spyOn(cipherService, "getAllDecryptedForUrl"); diff --git a/apps/browser/src/autofill/background/overlay.background.ts b/apps/browser/src/autofill/background/overlay.background.ts index 551263525e9..0e4abcd82d0 100644 --- a/apps/browser/src/autofill/background/overlay.background.ts +++ b/apps/browser/src/autofill/background/overlay.background.ts @@ -136,7 +136,8 @@ class OverlayBackground implements OverlayBackgroundInterface { * list of ciphers if the extension is not unlocked. */ async updateOverlayCiphers() { - if (this.userAuthStatus !== AuthenticationStatus.Unlocked) { + const authStatus = await firstValueFrom(this.authService.activeAccountStatus$); + if (authStatus !== AuthenticationStatus.Unlocked) { return; } @@ -167,7 +168,7 @@ class OverlayBackground implements OverlayBackgroundInterface { private async getOverlayCipherData(): Promise { const showFavicons = await firstValueFrom(this.domainSettingsService.showFavicons$); const overlayCiphersArray = Array.from(this.overlayLoginCiphers); - const overlayCipherData = []; + const overlayCipherData: OverlayCipherData[] = []; let loginCipherIcon: WebsiteIconData; for (let cipherIndex = 0; cipherIndex < overlayCiphersArray.length; cipherIndex++) { diff --git a/apps/browser/src/autofill/background/service_factories/autofill-service.factory.ts b/apps/browser/src/autofill/background/service_factories/autofill-service.factory.ts deleted file mode 100644 index bee5da18b5b..00000000000 --- a/apps/browser/src/autofill/background/service_factories/autofill-service.factory.ts +++ /dev/null @@ -1,82 +0,0 @@ -import { - accountServiceFactory, - AccountServiceInitOptions, -} from "../../../auth/background/service-factories/account-service.factory"; -import { - UserVerificationServiceInitOptions, - userVerificationServiceFactory, -} from "../../../auth/background/service-factories/user-verification-service.factory"; -import { - EventCollectionServiceInitOptions, - eventCollectionServiceFactory, -} from "../../../background/service-factories/event-collection-service.factory"; -import { billingAccountProfileStateServiceFactory } from "../../../platform/background/service-factories/billing-account-profile-state-service.factory"; -import { - browserScriptInjectorServiceFactory, - BrowserScriptInjectorServiceInitOptions, -} from "../../../platform/background/service-factories/browser-script-injector-service.factory"; -import { - CachedServices, - factory, - FactoryOptions, -} from "../../../platform/background/service-factories/factory-options"; -import { - logServiceFactory, - LogServiceInitOptions, -} from "../../../platform/background/service-factories/log-service.factory"; -import { - cipherServiceFactory, - CipherServiceInitOptions, -} from "../../../vault/background/service_factories/cipher-service.factory"; -import { - TotpServiceInitOptions, - totpServiceFactory, -} from "../../../vault/background/service_factories/totp-service.factory"; -import { AutofillService as AbstractAutoFillService } from "../../services/abstractions/autofill.service"; -import AutofillService from "../../services/autofill.service"; - -import { - AutofillSettingsServiceInitOptions, - autofillSettingsServiceFactory, -} from "./autofill-settings-service.factory"; -import { - DomainSettingsServiceInitOptions, - domainSettingsServiceFactory, -} from "./domain-settings-service.factory"; - -type AutoFillServiceOptions = FactoryOptions; - -export type AutoFillServiceInitOptions = AutoFillServiceOptions & - CipherServiceInitOptions & - AutofillSettingsServiceInitOptions & - TotpServiceInitOptions & - EventCollectionServiceInitOptions & - LogServiceInitOptions & - UserVerificationServiceInitOptions & - DomainSettingsServiceInitOptions & - BrowserScriptInjectorServiceInitOptions & - AccountServiceInitOptions; - -export function autofillServiceFactory( - cache: { autofillService?: AbstractAutoFillService } & CachedServices, - opts: AutoFillServiceInitOptions, -): Promise { - return factory( - cache, - "autofillService", - opts, - async () => - new AutofillService( - await cipherServiceFactory(cache, opts), - await autofillSettingsServiceFactory(cache, opts), - await totpServiceFactory(cache, opts), - await eventCollectionServiceFactory(cache, opts), - await logServiceFactory(cache, opts), - await domainSettingsServiceFactory(cache, opts), - await userVerificationServiceFactory(cache, opts), - await billingAccountProfileStateServiceFactory(cache, opts), - await browserScriptInjectorServiceFactory(cache, opts), - await accountServiceFactory(cache, opts), - ), - ); -} diff --git a/apps/browser/src/autofill/background/service_factories/autofill-settings-service.factory.ts b/apps/browser/src/autofill/background/service_factories/autofill-settings-service.factory.ts deleted file mode 100644 index ef9fdac968c..00000000000 --- a/apps/browser/src/autofill/background/service_factories/autofill-settings-service.factory.ts +++ /dev/null @@ -1,35 +0,0 @@ -import { AutofillSettingsService } from "@bitwarden/common/autofill/services/autofill-settings.service"; - -import { - policyServiceFactory, - PolicyServiceInitOptions, -} from "../../../admin-console/background/service-factories/policy-service.factory"; -import { - CachedServices, - factory, - FactoryOptions, -} from "../../../platform/background/service-factories/factory-options"; -import { - stateProviderFactory, - StateProviderInitOptions, -} from "../../../platform/background/service-factories/state-provider.factory"; - -export type AutofillSettingsServiceInitOptions = FactoryOptions & - StateProviderInitOptions & - PolicyServiceInitOptions; - -export function autofillSettingsServiceFactory( - cache: { autofillSettingsService?: AutofillSettingsService } & CachedServices, - opts: AutofillSettingsServiceInitOptions, -): Promise { - return factory( - cache, - "autofillSettingsService", - opts, - async () => - new AutofillSettingsService( - await stateProviderFactory(cache, opts), - await policyServiceFactory(cache, opts), - ), - ); -} diff --git a/apps/browser/src/autofill/background/service_factories/badge-settings-service.factory.ts b/apps/browser/src/autofill/background/service_factories/badge-settings-service.factory.ts deleted file mode 100644 index c51a9b31b01..00000000000 --- a/apps/browser/src/autofill/background/service_factories/badge-settings-service.factory.ts +++ /dev/null @@ -1,25 +0,0 @@ -import { BadgeSettingsService } from "@bitwarden/common/autofill/services/badge-settings.service"; - -import { - CachedServices, - factory, - FactoryOptions, -} from "../../../platform/background/service-factories/factory-options"; -import { - stateProviderFactory, - StateProviderInitOptions, -} from "../../../platform/background/service-factories/state-provider.factory"; - -export type BadgeSettingsServiceInitOptions = FactoryOptions & StateProviderInitOptions; - -export function badgeSettingsServiceFactory( - cache: { badgeSettingsService?: BadgeSettingsService } & CachedServices, - opts: BadgeSettingsServiceInitOptions, -): Promise { - return factory( - cache, - "badgeSettingsService", - opts, - async () => new BadgeSettingsService(await stateProviderFactory(cache, opts)), - ); -} diff --git a/apps/browser/src/autofill/background/service_factories/domain-settings-service.factory.ts b/apps/browser/src/autofill/background/service_factories/domain-settings-service.factory.ts deleted file mode 100644 index 1b4127c4ccb..00000000000 --- a/apps/browser/src/autofill/background/service_factories/domain-settings-service.factory.ts +++ /dev/null @@ -1,25 +0,0 @@ -import { DefaultDomainSettingsService } from "@bitwarden/common/autofill/services/domain-settings.service"; - -import { - CachedServices, - factory, - FactoryOptions, -} from "../../../platform/background/service-factories/factory-options"; -import { - stateProviderFactory, - StateProviderInitOptions, -} from "../../../platform/background/service-factories/state-provider.factory"; - -export type DomainSettingsServiceInitOptions = FactoryOptions & StateProviderInitOptions; - -export function domainSettingsServiceFactory( - cache: { domainSettingsService?: DefaultDomainSettingsService } & CachedServices, - opts: DomainSettingsServiceInitOptions, -): Promise { - return factory( - cache, - "domainSettingsService", - opts, - async () => new DefaultDomainSettingsService(await stateProviderFactory(cache, opts)), - ); -} diff --git a/apps/browser/src/autofill/background/service_factories/user-notification-settings-service.factory.ts b/apps/browser/src/autofill/background/service_factories/user-notification-settings-service.factory.ts deleted file mode 100644 index 5e19795e0e6..00000000000 --- a/apps/browser/src/autofill/background/service_factories/user-notification-settings-service.factory.ts +++ /dev/null @@ -1,25 +0,0 @@ -import { UserNotificationSettingsService } from "@bitwarden/common/autofill/services/user-notification-settings.service"; - -import { - CachedServices, - factory, - FactoryOptions, -} from "../../../platform/background/service-factories/factory-options"; -import { - stateProviderFactory, - StateProviderInitOptions, -} from "../../../platform/background/service-factories/state-provider.factory"; - -export type UserNotificationSettingsServiceInitOptions = FactoryOptions & StateProviderInitOptions; - -export function userNotificationSettingsServiceFactory( - cache: { userNotificationSettingsService?: UserNotificationSettingsService } & CachedServices, - opts: UserNotificationSettingsServiceInitOptions, -): Promise { - return factory( - cache, - "userNotificationSettingsService", - opts, - async () => new UserNotificationSettingsService(await stateProviderFactory(cache, opts)), - ); -} diff --git a/apps/browser/src/autofill/browser/cipher-context-menu-handler.ts b/apps/browser/src/autofill/browser/cipher-context-menu-handler.ts index d66d4361db2..b112ff00efe 100644 --- a/apps/browser/src/autofill/browser/cipher-context-menu-handler.ts +++ b/apps/browser/src/autofill/browser/cipher-context-menu-handler.ts @@ -1,39 +1,14 @@ import { AuthService } from "@bitwarden/common/auth/abstractions/auth.service"; import { AuthenticationStatus } from "@bitwarden/common/auth/enums/authentication-status"; -import { StateFactory } from "@bitwarden/common/platform/factories/state-factory"; import { Utils } from "@bitwarden/common/platform/misc/utils"; -import { GlobalState } from "@bitwarden/common/platform/models/domain/global-state"; import { CipherService } from "@bitwarden/common/vault/abstractions/cipher.service"; import { CipherType } from "@bitwarden/common/vault/enums"; import { CipherView } from "@bitwarden/common/vault/models/view/cipher.view"; -import { - authServiceFactory, - AuthServiceInitOptions, -} from "../../auth/background/service-factories/auth-service.factory"; -import { Account } from "../../models/account"; -import { CachedServices } from "../../platform/background/service-factories/factory-options"; -import { BrowserApi } from "../../platform/browser/browser-api"; -import { - cipherServiceFactory, - CipherServiceInitOptions, -} from "../../vault/background/service_factories/cipher-service.factory"; import { AutofillCipherTypeId } from "../types"; import { MainContextMenuHandler } from "./main-context-menu-handler"; -const NOT_IMPLEMENTED = (..._args: unknown[]) => Promise.resolve(); - -const LISTENED_TO_COMMANDS = [ - "loggedIn", - "unlocked", - "syncCompleted", - "bgUpdateContextMenu", - "editedCipher", - "addedCipher", - "deletedCipher", -]; - export class CipherContextMenuHandler { constructor( private mainContextMenuHandler: MainContextMenuHandler, @@ -41,110 +16,6 @@ export class CipherContextMenuHandler { private cipherService: CipherService, ) {} - static async create(cachedServices: CachedServices) { - const stateFactory = new StateFactory(GlobalState, Account); - const serviceOptions: AuthServiceInitOptions & CipherServiceInitOptions = { - apiServiceOptions: { - logoutCallback: NOT_IMPLEMENTED, - }, - cryptoFunctionServiceOptions: { - win: self, - }, - encryptServiceOptions: { - logMacFailures: false, - }, - i18nServiceOptions: { - systemLanguage: chrome.i18n.getUILanguage(), - }, - keyConnectorServiceOptions: { - logoutCallback: NOT_IMPLEMENTED, - }, - logServiceOptions: { - isDev: false, - }, - platformUtilsServiceOptions: { - biometricCallback: () => Promise.resolve(false), - clipboardWriteCallback: NOT_IMPLEMENTED, - win: self, - }, - stateServiceOptions: { - stateFactory: stateFactory, - }, - }; - return new CipherContextMenuHandler( - await MainContextMenuHandler.mv3Create(cachedServices), - await authServiceFactory(cachedServices, serviceOptions), - await cipherServiceFactory(cachedServices, serviceOptions), - ); - } - - static async windowsOnFocusChangedListener(windowId: number, serviceCache: CachedServices) { - const cipherContextMenuHandler = await CipherContextMenuHandler.create(serviceCache); - const tab = await BrowserApi.getTabFromCurrentWindow(); - await cipherContextMenuHandler.update(tab?.url); - } - - static async tabsOnActivatedListener( - activeInfo: chrome.tabs.TabActiveInfo, - serviceCache: CachedServices, - ) { - const cipherContextMenuHandler = await CipherContextMenuHandler.create(serviceCache); - const tab = await BrowserApi.getTab(activeInfo.tabId); - await cipherContextMenuHandler.update(tab.url); - } - - static async tabsOnReplacedListener( - addedTabId: number, - removedTabId: number, - serviceCache: CachedServices, - ) { - const cipherContextMenuHandler = await CipherContextMenuHandler.create(serviceCache); - const tab = await BrowserApi.getTab(addedTabId); - await cipherContextMenuHandler.update(tab.url); - } - - static async tabsOnUpdatedListener( - tabId: number, - changeInfo: chrome.tabs.TabChangeInfo, - tab: chrome.tabs.Tab, - serviceCache: CachedServices, - ) { - if (changeInfo.status !== "complete") { - return; - } - const cipherContextMenuHandler = await CipherContextMenuHandler.create(serviceCache); - await cipherContextMenuHandler.update(tab.url); - } - - static async messageListener( - message: { command: string }, - sender: chrome.runtime.MessageSender, - cachedServices: CachedServices, - ) { - if (!CipherContextMenuHandler.shouldListen(message)) { - return; - } - const cipherContextMenuHandler = await CipherContextMenuHandler.create(cachedServices); - await cipherContextMenuHandler.messageListener(message); - } - - private static shouldListen(message: { command: string }) { - return LISTENED_TO_COMMANDS.includes(message.command); - } - - async messageListener(message: { command: string }, sender?: chrome.runtime.MessageSender) { - if (!CipherContextMenuHandler.shouldListen(message)) { - return; - } - - const activeTabs = await BrowserApi.getActiveTabs(); - if (!activeTabs || activeTabs.length === 0) { - return; - } - - await this.update(activeTabs[0].url); - } - async update(url: string) { if (this.mainContextMenuHandler.initRunning) { return; diff --git a/apps/browser/src/autofill/browser/context-menu-clicked-handler.ts b/apps/browser/src/autofill/browser/context-menu-clicked-handler.ts index 5ba48a9f278..cb1c59dca59 100644 --- a/apps/browser/src/autofill/browser/context-menu-clicked-handler.ts +++ b/apps/browser/src/autofill/browser/context-menu-clicked-handler.ts @@ -20,41 +20,19 @@ import { NOOP_COMMAND_SUFFIX, } from "@bitwarden/common/autofill/constants"; import { EventType } from "@bitwarden/common/enums"; -import { StateFactory } from "@bitwarden/common/platform/factories/state-factory"; -import { GlobalState } from "@bitwarden/common/platform/models/domain/global-state"; import { CipherService } from "@bitwarden/common/vault/abstractions/cipher.service"; import { TotpService } from "@bitwarden/common/vault/abstractions/totp.service"; import { CipherType } from "@bitwarden/common/vault/enums"; import { CipherRepromptType } from "@bitwarden/common/vault/enums/cipher-reprompt-type"; import { CipherView } from "@bitwarden/common/vault/models/view/cipher.view"; -import { accountServiceFactory } from "../../auth/background/service-factories/account-service.factory"; -import { - authServiceFactory, - AuthServiceInitOptions, -} from "../../auth/background/service-factories/auth-service.factory"; -import { KeyConnectorServiceInitOptions } from "../../auth/background/service-factories/key-connector-service.factory"; -import { userVerificationServiceFactory } from "../../auth/background/service-factories/user-verification-service.factory"; import { openUnlockPopout } from "../../auth/popup/utils/auth-popout-window"; -import { autofillSettingsServiceFactory } from "../../autofill/background/service_factories/autofill-settings-service.factory"; -import { eventCollectionServiceFactory } from "../../background/service-factories/event-collection-service.factory"; -import { Account } from "../../models/account"; -import { CachedServices } from "../../platform/background/service-factories/factory-options"; import { BrowserApi } from "../../platform/browser/browser-api"; -import { passwordGenerationServiceFactory } from "../../tools/background/service_factories/password-generation-service.factory"; -import { - cipherServiceFactory, - CipherServiceInitOptions, -} from "../../vault/background/service_factories/cipher-service.factory"; -import { totpServiceFactory } from "../../vault/background/service_factories/totp-service.factory"; import { openAddEditVaultItemPopout, openVaultItemPasswordRepromptPopout, } from "../../vault/popup/utils/vault-popout-window"; import { LockedVaultPendingNotificationsData } from "../background/abstractions/notification.background"; -import { autofillServiceFactory } from "../background/service_factories/autofill-service.factory"; -import { copyToClipboard, GeneratePasswordToClipboardCommand } from "../clipboard"; -import { AutofillTabCommand } from "../commands/autofill-tab-command"; import { AutofillCipherTypeId } from "../types"; export type CopyToClipboardOptions = { text: string; tab: chrome.tabs.Tab }; @@ -63,9 +41,6 @@ export type AutofillAction = (tab: chrome.tabs.Tab, cipher: CipherView) => Promi export type GeneratePasswordToClipboardAction = (tab: chrome.tabs.Tab) => Promise; -const NOT_IMPLEMENTED = (..._args: unknown[]) => - Promise.reject("This action is not implemented inside of a service worker context."); - export class ContextMenuClickedHandler { constructor( private copyToClipboard: CopyToClipboardAction, @@ -79,92 +54,6 @@ export class ContextMenuClickedHandler { private accountService: AccountService, ) {} - static async mv3Create(cachedServices: CachedServices) { - const stateFactory = new StateFactory(GlobalState, Account); - const serviceOptions: AuthServiceInitOptions & - CipherServiceInitOptions & - KeyConnectorServiceInitOptions = { - apiServiceOptions: { - logoutCallback: NOT_IMPLEMENTED, - }, - cryptoFunctionServiceOptions: { - win: self, - }, - encryptServiceOptions: { - logMacFailures: false, - }, - i18nServiceOptions: { - systemLanguage: chrome.i18n.getUILanguage(), - }, - keyConnectorServiceOptions: { - logoutCallback: NOT_IMPLEMENTED, - }, - logServiceOptions: { - isDev: false, - }, - platformUtilsServiceOptions: { - biometricCallback: NOT_IMPLEMENTED, - clipboardWriteCallback: NOT_IMPLEMENTED, - win: self, - }, - stateServiceOptions: { - stateFactory: stateFactory, - }, - autofillSettingsServiceOptions: { - stateFactory: autofillSettingsServiceFactory, - }, - }; - - const generatePasswordToClipboardCommand = new GeneratePasswordToClipboardCommand( - await passwordGenerationServiceFactory(cachedServices, serviceOptions), - await autofillSettingsServiceFactory(cachedServices, serviceOptions), - ); - - const autofillCommand = new AutofillTabCommand( - await autofillServiceFactory(cachedServices, serviceOptions), - ); - - return new ContextMenuClickedHandler( - (options) => copyToClipboard(options.tab, options.text), - (tab) => generatePasswordToClipboardCommand.generatePasswordToClipboard(tab), - (tab, cipher) => autofillCommand.doAutofillTabWithCipherCommand(tab, cipher), - await authServiceFactory(cachedServices, serviceOptions), - await cipherServiceFactory(cachedServices, serviceOptions), - await totpServiceFactory(cachedServices, serviceOptions), - await eventCollectionServiceFactory(cachedServices, serviceOptions), - await userVerificationServiceFactory(cachedServices, serviceOptions), - await accountServiceFactory(cachedServices, serviceOptions), - ); - } - - static async onClickedListener( - info: chrome.contextMenus.OnClickData, - tab?: chrome.tabs.Tab, - cachedServices: CachedServices = {}, - ) { - const contextMenuClickedHandler = await ContextMenuClickedHandler.mv3Create(cachedServices); - await contextMenuClickedHandler.run(info, tab); - } - - static async messageListener( - message: { command: string; data: LockedVaultPendingNotificationsData }, - sender: chrome.runtime.MessageSender, - cachedServices: CachedServices, - ) { - if ( - message.command !== "unlockCompleted" || - message.data.target !== "contextmenus.background" - ) { - return; - } - - const contextMenuClickedHandler = await ContextMenuClickedHandler.mv3Create(cachedServices); - await contextMenuClickedHandler.run( - message.data.commandToRetry.message.contextMenuOnClickData, - message.data.commandToRetry.sender.tab, - ); - } - async run(info: chrome.contextMenus.OnClickData, tab: chrome.tabs.Tab) { if (!tab) { return; diff --git a/apps/browser/src/autofill/browser/main-context-menu-handler.ts b/apps/browser/src/autofill/browser/main-context-menu-handler.ts index 9422756e07b..a02a3a84d4b 100644 --- a/apps/browser/src/autofill/browser/main-context-menu-handler.ts +++ b/apps/browser/src/autofill/browser/main-context-menu-handler.ts @@ -20,28 +20,10 @@ import { AutofillSettingsServiceAbstraction } from "@bitwarden/common/autofill/s import { BillingAccountProfileStateService } from "@bitwarden/common/billing/abstractions/account/billing-account-profile-state.service"; import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; import { LogService } from "@bitwarden/common/platform/abstractions/log.service"; -import { StateFactory } from "@bitwarden/common/platform/factories/state-factory"; import { Utils } from "@bitwarden/common/platform/misc/utils"; -import { GlobalState } from "@bitwarden/common/platform/models/domain/global-state"; import { CipherType } from "@bitwarden/common/vault/enums"; import { CipherView } from "@bitwarden/common/vault/models/view/cipher.view"; -import { autofillSettingsServiceFactory } from "../../autofill/background/service_factories/autofill-settings-service.factory"; -import { Account } from "../../models/account"; -import { billingAccountProfileStateServiceFactory } from "../../platform/background/service-factories/billing-account-profile-state-service.factory"; -import { CachedServices } from "../../platform/background/service-factories/factory-options"; -import { - i18nServiceFactory, - I18nServiceInitOptions, -} from "../../platform/background/service-factories/i18n-service.factory"; -import { - logServiceFactory, - LogServiceInitOptions, -} from "../../platform/background/service-factories/log-service.factory"; -import { - stateServiceFactory, - StateServiceInitOptions, -} from "../../platform/background/service-factories/state-service.factory"; import { BrowserStateService } from "../../platform/services/abstractions/browser-state.service"; import { InitContextMenuItems } from "./abstractions/main-context-menu-handler"; @@ -168,41 +150,6 @@ export class MainContextMenuHandler { private billingAccountProfileStateService: BillingAccountProfileStateService, ) {} - static async mv3Create(cachedServices: CachedServices) { - const stateFactory = new StateFactory(GlobalState, Account); - const serviceOptions: StateServiceInitOptions & I18nServiceInitOptions & LogServiceInitOptions = - { - cryptoFunctionServiceOptions: { - win: self, - }, - encryptServiceOptions: { - logMacFailures: false, - }, - i18nServiceOptions: { - systemLanguage: chrome.i18n.getUILanguage(), - }, - logServiceOptions: { - isDev: false, - }, - stateServiceOptions: { - stateFactory: stateFactory, - }, - platformUtilsServiceOptions: { - clipboardWriteCallback: () => Promise.resolve(), - biometricCallback: () => Promise.resolve(false), - win: self, - }, - }; - - return new MainContextMenuHandler( - await stateServiceFactory(cachedServices, serviceOptions), - await autofillSettingsServiceFactory(cachedServices, serviceOptions), - await i18nServiceFactory(cachedServices, serviceOptions), - await logServiceFactory(cachedServices, serviceOptions), - await billingAccountProfileStateServiceFactory(cachedServices, serviceOptions), - ); - } - /** * * @returns a boolean showing whether or not items were created diff --git a/apps/browser/src/autofill/content/autofill-init.spec.ts b/apps/browser/src/autofill/content/autofill-init.spec.ts index 8f1a8bf9921..13515f6de28 100644 --- a/apps/browser/src/autofill/content/autofill-init.spec.ts +++ b/apps/browser/src/autofill/content/autofill-init.spec.ts @@ -6,7 +6,11 @@ import { AutofillOverlayVisibility } from "@bitwarden/common/autofill/constants" import AutofillPageDetails from "../models/autofill-page-details"; import AutofillScript from "../models/autofill-script"; import AutofillOverlayContentService from "../services/autofill-overlay-content.service"; -import { flushPromises, sendExtensionRuntimeMessage } from "../spec/testing-utils"; +import { + flushPromises, + mockQuerySelectorAllDefinedCall, + sendExtensionRuntimeMessage, +} from "../spec/testing-utils"; import { RedirectFocusDirection } from "../utils/autofill-overlay.enum"; import { AutofillExtensionMessage } from "./abstractions/autofill-init"; @@ -16,6 +20,7 @@ describe("AutofillInit", () => { let autofillInit: AutofillInit; const autofillOverlayContentService = mock(); const originalDocumentReadyState = document.readyState; + const mockQuerySelectorAll = mockQuerySelectorAllDefinedCall(); beforeEach(() => { chrome.runtime.connect = jest.fn().mockReturnValue({ @@ -36,6 +41,10 @@ describe("AutofillInit", () => { }); }); + afterAll(() => { + mockQuerySelectorAll.mockRestore(); + }); + describe("init", () => { it("sets up the extension message listeners", () => { jest.spyOn(autofillInit as any, "setupExtensionMessageListeners"); @@ -200,7 +209,12 @@ describe("AutofillInit", () => { expect(autofillInit["collectAutofillContentService"].getPageDetails).toHaveBeenCalled(); expect(sendResponse).toBeCalledWith(pageDetails); - expect(chrome.runtime.sendMessage).not.toHaveBeenCalled(); + expect(chrome.runtime.sendMessage).not.toHaveBeenCalledWith({ + command: "collectPageDetailsResponse", + tab: message.tab, + details: pageDetails, + sender: message.sender, + }); }); }); diff --git a/apps/browser/src/autofill/popup/settings/autofill.component.ts b/apps/browser/src/autofill/popup/settings/autofill.component.ts index 67cc25f2276..1c6583331f4 100644 --- a/apps/browser/src/autofill/popup/settings/autofill.component.ts +++ b/apps/browser/src/autofill/popup/settings/autofill.component.ts @@ -105,11 +105,7 @@ export class AutofillComponent implements OnInit { } async updateAutoFillOverlayVisibility() { - const previousAutoFillOverlayVisibility = await firstValueFrom( - this.autofillSettingsService.inlineMenuVisibility$, - ); await this.autofillSettingsService.setInlineMenuVisibility(this.autoFillOverlayVisibility); - await this.handleUpdatingAutofillOverlayContentScripts(previousAutoFillOverlayVisibility); await this.requestPrivacyPermission(); } @@ -181,27 +177,6 @@ export class AutofillComponent implements OnInit { BrowserApi.createNewTab(this.disablePasswordManagerLink); } - private async handleUpdatingAutofillOverlayContentScripts( - previousAutoFillOverlayVisibility: number, - ) { - const autofillOverlayPreviouslyDisabled = - previousAutoFillOverlayVisibility === AutofillOverlayVisibility.Off; - const autofillOverlayCurrentlyDisabled = - this.autoFillOverlayVisibility === AutofillOverlayVisibility.Off; - - if (!autofillOverlayPreviouslyDisabled && !autofillOverlayCurrentlyDisabled) { - const tabs = await BrowserApi.tabsQuery({}); - tabs.forEach((tab) => - BrowserApi.tabSendMessageData(tab, "updateAutofillOverlayVisibility", { - autofillOverlayVisibility: this.autoFillOverlayVisibility, - }), - ); - return; - } - - await this.autofillService.reloadAutofillScripts(); - } - async requestPrivacyPermission() { if ( this.autoFillOverlayVisibility === AutofillOverlayVisibility.Off || diff --git a/apps/browser/src/autofill/popup/settings/notifications.component.ts b/apps/browser/src/autofill/popup/settings/notifications.component.ts index 8e092192757..f4a7773916e 100644 --- a/apps/browser/src/autofill/popup/settings/notifications.component.ts +++ b/apps/browser/src/autofill/popup/settings/notifications.component.ts @@ -10,7 +10,7 @@ import { enableAccountSwitching } from "../../../platform/flags"; selector: "autofill-notification-settings", templateUrl: "notifications.component.html", }) -export class NotifcationsSettingsComponent implements OnInit { +export class NotificationsSettingsComponent implements OnInit { enableAddLoginNotification = false; enableChangedPasswordNotification = false; enablePasskeys = true; diff --git a/apps/browser/src/autofill/services/abstractions/collect-autofill-content.service.ts b/apps/browser/src/autofill/services/abstractions/collect-autofill-content.service.ts index 46ad615059a..d17d7842dcc 100644 --- a/apps/browser/src/autofill/services/abstractions/collect-autofill-content.service.ts +++ b/apps/browser/src/autofill/services/abstractions/collect-autofill-content.service.ts @@ -17,11 +17,11 @@ type UpdateAutofillDataAttributeParams = { interface CollectAutofillContentService { getPageDetails(): Promise; getAutofillFieldElementByOpid(opid: string): HTMLElement | null; - queryAllTreeWalkerNodes( - rootNode: Node, - filterCallback: CallableFunction, + deepQueryElements( + root: Document | ShadowRoot | Element, + selector: string, isObservingShadowRoot?: boolean, - ): Node[]; + ): T[]; destroy(): void; } diff --git a/apps/browser/src/autofill/services/autofill.service.spec.ts b/apps/browser/src/autofill/services/autofill.service.spec.ts index 158fde6a567..24b1c90b3fa 100644 --- a/apps/browser/src/autofill/services/autofill.service.spec.ts +++ b/apps/browser/src/autofill/services/autofill.service.spec.ts @@ -1,5 +1,5 @@ -import { mock, mockReset } from "jest-mock-extended"; -import { of } from "rxjs"; +import { mock, mockReset, MockProxy } from "jest-mock-extended"; +import { BehaviorSubject, of } from "rxjs"; import { UserVerificationService } from "@bitwarden/common/auth/services/user-verification/user-verification.service"; import { AutofillOverlayVisibility } from "@bitwarden/common/autofill/constants"; @@ -8,6 +8,7 @@ import { DefaultDomainSettingsService, DomainSettingsService, } from "@bitwarden/common/autofill/services/domain-settings.service"; +import { InlineMenuVisibilitySetting } from "@bitwarden/common/autofill/types"; import { BillingAccountProfileStateService } from "@bitwarden/common/billing/abstractions/account/billing-account-profile-state.service"; import { EventType } from "@bitwarden/common/enums"; import { UriMatchStrategy } from "@bitwarden/common/models/domain/domain-service"; @@ -45,7 +46,7 @@ import { createChromeTabMock, createGenerateFillScriptOptionsMock, } from "../spec/autofill-mocks"; -import { triggerTestFailure } from "../spec/testing-utils"; +import { flushPromises, triggerTestFailure } from "../spec/testing-utils"; import { AutoFillOptions, @@ -64,7 +65,8 @@ const mockEquivalentDomains = [ describe("AutofillService", () => { let autofillService: AutofillService; const cipherService = mock(); - const autofillSettingsService = mock(); + let inlineMenuVisibilityMock$!: BehaviorSubject; + let autofillSettingsService: MockProxy; const mockUserId = Utils.newGuid() as UserId; const accountService: FakeAccountService = mockAccountServiceWith(mockUserId); const fakeStateProvider: FakeStateProvider = new FakeStateProvider(accountService); @@ -79,6 +81,9 @@ describe("AutofillService", () => { beforeEach(() => { scriptInjectorService = new BrowserScriptInjectorService(platformUtilsService, logService); + inlineMenuVisibilityMock$ = new BehaviorSubject(AutofillOverlayVisibility.OnFieldFocus); + autofillSettingsService = mock(); + (autofillSettingsService as any).inlineMenuVisibility$ = inlineMenuVisibilityMock$; autofillService = new AutofillService( cipherService, autofillSettingsService, @@ -142,17 +147,92 @@ describe("AutofillService", () => { // eslint-disable-next-line no-restricted-syntax expect(chrome.runtime.onConnect.addListener).toHaveBeenCalledWith(expect.any(Function)); }); + + describe("handle inline menu visibility change", () => { + beforeEach(async () => { + await autofillService.loadAutofillScriptsOnInstall(); + jest.spyOn(BrowserApi, "tabsQuery").mockResolvedValue([tab1, tab2]); + jest.spyOn(BrowserApi, "tabSendMessageData").mockImplementation(); + jest.spyOn(autofillService, "reloadAutofillScripts").mockImplementation(); + }); + + it("returns early if the setting is being initialized", async () => { + await flushPromises(); + + expect(BrowserApi.tabsQuery).toHaveBeenCalledTimes(1); + expect(BrowserApi.tabSendMessageData).not.toHaveBeenCalled(); + }); + + it("returns early if the previous setting is equivalent to the new setting", async () => { + inlineMenuVisibilityMock$.next(AutofillOverlayVisibility.OnFieldFocus); + await flushPromises(); + + expect(BrowserApi.tabsQuery).toHaveBeenCalledTimes(1); + expect(BrowserApi.tabSendMessageData).not.toHaveBeenCalled(); + }); + + describe("updates the inline menu visibility setting", () => { + it("when changing the inline menu from on focus of field to on button click", async () => { + inlineMenuVisibilityMock$.next(AutofillOverlayVisibility.OnButtonClick); + await flushPromises(); + + expect(BrowserApi.tabSendMessageData).toHaveBeenCalledWith( + tab1, + "updateAutofillOverlayVisibility", + { autofillOverlayVisibility: AutofillOverlayVisibility.OnButtonClick }, + ); + expect(BrowserApi.tabSendMessageData).toHaveBeenCalledWith( + tab2, + "updateAutofillOverlayVisibility", + { autofillOverlayVisibility: AutofillOverlayVisibility.OnButtonClick }, + ); + }); + + it("when changing the inline menu from button click to field focus", async () => { + inlineMenuVisibilityMock$.next(AutofillOverlayVisibility.OnButtonClick); + inlineMenuVisibilityMock$.next(AutofillOverlayVisibility.OnFieldFocus); + await flushPromises(); + + expect(BrowserApi.tabSendMessageData).toHaveBeenCalledWith( + tab1, + "updateAutofillOverlayVisibility", + { autofillOverlayVisibility: AutofillOverlayVisibility.OnFieldFocus }, + ); + expect(BrowserApi.tabSendMessageData).toHaveBeenCalledWith( + tab2, + "updateAutofillOverlayVisibility", + { autofillOverlayVisibility: AutofillOverlayVisibility.OnFieldFocus }, + ); + }); + }); + + describe("reloads the autofill scripts", () => { + it("when changing the inline menu from a disabled setting to an enabled setting", async () => { + inlineMenuVisibilityMock$.next(AutofillOverlayVisibility.Off); + inlineMenuVisibilityMock$.next(AutofillOverlayVisibility.OnFieldFocus); + await flushPromises(); + + expect(autofillService.reloadAutofillScripts).toHaveBeenCalled(); + }); + + it("when changing the inline menu from a enabled setting to a disabled setting", async () => { + inlineMenuVisibilityMock$.next(AutofillOverlayVisibility.OnFieldFocus); + inlineMenuVisibilityMock$.next(AutofillOverlayVisibility.Off); + await flushPromises(); + + expect(autofillService.reloadAutofillScripts).toHaveBeenCalled(); + }); + }); + }); }); describe("reloadAutofillScripts", () => { - it("disconnects and removes all autofill script ports", () => { - const port1 = mock({ - disconnect: jest.fn(), - }); - const port2 = mock({ - disconnect: jest.fn(), - }); + it("re-injects the autofill scripts in all tabs and disconnects all connected ports", () => { + const port1 = mock(); + const port2 = mock(); autofillService["autofillScriptPortsSet"] = new Set([port1, port2]); + jest.spyOn(autofillService as any, "injectAutofillScriptsInAllTabs"); + jest.spyOn(autofillService, "getAutofillOnPageLoad").mockResolvedValue(true); // FIXME: Verify that this floating promise is intentional. If it is, add an explanatory comment and ensure there is proper error handling. // eslint-disable-next-line @typescript-eslint/no-floating-promises @@ -161,17 +241,6 @@ describe("AutofillService", () => { expect(port1.disconnect).toHaveBeenCalled(); expect(port2.disconnect).toHaveBeenCalled(); expect(autofillService["autofillScriptPortsSet"].size).toBe(0); - }); - - it("re-injects the autofill scripts in all tabs", () => { - autofillService["autofillScriptPortsSet"] = new Set([mock()]); - jest.spyOn(autofillService as any, "injectAutofillScriptsInAllTabs"); - jest.spyOn(autofillService, "getAutofillOnPageLoad").mockResolvedValue(true); - - // FIXME: Verify that this floating promise is intentional. If it is, add an explanatory comment and ensure there is proper error handling. - // eslint-disable-next-line @typescript-eslint/no-floating-promises - autofillService.reloadAutofillScripts(); - expect(autofillService["injectAutofillScriptsInAllTabs"]).toHaveBeenCalled(); }); }); diff --git a/apps/browser/src/autofill/services/autofill.service.ts b/apps/browser/src/autofill/services/autofill.service.ts index dd875054414..5348ca5b9ab 100644 --- a/apps/browser/src/autofill/services/autofill.service.ts +++ b/apps/browser/src/autofill/services/autofill.service.ts @@ -1,8 +1,10 @@ -import { firstValueFrom } from "rxjs"; +import { firstValueFrom, startWith } from "rxjs"; +import { pairwise } from "rxjs/operators"; import { EventCollectionService } from "@bitwarden/common/abstractions/event/event-collection.service"; import { AccountService } from "@bitwarden/common/auth/abstractions/account.service"; import { UserVerificationService } from "@bitwarden/common/auth/abstractions/user-verification/user-verification.service.abstraction"; +import { AutofillOverlayVisibility } from "@bitwarden/common/autofill/constants"; import { AutofillSettingsServiceAbstraction } from "@bitwarden/common/autofill/services/autofill-settings.service"; import { DomainSettingsService } from "@bitwarden/common/autofill/services/domain-settings.service"; import { InlineMenuVisibilitySetting } from "@bitwarden/common/autofill/types"; @@ -69,10 +71,12 @@ export default class AutofillService implements AutofillServiceInterface { */ async loadAutofillScriptsOnInstall() { BrowserApi.addListener(chrome.runtime.onConnect, this.handleInjectedScriptPortConnection); - - // FIXME: Verify that this floating promise is intentional. If it is, add an explanatory comment and ensure there is proper error handling. - // eslint-disable-next-line @typescript-eslint/no-floating-promises - this.injectAutofillScriptsInAllTabs(); + void this.injectAutofillScriptsInAllTabs(); + this.autofillSettingsService.inlineMenuVisibility$ + .pipe(startWith(undefined), pairwise()) + .subscribe(([previousSetting, currentSetting]) => + this.handleInlineMenuVisibilityChange(previousSetting, currentSetting), + ); } /** @@ -109,9 +113,12 @@ export default class AutofillService implements AutofillServiceInterface { // Autofill user settings loaded from state can await the active account state indefinitely // if not guarded by an active account check (e.g. the user is logged in) const activeAccount = await firstValueFrom(this.accountService.activeAccount$); - + let overlayVisibility: InlineMenuVisibilitySetting = AutofillOverlayVisibility.Off; let autoFillOnPageLoadIsEnabled = false; - const overlayVisibility = await this.getOverlayVisibility(); + + if (activeAccount) { + overlayVisibility = await this.getOverlayVisibility(); + } const mainAutofillScript = overlayVisibility ? "bootstrap-autofill-overlay.js" @@ -2086,4 +2093,34 @@ export default class AutofillService implements AutofillServiceInterface { } } } + + /** + * Updates the autofill inline menu visibility setting in all active tabs + * when the InlineMenuVisibilitySetting observable is updated. + * + * @param previousSetting - The previous setting value + * @param currentSetting - The current setting value + */ + private async handleInlineMenuVisibilityChange( + previousSetting: InlineMenuVisibilitySetting, + currentSetting: InlineMenuVisibilitySetting, + ) { + if (previousSetting === undefined || previousSetting === currentSetting) { + return; + } + + const inlineMenuPreviouslyDisabled = previousSetting === AutofillOverlayVisibility.Off; + const inlineMenuCurrentlyDisabled = currentSetting === AutofillOverlayVisibility.Off; + if (!inlineMenuPreviouslyDisabled && !inlineMenuCurrentlyDisabled) { + const tabs = await BrowserApi.tabsQuery({}); + tabs.forEach((tab) => + BrowserApi.tabSendMessageData(tab, "updateAutofillOverlayVisibility", { + autofillOverlayVisibility: currentSetting, + }), + ); + return; + } + + await this.reloadAutofillScripts(); + } } diff --git a/apps/browser/src/autofill/services/collect-autofill-content.service.spec.ts b/apps/browser/src/autofill/services/collect-autofill-content.service.spec.ts index 22a856c25db..a44fcd0b793 100644 --- a/apps/browser/src/autofill/services/collect-autofill-content.service.spec.ts +++ b/apps/browser/src/autofill/services/collect-autofill-content.service.spec.ts @@ -3,6 +3,7 @@ import { mock } from "jest-mock-extended"; import AutofillField from "../models/autofill-field"; import AutofillForm from "../models/autofill-form"; import { createAutofillFieldMock, createAutofillFormMock } from "../spec/autofill-mocks"; +import { mockQuerySelectorAllDefinedCall } from "../spec/testing-utils"; import { ElementWithOpId, FillableFormFieldElement, @@ -23,13 +24,17 @@ const mockLoginForm = ` `; +const waitForIdleCallback = () => new Promise((resolve) => globalThis.requestIdleCallback(resolve)); + describe("CollectAutofillContentService", () => { const domElementVisibilityService = new DomElementVisibilityService(); const autofillOverlayContentService = new AutofillOverlayContentService(); let collectAutofillContentService: CollectAutofillContentService; const mockIntersectionObserver = mock(); + const mockQuerySelectorAll = mockQuerySelectorAllDefinedCall(); beforeEach(() => { + globalThis.requestIdleCallback = jest.fn((cb, options) => setTimeout(cb, 100)); document.body.innerHTML = mockLoginForm; collectAutofillContentService = new CollectAutofillContentService( domElementVisibilityService, @@ -40,9 +45,14 @@ describe("CollectAutofillContentService", () => { afterEach(() => { jest.clearAllMocks(); + jest.restoreAllMocks(); document.body.innerHTML = ""; }); + afterAll(() => { + mockQuerySelectorAll.mockRestore(); + }); + describe("getPageDetails", () => { beforeEach(() => { jest @@ -437,6 +447,51 @@ describe("CollectAutofillContentService", () => { }); }); + describe("deepQueryElements", () => { + beforeEach(() => { + collectAutofillContentService["mutationObserver"] = mock(); + }); + + it("queries form field elements that are nested within a ShadowDOM", () => { + const root = document.createElement("div"); + const shadowRoot = root.attachShadow({ mode: "open" }); + const form = document.createElement("form"); + const input = document.createElement("input"); + input.type = "text"; + form.appendChild(input); + shadowRoot.appendChild(form); + + const formFieldElements = collectAutofillContentService.deepQueryElements( + shadowRoot, + "input", + true, + ); + + expect(formFieldElements).toStrictEqual([input]); + }); + + it("queries form field elements that are nested within multiple ShadowDOM elements", () => { + const root = document.createElement("div"); + const shadowRoot1 = root.attachShadow({ mode: "open" }); + const root2 = document.createElement("div"); + const shadowRoot2 = root2.attachShadow({ mode: "open" }); + const form = document.createElement("form"); + const input = document.createElement("input"); + input.type = "text"; + form.appendChild(input); + shadowRoot2.appendChild(form); + shadowRoot1.appendChild(root2); + + const formFieldElements = collectAutofillContentService.deepQueryElements( + shadowRoot1, + "input", + true, + ); + + expect(formFieldElements).toStrictEqual([input]); + }); + }); + describe("buildAutofillFormsData", () => { it("will not attempt to gather data from a cached form element", () => { const documentTitle = "Test Page"; @@ -1993,17 +2048,6 @@ describe("CollectAutofillContentService", () => { expect(shadowRoot).toEqual(null); }); - it("returns null if the passed node contains children elements", () => { - const element = document.createElement("div"); - element.innerHTML = "

Hello, world!

"; - const shadowRoot = collectAutofillContentService["getShadowRoot"](element); - - // eslint-disable-next-line - // @ts-ignore - expect(chrome.dom.openOrClosedShadowRoot).not.toBeCalled(); - expect(shadowRoot).toEqual(null); - }); - it("returns an open shadow root if the passed node has a shadowDOM element", () => { const element = document.createElement("div"); element.attachShadow({ mode: "open" }); @@ -2023,50 +2067,6 @@ describe("CollectAutofillContentService", () => { }); }); - describe("buildTreeWalkerNodesQueryResults", () => { - it("will recursively call itself if a shadowDOM element is found and will observe the element for mutations", () => { - collectAutofillContentService["mutationObserver"] = mock({ - observe: jest.fn(), - }); - jest.spyOn(collectAutofillContentService as any, "buildTreeWalkerNodesQueryResults"); - const shadowRoot = document.createElement("div"); - jest - .spyOn(collectAutofillContentService as any, "getShadowRoot") - .mockReturnValueOnce(shadowRoot); - const callbackFilter = jest.fn(); - - collectAutofillContentService["buildTreeWalkerNodesQueryResults"]( - document.body, - [], - callbackFilter, - true, - ); - - expect(collectAutofillContentService["buildTreeWalkerNodesQueryResults"]).toBeCalledTimes(2); - expect(collectAutofillContentService["mutationObserver"].observe).toBeCalled(); - }); - - it("will not observe the shadowDOM element if required to skip", () => { - collectAutofillContentService["mutationObserver"] = mock({ - observe: jest.fn(), - }); - const shadowRoot = document.createElement("div"); - jest - .spyOn(collectAutofillContentService as any, "getShadowRoot") - .mockReturnValueOnce(shadowRoot); - const callbackFilter = jest.fn(); - - collectAutofillContentService["buildTreeWalkerNodesQueryResults"]( - document.body, - [], - callbackFilter, - false, - ); - - expect(collectAutofillContentService["mutationObserver"].observe).not.toBeCalled(); - }); - }); - describe("setupMutationObserver", () => { it("sets up a mutation observer and observes the document element", () => { jest.spyOn(MutationObserver.prototype, "observe"); @@ -2079,7 +2079,7 @@ describe("CollectAutofillContentService", () => { }); describe("handleMutationObserverMutation", () => { - it("will set the domRecentlyMutated value to true and the noFieldsFound value to false if a form or field node has been added ", () => { + it("will set the domRecentlyMutated value to true and the noFieldsFound value to false if a form or field node has been added ", async () => { const form = document.createElement("form"); document.body.appendChild(form); const addedNodes = document.querySelectorAll("form"); @@ -2102,6 +2102,7 @@ describe("CollectAutofillContentService", () => { jest.spyOn(collectAutofillContentService as any, "isAutofillElementNodeMutated"); collectAutofillContentService["handleMutationObserverMutation"]([mutationRecord]); + await waitForIdleCallback(); expect(collectAutofillContentService["domRecentlyMutated"]).toEqual(true); expect(collectAutofillContentService["noFieldsFound"]).toEqual(false); @@ -2114,7 +2115,7 @@ describe("CollectAutofillContentService", () => { ); }); - it("removes cached autofill elements that are nested within a removed node", () => { + it("removes cached autofill elements that are nested within a removed node", async () => { const form = document.createElement("form") as ElementWithOpId; const usernameInput = document.createElement("input") as ElementWithOpId; usernameInput.setAttribute("type", "text"); @@ -2145,12 +2146,13 @@ describe("CollectAutofillContentService", () => { target: document.body, }, ]); + await waitForIdleCallback(); expect(collectAutofillContentService["autofillFormElements"].size).toEqual(0); expect(collectAutofillContentService["autofillFieldElements"].size).toEqual(0); }); - it("will handle updating the autofill element if any attribute mutations are encountered", () => { + it("will handle updating the autofill element if any attribute mutations are encountered", async () => { const mutationRecord: MutationRecord = { type: "attributes", addedNodes: null, @@ -2169,6 +2171,7 @@ describe("CollectAutofillContentService", () => { jest.spyOn(collectAutofillContentService as any, "handleAutofillElementAttributeMutation"); collectAutofillContentService["handleMutationObserverMutation"]([mutationRecord]); + await waitForIdleCallback(); expect(collectAutofillContentService["domRecentlyMutated"]).toEqual(false); expect(collectAutofillContentService["noFieldsFound"]).toEqual(true); @@ -2255,29 +2258,6 @@ describe("CollectAutofillContentService", () => { expect(collectAutofillContentService["buildAutofillFieldItem"]).not.toBeCalled(); }); - - it("builds the autofill field item to ensure the overlay listeners are set", () => { - document.body.innerHTML = ` -
- - -
- `; - - const inputElement = document.getElementById( - "username-id", - ) as ElementWithOpId; - inputElement.setAttribute("type", "password"); - const nodes = [inputElement]; - jest.spyOn(collectAutofillContentService as any, "buildAutofillFieldItem"); - - collectAutofillContentService["setupOverlayListenersOnMutatedElements"](nodes); - - expect(collectAutofillContentService["buildAutofillFieldItem"]).toBeCalledWith( - inputElement, - -1, - ); - }); }); describe("deleteCachedAutofillElement", () => { diff --git a/apps/browser/src/autofill/services/collect-autofill-content.service.ts b/apps/browser/src/autofill/services/collect-autofill-content.service.ts index 7c49a3d9881..87470655786 100644 --- a/apps/browser/src/autofill/services/collect-autofill-content.service.ts +++ b/apps/browser/src/autofill/services/collect-autofill-content.service.ts @@ -15,10 +15,12 @@ import { elementIsLabelElement, elementIsSelectElement, elementIsSpanElement, - nodeIsFormElement, nodeIsElement, elementIsInputElement, elementIsTextAreaElement, + nodeIsFormElement, + nodeIsInputElement, + sendExtensionMessage, } from "../utils"; import { AutofillOverlayContentService } from "./abstractions/autofill-overlay-content.service"; @@ -42,7 +44,10 @@ class CollectAutofillContentService implements CollectAutofillContentServiceInte private elementInitializingIntersectionObserver: Set = new Set(); private mutationObserver: MutationObserver; private updateAutofillElementsAfterMutationTimeout: number | NodeJS.Timeout; + private mutationsQueue: MutationRecord[][] = []; private readonly updateAfterMutationTimeoutDelay = 1000; + private readonly formFieldQueryString; + private readonly nonInputFormFieldTags = new Set(["textarea", "select"]); private readonly ignoredInputTypes = new Set([ "hidden", "submit", @@ -51,6 +56,7 @@ class CollectAutofillContentService implements CollectAutofillContentServiceInte "image", "file", ]); + private useTreeWalkerStrategyFlagSet = false; constructor( domElementVisibilityService: DomElementVisibilityService, @@ -58,6 +64,17 @@ class CollectAutofillContentService implements CollectAutofillContentServiceInte ) { this.domElementVisibilityService = domElementVisibilityService; this.autofillOverlayContentService = autofillOverlayContentService; + + let inputQuery = "input:not([data-bwignore])"; + for (const type of this.ignoredInputTypes) { + inputQuery += `:not([type="${type}"])`; + } + this.formFieldQueryString = `${inputQuery}, textarea:not([data-bwignore]), select:not([data-bwignore]), span[data-bwautofill]`; + + void sendExtensionMessage("getUseTreeWalkerApiForPageDetailsCollectionFeatureFlag").then( + (useTreeWalkerStrategyFlag) => + (this.useTreeWalkerStrategyFlagSet = !!useTreeWalkerStrategyFlag?.result), + ); } /** @@ -136,28 +153,86 @@ class CollectAutofillContentService implements CollectAutofillContentServiceInte } /** - * Queries the DOM for all the nodes that match the given filter callback - * and returns a collection of nodes. - * @param {Node} rootNode - * @param {Function} filterCallback - * @param {boolean} isObservingShadowRoot - * @returns {Node[]} + * Queries all elements in the DOM that match the given query string. + * Also, recursively queries all shadow roots for the element. + * + * @param root - The root element to start the query from + * @param queryString - The query string to match elements against + * @param isObservingShadowRoot - Determines whether to observe shadow roots */ - queryAllTreeWalkerNodes( - rootNode: Node, - filterCallback: CallableFunction, - isObservingShadowRoot = true, - ): Node[] { - const treeWalkerQueryResults: Node[] = []; + deepQueryElements( + root: Document | ShadowRoot | Element, + queryString: string, + isObservingShadowRoot = false, + ): T[] { + let elements = this.queryElements(root, queryString); + const shadowRoots = this.recursivelyQueryShadowRoots(root, isObservingShadowRoot); + for (let index = 0; index < shadowRoots.length; index++) { + const shadowRoot = shadowRoots[index]; + elements = elements.concat(this.queryElements(shadowRoot, queryString)); + } - this.buildTreeWalkerNodesQueryResults( - rootNode, - treeWalkerQueryResults, - filterCallback, - isObservingShadowRoot, - ); + return elements; + } - return treeWalkerQueryResults; + /** + * Queries the DOM for elements based on the given query string. + * + * @param root - The root element to start the query from + * @param queryString - The query string to match elements against + */ + private queryElements(root: Document | ShadowRoot | Element, queryString: string): T[] { + if (!root.querySelector(queryString)) { + return []; + } + + return Array.from(root.querySelectorAll(queryString)) as T[]; + } + + /** + * Recursively queries all shadow roots found within the given root element. + * Will also set up a mutation observer on the shadow root if the + * `isObservingShadowRoot` parameter is set to true. + * + * @param root - The root element to start the query from + * @param isObservingShadowRoot - Determines whether to observe shadow roots + */ + private recursivelyQueryShadowRoots( + root: Document | ShadowRoot | Element, + isObservingShadowRoot = false, + ): ShadowRoot[] { + let shadowRoots = this.queryShadowRoots(root); + for (let index = 0; index < shadowRoots.length; index++) { + const shadowRoot = shadowRoots[index]; + shadowRoots = shadowRoots.concat(this.recursivelyQueryShadowRoots(shadowRoot)); + if (isObservingShadowRoot) { + this.mutationObserver.observe(shadowRoot, { + attributes: true, + childList: true, + subtree: true, + }); + } + } + + return shadowRoots; + } + + /** + * Queries any immediate shadow roots found within the given root element. + * + * @param root - The root element to start the query from + */ + private queryShadowRoots(root: Document | ShadowRoot | Element): ShadowRoot[] { + const shadowRoots: ShadowRoot[] = []; + const potentialShadowRoots = root.querySelectorAll(":defined"); + for (let index = 0; index < potentialShadowRoots.length; index++) { + const shadowRoot = this.getShadowRoot(potentialShadowRoots[index]); + if (shadowRoot) { + shadowRoots.push(shadowRoot); + } + } + + return shadowRoots; } /** @@ -294,11 +369,12 @@ class CollectAutofillContentService implements CollectAutofillContentServiceInte fieldsLimit?: number, previouslyFoundFormFieldElements?: FormFieldElement[], ): FormFieldElement[] { - const formFieldElements = - previouslyFoundFormFieldElements || - (this.queryAllTreeWalkerNodes(document.documentElement, (node: Node) => - this.isNodeFormFieldElement(node), - ) as FormFieldElement[]); + let formFieldElements = previouslyFoundFormFieldElements; + if (!formFieldElements) { + formFieldElements = this.useTreeWalkerStrategyFlagSet + ? this.queryTreeWalkerForAutofillFormFieldElements() + : this.deepQueryElements(document, this.formFieldQueryString, true); + } if (!fieldsLimit || formFieldElements.length <= fieldsLimit) { return formFieldElements; @@ -371,7 +447,7 @@ class CollectAutofillContentService implements CollectAutofillContentServiceInte if (!autofillFieldBase.viewable) { this.elementInitializingIntersectionObserver.add(element); - this.intersectionObserver.observe(element); + this.intersectionObserver?.observe(element); } if (elementIsSpanElement(element)) { @@ -864,28 +940,33 @@ class CollectAutofillContentService implements CollectAutofillContentServiceInte * Queries all potential form and field elements from the DOM and returns * a collection of form and field elements. Leverages the TreeWalker API * to deep query Shadow DOM elements. - * @returns {{formElements: Node[], formFieldElements: Node[]}} - * @private */ private queryAutofillFormAndFieldElements(): { - formElements: Node[]; - formFieldElements: Node[]; + formElements: HTMLFormElement[]; + formFieldElements: FormFieldElement[]; } { - const formElements: Node[] = []; - const formFieldElements: Node[] = []; - this.queryAllTreeWalkerNodes(document.documentElement, (node: Node) => { - if (nodeIsFormElement(node)) { - formElements.push(node); - return true; + if (this.useTreeWalkerStrategyFlagSet) { + return this.queryTreeWalkerForAutofillFormAndFieldElements(); + } + + const queriedElements = this.deepQueryElements( + document, + `form, ${this.formFieldQueryString}`, + true, + ); + const formElements: HTMLFormElement[] = []; + const formFieldElements: FormFieldElement[] = []; + for (let index = 0; index < queriedElements.length; index++) { + const element = queriedElements[index]; + if (elementIsFormElement(element)) { + formElements.push(element); + continue; } - if (this.isNodeFormFieldElement(node)) { - formFieldElements.push(node); - return true; + if (this.isNodeFormFieldElement(element)) { + formFieldElements.push(element); } - - return false; - }); + } return { formElements, formFieldElements }; } @@ -916,7 +997,7 @@ class CollectAutofillContentService implements CollectAutofillContentServiceInte return true; } - return ["textarea", "select"].includes(nodeTagName) && !nodeHasBwIgnoreAttribute; + return this.nonInputFormFieldTags.has(nodeTagName) && !nodeHasBwIgnoreAttribute; } /** @@ -928,7 +1009,7 @@ class CollectAutofillContentService implements CollectAutofillContentServiceInte * @param {Node} node */ private getShadowRoot(node: Node): ShadowRoot | null { - if (!nodeIsElement(node) || node.childNodes.length !== 0) { + if (!nodeIsElement(node)) { return null; } @@ -947,51 +1028,6 @@ class CollectAutofillContentService implements CollectAutofillContentServiceInte return (node as any).openOrClosedShadowRoot; } - /** - * Recursively builds a collection of nodes that match the given filter callback. - * If a node has a ShadowRoot, it will be observed for mutations. - * @param {Node} rootNode - * @param {Node[]} treeWalkerQueryResults - * @param {Function} filterCallback - * @param {boolean} isObservingShadowRoot - * @private - */ - private buildTreeWalkerNodesQueryResults( - rootNode: Node, - treeWalkerQueryResults: Node[], - filterCallback: CallableFunction, - isObservingShadowRoot: boolean, - ) { - const treeWalker = document?.createTreeWalker(rootNode, NodeFilter.SHOW_ELEMENT); - let currentNode = treeWalker?.currentNode; - - while (currentNode) { - if (filterCallback(currentNode)) { - treeWalkerQueryResults.push(currentNode); - } - - const nodeShadowRoot = this.getShadowRoot(currentNode); - if (nodeShadowRoot) { - if (isObservingShadowRoot) { - this.mutationObserver.observe(nodeShadowRoot, { - attributes: true, - childList: true, - subtree: true, - }); - } - - this.buildTreeWalkerNodesQueryResults( - nodeShadowRoot, - treeWalkerQueryResults, - filterCallback, - isObservingShadowRoot, - ); - } - - currentNode = treeWalker?.nextNode(); - } - } - /** * Sets up a mutation observer on the body of the document. Observes changes to * DOM elements to ensure we have an updated set of autofill field data. @@ -1020,29 +1056,10 @@ class CollectAutofillContentService implements CollectAutofillContentServiceInte return; } - for (let mutationsIndex = 0; mutationsIndex < mutations.length; mutationsIndex++) { - const mutation = mutations[mutationsIndex]; - if ( - mutation.type === "childList" && - (this.isAutofillElementNodeMutated(mutation.removedNodes, true) || - this.isAutofillElementNodeMutated(mutation.addedNodes)) - ) { - this.domRecentlyMutated = true; - if (this.autofillOverlayContentService) { - this.autofillOverlayContentService.pageDetailsUpdateRequired = true; - } - this.noFieldsFound = false; - continue; - } - - if (mutation.type === "attributes") { - this.handleAutofillElementAttributeMutation(mutation); - } - } - - if (this.domRecentlyMutated) { - this.updateAutofillElementsAfterMutation(); + if (!this.mutationsQueue.length) { + globalThis.requestIdleCallback(this.processMutations, { timeout: 500 }); } + this.mutationsQueue.push(mutations); }; /** @@ -1065,12 +1082,54 @@ class CollectAutofillContentService implements CollectAutofillContentServiceInte this.updateAutofillElementsAfterMutation(); } + /** + * Handles the processing of all mutations in the mutations queue. Will trigger + * within an idle callback to help with performance and prevent excessive updates. + */ + private processMutations = () => { + for (let queueIndex = 0; queueIndex < this.mutationsQueue.length; queueIndex++) { + this.processMutationRecord(this.mutationsQueue[queueIndex]); + } + + if (this.domRecentlyMutated) { + this.updateAutofillElementsAfterMutation(); + } + + this.mutationsQueue = []; + }; + + /** + * Processes a mutation record and updates the autofill elements if necessary. + * + * @param mutations - The mutation record to process + */ + private processMutationRecord(mutations: MutationRecord[]) { + for (let mutationIndex = 0; mutationIndex < mutations.length; mutationIndex++) { + const mutation = mutations[mutationIndex]; + if ( + mutation.type === "childList" && + (this.isAutofillElementNodeMutated(mutation.removedNodes, true) || + this.isAutofillElementNodeMutated(mutation.addedNodes)) + ) { + this.domRecentlyMutated = true; + if (this.autofillOverlayContentService) { + this.autofillOverlayContentService.pageDetailsUpdateRequired = true; + } + this.noFieldsFound = false; + continue; + } + + if (mutation.type === "attributes") { + this.handleAutofillElementAttributeMutation(mutation); + } + } + } + /** * Checks if the passed nodes either contain or are autofill elements. - * @param {NodeList} nodes - * @param {boolean} isRemovingNodes - * @returns {boolean} - * @private + * + * @param nodes - The nodes to check + * @param isRemovingNodes - Whether the nodes are being removed */ private isAutofillElementNodeMutated(nodes: NodeList, isRemovingNodes = false): boolean { if (!nodes.length) { @@ -1078,34 +1137,41 @@ class CollectAutofillContentService implements CollectAutofillContentServiceInte } let isElementMutated = false; - const mutatedElements: Node[] = []; + let mutatedElements: HTMLElement[] = []; for (let index = 0; index < nodes.length; index++) { const node = nodes[index]; if (!nodeIsElement(node)) { continue; } - const autofillElementNodes = this.queryAllTreeWalkerNodes( - node, - (walkerNode: Node) => - nodeIsFormElement(walkerNode) || this.isNodeFormFieldElement(walkerNode), - ) as HTMLElement[]; + if ( + !this.useTreeWalkerStrategyFlagSet && + (nodeIsFormElement(node) || this.isNodeFormFieldElement(node)) + ) { + mutatedElements.push(node as HTMLElement); + } - if (autofillElementNodes.length) { + const autofillElements = this.useTreeWalkerStrategyFlagSet + ? this.queryTreeWalkerForMutatedElements(node) + : this.deepQueryElements(node, `form, ${this.formFieldQueryString}`, true); + if (autofillElements.length) { + mutatedElements = mutatedElements.concat(autofillElements); + } + + if (mutatedElements.length) { isElementMutated = true; - mutatedElements.push(...autofillElementNodes); } } if (isRemovingNodes) { for (let elementIndex = 0; elementIndex < mutatedElements.length; elementIndex++) { - const node = mutatedElements[elementIndex]; + const element = mutatedElements[elementIndex]; this.deleteCachedAutofillElement( - node as ElementWithOpId | ElementWithOpId, + element as ElementWithOpId | ElementWithOpId, ); } } else if (this.autofillOverlayContentService) { - setTimeout(() => this.setupOverlayListenersOnMutatedElements(mutatedElements), 1000); + this.setupOverlayListenersOnMutatedElements(mutatedElements); } return isElementMutated; @@ -1122,15 +1188,18 @@ class CollectAutofillContentService implements CollectAutofillContentServiceInte for (let elementIndex = 0; elementIndex < mutatedElements.length; elementIndex++) { const node = mutatedElements[elementIndex]; if ( - this.isNodeFormFieldElement(node) && - !this.autofillFieldElements.get(node as ElementWithOpId) + !this.isNodeFormFieldElement(node) || + this.autofillFieldElements.get(node as ElementWithOpId) ) { + continue; + } + + globalThis.requestIdleCallback( // We are setting this item to a -1 index because we do not know its position in the DOM. // This value should be updated with the next call to collect page details. - // FIXME: Verify that this floating promise is intentional. If it is, add an explanatory comment and ensure there is proper error handling. - // eslint-disable-next-line @typescript-eslint/no-floating-promises - this.buildAutofillFieldItem(node as ElementWithOpId, -1); - } + () => void this.buildAutofillFieldItem(node as ElementWithOpId, -1), + { timeout: 1000 }, + ); } } @@ -1349,6 +1418,10 @@ class CollectAutofillContentService implements CollectAutofillContentServiceInte } const cachedAutofillFieldElement = this.autofillFieldElements.get(formFieldElement); + if (!cachedAutofillFieldElement) { + continue; + } + cachedAutofillFieldElement.viewable = true; void this.autofillOverlayContentService?.setupAutofillOverlayListenerOnField( @@ -1356,7 +1429,7 @@ class CollectAutofillContentService implements CollectAutofillContentServiceInte cachedAutofillFieldElement, ); - this.intersectionObserver.unobserve(entry.target); + this.intersectionObserver?.unobserve(entry.target); } }; @@ -1371,6 +1444,150 @@ class CollectAutofillContentService implements CollectAutofillContentServiceInte this.mutationObserver?.disconnect(); this.intersectionObserver?.disconnect(); } + + /** + * Queries the DOM for all the nodes that match the given filter callback + * and returns a collection of nodes. + * @param rootNode + * @param filterCallback + * @param isObservingShadowRoot + * + * @deprecated - This method remains as a fallback in the case that the deepQuery implementation fails. + */ + private queryAllTreeWalkerNodes( + rootNode: Node, + filterCallback: CallableFunction, + isObservingShadowRoot = true, + ): Node[] { + const treeWalkerQueryResults: Node[] = []; + + this.buildTreeWalkerNodesQueryResults( + rootNode, + treeWalkerQueryResults, + filterCallback, + isObservingShadowRoot, + ); + + return treeWalkerQueryResults; + } + + /** + * Recursively builds a collection of nodes that match the given filter callback. + * If a node has a ShadowRoot, it will be observed for mutations. + * + * @param rootNode + * @param treeWalkerQueryResults + * @param filterCallback + * + * @deprecated - This method remains as a fallback in the case that the deepQuery implementation fails. + */ + private buildTreeWalkerNodesQueryResults( + rootNode: Node, + treeWalkerQueryResults: Node[], + filterCallback: CallableFunction, + isObservingShadowRoot: boolean, + ) { + const treeWalker = document?.createTreeWalker(rootNode, NodeFilter.SHOW_ELEMENT); + let currentNode = treeWalker?.currentNode; + + while (currentNode) { + if (filterCallback(currentNode)) { + treeWalkerQueryResults.push(currentNode); + } + + const nodeShadowRoot = this.getShadowRoot(currentNode); + if (nodeShadowRoot) { + if (isObservingShadowRoot) { + this.mutationObserver.observe(nodeShadowRoot, { + attributes: true, + childList: true, + subtree: true, + }); + } + + this.buildTreeWalkerNodesQueryResults( + nodeShadowRoot, + treeWalkerQueryResults, + filterCallback, + isObservingShadowRoot, + ); + } + + currentNode = treeWalker?.nextNode(); + } + } + + /** + * @deprecated - This method remains as a fallback in the case that the deepQuery implementation fails. + */ + private queryTreeWalkerForAutofillFormAndFieldElements(): { + formElements: HTMLFormElement[]; + formFieldElements: FormFieldElement[]; + } { + const formElements: HTMLFormElement[] = []; + const formFieldElements: FormFieldElement[] = []; + this.queryAllTreeWalkerNodes(document.documentElement, (node: Node) => { + if (nodeIsFormElement(node)) { + formElements.push(node); + return true; + } + + if (this.isNodeFormFieldElement(node)) { + formFieldElements.push(node as FormFieldElement); + return true; + } + + return false; + }); + + return { formElements, formFieldElements }; + } + + /** + * @deprecated - This method remains as a fallback in the case that the deepQuery implementation fails. + */ + private queryTreeWalkerForAutofillFormFieldElements(): FormFieldElement[] { + return this.queryAllTreeWalkerNodes(document.documentElement, (node: Node) => + this.isNodeFormFieldElement(node), + ) as FormFieldElement[]; + } + + /** + * @deprecated - This method remains as a fallback in the case that the deepQuery implementation fails. + * + * @param node - The node to query + */ + private queryTreeWalkerForMutatedElements(node: Node): HTMLElement[] { + return this.queryAllTreeWalkerNodes( + node, + (walkerNode: Node) => + nodeIsFormElement(walkerNode) || this.isNodeFormFieldElement(walkerNode), + ) as HTMLElement[]; + } + + /** + * @deprecated - This method remains as a fallback in the case that the deepQuery implementation fails. + */ + private queryTreeWalkerForPasswordElements(): HTMLElement[] { + return this.queryAllTreeWalkerNodes( + document.documentElement, + (node: Node) => nodeIsInputElement(node) && node.type === "password", + false, + ) as HTMLElement[]; + } + + /** + * This is a temporary method to maintain a fallback strategy for the tree walker API + * + * @deprecated - This method remains as a fallback in the case that the deepQuery implementation fails. + */ + isPasswordFieldWithinDocument(): boolean { + if (this.useTreeWalkerStrategyFlagSet) { + return Boolean(this.queryTreeWalkerForPasswordElements()?.length); + } + + return Boolean(this.deepQueryElements(document, `input[type="password"]`)?.length); + } } export default CollectAutofillContentService; diff --git a/apps/browser/src/autofill/services/insert-autofill-content.service.spec.ts b/apps/browser/src/autofill/services/insert-autofill-content.service.spec.ts index 72bbfbf2e2c..6ee5171e58c 100644 --- a/apps/browser/src/autofill/services/insert-autofill-content.service.spec.ts +++ b/apps/browser/src/autofill/services/insert-autofill-content.service.spec.ts @@ -1,6 +1,7 @@ import { EVENTS } from "@bitwarden/common/autofill/constants"; import AutofillScript, { FillScript, FillScriptActions } from "../models/autofill-script"; +import { mockQuerySelectorAllDefinedCall } from "../spec/testing-utils"; import { FillableFormFieldElement, FormElementWithAttribute, FormFieldElement } from "../types"; import AutofillOverlayContentService from "./autofill-overlay-content.service"; @@ -71,6 +72,7 @@ describe("InsertAutofillContentService", () => { ); let insertAutofillContentService: InsertAutofillContentService; let fillScript: AutofillScript; + const mockQuerySelectorAll = mockQuerySelectorAllDefinedCall(); beforeEach(() => { document.body.innerHTML = mockLoginForm; @@ -99,11 +101,16 @@ describe("InsertAutofillContentService", () => { afterEach(() => { jest.restoreAllMocks(); + jest.clearAllTimers(); windowLocationSpy.mockRestore(); confirmSpy.mockRestore(); document.body.innerHTML = ""; }); + afterAll(() => { + mockQuerySelectorAll.mockRestore(); + }); + describe("fillForm", () => { it("returns early if the passed fill script does not have a script property", async () => { fillScript.script = []; diff --git a/apps/browser/src/autofill/services/insert-autofill-content.service.ts b/apps/browser/src/autofill/services/insert-autofill-content.service.ts index 5cfa8091c40..e475ea4bbca 100644 --- a/apps/browser/src/autofill/services/insert-autofill-content.service.ts +++ b/apps/browser/src/autofill/services/insert-autofill-content.service.ts @@ -7,7 +7,6 @@ import { elementIsInputElement, elementIsSelectElement, elementIsTextAreaElement, - nodeIsInputElement, } from "../utils"; import { InsertAutofillContentService as InsertAutofillContentServiceInterface } from "./abstractions/insert-autofill-content.service"; @@ -101,13 +100,7 @@ class InsertAutofillContentService implements InsertAutofillContentServiceInterf * @private */ private isPasswordFieldWithinDocument(): boolean { - return Boolean( - this.collectAutofillContentService.queryAllTreeWalkerNodes( - document.documentElement, - (node: Node) => nodeIsInputElement(node) && node.type === "password", - false, - )?.length, - ); + return this.collectAutofillContentService.isPasswordFieldWithinDocument(); } /** diff --git a/apps/browser/src/autofill/spec/testing-utils.ts b/apps/browser/src/autofill/spec/testing-utils.ts index 15f3121c2b7..6d07e6606e0 100644 --- a/apps/browser/src/autofill/spec/testing-utils.ts +++ b/apps/browser/src/autofill/spec/testing-utils.ts @@ -98,6 +98,34 @@ function triggerTabOnRemovedEvent(tabId: number, removeInfo: chrome.tabs.TabRemo }); } +function mockQuerySelectorAllDefinedCall() { + const originalDocumentQuerySelectorAll = document.querySelectorAll; + document.querySelectorAll = function (selector: string) { + return originalDocumentQuerySelectorAll.call( + document, + selector === ":defined" ? "*" : selector, + ); + }; + + const originalShadowRootQuerySelectorAll = ShadowRoot.prototype.querySelectorAll; + ShadowRoot.prototype.querySelectorAll = function (selector: string) { + return originalShadowRootQuerySelectorAll.call(this, selector === ":defined" ? "*" : selector); + }; + + const originalElementQuerySelectorAll = Element.prototype.querySelectorAll; + Element.prototype.querySelectorAll = function (selector: string) { + return originalElementQuerySelectorAll.call(this, selector === ":defined" ? "*" : selector); + }; + + return { + mockRestore: () => { + document.querySelectorAll = originalDocumentQuerySelectorAll; + ShadowRoot.prototype.querySelectorAll = originalShadowRootQuerySelectorAll; + Element.prototype.querySelectorAll = originalElementQuerySelectorAll; + }, + }; +} + export { triggerTestFailure, flushPromises, @@ -111,4 +139,5 @@ export { triggerTabOnReplacedEvent, triggerTabOnUpdatedEvent, triggerTabOnRemovedEvent, + mockQuerySelectorAllDefinedCall, }; diff --git a/apps/browser/src/autofill/utils/index.ts b/apps/browser/src/autofill/utils/index.ts index 72e7f9ab62e..cbb0a862e3c 100644 --- a/apps/browser/src/autofill/utils/index.ts +++ b/apps/browser/src/autofill/utils/index.ts @@ -240,7 +240,11 @@ function elementIsDescriptionTermElement(element: Element): element is HTMLEleme * @param node - The node to check. */ function nodeIsElement(node: Node): node is Element { - return node?.nodeType === Node.ELEMENT_NODE; + if (!node) { + return false; + } + + return node.nodeType === Node.ELEMENT_NODE; } /** diff --git a/apps/browser/src/background/main.background.ts b/apps/browser/src/background/main.background.ts index d5e8fe1da74..a382a76781a 100644 --- a/apps/browser/src/background/main.background.ts +++ b/apps/browser/src/background/main.background.ts @@ -109,6 +109,7 @@ import { DefaultConfigService } from "@bitwarden/common/platform/services/config import { ConsoleLogService } from "@bitwarden/common/platform/services/console-log.service"; import { ContainerService } from "@bitwarden/common/platform/services/container.service"; import { EncryptServiceImplementation } from "@bitwarden/common/platform/services/cryptography/encrypt.service.implementation"; +import { MultithreadEncryptServiceImplementation } from "@bitwarden/common/platform/services/cryptography/multithread-encrypt.service.implementation"; import { Fido2AuthenticatorService } from "@bitwarden/common/platform/services/fido2/fido2-authenticator.service"; import { Fido2ClientService } from "@bitwarden/common/platform/services/fido2/fido2-client.service"; import { FileUploadService } from "@bitwarden/common/platform/services/file-upload/file-upload.service"; @@ -143,13 +144,11 @@ import { NotificationsService } from "@bitwarden/common/services/notifications.s import { SearchService } from "@bitwarden/common/services/search.service"; import { VaultTimeoutSettingsService } from "@bitwarden/common/services/vault-timeout/vault-timeout-settings.service"; import { - PasswordGenerationService, - PasswordGenerationServiceAbstraction, -} from "@bitwarden/common/tools/generator/password"; -import { - UsernameGenerationService, - UsernameGenerationServiceAbstraction, -} from "@bitwarden/common/tools/generator/username"; + legacyPasswordGenerationServiceFactory, + legacyUsernameGenerationServiceFactory, +} from "@bitwarden/common/tools/generator"; +import { PasswordGenerationServiceAbstraction } from "@bitwarden/common/tools/generator/password"; +import { UsernameGenerationServiceAbstraction } from "@bitwarden/common/tools/generator/username"; import { PasswordStrengthService, PasswordStrengthServiceAbstraction, @@ -220,7 +219,6 @@ import { BrowserCryptoService } from "../platform/services/browser-crypto.servic import { BrowserEnvironmentService } from "../platform/services/browser-environment.service"; import BrowserLocalStorageService from "../platform/services/browser-local-storage.service"; import BrowserMemoryStorageService from "../platform/services/browser-memory-storage.service"; -import { BrowserMultithreadEncryptServiceImplementation } from "../platform/services/browser-multithread-encrypt.service.implementation"; import { BrowserScriptInjectorService } from "../platform/services/browser-script-injector.service"; import { DefaultBrowserStateService } from "../platform/services/default-browser-state.service"; import I18nService from "../platform/services/i18n.service"; @@ -380,7 +378,8 @@ export default class MainBackground { const logoutCallback = async (expired: boolean, userId?: UserId) => await this.logout(expired, userId); - this.logService = new ConsoleLogService(false); + const isDev = process.env.ENV === "development"; + this.logService = new ConsoleLogService(isDev); this.cryptoFunctionService = new WebCryptoFunctionService(self); this.keyGenerationService = new KeyGenerationService(this.cryptoFunctionService); this.storageService = new BrowserLocalStorageService(); @@ -399,7 +398,7 @@ export default class MainBackground { ), ); - this.offscreenDocumentService = new DefaultOffscreenDocumentService(); + this.offscreenDocumentService = new DefaultOffscreenDocumentService(this.logService); this.platformUtilsService = new BackgroundPlatformUtilsService( this.messagingService, @@ -478,14 +477,14 @@ export default class MainBackground { storageServiceProvider, ); - this.encryptService = flagEnabled("multithreadDecryption") - ? new BrowserMultithreadEncryptServiceImplementation( - this.cryptoFunctionService, - this.logService, - true, - this.offscreenDocumentService, - ) - : new EncryptServiceImplementation(this.cryptoFunctionService, this.logService, true); + this.encryptService = + flagEnabled("multithreadDecryption") && BrowserApi.isManifestVersion(2) + ? new MultithreadEncryptServiceImplementation( + this.cryptoFunctionService, + this.logService, + true, + ) + : new EncryptServiceImplementation(this.cryptoFunctionService, this.logService, true); this.singleUserStateProvider = new DefaultSingleUserStateProvider( storageServiceProvider, @@ -648,10 +647,12 @@ export default class MainBackground { this.passwordStrengthService = new PasswordStrengthService(); - this.passwordGenerationService = new PasswordGenerationService( + this.passwordGenerationService = legacyPasswordGenerationServiceFactory( + this.encryptService, this.cryptoService, this.policyService, - this.stateService, + this.accountService, + this.stateProvider, ); this.userDecryptionOptionsService = new UserDecryptionOptionsService(this.stateProvider); @@ -1091,10 +1092,14 @@ export default class MainBackground { this.vaultTimeoutSettingsService, ); - this.usernameGenerationService = new UsernameGenerationService( - this.cryptoService, - this.stateService, + this.usernameGenerationService = legacyUsernameGenerationServiceFactory( this.apiService, + this.i18nService, + this.cryptoService, + this.encryptService, + this.policyService, + this.accountService, + this.stateProvider, ); if (!this.popupOnlyContext) { @@ -1177,7 +1182,7 @@ export default class MainBackground { } async refreshBadge() { - await new UpdateBadge(self).run({ existingServices: this as any }); + await new UpdateBadge(self, this).run(); } async refreshMenu(forLocked = false) { @@ -1213,7 +1218,22 @@ export default class MainBackground { ); // can be removed once password generation history is migrated to state providers await this.stateService.clearDecryptedData(currentlyActiveAccount); + // HACK to ensure account is switched before proceeding + const switchPromise = firstValueFrom( + this.accountService.activeAccount$.pipe( + filter((account) => (account?.id ?? null) === (userId ?? null)), + timeout({ + first: 1_000, + with: () => { + throw new Error( + "The account switch process did not complete in a reasonable amount of time.", + ); + }, + }), + ), + ); await this.accountService.switchAccount(userId); + await switchPromise; // Clear sequentialized caches clearCaches(); @@ -1301,7 +1321,6 @@ export default class MainBackground { this.cipherService.clear(userBeingLoggedOut), this.folderService.clear(userBeingLoggedOut), this.collectionService.clear(userBeingLoggedOut), - this.passwordGenerationService.clear(userBeingLoggedOut), this.vaultTimeoutSettingsService.clear(userBeingLoggedOut), this.vaultFilterService.clear(), this.biometricStateService.logout(userBeingLoggedOut), diff --git a/apps/browser/src/background/nativeMessaging.background.ts b/apps/browser/src/background/nativeMessaging.background.ts index 51ab301fd1c..534a239a811 100644 --- a/apps/browser/src/background/nativeMessaging.background.ts +++ b/apps/browser/src/background/nativeMessaging.background.ts @@ -321,6 +321,15 @@ export class NativeMessagingBackground { type: "danger", }); break; + } else if (message.response === "not unlocked") { + this.messagingService.send("showDialog", { + title: { key: "biometricsNotUnlockedTitle" }, + content: { key: "biometricsNotUnlockedDesc" }, + acceptButtonText: { key: "ok" }, + cancelButtonText: null, + type: "danger", + }); + break; } else if (message.response === "canceled") { break; } diff --git a/apps/browser/src/background/runtime.background.ts b/apps/browser/src/background/runtime.background.ts index 1db32659d27..7ddd5302ac7 100644 --- a/apps/browser/src/background/runtime.background.ts +++ b/apps/browser/src/background/runtime.background.ts @@ -4,6 +4,7 @@ import { NotificationsService } from "@bitwarden/common/abstractions/notificatio import { AccountService } from "@bitwarden/common/auth/abstractions/account.service"; import { AutofillOverlayVisibility } from "@bitwarden/common/autofill/constants"; import { AutofillSettingsServiceAbstraction } from "@bitwarden/common/autofill/services/autofill-settings.service"; +import { FeatureFlag } from "@bitwarden/common/enums/feature-flag.enum"; import { ConfigService } from "@bitwarden/common/platform/abstractions/config/config.service"; import { LogService } from "@bitwarden/common/platform/abstractions/log.service"; import { MessagingService } from "@bitwarden/common/platform/abstractions/messaging.service"; @@ -65,7 +66,10 @@ export default class RuntimeBackground { sender: chrome.runtime.MessageSender, sendResponse: (response: any) => void, ) => { - const messagesWithResponse = ["biometricUnlock"]; + const messagesWithResponse = [ + "biometricUnlock", + "getUseTreeWalkerApiForPageDetailsCollectionFeatureFlag", + ]; if (messagesWithResponse.includes(msg.command)) { this.processMessageWithSender(msg, sender).then( @@ -177,6 +181,11 @@ export default class RuntimeBackground { const result = await this.main.biometricUnlock(); return result; } + case "getUseTreeWalkerApiForPageDetailsCollectionFeatureFlag": { + return await this.configService.getFeatureFlag( + FeatureFlag.UseTreeWalkerApiForPageDetailsCollection, + ); + } } } @@ -188,6 +197,7 @@ export default class RuntimeBackground { if (msg.command === "loggedIn") { await this.sendBwInstalledMessageToVault(); + await this.autofillService.reloadAutofillScripts(); } if (this.lockedVaultPendingNotifications?.length > 0) { @@ -196,8 +206,6 @@ export default class RuntimeBackground { } await this.notificationsService.updateConnection(msg.command === "loggedIn"); - await this.main.refreshBadge(); - await this.main.refreshMenu(false); this.systemService.cancelProcessReload(); if (item) { @@ -209,6 +217,13 @@ export default class RuntimeBackground { item, ); } + + // @TODO these need to happen last to avoid blocking `tabSendMessageData` above + // The underlying cause exists within `cipherService.getAllDecrypted` via + // `getAllDecryptedForUrl` and is anticipated to be refactored + await this.main.refreshBadge(); + await this.main.refreshMenu(false); + break; } case "addToLockedVaultPendingNotifications": diff --git a/apps/browser/src/background/service-factories/cipher-file-upload-service.factory.ts b/apps/browser/src/background/service-factories/cipher-file-upload-service.factory.ts deleted file mode 100644 index 4127ff5acf4..00000000000 --- a/apps/browser/src/background/service-factories/cipher-file-upload-service.factory.ts +++ /dev/null @@ -1,38 +0,0 @@ -import { CipherFileUploadService as CipherFileUploadServiceAbstraction } from "@bitwarden/common/vault/abstractions/file-upload/cipher-file-upload.service"; -import { CipherFileUploadService } from "@bitwarden/common/vault/services/file-upload/cipher-file-upload.service"; - -import { - ApiServiceInitOptions, - apiServiceFactory, -} from "../../platform/background/service-factories/api-service.factory"; -import { - FactoryOptions, - CachedServices, - factory, -} from "../../platform/background/service-factories/factory-options"; -import { - FileUploadServiceInitOptions, - fileUploadServiceFactory, -} from "../../platform/background/service-factories/file-upload-service.factory"; - -type CipherFileUploadServiceFactoyOptions = FactoryOptions; - -export type CipherFileUploadServiceInitOptions = CipherFileUploadServiceFactoyOptions & - ApiServiceInitOptions & - FileUploadServiceInitOptions; - -export function cipherFileUploadServiceFactory( - cache: { cipherFileUploadService?: CipherFileUploadServiceAbstraction } & CachedServices, - opts: CipherFileUploadServiceInitOptions, -): Promise { - return factory( - cache, - "cipherFileUploadService", - opts, - async () => - new CipherFileUploadService( - await apiServiceFactory(cache, opts), - await fileUploadServiceFactory(cache, opts), - ), - ); -} diff --git a/apps/browser/src/background/service-factories/cipher-file-upload.service.factory.ts b/apps/browser/src/background/service-factories/cipher-file-upload.service.factory.ts deleted file mode 100644 index 4127ff5acf4..00000000000 --- a/apps/browser/src/background/service-factories/cipher-file-upload.service.factory.ts +++ /dev/null @@ -1,38 +0,0 @@ -import { CipherFileUploadService as CipherFileUploadServiceAbstraction } from "@bitwarden/common/vault/abstractions/file-upload/cipher-file-upload.service"; -import { CipherFileUploadService } from "@bitwarden/common/vault/services/file-upload/cipher-file-upload.service"; - -import { - ApiServiceInitOptions, - apiServiceFactory, -} from "../../platform/background/service-factories/api-service.factory"; -import { - FactoryOptions, - CachedServices, - factory, -} from "../../platform/background/service-factories/factory-options"; -import { - FileUploadServiceInitOptions, - fileUploadServiceFactory, -} from "../../platform/background/service-factories/file-upload-service.factory"; - -type CipherFileUploadServiceFactoyOptions = FactoryOptions; - -export type CipherFileUploadServiceInitOptions = CipherFileUploadServiceFactoyOptions & - ApiServiceInitOptions & - FileUploadServiceInitOptions; - -export function cipherFileUploadServiceFactory( - cache: { cipherFileUploadService?: CipherFileUploadServiceAbstraction } & CachedServices, - opts: CipherFileUploadServiceInitOptions, -): Promise { - return factory( - cache, - "cipherFileUploadService", - opts, - async () => - new CipherFileUploadService( - await apiServiceFactory(cache, opts), - await fileUploadServiceFactory(cache, opts), - ), - ); -} diff --git a/apps/browser/src/background/service-factories/devices-api-service.factory.ts b/apps/browser/src/background/service-factories/devices-api-service.factory.ts deleted file mode 100644 index 117b82777ae..00000000000 --- a/apps/browser/src/background/service-factories/devices-api-service.factory.ts +++ /dev/null @@ -1,28 +0,0 @@ -import { DevicesApiServiceAbstraction } from "@bitwarden/common/auth/abstractions/devices-api.service.abstraction"; -import { DevicesApiServiceImplementation } from "@bitwarden/common/auth/services/devices-api.service.implementation"; - -import { - ApiServiceInitOptions, - apiServiceFactory, -} from "../../platform/background/service-factories/api-service.factory"; -import { - FactoryOptions, - CachedServices, - factory, -} from "../../platform/background/service-factories/factory-options"; - -type DevicesApiServiceFactoryOptions = FactoryOptions; - -export type DevicesApiServiceInitOptions = DevicesApiServiceFactoryOptions & ApiServiceInitOptions; - -export function devicesApiServiceFactory( - cache: { devicesApiService?: DevicesApiServiceAbstraction } & CachedServices, - opts: DevicesApiServiceInitOptions, -): Promise { - return factory( - cache, - "devicesApiService", - opts, - async () => new DevicesApiServiceImplementation(await apiServiceFactory(cache, opts)), - ); -} diff --git a/apps/browser/src/background/service-factories/event-collection-service.factory.ts b/apps/browser/src/background/service-factories/event-collection-service.factory.ts deleted file mode 100644 index b8f89c90bd2..00000000000 --- a/apps/browser/src/background/service-factories/event-collection-service.factory.ts +++ /dev/null @@ -1,55 +0,0 @@ -import { EventCollectionService as AbstractEventCollectionService } from "@bitwarden/common/abstractions/event/event-collection.service"; -import { EventCollectionService } from "@bitwarden/common/services/event/event-collection.service"; - -import { - organizationServiceFactory, - OrganizationServiceInitOptions, -} from "../../admin-console/background/service-factories/organization-service.factory"; -import { - authServiceFactory, - AuthServiceInitOptions, -} from "../../auth/background/service-factories/auth-service.factory"; -import { - FactoryOptions, - CachedServices, - factory, -} from "../../platform/background/service-factories/factory-options"; -import { stateProviderFactory } from "../../platform/background/service-factories/state-provider.factory"; -import { StateServiceInitOptions } from "../../platform/background/service-factories/state-service.factory"; -import { - cipherServiceFactory, - CipherServiceInitOptions, -} from "../../vault/background/service_factories/cipher-service.factory"; - -import { - eventUploadServiceFactory, - EventUploadServiceInitOptions, -} from "./event-upload-service.factory"; - -type EventCollectionServiceOptions = FactoryOptions; - -export type EventCollectionServiceInitOptions = EventCollectionServiceOptions & - CipherServiceInitOptions & - StateServiceInitOptions & - OrganizationServiceInitOptions & - EventUploadServiceInitOptions & - AuthServiceInitOptions; - -export function eventCollectionServiceFactory( - cache: { eventCollectionService?: AbstractEventCollectionService } & CachedServices, - opts: EventCollectionServiceInitOptions, -): Promise { - return factory( - cache, - "eventCollectionService", - opts, - async () => - new EventCollectionService( - await cipherServiceFactory(cache, opts), - await stateProviderFactory(cache, opts), - await organizationServiceFactory(cache, opts), - await eventUploadServiceFactory(cache, opts), - await authServiceFactory(cache, opts), - ), - ); -} diff --git a/apps/browser/src/background/service-factories/event-upload-service.factory.ts b/apps/browser/src/background/service-factories/event-upload-service.factory.ts deleted file mode 100644 index b20310e8c9c..00000000000 --- a/apps/browser/src/background/service-factories/event-upload-service.factory.ts +++ /dev/null @@ -1,48 +0,0 @@ -import { EventUploadService as AbstractEventUploadService } from "@bitwarden/common/abstractions/event/event-upload.service"; -import { EventUploadService } from "@bitwarden/common/services/event/event-upload.service"; - -import { - AuthServiceInitOptions, - authServiceFactory, -} from "../../auth/background/service-factories/auth-service.factory"; -import { - ApiServiceInitOptions, - apiServiceFactory, -} from "../../platform/background/service-factories/api-service.factory"; -import { - FactoryOptions, - CachedServices, - factory, -} from "../../platform/background/service-factories/factory-options"; -import { - logServiceFactory, - LogServiceInitOptions, -} from "../../platform/background/service-factories/log-service.factory"; -import { stateProviderFactory } from "../../platform/background/service-factories/state-provider.factory"; -import { StateServiceInitOptions } from "../../platform/background/service-factories/state-service.factory"; - -type EventUploadServiceOptions = FactoryOptions; - -export type EventUploadServiceInitOptions = EventUploadServiceOptions & - ApiServiceInitOptions & - StateServiceInitOptions & - LogServiceInitOptions & - AuthServiceInitOptions; - -export function eventUploadServiceFactory( - cache: { eventUploadService?: AbstractEventUploadService } & CachedServices, - opts: EventUploadServiceInitOptions, -): Promise { - return factory( - cache, - "eventUploadService", - opts, - async () => - new EventUploadService( - await apiServiceFactory(cache, opts), - await stateProviderFactory(cache, opts), - await logServiceFactory(cache, opts), - await authServiceFactory(cache, opts), - ), - ); -} diff --git a/apps/browser/src/background/service-factories/password-generation-service.factory.ts b/apps/browser/src/background/service-factories/password-generation-service.factory.ts deleted file mode 100644 index ec7ca50ec46..00000000000 --- a/apps/browser/src/background/service-factories/password-generation-service.factory.ts +++ /dev/null @@ -1,46 +0,0 @@ -import { - PasswordGenerationService, - PasswordGenerationServiceAbstraction, -} from "@bitwarden/common/tools/generator/password"; - -import { - policyServiceFactory, - PolicyServiceInitOptions, -} from "../../admin-console/background/service-factories/policy-service.factory"; -import { - CryptoServiceInitOptions, - cryptoServiceFactory, -} from "../../platform/background/service-factories/crypto-service.factory"; -import { - CachedServices, - factory, - FactoryOptions, -} from "../../platform/background/service-factories/factory-options"; -import { - stateServiceFactory, - StateServiceInitOptions, -} from "../../platform/background/service-factories/state-service.factory"; - -type PasswordGenerationServiceFactoryOptions = FactoryOptions; - -export type PasswordGenerationServiceInitOptions = PasswordGenerationServiceFactoryOptions & - CryptoServiceInitOptions & - PolicyServiceInitOptions & - StateServiceInitOptions; - -export function passwordGenerationServiceFactory( - cache: { passwordGenerationService?: PasswordGenerationServiceAbstraction } & CachedServices, - opts: PasswordGenerationServiceInitOptions, -): Promise { - return factory( - cache, - "passwordGenerationService", - opts, - async () => - new PasswordGenerationService( - await cryptoServiceFactory(cache, opts), - await policyServiceFactory(cache, opts), - await stateServiceFactory(cache, opts), - ), - ); -} diff --git a/apps/browser/src/background/service-factories/search-service.factory.ts b/apps/browser/src/background/service-factories/search-service.factory.ts deleted file mode 100644 index aa83d2afd29..00000000000 --- a/apps/browser/src/background/service-factories/search-service.factory.ts +++ /dev/null @@ -1,44 +0,0 @@ -import { SearchService as AbstractSearchService } from "@bitwarden/common/abstractions/search.service"; -import { SearchService } from "@bitwarden/common/services/search.service"; - -import { - CachedServices, - factory, - FactoryOptions, -} from "../../platform/background/service-factories/factory-options"; -import { - i18nServiceFactory, - I18nServiceInitOptions, -} from "../../platform/background/service-factories/i18n-service.factory"; -import { - logServiceFactory, - LogServiceInitOptions, -} from "../../platform/background/service-factories/log-service.factory"; -import { - stateProviderFactory, - StateProviderInitOptions, -} from "../../platform/background/service-factories/state-provider.factory"; - -type SearchServiceFactoryOptions = FactoryOptions; - -export type SearchServiceInitOptions = SearchServiceFactoryOptions & - LogServiceInitOptions & - I18nServiceInitOptions & - StateProviderInitOptions; - -export function searchServiceFactory( - cache: { searchService?: AbstractSearchService } & CachedServices, - opts: SearchServiceInitOptions, -): Promise { - return factory( - cache, - "searchService", - opts, - async () => - new SearchService( - await logServiceFactory(cache, opts), - await i18nServiceFactory(cache, opts), - await stateProviderFactory(cache, opts), - ), - ); -} diff --git a/apps/browser/src/background/service-factories/send-service.factory.ts b/apps/browser/src/background/service-factories/send-service.factory.ts deleted file mode 100644 index 942861b9260..00000000000 --- a/apps/browser/src/background/service-factories/send-service.factory.ts +++ /dev/null @@ -1,57 +0,0 @@ -import { SendService } from "@bitwarden/common/tools/send/services/send.service"; -import { InternalSendService } from "@bitwarden/common/tools/send/services/send.service.abstraction"; - -import { - CryptoServiceInitOptions, - cryptoServiceFactory, -} from "../../platform/background/service-factories/crypto-service.factory"; -import { - EncryptServiceInitOptions, - encryptServiceFactory, -} from "../../platform/background/service-factories/encrypt-service.factory"; -import { - FactoryOptions, - CachedServices, - factory, -} from "../../platform/background/service-factories/factory-options"; -import { - i18nServiceFactory, - I18nServiceInitOptions, -} from "../../platform/background/service-factories/i18n-service.factory"; -import { - KeyGenerationServiceInitOptions, - keyGenerationServiceFactory, -} from "../../platform/background/service-factories/key-generation-service.factory"; - -import { - SendStateProviderInitOptions, - sendStateProviderFactory, -} from "./send-state-provider.factory"; - -type SendServiceFactoryOptions = FactoryOptions; - -export type SendServiceInitOptions = SendServiceFactoryOptions & - CryptoServiceInitOptions & - I18nServiceInitOptions & - KeyGenerationServiceInitOptions & - SendStateProviderInitOptions & - EncryptServiceInitOptions; - -export function sendServiceFactory( - cache: { sendService?: InternalSendService } & CachedServices, - opts: SendServiceInitOptions, -): Promise { - return factory( - cache, - "sendService", - opts, - async () => - new SendService( - await cryptoServiceFactory(cache, opts), - await i18nServiceFactory(cache, opts), - await keyGenerationServiceFactory(cache, opts), - await sendStateProviderFactory(cache, opts), - await encryptServiceFactory(cache, opts), - ), - ); -} diff --git a/apps/browser/src/background/service-factories/send-state-provider.factory.ts b/apps/browser/src/background/service-factories/send-state-provider.factory.ts deleted file mode 100644 index 01319756e47..00000000000 --- a/apps/browser/src/background/service-factories/send-state-provider.factory.ts +++ /dev/null @@ -1,28 +0,0 @@ -import { SendStateProvider } from "@bitwarden/common/tools/send/services/send-state.provider"; - -import { - CachedServices, - FactoryOptions, - factory, -} from "../../platform/background/service-factories/factory-options"; -import { - StateProviderInitOptions, - stateProviderFactory, -} from "../../platform/background/service-factories/state-provider.factory"; - -type SendStateProviderFactoryOptions = FactoryOptions; - -export type SendStateProviderInitOptions = SendStateProviderFactoryOptions & - StateProviderInitOptions; - -export function sendStateProviderFactory( - cache: { sendStateProvider?: SendStateProvider } & CachedServices, - opts: SendStateProviderInitOptions, -): Promise { - return factory( - cache, - "sendStateProvider", - opts, - async () => new SendStateProvider(await stateProviderFactory(cache, opts)), - ); -} diff --git a/apps/browser/src/background/service-factories/vault-timeout-service.factory.ts b/apps/browser/src/background/service-factories/vault-timeout-service.factory.ts deleted file mode 100644 index 0b176c28f19..00000000000 --- a/apps/browser/src/background/service-factories/vault-timeout-service.factory.ts +++ /dev/null @@ -1,103 +0,0 @@ -import { VaultTimeoutService as AbstractVaultTimeoutService } from "@bitwarden/common/abstractions/vault-timeout/vault-timeout.service"; - -import { - accountServiceFactory, - AccountServiceInitOptions, -} from "../../auth/background/service-factories/account-service.factory"; -import { - authServiceFactory, - AuthServiceInitOptions, -} from "../../auth/background/service-factories/auth-service.factory"; -import { - internalMasterPasswordServiceFactory, - MasterPasswordServiceInitOptions, -} from "../../auth/background/service-factories/master-password-service.factory"; -import { - CachedServices, - factory, - FactoryOptions, -} from "../../platform/background/service-factories/factory-options"; -import { - messagingServiceFactory, - MessagingServiceInitOptions, -} from "../../platform/background/service-factories/messaging-service.factory"; -import { - platformUtilsServiceFactory, - PlatformUtilsServiceInitOptions, -} from "../../platform/background/service-factories/platform-utils-service.factory"; -import { - stateEventRunnerServiceFactory, - StateEventRunnerServiceInitOptions, -} from "../../platform/background/service-factories/state-event-runner-service.factory"; -import { - StateServiceInitOptions, - stateServiceFactory, -} from "../../platform/background/service-factories/state-service.factory"; -import VaultTimeoutService from "../../services/vault-timeout/vault-timeout.service"; -import { - cipherServiceFactory, - CipherServiceInitOptions, -} from "../../vault/background/service_factories/cipher-service.factory"; -import { - collectionServiceFactory, - CollectionServiceInitOptions, -} from "../../vault/background/service_factories/collection-service.factory"; -import { - folderServiceFactory, - FolderServiceInitOptions, -} from "../../vault/background/service_factories/folder-service.factory"; - -import { searchServiceFactory, SearchServiceInitOptions } from "./search-service.factory"; -import { - vaultTimeoutSettingsServiceFactory, - VaultTimeoutSettingsServiceInitOptions, -} from "./vault-timeout-settings-service.factory"; - -type VaultTimeoutServiceFactoryOptions = FactoryOptions & { - vaultTimeoutServiceOptions: { - lockedCallback: (userId?: string) => Promise; - loggedOutCallback: (expired: boolean, userId?: string) => Promise; - }; -}; - -export type VaultTimeoutServiceInitOptions = VaultTimeoutServiceFactoryOptions & - AccountServiceInitOptions & - MasterPasswordServiceInitOptions & - CipherServiceInitOptions & - FolderServiceInitOptions & - CollectionServiceInitOptions & - PlatformUtilsServiceInitOptions & - MessagingServiceInitOptions & - SearchServiceInitOptions & - StateServiceInitOptions & - AuthServiceInitOptions & - VaultTimeoutSettingsServiceInitOptions & - StateEventRunnerServiceInitOptions; - -export function vaultTimeoutServiceFactory( - cache: { vaultTimeoutService?: AbstractVaultTimeoutService } & CachedServices, - opts: VaultTimeoutServiceInitOptions, -): Promise { - return factory( - cache, - "vaultTimeoutService", - opts, - async () => - new VaultTimeoutService( - await accountServiceFactory(cache, opts), - await internalMasterPasswordServiceFactory(cache, opts), - await cipherServiceFactory(cache, opts), - await folderServiceFactory(cache, opts), - await collectionServiceFactory(cache, opts), - await platformUtilsServiceFactory(cache, opts), - await messagingServiceFactory(cache, opts), - await searchServiceFactory(cache, opts), - await stateServiceFactory(cache, opts), - await authServiceFactory(cache, opts), - await vaultTimeoutSettingsServiceFactory(cache, opts), - await stateEventRunnerServiceFactory(cache, opts), - opts.vaultTimeoutServiceOptions.lockedCallback, - opts.vaultTimeoutServiceOptions.loggedOutCallback, - ), - ); -} diff --git a/apps/browser/src/background/service-factories/vault-timeout-settings-service.factory.ts b/apps/browser/src/background/service-factories/vault-timeout-settings-service.factory.ts deleted file mode 100644 index 5f98d9764c3..00000000000 --- a/apps/browser/src/background/service-factories/vault-timeout-settings-service.factory.ts +++ /dev/null @@ -1,82 +0,0 @@ -import { VaultTimeoutSettingsService as AbstractVaultTimeoutSettingsService } from "@bitwarden/common/abstractions/vault-timeout/vault-timeout-settings.service"; -import { VaultTimeoutSettingsService } from "@bitwarden/common/services/vault-timeout/vault-timeout-settings.service"; -import { VaultTimeoutStringType } from "@bitwarden/common/types/vault-timeout.type"; - -import { - policyServiceFactory, - PolicyServiceInitOptions, -} from "../../admin-console/background/service-factories/policy-service.factory"; -import { - accountServiceFactory, - AccountServiceInitOptions, -} from "../../auth/background/service-factories/account-service.factory"; -import { - pinServiceFactory, - PinServiceInitOptions, -} from "../../auth/background/service-factories/pin-service.factory"; -import { - tokenServiceFactory, - TokenServiceInitOptions, -} from "../../auth/background/service-factories/token-service.factory"; -import { - userDecryptionOptionsServiceFactory, - UserDecryptionOptionsServiceInitOptions, -} from "../../auth/background/service-factories/user-decryption-options-service.factory"; -import { - biometricStateServiceFactory, - BiometricStateServiceInitOptions, -} from "../../platform/background/service-factories/biometric-state-service.factory"; -import { - CryptoServiceInitOptions, - cryptoServiceFactory, -} from "../../platform/background/service-factories/crypto-service.factory"; -import { - CachedServices, - factory, - FactoryOptions, -} from "../../platform/background/service-factories/factory-options"; -import { - logServiceFactory, - LogServiceInitOptions, -} from "../../platform/background/service-factories/log-service.factory"; -import { - StateProviderInitOptions, - stateProviderFactory, -} from "../../platform/background/service-factories/state-provider.factory"; - -type VaultTimeoutSettingsServiceFactoryOptions = FactoryOptions; - -export type VaultTimeoutSettingsServiceInitOptions = VaultTimeoutSettingsServiceFactoryOptions & - AccountServiceInitOptions & - PinServiceInitOptions & - UserDecryptionOptionsServiceInitOptions & - CryptoServiceInitOptions & - TokenServiceInitOptions & - PolicyServiceInitOptions & - BiometricStateServiceInitOptions & - StateProviderInitOptions & - LogServiceInitOptions; - -export function vaultTimeoutSettingsServiceFactory( - cache: { vaultTimeoutSettingsService?: AbstractVaultTimeoutSettingsService } & CachedServices, - opts: VaultTimeoutSettingsServiceInitOptions, -): Promise { - return factory( - cache, - "vaultTimeoutSettingsService", - opts, - async () => - new VaultTimeoutSettingsService( - await accountServiceFactory(cache, opts), - await pinServiceFactory(cache, opts), - await userDecryptionOptionsServiceFactory(cache, opts), - await cryptoServiceFactory(cache, opts), - await tokenServiceFactory(cache, opts), - await policyServiceFactory(cache, opts), - await biometricStateServiceFactory(cache, opts), - await stateProviderFactory(cache, opts), - await logServiceFactory(cache, opts), - VaultTimeoutStringType.OnRestart, // default vault timeout - ), - ); -} diff --git a/apps/browser/src/platform/background/service-factories/active-user-state-provider.factory.ts b/apps/browser/src/platform/background/service-factories/active-user-state-provider.factory.ts deleted file mode 100644 index ff46ca84e8c..00000000000 --- a/apps/browser/src/platform/background/service-factories/active-user-state-provider.factory.ts +++ /dev/null @@ -1,36 +0,0 @@ -import { ActiveUserStateProvider } from "@bitwarden/common/platform/state"; -// eslint-disable-next-line import/no-restricted-paths -- We need the implementation to inject, but generally this should not be accessed -import { DefaultActiveUserStateProvider } from "@bitwarden/common/platform/state/implementations/default-active-user-state.provider"; - -import { - AccountServiceInitOptions, - accountServiceFactory, -} from "../../../auth/background/service-factories/account-service.factory"; - -import { CachedServices, FactoryOptions, factory } from "./factory-options"; -import { - SingleUserStateProviderInitOptions, - singleUserStateProviderFactory, -} from "./single-user-state-provider.factory"; - -type ActiveUserStateProviderFactory = FactoryOptions; - -export type ActiveUserStateProviderInitOptions = ActiveUserStateProviderFactory & - AccountServiceInitOptions & - SingleUserStateProviderInitOptions; - -export async function activeUserStateProviderFactory( - cache: { activeUserStateProvider?: ActiveUserStateProvider } & CachedServices, - opts: ActiveUserStateProviderInitOptions, -): Promise { - return factory( - cache, - "activeUserStateProvider", - opts, - async () => - new DefaultActiveUserStateProvider( - await accountServiceFactory(cache, opts), - await singleUserStateProviderFactory(cache, opts), - ), - ); -} diff --git a/apps/browser/src/platform/background/service-factories/api-service.factory.ts b/apps/browser/src/platform/background/service-factories/api-service.factory.ts deleted file mode 100644 index bfae93f3d8a..00000000000 --- a/apps/browser/src/platform/background/service-factories/api-service.factory.ts +++ /dev/null @@ -1,61 +0,0 @@ -import { ApiService as AbstractApiService } from "@bitwarden/common/abstractions/api.service"; -import { ApiService } from "@bitwarden/common/services/api.service"; - -import { - tokenServiceFactory, - TokenServiceInitOptions, -} from "../../../auth/background/service-factories/token-service.factory"; -import { - vaultTimeoutSettingsServiceFactory, - VaultTimeoutSettingsServiceInitOptions, -} from "../../../background/service-factories/vault-timeout-settings-service.factory"; -import { - CachedServices, - factory, - FactoryOptions, -} from "../../background/service-factories/factory-options"; - -import { AppIdServiceInitOptions, appIdServiceFactory } from "./app-id-service.factory"; -import { - environmentServiceFactory, - EnvironmentServiceInitOptions, -} from "./environment-service.factory"; -import { - PlatformUtilsServiceInitOptions, - platformUtilsServiceFactory, -} from "./platform-utils-service.factory"; - -type ApiServiceFactoryOptions = FactoryOptions & { - apiServiceOptions: { - logoutCallback: (expired: boolean) => Promise; - customUserAgent?: string; - }; -}; - -export type ApiServiceInitOptions = ApiServiceFactoryOptions & - TokenServiceInitOptions & - PlatformUtilsServiceInitOptions & - EnvironmentServiceInitOptions & - AppIdServiceInitOptions & - VaultTimeoutSettingsServiceInitOptions; - -export function apiServiceFactory( - cache: { apiService?: AbstractApiService } & CachedServices, - opts: ApiServiceInitOptions, -): Promise { - return factory( - cache, - "apiService", - opts, - async () => - new ApiService( - await tokenServiceFactory(cache, opts), - await platformUtilsServiceFactory(cache, opts), - await environmentServiceFactory(cache, opts), - await appIdServiceFactory(cache, opts), - await vaultTimeoutSettingsServiceFactory(cache, opts), - opts.apiServiceOptions.logoutCallback, - opts.apiServiceOptions.customUserAgent, - ), - ); -} diff --git a/apps/browser/src/platform/background/service-factories/app-id-service.factory.ts b/apps/browser/src/platform/background/service-factories/app-id-service.factory.ts deleted file mode 100644 index c43584cba72..00000000000 --- a/apps/browser/src/platform/background/service-factories/app-id-service.factory.ts +++ /dev/null @@ -1,24 +0,0 @@ -import { AppIdService as AbstractAppIdService } from "@bitwarden/common/platform/abstractions/app-id.service"; -import { AppIdService } from "@bitwarden/common/platform/services/app-id.service"; - -import { FactoryOptions, CachedServices, factory } from "./factory-options"; -import { - GlobalStateProviderInitOptions, - globalStateProviderFactory, -} from "./global-state-provider.factory"; - -type AppIdServiceFactoryOptions = FactoryOptions; - -export type AppIdServiceInitOptions = AppIdServiceFactoryOptions & GlobalStateProviderInitOptions; - -export function appIdServiceFactory( - cache: { appIdService?: AbstractAppIdService } & CachedServices, - opts: AppIdServiceInitOptions, -): Promise { - return factory( - cache, - "appIdService", - opts, - async () => new AppIdService(await globalStateProviderFactory(cache, opts)), - ); -} diff --git a/apps/browser/src/platform/background/service-factories/billing-account-profile-state-service.factory.ts b/apps/browser/src/platform/background/service-factories/billing-account-profile-state-service.factory.ts deleted file mode 100644 index 378707d6be3..00000000000 --- a/apps/browser/src/platform/background/service-factories/billing-account-profile-state-service.factory.ts +++ /dev/null @@ -1,25 +0,0 @@ -import { BillingAccountProfileStateService } from "@bitwarden/common/billing/abstractions/account/billing-account-profile-state.service"; -import { DefaultBillingAccountProfileStateService } from "@bitwarden/common/billing/services/account/billing-account-profile-state.service"; - -import { FactoryOptions, CachedServices, factory } from "./factory-options"; -import { StateProviderInitOptions, stateProviderFactory } from "./state-provider.factory"; - -type BillingAccountProfileStateServiceFactoryOptions = FactoryOptions; - -export type BillingAccountProfileStateServiceInitOptions = - BillingAccountProfileStateServiceFactoryOptions & StateProviderInitOptions; - -export function billingAccountProfileStateServiceFactory( - cache: { - billingAccountProfileStateService?: BillingAccountProfileStateService; - } & CachedServices, - opts: BillingAccountProfileStateServiceInitOptions, -): Promise { - return factory( - cache, - "billingAccountProfileStateService", - opts, - async () => - new DefaultBillingAccountProfileStateService(await stateProviderFactory(cache, opts)), - ); -} diff --git a/apps/browser/src/platform/background/service-factories/biometric-state-service.factory.ts b/apps/browser/src/platform/background/service-factories/biometric-state-service.factory.ts deleted file mode 100644 index d2d4d4f9835..00000000000 --- a/apps/browser/src/platform/background/service-factories/biometric-state-service.factory.ts +++ /dev/null @@ -1,24 +0,0 @@ -import { - BiometricStateService, - DefaultBiometricStateService, -} from "@bitwarden/common/platform/biometrics/biometric-state.service"; - -import { FactoryOptions, CachedServices, factory } from "./factory-options"; -import { StateProviderInitOptions, stateProviderFactory } from "./state-provider.factory"; - -type BiometricStateServiceFactoryOptions = FactoryOptions; - -export type BiometricStateServiceInitOptions = BiometricStateServiceFactoryOptions & - StateProviderInitOptions; - -export function biometricStateServiceFactory( - cache: { biometricStateService?: BiometricStateService } & CachedServices, - opts: BiometricStateServiceInitOptions, -): Promise { - return factory( - cache, - "biometricStateService", - opts, - async () => new DefaultBiometricStateService(await stateProviderFactory(cache, opts)), - ); -} diff --git a/apps/browser/src/platform/background/service-factories/browser-script-injector-service.factory.ts b/apps/browser/src/platform/background/service-factories/browser-script-injector-service.factory.ts deleted file mode 100644 index e9a8ee379a8..00000000000 --- a/apps/browser/src/platform/background/service-factories/browser-script-injector-service.factory.ts +++ /dev/null @@ -1,33 +0,0 @@ -import { - LogServiceInitOptions, - logServiceFactory, -} from "../../background/service-factories/log-service.factory"; -import { BrowserScriptInjectorService } from "../../services/browser-script-injector.service"; - -import { CachedServices, FactoryOptions, factory } from "./factory-options"; -import { - PlatformUtilsServiceInitOptions, - platformUtilsServiceFactory, -} from "./platform-utils-service.factory"; - -type BrowserScriptInjectorServiceOptions = FactoryOptions; - -export type BrowserScriptInjectorServiceInitOptions = BrowserScriptInjectorServiceOptions & - PlatformUtilsServiceInitOptions & - LogServiceInitOptions; - -export function browserScriptInjectorServiceFactory( - cache: { browserScriptInjectorService?: BrowserScriptInjectorService } & CachedServices, - opts: BrowserScriptInjectorServiceInitOptions, -): Promise { - return factory( - cache, - "browserScriptInjectorService", - opts, - async () => - new BrowserScriptInjectorService( - await platformUtilsServiceFactory(cache, opts), - await logServiceFactory(cache, opts), - ), - ); -} diff --git a/apps/browser/src/platform/background/service-factories/config-api.service.factory.ts b/apps/browser/src/platform/background/service-factories/config-api.service.factory.ts deleted file mode 100644 index 3d7d508832b..00000000000 --- a/apps/browser/src/platform/background/service-factories/config-api.service.factory.ts +++ /dev/null @@ -1,32 +0,0 @@ -import { ConfigApiServiceAbstraction } from "@bitwarden/common/platform/abstractions/config/config-api.service.abstraction"; -import { ConfigApiService } from "@bitwarden/common/platform/services/config/config-api.service"; - -import { - tokenServiceFactory, - TokenServiceInitOptions, -} from "../../../auth/background/service-factories/token-service.factory"; - -import { apiServiceFactory, ApiServiceInitOptions } from "./api-service.factory"; -import { FactoryOptions, CachedServices, factory } from "./factory-options"; - -type ConfigApiServiceFactoyOptions = FactoryOptions; - -export type ConfigApiServiceInitOptions = ConfigApiServiceFactoyOptions & - ApiServiceInitOptions & - TokenServiceInitOptions; - -export function configApiServiceFactory( - cache: { configApiService?: ConfigApiServiceAbstraction } & CachedServices, - opts: ConfigApiServiceInitOptions, -): Promise { - return factory( - cache, - "configApiService", - opts, - async () => - new ConfigApiService( - await apiServiceFactory(cache, opts), - await tokenServiceFactory(cache, opts), - ), - ); -} diff --git a/apps/browser/src/platform/background/service-factories/config-service.factory.ts b/apps/browser/src/platform/background/service-factories/config-service.factory.ts deleted file mode 100644 index a899f8fd9af..00000000000 --- a/apps/browser/src/platform/background/service-factories/config-service.factory.ts +++ /dev/null @@ -1,37 +0,0 @@ -import { ConfigService } from "@bitwarden/common/platform/abstractions/config/config.service"; -import { DefaultConfigService } from "@bitwarden/common/platform/services/config/default-config.service"; - -import { configApiServiceFactory, ConfigApiServiceInitOptions } from "./config-api.service.factory"; -import { - environmentServiceFactory, - EnvironmentServiceInitOptions, -} from "./environment-service.factory"; -import { FactoryOptions, CachedServices, factory } from "./factory-options"; -import { logServiceFactory, LogServiceInitOptions } from "./log-service.factory"; -import { stateProviderFactory, StateProviderInitOptions } from "./state-provider.factory"; - -type ConfigServiceFactoryOptions = FactoryOptions; - -export type ConfigServiceInitOptions = ConfigServiceFactoryOptions & - ConfigApiServiceInitOptions & - EnvironmentServiceInitOptions & - LogServiceInitOptions & - StateProviderInitOptions; - -export function configServiceFactory( - cache: { configService?: ConfigService } & CachedServices, - opts: ConfigServiceInitOptions, -): Promise { - return factory( - cache, - "configService", - opts, - async () => - new DefaultConfigService( - await configApiServiceFactory(cache, opts), - await environmentServiceFactory(cache, opts), - await logServiceFactory(cache, opts), - await stateProviderFactory(cache, opts), - ), - ); -} diff --git a/apps/browser/src/platform/background/service-factories/crypto-function-service.factory.ts b/apps/browser/src/platform/background/service-factories/crypto-function-service.factory.ts deleted file mode 100644 index b9a9cc66483..00000000000 --- a/apps/browser/src/platform/background/service-factories/crypto-function-service.factory.ts +++ /dev/null @@ -1,24 +0,0 @@ -import { CryptoFunctionService } from "@bitwarden/common/platform/abstractions/crypto-function.service"; -import { WebCryptoFunctionService } from "@bitwarden/common/platform/services/web-crypto-function.service"; - -import { CachedServices, factory, FactoryOptions } from "./factory-options"; - -type CryptoFunctionServiceFactoryOptions = FactoryOptions & { - cryptoFunctionServiceOptions: { - win: Window | typeof globalThis; - }; -}; - -export type CryptoFunctionServiceInitOptions = CryptoFunctionServiceFactoryOptions; - -export function cryptoFunctionServiceFactory( - cache: { cryptoFunctionService?: CryptoFunctionService } & CachedServices, - opts: CryptoFunctionServiceFactoryOptions, -): Promise { - return factory( - cache, - "cryptoFunctionService", - opts, - () => new WebCryptoFunctionService(opts.cryptoFunctionServiceOptions.win), - ); -} diff --git a/apps/browser/src/platform/background/service-factories/crypto-service.factory.ts b/apps/browser/src/platform/background/service-factories/crypto-service.factory.ts deleted file mode 100644 index 35466a1988d..00000000000 --- a/apps/browser/src/platform/background/service-factories/crypto-service.factory.ts +++ /dev/null @@ -1,89 +0,0 @@ -import { CryptoService as AbstractCryptoService } from "@bitwarden/common/platform/abstractions/crypto.service"; - -import { - AccountServiceInitOptions, - accountServiceFactory, -} from "../../../auth/background/service-factories/account-service.factory"; -import { - KdfConfigServiceInitOptions, - kdfConfigServiceFactory, -} from "../../../auth/background/service-factories/kdf-config-service.factory"; -import { - internalMasterPasswordServiceFactory, - MasterPasswordServiceInitOptions, -} from "../../../auth/background/service-factories/master-password-service.factory"; -import { - PinServiceInitOptions, - pinServiceFactory, -} from "../../../auth/background/service-factories/pin-service.factory"; -import { - StateServiceInitOptions, - stateServiceFactory, -} from "../../../platform/background/service-factories/state-service.factory"; -import { - LogServiceInitOptions, - logServiceFactory, -} from "../../background/service-factories/log-service.factory"; -import { BrowserCryptoService } from "../../services/browser-crypto.service"; - -import { - BiometricStateServiceInitOptions, - biometricStateServiceFactory, -} from "./biometric-state-service.factory"; -import { - cryptoFunctionServiceFactory, - CryptoFunctionServiceInitOptions, -} from "./crypto-function-service.factory"; -import { encryptServiceFactory, EncryptServiceInitOptions } from "./encrypt-service.factory"; -import { FactoryOptions, CachedServices, factory } from "./factory-options"; -import { - KeyGenerationServiceInitOptions, - keyGenerationServiceFactory, -} from "./key-generation-service.factory"; -import { - PlatformUtilsServiceInitOptions, - platformUtilsServiceFactory, -} from "./platform-utils-service.factory"; -import { StateProviderInitOptions, stateProviderFactory } from "./state-provider.factory"; - -type CryptoServiceFactoryOptions = FactoryOptions; - -export type CryptoServiceInitOptions = CryptoServiceFactoryOptions & - PinServiceInitOptions & - MasterPasswordServiceInitOptions & - KeyGenerationServiceInitOptions & - CryptoFunctionServiceInitOptions & - EncryptServiceInitOptions & - PlatformUtilsServiceInitOptions & - LogServiceInitOptions & - StateServiceInitOptions & - AccountServiceInitOptions & - StateProviderInitOptions & - BiometricStateServiceInitOptions & - KdfConfigServiceInitOptions; - -export function cryptoServiceFactory( - cache: { cryptoService?: AbstractCryptoService } & CachedServices, - opts: CryptoServiceInitOptions, -): Promise { - return factory( - cache, - "cryptoService", - opts, - async () => - new BrowserCryptoService( - await pinServiceFactory(cache, opts), - await internalMasterPasswordServiceFactory(cache, opts), - await keyGenerationServiceFactory(cache, opts), - await cryptoFunctionServiceFactory(cache, opts), - await encryptServiceFactory(cache, opts), - await platformUtilsServiceFactory(cache, opts), - await logServiceFactory(cache, opts), - await stateServiceFactory(cache, opts), - await accountServiceFactory(cache, opts), - await stateProviderFactory(cache, opts), - await biometricStateServiceFactory(cache, opts), - await kdfConfigServiceFactory(cache, opts), - ), - ); -} diff --git a/apps/browser/src/platform/background/service-factories/derived-state-provider.factory.ts b/apps/browser/src/platform/background/service-factories/derived-state-provider.factory.ts deleted file mode 100644 index 2c5f8f24194..00000000000 --- a/apps/browser/src/platform/background/service-factories/derived-state-provider.factory.ts +++ /dev/null @@ -1,16 +0,0 @@ -import { DerivedStateProvider } from "@bitwarden/common/platform/state"; -// eslint-disable-next-line import/no-restricted-paths -- For dependency creation -import { InlineDerivedStateProvider } from "@bitwarden/common/platform/state/implementations/inline-derived-state"; - -import { CachedServices, FactoryOptions, factory } from "./factory-options"; - -type DerivedStateProviderFactoryOptions = FactoryOptions; - -export type DerivedStateProviderInitOptions = DerivedStateProviderFactoryOptions; - -export async function derivedStateProviderFactory( - cache: { derivedStateProvider?: DerivedStateProvider } & CachedServices, - opts: DerivedStateProviderInitOptions, -): Promise { - return factory(cache, "derivedStateProvider", opts, async () => new InlineDerivedStateProvider()); -} diff --git a/apps/browser/src/platform/background/service-factories/encrypt-service.factory.ts b/apps/browser/src/platform/background/service-factories/encrypt-service.factory.ts deleted file mode 100644 index 055e5235914..00000000000 --- a/apps/browser/src/platform/background/service-factories/encrypt-service.factory.ts +++ /dev/null @@ -1,39 +0,0 @@ -import { EncryptServiceImplementation } from "@bitwarden/common/platform/services/cryptography/encrypt.service.implementation"; - -import { - LogServiceInitOptions, - logServiceFactory, -} from "../../background/service-factories/log-service.factory"; - -import { - cryptoFunctionServiceFactory, - CryptoFunctionServiceInitOptions, -} from "./crypto-function-service.factory"; -import { FactoryOptions, CachedServices, factory } from "./factory-options"; - -type EncryptServiceFactoryOptions = FactoryOptions & { - encryptServiceOptions: { - logMacFailures: boolean; - }; -}; - -export type EncryptServiceInitOptions = EncryptServiceFactoryOptions & - CryptoFunctionServiceInitOptions & - LogServiceInitOptions; - -export function encryptServiceFactory( - cache: { encryptService?: EncryptServiceImplementation } & CachedServices, - opts: EncryptServiceInitOptions, -): Promise { - return factory( - cache, - "encryptService", - opts, - async () => - new EncryptServiceImplementation( - await cryptoFunctionServiceFactory(cache, opts), - await logServiceFactory(cache, opts), - opts.encryptServiceOptions.logMacFailures, - ), - ); -} diff --git a/apps/browser/src/platform/background/service-factories/environment-service.factory.ts b/apps/browser/src/platform/background/service-factories/environment-service.factory.ts deleted file mode 100644 index 38ab62de482..00000000000 --- a/apps/browser/src/platform/background/service-factories/environment-service.factory.ts +++ /dev/null @@ -1,33 +0,0 @@ -import { - accountServiceFactory, - AccountServiceInitOptions, -} from "../../../auth/background/service-factories/account-service.factory"; -import { BrowserEnvironmentService } from "../../services/browser-environment.service"; - -import { CachedServices, factory, FactoryOptions } from "./factory-options"; -import { logServiceFactory, LogServiceInitOptions } from "./log-service.factory"; -import { stateProviderFactory, StateProviderInitOptions } from "./state-provider.factory"; - -type EnvironmentServiceFactoryOptions = FactoryOptions; - -export type EnvironmentServiceInitOptions = EnvironmentServiceFactoryOptions & - StateProviderInitOptions & - AccountServiceInitOptions & - LogServiceInitOptions; - -export function environmentServiceFactory( - cache: { environmentService?: BrowserEnvironmentService } & CachedServices, - opts: EnvironmentServiceInitOptions, -): Promise { - return factory( - cache, - "environmentService", - opts, - async () => - new BrowserEnvironmentService( - await logServiceFactory(cache, opts), - await stateProviderFactory(cache, opts), - await accountServiceFactory(cache, opts), - ), - ); -} diff --git a/apps/browser/src/platform/background/service-factories/factory-options.ts b/apps/browser/src/platform/background/service-factories/factory-options.ts deleted file mode 100644 index 4219a67181e..00000000000 --- a/apps/browser/src/platform/background/service-factories/factory-options.ts +++ /dev/null @@ -1,30 +0,0 @@ -export type CachedServices = Record; - -export type FactoryOptions = { - alwaysInitializeNewService?: boolean; - doNotStoreInitializedService?: boolean; - [optionsKey: string]: unknown; -}; - -export async function factory< - TCache extends CachedServices, - TName extends keyof TCache, - TOpts extends FactoryOptions, ->( - cachedServices: TCache, - name: TName, - opts: TOpts, - factory: () => TCache[TName] | Promise, -): Promise { - let instance = cachedServices[name]; - if (opts.alwaysInitializeNewService || !instance) { - const instanceOrPromise = factory(); - instance = instanceOrPromise instanceof Promise ? await instanceOrPromise : instanceOrPromise; - } - - if (!opts.doNotStoreInitializedService) { - cachedServices[name] = instance; - } - - return instance as TCache[TName]; -} diff --git a/apps/browser/src/platform/background/service-factories/file-upload-service.factory.ts b/apps/browser/src/platform/background/service-factories/file-upload-service.factory.ts deleted file mode 100644 index 77b5703619b..00000000000 --- a/apps/browser/src/platform/background/service-factories/file-upload-service.factory.ts +++ /dev/null @@ -1,26 +0,0 @@ -import { FileUploadService as FileUploadServiceAbstraction } from "@bitwarden/common/platform/abstractions/file-upload/file-upload.service"; -import { FileUploadService } from "@bitwarden/common/platform/services/file-upload/file-upload.service"; - -import { - CachedServices, - factory, - FactoryOptions, -} from "../../background/service-factories/factory-options"; - -import { logServiceFactory, LogServiceInitOptions } from "./log-service.factory"; - -type FileUploadServiceFactoryOptions = FactoryOptions; - -export type FileUploadServiceInitOptions = FileUploadServiceFactoryOptions & LogServiceInitOptions; - -export function fileUploadServiceFactory( - cache: { fileUploadService?: FileUploadServiceAbstraction } & CachedServices, - opts: FileUploadServiceInitOptions, -): Promise { - return factory( - cache, - "fileUploadService", - opts, - async () => new FileUploadService(await logServiceFactory(cache, opts)), - ); -} diff --git a/apps/browser/src/platform/background/service-factories/global-state-provider.factory.ts b/apps/browser/src/platform/background/service-factories/global-state-provider.factory.ts deleted file mode 100644 index 154c212f046..00000000000 --- a/apps/browser/src/platform/background/service-factories/global-state-provider.factory.ts +++ /dev/null @@ -1,26 +0,0 @@ -import { GlobalStateProvider } from "@bitwarden/common/platform/state"; -// eslint-disable-next-line import/no-restricted-paths -- We need the implementation to inject, but generally this should not be accessed -import { DefaultGlobalStateProvider } from "@bitwarden/common/platform/state/implementations/default-global-state.provider"; - -import { CachedServices, FactoryOptions, factory } from "./factory-options"; -import { - StorageServiceProviderInitOptions, - storageServiceProviderFactory, -} from "./storage-service-provider.factory"; - -type GlobalStateProviderFactoryOptions = FactoryOptions; - -export type GlobalStateProviderInitOptions = GlobalStateProviderFactoryOptions & - StorageServiceProviderInitOptions; - -export async function globalStateProviderFactory( - cache: { globalStateProvider?: GlobalStateProvider } & CachedServices, - opts: GlobalStateProviderInitOptions, -): Promise { - return factory( - cache, - "globalStateProvider", - opts, - async () => new DefaultGlobalStateProvider(await storageServiceProviderFactory(cache, opts)), - ); -} diff --git a/apps/browser/src/platform/background/service-factories/i18n-service.factory.ts b/apps/browser/src/platform/background/service-factories/i18n-service.factory.ts deleted file mode 100644 index 9f9580df843..00000000000 --- a/apps/browser/src/platform/background/service-factories/i18n-service.factory.ts +++ /dev/null @@ -1,38 +0,0 @@ -import { I18nService as AbstractI18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; -import { I18nService as BaseI18nService } from "@bitwarden/common/platform/services/i18n.service"; - -import I18nService from "../../services/i18n.service"; - -import { FactoryOptions, CachedServices, factory } from "./factory-options"; -import { - GlobalStateProviderInitOptions, - globalStateProviderFactory, -} from "./global-state-provider.factory"; - -type I18nServiceFactoryOptions = FactoryOptions & { - i18nServiceOptions: { - systemLanguage: string; - }; -}; - -export type I18nServiceInitOptions = I18nServiceFactoryOptions & GlobalStateProviderInitOptions; - -export async function i18nServiceFactory( - cache: { i18nService?: AbstractI18nService } & CachedServices, - opts: I18nServiceInitOptions, -): Promise { - const service = await factory( - cache, - "i18nService", - opts, - async () => - new I18nService( - opts.i18nServiceOptions.systemLanguage, - await globalStateProviderFactory(cache, opts), - ), - ); - if (!(service as BaseI18nService as any).inited) { - await (service as BaseI18nService).init(); - } - return service; -} diff --git a/apps/browser/src/platform/background/service-factories/key-generation-service.factory.ts b/apps/browser/src/platform/background/service-factories/key-generation-service.factory.ts deleted file mode 100644 index accba0023aa..00000000000 --- a/apps/browser/src/platform/background/service-factories/key-generation-service.factory.ts +++ /dev/null @@ -1,25 +0,0 @@ -import { KeyGenerationService as KeyGenerationServiceAbstraction } from "@bitwarden/common/platform/abstractions/key-generation.service"; -import { KeyGenerationService } from "@bitwarden/common/platform/services/key-generation.service"; - -import { - cryptoFunctionServiceFactory, - CryptoFunctionServiceInitOptions, -} from "./crypto-function-service.factory"; -import { FactoryOptions, CachedServices, factory } from "./factory-options"; - -type KeyGenerationServiceFactoryOptions = FactoryOptions; - -export type KeyGenerationServiceInitOptions = KeyGenerationServiceFactoryOptions & - CryptoFunctionServiceInitOptions; - -export function keyGenerationServiceFactory( - cache: { keyGenerationService?: KeyGenerationServiceAbstraction } & CachedServices, - opts: KeyGenerationServiceInitOptions, -): Promise { - return factory( - cache, - "keyGenerationService", - opts, - async () => new KeyGenerationService(await cryptoFunctionServiceFactory(cache, opts)), - ); -} diff --git a/apps/browser/src/platform/background/service-factories/log-service.factory.ts b/apps/browser/src/platform/background/service-factories/log-service.factory.ts deleted file mode 100644 index 7e171ee3104..00000000000 --- a/apps/browser/src/platform/background/service-factories/log-service.factory.ts +++ /dev/null @@ -1,26 +0,0 @@ -import { LogService } from "@bitwarden/common/platform/abstractions/log.service"; -import { LogLevelType } from "@bitwarden/common/platform/enums/log-level-type.enum"; -import { ConsoleLogService } from "@bitwarden/common/platform/services/console-log.service"; - -import { FactoryOptions, CachedServices, factory } from "./factory-options"; - -type LogServiceFactoryOptions = FactoryOptions & { - logServiceOptions: { - isDev: boolean; - filter?: (level: LogLevelType) => boolean; - }; -}; - -export type LogServiceInitOptions = LogServiceFactoryOptions; - -export function logServiceFactory( - cache: { logService?: LogService } & CachedServices, - opts: LogServiceInitOptions, -): Promise { - return factory( - cache, - "logService", - opts, - () => new ConsoleLogService(opts.logServiceOptions.isDev, opts.logServiceOptions.filter), - ); -} diff --git a/apps/browser/src/platform/background/service-factories/message-sender.factory.ts b/apps/browser/src/platform/background/service-factories/message-sender.factory.ts deleted file mode 100644 index 6f50b4b8f57..00000000000 --- a/apps/browser/src/platform/background/service-factories/message-sender.factory.ts +++ /dev/null @@ -1,17 +0,0 @@ -import { MessageSender } from "@bitwarden/common/platform/messaging"; - -import { CachedServices, factory, FactoryOptions } from "./factory-options"; - -type MessagingServiceFactoryOptions = FactoryOptions; - -export type MessageSenderInitOptions = MessagingServiceFactoryOptions; - -export function messageSenderFactory( - cache: { messagingService?: MessageSender } & CachedServices, - opts: MessageSenderInitOptions, -): Promise { - // NOTE: Name needs to match that of MainBackground property until we delete these. - return factory(cache, "messagingService", opts, () => { - throw new Error("Not implemented, not expected to be used."); - }); -} diff --git a/apps/browser/src/platform/background/service-factories/messaging-service.factory.ts b/apps/browser/src/platform/background/service-factories/messaging-service.factory.ts deleted file mode 100644 index 20c6e3f424b..00000000000 --- a/apps/browser/src/platform/background/service-factories/messaging-service.factory.ts +++ /dev/null @@ -1,5 +0,0 @@ -// Export old messaging service stuff to minimize changes -export { - messageSenderFactory as messagingServiceFactory, - MessageSenderInitOptions as MessagingServiceInitOptions, -} from "./message-sender.factory"; diff --git a/apps/browser/src/platform/background/service-factories/migration-runner.factory.ts b/apps/browser/src/platform/background/service-factories/migration-runner.factory.ts deleted file mode 100644 index 090531f7cfc..00000000000 --- a/apps/browser/src/platform/background/service-factories/migration-runner.factory.ts +++ /dev/null @@ -1,34 +0,0 @@ -import { ClientType } from "@bitwarden/common/enums"; -import { MigrationBuilderService } from "@bitwarden/common/platform/services/migration-builder.service"; -import { MigrationRunner } from "@bitwarden/common/platform/services/migration-runner"; - -import { CachedServices, FactoryOptions, factory } from "./factory-options"; -import { LogServiceInitOptions, logServiceFactory } from "./log-service.factory"; -import { - DiskStorageServiceInitOptions, - diskStorageServiceFactory, -} from "./storage-service.factory"; - -type MigrationRunnerFactory = FactoryOptions; - -export type MigrationRunnerInitOptions = MigrationRunnerFactory & - DiskStorageServiceInitOptions & - LogServiceInitOptions; - -export async function migrationRunnerFactory( - cache: { migrationRunner?: MigrationRunner } & CachedServices, - opts: MigrationRunnerInitOptions, -): Promise { - return factory( - cache, - "migrationRunner", - opts, - async () => - new MigrationRunner( - await diskStorageServiceFactory(cache, opts), - await logServiceFactory(cache, opts), - new MigrationBuilderService(), - ClientType.Browser, - ), - ); -} diff --git a/apps/browser/src/platform/background/service-factories/platform-utils-service.factory.ts b/apps/browser/src/platform/background/service-factories/platform-utils-service.factory.ts deleted file mode 100644 index 2cd34ba412b..00000000000 --- a/apps/browser/src/platform/background/service-factories/platform-utils-service.factory.ts +++ /dev/null @@ -1,36 +0,0 @@ -import { PlatformUtilsService } from "@bitwarden/common/platform/abstractions/platform-utils.service"; - -import { BackgroundPlatformUtilsService } from "../../services/platform-utils/background-platform-utils.service"; - -import { CachedServices, factory, FactoryOptions } from "./factory-options"; -import { MessagingServiceInitOptions, messagingServiceFactory } from "./messaging-service.factory"; - -type PlatformUtilsServiceFactoryOptions = FactoryOptions & { - platformUtilsServiceOptions: { - clipboardWriteCallback: (clipboardValue: string, clearMs: number) => Promise; - biometricCallback: () => Promise; - win: Window & typeof globalThis; - }; -}; - -export type PlatformUtilsServiceInitOptions = PlatformUtilsServiceFactoryOptions & - MessagingServiceInitOptions; - -export function platformUtilsServiceFactory( - cache: { platformUtilsService?: PlatformUtilsService } & CachedServices, - opts: PlatformUtilsServiceInitOptions, -): Promise { - return factory( - cache, - "platformUtilsService", - opts, - async () => - new BackgroundPlatformUtilsService( - await messagingServiceFactory(cache, opts), - opts.platformUtilsServiceOptions.clipboardWriteCallback, - opts.platformUtilsServiceOptions.biometricCallback, - opts.platformUtilsServiceOptions.win, - null, - ), - ); -} diff --git a/apps/browser/src/platform/background/service-factories/single-user-state-provider.factory.ts b/apps/browser/src/platform/background/service-factories/single-user-state-provider.factory.ts deleted file mode 100644 index 87eaa8e95a5..00000000000 --- a/apps/browser/src/platform/background/service-factories/single-user-state-provider.factory.ts +++ /dev/null @@ -1,35 +0,0 @@ -import { SingleUserStateProvider } from "@bitwarden/common/platform/state"; -// eslint-disable-next-line import/no-restricted-paths -- We need the implementation to inject, but generally this should not be accessed -import { DefaultSingleUserStateProvider } from "@bitwarden/common/platform/state/implementations/default-single-user-state.provider"; - -import { CachedServices, FactoryOptions, factory } from "./factory-options"; -import { - StateEventRegistrarServiceInitOptions, - stateEventRegistrarServiceFactory, -} from "./state-event-registrar-service.factory"; -import { - StorageServiceProviderInitOptions, - storageServiceProviderFactory, -} from "./storage-service-provider.factory"; - -type SingleUserStateProviderFactoryOptions = FactoryOptions; - -export type SingleUserStateProviderInitOptions = SingleUserStateProviderFactoryOptions & - StorageServiceProviderInitOptions & - StateEventRegistrarServiceInitOptions; - -export async function singleUserStateProviderFactory( - cache: { singleUserStateProvider?: SingleUserStateProvider } & CachedServices, - opts: SingleUserStateProviderInitOptions, -): Promise { - return factory( - cache, - "singleUserStateProvider", - opts, - async () => - new DefaultSingleUserStateProvider( - await storageServiceProviderFactory(cache, opts), - await stateEventRegistrarServiceFactory(cache, opts), - ), - ); -} diff --git a/apps/browser/src/platform/background/service-factories/state-event-registrar-service.factory.ts b/apps/browser/src/platform/background/service-factories/state-event-registrar-service.factory.ts deleted file mode 100644 index ca203a810b8..00000000000 --- a/apps/browser/src/platform/background/service-factories/state-event-registrar-service.factory.ts +++ /dev/null @@ -1,36 +0,0 @@ -// eslint-disable-next-line import/no-restricted-paths -import { StateEventRegistrarService } from "@bitwarden/common/platform/state/state-event-registrar.service"; - -import { CachedServices, FactoryOptions, factory } from "./factory-options"; -import { - GlobalStateProviderInitOptions, - globalStateProviderFactory, -} from "./global-state-provider.factory"; -import { - StorageServiceProviderInitOptions, - storageServiceProviderFactory, -} from "./storage-service-provider.factory"; - -type StateEventRegistrarServiceFactoryOptions = FactoryOptions; - -export type StateEventRegistrarServiceInitOptions = StateEventRegistrarServiceFactoryOptions & - GlobalStateProviderInitOptions & - StorageServiceProviderInitOptions; - -export async function stateEventRegistrarServiceFactory( - cache: { - stateEventRegistrarService?: StateEventRegistrarService; - } & CachedServices, - opts: StateEventRegistrarServiceInitOptions, -): Promise { - return factory( - cache, - "stateEventRegistrarService", - opts, - async () => - new StateEventRegistrarService( - await globalStateProviderFactory(cache, opts), - await storageServiceProviderFactory(cache, opts), - ), - ); -} diff --git a/apps/browser/src/platform/background/service-factories/state-event-runner-service.factory.ts b/apps/browser/src/platform/background/service-factories/state-event-runner-service.factory.ts deleted file mode 100644 index c81384cd4ac..00000000000 --- a/apps/browser/src/platform/background/service-factories/state-event-runner-service.factory.ts +++ /dev/null @@ -1,33 +0,0 @@ -import { StateEventRunnerService } from "@bitwarden/common/platform/state"; - -import { CachedServices, FactoryOptions, factory } from "./factory-options"; -import { - GlobalStateProviderInitOptions, - globalStateProviderFactory, -} from "./global-state-provider.factory"; -import { - StorageServiceProviderInitOptions, - storageServiceProviderFactory, -} from "./storage-service-provider.factory"; - -type StateEventRunnerServiceFactoryOptions = FactoryOptions; - -export type StateEventRunnerServiceInitOptions = StateEventRunnerServiceFactoryOptions & - GlobalStateProviderInitOptions & - StorageServiceProviderInitOptions; - -export function stateEventRunnerServiceFactory( - cache: { stateEventRunnerService?: StateEventRunnerService } & CachedServices, - opts: StateEventRunnerServiceInitOptions, -): Promise { - return factory( - cache, - "stateEventRunnerService", - opts, - async () => - new StateEventRunnerService( - await globalStateProviderFactory(cache, opts), - await storageServiceProviderFactory(cache, opts), - ), - ); -} diff --git a/apps/browser/src/platform/background/service-factories/state-provider.factory.ts b/apps/browser/src/platform/background/service-factories/state-provider.factory.ts deleted file mode 100644 index b5ae9c709f9..00000000000 --- a/apps/browser/src/platform/background/service-factories/state-provider.factory.ts +++ /dev/null @@ -1,47 +0,0 @@ -import { StateProvider } from "@bitwarden/common/platform/state"; -// eslint-disable-next-line import/no-restricted-paths -- We need the implementation to inject, but generally this should not be accessed -import { DefaultStateProvider } from "@bitwarden/common/platform/state/implementations/default-state.provider"; - -import { - ActiveUserStateProviderInitOptions, - activeUserStateProviderFactory, -} from "./active-user-state-provider.factory"; -import { - DerivedStateProviderInitOptions, - derivedStateProviderFactory, -} from "./derived-state-provider.factory"; -import { CachedServices, FactoryOptions, factory } from "./factory-options"; -import { - GlobalStateProviderInitOptions, - globalStateProviderFactory, -} from "./global-state-provider.factory"; -import { - SingleUserStateProviderInitOptions, - singleUserStateProviderFactory, -} from "./single-user-state-provider.factory"; - -type StateProviderFactoryOptions = FactoryOptions; - -export type StateProviderInitOptions = StateProviderFactoryOptions & - GlobalStateProviderInitOptions & - ActiveUserStateProviderInitOptions & - SingleUserStateProviderInitOptions & - DerivedStateProviderInitOptions; - -export async function stateProviderFactory( - cache: { stateProvider?: StateProvider } & CachedServices, - opts: StateProviderInitOptions, -): Promise { - return factory( - cache, - "stateProvider", - opts, - async () => - new DefaultStateProvider( - await activeUserStateProviderFactory(cache, opts), - await singleUserStateProviderFactory(cache, opts), - await globalStateProviderFactory(cache, opts), - await derivedStateProviderFactory(cache, opts), - ), - ); -} diff --git a/apps/browser/src/platform/background/service-factories/state-service.factory.ts b/apps/browser/src/platform/background/service-factories/state-service.factory.ts deleted file mode 100644 index 026a29668eb..00000000000 --- a/apps/browser/src/platform/background/service-factories/state-service.factory.ts +++ /dev/null @@ -1,71 +0,0 @@ -import { StateFactory } from "@bitwarden/common/platform/factories/state-factory"; -import { GlobalState } from "@bitwarden/common/platform/models/domain/global-state"; - -import { - accountServiceFactory, - AccountServiceInitOptions, -} from "../../../auth/background/service-factories/account-service.factory"; -import { - tokenServiceFactory, - TokenServiceInitOptions, -} from "../../../auth/background/service-factories/token-service.factory"; -import { Account } from "../../../models/account"; -import { DefaultBrowserStateService } from "../../services/default-browser-state.service"; - -import { - environmentServiceFactory, - EnvironmentServiceInitOptions, -} from "./environment-service.factory"; -import { CachedServices, factory, FactoryOptions } from "./factory-options"; -import { logServiceFactory, LogServiceInitOptions } from "./log-service.factory"; -import { migrationRunnerFactory, MigrationRunnerInitOptions } from "./migration-runner.factory"; -import { - diskStorageServiceFactory, - secureStorageServiceFactory, - memoryStorageServiceFactory, - DiskStorageServiceInitOptions, - SecureStorageServiceInitOptions, - MemoryStorageServiceInitOptions, -} from "./storage-service.factory"; - -type StateServiceFactoryOptions = FactoryOptions & { - stateServiceOptions: { - stateFactory: StateFactory; - }; -}; - -export type StateServiceInitOptions = StateServiceFactoryOptions & - DiskStorageServiceInitOptions & - SecureStorageServiceInitOptions & - MemoryStorageServiceInitOptions & - LogServiceInitOptions & - AccountServiceInitOptions & - EnvironmentServiceInitOptions & - TokenServiceInitOptions & - MigrationRunnerInitOptions; - -export async function stateServiceFactory( - cache: { stateService?: DefaultBrowserStateService } & CachedServices, - opts: StateServiceInitOptions, -): Promise { - const service = await factory( - cache, - "stateService", - opts, - async () => - new DefaultBrowserStateService( - await diskStorageServiceFactory(cache, opts), - await secureStorageServiceFactory(cache, opts), - await memoryStorageServiceFactory(cache, opts), - await logServiceFactory(cache, opts), - opts.stateServiceOptions.stateFactory, - await accountServiceFactory(cache, opts), - await environmentServiceFactory(cache, opts), - await tokenServiceFactory(cache, opts), - await migrationRunnerFactory(cache, opts), - ), - ); - // TODO: If we run migration through a chrome installed/updated event we can turn off running migrations - await service.init(); - return service; -} diff --git a/apps/browser/src/platform/background/service-factories/storage-service-provider.factory.ts b/apps/browser/src/platform/background/service-factories/storage-service-provider.factory.ts deleted file mode 100644 index 8a2ddeb9e82..00000000000 --- a/apps/browser/src/platform/background/service-factories/storage-service-provider.factory.ts +++ /dev/null @@ -1,33 +0,0 @@ -import { StorageServiceProvider } from "@bitwarden/common/platform/services/storage-service.provider"; - -import { CachedServices, FactoryOptions, factory } from "./factory-options"; -import { - DiskStorageServiceInitOptions, - MemoryStorageServiceInitOptions, - observableDiskStorageServiceFactory, - observableMemoryStorageServiceFactory, -} from "./storage-service.factory"; - -type StorageServiceProviderFactoryOptions = FactoryOptions; - -export type StorageServiceProviderInitOptions = StorageServiceProviderFactoryOptions & - MemoryStorageServiceInitOptions & - DiskStorageServiceInitOptions; - -export async function storageServiceProviderFactory( - cache: { - storageServiceProvider?: StorageServiceProvider; - } & CachedServices, - opts: StorageServiceProviderInitOptions, -): Promise { - return factory( - cache, - "storageServiceProvider", - opts, - async () => - new StorageServiceProvider( - await observableDiskStorageServiceFactory(cache, opts), - await observableMemoryStorageServiceFactory(cache, opts), - ), - ); -} diff --git a/apps/browser/src/platform/background/service-factories/storage-service.factory.ts b/apps/browser/src/platform/background/service-factories/storage-service.factory.ts deleted file mode 100644 index 764842d7516..00000000000 --- a/apps/browser/src/platform/background/service-factories/storage-service.factory.ts +++ /dev/null @@ -1,106 +0,0 @@ -import { - AbstractStorageService, - ObservableStorageService, -} from "@bitwarden/common/platform/abstractions/storage.service"; -import { Lazy } from "@bitwarden/common/platform/misc/lazy"; -import { SymmetricCryptoKey } from "@bitwarden/common/platform/models/domain/symmetric-crypto-key"; -import { MemoryStorageService } from "@bitwarden/common/platform/services/memory-storage.service"; - -import { BrowserApi } from "../../browser/browser-api"; -import BrowserLocalStorageService from "../../services/browser-local-storage.service"; -import BrowserMemoryStorageService from "../../services/browser-memory-storage.service"; -import { LocalBackedSessionStorageService } from "../../services/local-backed-session-storage.service"; -import { BackgroundMemoryStorageService } from "../../storage/background-memory-storage.service"; - -import { EncryptServiceInitOptions, encryptServiceFactory } from "./encrypt-service.factory"; -import { CachedServices, factory, FactoryOptions } from "./factory-options"; -import { - KeyGenerationServiceInitOptions, - keyGenerationServiceFactory, -} from "./key-generation-service.factory"; -import { LogServiceInitOptions, logServiceFactory } from "./log-service.factory"; -import { - PlatformUtilsServiceInitOptions, - platformUtilsServiceFactory, -} from "./platform-utils-service.factory"; - -export type DiskStorageServiceInitOptions = FactoryOptions; -export type SecureStorageServiceInitOptions = FactoryOptions; -export type SessionStorageServiceInitOptions = FactoryOptions; -export type MemoryStorageServiceInitOptions = FactoryOptions & - EncryptServiceInitOptions & - KeyGenerationServiceInitOptions & - DiskStorageServiceInitOptions & - SessionStorageServiceInitOptions & - LogServiceInitOptions & - PlatformUtilsServiceInitOptions; - -export function diskStorageServiceFactory( - cache: { diskStorageService?: AbstractStorageService } & CachedServices, - opts: DiskStorageServiceInitOptions, -): Promise { - return factory(cache, "diskStorageService", opts, () => new BrowserLocalStorageService()); -} -export function observableDiskStorageServiceFactory( - cache: { - diskStorageService?: AbstractStorageService & ObservableStorageService; - } & CachedServices, - opts: DiskStorageServiceInitOptions, -): Promise { - return factory(cache, "diskStorageService", opts, () => new BrowserLocalStorageService()); -} - -export function secureStorageServiceFactory( - cache: { secureStorageService?: AbstractStorageService } & CachedServices, - opts: SecureStorageServiceInitOptions, -): Promise { - return factory(cache, "secureStorageService", opts, () => new BrowserLocalStorageService()); -} - -export function sessionStorageServiceFactory( - cache: { sessionStorageService?: AbstractStorageService } & CachedServices, - opts: SessionStorageServiceInitOptions, -): Promise { - return factory(cache, "sessionStorageService", opts, () => new BrowserMemoryStorageService()); -} - -export function memoryStorageServiceFactory( - cache: { memoryStorageService?: AbstractStorageService } & CachedServices, - opts: MemoryStorageServiceInitOptions, -): Promise { - return factory(cache, "memoryStorageService", opts, async () => { - if (BrowserApi.isManifestVersion(3)) { - return new LocalBackedSessionStorageService( - new Lazy(async () => { - const existingKey = await ( - await sessionStorageServiceFactory(cache, opts) - ).get("session-key"); - if (existingKey) { - return existingKey; - } - const { derivedKey } = await ( - await keyGenerationServiceFactory(cache, opts) - ).createKeyWithPurpose(128, "ephemeral", "bitwarden-ephemeral"); - await (await sessionStorageServiceFactory(cache, opts)).save("session-key", derivedKey); - return derivedKey; - }), - await diskStorageServiceFactory(cache, opts), - await encryptServiceFactory(cache, opts), - await platformUtilsServiceFactory(cache, opts), - await logServiceFactory(cache, opts), - ); - } - return new MemoryStorageService(); - }); -} - -export function observableMemoryStorageServiceFactory( - cache: { - memoryStorageService?: AbstractStorageService & ObservableStorageService; - } & CachedServices, - opts: MemoryStorageServiceInitOptions, -): Promise { - return factory(cache, "memoryStorageService", opts, async () => { - return new BackgroundMemoryStorageService(); - }); -} diff --git a/apps/browser/src/platform/listeners/combine.spec.ts b/apps/browser/src/platform/listeners/combine.spec.ts deleted file mode 100644 index 10a0fd30d1d..00000000000 --- a/apps/browser/src/platform/listeners/combine.spec.ts +++ /dev/null @@ -1,27 +0,0 @@ -import { combine } from "./combine"; - -describe("combine", () => { - it("runs", async () => { - const combined = combine([ - (arg: Record, serviceCache: Record) => { - arg["one"] = true; - serviceCache["one"] = true; - return Promise.resolve(); - }, - (arg: Record, serviceCache: Record) => { - if (serviceCache["one"] !== true) { - throw new Error("One should have ran."); - } - arg["two"] = true; - return Promise.resolve(); - }, - ]); - - const arg: Record = {}; - await combined(arg); - - expect(arg["one"]).toBeTruthy(); - - expect(arg["two"]).toBeTruthy(); - }); -}); diff --git a/apps/browser/src/platform/listeners/combine.ts b/apps/browser/src/platform/listeners/combine.ts deleted file mode 100644 index 4737da2cbf7..00000000000 --- a/apps/browser/src/platform/listeners/combine.ts +++ /dev/null @@ -1,15 +0,0 @@ -import { CachedServices } from "../background/service-factories/factory-options"; - -type Listener = (...args: [...T, CachedServices]) => Promise; - -export const combine = ( - listeners: Listener[], - startingServices: CachedServices = {}, -) => { - return async (...args: T) => { - const cachedServices = { ...startingServices }; - for (const listener of listeners) { - await listener(...[...args, cachedServices]); - } - }; -}; diff --git a/apps/browser/src/platform/listeners/index.ts b/apps/browser/src/platform/listeners/index.ts deleted file mode 100644 index 60e304402aa..00000000000 --- a/apps/browser/src/platform/listeners/index.ts +++ /dev/null @@ -1,49 +0,0 @@ -import { CipherContextMenuHandler } from "../../autofill/browser/cipher-context-menu-handler"; -import { ContextMenuClickedHandler } from "../../autofill/browser/context-menu-clicked-handler"; - -import { combine } from "./combine"; -import { onCommandListener } from "./on-command-listener"; -import { onInstallListener } from "./on-install-listener"; -import { UpdateBadge } from "./update-badge"; - -const windowsOnFocusChangedListener = combine([ - UpdateBadge.windowsOnFocusChangedListener, - CipherContextMenuHandler.windowsOnFocusChangedListener, -]); - -const tabsOnActivatedListener = combine([ - UpdateBadge.tabsOnActivatedListener, - CipherContextMenuHandler.tabsOnActivatedListener, -]); - -const tabsOnReplacedListener = combine([ - UpdateBadge.tabsOnReplacedListener, - CipherContextMenuHandler.tabsOnReplacedListener, -]); - -const tabsOnUpdatedListener = combine([ - UpdateBadge.tabsOnUpdatedListener, - CipherContextMenuHandler.tabsOnUpdatedListener, -]); - -const contextMenusClickedListener = ContextMenuClickedHandler.onClickedListener; - -// TODO: All message listeners should be RuntimeMessage in Notifications follow up then this type annotation can be inferred -const runtimeMessageListener = combine< - [message: { command: string }, sender: chrome.runtime.MessageSender] ->([ - UpdateBadge.messageListener, - CipherContextMenuHandler.messageListener, - ContextMenuClickedHandler.messageListener, -]); - -export { - windowsOnFocusChangedListener, - tabsOnActivatedListener, - tabsOnReplacedListener, - tabsOnUpdatedListener, - contextMenusClickedListener, - runtimeMessageListener, - onCommandListener, - onInstallListener, -}; diff --git a/apps/browser/src/platform/listeners/on-command-listener.ts b/apps/browser/src/platform/listeners/on-command-listener.ts deleted file mode 100644 index fc2939dce82..00000000000 --- a/apps/browser/src/platform/listeners/on-command-listener.ts +++ /dev/null @@ -1,109 +0,0 @@ -import { AuthenticationStatus } from "@bitwarden/common/auth/enums/authentication-status"; -import { StateFactory } from "@bitwarden/common/platform/factories/state-factory"; -import { GlobalState } from "@bitwarden/common/platform/models/domain/global-state"; - -import { authServiceFactory } from "../../auth/background/service-factories/auth-service.factory"; -import { autofillServiceFactory } from "../../autofill/background/service_factories/autofill-service.factory"; -import { autofillSettingsServiceFactory } from "../../autofill/background/service_factories/autofill-settings-service.factory"; -import { GeneratePasswordToClipboardCommand } from "../../autofill/clipboard"; -import { AutofillTabCommand } from "../../autofill/commands/autofill-tab-command"; -import { Account } from "../../models/account"; -import { - passwordGenerationServiceFactory, - PasswordGenerationServiceInitOptions, -} from "../../tools/background/service_factories/password-generation-service.factory"; -import { CachedServices } from "../background/service-factories/factory-options"; -import { logServiceFactory } from "../background/service-factories/log-service.factory"; -import { BrowserApi } from "../browser/browser-api"; - -export const onCommandListener = async (command: string, tab: chrome.tabs.Tab) => { - switch (command) { - case "autofill_login": - await doAutoFillLogin(tab); - break; - case "generate_password": - await doGeneratePasswordToClipboard(tab); - break; - } -}; - -const doAutoFillLogin = async (tab: chrome.tabs.Tab): Promise => { - const cachedServices: CachedServices = {}; - const opts = { - cryptoFunctionServiceOptions: { - win: self, - }, - encryptServiceOptions: { - logMacFailures: true, - }, - logServiceOptions: { - isDev: false, - }, - platformUtilsServiceOptions: { - clipboardWriteCallback: () => Promise.resolve(), - biometricCallback: () => Promise.resolve(false), - win: self, - }, - stateServiceOptions: { - stateFactory: new StateFactory(GlobalState, Account), - }, - apiServiceOptions: { - logoutCallback: () => Promise.resolve(), - }, - keyConnectorServiceOptions: { - logoutCallback: () => Promise.resolve(), - }, - i18nServiceOptions: { - systemLanguage: BrowserApi.getUILanguage(), - }, - }; - const logService = await logServiceFactory(cachedServices, opts); - const authService = await authServiceFactory(cachedServices, opts); - const autofillService = await autofillServiceFactory(cachedServices, opts); - - const authStatus = await authService.getAuthStatus(); - if (authStatus < AuthenticationStatus.Unlocked) { - // TODO: Add back in unlock on autofill - logService.info("Currently not unlocked, MV3 does not support unlock on autofill currently."); - return; - } - - const command = new AutofillTabCommand(autofillService); - await command.doAutofillTabCommand(tab); -}; - -const doGeneratePasswordToClipboard = async (tab: chrome.tabs.Tab): Promise => { - const stateFactory = new StateFactory(GlobalState, Account); - - const cache = {}; - const options: PasswordGenerationServiceInitOptions = { - cryptoFunctionServiceOptions: { - win: self, - }, - encryptServiceOptions: { - logMacFailures: false, - }, - logServiceOptions: { - isDev: false, - }, - platformUtilsServiceOptions: { - biometricCallback: () => Promise.resolve(true), - clipboardWriteCallback: () => Promise.resolve(), - win: self, - }, - stateServiceOptions: { - stateFactory: stateFactory, - }, - autofillSettingsServiceOptions: { - stateFactory: autofillSettingsServiceFactory, - }, - }; - - const command = new GeneratePasswordToClipboardCommand( - await passwordGenerationServiceFactory(cache, options), - await autofillSettingsServiceFactory(cache, options), - ); - // FIXME: Verify that this floating promise is intentional. If it is, add an explanatory comment and ensure there is proper error handling. - // eslint-disable-next-line @typescript-eslint/no-floating-promises - command.generatePasswordToClipboard(tab); -}; diff --git a/apps/browser/src/platform/listeners/on-install-listener.ts b/apps/browser/src/platform/listeners/on-install-listener.ts deleted file mode 100644 index adf575a17a9..00000000000 --- a/apps/browser/src/platform/listeners/on-install-listener.ts +++ /dev/null @@ -1,45 +0,0 @@ -import { StateFactory } from "@bitwarden/common/platform/factories/state-factory"; -import { GlobalState } from "@bitwarden/common/platform/models/domain/global-state"; - -import { Account } from "../../models/account"; -import { - EnvironmentServiceInitOptions, - environmentServiceFactory, -} from "../background/service-factories/environment-service.factory"; -import { BrowserApi } from "../browser/browser-api"; - -export async function onInstallListener(details: chrome.runtime.InstalledDetails) { - const cache = {}; - const opts: EnvironmentServiceInitOptions = { - encryptServiceOptions: { - logMacFailures: false, - }, - cryptoFunctionServiceOptions: { - win: self, - }, - logServiceOptions: { - isDev: false, - }, - stateServiceOptions: { - stateFactory: new StateFactory(GlobalState, Account), - }, - platformUtilsServiceOptions: { - win: self, - biometricCallback: async () => false, - clipboardWriteCallback: async () => {}, - }, - }; - const environmentService = await environmentServiceFactory(cache, opts); - - setTimeout(async () => { - if (details.reason != null && details.reason === chrome.runtime.OnInstalledReason.INSTALL) { - // FIXME: Verify that this floating promise is intentional. If it is, add an explanatory comment and ensure there is proper error handling. - // eslint-disable-next-line @typescript-eslint/no-floating-promises - BrowserApi.createNewTab("https://bitwarden.com/browser-start/"); - - if (await environmentService.hasManagedEnvironment()) { - await environmentService.setUrlsToManagedEnvironment(); - } - } - }, 100); -} diff --git a/apps/browser/src/platform/listeners/update-badge.ts b/apps/browser/src/platform/listeners/update-badge.ts index c39cb8c8945..9256c27f37b 100644 --- a/apps/browser/src/platform/listeners/update-badge.ts +++ b/apps/browser/src/platform/listeners/update-badge.ts @@ -2,20 +2,12 @@ import { firstValueFrom } from "rxjs"; import { AuthService } from "@bitwarden/common/auth/abstractions/auth.service"; import { AuthenticationStatus } from "@bitwarden/common/auth/enums/authentication-status"; -import { BadgeSettingsService } from "@bitwarden/common/autofill/services/badge-settings.service"; -import { CryptoService } from "@bitwarden/common/platform/abstractions/crypto.service"; -import { EncryptService } from "@bitwarden/common/platform/abstractions/encrypt.service"; -import { StateFactory } from "@bitwarden/common/platform/factories/state-factory"; +import { BadgeSettingsServiceAbstraction } from "@bitwarden/common/autofill/services/badge-settings.service"; import { Utils } from "@bitwarden/common/platform/misc/utils"; -import { GlobalState } from "@bitwarden/common/platform/models/domain/global-state"; -import { ContainerService } from "@bitwarden/common/platform/services/container.service"; import { CipherService } from "@bitwarden/common/vault/abstractions/cipher.service"; -import { authServiceFactory } from "../../auth/background/service-factories/auth-service.factory"; -import { badgeSettingsServiceFactory } from "../../autofill/background/service_factories/badge-settings-service.factory"; -import { Account } from "../../models/account"; +import MainBackground from "../../background/main.background"; import IconDetails from "../../vault/background/models/icon-details"; -import { cipherServiceFactory } from "../../vault/background/service_factories/cipher-service.factory"; import { BrowserApi } from "../browser/browser-api"; import { BrowserPlatformUtilsService } from "../services/platform-utils/browser-platform-utils.service"; @@ -26,87 +18,23 @@ export type BadgeOptions = { export class UpdateBadge { private authService: AuthService; - private badgeSettingsService: BadgeSettingsService; + private badgeSettingsService: BadgeSettingsServiceAbstraction; private cipherService: CipherService; private badgeAction: typeof chrome.action | typeof chrome.browserAction; private sidebarAction: OperaSidebarAction | FirefoxSidebarAction; - private inited = false; private win: Window & typeof globalThis; - private static readonly listenedToCommands = [ - "updateBadge", - "loggedIn", - "unlocked", - "syncCompleted", - "bgUpdateContextMenu", - "editedCipher", - "addedCipher", - "deletedCipher", - ]; - - static async windowsOnFocusChangedListener( - windowId: number, - serviceCache: Record, - ) { - await new UpdateBadge(self).run({ windowId, existingServices: serviceCache }); - } - - static async tabsOnActivatedListener( - activeInfo: chrome.tabs.TabActiveInfo, - serviceCache: Record, - ) { - await new UpdateBadge(self).run({ - tabId: activeInfo.tabId, - existingServices: serviceCache, - windowId: activeInfo.windowId, - }); - } - - static async tabsOnReplacedListener( - addedTabId: number, - removedTabId: number, - serviceCache: Record, - ) { - await new UpdateBadge(self).run({ tabId: addedTabId, existingServices: serviceCache }); - } - - static async tabsOnUpdatedListener( - tabId: number, - changeInfo: chrome.tabs.TabChangeInfo, - tab: chrome.tabs.Tab, - serviceCache: Record, - ) { - await new UpdateBadge(self).run({ - tabId, - existingServices: serviceCache, - windowId: tab.windowId, - }); - } - - static async messageListener( - message: { command: string; tabId: number }, - serviceCache: Record, - ) { - if (!UpdateBadge.listenedToCommands.includes(message.command)) { - return; - } - - await new UpdateBadge(self).run({ existingServices: serviceCache }); - } - - constructor(win: Window & typeof globalThis) { + constructor(win: Window & typeof globalThis, services: MainBackground) { this.badgeAction = BrowserApi.getBrowserAction(); this.sidebarAction = BrowserApi.getSidebarAction(self); this.win = win; + + this.badgeSettingsService = services.badgeSettingsService; + this.authService = services.authService; + this.cipherService = services.cipherService; } - async run(opts?: { - tabId?: number; - windowId?: number; - existingServices?: Record; - }): Promise { - await this.initServices(opts?.existingServices); - + async run(opts?: { tabId?: number; windowId?: number }): Promise { const authStatus = await this.authService.getAuthStatus(); await this.setBadgeBackgroundColor(); @@ -150,8 +78,6 @@ export class UpdateBadge { } async setUnlocked(opts: BadgeOptions) { - await this.initServices(); - await this.setBadgeIcon(""); const enableBadgeCounter = await firstValueFrom(this.badgeSettingsService.enableBadgeCounter$); @@ -263,52 +189,6 @@ export class UpdateBadge { ); } - private async initServices(existingServiceCache?: Record): Promise { - if (this.inited) { - return this; - } - - const serviceCache: Record = existingServiceCache || {}; - const opts = { - cryptoFunctionServiceOptions: { win: self }, - encryptServiceOptions: { logMacFailures: false }, - logServiceOptions: { isDev: false }, - platformUtilsServiceOptions: { - clipboardWriteCallback: (clipboardValue: string, clearMs: number) => - Promise.reject("not implemented"), - biometricCallback: () => Promise.reject("not implemented"), - win: self, - }, - stateServiceOptions: { - stateFactory: new StateFactory(GlobalState, Account), - }, - apiServiceOptions: { - logoutCallback: () => Promise.reject("not implemented"), - }, - keyConnectorServiceOptions: { - logoutCallback: () => Promise.reject("not implemented"), - }, - i18nServiceOptions: { - systemLanguage: BrowserApi.getUILanguage(), - }, - }; - this.badgeSettingsService = await badgeSettingsServiceFactory(serviceCache, opts); - this.authService = await authServiceFactory(serviceCache, opts); - this.cipherService = await cipherServiceFactory(serviceCache, opts); - - // Needed for cipher decryption - if (!self.bitwardenContainerService) { - new ContainerService( - serviceCache.cryptoService as CryptoService, - serviceCache.encryptService as EncryptService, - ).attachToGlobal(self); - } - - this.inited = true; - - return this; - } - private isOperaSidebar( action: OperaSidebarAction | FirefoxSidebarAction, ): action is OperaSidebarAction { diff --git a/apps/browser/src/platform/offscreen-document/abstractions/offscreen-document.ts b/apps/browser/src/platform/offscreen-document/abstractions/offscreen-document.ts index 2a67d55c962..012f908f784 100644 --- a/apps/browser/src/platform/offscreen-document/abstractions/offscreen-document.ts +++ b/apps/browser/src/platform/offscreen-document/abstractions/offscreen-document.ts @@ -2,7 +2,6 @@ export type OffscreenDocumentExtensionMessage = { [key: string]: any; command: string; text?: string; - decryptRequest?: string; }; type OffscreenExtensionMessageEventParams = { @@ -14,7 +13,6 @@ export type OffscreenDocumentExtensionMessageHandlers = { [key: string]: ({ message, sender }: OffscreenExtensionMessageEventParams) => any; offscreenCopyToClipboard: ({ message }: OffscreenExtensionMessageEventParams) => any; offscreenReadFromClipboard: () => any; - offscreenDecryptItems: ({ message }: OffscreenExtensionMessageEventParams) => Promise; }; export interface OffscreenDocument { @@ -22,6 +20,7 @@ export interface OffscreenDocument { } export abstract class OffscreenDocumentService { + abstract offscreenApiSupported(): boolean; abstract withDocument( reasons: chrome.offscreen.Reason[], justification: string, diff --git a/apps/browser/src/platform/offscreen-document/offscreen-document.service.spec.ts b/apps/browser/src/platform/offscreen-document/offscreen-document.service.spec.ts index d6be0a924e5..da541403967 100644 --- a/apps/browser/src/platform/offscreen-document/offscreen-document.service.spec.ts +++ b/apps/browser/src/platform/offscreen-document/offscreen-document.service.spec.ts @@ -1,3 +1,7 @@ +import { mock } from "jest-mock-extended"; + +import { LogService } from "@bitwarden/common/platform/abstractions/log.service"; + import { DefaultOffscreenDocumentService } from "./offscreen-document.service"; class TestCase { @@ -21,6 +25,7 @@ describe.each([ new TestCase("synchronous callback", () => 42), new TestCase("asynchronous callback", () => Promise.resolve(42)), ])("DefaultOffscreenDocumentService %s", (testCase) => { + const logService = mock(); let sut: DefaultOffscreenDocumentService; const reasons = [chrome.offscreen.Reason.TESTING]; const justification = "justification is testing"; @@ -37,13 +42,19 @@ describe.each([ callback = testCase.callback; chrome.offscreen = api; - sut = new DefaultOffscreenDocumentService(); + sut = new DefaultOffscreenDocumentService(logService); }); afterEach(() => { jest.resetAllMocks(); }); + describe("offscreenApiSupported", () => { + it("indicates whether the offscreen API is supported", () => { + expect(sut.offscreenApiSupported()).toBe(true); + }); + }); + describe("withDocument", () => { it("creates a document when none exists", async () => { await sut.withDocument(reasons, justification, () => {}); diff --git a/apps/browser/src/platform/offscreen-document/offscreen-document.service.ts b/apps/browser/src/platform/offscreen-document/offscreen-document.service.ts index da0ca382698..3a1227ea5e2 100644 --- a/apps/browser/src/platform/offscreen-document/offscreen-document.service.ts +++ b/apps/browser/src/platform/offscreen-document/offscreen-document.service.ts @@ -1,7 +1,15 @@ -export class DefaultOffscreenDocumentService implements DefaultOffscreenDocumentService { +import { LogService } from "@bitwarden/common/platform/abstractions/log.service"; + +import { OffscreenDocumentService } from "./abstractions/offscreen-document"; + +export class DefaultOffscreenDocumentService implements OffscreenDocumentService { private workerCount = 0; - constructor() {} + constructor(private logService: LogService) {} + + offscreenApiSupported(): boolean { + return typeof chrome.offscreen !== "undefined"; + } async withDocument( reasons: chrome.offscreen.Reason[], @@ -24,11 +32,21 @@ export class DefaultOffscreenDocumentService implements DefaultOffscreenDocument } private async create(reasons: chrome.offscreen.Reason[], justification: string): Promise { - await chrome.offscreen.createDocument({ - url: "offscreen-document/index.html", - reasons, - justification, - }); + try { + await chrome.offscreen.createDocument({ + url: "offscreen-document/index.html", + reasons, + justification, + }); + } catch (e) { + // gobble multiple offscreen document creation errors + // TODO: remove this when the offscreen document service is fixed PM-8014 + if (e.message === "Only a single offscreen document may be created.") { + this.logService.info("Ignoring offscreen document creation error."); + return; + } + throw e; + } } private async close(): Promise { diff --git a/apps/browser/src/platform/offscreen-document/offscreen-document.spec.ts b/apps/browser/src/platform/offscreen-document/offscreen-document.spec.ts index 9d3cadbba85..933cd08c2ea 100644 --- a/apps/browser/src/platform/offscreen-document/offscreen-document.spec.ts +++ b/apps/browser/src/platform/offscreen-document/offscreen-document.spec.ts @@ -1,25 +1,7 @@ -import { mock } from "jest-mock-extended"; - -import { Decryptable } from "@bitwarden/common/platform/interfaces/decryptable.interface"; -import { InitializerMetadata } from "@bitwarden/common/platform/interfaces/initializer-metadata.interface"; -import { SymmetricCryptoKey } from "@bitwarden/common/platform/models/domain/symmetric-crypto-key"; - import { flushPromises, sendExtensionRuntimeMessage } from "../../autofill/spec/testing-utils"; import { BrowserApi } from "../browser/browser-api"; import BrowserClipboardService from "../services/browser-clipboard.service"; -jest.mock( - "@bitwarden/common/platform/services/cryptography/multithread-encrypt.service.implementation", - () => ({ - MultithreadEncryptServiceImplementation: class MultithreadEncryptServiceImplementation { - getDecryptedItemsFromWorker = async ( - items: Decryptable[], - _key: SymmetricCryptoKey, - ): Promise => JSON.stringify(items); - }, - }), -); - describe("OffscreenDocument", () => { const browserApiMessageListenerSpy = jest.spyOn(BrowserApi, "messageListener"); const browserClipboardServiceCopySpy = jest.spyOn(BrowserClipboardService, "copy"); @@ -78,37 +60,5 @@ describe("OffscreenDocument", () => { expect(browserClipboardServiceReadSpy).toHaveBeenCalledWith(window); }); }); - - describe("handleOffscreenDecryptItems", () => { - it("returns an empty array as a string if the decrypt request is not present in the message", async () => { - let response: string | undefined; - sendExtensionRuntimeMessage( - { command: "offscreenDecryptItems" }, - mock(), - (res: string) => (response = res), - ); - await flushPromises(); - - expect(response).toBe("[]"); - }); - - it("decrypts the items and sends back the response as a string", async () => { - const items = [{ id: "test" }]; - const key = { id: "test" }; - const decryptRequest = JSON.stringify({ items, key }); - let response: string | undefined; - - sendExtensionRuntimeMessage( - { command: "offscreenDecryptItems", decryptRequest }, - mock(), - (res: string) => { - response = res; - }, - ); - await flushPromises(); - - expect(response).toBe(JSON.stringify(items)); - }); - }); }); }); diff --git a/apps/browser/src/platform/offscreen-document/offscreen-document.ts b/apps/browser/src/platform/offscreen-document/offscreen-document.ts index 509193d5ee0..4994a6e9ba8 100644 --- a/apps/browser/src/platform/offscreen-document/offscreen-document.ts +++ b/apps/browser/src/platform/offscreen-document/offscreen-document.ts @@ -1,35 +1,21 @@ import { ConsoleLogService } from "@bitwarden/common/platform/services/console-log.service"; -import { MultithreadEncryptServiceImplementation } from "@bitwarden/common/platform/services/cryptography/multithread-encrypt.service.implementation"; -import { WebCryptoFunctionService } from "@bitwarden/common/platform/services/web-crypto-function.service"; import { BrowserApi } from "../browser/browser-api"; import BrowserClipboardService from "../services/browser-clipboard.service"; import { - OffscreenDocument as OffscreenDocumentInterface, OffscreenDocumentExtensionMessage, OffscreenDocumentExtensionMessageHandlers, + OffscreenDocument as OffscreenDocumentInterface, } from "./abstractions/offscreen-document"; class OffscreenDocument implements OffscreenDocumentInterface { - private readonly consoleLogService: ConsoleLogService; - private encryptService: MultithreadEncryptServiceImplementation; + private consoleLogService: ConsoleLogService = new ConsoleLogService(false); private readonly extensionMessageHandlers: OffscreenDocumentExtensionMessageHandlers = { offscreenCopyToClipboard: ({ message }) => this.handleOffscreenCopyToClipboard(message), offscreenReadFromClipboard: () => this.handleOffscreenReadFromClipboard(), - offscreenDecryptItems: ({ message }) => this.handleOffscreenDecryptItems(message), }; - constructor() { - const cryptoFunctionService = new WebCryptoFunctionService(self); - this.consoleLogService = new ConsoleLogService(false); - this.encryptService = new MultithreadEncryptServiceImplementation( - cryptoFunctionService, - this.consoleLogService, - true, - ); - } - /** * Initializes the offscreen document extension. */ @@ -53,23 +39,6 @@ class OffscreenDocument implements OffscreenDocumentInterface { return await BrowserClipboardService.read(self); } - /** - * Decrypts the items in the message using the encrypt service. - * - * @param message - The extension message containing the items to decrypt - */ - private async handleOffscreenDecryptItems( - message: OffscreenDocumentExtensionMessage, - ): Promise { - const { decryptRequest } = message; - if (!decryptRequest) { - return "[]"; - } - - const request = JSON.parse(decryptRequest); - return await this.encryptService.getDecryptedItemsFromWorker(request.items, request.key); - } - /** * Sets up the listener for extension messages. */ diff --git a/apps/browser/src/platform/popup/components/pop-out.component.html b/apps/browser/src/platform/popup/components/pop-out.component.html index 73bf76941dc..c3f1f8ca150 100644 --- a/apps/browser/src/platform/popup/components/pop-out.component.html +++ b/apps/browser/src/platform/popup/components/pop-out.component.html @@ -1,5 +1,15 @@ - + + + + diff --git a/apps/browser/src/platform/popup/components/pop-out.component.ts b/apps/browser/src/platform/popup/components/pop-out.component.ts index 154bb55a0c9..54bed7aa348 100644 --- a/apps/browser/src/platform/popup/components/pop-out.component.ts +++ b/apps/browser/src/platform/popup/components/pop-out.component.ts @@ -2,7 +2,10 @@ import { CommonModule } from "@angular/common"; import { Component, Input, OnInit } from "@angular/core"; import { JslibModule } from "@bitwarden/angular/jslib.module"; +import { FeatureFlag } from "@bitwarden/common/enums/feature-flag.enum"; +import { ConfigService } from "@bitwarden/common/platform/abstractions/config/config.service"; import { PlatformUtilsService } from "@bitwarden/common/platform/abstractions/platform-utils.service"; +import { IconButtonModule } from "@bitwarden/components"; import BrowserPopupUtils from "../browser-popup-utils"; @@ -10,14 +13,20 @@ import BrowserPopupUtils from "../browser-popup-utils"; selector: "app-pop-out", templateUrl: "pop-out.component.html", standalone: true, - imports: [CommonModule, JslibModule], + imports: [CommonModule, JslibModule, IconButtonModule], }) export class PopOutComponent implements OnInit { @Input() show = true; + useRefreshVariant = false; - constructor(private platformUtilsService: PlatformUtilsService) {} + constructor( + private platformUtilsService: PlatformUtilsService, + private configService: ConfigService, + ) {} + + async ngOnInit() { + this.useRefreshVariant = await this.configService.getFeatureFlag(FeatureFlag.ExtensionRefresh); - ngOnInit() { if (this.show) { if ( (BrowserPopupUtils.inSidebar(window) && this.platformUtilsService.isFirefox()) || diff --git a/apps/browser/src/platform/popup/layout/popup-header.component.html b/apps/browser/src/platform/popup/layout/popup-header.component.html index c0894f8168b..55caf1b91e7 100644 --- a/apps/browser/src/platform/popup/layout/popup-header.component.html +++ b/apps/browser/src/platform/popup/layout/popup-header.component.html @@ -9,6 +9,7 @@ *ngIf="showBackButton" [title]="'back' | i18n" [ariaLabel]="'back' | i18n" + (click)="back()" >

{{ pageTitle }}

diff --git a/apps/browser/src/platform/popup/layout/popup-layout.mdx b/apps/browser/src/platform/popup/layout/popup-layout.mdx index 91f7dab277e..6f72f325bf1 100644 --- a/apps/browser/src/platform/popup/layout/popup-layout.mdx +++ b/apps/browser/src/platform/popup/layout/popup-layout.mdx @@ -136,3 +136,9 @@ When the browser extension is popped out, the "popout" button should not be pass + +## Centered Content + + + + diff --git a/apps/browser/src/platform/popup/layout/popup-layout.stories.ts b/apps/browser/src/platform/popup/layout/popup-layout.stories.ts index 28692c79e1c..cc7758d9680 100644 --- a/apps/browser/src/platform/popup/layout/popup-layout.stories.ts +++ b/apps/browser/src/platform/popup/layout/popup-layout.stories.ts @@ -11,6 +11,7 @@ import { I18nMockService, IconButtonModule, ItemModule, + NoItemsModule, } from "@bitwarden/components"; import { PopupFooterComponent } from "./popup-footer.component"; @@ -289,6 +290,9 @@ export default { moduleMetadata({ imports: [ PopupTabNavigationComponent, + PopupHeaderComponent, + PopupPageComponent, + PopupFooterComponent, CommonModule, RouterModule, ExtensionContainerComponent, @@ -298,6 +302,7 @@ export default { MockGeneratorPageComponent, MockSettingsPageComponent, MockVaultPagePoppedComponent, + NoItemsModule, ], providers: [ { @@ -378,3 +383,24 @@ export const PoppedOut: Story = { `, }), }; + +export const CenteredContent: Story = { + render: (args) => ({ + props: args, + template: /* HTML */ ` + + + + +
+ + Before centering a div + One must first center oneself + +
+
+
+
+ `, + }), +}; diff --git a/apps/browser/src/platform/popup/layout/popup-page.component.html b/apps/browser/src/platform/popup/layout/popup-page.component.html index ba871d6319e..ece6be4c63e 100644 --- a/apps/browser/src/platform/popup/layout/popup-page.component.html +++ b/apps/browser/src/platform/popup/layout/popup-page.component.html @@ -1,6 +1,6 @@ -
-
+
+
diff --git a/apps/browser/src/platform/popup/popup-section-header/popup-section-header.component.html b/apps/browser/src/platform/popup/popup-section-header/popup-section-header.component.html new file mode 100644 index 00000000000..4fdbb823120 --- /dev/null +++ b/apps/browser/src/platform/popup/popup-section-header/popup-section-header.component.html @@ -0,0 +1,11 @@ +
+
+

+ {{ title }} +

+ +
+
+ +
+
diff --git a/apps/browser/src/platform/popup/popup-section-header/popup-section-header.component.ts b/apps/browser/src/platform/popup/popup-section-header/popup-section-header.component.ts new file mode 100644 index 00000000000..b33a2a0f330 --- /dev/null +++ b/apps/browser/src/platform/popup/popup-section-header/popup-section-header.component.ts @@ -0,0 +1,13 @@ +import { Component, Input } from "@angular/core"; + +import { TypographyModule } from "@bitwarden/components"; + +@Component({ + standalone: true, + selector: "popup-section-header", + templateUrl: "./popup-section-header.component.html", + imports: [TypographyModule], +}) +export class PopupSectionHeaderComponent { + @Input() title: string; +} diff --git a/apps/browser/src/platform/popup/popup-section-header/popup-section-header.stories.ts b/apps/browser/src/platform/popup/popup-section-header/popup-section-header.stories.ts new file mode 100644 index 00000000000..f5cb472a59c --- /dev/null +++ b/apps/browser/src/platform/popup/popup-section-header/popup-section-header.stories.ts @@ -0,0 +1,104 @@ +import { Meta, moduleMetadata, StoryObj } from "@storybook/angular"; + +import { + CardComponent, + IconButtonModule, + SectionComponent, + TypographyModule, +} from "@bitwarden/components"; + +import { PopupSectionHeaderComponent } from "./popup-section-header.component"; + +export default { + title: "Browser/Popup Section Header", + component: PopupSectionHeaderComponent, + args: { + title: "Title", + }, + decorators: [ + moduleMetadata({ + imports: [SectionComponent, CardComponent, TypographyModule, IconButtonModule], + }), + ], +} as Meta; + +type Story = StoryObj; + +export const OnlyTitle: Story = { + render: (args) => ({ + props: args, + template: ` + + `, + }), + args: { + title: "Only Title", + }, +}; + +export const TrailingText: Story = { + render: (args) => ({ + props: args, + template: ` + + 13 + + `, + }), + args: { + title: "Trailing Text", + }, +}; + +export const TailingIcon: Story = { + render: (args) => ({ + props: args, + template: ` + + + + `, + }), + args: { + title: "Trailing Icon", + }, +}; + +export const TitleSuffix: Story = { + render: (args) => ({ + props: args, + template: ` + + + + `, + }), + args: { + title: "Title Suffix", + }, +}; + +export const WithSections: Story = { + render: () => ({ + template: ` +
+ + + + + +

Card 1 Content

+
+
+ + + + + +

Card 2 Content

+
+
+
+ `, + }), +}; diff --git a/apps/browser/src/platform/services/browser-multithread-encrypt.service.implementation.spec.ts b/apps/browser/src/platform/services/browser-multithread-encrypt.service.implementation.spec.ts deleted file mode 100644 index db5b3df7a36..00000000000 --- a/apps/browser/src/platform/services/browser-multithread-encrypt.service.implementation.spec.ts +++ /dev/null @@ -1,97 +0,0 @@ -import { mock, MockProxy } from "jest-mock-extended"; - -import { CryptoFunctionService } from "@bitwarden/common/platform/abstractions/crypto-function.service"; -import { LogService } from "@bitwarden/common/platform/abstractions/log.service"; -import { EncryptionType } from "@bitwarden/common/platform/enums"; -import { Decryptable } from "@bitwarden/common/platform/interfaces/decryptable.interface"; -import { InitializerMetadata } from "@bitwarden/common/platform/interfaces/initializer-metadata.interface"; -import { SymmetricCryptoKey } from "@bitwarden/common/platform/models/domain/symmetric-crypto-key"; -import { InitializerKey } from "@bitwarden/common/platform/services/cryptography/initializer-key"; -import { makeStaticByteArray } from "@bitwarden/common/spec"; - -import { BrowserApi } from "../browser/browser-api"; -import { OffscreenDocumentService } from "../offscreen-document/abstractions/offscreen-document"; - -import { BrowserMultithreadEncryptServiceImplementation } from "./browser-multithread-encrypt.service.implementation"; - -describe("BrowserMultithreadEncryptServiceImplementation", () => { - let cryptoFunctionServiceMock: MockProxy; - let logServiceMock: MockProxy; - let offscreenDocumentServiceMock: MockProxy; - let encryptService: BrowserMultithreadEncryptServiceImplementation; - const manifestVersionSpy = jest.spyOn(BrowserApi, "manifestVersion", "get"); - const sendMessageWithResponseSpy = jest.spyOn(BrowserApi, "sendMessageWithResponse"); - const encType = EncryptionType.AesCbc256_HmacSha256_B64; - const key = new SymmetricCryptoKey(makeStaticByteArray(64, 100), encType); - const items: Decryptable[] = [ - { - decrypt: jest.fn(), - initializerKey: InitializerKey.Cipher, - }, - ]; - - beforeEach(() => { - cryptoFunctionServiceMock = mock(); - logServiceMock = mock(); - offscreenDocumentServiceMock = mock({ - withDocument: jest.fn((_, __, callback) => callback() as any), - }); - encryptService = new BrowserMultithreadEncryptServiceImplementation( - cryptoFunctionServiceMock, - logServiceMock, - false, - offscreenDocumentServiceMock, - ); - manifestVersionSpy.mockReturnValue(3); - sendMessageWithResponseSpy.mockResolvedValue(JSON.stringify([])); - }); - - afterEach(() => { - jest.clearAllMocks(); - }); - - it("decrypts items using web workers if the chrome.offscreen API is not supported", async () => { - manifestVersionSpy.mockReturnValue(2); - - await encryptService.decryptItems([], key); - - expect(offscreenDocumentServiceMock.withDocument).not.toHaveBeenCalled(); - }); - - it("decrypts items using the chrome.offscreen API if it is supported", async () => { - sendMessageWithResponseSpy.mockResolvedValue(JSON.stringify(items)); - - await encryptService.decryptItems(items, key); - - expect(offscreenDocumentServiceMock.withDocument).toHaveBeenCalledWith( - [chrome.offscreen.Reason.WORKERS], - "Use web worker to decrypt items.", - expect.any(Function), - ); - expect(BrowserApi.sendMessageWithResponse).toHaveBeenCalledWith("offscreenDecryptItems", { - decryptRequest: expect.any(String), - }); - }); - - it("returns an empty array if the passed items are not defined", async () => { - const result = await encryptService.decryptItems(null, key); - - expect(result).toEqual([]); - }); - - it("returns an empty array if the offscreen document message returns an empty value", async () => { - sendMessageWithResponseSpy.mockResolvedValue(""); - - const result = await encryptService.decryptItems(items, key); - - expect(result).toEqual([]); - }); - - it("returns an empty array if the offscreen document message returns an empty array", async () => { - sendMessageWithResponseSpy.mockResolvedValue("[]"); - - const result = await encryptService.decryptItems(items, key); - - expect(result).toEqual([]); - }); -}); diff --git a/apps/browser/src/platform/services/browser-multithread-encrypt.service.implementation.ts b/apps/browser/src/platform/services/browser-multithread-encrypt.service.implementation.ts deleted file mode 100644 index ace5015c8eb..00000000000 --- a/apps/browser/src/platform/services/browser-multithread-encrypt.service.implementation.ts +++ /dev/null @@ -1,91 +0,0 @@ -import { CryptoFunctionService } from "@bitwarden/common/platform/abstractions/crypto-function.service"; -import { LogService } from "@bitwarden/common/platform/abstractions/log.service"; -import { Decryptable } from "@bitwarden/common/platform/interfaces/decryptable.interface"; -import { InitializerMetadata } from "@bitwarden/common/platform/interfaces/initializer-metadata.interface"; -import { Utils } from "@bitwarden/common/platform/misc/utils"; -import { SymmetricCryptoKey } from "@bitwarden/common/platform/models/domain/symmetric-crypto-key"; -import { MultithreadEncryptServiceImplementation } from "@bitwarden/common/platform/services/cryptography/multithread-encrypt.service.implementation"; - -import { BrowserApi } from "../browser/browser-api"; -import { OffscreenDocumentService } from "../offscreen-document/abstractions/offscreen-document"; - -export class BrowserMultithreadEncryptServiceImplementation extends MultithreadEncryptServiceImplementation { - constructor( - cryptoFunctionService: CryptoFunctionService, - logService: LogService, - logMacFailures: boolean, - private offscreenDocumentService: OffscreenDocumentService, - ) { - super(cryptoFunctionService, logService, logMacFailures); - } - - /** - * Handles decryption of items, will use the offscreen document if supported. - * - * @param items - The items to decrypt. - * @param key - The key to use for decryption. - */ - async decryptItems( - items: Decryptable[], - key: SymmetricCryptoKey, - ): Promise { - if (!this.isOffscreenDocumentSupported()) { - return await super.decryptItems(items, key); - } - - return await this.decryptItemsInOffscreenDocument(items, key); - } - - /** - * Decrypts items using the offscreen document api. - * - * @param items - The items to decrypt. - * @param key - The key to use for decryption. - */ - private async decryptItemsInOffscreenDocument( - items: Decryptable[], - key: SymmetricCryptoKey, - ): Promise { - if (items == null || items.length < 1) { - return []; - } - - const request = { - id: Utils.newGuid(), - items: items, - key: key, - }; - - const response = await this.offscreenDocumentService.withDocument( - [chrome.offscreen.Reason.WORKERS], - "Use web worker to decrypt items.", - async () => { - return (await BrowserApi.sendMessageWithResponse("offscreenDecryptItems", { - decryptRequest: JSON.stringify(request), - })) as string; - }, - ); - - if (!response) { - return []; - } - - const responseItems = JSON.parse(response); - if (responseItems?.length < 1) { - return []; - } - - return this.initializeItems(responseItems); - } - - /** - * Checks if the offscreen document api is supported. - */ - private isOffscreenDocumentSupported() { - return ( - BrowserApi.isManifestVersion(3) && - typeof chrome !== "undefined" && - typeof chrome.offscreen !== "undefined" - ); - } -} diff --git a/apps/browser/src/platform/services/platform-utils/browser-platform-utils.service.spec.ts b/apps/browser/src/platform/services/platform-utils/browser-platform-utils.service.spec.ts index 02c10b62cc4..c86c9158019 100644 --- a/apps/browser/src/platform/services/platform-utils/browser-platform-utils.service.spec.ts +++ b/apps/browser/src/platform/services/platform-utils/browser-platform-utils.service.spec.ts @@ -229,9 +229,7 @@ describe("Browser Utils Service", () => { it("copies the passed text using the offscreen document if the extension is using manifest v3", async () => { const text = "test"; - jest - .spyOn(browserPlatformUtilsService, "getDevice") - .mockReturnValue(DeviceType.ChromeExtension); + offscreenDocumentService.offscreenApiSupported.mockReturnValue(true); getManifestVersionSpy.mockReturnValue(3); browserPlatformUtilsService.copyToClipboard(text); @@ -304,9 +302,7 @@ describe("Browser Utils Service", () => { }); it("reads the clipboard text using the offscreen document", async () => { - jest - .spyOn(browserPlatformUtilsService, "getDevice") - .mockReturnValue(DeviceType.ChromeExtension); + offscreenDocumentService.offscreenApiSupported.mockReturnValue(true); getManifestVersionSpy.mockReturnValue(3); offscreenDocumentService.withDocument.mockImplementationOnce((_, __, callback) => Promise.resolve("test"), diff --git a/apps/browser/src/platform/services/platform-utils/browser-platform-utils.service.ts b/apps/browser/src/platform/services/platform-utils/browser-platform-utils.service.ts index 4163ca93107..26108e60b7e 100644 --- a/apps/browser/src/platform/services/platform-utils/browser-platform-utils.service.ts +++ b/apps/browser/src/platform/services/platform-utils/browser-platform-utils.service.ts @@ -243,7 +243,7 @@ export abstract class BrowserPlatformUtilsService implements PlatformUtilsServic text = "\u0000"; } - if (this.isChrome() && BrowserApi.isManifestVersion(3)) { + if (BrowserApi.isManifestVersion(3) && this.offscreenDocumentService.offscreenApiSupported()) { void this.triggerOffscreenCopyToClipboard(text).then(handleClipboardWriteCallback); return; @@ -268,7 +268,7 @@ export abstract class BrowserPlatformUtilsService implements PlatformUtilsServic return await SafariApp.sendMessageToApp("readFromClipboard"); } - if (this.isChrome() && BrowserApi.isManifestVersion(3)) { + if (BrowserApi.isManifestVersion(3) && this.offscreenDocumentService.offscreenApiSupported()) { return await this.triggerOffscreenReadFromClipboard(); } diff --git a/apps/browser/src/popup/app-routing.animations.ts b/apps/browser/src/popup/app-routing.animations.ts index 96e5dbbe378..b2fa53caba8 100644 --- a/apps/browser/src/popup/app-routing.animations.ts +++ b/apps/browser/src/popup/app-routing.animations.ts @@ -208,8 +208,8 @@ export const routerTransition = trigger("routerTransition", [ transition("tabs => lock", inSlideDown), - transition("tabs => help-and-feedback", inSlideLeft), - transition("help-and-feedback => tabs", outSlideRight), + transition("tabs => about", inSlideLeft), + transition("about => tabs", outSlideRight), transition("tabs => send-type", inSlideLeft), transition("send-type => tabs", outSlideRight), diff --git a/apps/browser/src/popup/app-routing.module.ts b/apps/browser/src/popup/app-routing.module.ts index 1db2f92d3e5..37504568336 100644 --- a/apps/browser/src/popup/app-routing.module.ts +++ b/apps/browser/src/popup/app-routing.module.ts @@ -28,7 +28,7 @@ import { TwoFactorComponent } from "../auth/popup/two-factor.component"; import { UpdateTempPasswordComponent } from "../auth/popup/update-temp-password.component"; import { AutofillComponent } from "../autofill/popup/settings/autofill.component"; import { ExcludedDomainsComponent } from "../autofill/popup/settings/excluded-domains.component"; -import { NotifcationsSettingsComponent } from "../autofill/popup/settings/notifications.component"; +import { NotificationsSettingsComponent } from "../autofill/popup/settings/notifications.component"; import { PremiumComponent } from "../billing/popup/settings/premium.component"; import BrowserPopupUtils from "../platform/popup/browser-popup-utils"; import { GeneratorComponent } from "../tools/popup/generator/generator.component"; @@ -36,8 +36,13 @@ import { PasswordGeneratorHistoryComponent } from "../tools/popup/generator/pass import { SendAddEditComponent } from "../tools/popup/send/send-add-edit.component"; import { SendGroupingsComponent } from "../tools/popup/send/send-groupings.component"; import { SendTypeComponent } from "../tools/popup/send/send-type.component"; +import { AboutPageV2Component } from "../tools/popup/settings/about-page/about-page-v2.component"; +import { AboutPageComponent } from "../tools/popup/settings/about-page/about-page.component"; +import { MoreFromBitwardenPageV2Component } from "../tools/popup/settings/about-page/more-from-bitwarden-page-v2.component"; +import { MoreFromBitwardenPageComponent } from "../tools/popup/settings/about-page/more-from-bitwarden-page.component"; import { ExportComponent } from "../tools/popup/settings/export.component"; import { ImportBrowserComponent } from "../tools/popup/settings/import/import-browser.component"; +import { SettingsV2Component } from "../tools/popup/settings/settings-v2.component"; import { SettingsComponent } from "../tools/popup/settings/settings.component"; import { Fido2Component } from "../vault/popup/components/fido2/fido2.component"; import { AddEditComponent } from "../vault/popup/components/vault/add-edit.component"; @@ -54,11 +59,11 @@ import { AppearanceComponent } from "../vault/popup/settings/appearance.componen import { FolderAddEditComponent } from "../vault/popup/settings/folder-add-edit.component"; import { FoldersComponent } from "../vault/popup/settings/folders.component"; import { SyncComponent } from "../vault/popup/settings/sync.component"; +import { VaultSettingsV2Component } from "../vault/popup/settings/vault-settings-v2.component"; import { VaultSettingsComponent } from "../vault/popup/settings/vault-settings.component"; import { extensionRefreshRedirect, extensionRefreshSwap } from "./extension-refresh-route-utils"; import { debounceNavigationGuard } from "./services/debounce-navigation.service"; -import { HelpAndFeedbackComponent } from "./settings/help-and-feedback.component"; import { OptionsComponent } from "./settings/options.component"; import { TabsV2Component } from "./tabs-v2.component"; import { TabsComponent } from "./tabs.component"; @@ -259,16 +264,15 @@ const routes: Routes = [ }, { path: "notifications", - component: NotifcationsSettingsComponent, + component: NotificationsSettingsComponent, canActivate: [AuthGuard], data: { state: "notifications" }, }, - { + ...extensionRefreshSwap(VaultSettingsComponent, VaultSettingsV2Component, { path: "vault-settings", - component: VaultSettingsComponent, canActivate: [AuthGuard], data: { state: "vault-settings" }, - }, + }), { path: "folders", component: FoldersComponent, @@ -347,12 +351,16 @@ const routes: Routes = [ canActivate: [AuthGuard], data: { state: "update-temp-password" }, }, - { - path: "help-and-feedback", - component: HelpAndFeedbackComponent, + ...extensionRefreshSwap(AboutPageComponent, AboutPageV2Component, { + path: "about", canActivate: [AuthGuard], - data: { state: "help-and-feedback" }, - }, + data: { state: "about" }, + }), + ...extensionRefreshSwap(MoreFromBitwardenPageComponent, MoreFromBitwardenPageV2Component, { + path: "more-from-bitwarden", + canActivate: [AuthGuard], + data: { state: "moreFromBitwarden" }, + }), ...extensionRefreshSwap(TabsComponent, TabsV2Component, { path: "tabs", data: { state: "tabs" }, @@ -381,12 +389,11 @@ const routes: Routes = [ canActivate: [AuthGuard], data: { state: "tabs_generator" }, }, - { + ...extensionRefreshSwap(SettingsComponent, SettingsV2Component, { path: "settings", - component: SettingsComponent, canActivate: [AuthGuard], data: { state: "tabs_settings" }, - }, + }), { path: "send", component: SendGroupingsComponent, diff --git a/apps/browser/src/popup/app.module.ts b/apps/browser/src/popup/app.module.ts index 05158d3295d..54a9da028f9 100644 --- a/apps/browser/src/popup/app.module.ts +++ b/apps/browser/src/popup/app.module.ts @@ -39,7 +39,7 @@ import { TwoFactorComponent } from "../auth/popup/two-factor.component"; import { UpdateTempPasswordComponent } from "../auth/popup/update-temp-password.component"; import { AutofillComponent } from "../autofill/popup/settings/autofill.component"; import { ExcludedDomainsComponent } from "../autofill/popup/settings/excluded-domains.component"; -import { NotifcationsSettingsComponent } from "../autofill/popup/settings/notifications.component"; +import { NotificationsSettingsComponent } from "../autofill/popup/settings/notifications.component"; import { PremiumComponent } from "../billing/popup/settings/premium.component"; import { PopOutComponent } from "../platform/popup/components/pop-out.component"; import { HeaderComponent } from "../platform/popup/header.component"; @@ -47,6 +47,7 @@ import { PopupFooterComponent } from "../platform/popup/layout/popup-footer.comp import { PopupHeaderComponent } from "../platform/popup/layout/popup-header.component"; import { PopupPageComponent } from "../platform/popup/layout/popup-page.component"; import { PopupTabNavigationComponent } from "../platform/popup/layout/popup-tab-navigation.component"; +import { PopupSectionHeaderComponent } from "../platform/popup/popup-section-header/popup-section-header.component"; import { FilePopoutCalloutComponent } from "../tools/popup/components/file-popout-callout.component"; import { GeneratorComponent } from "../tools/popup/generator/generator.component"; import { PasswordGeneratorHistoryComponent } from "../tools/popup/generator/password-generator-history.component"; @@ -71,7 +72,6 @@ import { ShareComponent } from "../vault/popup/components/vault/share.component" import { VaultFilterComponent } from "../vault/popup/components/vault/vault-filter.component"; import { VaultItemsComponent } from "../vault/popup/components/vault/vault-items.component"; import { VaultSelectComponent } from "../vault/popup/components/vault/vault-select.component"; -import { VaultV2Component } from "../vault/popup/components/vault/vault-v2.component"; import { ViewCustomFieldsComponent } from "../vault/popup/components/vault/view-custom-fields.component"; import { ViewComponent } from "../vault/popup/components/vault/view.component"; import { AppearanceComponent } from "../vault/popup/settings/appearance.component"; @@ -84,7 +84,6 @@ import { AppRoutingModule } from "./app-routing.module"; import { AppComponent } from "./app.component"; import { UserVerificationComponent } from "./components/user-verification.component"; import { ServicesModule } from "./services/services.module"; -import { HelpAndFeedbackComponent } from "./settings/help-and-feedback.component"; import { OptionsComponent } from "./settings/options.component"; import { TabsV2Component } from "./tabs-v2.component"; import { TabsComponent } from "./tabs.component"; @@ -124,6 +123,8 @@ import "../platform/popup/locales"; PopupFooterComponent, PopupHeaderComponent, UserVerificationDialogComponent, + PopupSectionHeaderComponent, + CurrentAccountComponent, ], declarations: [ ActionButtonsComponent, @@ -153,7 +154,7 @@ import "../platform/popup/locales"; LoginViaAuthRequestComponent, LoginDecryptionOptionsComponent, OptionsComponent, - NotifcationsSettingsComponent, + NotificationsSettingsComponent, AppearanceComponent, GeneratorComponent, PasswordGeneratorHistoryComponent, @@ -183,12 +184,9 @@ import "../platform/popup/locales"; RemovePasswordComponent, VaultSelectComponent, Fido2Component, - HelpAndFeedbackComponent, AutofillComponent, EnvironmentSelectorComponent, - CurrentAccountComponent, AccountSwitcherComponent, - VaultV2Component, ], providers: [CurrencyPipe, DatePipe], bootstrap: [AppComponent], diff --git a/apps/browser/src/popup/scss/misc.scss b/apps/browser/src/popup/scss/misc.scss index 61f22be9ef0..134bac917d3 100644 --- a/apps/browser/src/popup/scss/misc.scss +++ b/apps/browser/src/popup/scss/misc.scss @@ -458,3 +458,14 @@ html.force_redraw { .rounded-circle { border-radius: 50% !important; } + +/* override for vault icon in browser (pre extension refresh) */ +app-vault-icon:not(app-vault-list-items-container app-vault-icon) > div { + display: flex; + justify-content: center; + align-items: center; + float: left; + height: 36px; + width: 34px; + margin-left: -5px; +} diff --git a/apps/browser/src/popup/services/services.module.ts b/apps/browser/src/popup/services/services.module.ts index 0b9c8f6fe68..a4f5c8a4c67 100644 --- a/apps/browser/src/popup/services/services.module.ts +++ b/apps/browser/src/popup/services/services.module.ts @@ -81,8 +81,6 @@ import { } from "@bitwarden/common/platform/state"; // eslint-disable-next-line import/no-restricted-paths -- Used for dependency injection import { InlineDerivedStateProvider } from "@bitwarden/common/platform/state/implementations/inline-derived-state"; -import { PasswordGenerationServiceAbstraction } from "@bitwarden/common/tools/generator/password"; -import { UsernameGenerationServiceAbstraction } from "@bitwarden/common/tools/generator/username"; import { VaultTimeoutStringType } from "@bitwarden/common/types/vault-timeout.type"; import { CipherService } from "@bitwarden/common/vault/abstractions/cipher.service"; import { CollectionService } from "@bitwarden/common/vault/abstractions/collection.service"; @@ -195,9 +193,11 @@ const safeProviders: SafeProvider[] = [ }), safeProvider({ provide: LogService, - useFactory: (platformUtilsService: PlatformUtilsService) => - new ConsoleLogService(platformUtilsService.isDev()), - deps: [PlatformUtilsService], + useFactory: () => { + const isDev = process.env.ENV === "development"; + return new ConsoleLogService(isDev); + }, + deps: [], }), safeProvider({ provide: EnvironmentService, @@ -286,7 +286,7 @@ const safeProviders: SafeProvider[] = [ safeProvider({ provide: OffscreenDocumentService, useClass: DefaultOffscreenDocumentService, - deps: [], + deps: [LogService], }), safeProvider({ provide: PlatformUtilsService, @@ -315,11 +315,6 @@ const safeProviders: SafeProvider[] = [ }, deps: [ToastService, OffscreenDocumentService], }), - safeProvider({ - provide: PasswordGenerationServiceAbstraction, - useFactory: getBgService("passwordGenerationService"), - deps: [], - }), safeProvider({ provide: SyncService, useFactory: getBgService("syncService"), @@ -480,11 +475,6 @@ const safeProviders: SafeProvider[] = [ MigrationRunner, ], }), - safeProvider({ - provide: UsernameGenerationServiceAbstraction, - useFactory: getBgService("usernameGenerationService"), - deps: [], - }), safeProvider({ provide: BaseStateServiceAbstraction, useExisting: StateServiceAbstraction, diff --git a/apps/browser/src/popup/settings/help-and-feedback.component.ts b/apps/browser/src/popup/settings/help-and-feedback.component.ts deleted file mode 100644 index cba57529f0f..00000000000 --- a/apps/browser/src/popup/settings/help-and-feedback.component.ts +++ /dev/null @@ -1,26 +0,0 @@ -import { Component } from "@angular/core"; - -import { BrowserApi } from "../../platform/browser/browser-api"; - -@Component({ - selector: "app-help-and-feedback", - templateUrl: "help-and-feedback.component.html", -}) -export class HelpAndFeedbackComponent { - launchHelp() { - // FIXME: Verify that this floating promise is intentional. If it is, add an explanatory comment and ensure there is proper error handling. - // eslint-disable-next-line @typescript-eslint/no-floating-promises - BrowserApi.createNewTab("https://bitwarden.com/help/"); - } - launchContactForm() { - // FIXME: Verify that this floating promise is intentional. If it is, add an explanatory comment and ensure there is proper error handling. - // eslint-disable-next-line @typescript-eslint/no-floating-promises - BrowserApi.createNewTab("https://bitwarden.com/contact/"); - } - - launchForums() { - // FIXME: Verify that this floating promise is intentional. If it is, add an explanatory comment and ensure there is proper error handling. - // eslint-disable-next-line @typescript-eslint/no-floating-promises - BrowserApi.createNewTab("https://bitwarden.com/getinvolved/"); - } -} diff --git a/apps/browser/src/tools/background/service_factories/import-api-service.factory.ts b/apps/browser/src/tools/background/service_factories/import-api-service.factory.ts deleted file mode 100644 index 37d0b9000c2..00000000000 --- a/apps/browser/src/tools/background/service_factories/import-api-service.factory.ts +++ /dev/null @@ -1,26 +0,0 @@ -import { ImportApiService, ImportApiServiceAbstraction } from "@bitwarden/importer/core"; - -import { - ApiServiceInitOptions, - apiServiceFactory, -} from "../../../platform/background/service-factories/api-service.factory"; -import { - FactoryOptions, - CachedServices, - factory, -} from "../../../platform/background/service-factories/factory-options"; - -export type ImportApiServiceInitOptions = FactoryOptions & ApiServiceInitOptions; -type ServiceCache = { importApiService?: ImportApiServiceAbstraction } & CachedServices; - -export function importApiServiceFactory( - cache: ServiceCache, - opts: ImportApiServiceInitOptions, -): Promise { - return factory( - cache, - "importApiService", - opts, - async () => new ImportApiService(await apiServiceFactory(cache, opts)), - ); -} diff --git a/apps/browser/src/tools/background/service_factories/import-service.factory.ts b/apps/browser/src/tools/background/service_factories/import-service.factory.ts deleted file mode 100644 index 5b73b475061..00000000000 --- a/apps/browser/src/tools/background/service_factories/import-service.factory.ts +++ /dev/null @@ -1,67 +0,0 @@ -import { ImportService, ImportServiceAbstraction } from "@bitwarden/importer/core"; - -import { - pinServiceFactory, - PinServiceInitOptions, -} from "../../../auth/background/service-factories/pin-service.factory"; -import { - cryptoServiceFactory, - CryptoServiceInitOptions, -} from "../../../platform/background/service-factories/crypto-service.factory"; -import { - CachedServices, - factory, - FactoryOptions, -} from "../../../platform/background/service-factories/factory-options"; -import { - i18nServiceFactory, - I18nServiceInitOptions, -} from "../../../platform/background/service-factories/i18n-service.factory"; -import { - cipherServiceFactory, - CipherServiceInitOptions, -} from "../../../vault/background/service_factories/cipher-service.factory"; -import { - collectionServiceFactory, - CollectionServiceInitOptions, -} from "../../../vault/background/service_factories/collection-service.factory"; -import { - folderServiceFactory, - FolderServiceInitOptions, -} from "../../../vault/background/service_factories/folder-service.factory"; - -import { importApiServiceFactory, ImportApiServiceInitOptions } from "./import-api-service.factory"; - -type ImportServiceFactoryOptions = FactoryOptions; - -export type ImportServiceInitOptions = ImportServiceFactoryOptions & - CipherServiceInitOptions & - FolderServiceInitOptions & - ImportApiServiceInitOptions & - I18nServiceInitOptions & - CollectionServiceInitOptions & - CryptoServiceInitOptions & - PinServiceInitOptions; - -export function importServiceFactory( - cache: { - importService?: ImportServiceAbstraction; - } & CachedServices, - opts: ImportServiceInitOptions, -): Promise { - return factory( - cache, - "importService", - opts, - async () => - new ImportService( - await cipherServiceFactory(cache, opts), - await folderServiceFactory(cache, opts), - await importApiServiceFactory(cache, opts), - await i18nServiceFactory(cache, opts), - await collectionServiceFactory(cache, opts), - await cryptoServiceFactory(cache, opts), - await pinServiceFactory(cache, opts), - ), - ); -} diff --git a/apps/browser/src/tools/background/service_factories/password-generation-service.factory.ts b/apps/browser/src/tools/background/service_factories/password-generation-service.factory.ts deleted file mode 100644 index 4b4d80e76d4..00000000000 --- a/apps/browser/src/tools/background/service_factories/password-generation-service.factory.ts +++ /dev/null @@ -1,46 +0,0 @@ -import { - PasswordGenerationService, - PasswordGenerationServiceAbstraction, -} from "@bitwarden/common/tools/generator/password"; - -import { - policyServiceFactory, - PolicyServiceInitOptions, -} from "../../../admin-console/background/service-factories/policy-service.factory"; -import { - CryptoServiceInitOptions, - cryptoServiceFactory, -} from "../../../platform/background/service-factories/crypto-service.factory"; -import { - CachedServices, - factory, - FactoryOptions, -} from "../../../platform/background/service-factories/factory-options"; -import { - stateServiceFactory, - StateServiceInitOptions, -} from "../../../platform/background/service-factories/state-service.factory"; - -type PasswordGenerationServiceFactoryOptions = FactoryOptions; - -export type PasswordGenerationServiceInitOptions = PasswordGenerationServiceFactoryOptions & - CryptoServiceInitOptions & - PolicyServiceInitOptions & - StateServiceInitOptions; - -export function passwordGenerationServiceFactory( - cache: { passwordGenerationService?: PasswordGenerationServiceAbstraction } & CachedServices, - opts: PasswordGenerationServiceInitOptions, -): Promise { - return factory( - cache, - "passwordGenerationService", - opts, - async () => - new PasswordGenerationService( - await cryptoServiceFactory(cache, opts), - await policyServiceFactory(cache, opts), - await stateServiceFactory(cache, opts), - ), - ); -} diff --git a/apps/browser/src/tools/background/service_factories/password-strength-service.factory.ts b/apps/browser/src/tools/background/service_factories/password-strength-service.factory.ts deleted file mode 100644 index c1e5b71ee32..00000000000 --- a/apps/browser/src/tools/background/service_factories/password-strength-service.factory.ts +++ /dev/null @@ -1,23 +0,0 @@ -import { - PasswordStrengthService, - PasswordStrengthServiceAbstraction, -} from "@bitwarden/common/tools/password-strength"; - -import { - CachedServices, - factory, - FactoryOptions, -} from "../../../platform/background/service-factories/factory-options"; - -type PasswordStrengthServiceFactoryOptions = FactoryOptions; - -export type PasswordStrengthServiceInitOptions = PasswordStrengthServiceFactoryOptions; - -export function passwordStrengthServiceFactory( - cache: { - passwordStrengthService?: PasswordStrengthServiceAbstraction; - } & CachedServices, - opts: PasswordStrengthServiceInitOptions, -): Promise { - return factory(cache, "passwordStrengthService", opts, async () => new PasswordStrengthService()); -} diff --git a/apps/browser/src/tools/popup/generator/generator.component.ts b/apps/browser/src/tools/popup/generator/generator.component.ts index 0c11c28f278..1afe696576f 100644 --- a/apps/browser/src/tools/popup/generator/generator.component.ts +++ b/apps/browser/src/tools/popup/generator/generator.component.ts @@ -1,13 +1,13 @@ import { Location } from "@angular/common"; -import { Component } from "@angular/core"; +import { Component, NgZone } from "@angular/core"; import { ActivatedRoute } from "@angular/router"; import { firstValueFrom } from "rxjs"; import { GeneratorComponent as BaseGeneratorComponent } from "@bitwarden/angular/tools/generator/components/generator.component"; +import { AccountService } from "@bitwarden/common/auth/abstractions/account.service"; import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; import { LogService } from "@bitwarden/common/platform/abstractions/log.service"; import { PlatformUtilsService } from "@bitwarden/common/platform/abstractions/platform-utils.service"; -import { StateService } from "@bitwarden/common/platform/abstractions/state.service"; import { PasswordGenerationServiceAbstraction } from "@bitwarden/common/tools/generator/password"; import { UsernameGenerationServiceAbstraction } from "@bitwarden/common/tools/generator/username"; import { CipherService } from "@bitwarden/common/vault/abstractions/cipher.service"; @@ -28,20 +28,22 @@ export class GeneratorComponent extends BaseGeneratorComponent { usernameGenerationService: UsernameGenerationServiceAbstraction, platformUtilsService: PlatformUtilsService, i18nService: I18nService, - stateService: StateService, + accountService: AccountService, cipherService: CipherService, route: ActivatedRoute, logService: LogService, + ngZone: NgZone, private location: Location, ) { super( passwordGenerationService, usernameGenerationService, platformUtilsService, - stateService, + accountService, i18nService, logService, route, + ngZone, window, ); this.cipherService = cipherService; diff --git a/apps/browser/src/tools/popup/settings/about-page/about-page-v2.component.html b/apps/browser/src/tools/popup/settings/about-page/about-page-v2.component.html new file mode 100644 index 00000000000..dffb3612c39 --- /dev/null +++ b/apps/browser/src/tools/popup/settings/about-page/about-page-v2.component.html @@ -0,0 +1,40 @@ + + + + + + + + + + + + + + + + + + + + {{ "moreFromBitwarden" | i18n }} + + + + + + + + diff --git a/apps/browser/src/tools/popup/settings/about-page/about-page-v2.component.ts b/apps/browser/src/tools/popup/settings/about-page/about-page-v2.component.ts new file mode 100644 index 00000000000..1d0d4218439 --- /dev/null +++ b/apps/browser/src/tools/popup/settings/about-page/about-page-v2.component.ts @@ -0,0 +1,94 @@ +import { CommonModule } from "@angular/common"; +import { Component } from "@angular/core"; +import { RouterModule } from "@angular/router"; +import { firstValueFrom } from "rxjs"; + +import { JslibModule } from "@bitwarden/angular/jslib.module"; +import { DeviceType } from "@bitwarden/common/enums"; +import { EnvironmentService } from "@bitwarden/common/platform/abstractions/environment.service"; +import { PlatformUtilsService } from "@bitwarden/common/platform/abstractions/platform-utils.service"; +import { DialogService, ItemModule } from "@bitwarden/components"; + +import { BrowserApi } from "../../../../platform/browser/browser-api"; +import { PopOutComponent } from "../../../../platform/popup/components/pop-out.component"; +import { PopupHeaderComponent } from "../../../../platform/popup/layout/popup-header.component"; +import { PopupPageComponent } from "../../../../platform/popup/layout/popup-page.component"; +import { AboutDialogComponent } from "../about-dialog/about-dialog.component"; + +const RateUrls = { + [DeviceType.ChromeExtension]: + "https://chromewebstore.google.com/detail/bitwarden-free-password-m/nngceckbapebfimnlniiiahkandclblb/reviews", + [DeviceType.FirefoxExtension]: + "https://addons.mozilla.org/en-US/firefox/addon/bitwarden-password-manager/#reviews", + [DeviceType.OperaExtension]: + "https://addons.opera.com/en/extensions/details/bitwarden-free-password-manager/#feedback-container", + [DeviceType.EdgeExtension]: + "https://microsoftedge.microsoft.com/addons/detail/jbkfoedolllekgbhcbcoahefnbanhhlh", + [DeviceType.VivaldiExtension]: + "https://chromewebstore.google.com/detail/bitwarden-free-password-m/nngceckbapebfimnlniiiahkandclblb/reviews", + [DeviceType.SafariExtension]: "https://apps.apple.com/app/bitwarden/id1352778147", +}; + +@Component({ + templateUrl: "about-page-v2.component.html", + standalone: true, + imports: [ + CommonModule, + JslibModule, + RouterModule, + PopupPageComponent, + PopupHeaderComponent, + PopOutComponent, + ItemModule, + ], +}) +export class AboutPageV2Component { + constructor( + private dialogService: DialogService, + private environmentService: EnvironmentService, + private platformUtilsService: PlatformUtilsService, + ) {} + + about() { + this.dialogService.open(AboutDialogComponent); + } + + async launchHelp() { + const confirmed = await this.dialogService.openSimpleDialog({ + title: { key: "continueToHelpCenter" }, + content: { key: "continueToHelpCenterDesc" }, + type: "info", + acceptButtonText: { key: "continue" }, + }); + if (confirmed) { + await BrowserApi.createNewTab("https://bitwarden.com/help/"); + } + } + + async openWebVault() { + const confirmed = await this.dialogService.openSimpleDialog({ + title: { key: "continueToWebApp" }, + content: { key: "continueToWebAppDesc" }, + type: "info", + acceptButtonText: { key: "continue" }, + }); + if (confirmed) { + const env = await firstValueFrom(this.environmentService.environment$); + const url = env.getWebVaultUrl(); + await BrowserApi.createNewTab(url); + } + } + + async rate() { + const confirmed = await this.dialogService.openSimpleDialog({ + title: { key: "continueToBrowserExtensionStore" }, + content: { key: "continueToBrowserExtensionStoreDesc" }, + type: "info", + acceptButtonText: { key: "continue" }, + }); + if (confirmed) { + const deviceType = this.platformUtilsService.getDevice(); + await BrowserApi.createNewTab((RateUrls as any)[deviceType]); + } + } +} diff --git a/apps/browser/src/popup/settings/help-and-feedback.component.html b/apps/browser/src/tools/popup/settings/about-page/about-page.component.html similarity index 58% rename from apps/browser/src/popup/settings/help-and-feedback.component.html rename to apps/browser/src/tools/popup/settings/about-page/about-page.component.html index f2cbfa93555..7537c75bd9e 100644 --- a/apps/browser/src/popup/settings/help-and-feedback.component.html +++ b/apps/browser/src/tools/popup/settings/about-page/about-page.component.html @@ -6,22 +6,29 @@

- {{ "helpFeedback" | i18n }} + {{ "about" | i18n }}

-
+
+ +
+ @@ -29,24 +36,26 @@ type="button" class="box-content-row box-content-row-flex text-default" appStopClick - (click)="launchForums()" + (click)="openWebVault()" > -
- -
-
{{ "communityForums" | i18n }}
+
{{ "bitWebVaultApp" | i18n }}
+
diff --git a/apps/browser/src/tools/popup/settings/about-page/about-page.component.ts b/apps/browser/src/tools/popup/settings/about-page/about-page.component.ts new file mode 100644 index 00000000000..7c3e87a92fb --- /dev/null +++ b/apps/browser/src/tools/popup/settings/about-page/about-page.component.ts @@ -0,0 +1,84 @@ +import { CommonModule } from "@angular/common"; +import { Component } from "@angular/core"; +import { RouterModule } from "@angular/router"; +import { firstValueFrom } from "rxjs"; + +import { JslibModule } from "@bitwarden/angular/jslib.module"; +import { DeviceType } from "@bitwarden/common/enums"; +import { EnvironmentService } from "@bitwarden/common/platform/abstractions/environment.service"; +import { PlatformUtilsService } from "@bitwarden/common/platform/abstractions/platform-utils.service"; +import { DialogService } from "@bitwarden/components"; + +import { BrowserApi } from "../../../../platform/browser/browser-api"; +import { PopOutComponent } from "../../../../platform/popup/components/pop-out.component"; +import { AboutDialogComponent } from "../about-dialog/about-dialog.component"; + +const RateUrls = { + [DeviceType.ChromeExtension]: + "https://chromewebstore.google.com/detail/bitwarden-free-password-m/nngceckbapebfimnlniiiahkandclblb/reviews", + [DeviceType.FirefoxExtension]: + "https://addons.mozilla.org/en-US/firefox/addon/bitwarden-password-manager/#reviews", + [DeviceType.OperaExtension]: + "https://addons.opera.com/en/extensions/details/bitwarden-free-password-manager/#feedback-container", + [DeviceType.EdgeExtension]: + "https://microsoftedge.microsoft.com/addons/detail/jbkfoedolllekgbhcbcoahefnbanhhlh", + [DeviceType.VivaldiExtension]: + "https://chromewebstore.google.com/detail/bitwarden-free-password-m/nngceckbapebfimnlniiiahkandclblb/reviews", + [DeviceType.SafariExtension]: "https://apps.apple.com/app/bitwarden/id1352778147", +}; + +@Component({ + templateUrl: "about-page.component.html", + standalone: true, + imports: [CommonModule, JslibModule, RouterModule, PopOutComponent], +}) +export class AboutPageComponent { + constructor( + private dialogService: DialogService, + private environmentService: EnvironmentService, + private platformUtilsService: PlatformUtilsService, + ) {} + + about() { + this.dialogService.open(AboutDialogComponent); + } + + async launchHelp() { + const confirmed = await this.dialogService.openSimpleDialog({ + title: { key: "continueToHelpCenter" }, + content: { key: "continueToHelpCenterDesc" }, + type: "info", + acceptButtonText: { key: "continue" }, + }); + if (confirmed) { + await BrowserApi.createNewTab("https://bitwarden.com/help/"); + } + } + + async openWebVault() { + const confirmed = await this.dialogService.openSimpleDialog({ + title: { key: "continueToWebApp" }, + content: { key: "continueToWebAppDesc" }, + type: "info", + acceptButtonText: { key: "continue" }, + }); + if (confirmed) { + const env = await firstValueFrom(this.environmentService.environment$); + const url = env.getWebVaultUrl(); + await BrowserApi.createNewTab(url); + } + } + + async rate() { + const confirmed = await this.dialogService.openSimpleDialog({ + title: { key: "continueToBrowserExtensionStore" }, + content: { key: "continueToBrowserExtensionStoreDesc" }, + type: "info", + acceptButtonText: { key: "continue" }, + }); + if (confirmed) { + const deviceType = this.platformUtilsService.getDevice(); + await BrowserApi.createNewTab((RateUrls as any)[deviceType]); + } + } +} diff --git a/apps/browser/src/tools/popup/settings/about-page/more-from-bitwarden-page-v2.component.html b/apps/browser/src/tools/popup/settings/about-page/more-from-bitwarden-page-v2.component.html new file mode 100644 index 00000000000..affe9ffc04e --- /dev/null +++ b/apps/browser/src/tools/popup/settings/about-page/more-from-bitwarden-page-v2.component.html @@ -0,0 +1,46 @@ + + + + + + + + + + + {{ "premiumMembership" | i18n }} + + + + + + + + + + + + + + + + + + + + diff --git a/apps/browser/src/tools/popup/settings/about-page/more-from-bitwarden-page-v2.component.ts b/apps/browser/src/tools/popup/settings/about-page/more-from-bitwarden-page-v2.component.ts new file mode 100644 index 00000000000..64ada94c922 --- /dev/null +++ b/apps/browser/src/tools/popup/settings/about-page/more-from-bitwarden-page-v2.component.ts @@ -0,0 +1,101 @@ +import { CommonModule } from "@angular/common"; +import { Component } from "@angular/core"; +import { RouterModule } from "@angular/router"; +import { Observable, firstValueFrom } from "rxjs"; + +import { JslibModule } from "@bitwarden/angular/jslib.module"; +import { BillingAccountProfileStateService } from "@bitwarden/common/billing/abstractions/account/billing-account-profile-state.service"; +import { EnvironmentService } from "@bitwarden/common/platform/abstractions/environment.service"; +import { DialogService, ItemModule } from "@bitwarden/components"; + +import { BrowserApi } from "../../../../platform/browser/browser-api"; +import { PopOutComponent } from "../../../../platform/popup/components/pop-out.component"; +import { PopupHeaderComponent } from "../../../../platform/popup/layout/popup-header.component"; +import { PopupPageComponent } from "../../../../platform/popup/layout/popup-page.component"; + +@Component({ + templateUrl: "more-from-bitwarden-page-v2.component.html", + standalone: true, + imports: [ + CommonModule, + JslibModule, + RouterModule, + PopupPageComponent, + PopupHeaderComponent, + PopOutComponent, + ItemModule, + ], +}) +export class MoreFromBitwardenPageV2Component { + canAccessPremium$: Observable; + + constructor( + private dialogService: DialogService, + billingAccountProfileStateService: BillingAccountProfileStateService, + private environmentService: EnvironmentService, + ) { + this.canAccessPremium$ = billingAccountProfileStateService.hasPremiumFromAnySource$; + } + + async openFreeBitwardenFamiliesPage() { + const confirmed = await this.dialogService.openSimpleDialog({ + title: { key: "continueToWebApp" }, + content: { key: "freeBitwardenFamiliesPageDesc" }, + type: "info", + acceptButtonText: { key: "continue" }, + }); + if (confirmed) { + const env = await firstValueFrom(this.environmentService.environment$); + const url = env.getWebVaultUrl(); + await BrowserApi.createNewTab(url + "/#/settings/sponsored-families"); + } + } + + async openBitwardenForBusinessPage() { + const confirmed = await this.dialogService.openSimpleDialog({ + title: { key: "continueToBitwardenDotCom" }, + content: { key: "bitwardenForBusinessPageDesc" }, + type: "info", + acceptButtonText: { key: "continue" }, + }); + if (confirmed) { + await BrowserApi.createNewTab("https://bitwarden.com/products/business/"); + } + } + + async openAuthenticatorPage() { + const confirmed = await this.dialogService.openSimpleDialog({ + title: { key: "continueToBitwardenDotCom" }, + content: { key: "continueToAuthenticatorPageDesc" }, + type: "info", + acceptButtonText: { key: "continue" }, + }); + if (confirmed) { + await BrowserApi.createNewTab("https://bitwarden.com/products/authenticator"); + } + } + + async openSecretsManagerPage() { + const confirmed = await this.dialogService.openSimpleDialog({ + title: { key: "continueToBitwardenDotCom" }, + content: { key: "continueToSecretsManagerPageDesc" }, + type: "info", + acceptButtonText: { key: "continue" }, + }); + if (confirmed) { + await BrowserApi.createNewTab("https://bitwarden.com/products/secrets-manager"); + } + } + + async openPasswordlessDotDevPage() { + const confirmed = await this.dialogService.openSimpleDialog({ + title: { key: "continueToBitwardenDotCom" }, + content: { key: "continueToPasswordlessDotDevPageDesc" }, + type: "info", + acceptButtonText: { key: "continue" }, + }); + if (confirmed) { + await BrowserApi.createNewTab("https://bitwarden.com/products/passwordless"); + } + } +} diff --git a/apps/browser/src/tools/popup/settings/about-page/more-from-bitwarden-page.component.html b/apps/browser/src/tools/popup/settings/about-page/more-from-bitwarden-page.component.html new file mode 100644 index 00000000000..bf9decca4eb --- /dev/null +++ b/apps/browser/src/tools/popup/settings/about-page/more-from-bitwarden-page.component.html @@ -0,0 +1,75 @@ +
+
+ +
+

+ {{ "moreFromBitwarden" | i18n }} +

+
+ +
+
+
+
+
+
+ +
+ + + + + +
+
+
diff --git a/apps/browser/src/tools/popup/settings/about-page/more-from-bitwarden-page.component.ts b/apps/browser/src/tools/popup/settings/about-page/more-from-bitwarden-page.component.ts new file mode 100644 index 00000000000..a9e9e797bf3 --- /dev/null +++ b/apps/browser/src/tools/popup/settings/about-page/more-from-bitwarden-page.component.ts @@ -0,0 +1,91 @@ +import { CommonModule } from "@angular/common"; +import { Component } from "@angular/core"; +import { RouterModule } from "@angular/router"; +import { Observable, firstValueFrom } from "rxjs"; + +import { JslibModule } from "@bitwarden/angular/jslib.module"; +import { BillingAccountProfileStateService } from "@bitwarden/common/billing/abstractions/account/billing-account-profile-state.service"; +import { EnvironmentService } from "@bitwarden/common/platform/abstractions/environment.service"; +import { DialogService } from "@bitwarden/components"; + +import { BrowserApi } from "../../../../platform/browser/browser-api"; +import { PopOutComponent } from "../../../../platform/popup/components/pop-out.component"; + +@Component({ + templateUrl: "more-from-bitwarden-page.component.html", + standalone: true, + imports: [CommonModule, JslibModule, RouterModule, PopOutComponent], +}) +export class MoreFromBitwardenPageComponent { + canAccessPremium$: Observable; + + constructor( + private dialogService: DialogService, + private billingAccountProfileStateService: BillingAccountProfileStateService, + private environmentService: EnvironmentService, + ) { + this.canAccessPremium$ = billingAccountProfileStateService.hasPremiumFromAnySource$; + } + + async openFreeBitwardenFamiliesPage() { + const confirmed = await this.dialogService.openSimpleDialog({ + title: { key: "continueToWebApp" }, + content: { key: "freeBitwardenFamiliesPageDesc" }, + type: "info", + acceptButtonText: { key: "continue" }, + }); + if (confirmed) { + const env = await firstValueFrom(this.environmentService.environment$); + const url = env.getWebVaultUrl(); + await BrowserApi.createNewTab(url + "/#/settings/sponsored-families"); + } + } + + async openBitwardenForBusinessPage() { + const confirmed = await this.dialogService.openSimpleDialog({ + title: { key: "continueToBitwardenDotCom" }, + content: { key: "bitwardenForBusinessPageDesc" }, + type: "info", + acceptButtonText: { key: "continue" }, + }); + if (confirmed) { + await BrowserApi.createNewTab("https://bitwarden.com/products/business/"); + } + } + + async openAuthenticatorPage() { + const confirmed = await this.dialogService.openSimpleDialog({ + title: { key: "continueToBitwardenDotCom" }, + content: { key: "continueToAuthenticatorPageDesc" }, + type: "info", + acceptButtonText: { key: "continue" }, + }); + if (confirmed) { + await BrowserApi.createNewTab("https://bitwarden.com/products/authenticator"); + } + } + + async openSecretsManagerPage() { + const confirmed = await this.dialogService.openSimpleDialog({ + title: { key: "continueToBitwardenDotCom" }, + content: { key: "continueToSecretsManagerPageDesc" }, + type: "info", + acceptButtonText: { key: "continue" }, + }); + if (confirmed) { + await BrowserApi.createNewTab("https://bitwarden.com/products/secrets-manager"); + } + } + + async openPasswordlessDotDevPage() { + const confirmed = await this.dialogService.openSimpleDialog({ + title: { key: "continueToBitwardenDotCom" }, + content: { key: "continueToPasswordlessDotDevPageDesc" }, + type: "info", + acceptButtonText: { key: "continue" }, + }); + if (confirmed) { + await BrowserApi.createNewTab("https://bitwarden.com/products/passwordless"); + } + } +} diff --git a/apps/browser/src/tools/popup/settings/export.component.html b/apps/browser/src/tools/popup/settings/export.component.html index 1b2ea1eb1d5..ef031b7979a 100644 --- a/apps/browser/src/tools/popup/settings/export.component.html +++ b/apps/browser/src/tools/popup/settings/export.component.html @@ -29,11 +29,6 @@
- - - -
diff --git a/apps/browser/src/tools/popup/settings/export.component.ts b/apps/browser/src/tools/popup/settings/export.component.ts index b62ed4c517f..9f3f054d2ac 100644 --- a/apps/browser/src/tools/popup/settings/export.component.ts +++ b/apps/browser/src/tools/popup/settings/export.component.ts @@ -5,7 +5,6 @@ import { Router } from "@angular/router"; import { EventCollectionService } from "@bitwarden/common/abstractions/event/event-collection.service"; import { OrganizationService } from "@bitwarden/common/admin-console/abstractions/organization/organization.service.abstraction"; import { PolicyService } from "@bitwarden/common/admin-console/abstractions/policy/policy.service.abstraction"; -import { UserVerificationService } from "@bitwarden/common/auth/abstractions/user-verification/user-verification.service.abstraction"; import { FileDownloadService } from "@bitwarden/common/platform/abstractions/file-download/file-download.service"; import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; import { LogService } from "@bitwarden/common/platform/abstractions/log.service"; @@ -27,7 +26,6 @@ export class ExportComponent extends BaseExportComponent { policyService: PolicyService, private router: Router, logService: LogService, - userVerificationService: UserVerificationService, formBuilder: UntypedFormBuilder, fileDownloadService: FileDownloadService, dialogService: DialogService, @@ -40,7 +38,6 @@ export class ExportComponent extends BaseExportComponent { eventCollectionService, policyService, logService, - userVerificationService, formBuilder, fileDownloadService, dialogService, diff --git a/apps/browser/src/tools/popup/settings/settings-v2.component.html b/apps/browser/src/tools/popup/settings/settings-v2.component.html new file mode 100644 index 00000000000..7ff958e26ac --- /dev/null +++ b/apps/browser/src/tools/popup/settings/settings-v2.component.html @@ -0,0 +1,47 @@ + + + + + + + + + + + {{ "accountSecurity" | i18n }} + + + + + {{ "autofill" | i18n }} + + + + + {{ "notifications" | i18n }} + + + + + {{ "vault" | i18n }} + + + + + {{ "appearance" | i18n }} + + + + + {{ "about" | i18n }} + + + + + diff --git a/apps/browser/src/tools/popup/settings/settings-v2.component.ts b/apps/browser/src/tools/popup/settings/settings-v2.component.ts new file mode 100644 index 00000000000..5f3eb1c8f12 --- /dev/null +++ b/apps/browser/src/tools/popup/settings/settings-v2.component.ts @@ -0,0 +1,27 @@ +import { CommonModule } from "@angular/common"; +import { Component } from "@angular/core"; +import { RouterModule } from "@angular/router"; + +import { JslibModule } from "@bitwarden/angular/jslib.module"; +import { ItemModule } from "@bitwarden/components"; + +import { CurrentAccountComponent } from "../../../auth/popup/account-switching/current-account.component"; +import { PopOutComponent } from "../../../platform/popup/components/pop-out.component"; +import { PopupHeaderComponent } from "../../../platform/popup/layout/popup-header.component"; +import { PopupPageComponent } from "../../../platform/popup/layout/popup-page.component"; + +@Component({ + templateUrl: "settings-v2.component.html", + standalone: true, + imports: [ + CommonModule, + JslibModule, + RouterModule, + PopupPageComponent, + PopupHeaderComponent, + PopOutComponent, + ItemModule, + CurrentAccountComponent, + ], +}) +export class SettingsV2Component {} diff --git a/apps/browser/src/tools/popup/settings/settings.component.html b/apps/browser/src/tools/popup/settings/settings.component.html index 7506a07da55..7dba3d0a3de 100644 --- a/apps/browser/src/tools/popup/settings/settings.component.html +++ b/apps/browser/src/tools/popup/settings/settings.component.html @@ -1,15 +1,14 @@ -
- -
+

{{ "settings" | i18n }}

-
+
+ +
-

{{ "manage" | i18n }}

-
- -
-

{{ "account" | i18n }}

-
- -
-
-
-

{{ "tools" | i18n }}

-
- -
-
-
-

{{ "other" | i18n }}

-
- - -
-
diff --git a/apps/browser/src/tools/popup/settings/settings.component.ts b/apps/browser/src/tools/popup/settings/settings.component.ts index d0c5d63092b..973efc72038 100644 --- a/apps/browser/src/tools/popup/settings/settings.component.ts +++ b/apps/browser/src/tools/popup/settings/settings.component.ts @@ -1,101 +1,9 @@ -import { Component, OnInit } from "@angular/core"; -import { Router } from "@angular/router"; -import { firstValueFrom, Subject } from "rxjs"; - -import { VaultTimeoutService } from "@bitwarden/common/abstractions/vault-timeout/vault-timeout.service"; -import { DeviceType } from "@bitwarden/common/enums"; -import { EnvironmentService } from "@bitwarden/common/platform/abstractions/environment.service"; -import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; -import { MessagingService } from "@bitwarden/common/platform/abstractions/messaging.service"; -import { PlatformUtilsService } from "@bitwarden/common/platform/abstractions/platform-utils.service"; -import { DialogService } from "@bitwarden/components"; - -import { BrowserApi } from "../../../platform/browser/browser-api"; -import BrowserPopupUtils from "../../../platform/popup/browser-popup-utils"; - -import { AboutDialogComponent } from "./about-dialog/about-dialog.component"; - -const RateUrls = { - [DeviceType.ChromeExtension]: - "https://chromewebstore.google.com/detail/bitwarden-free-password-m/nngceckbapebfimnlniiiahkandclblb/reviews", - [DeviceType.FirefoxExtension]: - "https://addons.mozilla.org/en-US/firefox/addon/bitwarden-password-manager/#reviews", - [DeviceType.OperaExtension]: - "https://addons.opera.com/en/extensions/details/bitwarden-free-password-manager/#feedback-container", - [DeviceType.EdgeExtension]: - "https://microsoftedge.microsoft.com/addons/detail/jbkfoedolllekgbhcbcoahefnbanhhlh", - [DeviceType.VivaldiExtension]: - "https://chromewebstore.google.com/detail/bitwarden-free-password-m/nngceckbapebfimnlniiiahkandclblb/reviews", - [DeviceType.SafariExtension]: "https://apps.apple.com/app/bitwarden/id1352778147", -}; +import { Component } from "@angular/core"; @Component({ selector: "tools-settings", templateUrl: "settings.component.html", }) -// eslint-disable-next-line rxjs-angular/prefer-takeuntil -export class SettingsComponent implements OnInit { - private destroy$ = new Subject(); - - constructor( - private platformUtilsService: PlatformUtilsService, - private i18nService: I18nService, - private vaultTimeoutService: VaultTimeoutService, - public messagingService: MessagingService, - private router: Router, - private environmentService: EnvironmentService, - private dialogService: DialogService, - ) {} - - async ngOnInit() {} - - async share() { - const confirmed = await this.dialogService.openSimpleDialog({ - title: { key: "learnOrg" }, - content: { key: "learnOrgConfirmation" }, - type: "info", - }); - if (confirmed) { - // FIXME: Verify that this floating promise is intentional. If it is, add an explanatory comment and ensure there is proper error handling. - // eslint-disable-next-line @typescript-eslint/no-floating-promises - BrowserApi.createNewTab("https://bitwarden.com/help/about-organizations/"); - } - } - - async webVault() { - const env = await firstValueFrom(this.environmentService.environment$); - const url = env.getWebVaultUrl(); - await BrowserApi.createNewTab(url); - } - - async import() { - await this.router.navigate(["/import"]); - if (await BrowserApi.isPopupOpen()) { - // FIXME: Verify that this floating promise is intentional. If it is, add an explanatory comment and ensure there is proper error handling. - // eslint-disable-next-line @typescript-eslint/no-floating-promises - BrowserPopupUtils.openCurrentPagePopout(window); - } - } - - export() { - // FIXME: Verify that this floating promise is intentional. If it is, add an explanatory comment and ensure there is proper error handling. - // eslint-disable-next-line @typescript-eslint/no-floating-promises - this.router.navigate(["/export"]); - } - - about() { - this.dialogService.open(AboutDialogComponent); - } - - rate() { - const deviceType = this.platformUtilsService.getDevice(); - // FIXME: Verify that this floating promise is intentional. If it is, add an explanatory comment and ensure there is proper error handling. - // eslint-disable-next-line @typescript-eslint/no-floating-promises - BrowserApi.createNewTab((RateUrls as any)[deviceType]); - } - - ngOnDestroy() { - this.destroy$.next(); - this.destroy$.complete(); - } +export class SettingsComponent { + constructor() {} } diff --git a/apps/browser/src/vault/background/service_factories/cipher-service.factory.ts b/apps/browser/src/vault/background/service_factories/cipher-service.factory.ts deleted file mode 100644 index 57366ea8c05..00000000000 --- a/apps/browser/src/vault/background/service_factories/cipher-service.factory.ts +++ /dev/null @@ -1,88 +0,0 @@ -import { CipherService as AbstractCipherService } from "@bitwarden/common/vault/abstractions/cipher.service"; -import { CipherService } from "@bitwarden/common/vault/services/cipher.service"; - -import { - AutofillSettingsServiceInitOptions, - autofillSettingsServiceFactory, -} from "../../../autofill/background/service_factories/autofill-settings-service.factory"; -import { - DomainSettingsServiceInitOptions, - domainSettingsServiceFactory, -} from "../../../autofill/background/service_factories/domain-settings-service.factory"; -import { - CipherFileUploadServiceInitOptions, - cipherFileUploadServiceFactory, -} from "../../../background/service-factories/cipher-file-upload-service.factory"; -import { - searchServiceFactory, - SearchServiceInitOptions, -} from "../../../background/service-factories/search-service.factory"; -import { - apiServiceFactory, - ApiServiceInitOptions, -} from "../../../platform/background/service-factories/api-service.factory"; -import { - configServiceFactory, - ConfigServiceInitOptions, -} from "../../../platform/background/service-factories/config-service.factory"; -import { - cryptoServiceFactory, - CryptoServiceInitOptions, -} from "../../../platform/background/service-factories/crypto-service.factory"; -import { - EncryptServiceInitOptions, - encryptServiceFactory, -} from "../../../platform/background/service-factories/encrypt-service.factory"; -import { - CachedServices, - factory, - FactoryOptions, -} from "../../../platform/background/service-factories/factory-options"; -import { - i18nServiceFactory, - I18nServiceInitOptions, -} from "../../../platform/background/service-factories/i18n-service.factory"; -import { stateProviderFactory } from "../../../platform/background/service-factories/state-provider.factory"; -import { - stateServiceFactory, - StateServiceInitOptions, -} from "../../../platform/background/service-factories/state-service.factory"; - -type CipherServiceFactoryOptions = FactoryOptions; - -export type CipherServiceInitOptions = CipherServiceFactoryOptions & - CryptoServiceInitOptions & - ApiServiceInitOptions & - CipherFileUploadServiceInitOptions & - I18nServiceInitOptions & - SearchServiceInitOptions & - StateServiceInitOptions & - AutofillSettingsServiceInitOptions & - DomainSettingsServiceInitOptions & - EncryptServiceInitOptions & - ConfigServiceInitOptions; - -export function cipherServiceFactory( - cache: { cipherService?: AbstractCipherService } & CachedServices, - opts: CipherServiceInitOptions, -): Promise { - return factory( - cache, - "cipherService", - opts, - async () => - new CipherService( - await cryptoServiceFactory(cache, opts), - await domainSettingsServiceFactory(cache, opts), - await apiServiceFactory(cache, opts), - await i18nServiceFactory(cache, opts), - await searchServiceFactory(cache, opts), - await stateServiceFactory(cache, opts), - await autofillSettingsServiceFactory(cache, opts), - await encryptServiceFactory(cache, opts), - await cipherFileUploadServiceFactory(cache, opts), - await configServiceFactory(cache, opts), - await stateProviderFactory(cache, opts), - ), - ); -} diff --git a/apps/browser/src/vault/background/service_factories/collection-service.factory.ts b/apps/browser/src/vault/background/service_factories/collection-service.factory.ts deleted file mode 100644 index 69d5cd6f22f..00000000000 --- a/apps/browser/src/vault/background/service_factories/collection-service.factory.ts +++ /dev/null @@ -1,42 +0,0 @@ -import { CollectionService as AbstractCollectionService } from "@bitwarden/common/vault/abstractions/collection.service"; -import { CollectionService } from "@bitwarden/common/vault/services/collection.service"; - -import { - cryptoServiceFactory, - CryptoServiceInitOptions, -} from "../../../platform/background/service-factories/crypto-service.factory"; -import { - CachedServices, - factory, - FactoryOptions, -} from "../../../platform/background/service-factories/factory-options"; -import { - i18nServiceFactory, - I18nServiceInitOptions, -} from "../../../platform/background/service-factories/i18n-service.factory"; -import { stateProviderFactory } from "../../../platform/background/service-factories/state-provider.factory"; -import { StateServiceInitOptions } from "../../../platform/background/service-factories/state-service.factory"; - -type CollectionServiceFactoryOptions = FactoryOptions; - -export type CollectionServiceInitOptions = CollectionServiceFactoryOptions & - CryptoServiceInitOptions & - I18nServiceInitOptions & - StateServiceInitOptions; - -export function collectionServiceFactory( - cache: { collectionService?: AbstractCollectionService } & CachedServices, - opts: CollectionServiceInitOptions, -): Promise { - return factory( - cache, - "collectionService", - opts, - async () => - new CollectionService( - await cryptoServiceFactory(cache, opts), - await i18nServiceFactory(cache, opts), - await stateProviderFactory(cache, opts), - ), - ); -} diff --git a/apps/browser/src/vault/background/service_factories/folder-service.factory.ts b/apps/browser/src/vault/background/service_factories/folder-service.factory.ts deleted file mode 100644 index 0593dc904c3..00000000000 --- a/apps/browser/src/vault/background/service_factories/folder-service.factory.ts +++ /dev/null @@ -1,48 +0,0 @@ -import { FolderService as AbstractFolderService } from "@bitwarden/common/vault/abstractions/folder/folder.service.abstraction"; -import { FolderService } from "@bitwarden/common/vault/services/folder/folder.service"; - -import { - CryptoServiceInitOptions, - cryptoServiceFactory, -} from "../../../platform/background/service-factories/crypto-service.factory"; -import { - CachedServices, - factory, - FactoryOptions, -} from "../../../platform/background/service-factories/factory-options"; -import { - i18nServiceFactory, - I18nServiceInitOptions, -} from "../../../platform/background/service-factories/i18n-service.factory"; -import { - stateProviderFactory, - StateProviderInitOptions, -} from "../../../platform/background/service-factories/state-provider.factory"; - -import { cipherServiceFactory, CipherServiceInitOptions } from "./cipher-service.factory"; - -type FolderServiceFactoryOptions = FactoryOptions; - -export type FolderServiceInitOptions = FolderServiceFactoryOptions & - CryptoServiceInitOptions & - CipherServiceInitOptions & - I18nServiceInitOptions & - StateProviderInitOptions; - -export function folderServiceFactory( - cache: { folderService?: AbstractFolderService } & CachedServices, - opts: FolderServiceInitOptions, -): Promise { - return factory( - cache, - "folderService", - opts, - async () => - new FolderService( - await cryptoServiceFactory(cache, opts), - await i18nServiceFactory(cache, opts), - await cipherServiceFactory(cache, opts), - await stateProviderFactory(cache, opts), - ), - ); -} diff --git a/apps/browser/src/vault/background/service_factories/sync-notifier-service.factory.ts b/apps/browser/src/vault/background/service_factories/sync-notifier-service.factory.ts deleted file mode 100644 index 715d0f2c860..00000000000 --- a/apps/browser/src/vault/background/service_factories/sync-notifier-service.factory.ts +++ /dev/null @@ -1,21 +0,0 @@ -import { SyncNotifierService as AbstractSyncNotifierService } from "@bitwarden/common/vault/abstractions/sync/sync-notifier.service.abstraction"; -import { SyncNotifierService } from "@bitwarden/common/vault/services/sync/sync-notifier.service"; - -import { - FactoryOptions, - CachedServices, - factory, -} from "../../../platform/background/service-factories/factory-options"; - -type SyncNotifierServiceFactoryOptions = FactoryOptions; - -export type SyncNotifierServiceInitOptions = SyncNotifierServiceFactoryOptions; - -export function syncNotifierServiceFactory( - cache: { syncNotifierService?: AbstractSyncNotifierService } & CachedServices, - opts: SyncNotifierServiceInitOptions, -): Promise { - return factory(cache, "syncNotifierService", opts, () => - Promise.resolve(new SyncNotifierService()), - ); -} diff --git a/apps/browser/src/vault/background/service_factories/totp-service.factory.ts b/apps/browser/src/vault/background/service_factories/totp-service.factory.ts deleted file mode 100644 index c8f5a270b48..00000000000 --- a/apps/browser/src/vault/background/service_factories/totp-service.factory.ts +++ /dev/null @@ -1,38 +0,0 @@ -import { TotpService as AbstractTotpService } from "@bitwarden/common/vault/abstractions/totp.service"; -import { TotpService } from "@bitwarden/common/vault/services/totp.service"; - -import { - CryptoFunctionServiceInitOptions, - cryptoFunctionServiceFactory, -} from "../../../platform/background/service-factories/crypto-function-service.factory"; -import { - FactoryOptions, - CachedServices, - factory, -} from "../../../platform/background/service-factories/factory-options"; -import { - LogServiceInitOptions, - logServiceFactory, -} from "../../../platform/background/service-factories/log-service.factory"; - -type TotpServiceOptions = FactoryOptions; - -export type TotpServiceInitOptions = TotpServiceOptions & - CryptoFunctionServiceInitOptions & - LogServiceInitOptions; - -export function totpServiceFactory( - cache: { totpService?: AbstractTotpService } & CachedServices, - opts: TotpServiceInitOptions, -): Promise { - return factory( - cache, - "totpService", - opts, - async () => - new TotpService( - await cryptoFunctionServiceFactory(cache, opts), - await logServiceFactory(cache, opts), - ), - ); -} diff --git a/apps/browser/src/vault/popup/components/vault-v2/autofill-vault-list-items/autofill-vault-list-items.component.html b/apps/browser/src/vault/popup/components/vault-v2/autofill-vault-list-items/autofill-vault-list-items.component.html new file mode 100644 index 00000000000..0b108e8b814 --- /dev/null +++ b/apps/browser/src/vault/popup/components/vault-v2/autofill-vault-list-items/autofill-vault-list-items.component.html @@ -0,0 +1,26 @@ + + + + + + + {{ + "autofillSuggestionsTip" | i18n + }} + + diff --git a/apps/browser/src/vault/popup/components/vault-v2/autofill-vault-list-items/autofill-vault-list-items.component.ts b/apps/browser/src/vault/popup/components/vault-v2/autofill-vault-list-items/autofill-vault-list-items.component.ts new file mode 100644 index 00000000000..c00e585e739 --- /dev/null +++ b/apps/browser/src/vault/popup/components/vault-v2/autofill-vault-list-items/autofill-vault-list-items.component.ts @@ -0,0 +1,67 @@ +import { CommonModule } from "@angular/common"; +import { Component } from "@angular/core"; +import { combineLatest, map, Observable } from "rxjs"; + +import { JslibModule } from "@bitwarden/angular/jslib.module"; +import { CipherView } from "@bitwarden/common/vault/models/view/cipher.view"; +import { IconButtonModule, SectionComponent, TypographyModule } from "@bitwarden/components"; + +import BrowserPopupUtils from "../../../../../platform/popup/browser-popup-utils"; +import { PopupSectionHeaderComponent } from "../../../../../platform/popup/popup-section-header/popup-section-header.component"; +import { VaultPopupItemsService } from "../../../services/vault-popup-items.service"; +import { VaultListItemsContainerComponent } from "../vault-list-items-container/vault-list-items-container.component"; + +@Component({ + standalone: true, + imports: [ + CommonModule, + SectionComponent, + TypographyModule, + VaultListItemsContainerComponent, + JslibModule, + PopupSectionHeaderComponent, + IconButtonModule, + ], + selector: "app-autofill-vault-list-items", + templateUrl: "autofill-vault-list-items.component.html", +}) +export class AutofillVaultListItemsComponent { + /** + * The list of ciphers that can be used to autofill the current page. + * @protected + */ + protected autofillCiphers$: Observable = + this.vaultPopupItemsService.autoFillCiphers$; + + /** + * Flag indicating whether the refresh button should be shown. Only shown when the popup is within the FF sidebar. + * @protected + */ + protected showRefresh: boolean = BrowserPopupUtils.inSidebar(window); + + /** + * Observable that determines whether the empty autofill tip should be shown. + * The tip is shown when there are no ciphers to autofill, no filter is applied, and autofill is allowed in + * the current context (e.g. not in a popout). + * @protected + */ + protected showEmptyAutofillTip$: Observable = combineLatest([ + this.vaultPopupItemsService.hasFilterApplied$, + this.autofillCiphers$, + this.vaultPopupItemsService.autofillAllowed$, + ]).pipe( + map(([hasFilter, ciphers, canAutoFill]) => !hasFilter && canAutoFill && ciphers.length === 0), + ); + + constructor(private vaultPopupItemsService: VaultPopupItemsService) { + // TODO: Migrate logic to show Autofill policy toast PM-8144 + } + + /** + * Refreshes the current tab to re-populate the autofill ciphers. + * @protected + */ + protected refreshCurrentTab() { + this.vaultPopupItemsService.refreshCurrentTab(); + } +} diff --git a/apps/browser/src/vault/popup/components/vault-v2/index.ts b/apps/browser/src/vault/popup/components/vault-v2/index.ts new file mode 100644 index 00000000000..13618d007d2 --- /dev/null +++ b/apps/browser/src/vault/popup/components/vault-v2/index.ts @@ -0,0 +1,2 @@ +export * from "./vault-list-items-container/vault-list-items-container.component"; +export * from "./autofill-vault-list-items/autofill-vault-list-items.component"; diff --git a/apps/browser/src/vault/popup/components/vault-v2/vault-list-items-container/vault-list-items-container.component.html b/apps/browser/src/vault/popup/components/vault-v2/vault-list-items-container/vault-list-items-container.component.html new file mode 100644 index 00000000000..d3bb85c710f --- /dev/null +++ b/apps/browser/src/vault/popup/components/vault-v2/vault-list-items-container/vault-list-items-container.component.html @@ -0,0 +1,44 @@ + + + {{ ciphers.length }} + + + + + + + {{ cipher.name }} + {{ cipher.subTitle }} + + + + + + + + + + + + + + + diff --git a/apps/browser/src/vault/popup/components/vault-v2/vault-list-items-container/vault-list-items-container.component.ts b/apps/browser/src/vault/popup/components/vault-v2/vault-list-items-container/vault-list-items-container.component.ts new file mode 100644 index 00000000000..f9b34e96162 --- /dev/null +++ b/apps/browser/src/vault/popup/components/vault-v2/vault-list-items-container/vault-list-items-container.component.ts @@ -0,0 +1,65 @@ +import { CommonModule } from "@angular/common"; +import { booleanAttribute, Component, EventEmitter, Input, Output } from "@angular/core"; +import { RouterLink } from "@angular/router"; + +import { JslibModule } from "@bitwarden/angular/jslib.module"; +import { CipherView } from "@bitwarden/common/vault/models/view/cipher.view"; +import { + BadgeModule, + ButtonModule, + IconButtonModule, + ItemModule, + SectionComponent, + TypographyModule, +} from "@bitwarden/components"; + +import { PopupSectionHeaderComponent } from "../../../../../platform/popup/popup-section-header/popup-section-header.component"; + +@Component({ + imports: [ + CommonModule, + ItemModule, + ButtonModule, + BadgeModule, + IconButtonModule, + SectionComponent, + TypographyModule, + JslibModule, + PopupSectionHeaderComponent, + RouterLink, + ], + selector: "app-vault-list-items-container", + templateUrl: "vault-list-items-container.component.html", + standalone: true, +}) +export class VaultListItemsContainerComponent { + /** + * The list of ciphers to display. + */ + @Input() + ciphers: CipherView[]; + + /** + * Title for the vault list item section. + */ + @Input() + title: string; + + /** + * Option to show a refresh button in the section header. + */ + @Input({ transform: booleanAttribute }) + showRefresh: boolean; + + /** + * Event emitted when the refresh button is clicked. + */ + @Output() + onRefresh = new EventEmitter(); + + /** + * Option to show the autofill button for each item. + */ + @Input({ transform: booleanAttribute }) + showAutoFill: boolean; +} diff --git a/apps/browser/src/vault/popup/components/vault/add-edit.component.ts b/apps/browser/src/vault/popup/components/vault/add-edit.component.ts index 05255a3c011..62f2737be2f 100644 --- a/apps/browser/src/vault/popup/components/vault/add-edit.component.ts +++ b/apps/browser/src/vault/popup/components/vault/add-edit.component.ts @@ -10,13 +10,13 @@ import { AuditService } from "@bitwarden/common/abstractions/audit.service"; import { EventCollectionService } from "@bitwarden/common/abstractions/event/event-collection.service"; import { OrganizationService } from "@bitwarden/common/admin-console/abstractions/organization/organization.service.abstraction"; import { PolicyService } from "@bitwarden/common/admin-console/abstractions/policy/policy.service.abstraction"; +import { AccountService } from "@bitwarden/common/auth/abstractions/account.service"; import { AutofillSettingsServiceAbstraction } from "@bitwarden/common/autofill/services/autofill-settings.service"; import { ConfigService } from "@bitwarden/common/platform/abstractions/config/config.service"; import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; import { LogService } from "@bitwarden/common/platform/abstractions/log.service"; import { MessagingService } from "@bitwarden/common/platform/abstractions/messaging.service"; import { PlatformUtilsService } from "@bitwarden/common/platform/abstractions/platform-utils.service"; -import { StateService } from "@bitwarden/common/platform/abstractions/state.service"; import { SendApiService } from "@bitwarden/common/tools/send/services/send-api.service.abstraction"; import { CipherService } from "@bitwarden/common/vault/abstractions/cipher.service"; import { CollectionService } from "@bitwarden/common/vault/abstractions/collection.service"; @@ -53,7 +53,7 @@ export class AddEditComponent extends BaseAddEditComponent { i18nService: I18nService, platformUtilsService: PlatformUtilsService, auditService: AuditService, - stateService: StateService, + accountService: AccountService, private autofillSettingsService: AutofillSettingsServiceAbstraction, collectionService: CollectionService, messagingService: MessagingService, @@ -78,7 +78,7 @@ export class AddEditComponent extends BaseAddEditComponent { i18nService, platformUtilsService, auditService, - stateService, + accountService, collectionService, messagingService, eventCollectionService, diff --git a/apps/browser/src/vault/popup/components/vault/vault-v2.component.html b/apps/browser/src/vault/popup/components/vault/vault-v2.component.html index a653f463320..df2b2c1a13e 100644 --- a/apps/browser/src/vault/popup/components/vault/vault-v2.component.html +++ b/apps/browser/src/vault/popup/components/vault/vault-v2.component.html @@ -1 +1,51 @@ -

Vault V2 Extension Refresh

+ + + + + + + {{ "new" | i18n }} + + + + + + +
+ + {{ "yourVaultIsEmpty" | i18n }} + {{ "autofillSuggestionsTip" | i18n }} + + +
+ + + + +
+ + {{ "noItemsMatchSearch" | i18n }} + {{ "clearFiltersOrTryAnother" | i18n }} + +
+ + + + + + +
+
diff --git a/apps/browser/src/vault/popup/components/vault/vault-v2.component.ts b/apps/browser/src/vault/popup/components/vault/vault-v2.component.ts index 332e5d1a4e7..7e0be4607b4 100644 --- a/apps/browser/src/vault/popup/components/vault/vault-v2.component.ts +++ b/apps/browser/src/vault/popup/components/vault/vault-v2.component.ts @@ -1,13 +1,55 @@ +import { CommonModule } from "@angular/common"; import { Component, OnDestroy, OnInit } from "@angular/core"; +import { Router, RouterLink } from "@angular/router"; + +import { JslibModule } from "@bitwarden/angular/jslib.module"; +import { ButtonModule, Icons, NoItemsModule } from "@bitwarden/components"; + +import { CurrentAccountComponent } from "../../../../auth/popup/account-switching/current-account.component"; +import { PopOutComponent } from "../../../../platform/popup/components/pop-out.component"; +import { PopupHeaderComponent } from "../../../../platform/popup/layout/popup-header.component"; +import { PopupPageComponent } from "../../../../platform/popup/layout/popup-page.component"; +import { VaultPopupItemsService } from "../../services/vault-popup-items.service"; +import { AutofillVaultListItemsComponent, VaultListItemsContainerComponent } from "../vault-v2"; @Component({ selector: "app-vault", templateUrl: "vault-v2.component.html", + standalone: true, + imports: [ + PopupPageComponent, + PopupHeaderComponent, + PopOutComponent, + CurrentAccountComponent, + NoItemsModule, + JslibModule, + CommonModule, + AutofillVaultListItemsComponent, + VaultListItemsContainerComponent, + ButtonModule, + RouterLink, + ], }) export class VaultV2Component implements OnInit, OnDestroy { - constructor() {} + protected favoriteCiphers$ = this.vaultPopupItemsService.favoriteCiphers$; + protected remainingCiphers$ = this.vaultPopupItemsService.remainingCiphers$; + + protected showEmptyState$ = this.vaultPopupItemsService.emptyVault$; + protected showNoResultsState$ = this.vaultPopupItemsService.noFilteredResults$; + + protected vaultIcon = Icons.Vault; + + constructor( + private vaultPopupItemsService: VaultPopupItemsService, + private router: Router, + ) {} ngOnInit(): void {} ngOnDestroy(): void {} + + addCipher() { + // TODO: Add currently filtered organization to query params if available + void this.router.navigate(["/add-cipher"], {}); + } } diff --git a/apps/browser/src/vault/popup/services/vault-popup-items.service.spec.ts b/apps/browser/src/vault/popup/services/vault-popup-items.service.spec.ts new file mode 100644 index 00000000000..1830d4be35e --- /dev/null +++ b/apps/browser/src/vault/popup/services/vault-popup-items.service.spec.ts @@ -0,0 +1,248 @@ +import { mock } from "jest-mock-extended"; +import { BehaviorSubject } from "rxjs"; + +import { CipherId } from "@bitwarden/common/types/guid"; +import { CipherService } from "@bitwarden/common/vault/abstractions/cipher.service"; +import { VaultSettingsService } from "@bitwarden/common/vault/abstractions/vault-settings/vault-settings.service"; +import { CipherType } from "@bitwarden/common/vault/enums"; +import { CipherView } from "@bitwarden/common/vault/models/view/cipher.view"; + +import { BrowserApi } from "../../../platform/browser/browser-api"; +import BrowserPopupUtils from "../../../platform/popup/browser-popup-utils"; + +import { VaultPopupItemsService } from "./vault-popup-items.service"; + +describe("VaultPopupItemsService", () => { + let service: VaultPopupItemsService; + let allCiphers: Record; + let autoFillCiphers: CipherView[]; + + const cipherServiceMock = mock(); + const vaultSettingsServiceMock = mock(); + + beforeEach(() => { + allCiphers = cipherFactory(10); + const cipherList = Object.values(allCiphers); + // First 2 ciphers are autofill + autoFillCiphers = cipherList.slice(0, 2); + + // First autofill cipher is also favorite + autoFillCiphers[0].favorite = true; + + // 3rd and 4th ciphers are favorite + cipherList[2].favorite = true; + cipherList[3].favorite = true; + + cipherServiceMock.cipherViews$ = new BehaviorSubject(allCiphers).asObservable(); + cipherServiceMock.filterCiphersForUrl.mockImplementation(async () => autoFillCiphers); + vaultSettingsServiceMock.showCardsCurrentTab$ = new BehaviorSubject(false).asObservable(); + vaultSettingsServiceMock.showIdentitiesCurrentTab$ = new BehaviorSubject(false).asObservable(); + jest.spyOn(BrowserPopupUtils, "inPopout").mockReturnValue(false); + jest + .spyOn(BrowserApi, "getTabFromCurrentWindow") + .mockResolvedValue({ url: "https://example.com" } as chrome.tabs.Tab); + service = new VaultPopupItemsService(cipherServiceMock, vaultSettingsServiceMock); + }); + + it("should be created", () => { + service = new VaultPopupItemsService(cipherServiceMock, vaultSettingsServiceMock); + expect(service).toBeTruthy(); + }); + + describe("autoFillCiphers$", () => { + it("should return empty array if there is no current tab", (done) => { + jest.spyOn(BrowserApi, "getTabFromCurrentWindow").mockResolvedValue(null); + service.autoFillCiphers$.subscribe((ciphers) => { + expect(ciphers).toEqual([]); + done(); + }); + }); + + it("should return empty array if in Popout window", (done) => { + jest.spyOn(BrowserPopupUtils, "inPopout").mockReturnValue(true); + service.autoFillCiphers$.subscribe((ciphers) => { + expect(ciphers).toEqual([]); + done(); + }); + }); + + it("should filter ciphers for the current tab and types", (done) => { + const currentTab = { url: "https://example.com" } as chrome.tabs.Tab; + + vaultSettingsServiceMock.showCardsCurrentTab$ = new BehaviorSubject(true).asObservable(); + vaultSettingsServiceMock.showIdentitiesCurrentTab$ = new BehaviorSubject(true).asObservable(); + jest.spyOn(BrowserApi, "getTabFromCurrentWindow").mockResolvedValue(currentTab); + + service = new VaultPopupItemsService(cipherServiceMock, vaultSettingsServiceMock); + + service.autoFillCiphers$.subscribe((ciphers) => { + expect(cipherServiceMock.filterCiphersForUrl.mock.calls.length).toBe(1); + expect(cipherServiceMock.filterCiphersForUrl).toHaveBeenCalledWith( + expect.anything(), + currentTab.url, + [CipherType.Card, CipherType.Identity], + ); + done(); + }); + }); + + it("should return ciphers sorted by type, then by last used date, then by name", (done) => { + const expectedTypeOrder: Record = { + [CipherType.Login]: 1, + [CipherType.Card]: 2, + [CipherType.Identity]: 3, + [CipherType.SecureNote]: 4, + }; + + // Assume all ciphers are autofill ciphers to test sorting + cipherServiceMock.filterCiphersForUrl.mockImplementation(async () => + Object.values(allCiphers), + ); + + service = new VaultPopupItemsService(cipherServiceMock, vaultSettingsServiceMock); + + service.autoFillCiphers$.subscribe((ciphers) => { + expect(ciphers.length).toBe(10); + + for (let i = 0; i < ciphers.length - 1; i++) { + const current = ciphers[i]; + const next = ciphers[i + 1]; + + expect(expectedTypeOrder[current.type]).toBeLessThanOrEqual(expectedTypeOrder[next.type]); + } + expect(cipherServiceMock.sortCiphersByLastUsedThenName).toHaveBeenCalled(); + done(); + }); + }); + }); + + describe("favoriteCiphers$", () => { + it("should exclude autofill ciphers", (done) => { + service.favoriteCiphers$.subscribe((ciphers) => { + // 2 autofill ciphers, 3 favorite ciphers, 1 favorite cipher is also autofill = 2 favorite ciphers to show + expect(ciphers.length).toBe(2); + done(); + }); + }); + + it("should sort by last used then by name", (done) => { + service.favoriteCiphers$.subscribe((ciphers) => { + expect(cipherServiceMock.sortCiphersByLastUsedThenName).toHaveBeenCalled(); + done(); + }); + }); + }); + + describe("remainingCiphers$", () => { + it("should exclude autofill and favorite ciphers", (done) => { + service.remainingCiphers$.subscribe((ciphers) => { + // 2 autofill ciphers, 2 favorite ciphers = 6 remaining ciphers to show + expect(ciphers.length).toBe(6); + done(); + }); + }); + + it("should sort by last used then by name", (done) => { + service.remainingCiphers$.subscribe((ciphers) => { + expect(cipherServiceMock.getLocaleSortingFunction).toHaveBeenCalled(); + done(); + }); + }); + }); + + describe("emptyVault$", () => { + it("should return true if there are no ciphers", (done) => { + cipherServiceMock.cipherViews$ = new BehaviorSubject({}).asObservable(); + service = new VaultPopupItemsService(cipherServiceMock, vaultSettingsServiceMock); + service.emptyVault$.subscribe((empty) => { + expect(empty).toBe(true); + done(); + }); + }); + + it("should return false if there are ciphers", (done) => { + service.emptyVault$.subscribe((empty) => { + expect(empty).toBe(false); + done(); + }); + }); + }); + + describe("autoFillAllowed$", () => { + it("should return true if there is a current tab", (done) => { + service.autofillAllowed$.subscribe((allowed) => { + expect(allowed).toBe(true); + done(); + }); + }); + + it("should return false if there is no current tab", (done) => { + jest.spyOn(BrowserApi, "getTabFromCurrentWindow").mockResolvedValue(null); + service.autofillAllowed$.subscribe((allowed) => { + expect(allowed).toBe(false); + done(); + }); + }); + + it("should return false if in a Popout", (done) => { + jest.spyOn(BrowserPopupUtils, "inPopout").mockReturnValue(true); + service.autofillAllowed$.subscribe((allowed) => { + expect(allowed).toBe(false); + done(); + }); + }); + }); +}); + +// A function to generate a list of ciphers of different types +function cipherFactory(count: number): Record { + const ciphers: CipherView[] = []; + for (let i = 0; i < count; i++) { + const type = ((i % 4) + 1) as CipherType; + switch (type) { + case CipherType.Login: + ciphers.push({ + id: `${i}`, + type: CipherType.Login, + name: `Login ${i}`, + login: { + username: `username${i}`, + password: `password${i}`, + }, + } as CipherView); + break; + case CipherType.SecureNote: + ciphers.push({ + id: `${i}`, + type: CipherType.SecureNote, + name: `SecureNote ${i}`, + notes: `notes${i}`, + } as CipherView); + break; + case CipherType.Card: + ciphers.push({ + id: `${i}`, + type: CipherType.Card, + name: `Card ${i}`, + card: { + cardholderName: `cardholderName${i}`, + number: `number${i}`, + brand: `brand${i}`, + }, + } as CipherView); + break; + case CipherType.Identity: + ciphers.push({ + id: `${i}`, + type: CipherType.Identity, + name: `Identity ${i}`, + identity: { + firstName: `firstName${i}`, + lastName: `lastName${i}`, + }, + } as CipherView); + break; + } + } + return Object.fromEntries(ciphers.map((c) => [c.id, c])); +} diff --git a/apps/browser/src/vault/popup/services/vault-popup-items.service.ts b/apps/browser/src/vault/popup/services/vault-popup-items.service.ts new file mode 100644 index 00000000000..52de117e6b5 --- /dev/null +++ b/apps/browser/src/vault/popup/services/vault-popup-items.service.ts @@ -0,0 +1,186 @@ +import { Injectable } from "@angular/core"; +import { + combineLatest, + map, + Observable, + of, + shareReplay, + startWith, + Subject, + switchMap, +} from "rxjs"; + +import { CipherService } from "@bitwarden/common/vault/abstractions/cipher.service"; +import { VaultSettingsService } from "@bitwarden/common/vault/abstractions/vault-settings/vault-settings.service"; +import { CipherType } from "@bitwarden/common/vault/enums"; +import { CipherView } from "@bitwarden/common/vault/models/view/cipher.view"; + +import { BrowserApi } from "../../../platform/browser/browser-api"; +import BrowserPopupUtils from "../../../platform/popup/browser-popup-utils"; + +/** + * Service for managing the various item lists on the new Vault tab in the browser popup. + */ +@Injectable({ + providedIn: "root", +}) +export class VaultPopupItemsService { + private _refreshCurrentTab$ = new Subject(); + + /** + * Observable that contains the list of other cipher types that should be shown + * in the autofill section of the Vault tab. Depends on vault settings. + * @private + */ + private _otherAutoFillTypes$: Observable = combineLatest([ + this.vaultSettingsService.showCardsCurrentTab$, + this.vaultSettingsService.showIdentitiesCurrentTab$, + ]).pipe( + map(([showCards, showIdentities]) => { + return [ + ...(showCards ? [CipherType.Card] : []), + ...(showIdentities ? [CipherType.Identity] : []), + ]; + }), + ); + + /** + * Observable that contains the current tab to be considered for autofill. If there is no current tab + * or the popup is in a popout window, this will be null. + * @private + */ + private _currentAutofillTab$: Observable = this._refreshCurrentTab$.pipe( + startWith(null), + switchMap(async () => { + if (BrowserPopupUtils.inPopout(window)) { + return null; + } + return await BrowserApi.getTabFromCurrentWindow(); + }), + shareReplay({ refCount: false, bufferSize: 1 }), + ); + + /** + * Observable that contains the list of all decrypted ciphers. + * @private + */ + private _cipherList$: Observable = this.cipherService.cipherViews$.pipe( + map((ciphers) => Object.values(ciphers)), + shareReplay({ refCount: false, bufferSize: 1 }), + ); + + /** + * List of ciphers that can be used for autofill on the current tab. Includes cards and/or identities + * if enabled in the vault settings. Ciphers are sorted by type, then by last used date, then by name. + * + * See {@link refreshCurrentTab} to trigger re-evaluation of the current tab. + */ + autoFillCiphers$: Observable = combineLatest([ + this._cipherList$, + this._otherAutoFillTypes$, + this._currentAutofillTab$, + ]).pipe( + switchMap(([ciphers, otherTypes, tab]) => { + if (!tab) { + return of([]); + } + return this.cipherService.filterCiphersForUrl(ciphers, tab.url, otherTypes); + }), + map((ciphers) => ciphers.sort(this.sortCiphersForAutofill.bind(this))), + shareReplay({ refCount: false, bufferSize: 1 }), + ); + + /** + * List of favorite ciphers that are not currently suggested for autofill. + * Ciphers are sorted by last used date, then by name. + */ + favoriteCiphers$: Observable = combineLatest([ + this.autoFillCiphers$, + this._cipherList$, + ]).pipe( + map(([autoFillCiphers, ciphers]) => + ciphers.filter((cipher) => cipher.favorite && !autoFillCiphers.includes(cipher)), + ), + map((ciphers) => + ciphers.sort((a, b) => this.cipherService.sortCiphersByLastUsedThenName(a, b)), + ), + shareReplay({ refCount: false, bufferSize: 1 }), + ); + + /** + * List of all remaining ciphers that are not currently suggested for autofill or marked as favorite. + * Ciphers are sorted by name. + */ + remainingCiphers$: Observable = combineLatest([ + this.autoFillCiphers$, + this.favoriteCiphers$, + this._cipherList$, + ]).pipe( + map(([autoFillCiphers, favoriteCiphers, ciphers]) => + ciphers.filter( + (cipher) => !autoFillCiphers.includes(cipher) && !favoriteCiphers.includes(cipher), + ), + ), + map((ciphers) => ciphers.sort(this.cipherService.getLocaleSortingFunction())), + shareReplay({ refCount: false, bufferSize: 1 }), + ); + + /** + * Observable that indicates whether a filter is currently applied to the ciphers. + * @todo Implement filter/search functionality in PM-6824 and PM-6826. + */ + hasFilterApplied$: Observable = of(false); + + /** + * Observable that indicates whether autofill is allowed in the current context. + * Autofill is allowed when there is a current tab and the popup is not in a popout window. + */ + autofillAllowed$: Observable = this._currentAutofillTab$.pipe(map((tab) => !!tab)); + + /** + * Observable that indicates whether the user's vault is empty. + */ + emptyVault$: Observable = this._cipherList$.pipe(map((ciphers) => !ciphers.length)); + + /** + * Observable that indicates whether there are no ciphers to show with the current filter. + * @todo Implement filter/search functionality in PM-6824 and PM-6826. + */ + noFilteredResults$: Observable = of(false); + + constructor( + private cipherService: CipherService, + private vaultSettingsService: VaultSettingsService, + ) {} + + /** + * Re-fetch the current tab to trigger a re-evaluation of the autofill ciphers. + */ + refreshCurrentTab() { + this._refreshCurrentTab$.next(null); + } + + /** + * Sort function for ciphers to be used in the autofill section of the Vault tab. + * Sorts by type, then by last used date, and finally by name. + * @private + */ + private sortCiphersForAutofill(a: CipherView, b: CipherView): number { + const typeOrder: Record = { + [CipherType.Login]: 1, + [CipherType.Card]: 2, + [CipherType.Identity]: 3, + [CipherType.SecureNote]: 4, + }; + + // Compare types first + if (typeOrder[a.type] < typeOrder[b.type]) { + return -1; + } else if (typeOrder[a.type] > typeOrder[b.type]) { + return 1; + } + + // If types are the same, then sort by last used then name + return this.cipherService.sortCiphersByLastUsedThenName(a, b); + } +} diff --git a/apps/browser/src/vault/popup/settings/vault-settings-v2.component.html b/apps/browser/src/vault/popup/settings/vault-settings-v2.component.html new file mode 100644 index 00000000000..10243bdaa9f --- /dev/null +++ b/apps/browser/src/vault/popup/settings/vault-settings-v2.component.html @@ -0,0 +1,35 @@ + + + + + + + + + + + {{ "folders" | i18n }} + + + + + + + + + {{ "exportVault" | i18n }} + + + + + + + + diff --git a/apps/browser/src/vault/popup/settings/vault-settings-v2.component.ts b/apps/browser/src/vault/popup/settings/vault-settings-v2.component.ts new file mode 100644 index 00000000000..c969f0436df --- /dev/null +++ b/apps/browser/src/vault/popup/settings/vault-settings-v2.component.ts @@ -0,0 +1,76 @@ +import { CommonModule } from "@angular/common"; +import { Component, OnInit } from "@angular/core"; +import { Router, RouterModule } from "@angular/router"; + +import { JslibModule } from "@bitwarden/angular/jslib.module"; +import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; +import { SyncService } from "@bitwarden/common/vault/abstractions/sync/sync.service.abstraction"; +import { ItemModule, ToastOptions, ToastService } from "@bitwarden/components"; + +import { BrowserApi } from "../../../platform/browser/browser-api"; +import BrowserPopupUtils from "../../../platform/popup/browser-popup-utils"; +import { PopOutComponent } from "../../../platform/popup/components/pop-out.component"; +import { PopupFooterComponent } from "../../../platform/popup/layout/popup-footer.component"; +import { PopupHeaderComponent } from "../../../platform/popup/layout/popup-header.component"; +import { PopupPageComponent } from "../../../platform/popup/layout/popup-page.component"; + +@Component({ + templateUrl: "vault-settings-v2.component.html", + standalone: true, + imports: [ + CommonModule, + JslibModule, + RouterModule, + PopupPageComponent, + PopupFooterComponent, + PopupHeaderComponent, + PopOutComponent, + ItemModule, + ], +}) +export class VaultSettingsV2Component implements OnInit { + lastSync = "--"; + + constructor( + private router: Router, + private syncService: SyncService, + private toastService: ToastService, + private i18nService: I18nService, + ) {} + + async ngOnInit() { + await this.setLastSync(); + } + + async import() { + await this.router.navigate(["/import"]); + if (await BrowserApi.isPopupOpen()) { + await BrowserPopupUtils.openCurrentPagePopout(window); + } + } + + async sync() { + let toastConfig: ToastOptions; + const success = await this.syncService.fullSync(true); + if (success) { + await this.setLastSync(); + toastConfig = { + variant: "success", + title: "", + message: this.i18nService.t("syncingComplete"), + }; + } else { + toastConfig = { variant: "error", title: "", message: this.i18nService.t("syncingFailed") }; + } + this.toastService.showToast(toastConfig); + } + + private async setLastSync() { + const last = await this.syncService.getLastSync(); + if (last != null) { + this.lastSync = last.toLocaleDateString() + " " + last.toLocaleTimeString(); + } else { + this.lastSync = this.i18nService.t("never"); + } + } +} diff --git a/apps/browser/store/locales/es/copy.resx b/apps/browser/store/locales/es/copy.resx index 019006422a9..a17440a0d6b 100644 --- a/apps/browser/store/locales/es/copy.resx +++ b/apps/browser/store/locales/es/copy.resx @@ -124,48 +124,47 @@ En casa, en el trabajo o en el viaje, Bitwarden asegura fácilmente todas sus contraseñas, claves de acceso e información confidencial. - Recognized as the best password manager by PCMag, WIRED, The Verge, CNET, G2, and more! + ¡Reconocido como el mejor administrador de contraseñas por PCMag, WIRED, The Verge, CNET, G2 y más! -SECURE YOUR DIGITAL LIFE -Secure your digital life and protect against data breaches by generating and saving unique, strong passwords for every account. Maintain everything in an end-to-end encrypted password vault that only you can access. +ASEGURA TU VIDA DIGITAL +Asegura tu vida digital y protéjete contra las filtraciones de datos generando y guardando contraseñas únicas y seguras para cada cuenta. Mantén todo en una caja fuerte de contraseñas cifrada de extremo a extremo a la que solo tú puedes acceder. -ACCESS YOUR DATA, ANYWHERE, ANYTIME, ON ANY DEVICE -Easily manage, store, secure, and share unlimited passwords across unlimited devices without restrictions. +ACCEDE A TUS DATOS, EN CUALQUIER LUGAR, EN CUALQUIER MOMENTO Y EN CUALQUIER DISPOSITIVO +Administra, almacena, proteje y comparte fácilmente contraseñas ilimitadas en dispositivos ilimitados sin restricciones. -EVERYONE SHOULD HAVE THE TOOLS TO STAY SAFE ONLINE -Utilize Bitwarden for free with no ads or selling data. Bitwarden believes everyone should have the ability to stay safe online. Premium plans offer access to advanced features. +TODO EL MUNDO DEBERÍA TENER LAS HERRAMIENTAS PARA MANTENERSE SEGURO EN LÍNEA +Utiliza Bitwarden de forma gratuita sin anuncios ni vendiendo tus datos. Bitwarden cree que todo el mundo debería tener la capacidad de mantenerse seguro en línea. Los planes premium ofrecen acceso a funciones avanzadas. -EMPOWER YOUR TEAMS WITH BITWARDEN -Plans for Teams and Enterprise come with professional business features. Some examples include SSO integration, self-hosting, directory integration and SCIM provisioning, global policies, API access, event logs, and more. +EMPODERA A TUS EQUIPOS CON BITWARDEN +Los planes para Equipos y Empresa vienen con características empresariales profesionales. Algunos ejemplos incluyen integración de SSO, autoalojamiento, integración de directorios y aprovisionamiento de SCIM, políticas globales, acceso a la API, registros de eventos y más. -Use Bitwarden to secure your workforce and share sensitive information with colleagues. +Utiliza Bitwarden para proteger a tu personal y compartir información confidencial con tus colegas. +Más razones para elegir Bitwarden: -More reasons to choose Bitwarden: +Encriptación de clase mundial +Las contraseñas están protegidas con cifrado avanzado de extremo a extremo (AES-256 bits, hashtag salado y PBKDF2 SHA-256) para que tus datos permanezcan seguros y privados. -World-Class Encryption -Passwords are protected with advanced end-to-end encryption (AES-256 bit, salted hashtag, and PBKDF2 SHA-256) so your data stays secure and private. +Auditorías de terceros +Bitwarden realiza regularmente auditorías integrales de seguridad de terceros con empresas de seguridad notables. Estas auditorías anuales incluyen evaluaciones de código fuente y pruebas de penetración en las direcciones IP, los servidores y las aplicaciones web de Bitwarden. -3rd-party Audits -Bitwarden regularly conducts comprehensive third-party security audits with notable security firms. These annual audits include source code assessments and penetration testing across Bitwarden IPs, servers, and web applications. - -Advanced 2FA -Secure your login with a third-party authenticator, emailed codes, or FIDO2 WebAuthn credentials such as a hardware security key or passkey. +2FA avanzado +Proteje tu inicio de sesión con un autenticador de terceros, códigos enviados por correo electrónico o credenciales FIDO2 WebAuthn, como una clave de seguridad de hardware o una clave de acceso. Bitwarden Send -Transmit data directly to others while maintaining end-to-end encrypted security and limiting exposure. +Transmite datos directamente a otros mientras mantienes la seguridad cifrada de extremo a extremo y limitas la exposición. -Built-in Generator -Create long, complex, and distinct passwords and unique usernames for every site you visit. Integrate with email alias providers for additional privacy. +Generador incorporado +Crea contraseñas largas, complejas y distintas y nombres de usuario únicos para cada sitio que visites. Integra proveedores de alias de correo electrónico para mayor privacidad. -Global Translations -Bitwarden translations exist for more than 60 languages, translated by the global community though Crowdin. +Traducciones Globales +Existen traducciones de Bitwarden para más de 60 idiomas, traducidas por la comunidad global a través de Crowdin. -Cross-Platform Applications -Secure and share sensitive data within your Bitwarden Vault from any browser, mobile device, or desktop OS, and more. +Aplicaciones multiplataforma +Proteje y comparte datos confidenciales dentro de tu Caja fuerte de Bitwarden desde cualquier navegador, dispositivo móvil o sistema operativo de escritorio, y más. -Bitwarden secures more than just passwords -End-to-end encrypted credential management solutions from Bitwarden empower organizations to secure everything, including developer secrets and passkey experiences. Visit Bitwarden.com to learn more about Bitwarden Secrets Manager and Bitwarden Passwordless.dev! +Bitwarden protege más que solo contraseñas +Las soluciones de gestión de credenciales cifradas de extremo a extremo de Bitwarden permiten a las organizaciones proteger todo, incluidos los secretos de los desarrolladores y las experiencias de clave de acceso. ¡Visita Bitwarden.com para obtener más información sobre Bitwarden Secrets Manager y Bitwarden Passwordless.dev! diff --git a/apps/browser/store/locales/fi/copy.resx b/apps/browser/store/locales/fi/copy.resx index a50cedbdacd..076a724bdf8 100644 --- a/apps/browser/store/locales/fi/copy.resx +++ b/apps/browser/store/locales/fi/copy.resx @@ -124,48 +124,48 @@ Kotona, töissä tai reissussa, Bitwarden suojaa helposti salasanasi, suojausavaimesi ja arkaluonteiset tietosi. - Recognized as the best password manager by PCMag, WIRED, The Verge, CNET, G2, and more! + Muun muassa PCMag, WIRED, The Verge, CNET sekä G2 ovat nimenneet Bitwardenin parhaaksi salasanahallinnaksi! -SECURE YOUR DIGITAL LIFE -Secure your digital life and protect against data breaches by generating and saving unique, strong passwords for every account. Maintain everything in an end-to-end encrypted password vault that only you can access. +SUOJAA DIGITAALINEN ELÄMÄSI +Varjele digielämääsi varautumalla tietovuotoihin luomalla kaikille tileillesi yksilölliset, vahvat salasanat ja säilyttämällä ne turvallisesti. Hallitse kaikkea päästä päähän salatussa salasanaholvissa, johon vain sinulla on käyttöoikeus. -ACCESS YOUR DATA, ANYWHERE, ANYTIME, ON ANY DEVICE -Easily manage, store, secure, and share unlimited passwords across unlimited devices without restrictions. +TAVOITA TIETOSI MISTÄ, MILLOIN JA MILLÄ LAITTEELLA TAHANSA +Hallitse, säilytä, suojaa ja jaa salasanoja niin paljon kuin haluat, niin monella laitteella kuin haluat. -EVERYONE SHOULD HAVE THE TOOLS TO STAY SAFE ONLINE -Utilize Bitwarden for free with no ads or selling data. Bitwarden believes everyone should have the ability to stay safe online. Premium plans offer access to advanced features. +KAIKILLA TULISI OLLA TYÖKALUT VERKOSSA SUOJAUTUMISEEN +Hyödynnä Bitwardenia ilmaiseksi ilman mainoksia tai käyttäjätietojen myyntiä. Bitwardenin mielestä kaikkien tulee voida suojautua verkossa. Premium-tilaukset tarjoavat lisäominaisuuksia. -EMPOWER YOUR TEAMS WITH BITWARDEN -Plans for Teams and Enterprise come with professional business features. Some examples include SSO integration, self-hosting, directory integration and SCIM provisioning, global policies, API access, event logs, and more. +TEHOSTA TIIMIESI TYÖSKENTELYÄ BITWARDENILLA +Teams- ja Enterprise-tilaukset tarjoavat esimerkiksi SSO- ja hakemistointegraatioiden, SCIM-hallinnan, oman palvelinympäristön, laajan käytäntöhallinnan, rajapinnan sekä käyttölokien kaltaisia ammattitason yritysominaisuuksia. -Use Bitwarden to secure your workforce and share sensitive information with colleagues. +Suojaa henkilökuntasi Bitwardenilla ja jaa arkaluonteisia tietoja kollegoidesi kanssa. -More reasons to choose Bitwarden: +Lisää syitä valita Bitwarden: -World-Class Encryption -Passwords are protected with advanced end-to-end encryption (AES-256 bit, salted hashtag, and PBKDF2 SHA-256) so your data stays secure and private. +Maailmanluoka salaus: +Salasanat on suojattu edistyneellä päästä päähän salauksella (AES-256 bit, suolattu hajautus sekä PBKDF2 SHA-256), joten tietosi pysyvät turvassa ja yksityisinä. -3rd-party Audits -Bitwarden regularly conducts comprehensive third-party security audits with notable security firms. These annual audits include source code assessments and penetration testing across Bitwarden IPs, servers, and web applications. +Riippumattomat auditoinnit +Bitwarden teetättää säännöllisesti tunnettujen tietoturvayritysten suorittamia kattavia riippumattomia tietoturva-arviointeja. Näissä vuotuisissa auditoinneissa arvioidaan lähdekoodia ja suoritetaan murtotestausta Bitwardenin IP-osoittelle, palvelimille ja verkkosovelluksille. -Advanced 2FA -Secure your login with a third-party authenticator, emailed codes, or FIDO2 WebAuthn credentials such as a hardware security key or passkey. +Edistynyt kaksivaiheinen tunnistautuminen +Suojaa kirjautumistietosi riippumattomalla todennussovelluksella, sähköpostikoodeilla tai FIDO2 WEBAuthn -standardin mukaisilla fyysisillä tai ohjelmallisilla suojausavaimilla. Bitwarden Send -Transmit data directly to others while maintaining end-to-end encrypted security and limiting exposure. +Välitä tietoja muille suoraan, päästä päähän salausta menettämättä ja rajoitaen niiden näkyvyyttä. -Built-in Generator -Create long, complex, and distinct passwords and unique usernames for every site you visit. Integrate with email alias providers for additional privacy. +Sisäänrakennettu generaattori +Luo pitkät, monimutkaiset ja yksilölliset salasanat sekä ainutlaatuiset käyttäjätunnukset kaikille käyttämillesi verkkosivustoille. Sähköpostialiaksia toimittavien palveluiden liitäntämahdollisuus tehostaa yksityisyyttä. -Global Translations -Bitwarden translations exist for more than 60 languages, translated by the global community though Crowdin. +Maailmanlaajuinen kielituki +Bitwarden on maailmanlaajuisen Crowdin-yhteisön toimesta yli 60 kielelle. -Cross-Platform Applications -Secure and share sensitive data within your Bitwarden Vault from any browser, mobile device, or desktop OS, and more. +Sovellukset eri alustoille +Suojaa ja jaa Bitwarden-holvisi arkaluonteisia tietoja mm. mistä tahansa selaimesta, mobiililaitteesta tai pöytätietokoneesta. -Bitwarden secures more than just passwords -End-to-end encrypted credential management solutions from Bitwarden empower organizations to secure everything, including developer secrets and passkey experiences. Visit Bitwarden.com to learn more about Bitwarden Secrets Manager and Bitwarden Passwordless.dev! +Bitwarden suojaa muutakin kuin salasanoja +Bitwardenin päästä päähän salatut käyttäjätietojen hallintaratkaisut tarjoavat organisaatiolle mahdollisuuden suojata paljon muutakin, kuten kehityssalaisuuksia ja suojausavaintoteutuksia. Vieraile osoitteessa Bitwaren.com ja tutustu Bitwarden Salaisuushallinta ja Bitwarden Passwordless.dev -palveluihin! diff --git a/apps/browser/store/locales/gl/copy.resx b/apps/browser/store/locales/gl/copy.resx index efcbcda29e6..4292ebc4b31 100644 --- a/apps/browser/store/locales/gl/copy.resx +++ b/apps/browser/store/locales/gl/copy.resx @@ -124,48 +124,48 @@ En casa, no traballo ou mentres estás a viaxar, Bitwarden protexe doadamente todos os teus contrasinais, chaves de paso, e información sensíbel. - Recognized as the best password manager by PCMag, WIRED, The Verge, CNET, G2, and more! + Recoñecido como o mellor xestor de contrasinais por PCMag, WIRED, The Verge, CNET, G2 e moito máis. -SECURE YOUR DIGITAL LIFE -Secure your digital life and protect against data breaches by generating and saving unique, strong passwords for every account. Maintain everything in an end-to-end encrypted password vault that only you can access. +ASEGURA A TÚA VIDA DIXITAL +Protexe a túa vida dixital e protéxete contra filtracións de datos xerando e gardando contrasinais únicos e seguros para cada conta. Mantén todo nunha caixa de forte contrasinais cifrada de extremo a extremo á que só ti podes acceder. -ACCESS YOUR DATA, ANYWHERE, ANYTIME, ON ANY DEVICE -Easily manage, store, secure, and share unlimited passwords across unlimited devices without restrictions. +ACCEDE AOS TEUS DATOS, EN CALQUERA LUGAR, EN CALQUERA DISPOSITIVO +Xestiona, almacena, protexe e comparte facilmente contrasinais ilimitados en dispositivos ilimitados sen restricións. -EVERYONE SHOULD HAVE THE TOOLS TO STAY SAFE ONLINE -Utilize Bitwarden for free with no ads or selling data. Bitwarden believes everyone should have the ability to stay safe online. Premium plans offer access to advanced features. +TODOS DEBERÍAN TER AS FERRAMENTAS PARA ESTAR SEGUROS EN LIÑA +Usa Bitwarden de balde sen anuncios nin vendendo os teus datos. Bitwarden cre que todos deberían ter a capacidade de estar seguros en liña. Os plans Premium ofrecen acceso a funcións avanzadas. -EMPOWER YOUR TEAMS WITH BITWARDEN -Plans for Teams and Enterprise come with professional business features. Some examples include SSO integration, self-hosting, directory integration and SCIM provisioning, global policies, API access, event logs, and more. +EMPODERA OS SEUS EQUIPOS CON BITWARDEN +Os plans para Equipos e Empresa inclúen funcións comerciais profesionais. Algúns exemplos inclúen integración de SSO, autoaloxamento, integración de directorios e aprovisionamento de SCIM, políticas globais, acceso á API, rexistros de eventos e máis. -Use Bitwarden to secure your workforce and share sensitive information with colleagues. +Usa Bitwarden para protexer ao teu persoal e compartir información confidencial cos colegas. -More reasons to choose Bitwarden: +Máis razóns para escoller Bitwarden: -World-Class Encryption -Passwords are protected with advanced end-to-end encryption (AES-256 bit, salted hashtag, and PBKDF2 SHA-256) so your data stays secure and private. +Cifrado de clase mundial +Os contrasinais están protexidos con cifrado avanzado de extremo a extremo (AES-256 bits, hashtag salgado e PBKDF2 SHA-256) para que os teus datos permanezan seguros e privados. -3rd-party Audits -Bitwarden regularly conducts comprehensive third-party security audits with notable security firms. These annual audits include source code assessments and penetration testing across Bitwarden IPs, servers, and web applications. +Auditorías de terceiros +Bitwarden realiza regularmente auditorías de seguridade completas de terceiros con importantes empresas de seguridade. Estas auditorías anuais inclúen avaliacións do código fonte e probas de penetración nas IP, servidores e aplicacións web de Bitwarden. -Advanced 2FA -Secure your login with a third-party authenticator, emailed codes, or FIDO2 WebAuthn credentials such as a hardware security key or passkey. +2FA avanzado +Protexe o teu inicio de sesión cun autenticador de terceiros, códigos enviados por correo electrónico ou credenciais FIDO2 WebAuthn, como unha clave de seguranza de hardware ou unha clave de acceso. Bitwarden Send -Transmit data directly to others while maintaining end-to-end encrypted security and limiting exposure. +Transmite datos directamente a outras persoas mantendo a seguridade con cifrado de extremo a extremo e limitando a exposición. -Built-in Generator -Create long, complex, and distinct passwords and unique usernames for every site you visit. Integrate with email alias providers for additional privacy. +Xerador incorporado +Crea contrasinais longos, complexos e distintos e nomes de usuario únicos para cada sitio que visites. Integra provedores de alias de correo electrónico para obter máis privacidade. -Global Translations -Bitwarden translations exist for more than 60 languages, translated by the global community though Crowdin. +Traducións globais +As traducións de Bitwarden existen para máis de 60 idiomas, traducidas pola comunidade global a través de Crowdin. -Cross-Platform Applications -Secure and share sensitive data within your Bitwarden Vault from any browser, mobile device, or desktop OS, and more. +Aplicacións multiplataforma +Asegura e comparte datos confidenciais dentro da túa Caixa forte de Bitwarden desde calquera navegador, dispositivo móbil ou sistema operativo de escritorio, e máis. -Bitwarden secures more than just passwords -End-to-end encrypted credential management solutions from Bitwarden empower organizations to secure everything, including developer secrets and passkey experiences. Visit Bitwarden.com to learn more about Bitwarden Secrets Manager and Bitwarden Passwordless.dev! +Bitwarden protexe máis que só contrasinais +As solucións de xestión de credenciais cifradas de extremo a extremo de Bitwarden permiten ás organizacións protexer todo, incluídos os segredos dos desenvolvedores e as experiencias de clave de acceso. Visita Bitwarden.com para obter máis información sobre Bitwarden Secrets Manager e Bitwarden Passwordless.dev! diff --git a/apps/browser/store/locales/ja/copy.resx b/apps/browser/store/locales/ja/copy.resx index 67c479fcde6..910c8d7cab5 100644 --- a/apps/browser/store/locales/ja/copy.resx +++ b/apps/browser/store/locales/ja/copy.resx @@ -118,10 +118,10 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - Bitwarden Password Manager + Bitwarden パスワードマネージャー - At home, at work, or on the go, Bitwarden easily secures all your passwords, passkeys, and sensitive information. + 自宅、職場、または外出先でも、Bitwarden はすべてのパスワード、パスキー、機密情報を簡単に保護します。 Recognized as the best password manager by PCMag, WIRED, The Verge, CNET, G2, and more! @@ -169,7 +169,7 @@ End-to-end encrypted credential management solutions from Bitwarden empower orga - At home, at work, or on the go, Bitwarden easily secures all your passwords, passkeys, and sensitive information. + 自宅、職場、または外出先でも、Bitwarden はすべてのパスワード、パスキー、機密情報を簡単に保護します。 複数の端末で保管庫に同期&アクセス diff --git a/apps/browser/store/locales/lv/copy.resx b/apps/browser/store/locales/lv/copy.resx index e64cc2eb3a4..6d75e8ff0ef 100644 --- a/apps/browser/store/locales/lv/copy.resx +++ b/apps/browser/store/locales/lv/copy.resx @@ -118,10 +118,10 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - Bitwarden Password Manager + Bitwarden paroļu pārvaldnieks - At home, at work, or on the go, Bitwarden easily secures all your passwords, passkeys, and sensitive information. + Bitwarden viegli aizsargā visas paroles, paroļu atslēgas un jutīgu informāciju mājās, darbā vai ceļā. Recognized as the best password manager by PCMag, WIRED, The Verge, CNET, G2, and more! @@ -169,7 +169,7 @@ End-to-end encrypted credential management solutions from Bitwarden empower orga - At home, at work, or on the go, Bitwarden easily secures all your passwords, passkeys, and sensitive information. + Bitwarden viegli aizsargā visas paroles, paroļu atslēgas un jutīgu informāciju mājās, darbā vai ceļā. Sinhronizē un piekļūsti savai glabātavai no vairākām ierīcēm diff --git a/apps/browser/store/locales/pt_BR/copy.resx b/apps/browser/store/locales/pt_BR/copy.resx index 067f9357b23..0f4f00340d5 100644 --- a/apps/browser/store/locales/pt_BR/copy.resx +++ b/apps/browser/store/locales/pt_BR/copy.resx @@ -121,7 +121,7 @@ Gerenciador de Senhas Bitwarden - Em casa, no trabalho, ou em qualquer lugar, o Bitwarden protege facilmente todas as suas senhas, senhas e informações confidenciais. + Em qualquer lugar que esteja, o Bitwarden protege facilmente todas as suas senhas, senhas e informações confidenciais. Recognized as the best password manager by PCMag, WIRED, The Verge, CNET, G2, and more! @@ -169,7 +169,7 @@ End-to-end encrypted credential management solutions from Bitwarden empower orga - Em casa, no trabalho, ou em qualquer lugar, o Bitwarden protege facilmente todas as suas senhas, senhas e informações confidenciais. + Em qualquer lugar que esteja, o Bitwarden protege facilmente todas as suas senhas, senhas e informações confidenciais. Sincronize e acesse o seu cofre através de múltiplos dispositivos diff --git a/apps/browser/tailwind.config.js b/apps/browser/tailwind.config.js index affbddf2b2d..be5c9ce4d96 100644 --- a/apps/browser/tailwind.config.js +++ b/apps/browser/tailwind.config.js @@ -1,6 +1,10 @@ /* eslint-disable no-undef, @typescript-eslint/no-var-requires */ const config = require("../../libs/components/tailwind.config.base"); -config.content = ["./src/**/*.{html,ts}", "../../libs/components/src/**/*.{html,ts}"]; +config.content = [ + "./src/**/*.{html,ts}", + "../../libs/components/src/**/*.{html,ts}", + "../../libs/angular/src/**/*.{html,ts}", +]; module.exports = config; diff --git a/apps/cli/package.json b/apps/cli/package.json index 4d1636c51a1..3da80a0dda4 100644 --- a/apps/cli/package.json +++ b/apps/cli/package.json @@ -18,30 +18,27 @@ "license": "GPL-3.0-only", "scripts": { "clean": "rimraf dist", - "build": "webpack", - "build:debug": "npm run build && node --inspect ./build/bw.js", - "build:watch": "webpack --watch", - "build:prod": "cross-env NODE_ENV=production webpack", - "build:prod:watch": "cross-env NODE_ENV=production webpack --watch", - "package": "npm run package:win && npm run package:mac && npm run package:lin", - "package:win": "pkg . --targets win-x64 --output ./dist/windows/bw.exe", - "package:mac": "pkg . --targets macos-x64 --output ./dist/macos/bw", - "package:lin": "pkg . --targets linux-x64 --output ./dist/linux/bw", + "build:oss": "webpack", + "build:oss:debug": "npm run build:oss && node --inspect ./build/bw.js", + "build:oss:watch": "webpack --watch", + "build:oss:prod": "cross-env NODE_ENV=production webpack", + "build:oss:prod:watch": "cross-env NODE_ENV=production webpack --watch", "debug": "node --inspect ./build/bw.js", - "dist": "npm run build:prod && npm run clean && npm run package", - "dist:win": "npm run build:prod && npm run clean && npm run package:win", - "dist:mac": "npm run build:prod && npm run clean && npm run package:mac", - "dist:lin": "npm run build:prod && npm run clean && npm run package:lin", - "publish:npm": "npm run build:prod && npm publish --access public", + "publish:npm": "npm run build:oss:prod && npm publish --access public", "build:bit": "webpack -c ../../bitwarden_license/bit-cli/webpack.config.js", "build:bit:debug": "npm run build:bit && node --inspect ./build/bw.js", "build:bit:watch": "webpack --watch -c ../../bitwarden_license/bit-cli/webpack.config.js", "build:bit:prod": "cross-env NODE_ENV=production npm run build:bit", "build:bit:prod:watch": "cross-env NODE_ENV=production npm run build:bit:watch", - "dist:bit": "npm run build:bit:prod && npm run clean && npm run package", + "dist:oss:win": "npm run build:oss:prod && npm run clean && npm run package:oss:win", + "dist:oss:mac": "npm run build:oss:prod && npm run clean && npm run package:oss:mac", + "dist:oss:lin": "npm run build:oss:prod && npm run clean && npm run package:oss:lin", "dist:bit:win": "npm run build:bit:prod && npm run clean && npm run package:bit:win", "dist:bit:mac": "npm run build:bit:prod && npm run clean && npm run package:bit:mac", "dist:bit:lin": "npm run build:bit:prod && npm run clean && npm run package:bit:lin", + "package:oss:win": "pkg . --targets win-x64 --output ./dist/oss/windows/bw.exe", + "package:oss:mac": "pkg . --targets macos-x64 --output ./dist/oss/macos/bw", + "package:oss:lin": "pkg . --targets linux-x64 --output ./dist/oss/linux/bw", "package:bit:win": "pkg . --targets win-x64 --output ./dist/bit/windows/bw.exe", "package:bit:mac": "pkg . --targets macos-x64 --output ./dist/bit/macos/bw", "package:bit:lin": "pkg . --targets linux-x64 --output ./dist/bit/linux/bw", diff --git a/apps/cli/src/auth/commands/login.command.ts b/apps/cli/src/auth/commands/login.command.ts index bd61727a6c7..5e80f6faf40 100644 --- a/apps/cli/src/auth/commands/login.command.ts +++ b/apps/cli/src/auth/commands/login.command.ts @@ -3,7 +3,7 @@ import * as http from "http"; import { OptionValues } from "commander"; import * as inquirer from "inquirer"; import Separator from "inquirer/lib/objects/separator"; -import { firstValueFrom } from "rxjs"; +import { firstValueFrom, map } from "rxjs"; import { LoginStrategyServiceAbstraction, @@ -15,6 +15,7 @@ import { ApiService } from "@bitwarden/common/abstractions/api.service"; import { OrganizationService } from "@bitwarden/common/admin-console/abstractions/organization/organization.service.abstraction"; import { PolicyApiServiceAbstraction } from "@bitwarden/common/admin-console/abstractions/policy/policy-api.service.abstraction"; import { PolicyService } from "@bitwarden/common/admin-console/abstractions/policy/policy.service.abstraction"; +import { AccountService } from "@bitwarden/common/auth/abstractions/account.service"; import { AuthService } from "@bitwarden/common/auth/abstractions/auth.service"; import { KdfConfigService } from "@bitwarden/common/auth/abstractions/kdf-config.service"; import { KeyConnectorService } from "@bitwarden/common/auth/abstractions/key-connector.service"; @@ -31,7 +32,6 @@ import { CryptoFunctionService } from "@bitwarden/common/platform/abstractions/c import { CryptoService } from "@bitwarden/common/platform/abstractions/crypto.service"; import { EnvironmentService } from "@bitwarden/common/platform/abstractions/environment.service"; import { PlatformUtilsService } from "@bitwarden/common/platform/abstractions/platform-utils.service"; -import { StateService } from "@bitwarden/common/platform/abstractions/state.service"; import { Utils } from "@bitwarden/common/platform/misc/utils"; import { EncString } from "@bitwarden/common/platform/models/domain/enc-string"; import { SymmetricCryptoKey } from "@bitwarden/common/platform/models/domain/symmetric-crypto-key"; @@ -60,7 +60,7 @@ export class LoginCommand { protected passwordGenerationService: PasswordGenerationServiceAbstraction, protected passwordStrengthService: PasswordStrengthServiceAbstraction, protected platformUtilsService: PlatformUtilsService, - protected stateService: StateService, + protected accountService: AccountService, protected cryptoService: CryptoService, protected policyService: PolicyService, protected twoFactorService: TwoFactorService, @@ -491,7 +491,9 @@ export class LoginCommand { hint?: string; }> { if (this.email == null || this.email === "undefined") { - this.email = await this.stateService.getEmail(); + this.email = await firstValueFrom( + this.accountService.activeAccount$.pipe(map((a) => a?.email)), + ); } // Get New Master Password diff --git a/apps/cli/src/auth/commands/unlock.command.ts b/apps/cli/src/auth/commands/unlock.command.ts index ca42be5ac5c..e3bb9257fac 100644 --- a/apps/cli/src/auth/commands/unlock.command.ts +++ b/apps/cli/src/auth/commands/unlock.command.ts @@ -1,4 +1,4 @@ -import { firstValueFrom } from "rxjs"; +import { firstValueFrom, map } from "rxjs"; import { ApiService } from "@bitwarden/common/abstractions/api.service"; import { OrganizationApiServiceAbstraction } from "@bitwarden/common/admin-console/abstractions/organization/organization-api.service.abstraction"; @@ -49,10 +49,11 @@ export class UnlockCommand { } await this.setNewSessionKey(); - const email = await this.stateService.getEmail(); + const [userId, email] = await firstValueFrom( + this.accountService.activeAccount$.pipe(map((a) => [a?.id, a?.email])), + ); const kdfConfig = await this.kdfConfigService.getKdfConfig(); const masterKey = await this.cryptoService.makeMasterKey(password, email, kdfConfig); - const userId = (await firstValueFrom(this.accountService.activeAccount$))?.id; const storedMasterKeyHash = await firstValueFrom( this.masterPasswordService.masterKeyHash$(userId), ); diff --git a/apps/cli/src/commands/get.command.ts b/apps/cli/src/commands/get.command.ts index cd726d18be7..142f0576b50 100644 --- a/apps/cli/src/commands/get.command.ts +++ b/apps/cli/src/commands/get.command.ts @@ -23,6 +23,7 @@ import { StateService } from "@bitwarden/common/platform/abstractions/state.serv import { Utils } from "@bitwarden/common/platform/misc/utils"; import { EncString } from "@bitwarden/common/platform/models/domain/enc-string"; import { SendType } from "@bitwarden/common/tools/send/enums/send-type"; +import { OrganizationId } from "@bitwarden/common/types/guid"; import { CipherService } from "@bitwarden/common/vault/abstractions/cipher.service"; import { CollectionService } from "@bitwarden/common/vault/abstractions/collection.service"; import { FolderService } from "@bitwarden/common/vault/abstractions/folder/folder.service.abstraction"; @@ -404,7 +405,10 @@ export class GetCommand extends DownloadCommand { if (Utils.isGuid(id)) { const collection = await this.collectionService.get(id); if (collection != null) { - decCollection = await collection.decrypt(); + const orgKeys = await firstValueFrom(this.cryptoService.activeUserOrgKeys$); + decCollection = await collection.decrypt( + orgKeys[collection.organizationId as OrganizationId], + ); } } else if (id.trim() !== "") { let collections = await this.collectionService.getAllDecrypted(); diff --git a/apps/cli/src/commands/serve.command.ts b/apps/cli/src/commands/serve.command.ts index aad205998fb..2b1e21f8abb 100644 --- a/apps/cli/src/commands/serve.command.ts +++ b/apps/cli/src/commands/serve.command.ts @@ -103,7 +103,7 @@ export class ServeCommand { this.statusCommand = new StatusCommand( this.serviceContainer.environmentService, this.serviceContainer.syncService, - this.serviceContainer.stateService, + this.serviceContainer.accountService, this.serviceContainer.authService, ); this.deleteCommand = new DeleteCommand( diff --git a/apps/cli/src/commands/status.command.ts b/apps/cli/src/commands/status.command.ts index 32b93a7e40b..3fe8be620c2 100644 --- a/apps/cli/src/commands/status.command.ts +++ b/apps/cli/src/commands/status.command.ts @@ -1,9 +1,9 @@ -import { firstValueFrom } from "rxjs"; +import { firstValueFrom, map } from "rxjs"; +import { AccountService } from "@bitwarden/common/auth/abstractions/account.service"; import { AuthService } from "@bitwarden/common/auth/abstractions/auth.service"; import { AuthenticationStatus } from "@bitwarden/common/auth/enums/authentication-status"; import { EnvironmentService } from "@bitwarden/common/platform/abstractions/environment.service"; -import { StateService } from "@bitwarden/common/platform/abstractions/state.service"; import { SyncService } from "@bitwarden/common/vault/abstractions/sync/sync.service.abstraction"; import { Response } from "../models/response"; @@ -13,7 +13,7 @@ export class StatusCommand { constructor( private envService: EnvironmentService, private syncService: SyncService, - private stateService: StateService, + private accountService: AccountService, private authService: AuthService, ) {} @@ -22,8 +22,9 @@ export class StatusCommand { const baseUrl = await this.baseUrl(); const status = await this.status(); const lastSync = await this.syncService.getLastSync(); - const userId = await this.stateService.getUserId(); - const email = await this.stateService.getEmail(); + const [userId, email] = await firstValueFrom( + this.accountService.activeAccount$.pipe(map((a) => [a?.id, a?.email])), + ); return Response.success( new TemplateResponse({ diff --git a/apps/cli/src/program.ts b/apps/cli/src/program.ts index 3a2858aa817..667e0f683fd 100644 --- a/apps/cli/src/program.ts +++ b/apps/cli/src/program.ts @@ -1,6 +1,6 @@ import * as chalk from "chalk"; import { program, Command, OptionValues } from "commander"; -import { firstValueFrom } from "rxjs"; +import { firstValueFrom, map } from "rxjs"; import { AuthenticationStatus } from "@bitwarden/common/auth/enums/authentication-status"; @@ -161,7 +161,7 @@ export class Program { this.serviceContainer.passwordGenerationService, this.serviceContainer.passwordStrengthService, this.serviceContainer.platformUtilsService, - this.serviceContainer.stateService, + this.serviceContainer.accountService, this.serviceContainer.cryptoService, this.serviceContainer.policyService, this.serviceContainer.twoFactorService, @@ -481,7 +481,7 @@ export class Program { const command = new StatusCommand( this.serviceContainer.environmentService, this.serviceContainer.syncService, - this.serviceContainer.stateService, + this.serviceContainer.accountService, this.serviceContainer.authService, ); const response = await command.run(); @@ -603,9 +603,15 @@ export class Program { } private async exitIfAuthed() { - const authed = await this.serviceContainer.stateService.getIsAuthenticated(); + const authed = await firstValueFrom( + this.serviceContainer.authService.activeAccountStatus$.pipe( + map((status) => status > AuthenticationStatus.LoggedOut), + ), + ); if (authed) { - const email = await this.serviceContainer.stateService.getEmail(); + const email = await firstValueFrom( + this.serviceContainer.accountService.activeAccount$.pipe(map((a) => a?.email)), + ); this.processResponse(Response.error("You are already logged in as " + email + "."), true); } } diff --git a/apps/cli/src/service-container.ts b/apps/cli/src/service-container.ts index cffdc53444e..882791ef9c9 100644 --- a/apps/cli/src/service-container.ts +++ b/apps/cli/src/service-container.ts @@ -103,10 +103,8 @@ import { EventUploadService } from "@bitwarden/common/services/event/event-uploa import { SearchService } from "@bitwarden/common/services/search.service"; import { VaultTimeoutSettingsService } from "@bitwarden/common/services/vault-timeout/vault-timeout-settings.service"; import { VaultTimeoutService } from "@bitwarden/common/services/vault-timeout/vault-timeout.service"; -import { - PasswordGenerationService, - PasswordGenerationServiceAbstraction, -} from "@bitwarden/common/tools/generator/password"; +import { legacyPasswordGenerationServiceFactory } from "@bitwarden/common/tools/generator"; +import { PasswordGenerationServiceAbstraction } from "@bitwarden/common/tools/generator/password"; import { PasswordStrengthService, PasswordStrengthServiceAbstraction, @@ -499,10 +497,12 @@ export class ServiceContainer { this.passwordStrengthService = new PasswordStrengthService(); - this.passwordGenerationService = new PasswordGenerationService( + this.passwordGenerationService = legacyPasswordGenerationServiceFactory( + this.encryptService, this.cryptoService, this.policyService, - this.stateService, + this.accountService, + this.stateProvider, ); this.devicesApiService = new DevicesApiServiceImplementation(this.apiService); @@ -740,7 +740,6 @@ export class ServiceContainer { this.cipherService.clear(userId), this.folderService.clear(userId), this.collectionService.clear(userId as UserId), - this.passwordGenerationService.clear(), ]); await this.stateEventRunnerService.handleEvent("logout", userId); diff --git a/apps/desktop/src/app/accounts/settings.component.ts b/apps/desktop/src/app/accounts/settings.component.ts index ade019b9fba..6984e2da890 100644 --- a/apps/desktop/src/app/accounts/settings.component.ts +++ b/apps/desktop/src/app/accounts/settings.component.ts @@ -224,7 +224,9 @@ export class SettingsComponent implements OnInit { if ((await this.stateService.getUserId()) == null) { return; } - this.currentUserEmail = await this.stateService.getEmail(); + this.currentUserEmail = await firstValueFrom( + this.accountService.activeAccount$.pipe(map((a) => a?.email)), + ); this.currentUserId = (await this.stateService.getUserId()) as UserId; this.availableVaultTimeoutActions$ = this.refreshTimeoutSettings$.pipe( @@ -697,13 +699,6 @@ export class SettingsComponent implements OnInit { ); if (errorResult !== null) { this.logService.error("Error in DDG browser integration: " + errorResult); - await this.dialogService.openSimpleDialog({ - title: { key: "browserIntegrationUnsupportedTitle" }, - content: errorResult.message, - acceptButtonText: { key: "ok" }, - cancelButtonText: null, - type: "warning", - }); } } diff --git a/apps/desktop/src/app/app.component.ts b/apps/desktop/src/app/app.component.ts index e77ef8d3f07..4bc34f9af97 100644 --- a/apps/desktop/src/app/app.component.ts +++ b/apps/desktop/src/app/app.component.ts @@ -411,7 +411,8 @@ export class AppComponent implements OnInit, OnDestroy { this.masterPasswordService.forceSetPasswordReason$(message.userId), )) != ForceSetPasswordReason.None; if (locked) { - this.messagingService.send("locked", { userId: message.userId }); + this.modalService.closeAll(); + await this.router.navigate(["lock"]); } else if (forcedPasswordReset) { // FIXME: Verify that this floating promise is intentional. If it is, add an explanatory comment and ensure there is proper error handling. // eslint-disable-next-line @typescript-eslint/no-floating-promises @@ -607,7 +608,6 @@ export class AppComponent implements OnInit, OnDestroy { await this.cipherService.clear(userBeingLoggedOut); await this.folderService.clear(userBeingLoggedOut); await this.collectionService.clear(userBeingLoggedOut); - await this.passwordGenerationService.clear(userBeingLoggedOut); await this.vaultTimeoutSettingsService.clear(userBeingLoggedOut); await this.biometricStateService.logout(userBeingLoggedOut); diff --git a/apps/desktop/src/app/tools/export/export.component.html b/apps/desktop/src/app/tools/export/export.component.html index 0058a0925c2..3792713e61e 100644 --- a/apps/desktop/src/app/tools/export/export.component.html +++ b/apps/desktop/src/app/tools/export/export.component.html @@ -21,11 +21,6 @@ - - - - diff --git a/apps/desktop/src/app/tools/export/export.component.ts b/apps/desktop/src/app/tools/export/export.component.ts index 80ae3c80f96..6cf5760a1cb 100644 --- a/apps/desktop/src/app/tools/export/export.component.ts +++ b/apps/desktop/src/app/tools/export/export.component.ts @@ -4,7 +4,6 @@ import { UntypedFormBuilder } from "@angular/forms"; import { EventCollectionService } from "@bitwarden/common/abstractions/event/event-collection.service"; import { OrganizationService } from "@bitwarden/common/admin-console/abstractions/organization/organization.service.abstraction"; import { PolicyService } from "@bitwarden/common/admin-console/abstractions/policy/policy.service.abstraction"; -import { UserVerificationService } from "@bitwarden/common/auth/abstractions/user-verification/user-verification.service.abstraction"; import { FileDownloadService } from "@bitwarden/common/platform/abstractions/file-download/file-download.service"; import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; import { LogService } from "@bitwarden/common/platform/abstractions/log.service"; @@ -24,7 +23,6 @@ export class ExportComponent extends BaseExportComponent implements OnInit { exportService: VaultExportServiceAbstraction, eventCollectionService: EventCollectionService, policyService: PolicyService, - userVerificationService: UserVerificationService, formBuilder: UntypedFormBuilder, logService: LogService, fileDownloadService: FileDownloadService, @@ -38,7 +36,6 @@ export class ExportComponent extends BaseExportComponent implements OnInit { eventCollectionService, policyService, logService, - userVerificationService, formBuilder, fileDownloadService, dialogService, diff --git a/apps/desktop/src/app/tools/generator.component.spec.ts b/apps/desktop/src/app/tools/generator.component.spec.ts index d908de8ef77..dff7da96004 100644 --- a/apps/desktop/src/app/tools/generator.component.spec.ts +++ b/apps/desktop/src/app/tools/generator.component.spec.ts @@ -8,7 +8,6 @@ import { AccountService } from "@bitwarden/common/auth/abstractions/account.serv import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; import { LogService } from "@bitwarden/common/platform/abstractions/log.service"; import { PlatformUtilsService } from "@bitwarden/common/platform/abstractions/platform-utils.service"; -import { StateService } from "@bitwarden/common/platform/abstractions/state.service"; import { PasswordGenerationServiceAbstraction } from "@bitwarden/common/tools/generator/password"; import { UsernameGenerationServiceAbstraction } from "@bitwarden/common/tools/generator/username"; import { CipherService } from "@bitwarden/common/vault/abstractions/cipher.service"; @@ -36,10 +35,6 @@ describe("GeneratorComponent", () => { provide: UsernameGenerationServiceAbstraction, useValue: mock(), }, - { - provide: StateService, - useValue: mock(), - }, { provide: PlatformUtilsService, useValue: platformUtilsServiceMock, diff --git a/apps/desktop/src/app/tools/generator.component.ts b/apps/desktop/src/app/tools/generator.component.ts index a36bffa0e5f..a5c3d393877 100644 --- a/apps/desktop/src/app/tools/generator.component.ts +++ b/apps/desktop/src/app/tools/generator.component.ts @@ -1,11 +1,11 @@ -import { Component } from "@angular/core"; +import { Component, NgZone } from "@angular/core"; import { ActivatedRoute } from "@angular/router"; import { GeneratorComponent as BaseGeneratorComponent } from "@bitwarden/angular/tools/generator/components/generator.component"; +import { AccountService } from "@bitwarden/common/auth/abstractions/account.service"; import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; import { LogService } from "@bitwarden/common/platform/abstractions/log.service"; import { PlatformUtilsService } from "@bitwarden/common/platform/abstractions/platform-utils.service"; -import { StateService } from "@bitwarden/common/platform/abstractions/state.service"; import { PasswordGenerationServiceAbstraction } from "@bitwarden/common/tools/generator/password"; import { UsernameGenerationServiceAbstraction } from "@bitwarden/common/tools/generator/username"; @@ -17,20 +17,22 @@ export class GeneratorComponent extends BaseGeneratorComponent { constructor( passwordGenerationService: PasswordGenerationServiceAbstraction, usernameGenerationService: UsernameGenerationServiceAbstraction, - stateService: StateService, + accountService: AccountService, platformUtilsService: PlatformUtilsService, i18nService: I18nService, route: ActivatedRoute, + ngZone: NgZone, logService: LogService, ) { super( passwordGenerationService, usernameGenerationService, platformUtilsService, - stateService, + accountService, i18nService, logService, route, + ngZone, window, ); } diff --git a/apps/desktop/src/auth/login/login-approval.component.ts b/apps/desktop/src/auth/login/login-approval.component.ts index 048d294f4aa..296efb50e4a 100644 --- a/apps/desktop/src/auth/login/login-approval.component.ts +++ b/apps/desktop/src/auth/login/login-approval.component.ts @@ -1,17 +1,17 @@ import { DIALOG_DATA, DialogRef } from "@angular/cdk/dialog"; import { CommonModule } from "@angular/common"; import { Component, OnInit, OnDestroy, Inject } from "@angular/core"; -import { Subject, firstValueFrom } from "rxjs"; +import { Subject, firstValueFrom, map } from "rxjs"; import { JslibModule } from "@bitwarden/angular/jslib.module"; import { AuthRequestServiceAbstraction } from "@bitwarden/auth/common"; import { ApiService } from "@bitwarden/common/abstractions/api.service"; +import { AccountService } from "@bitwarden/common/auth/abstractions/account.service"; import { AuthRequestResponse } from "@bitwarden/common/auth/models/response/auth-request.response"; import { AppIdService } from "@bitwarden/common/platform/abstractions/app-id.service"; import { CryptoService } from "@bitwarden/common/platform/abstractions/crypto.service"; import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; import { PlatformUtilsService } from "@bitwarden/common/platform/abstractions/platform-utils.service"; -import { StateService } from "@bitwarden/common/platform/abstractions/state.service"; import { Utils } from "@bitwarden/common/platform/misc/utils"; import { AsyncActionsModule, @@ -47,7 +47,7 @@ export class LoginApprovalComponent implements OnInit, OnDestroy { constructor( @Inject(DIALOG_DATA) private params: LoginApprovalDialogParams, protected authRequestService: AuthRequestServiceAbstraction, - protected stateService: StateService, + protected accountService: AccountService, protected platformUtilsService: PlatformUtilsService, protected i18nService: I18nService, protected apiService: ApiService, @@ -74,7 +74,9 @@ export class LoginApprovalComponent implements OnInit, OnDestroy { if (this.notificationId != null) { this.authRequestResponse = await this.apiService.getAuthRequest(this.notificationId); const publicKey = Utils.fromB64ToArray(this.authRequestResponse.publicKey); - this.email = await this.stateService.getEmail(); + this.email = await await firstValueFrom( + this.accountService.activeAccount$.pipe(map((a) => a?.email)), + ); this.fingerprintPhrase = ( await this.cryptoService.getFingerprint(this.email, publicKey) ).join("-"); diff --git a/apps/desktop/src/auth/login/login-via-auth-request.component.ts b/apps/desktop/src/auth/login/login-via-auth-request.component.ts index 2d0f560205b..40d41f22361 100644 --- a/apps/desktop/src/auth/login/login-via-auth-request.component.ts +++ b/apps/desktop/src/auth/login/login-via-auth-request.component.ts @@ -21,7 +21,6 @@ import { EnvironmentService } from "@bitwarden/common/platform/abstractions/envi import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; import { LogService } from "@bitwarden/common/platform/abstractions/log.service"; import { PlatformUtilsService } from "@bitwarden/common/platform/abstractions/platform-utils.service"; -import { StateService } from "@bitwarden/common/platform/abstractions/state.service"; import { ValidationService } from "@bitwarden/common/platform/abstractions/validation.service"; import { PasswordGenerationServiceAbstraction } from "@bitwarden/common/tools/generator/password"; import { SyncService } from "@bitwarden/common/vault/abstractions/sync/sync.service.abstraction"; @@ -53,7 +52,6 @@ export class LoginViaAuthRequestComponent extends BaseLoginWithDeviceComponent { validationService: ValidationService, private modalService: ModalService, syncService: SyncService, - stateService: StateService, loginEmailService: LoginEmailServiceAbstraction, deviceTrustService: DeviceTrustServiceAbstraction, authRequestService: AuthRequestServiceAbstraction, @@ -75,12 +73,11 @@ export class LoginViaAuthRequestComponent extends BaseLoginWithDeviceComponent { platformUtilsService, anonymousHubService, validationService, - stateService, + accountService, loginEmailService, deviceTrustService, authRequestService, loginStrategyService, - accountService, ); super.onSuccessfulLogin = () => { diff --git a/apps/desktop/src/locales/af/messages.json b/apps/desktop/src/locales/af/messages.json index 97067b788a5..1601a2ba8fd 100644 --- a/apps/desktop/src/locales/af/messages.json +++ b/apps/desktop/src/locales/af/messages.json @@ -2132,6 +2132,108 @@ "forwardedEmailDesc": { "message": "Wek ’n e-posalias op met ’n eksterne aanstuurdiens." }, + "forwarderError": { + "message": "$SERVICENAME$ error: $ERRORMESSAGE$", + "description": "Reports an error returned by a forwarding service to the user.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + }, + "errormessage": { + "content": "$2", + "example": "Invalid characters in domain name." + } + } + }, + "forwarderGeneratedBy": { + "message": "Generated by Bitwarden.", + "description": "Displayed with the address on the forwarding service's configuration screen." + }, + "forwarderGeneratedByWithWebsite": { + "message": "Website: $WEBSITE$. Generated by Bitwarden.", + "description": "Displayed with the address on the forwarding service's configuration screen.", + "placeholders": { + "WEBSITE": { + "content": "$1", + "example": "www.example.com" + } + } + }, + "forwaderInvalidToken": { + "message": "Invalid $SERVICENAME$ API token", + "description": "Displayed when the user's API token is empty or rejected by the forwarding service.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwaderInvalidTokenWithMessage": { + "message": "Invalid $SERVICENAME$ API token: $ERRORMESSAGE$", + "description": "Displayed when the user's API token is rejected by the forwarding service with an error message.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + }, + "errormessage": { + "content": "$2", + "example": "Please verify your email address to continue." + } + } + }, + "forwarderNoAccountId": { + "message": "Unable to obtain $SERVICENAME$ masked email account ID.", + "description": "Displayed when the forwarding service fails to return an account ID.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderNoDomain": { + "message": "Invalid $SERVICENAME$ domain.", + "description": "Displayed when the domain is empty or domain authorization failed at the forwarding service.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderNoUrl": { + "message": "Invalid $SERVICENAME$ url.", + "description": "Displayed when the url of the forwarding service wasn't supplied.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderUnknownError": { + "message": "Unknown $SERVICENAME$ error occurred.", + "description": "Displayed when the forwarding service failed due to an unknown error.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderUnknownForwarder": { + "message": "Unknown forwarder: '$SERVICENAME$'.", + "description": "Displayed when the forwarding service is not supported.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "JustTrust.us" + } + } + }, "hostname": { "message": "Gasheernaam", "description": "Part of a URL." @@ -2720,5 +2822,39 @@ }, "errorAssigningTargetFolder": { "message": "Error assigning target folder." + }, + "viewItemsIn": { + "message": "View items in $NAME$", + "description": "Button to view the contents of a folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "backTo": { + "message": "Back to $NAME$", + "description": "Navigate back to a previous folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "back": { + "message": "Back", + "description": "Button text to navigate back" + }, + "removeItem": { + "message": "Remove $NAME$", + "description": "Remove a selected option, such as a folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } } } diff --git a/apps/desktop/src/locales/ar/messages.json b/apps/desktop/src/locales/ar/messages.json index 74c3d63e332..f94b869503f 100644 --- a/apps/desktop/src/locales/ar/messages.json +++ b/apps/desktop/src/locales/ar/messages.json @@ -2132,6 +2132,108 @@ "forwardedEmailDesc": { "message": "إنشاء بريد إلكتروني مستعار مع خدمة إعادة توجيه خارجية." }, + "forwarderError": { + "message": "$SERVICENAME$ error: $ERRORMESSAGE$", + "description": "Reports an error returned by a forwarding service to the user.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + }, + "errormessage": { + "content": "$2", + "example": "Invalid characters in domain name." + } + } + }, + "forwarderGeneratedBy": { + "message": "Generated by Bitwarden.", + "description": "Displayed with the address on the forwarding service's configuration screen." + }, + "forwarderGeneratedByWithWebsite": { + "message": "Website: $WEBSITE$. Generated by Bitwarden.", + "description": "Displayed with the address on the forwarding service's configuration screen.", + "placeholders": { + "WEBSITE": { + "content": "$1", + "example": "www.example.com" + } + } + }, + "forwaderInvalidToken": { + "message": "Invalid $SERVICENAME$ API token", + "description": "Displayed when the user's API token is empty or rejected by the forwarding service.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwaderInvalidTokenWithMessage": { + "message": "Invalid $SERVICENAME$ API token: $ERRORMESSAGE$", + "description": "Displayed when the user's API token is rejected by the forwarding service with an error message.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + }, + "errormessage": { + "content": "$2", + "example": "Please verify your email address to continue." + } + } + }, + "forwarderNoAccountId": { + "message": "Unable to obtain $SERVICENAME$ masked email account ID.", + "description": "Displayed when the forwarding service fails to return an account ID.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderNoDomain": { + "message": "Invalid $SERVICENAME$ domain.", + "description": "Displayed when the domain is empty or domain authorization failed at the forwarding service.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderNoUrl": { + "message": "Invalid $SERVICENAME$ url.", + "description": "Displayed when the url of the forwarding service wasn't supplied.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderUnknownError": { + "message": "Unknown $SERVICENAME$ error occurred.", + "description": "Displayed when the forwarding service failed due to an unknown error.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderUnknownForwarder": { + "message": "Unknown forwarder: '$SERVICENAME$'.", + "description": "Displayed when the forwarding service is not supported.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "JustTrust.us" + } + } + }, "hostname": { "message": "اسم المضيف", "description": "Part of a URL." @@ -2720,5 +2822,39 @@ }, "errorAssigningTargetFolder": { "message": "خطأ في تعيين مجلد الهدف." + }, + "viewItemsIn": { + "message": "View items in $NAME$", + "description": "Button to view the contents of a folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "backTo": { + "message": "Back to $NAME$", + "description": "Navigate back to a previous folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "back": { + "message": "Back", + "description": "Button text to navigate back" + }, + "removeItem": { + "message": "Remove $NAME$", + "description": "Remove a selected option, such as a folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } } } diff --git a/apps/desktop/src/locales/az/messages.json b/apps/desktop/src/locales/az/messages.json index 1ecd18eee75..bfeacdeafd9 100644 --- a/apps/desktop/src/locales/az/messages.json +++ b/apps/desktop/src/locales/az/messages.json @@ -2132,6 +2132,108 @@ "forwardedEmailDesc": { "message": "Xarici yönləndirmə xidməti ilə e-poçt ləqəbi yaradın." }, + "forwarderError": { + "message": "$SERVICENAME$ xətası: $ERRORMESSAGE$", + "description": "Reports an error returned by a forwarding service to the user.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + }, + "errormessage": { + "content": "$2", + "example": "Invalid characters in domain name." + } + } + }, + "forwarderGeneratedBy": { + "message": "Bitwarden tərəfindən yaradılıb.", + "description": "Displayed with the address on the forwarding service's configuration screen." + }, + "forwarderGeneratedByWithWebsite": { + "message": "Veb sayt: $WEBSITE$. Bitwarden tərəfindən yaradılıb.", + "description": "Displayed with the address on the forwarding service's configuration screen.", + "placeholders": { + "WEBSITE": { + "content": "$1", + "example": "www.example.com" + } + } + }, + "forwaderInvalidToken": { + "message": "Yararsız $SERVICENAME$ API jetonu", + "description": "Displayed when the user's API token is empty or rejected by the forwarding service.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwaderInvalidTokenWithMessage": { + "message": "Yararsız $SERVICENAME$ API jetonu: $ERRORMESSAGE$", + "description": "Displayed when the user's API token is rejected by the forwarding service with an error message.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + }, + "errormessage": { + "content": "$2", + "example": "Please verify your email address to continue." + } + } + }, + "forwarderNoAccountId": { + "message": "$SERVICENAME$ maskalı e-poçt hesab kimliyi alına bilmir.", + "description": "Displayed when the forwarding service fails to return an account ID.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderNoDomain": { + "message": "Yararsız $SERVICENAME$ domeni.", + "description": "Displayed when the domain is empty or domain authorization failed at the forwarding service.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderNoUrl": { + "message": "Yararsız $SERVICENAME$ url-si.", + "description": "Displayed when the url of the forwarding service wasn't supplied.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderUnknownError": { + "message": "Bilinməyən $SERVICENAME$ xətası baş verdi.", + "description": "Displayed when the forwarding service failed due to an unknown error.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderUnknownForwarder": { + "message": "Bilinməyən yönləndirici: '$SERVICENAME$'.", + "description": "Displayed when the forwarding service is not supported.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "JustTrust.us" + } + } + }, "hostname": { "message": "Host adı", "description": "Part of a URL." @@ -2720,5 +2822,39 @@ }, "errorAssigningTargetFolder": { "message": "Hədəf qovluğa təyin etmə xətası." + }, + "viewItemsIn": { + "message": "View items in $NAME$", + "description": "Button to view the contents of a folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "backTo": { + "message": "Back to $NAME$", + "description": "Navigate back to a previous folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "back": { + "message": "Back", + "description": "Button text to navigate back" + }, + "removeItem": { + "message": "Remove $NAME$", + "description": "Remove a selected option, such as a folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } } } diff --git a/apps/desktop/src/locales/be/messages.json b/apps/desktop/src/locales/be/messages.json index e0133e5a742..4ece988a001 100644 --- a/apps/desktop/src/locales/be/messages.json +++ b/apps/desktop/src/locales/be/messages.json @@ -2132,6 +2132,108 @@ "forwardedEmailDesc": { "message": "Генерыраваць псеўданім электроннай пошты са знешнім сэрвісам перасылкі." }, + "forwarderError": { + "message": "$SERVICENAME$ error: $ERRORMESSAGE$", + "description": "Reports an error returned by a forwarding service to the user.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + }, + "errormessage": { + "content": "$2", + "example": "Invalid characters in domain name." + } + } + }, + "forwarderGeneratedBy": { + "message": "Generated by Bitwarden.", + "description": "Displayed with the address on the forwarding service's configuration screen." + }, + "forwarderGeneratedByWithWebsite": { + "message": "Website: $WEBSITE$. Generated by Bitwarden.", + "description": "Displayed with the address on the forwarding service's configuration screen.", + "placeholders": { + "WEBSITE": { + "content": "$1", + "example": "www.example.com" + } + } + }, + "forwaderInvalidToken": { + "message": "Invalid $SERVICENAME$ API token", + "description": "Displayed when the user's API token is empty or rejected by the forwarding service.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwaderInvalidTokenWithMessage": { + "message": "Invalid $SERVICENAME$ API token: $ERRORMESSAGE$", + "description": "Displayed when the user's API token is rejected by the forwarding service with an error message.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + }, + "errormessage": { + "content": "$2", + "example": "Please verify your email address to continue." + } + } + }, + "forwarderNoAccountId": { + "message": "Unable to obtain $SERVICENAME$ masked email account ID.", + "description": "Displayed when the forwarding service fails to return an account ID.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderNoDomain": { + "message": "Invalid $SERVICENAME$ domain.", + "description": "Displayed when the domain is empty or domain authorization failed at the forwarding service.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderNoUrl": { + "message": "Invalid $SERVICENAME$ url.", + "description": "Displayed when the url of the forwarding service wasn't supplied.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderUnknownError": { + "message": "Unknown $SERVICENAME$ error occurred.", + "description": "Displayed when the forwarding service failed due to an unknown error.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderUnknownForwarder": { + "message": "Unknown forwarder: '$SERVICENAME$'.", + "description": "Displayed when the forwarding service is not supported.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "JustTrust.us" + } + } + }, "hostname": { "message": "Назва вузла", "description": "Part of a URL." @@ -2720,5 +2822,39 @@ }, "errorAssigningTargetFolder": { "message": "Error assigning target folder." + }, + "viewItemsIn": { + "message": "View items in $NAME$", + "description": "Button to view the contents of a folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "backTo": { + "message": "Back to $NAME$", + "description": "Navigate back to a previous folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "back": { + "message": "Back", + "description": "Button text to navigate back" + }, + "removeItem": { + "message": "Remove $NAME$", + "description": "Remove a selected option, such as a folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } } } diff --git a/apps/desktop/src/locales/bg/messages.json b/apps/desktop/src/locales/bg/messages.json index 0728178b7b8..1c739acde18 100644 --- a/apps/desktop/src/locales/bg/messages.json +++ b/apps/desktop/src/locales/bg/messages.json @@ -2132,6 +2132,108 @@ "forwardedEmailDesc": { "message": "Създайте псевдоним на е-поща с външна услуга за препращане." }, + "forwarderError": { + "message": "Грешка от $SERVICENAME$: $ERRORMESSAGE$", + "description": "Reports an error returned by a forwarding service to the user.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + }, + "errormessage": { + "content": "$2", + "example": "Invalid characters in domain name." + } + } + }, + "forwarderGeneratedBy": { + "message": "Създадено от Битуорден.", + "description": "Displayed with the address on the forwarding service's configuration screen." + }, + "forwarderGeneratedByWithWebsite": { + "message": "Уебсайт: $WEBSITE$. Създадено от Битуорден.", + "description": "Displayed with the address on the forwarding service's configuration screen.", + "placeholders": { + "WEBSITE": { + "content": "$1", + "example": "www.example.com" + } + } + }, + "forwaderInvalidToken": { + "message": "Неправилен идентификатор за ППИ на $SERVICENAME$", + "description": "Displayed when the user's API token is empty or rejected by the forwarding service.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwaderInvalidTokenWithMessage": { + "message": "Неправилен идентификатор за ППИ на $SERVICENAME$: $ERRORMESSAGE$", + "description": "Displayed when the user's API token is rejected by the forwarding service with an error message.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + }, + "errormessage": { + "content": "$2", + "example": "Please verify your email address to continue." + } + } + }, + "forwarderNoAccountId": { + "message": "Не може да бъде получен идентификатор на маскиран чрез е-поща акаунт от $SERVICENAME$.", + "description": "Displayed when the forwarding service fails to return an account ID.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderNoDomain": { + "message": "Неправилен домейн за $SERVICENAME$.", + "description": "Displayed when the domain is empty or domain authorization failed at the forwarding service.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderNoUrl": { + "message": "Неправилен адрес на $SERVICENAME$.", + "description": "Displayed when the url of the forwarding service wasn't supplied.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderUnknownError": { + "message": "Възникна неочаквана грешка свързана с $SERVICENAME$.", + "description": "Displayed when the forwarding service failed due to an unknown error.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderUnknownForwarder": { + "message": "Неизвестна пренасочваща услуга: „$SERVICENAME$“.", + "description": "Displayed when the forwarding service is not supported.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "JustTrust.us" + } + } + }, "hostname": { "message": "Име на сървъра", "description": "Part of a URL." @@ -2720,5 +2822,39 @@ }, "errorAssigningTargetFolder": { "message": "Грешка при задаването на целева папка." + }, + "viewItemsIn": { + "message": "View items in $NAME$", + "description": "Button to view the contents of a folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "backTo": { + "message": "Back to $NAME$", + "description": "Navigate back to a previous folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "back": { + "message": "Back", + "description": "Button text to navigate back" + }, + "removeItem": { + "message": "Remove $NAME$", + "description": "Remove a selected option, such as a folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } } } diff --git a/apps/desktop/src/locales/bn/messages.json b/apps/desktop/src/locales/bn/messages.json index 626734ebffc..30dfd127778 100644 --- a/apps/desktop/src/locales/bn/messages.json +++ b/apps/desktop/src/locales/bn/messages.json @@ -2132,6 +2132,108 @@ "forwardedEmailDesc": { "message": "Generate an email alias with an external forwarding service." }, + "forwarderError": { + "message": "$SERVICENAME$ error: $ERRORMESSAGE$", + "description": "Reports an error returned by a forwarding service to the user.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + }, + "errormessage": { + "content": "$2", + "example": "Invalid characters in domain name." + } + } + }, + "forwarderGeneratedBy": { + "message": "Generated by Bitwarden.", + "description": "Displayed with the address on the forwarding service's configuration screen." + }, + "forwarderGeneratedByWithWebsite": { + "message": "Website: $WEBSITE$. Generated by Bitwarden.", + "description": "Displayed with the address on the forwarding service's configuration screen.", + "placeholders": { + "WEBSITE": { + "content": "$1", + "example": "www.example.com" + } + } + }, + "forwaderInvalidToken": { + "message": "Invalid $SERVICENAME$ API token", + "description": "Displayed when the user's API token is empty or rejected by the forwarding service.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwaderInvalidTokenWithMessage": { + "message": "Invalid $SERVICENAME$ API token: $ERRORMESSAGE$", + "description": "Displayed when the user's API token is rejected by the forwarding service with an error message.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + }, + "errormessage": { + "content": "$2", + "example": "Please verify your email address to continue." + } + } + }, + "forwarderNoAccountId": { + "message": "Unable to obtain $SERVICENAME$ masked email account ID.", + "description": "Displayed when the forwarding service fails to return an account ID.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderNoDomain": { + "message": "Invalid $SERVICENAME$ domain.", + "description": "Displayed when the domain is empty or domain authorization failed at the forwarding service.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderNoUrl": { + "message": "Invalid $SERVICENAME$ url.", + "description": "Displayed when the url of the forwarding service wasn't supplied.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderUnknownError": { + "message": "Unknown $SERVICENAME$ error occurred.", + "description": "Displayed when the forwarding service failed due to an unknown error.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderUnknownForwarder": { + "message": "Unknown forwarder: '$SERVICENAME$'.", + "description": "Displayed when the forwarding service is not supported.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "JustTrust.us" + } + } + }, "hostname": { "message": "Hostname", "description": "Part of a URL." @@ -2720,5 +2822,39 @@ }, "errorAssigningTargetFolder": { "message": "Error assigning target folder." + }, + "viewItemsIn": { + "message": "View items in $NAME$", + "description": "Button to view the contents of a folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "backTo": { + "message": "Back to $NAME$", + "description": "Navigate back to a previous folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "back": { + "message": "Back", + "description": "Button text to navigate back" + }, + "removeItem": { + "message": "Remove $NAME$", + "description": "Remove a selected option, such as a folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } } } diff --git a/apps/desktop/src/locales/bs/messages.json b/apps/desktop/src/locales/bs/messages.json index 9d5685cca90..34fb1f6e8d0 100644 --- a/apps/desktop/src/locales/bs/messages.json +++ b/apps/desktop/src/locales/bs/messages.json @@ -2132,6 +2132,108 @@ "forwardedEmailDesc": { "message": "Generate an email alias with an external forwarding service." }, + "forwarderError": { + "message": "$SERVICENAME$ error: $ERRORMESSAGE$", + "description": "Reports an error returned by a forwarding service to the user.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + }, + "errormessage": { + "content": "$2", + "example": "Invalid characters in domain name." + } + } + }, + "forwarderGeneratedBy": { + "message": "Generated by Bitwarden.", + "description": "Displayed with the address on the forwarding service's configuration screen." + }, + "forwarderGeneratedByWithWebsite": { + "message": "Website: $WEBSITE$. Generated by Bitwarden.", + "description": "Displayed with the address on the forwarding service's configuration screen.", + "placeholders": { + "WEBSITE": { + "content": "$1", + "example": "www.example.com" + } + } + }, + "forwaderInvalidToken": { + "message": "Invalid $SERVICENAME$ API token", + "description": "Displayed when the user's API token is empty or rejected by the forwarding service.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwaderInvalidTokenWithMessage": { + "message": "Invalid $SERVICENAME$ API token: $ERRORMESSAGE$", + "description": "Displayed when the user's API token is rejected by the forwarding service with an error message.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + }, + "errormessage": { + "content": "$2", + "example": "Please verify your email address to continue." + } + } + }, + "forwarderNoAccountId": { + "message": "Unable to obtain $SERVICENAME$ masked email account ID.", + "description": "Displayed when the forwarding service fails to return an account ID.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderNoDomain": { + "message": "Invalid $SERVICENAME$ domain.", + "description": "Displayed when the domain is empty or domain authorization failed at the forwarding service.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderNoUrl": { + "message": "Invalid $SERVICENAME$ url.", + "description": "Displayed when the url of the forwarding service wasn't supplied.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderUnknownError": { + "message": "Unknown $SERVICENAME$ error occurred.", + "description": "Displayed when the forwarding service failed due to an unknown error.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderUnknownForwarder": { + "message": "Unknown forwarder: '$SERVICENAME$'.", + "description": "Displayed when the forwarding service is not supported.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "JustTrust.us" + } + } + }, "hostname": { "message": "Hostname", "description": "Part of a URL." @@ -2720,5 +2822,39 @@ }, "errorAssigningTargetFolder": { "message": "Error assigning target folder." + }, + "viewItemsIn": { + "message": "View items in $NAME$", + "description": "Button to view the contents of a folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "backTo": { + "message": "Back to $NAME$", + "description": "Navigate back to a previous folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "back": { + "message": "Back", + "description": "Button text to navigate back" + }, + "removeItem": { + "message": "Remove $NAME$", + "description": "Remove a selected option, such as a folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } } } diff --git a/apps/desktop/src/locales/ca/messages.json b/apps/desktop/src/locales/ca/messages.json index d7100af7648..68887770391 100644 --- a/apps/desktop/src/locales/ca/messages.json +++ b/apps/desktop/src/locales/ca/messages.json @@ -2132,6 +2132,108 @@ "forwardedEmailDesc": { "message": "Genera un àlies de correu electrònic amb un servei de reenviament extern." }, + "forwarderError": { + "message": "$SERVICENAME$ error: $ERRORMESSAGE$", + "description": "Reports an error returned by a forwarding service to the user.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + }, + "errormessage": { + "content": "$2", + "example": "Invalid characters in domain name." + } + } + }, + "forwarderGeneratedBy": { + "message": "Generated by Bitwarden.", + "description": "Displayed with the address on the forwarding service's configuration screen." + }, + "forwarderGeneratedByWithWebsite": { + "message": "Website: $WEBSITE$. Generated by Bitwarden.", + "description": "Displayed with the address on the forwarding service's configuration screen.", + "placeholders": { + "WEBSITE": { + "content": "$1", + "example": "www.example.com" + } + } + }, + "forwaderInvalidToken": { + "message": "Invalid $SERVICENAME$ API token", + "description": "Displayed when the user's API token is empty or rejected by the forwarding service.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwaderInvalidTokenWithMessage": { + "message": "Invalid $SERVICENAME$ API token: $ERRORMESSAGE$", + "description": "Displayed when the user's API token is rejected by the forwarding service with an error message.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + }, + "errormessage": { + "content": "$2", + "example": "Please verify your email address to continue." + } + } + }, + "forwarderNoAccountId": { + "message": "Unable to obtain $SERVICENAME$ masked email account ID.", + "description": "Displayed when the forwarding service fails to return an account ID.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderNoDomain": { + "message": "Invalid $SERVICENAME$ domain.", + "description": "Displayed when the domain is empty or domain authorization failed at the forwarding service.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderNoUrl": { + "message": "Invalid $SERVICENAME$ url.", + "description": "Displayed when the url of the forwarding service wasn't supplied.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderUnknownError": { + "message": "Unknown $SERVICENAME$ error occurred.", + "description": "Displayed when the forwarding service failed due to an unknown error.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderUnknownForwarder": { + "message": "Unknown forwarder: '$SERVICENAME$'.", + "description": "Displayed when the forwarding service is not supported.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "JustTrust.us" + } + } + }, "hostname": { "message": "Nom de l'amfitrió", "description": "Part of a URL." @@ -2720,5 +2822,39 @@ }, "errorAssigningTargetFolder": { "message": "S'ha produït un error en assignar la carpeta de destinació." + }, + "viewItemsIn": { + "message": "View items in $NAME$", + "description": "Button to view the contents of a folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "backTo": { + "message": "Back to $NAME$", + "description": "Navigate back to a previous folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "back": { + "message": "Back", + "description": "Button text to navigate back" + }, + "removeItem": { + "message": "Remove $NAME$", + "description": "Remove a selected option, such as a folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } } } diff --git a/apps/desktop/src/locales/cs/messages.json b/apps/desktop/src/locales/cs/messages.json index e68fe8fffc4..03f0a1e4b36 100644 --- a/apps/desktop/src/locales/cs/messages.json +++ b/apps/desktop/src/locales/cs/messages.json @@ -2132,6 +2132,108 @@ "forwardedEmailDesc": { "message": "Vygeneruje alias e-mailu pomocí externí přeposílací služby." }, + "forwarderError": { + "message": "Chyba $SERVICENAME$: $ERRORMESSAGE$", + "description": "Reports an error returned by a forwarding service to the user.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + }, + "errormessage": { + "content": "$2", + "example": "Invalid characters in domain name." + } + } + }, + "forwarderGeneratedBy": { + "message": "Vygenerováno Bitwardenem.", + "description": "Displayed with the address on the forwarding service's configuration screen." + }, + "forwarderGeneratedByWithWebsite": { + "message": "Webová stránka: $WEBSITE$. Vygenerováno Bitwardenem.", + "description": "Displayed with the address on the forwarding service's configuration screen.", + "placeholders": { + "WEBSITE": { + "content": "$1", + "example": "www.example.com" + } + } + }, + "forwaderInvalidToken": { + "message": "Neplatný token API $SERVICENAME$", + "description": "Displayed when the user's API token is empty or rejected by the forwarding service.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwaderInvalidTokenWithMessage": { + "message": "Neplatný token API $SERVICENAME$: $ERRORMESSAGE$", + "description": "Displayed when the user's API token is rejected by the forwarding service with an error message.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + }, + "errormessage": { + "content": "$2", + "example": "Please verify your email address to continue." + } + } + }, + "forwarderNoAccountId": { + "message": "Nelze získat maskované ID e-mailového účtu $SERVICENAME$.", + "description": "Displayed when the forwarding service fails to return an account ID.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderNoDomain": { + "message": "Neplatná doména $SERVICENAME$.", + "description": "Displayed when the domain is empty or domain authorization failed at the forwarding service.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderNoUrl": { + "message": "Neplatné URL $SERVICENAME$.", + "description": "Displayed when the url of the forwarding service wasn't supplied.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderUnknownError": { + "message": "Došlo k neznámé chybě $SERVICENAME$.", + "description": "Displayed when the forwarding service failed due to an unknown error.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderUnknownForwarder": { + "message": "Neznámý přeposílatel: $SERVICENAME$.", + "description": "Displayed when the forwarding service is not supported.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "JustTrust.us" + } + } + }, "hostname": { "message": "Název hostitele", "description": "Part of a URL." @@ -2720,5 +2822,39 @@ }, "errorAssigningTargetFolder": { "message": "Chyba při přiřazování cílové složky." + }, + "viewItemsIn": { + "message": "View items in $NAME$", + "description": "Button to view the contents of a folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "backTo": { + "message": "Back to $NAME$", + "description": "Navigate back to a previous folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "back": { + "message": "Back", + "description": "Button text to navigate back" + }, + "removeItem": { + "message": "Remove $NAME$", + "description": "Remove a selected option, such as a folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } } } diff --git a/apps/desktop/src/locales/cy/messages.json b/apps/desktop/src/locales/cy/messages.json index 62f2e608bbf..0124bb3a6f5 100644 --- a/apps/desktop/src/locales/cy/messages.json +++ b/apps/desktop/src/locales/cy/messages.json @@ -2132,6 +2132,108 @@ "forwardedEmailDesc": { "message": "Generate an email alias with an external forwarding service." }, + "forwarderError": { + "message": "$SERVICENAME$ error: $ERRORMESSAGE$", + "description": "Reports an error returned by a forwarding service to the user.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + }, + "errormessage": { + "content": "$2", + "example": "Invalid characters in domain name." + } + } + }, + "forwarderGeneratedBy": { + "message": "Generated by Bitwarden.", + "description": "Displayed with the address on the forwarding service's configuration screen." + }, + "forwarderGeneratedByWithWebsite": { + "message": "Website: $WEBSITE$. Generated by Bitwarden.", + "description": "Displayed with the address on the forwarding service's configuration screen.", + "placeholders": { + "WEBSITE": { + "content": "$1", + "example": "www.example.com" + } + } + }, + "forwaderInvalidToken": { + "message": "Invalid $SERVICENAME$ API token", + "description": "Displayed when the user's API token is empty or rejected by the forwarding service.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwaderInvalidTokenWithMessage": { + "message": "Invalid $SERVICENAME$ API token: $ERRORMESSAGE$", + "description": "Displayed when the user's API token is rejected by the forwarding service with an error message.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + }, + "errormessage": { + "content": "$2", + "example": "Please verify your email address to continue." + } + } + }, + "forwarderNoAccountId": { + "message": "Unable to obtain $SERVICENAME$ masked email account ID.", + "description": "Displayed when the forwarding service fails to return an account ID.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderNoDomain": { + "message": "Invalid $SERVICENAME$ domain.", + "description": "Displayed when the domain is empty or domain authorization failed at the forwarding service.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderNoUrl": { + "message": "Invalid $SERVICENAME$ url.", + "description": "Displayed when the url of the forwarding service wasn't supplied.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderUnknownError": { + "message": "Unknown $SERVICENAME$ error occurred.", + "description": "Displayed when the forwarding service failed due to an unknown error.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderUnknownForwarder": { + "message": "Unknown forwarder: '$SERVICENAME$'.", + "description": "Displayed when the forwarding service is not supported.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "JustTrust.us" + } + } + }, "hostname": { "message": "Hostname", "description": "Part of a URL." @@ -2720,5 +2822,39 @@ }, "errorAssigningTargetFolder": { "message": "Error assigning target folder." + }, + "viewItemsIn": { + "message": "View items in $NAME$", + "description": "Button to view the contents of a folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "backTo": { + "message": "Back to $NAME$", + "description": "Navigate back to a previous folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "back": { + "message": "Back", + "description": "Button text to navigate back" + }, + "removeItem": { + "message": "Remove $NAME$", + "description": "Remove a selected option, such as a folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } } } diff --git a/apps/desktop/src/locales/da/messages.json b/apps/desktop/src/locales/da/messages.json index 0e578a6f66e..b5e65f44197 100644 --- a/apps/desktop/src/locales/da/messages.json +++ b/apps/desktop/src/locales/da/messages.json @@ -2132,6 +2132,108 @@ "forwardedEmailDesc": { "message": "Generér et e-mail alias med en ekstern viderestillingstjeneste." }, + "forwarderError": { + "message": "$SERVICENAME$-fejl: $ERRORMESSAGE$", + "description": "Reports an error returned by a forwarding service to the user.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + }, + "errormessage": { + "content": "$2", + "example": "Invalid characters in domain name." + } + } + }, + "forwarderGeneratedBy": { + "message": "Genereret af Bitwarden.", + "description": "Displayed with the address on the forwarding service's configuration screen." + }, + "forwarderGeneratedByWithWebsite": { + "message": "Websted: $WEBSITE$. Genereret af Bitwarden.", + "description": "Displayed with the address on the forwarding service's configuration screen.", + "placeholders": { + "WEBSITE": { + "content": "$1", + "example": "www.example.com" + } + } + }, + "forwaderInvalidToken": { + "message": "Ugyldigt $SERVICENAME$ API-token", + "description": "Displayed when the user's API token is empty or rejected by the forwarding service.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwaderInvalidTokenWithMessage": { + "message": "Ugyldigt $SERVICENAME$ API-token: $ERRORMESSAGE$", + "description": "Displayed when the user's API token is rejected by the forwarding service with an error message.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + }, + "errormessage": { + "content": "$2", + "example": "Please verify your email address to continue." + } + } + }, + "forwarderNoAccountId": { + "message": "Kan ikke få $SERVICENAME$ maskeret e-mailkonto-ID.", + "description": "Displayed when the forwarding service fails to return an account ID.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderNoDomain": { + "message": "Ugyldigt $SERVICENAME$-domæne.", + "description": "Displayed when the domain is empty or domain authorization failed at the forwarding service.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderNoUrl": { + "message": "Ugyldig $SERVICENAME$-URL.", + "description": "Displayed when the url of the forwarding service wasn't supplied.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderUnknownError": { + "message": "Ukendt $SERVICENAME$-fejl opstod.", + "description": "Displayed when the forwarding service failed due to an unknown error.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderUnknownForwarder": { + "message": "Ukendt videresender: '$SERVICENAME$'.", + "description": "Displayed when the forwarding service is not supported.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "JustTrust.us" + } + } + }, "hostname": { "message": "Værtsnavn", "description": "Part of a URL." @@ -2720,5 +2822,39 @@ }, "errorAssigningTargetFolder": { "message": "Fejl ved tildeling af målmappe." + }, + "viewItemsIn": { + "message": "Vis emner i $NAME$", + "description": "Button to view the contents of a folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "backTo": { + "message": "Retur til $NAME$", + "description": "Navigate back to a previous folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "back": { + "message": "Retur", + "description": "Button text to navigate back" + }, + "removeItem": { + "message": "Fjern $NAME$", + "description": "Remove a selected option, such as a folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } } } diff --git a/apps/desktop/src/locales/de/messages.json b/apps/desktop/src/locales/de/messages.json index d04c2795f33..fdc604986f3 100644 --- a/apps/desktop/src/locales/de/messages.json +++ b/apps/desktop/src/locales/de/messages.json @@ -2132,6 +2132,108 @@ "forwardedEmailDesc": { "message": "Erzeuge ein E-Mail-Alias mit einem externen Weiterleitungsdienst." }, + "forwarderError": { + "message": "$SERVICENAME$ error: $ERRORMESSAGE$", + "description": "Reports an error returned by a forwarding service to the user.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + }, + "errormessage": { + "content": "$2", + "example": "Invalid characters in domain name." + } + } + }, + "forwarderGeneratedBy": { + "message": "Von Bitwarden generiert.", + "description": "Displayed with the address on the forwarding service's configuration screen." + }, + "forwarderGeneratedByWithWebsite": { + "message": "Website: $WEBSITE$. Generated by Bitwarden.", + "description": "Displayed with the address on the forwarding service's configuration screen.", + "placeholders": { + "WEBSITE": { + "content": "$1", + "example": "www.example.com" + } + } + }, + "forwaderInvalidToken": { + "message": "Invalid $SERVICENAME$ API token", + "description": "Displayed when the user's API token is empty or rejected by the forwarding service.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwaderInvalidTokenWithMessage": { + "message": "Invalid $SERVICENAME$ API token: $ERRORMESSAGE$", + "description": "Displayed when the user's API token is rejected by the forwarding service with an error message.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + }, + "errormessage": { + "content": "$2", + "example": "Please verify your email address to continue." + } + } + }, + "forwarderNoAccountId": { + "message": "Unable to obtain $SERVICENAME$ masked email account ID.", + "description": "Displayed when the forwarding service fails to return an account ID.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderNoDomain": { + "message": "Invalid $SERVICENAME$ domain.", + "description": "Displayed when the domain is empty or domain authorization failed at the forwarding service.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderNoUrl": { + "message": "Invalid $SERVICENAME$ url.", + "description": "Displayed when the url of the forwarding service wasn't supplied.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderUnknownError": { + "message": "Unknown $SERVICENAME$ error occurred.", + "description": "Displayed when the forwarding service failed due to an unknown error.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderUnknownForwarder": { + "message": "Unknown forwarder: '$SERVICENAME$'.", + "description": "Displayed when the forwarding service is not supported.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "JustTrust.us" + } + } + }, "hostname": { "message": "Hostname", "description": "Part of a URL." @@ -2720,5 +2822,39 @@ }, "errorAssigningTargetFolder": { "message": "Fehler beim Zuweisen des Ziel-Ordners." + }, + "viewItemsIn": { + "message": "View items in $NAME$", + "description": "Button to view the contents of a folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "backTo": { + "message": "Back to $NAME$", + "description": "Navigate back to a previous folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "back": { + "message": "Back", + "description": "Button text to navigate back" + }, + "removeItem": { + "message": "Remove $NAME$", + "description": "Remove a selected option, such as a folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } } } diff --git a/apps/desktop/src/locales/el/messages.json b/apps/desktop/src/locales/el/messages.json index 87360c33ce0..0f67e125902 100644 --- a/apps/desktop/src/locales/el/messages.json +++ b/apps/desktop/src/locales/el/messages.json @@ -2132,6 +2132,108 @@ "forwardedEmailDesc": { "message": "Δημιουργήστε ένα alias email με μια εξωτερική υπηρεσία προώθησης." }, + "forwarderError": { + "message": "$SERVICENAME$ error: $ERRORMESSAGE$", + "description": "Reports an error returned by a forwarding service to the user.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + }, + "errormessage": { + "content": "$2", + "example": "Invalid characters in domain name." + } + } + }, + "forwarderGeneratedBy": { + "message": "Generated by Bitwarden.", + "description": "Displayed with the address on the forwarding service's configuration screen." + }, + "forwarderGeneratedByWithWebsite": { + "message": "Website: $WEBSITE$. Generated by Bitwarden.", + "description": "Displayed with the address on the forwarding service's configuration screen.", + "placeholders": { + "WEBSITE": { + "content": "$1", + "example": "www.example.com" + } + } + }, + "forwaderInvalidToken": { + "message": "Invalid $SERVICENAME$ API token", + "description": "Displayed when the user's API token is empty or rejected by the forwarding service.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwaderInvalidTokenWithMessage": { + "message": "Invalid $SERVICENAME$ API token: $ERRORMESSAGE$", + "description": "Displayed when the user's API token is rejected by the forwarding service with an error message.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + }, + "errormessage": { + "content": "$2", + "example": "Please verify your email address to continue." + } + } + }, + "forwarderNoAccountId": { + "message": "Unable to obtain $SERVICENAME$ masked email account ID.", + "description": "Displayed when the forwarding service fails to return an account ID.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderNoDomain": { + "message": "Invalid $SERVICENAME$ domain.", + "description": "Displayed when the domain is empty or domain authorization failed at the forwarding service.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderNoUrl": { + "message": "Invalid $SERVICENAME$ url.", + "description": "Displayed when the url of the forwarding service wasn't supplied.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderUnknownError": { + "message": "Unknown $SERVICENAME$ error occurred.", + "description": "Displayed when the forwarding service failed due to an unknown error.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderUnknownForwarder": { + "message": "Unknown forwarder: '$SERVICENAME$'.", + "description": "Displayed when the forwarding service is not supported.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "JustTrust.us" + } + } + }, "hostname": { "message": "Hostname", "description": "Part of a URL." @@ -2720,5 +2822,39 @@ }, "errorAssigningTargetFolder": { "message": "Error assigning target folder." + }, + "viewItemsIn": { + "message": "View items in $NAME$", + "description": "Button to view the contents of a folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "backTo": { + "message": "Back to $NAME$", + "description": "Navigate back to a previous folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "back": { + "message": "Back", + "description": "Button text to navigate back" + }, + "removeItem": { + "message": "Remove $NAME$", + "description": "Remove a selected option, such as a folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } } } diff --git a/apps/desktop/src/locales/en/messages.json b/apps/desktop/src/locales/en/messages.json index 9348b8dc0fa..dde17633788 100644 --- a/apps/desktop/src/locales/en/messages.json +++ b/apps/desktop/src/locales/en/messages.json @@ -2050,6 +2050,9 @@ "switchAccount": { "message": "Switch account" }, + "alreadyHaveAccount": { + "message": "Already have an account?" + }, "options": { "message": "Options" }, @@ -2390,6 +2393,27 @@ "logInRequested": { "message": "Log in requested" }, + "creatingAccountOn": { + "message": "Creating account on" + }, + "checkYourEmail": { + "message": "Check your email" + }, + "followTheLinkInTheEmailSentTo": { + "message": "Follow the link in the email sent to" + }, + "andContinueCreatingYourAccount": { + "message": "and continue creating your account." + }, + "noEmail": { + "message": "No email?" + }, + "goBack": { + "message": "Go back" + }, + "toEditYourEmailAddress": { + "message": "to edit your email address." + }, "exposedMasterPassword": { "message": "Exposed Master Password" }, @@ -2822,5 +2846,39 @@ }, "errorAssigningTargetFolder": { "message": "Error assigning target folder." + }, + "viewItemsIn": { + "message": "View items in $NAME$", + "description": "Button to view the contents of a folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "backTo": { + "message": "Back to $NAME$", + "description": "Navigate back to a previous folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "back": { + "message": "Back", + "description": "Button text to navigate back" + }, + "removeItem": { + "message": "Remove $NAME$", + "description": "Remove a selected option, such as a folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } } } diff --git a/apps/desktop/src/locales/en_GB/messages.json b/apps/desktop/src/locales/en_GB/messages.json index 5572d2fd352..ec4ea5090b0 100644 --- a/apps/desktop/src/locales/en_GB/messages.json +++ b/apps/desktop/src/locales/en_GB/messages.json @@ -2132,6 +2132,108 @@ "forwardedEmailDesc": { "message": "Generate an email alias with an external forwarding service." }, + "forwarderError": { + "message": "$SERVICENAME$ error: $ERRORMESSAGE$", + "description": "Reports an error returned by a forwarding service to the user.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + }, + "errormessage": { + "content": "$2", + "example": "Invalid characters in domain name." + } + } + }, + "forwarderGeneratedBy": { + "message": "Generated by Bitwarden.", + "description": "Displayed with the address on the forwarding service's configuration screen." + }, + "forwarderGeneratedByWithWebsite": { + "message": "Website: $WEBSITE$. Generated by Bitwarden.", + "description": "Displayed with the address on the forwarding service's configuration screen.", + "placeholders": { + "WEBSITE": { + "content": "$1", + "example": "www.example.com" + } + } + }, + "forwaderInvalidToken": { + "message": "Invalid $SERVICENAME$ API token", + "description": "Displayed when the user's API token is empty or rejected by the forwarding service.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwaderInvalidTokenWithMessage": { + "message": "Invalid $SERVICENAME$ API token: $ERRORMESSAGE$", + "description": "Displayed when the user's API token is rejected by the forwarding service with an error message.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + }, + "errormessage": { + "content": "$2", + "example": "Please verify your email address to continue." + } + } + }, + "forwarderNoAccountId": { + "message": "Unable to obtain $SERVICENAME$ masked email account ID.", + "description": "Displayed when the forwarding service fails to return an account ID.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderNoDomain": { + "message": "Invalid $SERVICENAME$ domain.", + "description": "Displayed when the domain is empty or domain authorization failed at the forwarding service.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderNoUrl": { + "message": "Invalid $SERVICENAME$ url.", + "description": "Displayed when the url of the forwarding service wasn't supplied.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderUnknownError": { + "message": "Unknown $SERVICENAME$ error occurred.", + "description": "Displayed when the forwarding service failed due to an unknown error.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderUnknownForwarder": { + "message": "Unknown forwarder: '$SERVICENAME$'.", + "description": "Displayed when the forwarding service is not supported.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "JustTrust.us" + } + } + }, "hostname": { "message": "Hostname", "description": "Part of a URL." @@ -2720,5 +2822,39 @@ }, "errorAssigningTargetFolder": { "message": "Error assigning target folder." + }, + "viewItemsIn": { + "message": "View items in $NAME$", + "description": "Button to view the contents of a folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "backTo": { + "message": "Back to $NAME$", + "description": "Navigate back to a previous folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "back": { + "message": "Back", + "description": "Button text to navigate back" + }, + "removeItem": { + "message": "Remove $NAME$", + "description": "Remove a selected option, such as a folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } } } diff --git a/apps/desktop/src/locales/en_IN/messages.json b/apps/desktop/src/locales/en_IN/messages.json index 79f2de8f63c..6b96c526ee0 100644 --- a/apps/desktop/src/locales/en_IN/messages.json +++ b/apps/desktop/src/locales/en_IN/messages.json @@ -2132,6 +2132,108 @@ "forwardedEmailDesc": { "message": "Generate an email alias with an external forwarding service." }, + "forwarderError": { + "message": "$SERVICENAME$ error: $ERRORMESSAGE$", + "description": "Reports an error returned by a forwarding service to the user.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + }, + "errormessage": { + "content": "$2", + "example": "Invalid characters in domain name." + } + } + }, + "forwarderGeneratedBy": { + "message": "Generated by Bitwarden.", + "description": "Displayed with the address on the forwarding service's configuration screen." + }, + "forwarderGeneratedByWithWebsite": { + "message": "Website: $WEBSITE$. Generated by Bitwarden.", + "description": "Displayed with the address on the forwarding service's configuration screen.", + "placeholders": { + "WEBSITE": { + "content": "$1", + "example": "www.example.com" + } + } + }, + "forwaderInvalidToken": { + "message": "Invalid $SERVICENAME$ API token", + "description": "Displayed when the user's API token is empty or rejected by the forwarding service.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwaderInvalidTokenWithMessage": { + "message": "Invalid $SERVICENAME$ API token: $ERRORMESSAGE$", + "description": "Displayed when the user's API token is rejected by the forwarding service with an error message.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + }, + "errormessage": { + "content": "$2", + "example": "Please verify your email address to continue." + } + } + }, + "forwarderNoAccountId": { + "message": "Unable to obtain $SERVICENAME$ masked email account ID.", + "description": "Displayed when the forwarding service fails to return an account ID.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderNoDomain": { + "message": "Invalid $SERVICENAME$ domain.", + "description": "Displayed when the domain is empty or domain authorization failed at the forwarding service.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderNoUrl": { + "message": "Invalid $SERVICENAME$ url.", + "description": "Displayed when the url of the forwarding service wasn't supplied.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderUnknownError": { + "message": "Unknown $SERVICENAME$ error occurred.", + "description": "Displayed when the forwarding service failed due to an unknown error.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderUnknownForwarder": { + "message": "Unknown forwarder: '$SERVICENAME$'.", + "description": "Displayed when the forwarding service is not supported.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "JustTrust.us" + } + } + }, "hostname": { "message": "Hostname", "description": "Part of a URL." @@ -2720,5 +2822,39 @@ }, "errorAssigningTargetFolder": { "message": "Error assigning target folder." + }, + "viewItemsIn": { + "message": "View items in $NAME$", + "description": "Button to view the contents of a folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "backTo": { + "message": "Back to $NAME$", + "description": "Navigate back to a previous folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "back": { + "message": "Back", + "description": "Button text to navigate back" + }, + "removeItem": { + "message": "Remove $NAME$", + "description": "Remove a selected option, such as a folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } } } diff --git a/apps/desktop/src/locales/eo/messages.json b/apps/desktop/src/locales/eo/messages.json index 427f08f8052..223f5aa290c 100644 --- a/apps/desktop/src/locales/eo/messages.json +++ b/apps/desktop/src/locales/eo/messages.json @@ -2132,6 +2132,108 @@ "forwardedEmailDesc": { "message": "Generate an email alias with an external forwarding service." }, + "forwarderError": { + "message": "$SERVICENAME$ error: $ERRORMESSAGE$", + "description": "Reports an error returned by a forwarding service to the user.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + }, + "errormessage": { + "content": "$2", + "example": "Invalid characters in domain name." + } + } + }, + "forwarderGeneratedBy": { + "message": "Generated by Bitwarden.", + "description": "Displayed with the address on the forwarding service's configuration screen." + }, + "forwarderGeneratedByWithWebsite": { + "message": "Website: $WEBSITE$. Generated by Bitwarden.", + "description": "Displayed with the address on the forwarding service's configuration screen.", + "placeholders": { + "WEBSITE": { + "content": "$1", + "example": "www.example.com" + } + } + }, + "forwaderInvalidToken": { + "message": "Invalid $SERVICENAME$ API token", + "description": "Displayed when the user's API token is empty or rejected by the forwarding service.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwaderInvalidTokenWithMessage": { + "message": "Invalid $SERVICENAME$ API token: $ERRORMESSAGE$", + "description": "Displayed when the user's API token is rejected by the forwarding service with an error message.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + }, + "errormessage": { + "content": "$2", + "example": "Please verify your email address to continue." + } + } + }, + "forwarderNoAccountId": { + "message": "Unable to obtain $SERVICENAME$ masked email account ID.", + "description": "Displayed when the forwarding service fails to return an account ID.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderNoDomain": { + "message": "Invalid $SERVICENAME$ domain.", + "description": "Displayed when the domain is empty or domain authorization failed at the forwarding service.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderNoUrl": { + "message": "Invalid $SERVICENAME$ url.", + "description": "Displayed when the url of the forwarding service wasn't supplied.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderUnknownError": { + "message": "Unknown $SERVICENAME$ error occurred.", + "description": "Displayed when the forwarding service failed due to an unknown error.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderUnknownForwarder": { + "message": "Unknown forwarder: '$SERVICENAME$'.", + "description": "Displayed when the forwarding service is not supported.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "JustTrust.us" + } + } + }, "hostname": { "message": "Hostname", "description": "Part of a URL." @@ -2720,5 +2822,39 @@ }, "errorAssigningTargetFolder": { "message": "Error assigning target folder." + }, + "viewItemsIn": { + "message": "View items in $NAME$", + "description": "Button to view the contents of a folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "backTo": { + "message": "Back to $NAME$", + "description": "Navigate back to a previous folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "back": { + "message": "Back", + "description": "Button text to navigate back" + }, + "removeItem": { + "message": "Remove $NAME$", + "description": "Remove a selected option, such as a folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } } } diff --git a/apps/desktop/src/locales/es/messages.json b/apps/desktop/src/locales/es/messages.json index d509a91d957..43600c4ff85 100644 --- a/apps/desktop/src/locales/es/messages.json +++ b/apps/desktop/src/locales/es/messages.json @@ -1508,7 +1508,7 @@ "message": "Cerrar sesión en la caja fuerte requiere que vuelvas a autenticarte para acceder nuevamente a ella." }, "unlockMethodNeededToChangeTimeoutActionDesc": { - "message": "Set up an unlock method to change your vault timeout action." + "message": "Configura un método de desbloqueo para cambiar el tiempo de espera de tu caja fuerte." }, "lock": { "message": "Bloquear", @@ -1549,7 +1549,7 @@ "message": "Establecer contraseña maestra" }, "orgPermissionsUpdatedMustSetPassword": { - "message": "Your organization permissions were updated, requiring you to set a master password.", + "message": "Los permisos de tu organización han sido actualizados, requiriendo que establezcas una contraseña maestra.", "description": "Used as a card title description on the set password page to explain why the user is there" }, "orgRequiresYouToSetPassword": { @@ -1657,7 +1657,7 @@ "message": "Utilizar aceleración de hardware" }, "enableHardwareAccelerationDesc": { - "message": "By default this setting is ON. Turn OFF only if you experience graphical issues. Restart is required." + "message": "Por defecto esta opción está activada. Desactívala solo si experimentas problemas gráficos. Es necesario reiniciar." }, "approve": { "message": "Aprobar" @@ -1699,7 +1699,7 @@ "message": "Una política de organización está afectando a sus opciones de propiedad." }, "personalOwnershipPolicyInEffectImports": { - "message": "An organization policy has blocked importing items into your individual vault." + "message": "Una política organizacional ha bloqueado la importación de elementos a su caja fuerte personal." }, "allSends": { "message": "Todos los Send", @@ -1901,7 +1901,7 @@ "message": "Intentar de nuevo" }, "verificationRequiredForActionSetPinToContinue": { - "message": "Verification required for this action. Set a PIN to continue." + "message": "Se requiere verificación para esta acción. Establece un PIN para continuar." }, "setPin": { "message": "Establecer PIN" @@ -1910,28 +1910,28 @@ "message": "Verificar biométricamente" }, "awaitingConfirmation": { - "message": "Awaiting confirmation" + "message": "Esperando confirmación" }, "couldNotCompleteBiometrics": { - "message": "Could not complete biometrics." + "message": "No se pudieron completar los datos biométricos." }, "needADifferentMethod": { - "message": "Need a different method?" + "message": "¿Necesitas un método diferente?" }, "useMasterPassword": { - "message": "Use master password" + "message": "Utilizar la contraseña maestra" }, "usePin": { - "message": "Use PIN" + "message": "Usar PIN" }, "useBiometrics": { - "message": "Use biometrics" + "message": "Usar datos biométricos" }, "enterVerificationCodeSentToEmail": { - "message": "Enter the verification code that was sent to your email." + "message": "Introduce el código de verificación que ha sido enviado a tu correo electrónico." }, "resendCode": { - "message": "Resend code" + "message": "Reenviar código" }, "hours": { "message": "Horas" @@ -2060,7 +2060,7 @@ "message": "Exportando caja fuerte personal" }, "exportingIndividualVaultDescription": { - "message": "Only the individual vault items associated with $EMAIL$ will be exported. Organization vault items will not be included. Only vault item information will be exported and will not include associated attachments.", + "message": "Solo los elementos individuales de la caja fuerte asociados con $EMAIL$ serán exportados. No se incluirán los elementos de la caja fuerte de la organización. Solo la información de los elementos de la caja fuerte será exportada y no se incluirán los archivos adjuntos asociados.", "placeholders": { "email": { "content": "$1", @@ -2132,6 +2132,108 @@ "forwardedEmailDesc": { "message": "Generar un alias de correo electrónico con un servicio de reenvío externo." }, + "forwarderError": { + "message": "$SERVICENAME$ error: $ERRORMESSAGE$", + "description": "Reports an error returned by a forwarding service to the user.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + }, + "errormessage": { + "content": "$2", + "example": "Invalid characters in domain name." + } + } + }, + "forwarderGeneratedBy": { + "message": "Generado por Bitwarden.", + "description": "Displayed with the address on the forwarding service's configuration screen." + }, + "forwarderGeneratedByWithWebsite": { + "message": "Sitio web: $WEBSITE$. Generado por Bitwarden.", + "description": "Displayed with the address on the forwarding service's configuration screen.", + "placeholders": { + "WEBSITE": { + "content": "$1", + "example": "www.example.com" + } + } + }, + "forwaderInvalidToken": { + "message": "Token de API $SERVICENAME$ no válido", + "description": "Displayed when the user's API token is empty or rejected by the forwarding service.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwaderInvalidTokenWithMessage": { + "message": "Token de API $SERVICENAME$ no válido: $ERRORMESSAGE$", + "description": "Displayed when the user's API token is rejected by the forwarding service with an error message.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + }, + "errormessage": { + "content": "$2", + "example": "Please verify your email address to continue." + } + } + }, + "forwarderNoAccountId": { + "message": "No se puede obtener el ID de la cuenta de correo electrónico enmascarado de $SERVICENAME$.", + "description": "Displayed when the forwarding service fails to return an account ID.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderNoDomain": { + "message": "Dominio $SERVICENAME$ no válido.", + "description": "Displayed when the domain is empty or domain authorization failed at the forwarding service.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderNoUrl": { + "message": "URL $SERVICENAME$ no válida.", + "description": "Displayed when the url of the forwarding service wasn't supplied.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderUnknownError": { + "message": "Se ha producido un error desconocido de $SERVICENAME$.", + "description": "Displayed when the forwarding service failed due to an unknown error.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderUnknownForwarder": { + "message": "Redirigidor desconocido: '$SERVICENAME$'.", + "description": "Displayed when the forwarding service is not supported.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "JustTrust.us" + } + } + }, "hostname": { "message": "Nombre del host", "description": "Part of a URL." @@ -2185,7 +2287,7 @@ "message": "Iniciar sesión con otro dispositivo" }, "loginInitiated": { - "message": "Login initiated" + "message": "Inicio de sesión iniciado" }, "notificationSentDevice": { "message": "Se ha enviado una notificación a tu dispositivo." @@ -2325,77 +2427,77 @@ "message": "Actualización de ajustes recomendados" }, "deviceApprovalRequired": { - "message": "Device approval required. Select an approval option below:" + "message": "Se requiere aprobación del dispositivo. Selecciona una opción de aprobación a continuación:" }, "rememberThisDevice": { "message": "Recordar este dispositivo" }, "uncheckIfPublicDevice": { - "message": "Uncheck if using a public device" + "message": "Desmarca si estás usando un dispositivo público" }, "approveFromYourOtherDevice": { - "message": "Approve from your other device" + "message": "Aprobar desde tu otro dispositivo" }, "requestAdminApproval": { - "message": "Request admin approval" + "message": "Solicitar aprobación del administrador" }, "approveWithMasterPassword": { - "message": "Approve with master password" + "message": "Aprobar con contraseña maestra" }, "region": { - "message": "Region" + "message": "Región" }, "ssoIdentifierRequired": { - "message": "Organization SSO identifier is required." + "message": "Se requiere un identificador único de inicio de sesión de la organización." }, "eu": { - "message": "EU", + "message": "Unión Europea", "description": "European Union" }, "loggingInOn": { - "message": "Logging in on" + "message": "Iniciando sesión en" }, "selfHostedServer": { - "message": "self-hosted" + "message": "autoalojado" }, "accessDenied": { "message": "Acceso denegado. No tiene permiso para ver esta página." }, "accountSuccessfullyCreated": { - "message": "Account successfully created!" + "message": "¡Cuenta creada con éxito!" }, "adminApprovalRequested": { - "message": "Admin approval requested" + "message": "Aprobación del administrador solicitada" }, "adminApprovalRequestSentToAdmins": { - "message": "Your request has been sent to your admin." + "message": "Tu solicitud ha sido enviada a tu administrador." }, "youWillBeNotifiedOnceApproved": { - "message": "You will be notified once approved." + "message": "Se te notificará una vez aprobado." }, "troubleLoggingIn": { - "message": "Trouble logging in?" + "message": "¿Tienes problemas para iniciar sesión?" }, "loginApproved": { - "message": "Login approved" + "message": "Inicio de sesión aprobado" }, "userEmailMissing": { - "message": "User email missing" + "message": "Falta el correo electrónico del usuario" }, "deviceTrusted": { - "message": "Device trusted" + "message": "Dispositivo de confianza" }, "inputRequired": { - "message": "Input is required." + "message": "La entrada requerida." }, "required": { - "message": "required" + "message": "requerido" }, "search": { "message": "Buscar" }, "inputMinLength": { - "message": "Input must be at least $COUNT$ characters long.", + "message": "La entrada debe tener al menos $COUNT$ caracteres.", "placeholders": { "count": { "content": "$1", @@ -2404,7 +2506,7 @@ } }, "inputMaxLength": { - "message": "Input must not exceed $COUNT$ characters in length.", + "message": "La entrada no debe exceder los $COUNT$ caracteres de longitud.", "placeholders": { "count": { "content": "$1", @@ -2413,7 +2515,7 @@ } }, "inputForbiddenCharacters": { - "message": "The following characters are not allowed: $CHARACTERS$", + "message": "Los siguientes caracteres no están permitidos: $CHARACTERS$", "placeholders": { "characters": { "content": "$1", @@ -2422,7 +2524,7 @@ } }, "inputMinValue": { - "message": "Input value must be at least $MIN$.", + "message": "El valor de entrada debe ser de al lo menos $MIN$.", "placeholders": { "min": { "content": "$1", @@ -2431,7 +2533,7 @@ } }, "inputMaxValue": { - "message": "Input value must not exceed $MAX$.", + "message": "El valor de entrada no debe exceder $MAX$.", "placeholders": { "max": { "content": "$1", @@ -2440,17 +2542,17 @@ } }, "multipleInputEmails": { - "message": "1 or more emails are invalid" + "message": "Una o más direcciones de correo electrónico no son válidas" }, "inputTrimValidator": { - "message": "Input must not contain only whitespace.", + "message": "La entrada no debe contener únicamente espacios en blanco.", "description": "Notification to inform the user that a form's input can't contain only whitespace." }, "inputEmail": { - "message": "Input is not an email address." + "message": "La entrada no es una dirección de correo electrónico." }, "fieldsNeedAttention": { - "message": "$COUNT$ field(s) above need your attention.", + "message": "$COUNT$ campo(s) anterior(es) necesitan su atención.", "placeholders": { "count": { "content": "$1", @@ -2459,22 +2561,22 @@ } }, "selectPlaceholder": { - "message": "-- Select --" + "message": "-- Selecciona --" }, "multiSelectPlaceholder": { - "message": "-- Type to filter --" + "message": "-- Escribe para filtrar --" }, "multiSelectLoading": { - "message": "Retrieving options..." + "message": "Recuperando opciones..." }, "multiSelectNotFound": { - "message": "No items found" + "message": "No se encontraron elementos" }, "multiSelectClearAll": { - "message": "Clear all" + "message": "Limpiar todo" }, "plusNMore": { - "message": "+ $QUANTITY$ more", + "message": "+ $QUANTITY$ más", "placeholders": { "quantity": { "content": "$1", @@ -2483,44 +2585,44 @@ } }, "submenu": { - "message": "Submenu" + "message": "Submenú" }, "skipToContent": { - "message": "Skip to content" + "message": "Saltar al contenido" }, "typePasskey": { - "message": "Passkey" + "message": "Clave de acceso" }, "passkeyNotCopied": { - "message": "Passkey will not be copied" + "message": "La clave de acceso no se copiará" }, "passkeyNotCopiedAlert": { - "message": "The passkey will not be copied to the cloned item. Do you want to continue cloning this item?" + "message": "La clave de acceso no se copiará al elemento clonado. ¿Quieres continuar clonando este elemento?" }, "aliasDomain": { - "message": "Alias domain" + "message": "Alias de dominio" }, "importData": { - "message": "Import data", + "message": "Importar datos", "description": "Used for the desktop menu item and the header of the import dialog" }, "importError": { - "message": "Import error" + "message": "Error de importación" }, "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": "Hubo un problema con los datos que intentaste importar. Por favor, resuelve los errores listados a continuación en tu archivo de origen e inténtalo de nuevo." }, "resolveTheErrorsBelowAndTryAgain": { - "message": "Resolve the errors below and try again." + "message": "Resuelve los errores que aparecen a continuación e inténtalo de nuevo." }, "description": { - "message": "Description" + "message": "Descripción" }, "importSuccess": { - "message": "Data successfully imported" + "message": "Datos importados correctamente" }, "importSuccessNumberOfItems": { - "message": "A total of $AMOUNT$ items were imported.", + "message": "Se importaron un total de $AMOUNT$ elementos.", "placeholders": { "amount": { "content": "$1", @@ -2532,7 +2634,7 @@ "message": "Total" }, "importWarning": { - "message": "You are importing data to $ORGANIZATION$. Your data may be shared with members of this organization. Do you want to proceed?", + "message": "Estás importando datos a $ORGANIZATION$. Tus datos pueden ser compartidos con miembros de esta organización. ¿Quieres continuar?", "placeholders": { "organization": { "content": "$1", @@ -2541,40 +2643,40 @@ } }, "launchDuoAndFollowStepsToFinishLoggingIn": { - "message": "Launch Duo and follow the steps to finish logging in." + "message": "Inicia Duo y sigue los pasos para terminar de iniciar sesión." }, "duoRequiredByOrgForAccount": { - "message": "Duo two-step login is required for your account." + "message": "Se requiere el inicio de sesión en dos pasos de Duo para tu cuenta." }, "launchDuo": { - "message": "Launch Duo in Browser" + "message": "Inicia Duo en el navegador" }, "importFormatError": { - "message": "Data is not formatted correctly. Please check your import file and try again." + "message": "Los datos no están formateados correctamente. Por favor, comprueba tu archivo de importación e inténtalo de nuevo." }, "importNothingError": { - "message": "Nothing was imported." + "message": "No se ha importado nada." }, "importEncKeyError": { - "message": "Error decrypting the exported file. Your encryption key does not match the encryption key used export the data." + "message": "Error al descifrar el archivo exportado. Tu clave de cifrado no coincide con la clave de cifrado utilizada para exportar los datos." }, "invalidFilePassword": { - "message": "Invalid file password, please use the password you entered when you created the export file." + "message": "Contraseña de archivo no válida, por favor utiliza la contraseña que introdujiste cuando creaste el archivo de exportación." }, "importDestination": { - "message": "Import destination" + "message": "Destino de importación" }, "learnAboutImportOptions": { - "message": "Learn about your import options" + "message": "Aprende acerca de tus opciones de importación" }, "selectImportFolder": { - "message": "Select a folder" + "message": "Escoge una carpeta" }, "selectImportCollection": { - "message": "Select a collection" + "message": "Escoge una colección" }, "importTargetHint": { - "message": "Select this option if you want the imported file contents moved to a $DESTINATION$", + "message": "Selecciona esta opción si quieres que el contenido del archivo importado se mueva a un $DESTINATION$", "description": "Located as a hint under the import target. Will be appended by either folder or collection, depending if the user is importing into an individual or an organizational vault.", "placeholders": { "destination": { @@ -2584,25 +2686,25 @@ } }, "importUnassignedItemsError": { - "message": "File contains unassigned items." + "message": "El archivo contiene elementos no asignados." }, "selectFormat": { - "message": "Select the format of the import file" + "message": "Selecciona el formato del archivo de importación" }, "selectImportFile": { - "message": "Select the import file" + "message": "Selecciona el archivo de importación" }, "chooseFile": { - "message": "Choose File" + "message": "Escoge el archivo" }, "noFileChosen": { - "message": "No file chosen" + "message": "No se ha elegido nungún archivo" }, "orCopyPasteFileContents": { - "message": "or copy/paste the import file contents" + "message": "o copia/pega el contenido del archivo de importación" }, "instructionsFor": { - "message": "$NAME$ Instructions", + "message": "Instrucciones para $NAME$", "description": "The title for the import tool instructions.", "placeholders": { "name": { @@ -2612,113 +2714,147 @@ } }, "confirmVaultImport": { - "message": "Confirm vault import" + "message": "Confirma la importación de la caja fuerte" }, "confirmVaultImportDesc": { - "message": "This file is password-protected. Please enter the file password to import data." + "message": "Este archivo está protegido por contraseña. Por favor, introduce la contraseña del archivo para importar los datos." }, "confirmFilePassword": { - "message": "Confirm file password" + "message": "Confirma la contraseña del archivo" }, "multifactorAuthenticationCancelled": { - "message": "Multifactor authentication cancelled" + "message": "Autenticación multifactor cancelada" }, "noLastPassDataFound": { - "message": "No LastPass data found" + "message": "No se encontraron datos de LastPass" }, "incorrectUsernameOrPassword": { - "message": "Incorrect username or password" + "message": "Nombre de usuario o contraseña incorrectos" }, "incorrectPassword": { - "message": "Incorrect password" + "message": "Contraseña incorrecta" }, "incorrectCode": { - "message": "Incorrect code" + "message": "Código incorrecto" }, "incorrectPin": { - "message": "Incorrect PIN" + "message": "PIN incorrecto" }, "multifactorAuthenticationFailed": { - "message": "Multifactor authentication failed" + "message": "Falló la autenticación multifactor" }, "includeSharedFolders": { - "message": "Include shared folders" + "message": "Incluir carpetas compartidas" }, "lastPassEmail": { - "message": "LastPass Email" + "message": "Correo electrónico de LastPass" }, "importingYourAccount": { - "message": "Importing your account..." + "message": "Importando tu cuenta..." }, "lastPassMFARequired": { - "message": "LastPass multifactor authentication required" + "message": "Se requiere autenticación multifactor de LastPass" }, "lastPassMFADesc": { - "message": "Enter your one-time passcode from your authentication app" + "message": "Introduce el código de acceso de un solo uso desde la aplicación de autenticación" }, "lastPassOOBDesc": { - "message": "Approve the login request in your authentication app or enter a one-time passcode." + "message": "Aprueba la solicitud de inicio de sesión en tu aplicación de autenticación o introduce un código de acceso de una sola vez." }, "passcode": { - "message": "Passcode" + "message": "Código de acceso" }, "lastPassMasterPassword": { - "message": "LastPass master password" + "message": "Contraseña maestra de LastPass" }, "lastPassAuthRequired": { - "message": "LastPass authentication required" + "message": "Se requiere autenticación de LastPass" }, "awaitingSSO": { - "message": "Awaiting SSO authentication" + "message": "Esperando autenticación SSO" }, "awaitingSSODesc": { - "message": "Please continue to log in using your company credentials." + "message": "Por favor, continua para iniciar sesión usando las credenciales de tu empresa." }, "seeDetailedInstructions": { - "message": "See detailed instructions on our help site at", + "message": "Consulte las instrucciones detalladas en nuestro sitio de ayuda en", "description": "This is followed a by a hyperlink to the help website." }, "importDirectlyFromLastPass": { - "message": "Import directly from LastPass" + "message": "Importar directamente desde LastPass" }, "importFromCSV": { - "message": "Import from CSV" + "message": "Importar desde CSV" }, "lastPassTryAgainCheckEmail": { - "message": "Try again or look for an email from LastPass to verify it's you." + "message": "Inténtalo de nuevo o busca un correo electrónico de LastPass para verificar que eres tú." }, "collection": { - "message": "Collection" + "message": "Colección" }, "lastPassYubikeyDesc": { - "message": "Insert the YubiKey associated with your LastPass account into your computer's USB port, then touch its button." + "message": "Inserta la YubiKey asociada a tu cuenta de LastPass en el puerto USB de tu ordenador y, pulsa su botón." }, "commonImportFormats": { - "message": "Common formats", + "message": "Formatos comunes", "description": "Label indicating the most common import formats" }, "success": { - "message": "Success" + "message": "Éxito" }, "troubleshooting": { - "message": "Troubleshooting" + "message": "Resolución de problemas" }, "disableHardwareAccelerationRestart": { - "message": "Disable hardware acceleration and restart" + "message": "Desactivar la aceleración de hardware y reiniciar" }, "enableHardwareAccelerationRestart": { - "message": "Enable hardware acceleration and restart" + "message": "Activar la aceleración de hardware y reiniciar" }, "removePasskey": { - "message": "Remove passkey" + "message": "Eliminar clave de acceso" }, "passkeyRemoved": { - "message": "Passkey removed" + "message": "Clave de acceso eliminada" }, "errorAssigningTargetCollection": { - "message": "Error assigning target collection." + "message": "Error al asignar la colección de destino." }, "errorAssigningTargetFolder": { - "message": "Error assigning target folder." + "message": "Error al asignar la carpeta de destino." + }, + "viewItemsIn": { + "message": "View items in $NAME$", + "description": "Button to view the contents of a folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "backTo": { + "message": "Back to $NAME$", + "description": "Navigate back to a previous folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "back": { + "message": "Back", + "description": "Button text to navigate back" + }, + "removeItem": { + "message": "Remove $NAME$", + "description": "Remove a selected option, such as a folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } } } diff --git a/apps/desktop/src/locales/et/messages.json b/apps/desktop/src/locales/et/messages.json index 02cd737baac..8203e38d29e 100644 --- a/apps/desktop/src/locales/et/messages.json +++ b/apps/desktop/src/locales/et/messages.json @@ -2132,6 +2132,108 @@ "forwardedEmailDesc": { "message": "Genereeri e-posti alias, kasutades selleks välist teenuspakkujat." }, + "forwarderError": { + "message": "$SERVICENAME$ error: $ERRORMESSAGE$", + "description": "Reports an error returned by a forwarding service to the user.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + }, + "errormessage": { + "content": "$2", + "example": "Invalid characters in domain name." + } + } + }, + "forwarderGeneratedBy": { + "message": "Generated by Bitwarden.", + "description": "Displayed with the address on the forwarding service's configuration screen." + }, + "forwarderGeneratedByWithWebsite": { + "message": "Website: $WEBSITE$. Generated by Bitwarden.", + "description": "Displayed with the address on the forwarding service's configuration screen.", + "placeholders": { + "WEBSITE": { + "content": "$1", + "example": "www.example.com" + } + } + }, + "forwaderInvalidToken": { + "message": "Invalid $SERVICENAME$ API token", + "description": "Displayed when the user's API token is empty or rejected by the forwarding service.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwaderInvalidTokenWithMessage": { + "message": "Invalid $SERVICENAME$ API token: $ERRORMESSAGE$", + "description": "Displayed when the user's API token is rejected by the forwarding service with an error message.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + }, + "errormessage": { + "content": "$2", + "example": "Please verify your email address to continue." + } + } + }, + "forwarderNoAccountId": { + "message": "Unable to obtain $SERVICENAME$ masked email account ID.", + "description": "Displayed when the forwarding service fails to return an account ID.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderNoDomain": { + "message": "Invalid $SERVICENAME$ domain.", + "description": "Displayed when the domain is empty or domain authorization failed at the forwarding service.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderNoUrl": { + "message": "Invalid $SERVICENAME$ url.", + "description": "Displayed when the url of the forwarding service wasn't supplied.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderUnknownError": { + "message": "Unknown $SERVICENAME$ error occurred.", + "description": "Displayed when the forwarding service failed due to an unknown error.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderUnknownForwarder": { + "message": "Unknown forwarder: '$SERVICENAME$'.", + "description": "Displayed when the forwarding service is not supported.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "JustTrust.us" + } + } + }, "hostname": { "message": "Hosti nimi", "description": "Part of a URL." @@ -2720,5 +2822,39 @@ }, "errorAssigningTargetFolder": { "message": "Error assigning target folder." + }, + "viewItemsIn": { + "message": "View items in $NAME$", + "description": "Button to view the contents of a folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "backTo": { + "message": "Back to $NAME$", + "description": "Navigate back to a previous folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "back": { + "message": "Back", + "description": "Button text to navigate back" + }, + "removeItem": { + "message": "Remove $NAME$", + "description": "Remove a selected option, such as a folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } } } diff --git a/apps/desktop/src/locales/eu/messages.json b/apps/desktop/src/locales/eu/messages.json index 2067b2dcc2e..dbfee64137c 100644 --- a/apps/desktop/src/locales/eu/messages.json +++ b/apps/desktop/src/locales/eu/messages.json @@ -2132,6 +2132,108 @@ "forwardedEmailDesc": { "message": "Emaileko ezizen bat sortu kanpoko bidalketa zerbitzu batekin." }, + "forwarderError": { + "message": "$SERVICENAME$ error: $ERRORMESSAGE$", + "description": "Reports an error returned by a forwarding service to the user.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + }, + "errormessage": { + "content": "$2", + "example": "Invalid characters in domain name." + } + } + }, + "forwarderGeneratedBy": { + "message": "Generated by Bitwarden.", + "description": "Displayed with the address on the forwarding service's configuration screen." + }, + "forwarderGeneratedByWithWebsite": { + "message": "Website: $WEBSITE$. Generated by Bitwarden.", + "description": "Displayed with the address on the forwarding service's configuration screen.", + "placeholders": { + "WEBSITE": { + "content": "$1", + "example": "www.example.com" + } + } + }, + "forwaderInvalidToken": { + "message": "Invalid $SERVICENAME$ API token", + "description": "Displayed when the user's API token is empty or rejected by the forwarding service.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwaderInvalidTokenWithMessage": { + "message": "Invalid $SERVICENAME$ API token: $ERRORMESSAGE$", + "description": "Displayed when the user's API token is rejected by the forwarding service with an error message.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + }, + "errormessage": { + "content": "$2", + "example": "Please verify your email address to continue." + } + } + }, + "forwarderNoAccountId": { + "message": "Unable to obtain $SERVICENAME$ masked email account ID.", + "description": "Displayed when the forwarding service fails to return an account ID.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderNoDomain": { + "message": "Invalid $SERVICENAME$ domain.", + "description": "Displayed when the domain is empty or domain authorization failed at the forwarding service.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderNoUrl": { + "message": "Invalid $SERVICENAME$ url.", + "description": "Displayed when the url of the forwarding service wasn't supplied.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderUnknownError": { + "message": "Unknown $SERVICENAME$ error occurred.", + "description": "Displayed when the forwarding service failed due to an unknown error.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderUnknownForwarder": { + "message": "Unknown forwarder: '$SERVICENAME$'.", + "description": "Displayed when the forwarding service is not supported.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "JustTrust.us" + } + } + }, "hostname": { "message": "Ostalariaren izena", "description": "Part of a URL." @@ -2720,5 +2822,39 @@ }, "errorAssigningTargetFolder": { "message": "Error assigning target folder." + }, + "viewItemsIn": { + "message": "View items in $NAME$", + "description": "Button to view the contents of a folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "backTo": { + "message": "Back to $NAME$", + "description": "Navigate back to a previous folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "back": { + "message": "Back", + "description": "Button text to navigate back" + }, + "removeItem": { + "message": "Remove $NAME$", + "description": "Remove a selected option, such as a folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } } } diff --git a/apps/desktop/src/locales/fa/messages.json b/apps/desktop/src/locales/fa/messages.json index ef34f8222ae..979b0a45ffa 100644 --- a/apps/desktop/src/locales/fa/messages.json +++ b/apps/desktop/src/locales/fa/messages.json @@ -2132,6 +2132,108 @@ "forwardedEmailDesc": { "message": "یک نام مستعار ایمیل با یک سرویس ارسال خارجی ایجاد کنید." }, + "forwarderError": { + "message": "$SERVICENAME$ error: $ERRORMESSAGE$", + "description": "Reports an error returned by a forwarding service to the user.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + }, + "errormessage": { + "content": "$2", + "example": "Invalid characters in domain name." + } + } + }, + "forwarderGeneratedBy": { + "message": "Generated by Bitwarden.", + "description": "Displayed with the address on the forwarding service's configuration screen." + }, + "forwarderGeneratedByWithWebsite": { + "message": "Website: $WEBSITE$. Generated by Bitwarden.", + "description": "Displayed with the address on the forwarding service's configuration screen.", + "placeholders": { + "WEBSITE": { + "content": "$1", + "example": "www.example.com" + } + } + }, + "forwaderInvalidToken": { + "message": "Invalid $SERVICENAME$ API token", + "description": "Displayed when the user's API token is empty or rejected by the forwarding service.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwaderInvalidTokenWithMessage": { + "message": "Invalid $SERVICENAME$ API token: $ERRORMESSAGE$", + "description": "Displayed when the user's API token is rejected by the forwarding service with an error message.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + }, + "errormessage": { + "content": "$2", + "example": "Please verify your email address to continue." + } + } + }, + "forwarderNoAccountId": { + "message": "Unable to obtain $SERVICENAME$ masked email account ID.", + "description": "Displayed when the forwarding service fails to return an account ID.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderNoDomain": { + "message": "Invalid $SERVICENAME$ domain.", + "description": "Displayed when the domain is empty or domain authorization failed at the forwarding service.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderNoUrl": { + "message": "Invalid $SERVICENAME$ url.", + "description": "Displayed when the url of the forwarding service wasn't supplied.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderUnknownError": { + "message": "Unknown $SERVICENAME$ error occurred.", + "description": "Displayed when the forwarding service failed due to an unknown error.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderUnknownForwarder": { + "message": "Unknown forwarder: '$SERVICENAME$'.", + "description": "Displayed when the forwarding service is not supported.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "JustTrust.us" + } + } + }, "hostname": { "message": "نام میزبان", "description": "Part of a URL." @@ -2720,5 +2822,39 @@ }, "errorAssigningTargetFolder": { "message": "Error assigning target folder." + }, + "viewItemsIn": { + "message": "View items in $NAME$", + "description": "Button to view the contents of a folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "backTo": { + "message": "Back to $NAME$", + "description": "Navigate back to a previous folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "back": { + "message": "Back", + "description": "Button text to navigate back" + }, + "removeItem": { + "message": "Remove $NAME$", + "description": "Remove a selected option, such as a folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } } } diff --git a/apps/desktop/src/locales/fi/messages.json b/apps/desktop/src/locales/fi/messages.json index 517b437d030..3d044cc238c 100644 --- a/apps/desktop/src/locales/fi/messages.json +++ b/apps/desktop/src/locales/fi/messages.json @@ -2127,11 +2127,113 @@ "message": "Etsi omasta holvista" }, "forwardedEmail": { - "message": "Sähköpostialias välitykseen" + "message": "Sähköpostialias ohjaukseen" }, "forwardedEmailDesc": { "message": "Luo sähköpostialias ulkoisella ohjauspalvelulla." }, + "forwarderError": { + "message": "$SERVICENAME$ -virhe: $ERRORMESSAGE$", + "description": "Reports an error returned by a forwarding service to the user.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + }, + "errormessage": { + "content": "$2", + "example": "Invalid characters in domain name." + } + } + }, + "forwarderGeneratedBy": { + "message": "Bitwardenin luoma.", + "description": "Displayed with the address on the forwarding service's configuration screen." + }, + "forwarderGeneratedByWithWebsite": { + "message": "Verkkosivusto: $WEBSITE$. Bitwardenin luoma.", + "description": "Displayed with the address on the forwarding service's configuration screen.", + "placeholders": { + "WEBSITE": { + "content": "$1", + "example": "www.example.com" + } + } + }, + "forwaderInvalidToken": { + "message": "Virheellinen $SERVICENAME$ -rajapinnan tunniste", + "description": "Displayed when the user's API token is empty or rejected by the forwarding service.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwaderInvalidTokenWithMessage": { + "message": "Virheellinen $SERVICENAME$ -rajapinnan tunniste: $ERRORMESSAGE$", + "description": "Displayed when the user's API token is rejected by the forwarding service with an error message.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + }, + "errormessage": { + "content": "$2", + "example": "Please verify your email address to continue." + } + } + }, + "forwarderNoAccountId": { + "message": "$SERVICENAME$ -palvelun peittämän sähköpostitilin tunnistetta ei saatu.", + "description": "Displayed when the forwarding service fails to return an account ID.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderNoDomain": { + "message": "Virheellinen $SERVICENAME$ -verkkotunnus.", + "description": "Displayed when the domain is empty or domain authorization failed at the forwarding service.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderNoUrl": { + "message": "Virheellinen $SERVICENAME$ -URL.", + "description": "Displayed when the url of the forwarding service wasn't supplied.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderUnknownError": { + "message": "Tapahtui tuntematon $SERVICENAME$ -virhe.", + "description": "Displayed when the forwarding service failed due to an unknown error.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderUnknownForwarder": { + "message": "Tuntematon ohjaaja: $SERVICENAME$.", + "description": "Displayed when the forwarding service is not supported.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "JustTrust.us" + } + } + }, "hostname": { "message": "Isäntä", "description": "Part of a URL." @@ -2720,5 +2822,39 @@ }, "errorAssigningTargetFolder": { "message": "Virhe määritettäessä kohdekansiota." + }, + "viewItemsIn": { + "message": "View items in $NAME$", + "description": "Button to view the contents of a folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "backTo": { + "message": "Back to $NAME$", + "description": "Navigate back to a previous folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "back": { + "message": "Back", + "description": "Button text to navigate back" + }, + "removeItem": { + "message": "Remove $NAME$", + "description": "Remove a selected option, such as a folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } } } diff --git a/apps/desktop/src/locales/fil/messages.json b/apps/desktop/src/locales/fil/messages.json index d28a4b568c3..b95ecc56a6e 100644 --- a/apps/desktop/src/locales/fil/messages.json +++ b/apps/desktop/src/locales/fil/messages.json @@ -2132,6 +2132,108 @@ "forwardedEmailDesc": { "message": "Bumuo ng isang email alias na may isang panlabas na serbisyo sa pagpapasa." }, + "forwarderError": { + "message": "$SERVICENAME$ error: $ERRORMESSAGE$", + "description": "Reports an error returned by a forwarding service to the user.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + }, + "errormessage": { + "content": "$2", + "example": "Invalid characters in domain name." + } + } + }, + "forwarderGeneratedBy": { + "message": "Generated by Bitwarden.", + "description": "Displayed with the address on the forwarding service's configuration screen." + }, + "forwarderGeneratedByWithWebsite": { + "message": "Website: $WEBSITE$. Generated by Bitwarden.", + "description": "Displayed with the address on the forwarding service's configuration screen.", + "placeholders": { + "WEBSITE": { + "content": "$1", + "example": "www.example.com" + } + } + }, + "forwaderInvalidToken": { + "message": "Invalid $SERVICENAME$ API token", + "description": "Displayed when the user's API token is empty or rejected by the forwarding service.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwaderInvalidTokenWithMessage": { + "message": "Invalid $SERVICENAME$ API token: $ERRORMESSAGE$", + "description": "Displayed when the user's API token is rejected by the forwarding service with an error message.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + }, + "errormessage": { + "content": "$2", + "example": "Please verify your email address to continue." + } + } + }, + "forwarderNoAccountId": { + "message": "Unable to obtain $SERVICENAME$ masked email account ID.", + "description": "Displayed when the forwarding service fails to return an account ID.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderNoDomain": { + "message": "Invalid $SERVICENAME$ domain.", + "description": "Displayed when the domain is empty or domain authorization failed at the forwarding service.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderNoUrl": { + "message": "Invalid $SERVICENAME$ url.", + "description": "Displayed when the url of the forwarding service wasn't supplied.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderUnknownError": { + "message": "Unknown $SERVICENAME$ error occurred.", + "description": "Displayed when the forwarding service failed due to an unknown error.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderUnknownForwarder": { + "message": "Unknown forwarder: '$SERVICENAME$'.", + "description": "Displayed when the forwarding service is not supported.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "JustTrust.us" + } + } + }, "hostname": { "message": "Pangalan ng Hostname", "description": "Part of a URL." @@ -2720,5 +2822,39 @@ }, "errorAssigningTargetFolder": { "message": "Error assigning target folder." + }, + "viewItemsIn": { + "message": "View items in $NAME$", + "description": "Button to view the contents of a folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "backTo": { + "message": "Back to $NAME$", + "description": "Navigate back to a previous folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "back": { + "message": "Back", + "description": "Button text to navigate back" + }, + "removeItem": { + "message": "Remove $NAME$", + "description": "Remove a selected option, such as a folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } } } diff --git a/apps/desktop/src/locales/fr/messages.json b/apps/desktop/src/locales/fr/messages.json index 8298544d2e8..9e547762e65 100644 --- a/apps/desktop/src/locales/fr/messages.json +++ b/apps/desktop/src/locales/fr/messages.json @@ -705,7 +705,7 @@ "message": "URL du serveur" }, "apiUrl": { - "message": "URL du serveur de l'IPA" + "message": "URL du serveur de l'API" }, "webVaultUrl": { "message": "URL du serveur du coffre web" @@ -2132,6 +2132,108 @@ "forwardedEmailDesc": { "message": "Générer un alias de courriel avec un service de transfert externe." }, + "forwarderError": { + "message": "$SERVICENAME$ error: $ERRORMESSAGE$", + "description": "Reports an error returned by a forwarding service to the user.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + }, + "errormessage": { + "content": "$2", + "example": "Invalid characters in domain name." + } + } + }, + "forwarderGeneratedBy": { + "message": "Generated by Bitwarden.", + "description": "Displayed with the address on the forwarding service's configuration screen." + }, + "forwarderGeneratedByWithWebsite": { + "message": "Website: $WEBSITE$. Generated by Bitwarden.", + "description": "Displayed with the address on the forwarding service's configuration screen.", + "placeholders": { + "WEBSITE": { + "content": "$1", + "example": "www.example.com" + } + } + }, + "forwaderInvalidToken": { + "message": "Invalid $SERVICENAME$ API token", + "description": "Displayed when the user's API token is empty or rejected by the forwarding service.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwaderInvalidTokenWithMessage": { + "message": "Invalid $SERVICENAME$ API token: $ERRORMESSAGE$", + "description": "Displayed when the user's API token is rejected by the forwarding service with an error message.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + }, + "errormessage": { + "content": "$2", + "example": "Please verify your email address to continue." + } + } + }, + "forwarderNoAccountId": { + "message": "Unable to obtain $SERVICENAME$ masked email account ID.", + "description": "Displayed when the forwarding service fails to return an account ID.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderNoDomain": { + "message": "Invalid $SERVICENAME$ domain.", + "description": "Displayed when the domain is empty or domain authorization failed at the forwarding service.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderNoUrl": { + "message": "Invalid $SERVICENAME$ url.", + "description": "Displayed when the url of the forwarding service wasn't supplied.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderUnknownError": { + "message": "Unknown $SERVICENAME$ error occurred.", + "description": "Displayed when the forwarding service failed due to an unknown error.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderUnknownForwarder": { + "message": "Unknown forwarder: '$SERVICENAME$'.", + "description": "Displayed when the forwarding service is not supported.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "JustTrust.us" + } + } + }, "hostname": { "message": "Nom d'hôte", "description": "Part of a URL." @@ -2720,5 +2822,39 @@ }, "errorAssigningTargetFolder": { "message": "Erreur lors de l'assignation du dossier cible." + }, + "viewItemsIn": { + "message": "View items in $NAME$", + "description": "Button to view the contents of a folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "backTo": { + "message": "Back to $NAME$", + "description": "Navigate back to a previous folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "back": { + "message": "Back", + "description": "Button text to navigate back" + }, + "removeItem": { + "message": "Remove $NAME$", + "description": "Remove a selected option, such as a folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } } } diff --git a/apps/desktop/src/locales/gl/messages.json b/apps/desktop/src/locales/gl/messages.json index 889a2beeee0..d8cb372359c 100644 --- a/apps/desktop/src/locales/gl/messages.json +++ b/apps/desktop/src/locales/gl/messages.json @@ -2132,6 +2132,108 @@ "forwardedEmailDesc": { "message": "Generate an email alias with an external forwarding service." }, + "forwarderError": { + "message": "$SERVICENAME$ error: $ERRORMESSAGE$", + "description": "Reports an error returned by a forwarding service to the user.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + }, + "errormessage": { + "content": "$2", + "example": "Invalid characters in domain name." + } + } + }, + "forwarderGeneratedBy": { + "message": "Generated by Bitwarden.", + "description": "Displayed with the address on the forwarding service's configuration screen." + }, + "forwarderGeneratedByWithWebsite": { + "message": "Website: $WEBSITE$. Generated by Bitwarden.", + "description": "Displayed with the address on the forwarding service's configuration screen.", + "placeholders": { + "WEBSITE": { + "content": "$1", + "example": "www.example.com" + } + } + }, + "forwaderInvalidToken": { + "message": "Invalid $SERVICENAME$ API token", + "description": "Displayed when the user's API token is empty or rejected by the forwarding service.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwaderInvalidTokenWithMessage": { + "message": "Invalid $SERVICENAME$ API token: $ERRORMESSAGE$", + "description": "Displayed when the user's API token is rejected by the forwarding service with an error message.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + }, + "errormessage": { + "content": "$2", + "example": "Please verify your email address to continue." + } + } + }, + "forwarderNoAccountId": { + "message": "Unable to obtain $SERVICENAME$ masked email account ID.", + "description": "Displayed when the forwarding service fails to return an account ID.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderNoDomain": { + "message": "Invalid $SERVICENAME$ domain.", + "description": "Displayed when the domain is empty or domain authorization failed at the forwarding service.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderNoUrl": { + "message": "Invalid $SERVICENAME$ url.", + "description": "Displayed when the url of the forwarding service wasn't supplied.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderUnknownError": { + "message": "Unknown $SERVICENAME$ error occurred.", + "description": "Displayed when the forwarding service failed due to an unknown error.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderUnknownForwarder": { + "message": "Unknown forwarder: '$SERVICENAME$'.", + "description": "Displayed when the forwarding service is not supported.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "JustTrust.us" + } + } + }, "hostname": { "message": "Hostname", "description": "Part of a URL." @@ -2720,5 +2822,39 @@ }, "errorAssigningTargetFolder": { "message": "Error assigning target folder." + }, + "viewItemsIn": { + "message": "View items in $NAME$", + "description": "Button to view the contents of a folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "backTo": { + "message": "Back to $NAME$", + "description": "Navigate back to a previous folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "back": { + "message": "Back", + "description": "Button text to navigate back" + }, + "removeItem": { + "message": "Remove $NAME$", + "description": "Remove a selected option, such as a folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } } } diff --git a/apps/desktop/src/locales/he/messages.json b/apps/desktop/src/locales/he/messages.json index 3b155ffdf3e..6ab0859fcc6 100644 --- a/apps/desktop/src/locales/he/messages.json +++ b/apps/desktop/src/locales/he/messages.json @@ -2132,6 +2132,108 @@ "forwardedEmailDesc": { "message": "צור כינוי דוא\"ל באמצעות שירות שליחת דוא\"ל חיצוני." }, + "forwarderError": { + "message": "$SERVICENAME$ error: $ERRORMESSAGE$", + "description": "Reports an error returned by a forwarding service to the user.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + }, + "errormessage": { + "content": "$2", + "example": "Invalid characters in domain name." + } + } + }, + "forwarderGeneratedBy": { + "message": "Generated by Bitwarden.", + "description": "Displayed with the address on the forwarding service's configuration screen." + }, + "forwarderGeneratedByWithWebsite": { + "message": "Website: $WEBSITE$. Generated by Bitwarden.", + "description": "Displayed with the address on the forwarding service's configuration screen.", + "placeholders": { + "WEBSITE": { + "content": "$1", + "example": "www.example.com" + } + } + }, + "forwaderInvalidToken": { + "message": "Invalid $SERVICENAME$ API token", + "description": "Displayed when the user's API token is empty or rejected by the forwarding service.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwaderInvalidTokenWithMessage": { + "message": "Invalid $SERVICENAME$ API token: $ERRORMESSAGE$", + "description": "Displayed when the user's API token is rejected by the forwarding service with an error message.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + }, + "errormessage": { + "content": "$2", + "example": "Please verify your email address to continue." + } + } + }, + "forwarderNoAccountId": { + "message": "Unable to obtain $SERVICENAME$ masked email account ID.", + "description": "Displayed when the forwarding service fails to return an account ID.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderNoDomain": { + "message": "Invalid $SERVICENAME$ domain.", + "description": "Displayed when the domain is empty or domain authorization failed at the forwarding service.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderNoUrl": { + "message": "Invalid $SERVICENAME$ url.", + "description": "Displayed when the url of the forwarding service wasn't supplied.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderUnknownError": { + "message": "Unknown $SERVICENAME$ error occurred.", + "description": "Displayed when the forwarding service failed due to an unknown error.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderUnknownForwarder": { + "message": "Unknown forwarder: '$SERVICENAME$'.", + "description": "Displayed when the forwarding service is not supported.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "JustTrust.us" + } + } + }, "hostname": { "message": "שם מארח", "description": "Part of a URL." @@ -2720,5 +2822,39 @@ }, "errorAssigningTargetFolder": { "message": "Error assigning target folder." + }, + "viewItemsIn": { + "message": "View items in $NAME$", + "description": "Button to view the contents of a folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "backTo": { + "message": "Back to $NAME$", + "description": "Navigate back to a previous folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "back": { + "message": "Back", + "description": "Button text to navigate back" + }, + "removeItem": { + "message": "Remove $NAME$", + "description": "Remove a selected option, such as a folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } } } diff --git a/apps/desktop/src/locales/hi/messages.json b/apps/desktop/src/locales/hi/messages.json index af28c666813..bb4d063747e 100644 --- a/apps/desktop/src/locales/hi/messages.json +++ b/apps/desktop/src/locales/hi/messages.json @@ -2132,6 +2132,108 @@ "forwardedEmailDesc": { "message": "Generate an email alias with an external forwarding service." }, + "forwarderError": { + "message": "$SERVICENAME$ error: $ERRORMESSAGE$", + "description": "Reports an error returned by a forwarding service to the user.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + }, + "errormessage": { + "content": "$2", + "example": "Invalid characters in domain name." + } + } + }, + "forwarderGeneratedBy": { + "message": "Generated by Bitwarden.", + "description": "Displayed with the address on the forwarding service's configuration screen." + }, + "forwarderGeneratedByWithWebsite": { + "message": "Website: $WEBSITE$. Generated by Bitwarden.", + "description": "Displayed with the address on the forwarding service's configuration screen.", + "placeholders": { + "WEBSITE": { + "content": "$1", + "example": "www.example.com" + } + } + }, + "forwaderInvalidToken": { + "message": "Invalid $SERVICENAME$ API token", + "description": "Displayed when the user's API token is empty or rejected by the forwarding service.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwaderInvalidTokenWithMessage": { + "message": "Invalid $SERVICENAME$ API token: $ERRORMESSAGE$", + "description": "Displayed when the user's API token is rejected by the forwarding service with an error message.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + }, + "errormessage": { + "content": "$2", + "example": "Please verify your email address to continue." + } + } + }, + "forwarderNoAccountId": { + "message": "Unable to obtain $SERVICENAME$ masked email account ID.", + "description": "Displayed when the forwarding service fails to return an account ID.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderNoDomain": { + "message": "Invalid $SERVICENAME$ domain.", + "description": "Displayed when the domain is empty or domain authorization failed at the forwarding service.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderNoUrl": { + "message": "Invalid $SERVICENAME$ url.", + "description": "Displayed when the url of the forwarding service wasn't supplied.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderUnknownError": { + "message": "Unknown $SERVICENAME$ error occurred.", + "description": "Displayed when the forwarding service failed due to an unknown error.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderUnknownForwarder": { + "message": "Unknown forwarder: '$SERVICENAME$'.", + "description": "Displayed when the forwarding service is not supported.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "JustTrust.us" + } + } + }, "hostname": { "message": "Hostname", "description": "Part of a URL." @@ -2720,5 +2822,39 @@ }, "errorAssigningTargetFolder": { "message": "Error assigning target folder." + }, + "viewItemsIn": { + "message": "View items in $NAME$", + "description": "Button to view the contents of a folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "backTo": { + "message": "Back to $NAME$", + "description": "Navigate back to a previous folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "back": { + "message": "Back", + "description": "Button text to navigate back" + }, + "removeItem": { + "message": "Remove $NAME$", + "description": "Remove a selected option, such as a folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } } } diff --git a/apps/desktop/src/locales/hr/messages.json b/apps/desktop/src/locales/hr/messages.json index 01983d5891e..049882594c6 100644 --- a/apps/desktop/src/locales/hr/messages.json +++ b/apps/desktop/src/locales/hr/messages.json @@ -2132,6 +2132,108 @@ "forwardedEmailDesc": { "message": "Generiraj pseudonim e-pošte s vanjskom uslugom prosljeđivanja." }, + "forwarderError": { + "message": "$SERVICENAME$ error: $ERRORMESSAGE$", + "description": "Reports an error returned by a forwarding service to the user.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + }, + "errormessage": { + "content": "$2", + "example": "Invalid characters in domain name." + } + } + }, + "forwarderGeneratedBy": { + "message": "Generated by Bitwarden.", + "description": "Displayed with the address on the forwarding service's configuration screen." + }, + "forwarderGeneratedByWithWebsite": { + "message": "Website: $WEBSITE$. Generated by Bitwarden.", + "description": "Displayed with the address on the forwarding service's configuration screen.", + "placeholders": { + "WEBSITE": { + "content": "$1", + "example": "www.example.com" + } + } + }, + "forwaderInvalidToken": { + "message": "Invalid $SERVICENAME$ API token", + "description": "Displayed when the user's API token is empty or rejected by the forwarding service.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwaderInvalidTokenWithMessage": { + "message": "Invalid $SERVICENAME$ API token: $ERRORMESSAGE$", + "description": "Displayed when the user's API token is rejected by the forwarding service with an error message.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + }, + "errormessage": { + "content": "$2", + "example": "Please verify your email address to continue." + } + } + }, + "forwarderNoAccountId": { + "message": "Unable to obtain $SERVICENAME$ masked email account ID.", + "description": "Displayed when the forwarding service fails to return an account ID.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderNoDomain": { + "message": "Invalid $SERVICENAME$ domain.", + "description": "Displayed when the domain is empty or domain authorization failed at the forwarding service.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderNoUrl": { + "message": "Invalid $SERVICENAME$ url.", + "description": "Displayed when the url of the forwarding service wasn't supplied.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderUnknownError": { + "message": "Unknown $SERVICENAME$ error occurred.", + "description": "Displayed when the forwarding service failed due to an unknown error.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderUnknownForwarder": { + "message": "Unknown forwarder: '$SERVICENAME$'.", + "description": "Displayed when the forwarding service is not supported.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "JustTrust.us" + } + } + }, "hostname": { "message": "Naziv poslužitelja", "description": "Part of a URL." @@ -2720,5 +2822,39 @@ }, "errorAssigningTargetFolder": { "message": "Error assigning target folder." + }, + "viewItemsIn": { + "message": "View items in $NAME$", + "description": "Button to view the contents of a folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "backTo": { + "message": "Back to $NAME$", + "description": "Navigate back to a previous folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "back": { + "message": "Back", + "description": "Button text to navigate back" + }, + "removeItem": { + "message": "Remove $NAME$", + "description": "Remove a selected option, such as a folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } } } diff --git a/apps/desktop/src/locales/hu/messages.json b/apps/desktop/src/locales/hu/messages.json index 838b3fc7c8e..c2f515bdbf8 100644 --- a/apps/desktop/src/locales/hu/messages.json +++ b/apps/desktop/src/locales/hu/messages.json @@ -2132,6 +2132,108 @@ "forwardedEmailDesc": { "message": "Email álnév generálása külső továbbító szolgáltatással." }, + "forwarderError": { + "message": "$SERVICENAME$ hiba: $ERRORMESSAGE$", + "description": "Reports an error returned by a forwarding service to the user.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + }, + "errormessage": { + "content": "$2", + "example": "Invalid characters in domain name." + } + } + }, + "forwarderGeneratedBy": { + "message": "Generálta: Bitwarden.", + "description": "Displayed with the address on the forwarding service's configuration screen." + }, + "forwarderGeneratedByWithWebsite": { + "message": "Webhely: $WEBSITE$. Generálta: Bitwarden.", + "description": "Displayed with the address on the forwarding service's configuration screen.", + "placeholders": { + "WEBSITE": { + "content": "$1", + "example": "www.example.com" + } + } + }, + "forwaderInvalidToken": { + "message": "$SERVICENAME$ API vezérjel érvénytelen.", + "description": "Displayed when the user's API token is empty or rejected by the forwarding service.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwaderInvalidTokenWithMessage": { + "message": "$SERVICENAME$ API vezérjel érvénytelen: $ERRORMESSAGE$", + "description": "Displayed when the user's API token is rejected by the forwarding service with an error message.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + }, + "errormessage": { + "content": "$2", + "example": "Please verify your email address to continue." + } + } + }, + "forwarderNoAccountId": { + "message": "Nem lehet beolvasni $SERVICENAME$ maszkolt email fiók azonosítót.", + "description": "Displayed when the forwarding service fails to return an account ID.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderNoDomain": { + "message": "$SERVICENAME$ domain érvénytelen.", + "description": "Displayed when the domain is empty or domain authorization failed at the forwarding service.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderNoUrl": { + "message": "$SERVICENAME$ webcím érvénytelen.", + "description": "Displayed when the url of the forwarding service wasn't supplied.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderUnknownError": { + "message": "Ismeretlen $SERVICENAME$ hiba történt.", + "description": "Displayed when the forwarding service failed due to an unknown error.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderUnknownForwarder": { + "message": "Ismeretlen továbbító: '$SERVICENAME$'.", + "description": "Displayed when the forwarding service is not supported.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "JustTrust.us" + } + } + }, "hostname": { "message": "Kiszolglónév", "description": "Part of a URL." @@ -2720,5 +2822,39 @@ }, "errorAssigningTargetFolder": { "message": "Hiba történt a célmappa hozzárendelése során." + }, + "viewItemsIn": { + "message": "View items in $NAME$", + "description": "Button to view the contents of a folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "backTo": { + "message": "Back to $NAME$", + "description": "Navigate back to a previous folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "back": { + "message": "Back", + "description": "Button text to navigate back" + }, + "removeItem": { + "message": "Remove $NAME$", + "description": "Remove a selected option, such as a folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } } } diff --git a/apps/desktop/src/locales/id/messages.json b/apps/desktop/src/locales/id/messages.json index 2173224f541..ba0c9095ad1 100644 --- a/apps/desktop/src/locales/id/messages.json +++ b/apps/desktop/src/locales/id/messages.json @@ -2132,6 +2132,108 @@ "forwardedEmailDesc": { "message": "Generate an email alias with an external forwarding service." }, + "forwarderError": { + "message": "$SERVICENAME$ error: $ERRORMESSAGE$", + "description": "Reports an error returned by a forwarding service to the user.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + }, + "errormessage": { + "content": "$2", + "example": "Invalid characters in domain name." + } + } + }, + "forwarderGeneratedBy": { + "message": "Generated by Bitwarden.", + "description": "Displayed with the address on the forwarding service's configuration screen." + }, + "forwarderGeneratedByWithWebsite": { + "message": "Website: $WEBSITE$. Generated by Bitwarden.", + "description": "Displayed with the address on the forwarding service's configuration screen.", + "placeholders": { + "WEBSITE": { + "content": "$1", + "example": "www.example.com" + } + } + }, + "forwaderInvalidToken": { + "message": "Invalid $SERVICENAME$ API token", + "description": "Displayed when the user's API token is empty or rejected by the forwarding service.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwaderInvalidTokenWithMessage": { + "message": "Invalid $SERVICENAME$ API token: $ERRORMESSAGE$", + "description": "Displayed when the user's API token is rejected by the forwarding service with an error message.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + }, + "errormessage": { + "content": "$2", + "example": "Please verify your email address to continue." + } + } + }, + "forwarderNoAccountId": { + "message": "Unable to obtain $SERVICENAME$ masked email account ID.", + "description": "Displayed when the forwarding service fails to return an account ID.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderNoDomain": { + "message": "Invalid $SERVICENAME$ domain.", + "description": "Displayed when the domain is empty or domain authorization failed at the forwarding service.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderNoUrl": { + "message": "Invalid $SERVICENAME$ url.", + "description": "Displayed when the url of the forwarding service wasn't supplied.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderUnknownError": { + "message": "Unknown $SERVICENAME$ error occurred.", + "description": "Displayed when the forwarding service failed due to an unknown error.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderUnknownForwarder": { + "message": "Unknown forwarder: '$SERVICENAME$'.", + "description": "Displayed when the forwarding service is not supported.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "JustTrust.us" + } + } + }, "hostname": { "message": "Hostname", "description": "Part of a URL." @@ -2720,5 +2822,39 @@ }, "errorAssigningTargetFolder": { "message": "Error assigning target folder." + }, + "viewItemsIn": { + "message": "View items in $NAME$", + "description": "Button to view the contents of a folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "backTo": { + "message": "Back to $NAME$", + "description": "Navigate back to a previous folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "back": { + "message": "Back", + "description": "Button text to navigate back" + }, + "removeItem": { + "message": "Remove $NAME$", + "description": "Remove a selected option, such as a folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } } } diff --git a/apps/desktop/src/locales/it/messages.json b/apps/desktop/src/locales/it/messages.json index 93882cf6985..b7335e3ea55 100644 --- a/apps/desktop/src/locales/it/messages.json +++ b/apps/desktop/src/locales/it/messages.json @@ -2132,6 +2132,108 @@ "forwardedEmailDesc": { "message": "Genera un alias email con un servizio di inoltro esterno." }, + "forwarderError": { + "message": "Errore $SERVICENAME$: $ERRORMESSAGE$", + "description": "Reports an error returned by a forwarding service to the user.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + }, + "errormessage": { + "content": "$2", + "example": "Invalid characters in domain name." + } + } + }, + "forwarderGeneratedBy": { + "message": "Generato da Bitwarden.", + "description": "Displayed with the address on the forwarding service's configuration screen." + }, + "forwarderGeneratedByWithWebsite": { + "message": "Sito web: $WEBSITE$. Generato da Bitwarden.", + "description": "Displayed with the address on the forwarding service's configuration screen.", + "placeholders": { + "WEBSITE": { + "content": "$1", + "example": "www.example.com" + } + } + }, + "forwaderInvalidToken": { + "message": "Token API $SERVICENAME$ non valido", + "description": "Displayed when the user's API token is empty or rejected by the forwarding service.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwaderInvalidTokenWithMessage": { + "message": "Token API $SERVICENAME$ non valido: $ERRORMESSAGE$", + "description": "Displayed when the user's API token is rejected by the forwarding service with an error message.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + }, + "errormessage": { + "content": "$2", + "example": "Please verify your email address to continue." + } + } + }, + "forwarderNoAccountId": { + "message": "Impossibile ottenere l'ID dell'account email mascherato di $SERVICENAME$.", + "description": "Displayed when the forwarding service fails to return an account ID.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderNoDomain": { + "message": "Dominio $SERVICENAME$ non valido.", + "description": "Displayed when the domain is empty or domain authorization failed at the forwarding service.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderNoUrl": { + "message": "URL $SERVICENAME$ non valido.", + "description": "Displayed when the url of the forwarding service wasn't supplied.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderUnknownError": { + "message": "Errore di $SERVICENAME$ sconosciuto.", + "description": "Displayed when the forwarding service failed due to an unknown error.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderUnknownForwarder": { + "message": "Mittente sconosciuto: \"$SERVICENAME$\".", + "description": "Displayed when the forwarding service is not supported.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "JustTrust.us" + } + } + }, "hostname": { "message": "Nome host", "description": "Part of a URL." @@ -2720,5 +2822,39 @@ }, "errorAssigningTargetFolder": { "message": "Errore nell'assegnazione della cartella di destinazione." + }, + "viewItemsIn": { + "message": "View items in $NAME$", + "description": "Button to view the contents of a folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "backTo": { + "message": "Back to $NAME$", + "description": "Navigate back to a previous folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "back": { + "message": "Back", + "description": "Button text to navigate back" + }, + "removeItem": { + "message": "Remove $NAME$", + "description": "Remove a selected option, such as a folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } } } diff --git a/apps/desktop/src/locales/ja/messages.json b/apps/desktop/src/locales/ja/messages.json index ab6c0be95f7..5c134f15ba7 100644 --- a/apps/desktop/src/locales/ja/messages.json +++ b/apps/desktop/src/locales/ja/messages.json @@ -2132,6 +2132,108 @@ "forwardedEmailDesc": { "message": "外部転送サービスを使用してメールエイリアスを生成します。" }, + "forwarderError": { + "message": "$SERVICENAME$ エラー: $ERRORMESSAGE$", + "description": "Reports an error returned by a forwarding service to the user.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + }, + "errormessage": { + "content": "$2", + "example": "Invalid characters in domain name." + } + } + }, + "forwarderGeneratedBy": { + "message": "Bitwarden によって生成されました。", + "description": "Displayed with the address on the forwarding service's configuration screen." + }, + "forwarderGeneratedByWithWebsite": { + "message": "ウェブサイト: $WEBSITE$ Bitwarden によって生成されました。", + "description": "Displayed with the address on the forwarding service's configuration screen.", + "placeholders": { + "WEBSITE": { + "content": "$1", + "example": "www.example.com" + } + } + }, + "forwaderInvalidToken": { + "message": "不正な$SERVICENAME$ API トークン", + "description": "Displayed when the user's API token is empty or rejected by the forwarding service.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwaderInvalidTokenWithMessage": { + "message": "不正な$SERVICENAME$ API トークン: $ERRORMESSAGE$", + "description": "Displayed when the user's API token is rejected by the forwarding service with an error message.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + }, + "errormessage": { + "content": "$2", + "example": "Please verify your email address to continue." + } + } + }, + "forwarderNoAccountId": { + "message": "$SERVICENAME$ マスク済みメールアカウント ID を取得できませんでした。", + "description": "Displayed when the forwarding service fails to return an account ID.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderNoDomain": { + "message": "不正な $SERVICENAME$ ドメインです。", + "description": "Displayed when the domain is empty or domain authorization failed at the forwarding service.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderNoUrl": { + "message": "不正な $SERVICENAME$ URL です。", + "description": "Displayed when the url of the forwarding service wasn't supplied.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderUnknownError": { + "message": "不明な $SERVICENAME$ エラーが起きました。", + "description": "Displayed when the forwarding service failed due to an unknown error.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderUnknownForwarder": { + "message": "不明な転送先: '$SERVICENAME$'", + "description": "Displayed when the forwarding service is not supported.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "JustTrust.us" + } + } + }, "hostname": { "message": "ホスト名", "description": "Part of a URL." @@ -2720,5 +2822,39 @@ }, "errorAssigningTargetFolder": { "message": "ターゲットフォルダーの割り当てに失敗しました。" + }, + "viewItemsIn": { + "message": "View items in $NAME$", + "description": "Button to view the contents of a folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "backTo": { + "message": "Back to $NAME$", + "description": "Navigate back to a previous folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "back": { + "message": "Back", + "description": "Button text to navigate back" + }, + "removeItem": { + "message": "Remove $NAME$", + "description": "Remove a selected option, such as a folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } } } diff --git a/apps/desktop/src/locales/ka/messages.json b/apps/desktop/src/locales/ka/messages.json index 889a2beeee0..d8cb372359c 100644 --- a/apps/desktop/src/locales/ka/messages.json +++ b/apps/desktop/src/locales/ka/messages.json @@ -2132,6 +2132,108 @@ "forwardedEmailDesc": { "message": "Generate an email alias with an external forwarding service." }, + "forwarderError": { + "message": "$SERVICENAME$ error: $ERRORMESSAGE$", + "description": "Reports an error returned by a forwarding service to the user.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + }, + "errormessage": { + "content": "$2", + "example": "Invalid characters in domain name." + } + } + }, + "forwarderGeneratedBy": { + "message": "Generated by Bitwarden.", + "description": "Displayed with the address on the forwarding service's configuration screen." + }, + "forwarderGeneratedByWithWebsite": { + "message": "Website: $WEBSITE$. Generated by Bitwarden.", + "description": "Displayed with the address on the forwarding service's configuration screen.", + "placeholders": { + "WEBSITE": { + "content": "$1", + "example": "www.example.com" + } + } + }, + "forwaderInvalidToken": { + "message": "Invalid $SERVICENAME$ API token", + "description": "Displayed when the user's API token is empty or rejected by the forwarding service.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwaderInvalidTokenWithMessage": { + "message": "Invalid $SERVICENAME$ API token: $ERRORMESSAGE$", + "description": "Displayed when the user's API token is rejected by the forwarding service with an error message.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + }, + "errormessage": { + "content": "$2", + "example": "Please verify your email address to continue." + } + } + }, + "forwarderNoAccountId": { + "message": "Unable to obtain $SERVICENAME$ masked email account ID.", + "description": "Displayed when the forwarding service fails to return an account ID.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderNoDomain": { + "message": "Invalid $SERVICENAME$ domain.", + "description": "Displayed when the domain is empty or domain authorization failed at the forwarding service.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderNoUrl": { + "message": "Invalid $SERVICENAME$ url.", + "description": "Displayed when the url of the forwarding service wasn't supplied.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderUnknownError": { + "message": "Unknown $SERVICENAME$ error occurred.", + "description": "Displayed when the forwarding service failed due to an unknown error.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderUnknownForwarder": { + "message": "Unknown forwarder: '$SERVICENAME$'.", + "description": "Displayed when the forwarding service is not supported.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "JustTrust.us" + } + } + }, "hostname": { "message": "Hostname", "description": "Part of a URL." @@ -2720,5 +2822,39 @@ }, "errorAssigningTargetFolder": { "message": "Error assigning target folder." + }, + "viewItemsIn": { + "message": "View items in $NAME$", + "description": "Button to view the contents of a folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "backTo": { + "message": "Back to $NAME$", + "description": "Navigate back to a previous folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "back": { + "message": "Back", + "description": "Button text to navigate back" + }, + "removeItem": { + "message": "Remove $NAME$", + "description": "Remove a selected option, such as a folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } } } diff --git a/apps/desktop/src/locales/km/messages.json b/apps/desktop/src/locales/km/messages.json index 889a2beeee0..d8cb372359c 100644 --- a/apps/desktop/src/locales/km/messages.json +++ b/apps/desktop/src/locales/km/messages.json @@ -2132,6 +2132,108 @@ "forwardedEmailDesc": { "message": "Generate an email alias with an external forwarding service." }, + "forwarderError": { + "message": "$SERVICENAME$ error: $ERRORMESSAGE$", + "description": "Reports an error returned by a forwarding service to the user.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + }, + "errormessage": { + "content": "$2", + "example": "Invalid characters in domain name." + } + } + }, + "forwarderGeneratedBy": { + "message": "Generated by Bitwarden.", + "description": "Displayed with the address on the forwarding service's configuration screen." + }, + "forwarderGeneratedByWithWebsite": { + "message": "Website: $WEBSITE$. Generated by Bitwarden.", + "description": "Displayed with the address on the forwarding service's configuration screen.", + "placeholders": { + "WEBSITE": { + "content": "$1", + "example": "www.example.com" + } + } + }, + "forwaderInvalidToken": { + "message": "Invalid $SERVICENAME$ API token", + "description": "Displayed when the user's API token is empty or rejected by the forwarding service.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwaderInvalidTokenWithMessage": { + "message": "Invalid $SERVICENAME$ API token: $ERRORMESSAGE$", + "description": "Displayed when the user's API token is rejected by the forwarding service with an error message.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + }, + "errormessage": { + "content": "$2", + "example": "Please verify your email address to continue." + } + } + }, + "forwarderNoAccountId": { + "message": "Unable to obtain $SERVICENAME$ masked email account ID.", + "description": "Displayed when the forwarding service fails to return an account ID.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderNoDomain": { + "message": "Invalid $SERVICENAME$ domain.", + "description": "Displayed when the domain is empty or domain authorization failed at the forwarding service.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderNoUrl": { + "message": "Invalid $SERVICENAME$ url.", + "description": "Displayed when the url of the forwarding service wasn't supplied.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderUnknownError": { + "message": "Unknown $SERVICENAME$ error occurred.", + "description": "Displayed when the forwarding service failed due to an unknown error.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderUnknownForwarder": { + "message": "Unknown forwarder: '$SERVICENAME$'.", + "description": "Displayed when the forwarding service is not supported.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "JustTrust.us" + } + } + }, "hostname": { "message": "Hostname", "description": "Part of a URL." @@ -2720,5 +2822,39 @@ }, "errorAssigningTargetFolder": { "message": "Error assigning target folder." + }, + "viewItemsIn": { + "message": "View items in $NAME$", + "description": "Button to view the contents of a folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "backTo": { + "message": "Back to $NAME$", + "description": "Navigate back to a previous folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "back": { + "message": "Back", + "description": "Button text to navigate back" + }, + "removeItem": { + "message": "Remove $NAME$", + "description": "Remove a selected option, such as a folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } } } diff --git a/apps/desktop/src/locales/kn/messages.json b/apps/desktop/src/locales/kn/messages.json index eb0cbcf6be7..4b654e92327 100644 --- a/apps/desktop/src/locales/kn/messages.json +++ b/apps/desktop/src/locales/kn/messages.json @@ -2132,6 +2132,108 @@ "forwardedEmailDesc": { "message": "Generate an email alias with an external forwarding service." }, + "forwarderError": { + "message": "$SERVICENAME$ error: $ERRORMESSAGE$", + "description": "Reports an error returned by a forwarding service to the user.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + }, + "errormessage": { + "content": "$2", + "example": "Invalid characters in domain name." + } + } + }, + "forwarderGeneratedBy": { + "message": "Generated by Bitwarden.", + "description": "Displayed with the address on the forwarding service's configuration screen." + }, + "forwarderGeneratedByWithWebsite": { + "message": "Website: $WEBSITE$. Generated by Bitwarden.", + "description": "Displayed with the address on the forwarding service's configuration screen.", + "placeholders": { + "WEBSITE": { + "content": "$1", + "example": "www.example.com" + } + } + }, + "forwaderInvalidToken": { + "message": "Invalid $SERVICENAME$ API token", + "description": "Displayed when the user's API token is empty or rejected by the forwarding service.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwaderInvalidTokenWithMessage": { + "message": "Invalid $SERVICENAME$ API token: $ERRORMESSAGE$", + "description": "Displayed when the user's API token is rejected by the forwarding service with an error message.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + }, + "errormessage": { + "content": "$2", + "example": "Please verify your email address to continue." + } + } + }, + "forwarderNoAccountId": { + "message": "Unable to obtain $SERVICENAME$ masked email account ID.", + "description": "Displayed when the forwarding service fails to return an account ID.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderNoDomain": { + "message": "Invalid $SERVICENAME$ domain.", + "description": "Displayed when the domain is empty or domain authorization failed at the forwarding service.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderNoUrl": { + "message": "Invalid $SERVICENAME$ url.", + "description": "Displayed when the url of the forwarding service wasn't supplied.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderUnknownError": { + "message": "Unknown $SERVICENAME$ error occurred.", + "description": "Displayed when the forwarding service failed due to an unknown error.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderUnknownForwarder": { + "message": "Unknown forwarder: '$SERVICENAME$'.", + "description": "Displayed when the forwarding service is not supported.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "JustTrust.us" + } + } + }, "hostname": { "message": "Hostname", "description": "Part of a URL." @@ -2720,5 +2822,39 @@ }, "errorAssigningTargetFolder": { "message": "Error assigning target folder." + }, + "viewItemsIn": { + "message": "View items in $NAME$", + "description": "Button to view the contents of a folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "backTo": { + "message": "Back to $NAME$", + "description": "Navigate back to a previous folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "back": { + "message": "Back", + "description": "Button text to navigate back" + }, + "removeItem": { + "message": "Remove $NAME$", + "description": "Remove a selected option, such as a folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } } } diff --git a/apps/desktop/src/locales/ko/messages.json b/apps/desktop/src/locales/ko/messages.json index 8e50ade96cd..8db205e66fa 100644 --- a/apps/desktop/src/locales/ko/messages.json +++ b/apps/desktop/src/locales/ko/messages.json @@ -2132,6 +2132,108 @@ "forwardedEmailDesc": { "message": "외부 포워딩 서비스를 사용해서 이메일 주소 별칭을 만들어보세요." }, + "forwarderError": { + "message": "$SERVICENAME$ error: $ERRORMESSAGE$", + "description": "Reports an error returned by a forwarding service to the user.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + }, + "errormessage": { + "content": "$2", + "example": "Invalid characters in domain name." + } + } + }, + "forwarderGeneratedBy": { + "message": "Generated by Bitwarden.", + "description": "Displayed with the address on the forwarding service's configuration screen." + }, + "forwarderGeneratedByWithWebsite": { + "message": "Website: $WEBSITE$. Generated by Bitwarden.", + "description": "Displayed with the address on the forwarding service's configuration screen.", + "placeholders": { + "WEBSITE": { + "content": "$1", + "example": "www.example.com" + } + } + }, + "forwaderInvalidToken": { + "message": "Invalid $SERVICENAME$ API token", + "description": "Displayed when the user's API token is empty or rejected by the forwarding service.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwaderInvalidTokenWithMessage": { + "message": "Invalid $SERVICENAME$ API token: $ERRORMESSAGE$", + "description": "Displayed when the user's API token is rejected by the forwarding service with an error message.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + }, + "errormessage": { + "content": "$2", + "example": "Please verify your email address to continue." + } + } + }, + "forwarderNoAccountId": { + "message": "Unable to obtain $SERVICENAME$ masked email account ID.", + "description": "Displayed when the forwarding service fails to return an account ID.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderNoDomain": { + "message": "Invalid $SERVICENAME$ domain.", + "description": "Displayed when the domain is empty or domain authorization failed at the forwarding service.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderNoUrl": { + "message": "Invalid $SERVICENAME$ url.", + "description": "Displayed when the url of the forwarding service wasn't supplied.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderUnknownError": { + "message": "Unknown $SERVICENAME$ error occurred.", + "description": "Displayed when the forwarding service failed due to an unknown error.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderUnknownForwarder": { + "message": "Unknown forwarder: '$SERVICENAME$'.", + "description": "Displayed when the forwarding service is not supported.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "JustTrust.us" + } + } + }, "hostname": { "message": "호스트 이름", "description": "Part of a URL." @@ -2720,5 +2822,39 @@ }, "errorAssigningTargetFolder": { "message": "Error assigning target folder." + }, + "viewItemsIn": { + "message": "View items in $NAME$", + "description": "Button to view the contents of a folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "backTo": { + "message": "Back to $NAME$", + "description": "Navigate back to a previous folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "back": { + "message": "Back", + "description": "Button text to navigate back" + }, + "removeItem": { + "message": "Remove $NAME$", + "description": "Remove a selected option, such as a folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } } } diff --git a/apps/desktop/src/locales/lt/messages.json b/apps/desktop/src/locales/lt/messages.json index e9de6970054..22f2ad8283c 100644 --- a/apps/desktop/src/locales/lt/messages.json +++ b/apps/desktop/src/locales/lt/messages.json @@ -2132,6 +2132,108 @@ "forwardedEmailDesc": { "message": "Sugeneruoti el. pašto slapyvardį su išorine persiuntimo paslauga." }, + "forwarderError": { + "message": "$SERVICENAME$ error: $ERRORMESSAGE$", + "description": "Reports an error returned by a forwarding service to the user.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + }, + "errormessage": { + "content": "$2", + "example": "Invalid characters in domain name." + } + } + }, + "forwarderGeneratedBy": { + "message": "Generated by Bitwarden.", + "description": "Displayed with the address on the forwarding service's configuration screen." + }, + "forwarderGeneratedByWithWebsite": { + "message": "Website: $WEBSITE$. Generated by Bitwarden.", + "description": "Displayed with the address on the forwarding service's configuration screen.", + "placeholders": { + "WEBSITE": { + "content": "$1", + "example": "www.example.com" + } + } + }, + "forwaderInvalidToken": { + "message": "Invalid $SERVICENAME$ API token", + "description": "Displayed when the user's API token is empty or rejected by the forwarding service.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwaderInvalidTokenWithMessage": { + "message": "Invalid $SERVICENAME$ API token: $ERRORMESSAGE$", + "description": "Displayed when the user's API token is rejected by the forwarding service with an error message.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + }, + "errormessage": { + "content": "$2", + "example": "Please verify your email address to continue." + } + } + }, + "forwarderNoAccountId": { + "message": "Unable to obtain $SERVICENAME$ masked email account ID.", + "description": "Displayed when the forwarding service fails to return an account ID.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderNoDomain": { + "message": "Invalid $SERVICENAME$ domain.", + "description": "Displayed when the domain is empty or domain authorization failed at the forwarding service.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderNoUrl": { + "message": "Invalid $SERVICENAME$ url.", + "description": "Displayed when the url of the forwarding service wasn't supplied.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderUnknownError": { + "message": "Unknown $SERVICENAME$ error occurred.", + "description": "Displayed when the forwarding service failed due to an unknown error.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderUnknownForwarder": { + "message": "Unknown forwarder: '$SERVICENAME$'.", + "description": "Displayed when the forwarding service is not supported.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "JustTrust.us" + } + } + }, "hostname": { "message": "Pagrindinio kompiuterio vardas", "description": "Part of a URL." @@ -2720,5 +2822,39 @@ }, "errorAssigningTargetFolder": { "message": "Error assigning target folder." + }, + "viewItemsIn": { + "message": "View items in $NAME$", + "description": "Button to view the contents of a folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "backTo": { + "message": "Back to $NAME$", + "description": "Navigate back to a previous folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "back": { + "message": "Back", + "description": "Button text to navigate back" + }, + "removeItem": { + "message": "Remove $NAME$", + "description": "Remove a selected option, such as a folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } } } diff --git a/apps/desktop/src/locales/lv/messages.json b/apps/desktop/src/locales/lv/messages.json index e2e068362e3..a1f810ee4af 100644 --- a/apps/desktop/src/locales/lv/messages.json +++ b/apps/desktop/src/locales/lv/messages.json @@ -2132,6 +2132,108 @@ "forwardedEmailDesc": { "message": "Izveidot e-pastu aizstājvārdu ar ārēju pārvirzīšanas pakalpojumu." }, + "forwarderError": { + "message": "$SERVICENAME$ kļūda: $ERRORMESSAGE$", + "description": "Reports an error returned by a forwarding service to the user.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + }, + "errormessage": { + "content": "$2", + "example": "Invalid characters in domain name." + } + } + }, + "forwarderGeneratedBy": { + "message": "Izveidoja Bitwarden.", + "description": "Displayed with the address on the forwarding service's configuration screen." + }, + "forwarderGeneratedByWithWebsite": { + "message": "Tīmekļvietne: $WEBSITE$. Izveidoja Bitwarden.", + "description": "Displayed with the address on the forwarding service's configuration screen.", + "placeholders": { + "WEBSITE": { + "content": "$1", + "example": "www.example.com" + } + } + }, + "forwaderInvalidToken": { + "message": "Nederīga $SERVICENAME$ API pilnvara", + "description": "Displayed when the user's API token is empty or rejected by the forwarding service.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwaderInvalidTokenWithMessage": { + "message": "Nederīga $SERVICENAME$ API pilnvara: $ERRORMESSAGE$", + "description": "Displayed when the user's API token is rejected by the forwarding service with an error message.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + }, + "errormessage": { + "content": "$2", + "example": "Please verify your email address to continue." + } + } + }, + "forwarderNoAccountId": { + "message": "Neizdevās iegūt $SERVICENAME$ aizsegta e-pasta konta Id.", + "description": "Displayed when the forwarding service fails to return an account ID.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderNoDomain": { + "message": "Nederīgs $SERVICENAME$ domēna vārds.", + "description": "Displayed when the domain is empty or domain authorization failed at the forwarding service.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderNoUrl": { + "message": "Nederīgs $SERVICENAME$ URL.", + "description": "Displayed when the url of the forwarding service wasn't supplied.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderUnknownError": { + "message": "Atgadījās nezināma $SERVICENAME$ kļūda.", + "description": "Displayed when the forwarding service failed due to an unknown error.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderUnknownForwarder": { + "message": "Nezināms pārsūtītājs: '$SERVICENAME$'.", + "description": "Displayed when the forwarding service is not supported.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "JustTrust.us" + } + } + }, "hostname": { "message": "Resursdatora nosaukums", "description": "Part of a URL." @@ -2720,5 +2822,39 @@ }, "errorAssigningTargetFolder": { "message": "Kļūda mērķa mapes piešķiršanā." + }, + "viewItemsIn": { + "message": "View items in $NAME$", + "description": "Button to view the contents of a folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "backTo": { + "message": "Back to $NAME$", + "description": "Navigate back to a previous folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "back": { + "message": "Back", + "description": "Button text to navigate back" + }, + "removeItem": { + "message": "Remove $NAME$", + "description": "Remove a selected option, such as a folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } } } diff --git a/apps/desktop/src/locales/me/messages.json b/apps/desktop/src/locales/me/messages.json index 1f49961b469..a4d6ff7026c 100644 --- a/apps/desktop/src/locales/me/messages.json +++ b/apps/desktop/src/locales/me/messages.json @@ -2132,6 +2132,108 @@ "forwardedEmailDesc": { "message": "Generate an email alias with an external forwarding service." }, + "forwarderError": { + "message": "$SERVICENAME$ error: $ERRORMESSAGE$", + "description": "Reports an error returned by a forwarding service to the user.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + }, + "errormessage": { + "content": "$2", + "example": "Invalid characters in domain name." + } + } + }, + "forwarderGeneratedBy": { + "message": "Generated by Bitwarden.", + "description": "Displayed with the address on the forwarding service's configuration screen." + }, + "forwarderGeneratedByWithWebsite": { + "message": "Website: $WEBSITE$. Generated by Bitwarden.", + "description": "Displayed with the address on the forwarding service's configuration screen.", + "placeholders": { + "WEBSITE": { + "content": "$1", + "example": "www.example.com" + } + } + }, + "forwaderInvalidToken": { + "message": "Invalid $SERVICENAME$ API token", + "description": "Displayed when the user's API token is empty or rejected by the forwarding service.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwaderInvalidTokenWithMessage": { + "message": "Invalid $SERVICENAME$ API token: $ERRORMESSAGE$", + "description": "Displayed when the user's API token is rejected by the forwarding service with an error message.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + }, + "errormessage": { + "content": "$2", + "example": "Please verify your email address to continue." + } + } + }, + "forwarderNoAccountId": { + "message": "Unable to obtain $SERVICENAME$ masked email account ID.", + "description": "Displayed when the forwarding service fails to return an account ID.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderNoDomain": { + "message": "Invalid $SERVICENAME$ domain.", + "description": "Displayed when the domain is empty or domain authorization failed at the forwarding service.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderNoUrl": { + "message": "Invalid $SERVICENAME$ url.", + "description": "Displayed when the url of the forwarding service wasn't supplied.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderUnknownError": { + "message": "Unknown $SERVICENAME$ error occurred.", + "description": "Displayed when the forwarding service failed due to an unknown error.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderUnknownForwarder": { + "message": "Unknown forwarder: '$SERVICENAME$'.", + "description": "Displayed when the forwarding service is not supported.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "JustTrust.us" + } + } + }, "hostname": { "message": "Hostname", "description": "Part of a URL." @@ -2720,5 +2822,39 @@ }, "errorAssigningTargetFolder": { "message": "Error assigning target folder." + }, + "viewItemsIn": { + "message": "View items in $NAME$", + "description": "Button to view the contents of a folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "backTo": { + "message": "Back to $NAME$", + "description": "Navigate back to a previous folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "back": { + "message": "Back", + "description": "Button text to navigate back" + }, + "removeItem": { + "message": "Remove $NAME$", + "description": "Remove a selected option, such as a folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } } } diff --git a/apps/desktop/src/locales/ml/messages.json b/apps/desktop/src/locales/ml/messages.json index 96811b9dba8..38ba942874e 100644 --- a/apps/desktop/src/locales/ml/messages.json +++ b/apps/desktop/src/locales/ml/messages.json @@ -2132,6 +2132,108 @@ "forwardedEmailDesc": { "message": "Generate an email alias with an external forwarding service." }, + "forwarderError": { + "message": "$SERVICENAME$ error: $ERRORMESSAGE$", + "description": "Reports an error returned by a forwarding service to the user.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + }, + "errormessage": { + "content": "$2", + "example": "Invalid characters in domain name." + } + } + }, + "forwarderGeneratedBy": { + "message": "Generated by Bitwarden.", + "description": "Displayed with the address on the forwarding service's configuration screen." + }, + "forwarderGeneratedByWithWebsite": { + "message": "Website: $WEBSITE$. Generated by Bitwarden.", + "description": "Displayed with the address on the forwarding service's configuration screen.", + "placeholders": { + "WEBSITE": { + "content": "$1", + "example": "www.example.com" + } + } + }, + "forwaderInvalidToken": { + "message": "Invalid $SERVICENAME$ API token", + "description": "Displayed when the user's API token is empty or rejected by the forwarding service.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwaderInvalidTokenWithMessage": { + "message": "Invalid $SERVICENAME$ API token: $ERRORMESSAGE$", + "description": "Displayed when the user's API token is rejected by the forwarding service with an error message.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + }, + "errormessage": { + "content": "$2", + "example": "Please verify your email address to continue." + } + } + }, + "forwarderNoAccountId": { + "message": "Unable to obtain $SERVICENAME$ masked email account ID.", + "description": "Displayed when the forwarding service fails to return an account ID.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderNoDomain": { + "message": "Invalid $SERVICENAME$ domain.", + "description": "Displayed when the domain is empty or domain authorization failed at the forwarding service.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderNoUrl": { + "message": "Invalid $SERVICENAME$ url.", + "description": "Displayed when the url of the forwarding service wasn't supplied.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderUnknownError": { + "message": "Unknown $SERVICENAME$ error occurred.", + "description": "Displayed when the forwarding service failed due to an unknown error.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderUnknownForwarder": { + "message": "Unknown forwarder: '$SERVICENAME$'.", + "description": "Displayed when the forwarding service is not supported.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "JustTrust.us" + } + } + }, "hostname": { "message": "Hostname", "description": "Part of a URL." @@ -2720,5 +2822,39 @@ }, "errorAssigningTargetFolder": { "message": "Error assigning target folder." + }, + "viewItemsIn": { + "message": "View items in $NAME$", + "description": "Button to view the contents of a folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "backTo": { + "message": "Back to $NAME$", + "description": "Navigate back to a previous folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "back": { + "message": "Back", + "description": "Button text to navigate back" + }, + "removeItem": { + "message": "Remove $NAME$", + "description": "Remove a selected option, such as a folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } } } diff --git a/apps/desktop/src/locales/mr/messages.json b/apps/desktop/src/locales/mr/messages.json index 889a2beeee0..d8cb372359c 100644 --- a/apps/desktop/src/locales/mr/messages.json +++ b/apps/desktop/src/locales/mr/messages.json @@ -2132,6 +2132,108 @@ "forwardedEmailDesc": { "message": "Generate an email alias with an external forwarding service." }, + "forwarderError": { + "message": "$SERVICENAME$ error: $ERRORMESSAGE$", + "description": "Reports an error returned by a forwarding service to the user.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + }, + "errormessage": { + "content": "$2", + "example": "Invalid characters in domain name." + } + } + }, + "forwarderGeneratedBy": { + "message": "Generated by Bitwarden.", + "description": "Displayed with the address on the forwarding service's configuration screen." + }, + "forwarderGeneratedByWithWebsite": { + "message": "Website: $WEBSITE$. Generated by Bitwarden.", + "description": "Displayed with the address on the forwarding service's configuration screen.", + "placeholders": { + "WEBSITE": { + "content": "$1", + "example": "www.example.com" + } + } + }, + "forwaderInvalidToken": { + "message": "Invalid $SERVICENAME$ API token", + "description": "Displayed when the user's API token is empty or rejected by the forwarding service.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwaderInvalidTokenWithMessage": { + "message": "Invalid $SERVICENAME$ API token: $ERRORMESSAGE$", + "description": "Displayed when the user's API token is rejected by the forwarding service with an error message.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + }, + "errormessage": { + "content": "$2", + "example": "Please verify your email address to continue." + } + } + }, + "forwarderNoAccountId": { + "message": "Unable to obtain $SERVICENAME$ masked email account ID.", + "description": "Displayed when the forwarding service fails to return an account ID.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderNoDomain": { + "message": "Invalid $SERVICENAME$ domain.", + "description": "Displayed when the domain is empty or domain authorization failed at the forwarding service.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderNoUrl": { + "message": "Invalid $SERVICENAME$ url.", + "description": "Displayed when the url of the forwarding service wasn't supplied.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderUnknownError": { + "message": "Unknown $SERVICENAME$ error occurred.", + "description": "Displayed when the forwarding service failed due to an unknown error.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderUnknownForwarder": { + "message": "Unknown forwarder: '$SERVICENAME$'.", + "description": "Displayed when the forwarding service is not supported.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "JustTrust.us" + } + } + }, "hostname": { "message": "Hostname", "description": "Part of a URL." @@ -2720,5 +2822,39 @@ }, "errorAssigningTargetFolder": { "message": "Error assigning target folder." + }, + "viewItemsIn": { + "message": "View items in $NAME$", + "description": "Button to view the contents of a folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "backTo": { + "message": "Back to $NAME$", + "description": "Navigate back to a previous folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "back": { + "message": "Back", + "description": "Button text to navigate back" + }, + "removeItem": { + "message": "Remove $NAME$", + "description": "Remove a selected option, such as a folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } } } diff --git a/apps/desktop/src/locales/my/messages.json b/apps/desktop/src/locales/my/messages.json index 0ee0db69ef2..78b62a34a0b 100644 --- a/apps/desktop/src/locales/my/messages.json +++ b/apps/desktop/src/locales/my/messages.json @@ -2132,6 +2132,108 @@ "forwardedEmailDesc": { "message": "Generate an email alias with an external forwarding service." }, + "forwarderError": { + "message": "$SERVICENAME$ error: $ERRORMESSAGE$", + "description": "Reports an error returned by a forwarding service to the user.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + }, + "errormessage": { + "content": "$2", + "example": "Invalid characters in domain name." + } + } + }, + "forwarderGeneratedBy": { + "message": "Generated by Bitwarden.", + "description": "Displayed with the address on the forwarding service's configuration screen." + }, + "forwarderGeneratedByWithWebsite": { + "message": "Website: $WEBSITE$. Generated by Bitwarden.", + "description": "Displayed with the address on the forwarding service's configuration screen.", + "placeholders": { + "WEBSITE": { + "content": "$1", + "example": "www.example.com" + } + } + }, + "forwaderInvalidToken": { + "message": "Invalid $SERVICENAME$ API token", + "description": "Displayed when the user's API token is empty or rejected by the forwarding service.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwaderInvalidTokenWithMessage": { + "message": "Invalid $SERVICENAME$ API token: $ERRORMESSAGE$", + "description": "Displayed when the user's API token is rejected by the forwarding service with an error message.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + }, + "errormessage": { + "content": "$2", + "example": "Please verify your email address to continue." + } + } + }, + "forwarderNoAccountId": { + "message": "Unable to obtain $SERVICENAME$ masked email account ID.", + "description": "Displayed when the forwarding service fails to return an account ID.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderNoDomain": { + "message": "Invalid $SERVICENAME$ domain.", + "description": "Displayed when the domain is empty or domain authorization failed at the forwarding service.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderNoUrl": { + "message": "Invalid $SERVICENAME$ url.", + "description": "Displayed when the url of the forwarding service wasn't supplied.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderUnknownError": { + "message": "Unknown $SERVICENAME$ error occurred.", + "description": "Displayed when the forwarding service failed due to an unknown error.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderUnknownForwarder": { + "message": "Unknown forwarder: '$SERVICENAME$'.", + "description": "Displayed when the forwarding service is not supported.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "JustTrust.us" + } + } + }, "hostname": { "message": "Hostname", "description": "Part of a URL." @@ -2720,5 +2822,39 @@ }, "errorAssigningTargetFolder": { "message": "Error assigning target folder." + }, + "viewItemsIn": { + "message": "View items in $NAME$", + "description": "Button to view the contents of a folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "backTo": { + "message": "Back to $NAME$", + "description": "Navigate back to a previous folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "back": { + "message": "Back", + "description": "Button text to navigate back" + }, + "removeItem": { + "message": "Remove $NAME$", + "description": "Remove a selected option, such as a folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } } } diff --git a/apps/desktop/src/locales/nb/messages.json b/apps/desktop/src/locales/nb/messages.json index 7bf132bdac1..6826acb6a8b 100644 --- a/apps/desktop/src/locales/nb/messages.json +++ b/apps/desktop/src/locales/nb/messages.json @@ -2132,6 +2132,108 @@ "forwardedEmailDesc": { "message": "Generer et e-postalias med en ekstern videresendingstjeneste." }, + "forwarderError": { + "message": "$SERVICENAME$ error: $ERRORMESSAGE$", + "description": "Reports an error returned by a forwarding service to the user.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + }, + "errormessage": { + "content": "$2", + "example": "Invalid characters in domain name." + } + } + }, + "forwarderGeneratedBy": { + "message": "Generated by Bitwarden.", + "description": "Displayed with the address on the forwarding service's configuration screen." + }, + "forwarderGeneratedByWithWebsite": { + "message": "Website: $WEBSITE$. Generated by Bitwarden.", + "description": "Displayed with the address on the forwarding service's configuration screen.", + "placeholders": { + "WEBSITE": { + "content": "$1", + "example": "www.example.com" + } + } + }, + "forwaderInvalidToken": { + "message": "Invalid $SERVICENAME$ API token", + "description": "Displayed when the user's API token is empty or rejected by the forwarding service.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwaderInvalidTokenWithMessage": { + "message": "Invalid $SERVICENAME$ API token: $ERRORMESSAGE$", + "description": "Displayed when the user's API token is rejected by the forwarding service with an error message.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + }, + "errormessage": { + "content": "$2", + "example": "Please verify your email address to continue." + } + } + }, + "forwarderNoAccountId": { + "message": "Unable to obtain $SERVICENAME$ masked email account ID.", + "description": "Displayed when the forwarding service fails to return an account ID.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderNoDomain": { + "message": "Invalid $SERVICENAME$ domain.", + "description": "Displayed when the domain is empty or domain authorization failed at the forwarding service.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderNoUrl": { + "message": "Invalid $SERVICENAME$ url.", + "description": "Displayed when the url of the forwarding service wasn't supplied.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderUnknownError": { + "message": "Unknown $SERVICENAME$ error occurred.", + "description": "Displayed when the forwarding service failed due to an unknown error.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderUnknownForwarder": { + "message": "Unknown forwarder: '$SERVICENAME$'.", + "description": "Displayed when the forwarding service is not supported.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "JustTrust.us" + } + } + }, "hostname": { "message": "Vertsnavn", "description": "Part of a URL." @@ -2720,5 +2822,39 @@ }, "errorAssigningTargetFolder": { "message": "Error assigning target folder." + }, + "viewItemsIn": { + "message": "View items in $NAME$", + "description": "Button to view the contents of a folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "backTo": { + "message": "Back to $NAME$", + "description": "Navigate back to a previous folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "back": { + "message": "Back", + "description": "Button text to navigate back" + }, + "removeItem": { + "message": "Remove $NAME$", + "description": "Remove a selected option, such as a folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } } } diff --git a/apps/desktop/src/locales/ne/messages.json b/apps/desktop/src/locales/ne/messages.json index 13e14668054..0f138a2c418 100644 --- a/apps/desktop/src/locales/ne/messages.json +++ b/apps/desktop/src/locales/ne/messages.json @@ -2132,6 +2132,108 @@ "forwardedEmailDesc": { "message": "Generate an email alias with an external forwarding service." }, + "forwarderError": { + "message": "$SERVICENAME$ error: $ERRORMESSAGE$", + "description": "Reports an error returned by a forwarding service to the user.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + }, + "errormessage": { + "content": "$2", + "example": "Invalid characters in domain name." + } + } + }, + "forwarderGeneratedBy": { + "message": "Generated by Bitwarden.", + "description": "Displayed with the address on the forwarding service's configuration screen." + }, + "forwarderGeneratedByWithWebsite": { + "message": "Website: $WEBSITE$. Generated by Bitwarden.", + "description": "Displayed with the address on the forwarding service's configuration screen.", + "placeholders": { + "WEBSITE": { + "content": "$1", + "example": "www.example.com" + } + } + }, + "forwaderInvalidToken": { + "message": "Invalid $SERVICENAME$ API token", + "description": "Displayed when the user's API token is empty or rejected by the forwarding service.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwaderInvalidTokenWithMessage": { + "message": "Invalid $SERVICENAME$ API token: $ERRORMESSAGE$", + "description": "Displayed when the user's API token is rejected by the forwarding service with an error message.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + }, + "errormessage": { + "content": "$2", + "example": "Please verify your email address to continue." + } + } + }, + "forwarderNoAccountId": { + "message": "Unable to obtain $SERVICENAME$ masked email account ID.", + "description": "Displayed when the forwarding service fails to return an account ID.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderNoDomain": { + "message": "Invalid $SERVICENAME$ domain.", + "description": "Displayed when the domain is empty or domain authorization failed at the forwarding service.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderNoUrl": { + "message": "Invalid $SERVICENAME$ url.", + "description": "Displayed when the url of the forwarding service wasn't supplied.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderUnknownError": { + "message": "Unknown $SERVICENAME$ error occurred.", + "description": "Displayed when the forwarding service failed due to an unknown error.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderUnknownForwarder": { + "message": "Unknown forwarder: '$SERVICENAME$'.", + "description": "Displayed when the forwarding service is not supported.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "JustTrust.us" + } + } + }, "hostname": { "message": "Hostname", "description": "Part of a URL." @@ -2720,5 +2822,39 @@ }, "errorAssigningTargetFolder": { "message": "Error assigning target folder." + }, + "viewItemsIn": { + "message": "View items in $NAME$", + "description": "Button to view the contents of a folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "backTo": { + "message": "Back to $NAME$", + "description": "Navigate back to a previous folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "back": { + "message": "Back", + "description": "Button text to navigate back" + }, + "removeItem": { + "message": "Remove $NAME$", + "description": "Remove a selected option, such as a folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } } } diff --git a/apps/desktop/src/locales/nl/messages.json b/apps/desktop/src/locales/nl/messages.json index f56572259ba..34f90d7c4f8 100644 --- a/apps/desktop/src/locales/nl/messages.json +++ b/apps/desktop/src/locales/nl/messages.json @@ -2132,6 +2132,108 @@ "forwardedEmailDesc": { "message": "Genereer een e-mailalias met een externe doorstuurservice." }, + "forwarderError": { + "message": "$SERVICENAME$ error: $ERRORMESSAGE$", + "description": "Reports an error returned by a forwarding service to the user.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + }, + "errormessage": { + "content": "$2", + "example": "Invalid characters in domain name." + } + } + }, + "forwarderGeneratedBy": { + "message": "Generated by Bitwarden.", + "description": "Displayed with the address on the forwarding service's configuration screen." + }, + "forwarderGeneratedByWithWebsite": { + "message": "Website: $WEBSITE$. Generated by Bitwarden.", + "description": "Displayed with the address on the forwarding service's configuration screen.", + "placeholders": { + "WEBSITE": { + "content": "$1", + "example": "www.example.com" + } + } + }, + "forwaderInvalidToken": { + "message": "Invalid $SERVICENAME$ API token", + "description": "Displayed when the user's API token is empty or rejected by the forwarding service.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwaderInvalidTokenWithMessage": { + "message": "Invalid $SERVICENAME$ API token: $ERRORMESSAGE$", + "description": "Displayed when the user's API token is rejected by the forwarding service with an error message.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + }, + "errormessage": { + "content": "$2", + "example": "Please verify your email address to continue." + } + } + }, + "forwarderNoAccountId": { + "message": "Unable to obtain $SERVICENAME$ masked email account ID.", + "description": "Displayed when the forwarding service fails to return an account ID.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderNoDomain": { + "message": "Invalid $SERVICENAME$ domain.", + "description": "Displayed when the domain is empty or domain authorization failed at the forwarding service.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderNoUrl": { + "message": "Invalid $SERVICENAME$ url.", + "description": "Displayed when the url of the forwarding service wasn't supplied.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderUnknownError": { + "message": "Unknown $SERVICENAME$ error occurred.", + "description": "Displayed when the forwarding service failed due to an unknown error.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderUnknownForwarder": { + "message": "Unknown forwarder: '$SERVICENAME$'.", + "description": "Displayed when the forwarding service is not supported.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "JustTrust.us" + } + } + }, "hostname": { "message": "Hostnaam", "description": "Part of a URL." @@ -2720,5 +2822,39 @@ }, "errorAssigningTargetFolder": { "message": "Fout bij toewijzen doelmap." + }, + "viewItemsIn": { + "message": "View items in $NAME$", + "description": "Button to view the contents of a folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "backTo": { + "message": "Back to $NAME$", + "description": "Navigate back to a previous folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "back": { + "message": "Back", + "description": "Button text to navigate back" + }, + "removeItem": { + "message": "Remove $NAME$", + "description": "Remove a selected option, such as a folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } } } diff --git a/apps/desktop/src/locales/nn/messages.json b/apps/desktop/src/locales/nn/messages.json index 35e7173d74a..6054b114c15 100644 --- a/apps/desktop/src/locales/nn/messages.json +++ b/apps/desktop/src/locales/nn/messages.json @@ -2132,6 +2132,108 @@ "forwardedEmailDesc": { "message": "Generate an email alias with an external forwarding service." }, + "forwarderError": { + "message": "$SERVICENAME$ error: $ERRORMESSAGE$", + "description": "Reports an error returned by a forwarding service to the user.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + }, + "errormessage": { + "content": "$2", + "example": "Invalid characters in domain name." + } + } + }, + "forwarderGeneratedBy": { + "message": "Generated by Bitwarden.", + "description": "Displayed with the address on the forwarding service's configuration screen." + }, + "forwarderGeneratedByWithWebsite": { + "message": "Website: $WEBSITE$. Generated by Bitwarden.", + "description": "Displayed with the address on the forwarding service's configuration screen.", + "placeholders": { + "WEBSITE": { + "content": "$1", + "example": "www.example.com" + } + } + }, + "forwaderInvalidToken": { + "message": "Invalid $SERVICENAME$ API token", + "description": "Displayed when the user's API token is empty or rejected by the forwarding service.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwaderInvalidTokenWithMessage": { + "message": "Invalid $SERVICENAME$ API token: $ERRORMESSAGE$", + "description": "Displayed when the user's API token is rejected by the forwarding service with an error message.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + }, + "errormessage": { + "content": "$2", + "example": "Please verify your email address to continue." + } + } + }, + "forwarderNoAccountId": { + "message": "Unable to obtain $SERVICENAME$ masked email account ID.", + "description": "Displayed when the forwarding service fails to return an account ID.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderNoDomain": { + "message": "Invalid $SERVICENAME$ domain.", + "description": "Displayed when the domain is empty or domain authorization failed at the forwarding service.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderNoUrl": { + "message": "Invalid $SERVICENAME$ url.", + "description": "Displayed when the url of the forwarding service wasn't supplied.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderUnknownError": { + "message": "Unknown $SERVICENAME$ error occurred.", + "description": "Displayed when the forwarding service failed due to an unknown error.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderUnknownForwarder": { + "message": "Unknown forwarder: '$SERVICENAME$'.", + "description": "Displayed when the forwarding service is not supported.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "JustTrust.us" + } + } + }, "hostname": { "message": "Hostname", "description": "Part of a URL." @@ -2720,5 +2822,39 @@ }, "errorAssigningTargetFolder": { "message": "Error assigning target folder." + }, + "viewItemsIn": { + "message": "View items in $NAME$", + "description": "Button to view the contents of a folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "backTo": { + "message": "Back to $NAME$", + "description": "Navigate back to a previous folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "back": { + "message": "Back", + "description": "Button text to navigate back" + }, + "removeItem": { + "message": "Remove $NAME$", + "description": "Remove a selected option, such as a folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } } } diff --git a/apps/desktop/src/locales/or/messages.json b/apps/desktop/src/locales/or/messages.json index cd83d2ea698..4b072a68897 100644 --- a/apps/desktop/src/locales/or/messages.json +++ b/apps/desktop/src/locales/or/messages.json @@ -2132,6 +2132,108 @@ "forwardedEmailDesc": { "message": "Generate an email alias with an external forwarding service." }, + "forwarderError": { + "message": "$SERVICENAME$ error: $ERRORMESSAGE$", + "description": "Reports an error returned by a forwarding service to the user.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + }, + "errormessage": { + "content": "$2", + "example": "Invalid characters in domain name." + } + } + }, + "forwarderGeneratedBy": { + "message": "Generated by Bitwarden.", + "description": "Displayed with the address on the forwarding service's configuration screen." + }, + "forwarderGeneratedByWithWebsite": { + "message": "Website: $WEBSITE$. Generated by Bitwarden.", + "description": "Displayed with the address on the forwarding service's configuration screen.", + "placeholders": { + "WEBSITE": { + "content": "$1", + "example": "www.example.com" + } + } + }, + "forwaderInvalidToken": { + "message": "Invalid $SERVICENAME$ API token", + "description": "Displayed when the user's API token is empty or rejected by the forwarding service.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwaderInvalidTokenWithMessage": { + "message": "Invalid $SERVICENAME$ API token: $ERRORMESSAGE$", + "description": "Displayed when the user's API token is rejected by the forwarding service with an error message.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + }, + "errormessage": { + "content": "$2", + "example": "Please verify your email address to continue." + } + } + }, + "forwarderNoAccountId": { + "message": "Unable to obtain $SERVICENAME$ masked email account ID.", + "description": "Displayed when the forwarding service fails to return an account ID.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderNoDomain": { + "message": "Invalid $SERVICENAME$ domain.", + "description": "Displayed when the domain is empty or domain authorization failed at the forwarding service.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderNoUrl": { + "message": "Invalid $SERVICENAME$ url.", + "description": "Displayed when the url of the forwarding service wasn't supplied.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderUnknownError": { + "message": "Unknown $SERVICENAME$ error occurred.", + "description": "Displayed when the forwarding service failed due to an unknown error.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderUnknownForwarder": { + "message": "Unknown forwarder: '$SERVICENAME$'.", + "description": "Displayed when the forwarding service is not supported.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "JustTrust.us" + } + } + }, "hostname": { "message": "Hostname", "description": "Part of a URL." @@ -2720,5 +2822,39 @@ }, "errorAssigningTargetFolder": { "message": "Error assigning target folder." + }, + "viewItemsIn": { + "message": "View items in $NAME$", + "description": "Button to view the contents of a folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "backTo": { + "message": "Back to $NAME$", + "description": "Navigate back to a previous folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "back": { + "message": "Back", + "description": "Button text to navigate back" + }, + "removeItem": { + "message": "Remove $NAME$", + "description": "Remove a selected option, such as a folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } } } diff --git a/apps/desktop/src/locales/pl/messages.json b/apps/desktop/src/locales/pl/messages.json index 250c557309c..6e624f28475 100644 --- a/apps/desktop/src/locales/pl/messages.json +++ b/apps/desktop/src/locales/pl/messages.json @@ -2132,6 +2132,108 @@ "forwardedEmailDesc": { "message": "Wygeneruj alias adresu e-mail z zewnętrznej usługi przekazywania." }, + "forwarderError": { + "message": "Błąd $SERVICENAME$: $ERRORMESSAGE$", + "description": "Reports an error returned by a forwarding service to the user.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + }, + "errormessage": { + "content": "$2", + "example": "Invalid characters in domain name." + } + } + }, + "forwarderGeneratedBy": { + "message": "Wygenerowane przez Bitwarden.", + "description": "Displayed with the address on the forwarding service's configuration screen." + }, + "forwarderGeneratedByWithWebsite": { + "message": "Strona internetowa: $WEBSITE$. Wygenerowano przez Bitwarden.", + "description": "Displayed with the address on the forwarding service's configuration screen.", + "placeholders": { + "WEBSITE": { + "content": "$1", + "example": "www.example.com" + } + } + }, + "forwaderInvalidToken": { + "message": "Nieprawidłowy token API dla $SERVICENAME$", + "description": "Displayed when the user's API token is empty or rejected by the forwarding service.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwaderInvalidTokenWithMessage": { + "message": "Nieprawidłowy token API dla $SERVICENAME$, błąd: $ERRORMESSAGE$", + "description": "Displayed when the user's API token is rejected by the forwarding service with an error message.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + }, + "errormessage": { + "content": "$2", + "example": "Please verify your email address to continue." + } + } + }, + "forwarderNoAccountId": { + "message": "Nie można uzyskać ID maskowanego konta e-mail dla $SERVICENAME$.", + "description": "Displayed when the forwarding service fails to return an account ID.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderNoDomain": { + "message": "Nieprawidłowa domena $SERVICENAME$.", + "description": "Displayed when the domain is empty or domain authorization failed at the forwarding service.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderNoUrl": { + "message": "Nieprawidłowy adres URL $SERVICENAME$.", + "description": "Displayed when the url of the forwarding service wasn't supplied.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderUnknownError": { + "message": "Wystąpił nieznany błąd w $SERVICENAME$.", + "description": "Displayed when the forwarding service failed due to an unknown error.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderUnknownForwarder": { + "message": "Nieznana usługa przekierowania: '$SERVICENAME$'.", + "description": "Displayed when the forwarding service is not supported.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "JustTrust.us" + } + } + }, "hostname": { "message": "Nazwa hosta", "description": "Part of a URL." @@ -2720,5 +2822,39 @@ }, "errorAssigningTargetFolder": { "message": "Wystąpił błąd podczas przypisywania folderu." + }, + "viewItemsIn": { + "message": "Zobacz elementy w $NAME$", + "description": "Button to view the contents of a folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "backTo": { + "message": "Wróć do $NAME$", + "description": "Navigate back to a previous folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "back": { + "message": "Powrót", + "description": "Button text to navigate back" + }, + "removeItem": { + "message": "Usuń $NAME$", + "description": "Remove a selected option, such as a folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } } } diff --git a/apps/desktop/src/locales/pt_BR/messages.json b/apps/desktop/src/locales/pt_BR/messages.json index 12db01d8cd1..ae58f54dd9c 100644 --- a/apps/desktop/src/locales/pt_BR/messages.json +++ b/apps/desktop/src/locales/pt_BR/messages.json @@ -2132,6 +2132,108 @@ "forwardedEmailDesc": { "message": "Gere um alias de e-mail com um serviço externo de encaminhamento." }, + "forwarderError": { + "message": "Erro $SERVICENAME$: $ERRORMESSAGE$", + "description": "Reports an error returned by a forwarding service to the user.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + }, + "errormessage": { + "content": "$2", + "example": "Invalid characters in domain name." + } + } + }, + "forwarderGeneratedBy": { + "message": "Gerado pelo Bitwarden.", + "description": "Displayed with the address on the forwarding service's configuration screen." + }, + "forwarderGeneratedByWithWebsite": { + "message": "Site: $WEBSITE$. Gerado pelo Bitwarden.", + "description": "Displayed with the address on the forwarding service's configuration screen.", + "placeholders": { + "WEBSITE": { + "content": "$1", + "example": "www.example.com" + } + } + }, + "forwaderInvalidToken": { + "message": "Token de API $SERVICENAME$ inválido", + "description": "Displayed when the user's API token is empty or rejected by the forwarding service.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwaderInvalidTokenWithMessage": { + "message": "Token de API $SERVICENAME$ inválido: $ERRORMESSAGE$", + "description": "Displayed when the user's API token is rejected by the forwarding service with an error message.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + }, + "errormessage": { + "content": "$2", + "example": "Please verify your email address to continue." + } + } + }, + "forwarderNoAccountId": { + "message": "Não foi possível obter a máscara do ID da conta de email $SERVICENAME$.", + "description": "Displayed when the forwarding service fails to return an account ID.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderNoDomain": { + "message": "Domínio $SERVICENAME$ inválido.", + "description": "Displayed when the domain is empty or domain authorization failed at the forwarding service.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderNoUrl": { + "message": "URL $SERVICENAME$ inválida.", + "description": "Displayed when the url of the forwarding service wasn't supplied.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderUnknownError": { + "message": "Ocorreu um erro $SERVICENAME$ desconhecido.", + "description": "Displayed when the forwarding service failed due to an unknown error.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderUnknownForwarder": { + "message": "Encaminhador desconhecido: '$SERVICENAME$'.", + "description": "Displayed when the forwarding service is not supported.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "JustTrust.us" + } + } + }, "hostname": { "message": "Nome do host", "description": "Part of a URL." @@ -2698,7 +2800,7 @@ "description": "Label indicating the most common import formats" }, "success": { - "message": "Success" + "message": "Sucesso" }, "troubleshooting": { "message": "Solução de problemas" @@ -2720,5 +2822,39 @@ }, "errorAssigningTargetFolder": { "message": "Erro ao atribuir pasta de destino." + }, + "viewItemsIn": { + "message": "View items in $NAME$", + "description": "Button to view the contents of a folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "backTo": { + "message": "Back to $NAME$", + "description": "Navigate back to a previous folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "back": { + "message": "Back", + "description": "Button text to navigate back" + }, + "removeItem": { + "message": "Remove $NAME$", + "description": "Remove a selected option, such as a folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } } } diff --git a/apps/desktop/src/locales/pt_PT/messages.json b/apps/desktop/src/locales/pt_PT/messages.json index 2535f5d8605..d57fc481d8c 100644 --- a/apps/desktop/src/locales/pt_PT/messages.json +++ b/apps/desktop/src/locales/pt_PT/messages.json @@ -2132,6 +2132,108 @@ "forwardedEmailDesc": { "message": "Gerar um alias de e-mail com um serviço de reencaminhamento externo." }, + "forwarderError": { + "message": "Erro no $SERVICENAME$: $ERRORMESSAGE$", + "description": "Reports an error returned by a forwarding service to the user.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + }, + "errormessage": { + "content": "$2", + "example": "Invalid characters in domain name." + } + } + }, + "forwarderGeneratedBy": { + "message": "Gerado pelo Bitwarden.", + "description": "Displayed with the address on the forwarding service's configuration screen." + }, + "forwarderGeneratedByWithWebsite": { + "message": "Site: $WEBSITE$. Gerado pelo Bitwarden.", + "description": "Displayed with the address on the forwarding service's configuration screen.", + "placeholders": { + "WEBSITE": { + "content": "$1", + "example": "www.example.com" + } + } + }, + "forwaderInvalidToken": { + "message": "Token da API de $SERVICENAME$ inválido", + "description": "Displayed when the user's API token is empty or rejected by the forwarding service.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwaderInvalidTokenWithMessage": { + "message": "Token da API de $SERVICENAME$ inválido: $ERRORMESSAGE$", + "description": "Displayed when the user's API token is rejected by the forwarding service with an error message.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + }, + "errormessage": { + "content": "$2", + "example": "Please verify your email address to continue." + } + } + }, + "forwarderNoAccountId": { + "message": "Não foi possível obter o ID da conta de e-mail mascarada de $SERVICENAME$.", + "description": "Displayed when the forwarding service fails to return an account ID.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderNoDomain": { + "message": "Domínio de $SERVICENAME$ inválido.", + "description": "Displayed when the domain is empty or domain authorization failed at the forwarding service.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderNoUrl": { + "message": "URL de $SERVICENAME$ inválido.", + "description": "Displayed when the url of the forwarding service wasn't supplied.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderUnknownError": { + "message": "Ocorreu um erro desconhecido de $SERVICENAME$.", + "description": "Displayed when the forwarding service failed due to an unknown error.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderUnknownForwarder": { + "message": "Reencaminhador desconhecido: '$SERVICENAME$'.", + "description": "Displayed when the forwarding service is not supported.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "JustTrust.us" + } + } + }, "hostname": { "message": "Nome de domínio", "description": "Part of a URL." @@ -2720,5 +2822,39 @@ }, "errorAssigningTargetFolder": { "message": "Erro ao atribuir a pasta de destino." + }, + "viewItemsIn": { + "message": "View items in $NAME$", + "description": "Button to view the contents of a folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "backTo": { + "message": "Back to $NAME$", + "description": "Navigate back to a previous folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "back": { + "message": "Back", + "description": "Button text to navigate back" + }, + "removeItem": { + "message": "Remove $NAME$", + "description": "Remove a selected option, such as a folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } } } diff --git a/apps/desktop/src/locales/ro/messages.json b/apps/desktop/src/locales/ro/messages.json index 978f57eb9b7..0a538593adb 100644 --- a/apps/desktop/src/locales/ro/messages.json +++ b/apps/desktop/src/locales/ro/messages.json @@ -2132,6 +2132,108 @@ "forwardedEmailDesc": { "message": "Generați un alias de e-mail cu un serviciu de redirecționare extern." }, + "forwarderError": { + "message": "$SERVICENAME$ error: $ERRORMESSAGE$", + "description": "Reports an error returned by a forwarding service to the user.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + }, + "errormessage": { + "content": "$2", + "example": "Invalid characters in domain name." + } + } + }, + "forwarderGeneratedBy": { + "message": "Generated by Bitwarden.", + "description": "Displayed with the address on the forwarding service's configuration screen." + }, + "forwarderGeneratedByWithWebsite": { + "message": "Website: $WEBSITE$. Generated by Bitwarden.", + "description": "Displayed with the address on the forwarding service's configuration screen.", + "placeholders": { + "WEBSITE": { + "content": "$1", + "example": "www.example.com" + } + } + }, + "forwaderInvalidToken": { + "message": "Invalid $SERVICENAME$ API token", + "description": "Displayed when the user's API token is empty or rejected by the forwarding service.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwaderInvalidTokenWithMessage": { + "message": "Invalid $SERVICENAME$ API token: $ERRORMESSAGE$", + "description": "Displayed when the user's API token is rejected by the forwarding service with an error message.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + }, + "errormessage": { + "content": "$2", + "example": "Please verify your email address to continue." + } + } + }, + "forwarderNoAccountId": { + "message": "Unable to obtain $SERVICENAME$ masked email account ID.", + "description": "Displayed when the forwarding service fails to return an account ID.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderNoDomain": { + "message": "Invalid $SERVICENAME$ domain.", + "description": "Displayed when the domain is empty or domain authorization failed at the forwarding service.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderNoUrl": { + "message": "Invalid $SERVICENAME$ url.", + "description": "Displayed when the url of the forwarding service wasn't supplied.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderUnknownError": { + "message": "Unknown $SERVICENAME$ error occurred.", + "description": "Displayed when the forwarding service failed due to an unknown error.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderUnknownForwarder": { + "message": "Unknown forwarder: '$SERVICENAME$'.", + "description": "Displayed when the forwarding service is not supported.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "JustTrust.us" + } + } + }, "hostname": { "message": "Nume gazdă", "description": "Part of a URL." @@ -2720,5 +2822,39 @@ }, "errorAssigningTargetFolder": { "message": "Error assigning target folder." + }, + "viewItemsIn": { + "message": "View items in $NAME$", + "description": "Button to view the contents of a folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "backTo": { + "message": "Back to $NAME$", + "description": "Navigate back to a previous folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "back": { + "message": "Back", + "description": "Button text to navigate back" + }, + "removeItem": { + "message": "Remove $NAME$", + "description": "Remove a selected option, such as a folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } } } diff --git a/apps/desktop/src/locales/ru/messages.json b/apps/desktop/src/locales/ru/messages.json index c9b3b95b39c..75f30af8931 100644 --- a/apps/desktop/src/locales/ru/messages.json +++ b/apps/desktop/src/locales/ru/messages.json @@ -2132,6 +2132,108 @@ "forwardedEmailDesc": { "message": "Создать псевдоним электронной почты для внешней службы пересылки." }, + "forwarderError": { + "message": "Ошибка $SERVICENAME$: $ERRORMESSAGE$", + "description": "Reports an error returned by a forwarding service to the user.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + }, + "errormessage": { + "content": "$2", + "example": "Invalid characters in domain name." + } + } + }, + "forwarderGeneratedBy": { + "message": "Создано Bitwarden.", + "description": "Displayed with the address on the forwarding service's configuration screen." + }, + "forwarderGeneratedByWithWebsite": { + "message": "Сайт: $WEBSITE$. Создано Bitwarden.", + "description": "Displayed with the address on the forwarding service's configuration screen.", + "placeholders": { + "WEBSITE": { + "content": "$1", + "example": "www.example.com" + } + } + }, + "forwaderInvalidToken": { + "message": "Неверный токен API $SERVICENAME$", + "description": "Displayed when the user's API token is empty or rejected by the forwarding service.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwaderInvalidTokenWithMessage": { + "message": "Неверный токен $SERVICENAME$ API: $ERRORMESSAGE$", + "description": "Displayed when the user's API token is rejected by the forwarding service with an error message.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + }, + "errormessage": { + "content": "$2", + "example": "Please verify your email address to continue." + } + } + }, + "forwarderNoAccountId": { + "message": "Не удалось получить скрытый идентификатор email аккаунта $SERVICENAME$.", + "description": "Displayed when the forwarding service fails to return an account ID.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderNoDomain": { + "message": "Недопустимый домен $SERVICENAME$.", + "description": "Displayed when the domain is empty or domain authorization failed at the forwarding service.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderNoUrl": { + "message": "Некорректный URL $SERVICENAME$.", + "description": "Displayed when the url of the forwarding service wasn't supplied.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderUnknownError": { + "message": "Произошла неизвестная ошибка $SERVICENAME$.", + "description": "Displayed when the forwarding service failed due to an unknown error.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderUnknownForwarder": { + "message": "Неизвестный форвардер: '$SERVICENAME$'.", + "description": "Displayed when the forwarding service is not supported.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "JustTrust.us" + } + } + }, "hostname": { "message": "Имя хоста", "description": "Part of a URL." @@ -2720,5 +2822,39 @@ }, "errorAssigningTargetFolder": { "message": "Ошибка при назначении целевой папки." + }, + "viewItemsIn": { + "message": "Просмотр элементов в $NAME$", + "description": "Button to view the contents of a folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "backTo": { + "message": "Вернуться к $NAME$", + "description": "Navigate back to a previous folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "back": { + "message": "Назад", + "description": "Button text to navigate back" + }, + "removeItem": { + "message": "Удалить $NAME$", + "description": "Remove a selected option, such as a folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } } } diff --git a/apps/desktop/src/locales/si/messages.json b/apps/desktop/src/locales/si/messages.json index 3d439971442..ab9f837c2f9 100644 --- a/apps/desktop/src/locales/si/messages.json +++ b/apps/desktop/src/locales/si/messages.json @@ -2132,6 +2132,108 @@ "forwardedEmailDesc": { "message": "Generate an email alias with an external forwarding service." }, + "forwarderError": { + "message": "$SERVICENAME$ error: $ERRORMESSAGE$", + "description": "Reports an error returned by a forwarding service to the user.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + }, + "errormessage": { + "content": "$2", + "example": "Invalid characters in domain name." + } + } + }, + "forwarderGeneratedBy": { + "message": "Generated by Bitwarden.", + "description": "Displayed with the address on the forwarding service's configuration screen." + }, + "forwarderGeneratedByWithWebsite": { + "message": "Website: $WEBSITE$. Generated by Bitwarden.", + "description": "Displayed with the address on the forwarding service's configuration screen.", + "placeholders": { + "WEBSITE": { + "content": "$1", + "example": "www.example.com" + } + } + }, + "forwaderInvalidToken": { + "message": "Invalid $SERVICENAME$ API token", + "description": "Displayed when the user's API token is empty or rejected by the forwarding service.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwaderInvalidTokenWithMessage": { + "message": "Invalid $SERVICENAME$ API token: $ERRORMESSAGE$", + "description": "Displayed when the user's API token is rejected by the forwarding service with an error message.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + }, + "errormessage": { + "content": "$2", + "example": "Please verify your email address to continue." + } + } + }, + "forwarderNoAccountId": { + "message": "Unable to obtain $SERVICENAME$ masked email account ID.", + "description": "Displayed when the forwarding service fails to return an account ID.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderNoDomain": { + "message": "Invalid $SERVICENAME$ domain.", + "description": "Displayed when the domain is empty or domain authorization failed at the forwarding service.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderNoUrl": { + "message": "Invalid $SERVICENAME$ url.", + "description": "Displayed when the url of the forwarding service wasn't supplied.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderUnknownError": { + "message": "Unknown $SERVICENAME$ error occurred.", + "description": "Displayed when the forwarding service failed due to an unknown error.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderUnknownForwarder": { + "message": "Unknown forwarder: '$SERVICENAME$'.", + "description": "Displayed when the forwarding service is not supported.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "JustTrust.us" + } + } + }, "hostname": { "message": "Hostname", "description": "Part of a URL." @@ -2720,5 +2822,39 @@ }, "errorAssigningTargetFolder": { "message": "Error assigning target folder." + }, + "viewItemsIn": { + "message": "View items in $NAME$", + "description": "Button to view the contents of a folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "backTo": { + "message": "Back to $NAME$", + "description": "Navigate back to a previous folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "back": { + "message": "Back", + "description": "Button text to navigate back" + }, + "removeItem": { + "message": "Remove $NAME$", + "description": "Remove a selected option, such as a folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } } } diff --git a/apps/desktop/src/locales/sk/messages.json b/apps/desktop/src/locales/sk/messages.json index 6499486b9d5..22e744f502e 100644 --- a/apps/desktop/src/locales/sk/messages.json +++ b/apps/desktop/src/locales/sk/messages.json @@ -2132,6 +2132,108 @@ "forwardedEmailDesc": { "message": "Vytvoriť e-mailový alias pomocou externej služby preposielania." }, + "forwarderError": { + "message": "$SERVICENAME$ error: $ERRORMESSAGE$", + "description": "Reports an error returned by a forwarding service to the user.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + }, + "errormessage": { + "content": "$2", + "example": "Invalid characters in domain name." + } + } + }, + "forwarderGeneratedBy": { + "message": "Generated by Bitwarden.", + "description": "Displayed with the address on the forwarding service's configuration screen." + }, + "forwarderGeneratedByWithWebsite": { + "message": "Website: $WEBSITE$. Generated by Bitwarden.", + "description": "Displayed with the address on the forwarding service's configuration screen.", + "placeholders": { + "WEBSITE": { + "content": "$1", + "example": "www.example.com" + } + } + }, + "forwaderInvalidToken": { + "message": "Invalid $SERVICENAME$ API token", + "description": "Displayed when the user's API token is empty or rejected by the forwarding service.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwaderInvalidTokenWithMessage": { + "message": "Invalid $SERVICENAME$ API token: $ERRORMESSAGE$", + "description": "Displayed when the user's API token is rejected by the forwarding service with an error message.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + }, + "errormessage": { + "content": "$2", + "example": "Please verify your email address to continue." + } + } + }, + "forwarderNoAccountId": { + "message": "Unable to obtain $SERVICENAME$ masked email account ID.", + "description": "Displayed when the forwarding service fails to return an account ID.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderNoDomain": { + "message": "Invalid $SERVICENAME$ domain.", + "description": "Displayed when the domain is empty or domain authorization failed at the forwarding service.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderNoUrl": { + "message": "Invalid $SERVICENAME$ url.", + "description": "Displayed when the url of the forwarding service wasn't supplied.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderUnknownError": { + "message": "Unknown $SERVICENAME$ error occurred.", + "description": "Displayed when the forwarding service failed due to an unknown error.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderUnknownForwarder": { + "message": "Unknown forwarder: '$SERVICENAME$'.", + "description": "Displayed when the forwarding service is not supported.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "JustTrust.us" + } + } + }, "hostname": { "message": "Názov hostiteľa", "description": "Part of a URL." @@ -2720,5 +2822,39 @@ }, "errorAssigningTargetFolder": { "message": "Chyba pri priraďovaní cieľového priečinka." + }, + "viewItemsIn": { + "message": "View items in $NAME$", + "description": "Button to view the contents of a folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "backTo": { + "message": "Back to $NAME$", + "description": "Navigate back to a previous folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "back": { + "message": "Back", + "description": "Button text to navigate back" + }, + "removeItem": { + "message": "Remove $NAME$", + "description": "Remove a selected option, such as a folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } } } diff --git a/apps/desktop/src/locales/sl/messages.json b/apps/desktop/src/locales/sl/messages.json index 8cb06dcf0ca..57f9dbf36a1 100644 --- a/apps/desktop/src/locales/sl/messages.json +++ b/apps/desktop/src/locales/sl/messages.json @@ -1414,10 +1414,10 @@ "message": "Preverite za Bitwarden." }, "unlockWithTouchId": { - "message": "Unlock with Touch ID" + "message": "Odkleni z biometriko" }, "additionalTouchIdSettings": { - "message": "Additional Touch ID settings" + "message": "Dodatne nastavitve za Touch ID" }, "touchIdConsentMessage": { "message": "odklenite vaš trezor" @@ -1426,10 +1426,10 @@ "message": "Ask for Windows Hello on app start" }, "autoPromptTouchId": { - "message": "Ask for Touch ID on app start" + "message": "Biometrično preverjanje ob zagonu aplikacije" }, "requirePasswordOnStart": { - "message": "Require password or PIN on app start" + "message": "Ob zagonu zahteva geslo ali PIN" }, "recommendedForSecurity": { "message": "Recommended for security." @@ -1499,7 +1499,7 @@ "message": "One or more organization policies are affecting your generator settings." }, "vaultTimeoutAction": { - "message": "Vault timeout action" + "message": "Dejanje po časovni omejitvi trezorja" }, "vaultTimeoutActionLockDesc": { "message": "Master password or other unlock method is required to access your vault again." @@ -1618,7 +1618,7 @@ "message": "Terms of Service and Privacy Policy have not been acknowledged." }, "enableBrowserIntegration": { - "message": "Allow browser integration" + "message": "Dovoli integracijo z brskalnikom" }, "enableBrowserIntegrationDesc": { "message": "Used for biometrics in browser." @@ -1630,7 +1630,7 @@ "message": "Use your Bitwarden vault when browsing with DuckDuckGo." }, "browserIntegrationUnsupportedTitle": { - "message": "Browser integration not supported" + "message": "Integracija z brskalnikom ni podprta" }, "browserIntegrationErrorTitle": { "message": "Error enabling browser integration" @@ -2132,6 +2132,108 @@ "forwardedEmailDesc": { "message": "Generate an email alias with an external forwarding service." }, + "forwarderError": { + "message": "$SERVICENAME$ error: $ERRORMESSAGE$", + "description": "Reports an error returned by a forwarding service to the user.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + }, + "errormessage": { + "content": "$2", + "example": "Invalid characters in domain name." + } + } + }, + "forwarderGeneratedBy": { + "message": "Generated by Bitwarden.", + "description": "Displayed with the address on the forwarding service's configuration screen." + }, + "forwarderGeneratedByWithWebsite": { + "message": "Website: $WEBSITE$. Generated by Bitwarden.", + "description": "Displayed with the address on the forwarding service's configuration screen.", + "placeholders": { + "WEBSITE": { + "content": "$1", + "example": "www.example.com" + } + } + }, + "forwaderInvalidToken": { + "message": "Invalid $SERVICENAME$ API token", + "description": "Displayed when the user's API token is empty or rejected by the forwarding service.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwaderInvalidTokenWithMessage": { + "message": "Invalid $SERVICENAME$ API token: $ERRORMESSAGE$", + "description": "Displayed when the user's API token is rejected by the forwarding service with an error message.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + }, + "errormessage": { + "content": "$2", + "example": "Please verify your email address to continue." + } + } + }, + "forwarderNoAccountId": { + "message": "Unable to obtain $SERVICENAME$ masked email account ID.", + "description": "Displayed when the forwarding service fails to return an account ID.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderNoDomain": { + "message": "Invalid $SERVICENAME$ domain.", + "description": "Displayed when the domain is empty or domain authorization failed at the forwarding service.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderNoUrl": { + "message": "Invalid $SERVICENAME$ url.", + "description": "Displayed when the url of the forwarding service wasn't supplied.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderUnknownError": { + "message": "Unknown $SERVICENAME$ error occurred.", + "description": "Displayed when the forwarding service failed due to an unknown error.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderUnknownForwarder": { + "message": "Unknown forwarder: '$SERVICENAME$'.", + "description": "Displayed when the forwarding service is not supported.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "JustTrust.us" + } + } + }, "hostname": { "message": "Hostname", "description": "Part of a URL." @@ -2237,7 +2339,7 @@ "message": "Deny login" }, "approveLoginRequests": { - "message": "Approve login requests" + "message": "Odobri zahtevke za prijavo" }, "logInConfirmedForEmailOnDevice": { "message": "Login confirmed for $EMAIL$ on $DEVICE$", @@ -2274,7 +2376,7 @@ "message": "This request is no longer valid." }, "approveLoginRequestDesc": { - "message": "Use this device to approve login requests made from other devices." + "message": "S to napravo odobri zahtevke za prijavo, ki pridejo z drugih naprav." }, "confirmLoginAtemptForMail": { "message": "Confirm login attempt for $EMAIL$", @@ -2720,5 +2822,39 @@ }, "errorAssigningTargetFolder": { "message": "Error assigning target folder." + }, + "viewItemsIn": { + "message": "View items in $NAME$", + "description": "Button to view the contents of a folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "backTo": { + "message": "Back to $NAME$", + "description": "Navigate back to a previous folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "back": { + "message": "Back", + "description": "Button text to navigate back" + }, + "removeItem": { + "message": "Remove $NAME$", + "description": "Remove a selected option, such as a folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } } } diff --git a/apps/desktop/src/locales/sr/messages.json b/apps/desktop/src/locales/sr/messages.json index f947d7dae7c..144c8e7bb69 100644 --- a/apps/desktop/src/locales/sr/messages.json +++ b/apps/desktop/src/locales/sr/messages.json @@ -2132,6 +2132,108 @@ "forwardedEmailDesc": { "message": "Генеришите псеудоним е-поште помоћу екстерне услуге прослеђивања." }, + "forwarderError": { + "message": "$SERVICENAME$ грешка: $ERRORMESSAGE$", + "description": "Reports an error returned by a forwarding service to the user.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + }, + "errormessage": { + "content": "$2", + "example": "Invalid characters in domain name." + } + } + }, + "forwarderGeneratedBy": { + "message": "Генерисао Bitwarden.", + "description": "Displayed with the address on the forwarding service's configuration screen." + }, + "forwarderGeneratedByWithWebsite": { + "message": "Вебсајт: $WEBSITE$. Генерисао Bitwarden.", + "description": "Displayed with the address on the forwarding service's configuration screen.", + "placeholders": { + "WEBSITE": { + "content": "$1", + "example": "www.example.com" + } + } + }, + "forwaderInvalidToken": { + "message": "Погрешан АПИ токен $SERVICENAME$", + "description": "Displayed when the user's API token is empty or rejected by the forwarding service.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwaderInvalidTokenWithMessage": { + "message": "Погрешан АПИ токен $SERVICENAME$: $ERRORMESSAGE$", + "description": "Displayed when the user's API token is rejected by the forwarding service with an error message.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + }, + "errormessage": { + "content": "$2", + "example": "Please verify your email address to continue." + } + } + }, + "forwarderNoAccountId": { + "message": "Није могуће добити ИД налога маскираног имејла $SERVICENAME$.", + "description": "Displayed when the forwarding service fails to return an account ID.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderNoDomain": { + "message": "Погрешан домен $SERVICENAME$.", + "description": "Displayed when the domain is empty or domain authorization failed at the forwarding service.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderNoUrl": { + "message": "Погрешан УРЛ $SERVICENAME$.", + "description": "Displayed when the url of the forwarding service wasn't supplied.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderUnknownError": { + "message": "Непозната грешка $SERVICENAME$-а.", + "description": "Displayed when the forwarding service failed due to an unknown error.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderUnknownForwarder": { + "message": "Непознати шпедитер: '$SERVICENAME$'.", + "description": "Displayed when the forwarding service is not supported.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "JustTrust.us" + } + } + }, "hostname": { "message": "Име домаћина", "description": "Part of a URL." @@ -2720,5 +2822,39 @@ }, "errorAssigningTargetFolder": { "message": "Грешка при додељивању циљне фасцикле." + }, + "viewItemsIn": { + "message": "View items in $NAME$", + "description": "Button to view the contents of a folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "backTo": { + "message": "Back to $NAME$", + "description": "Navigate back to a previous folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "back": { + "message": "Back", + "description": "Button text to navigate back" + }, + "removeItem": { + "message": "Remove $NAME$", + "description": "Remove a selected option, such as a folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } } } diff --git a/apps/desktop/src/locales/sv/messages.json b/apps/desktop/src/locales/sv/messages.json index bd21c0f328a..dfebac7e4ed 100644 --- a/apps/desktop/src/locales/sv/messages.json +++ b/apps/desktop/src/locales/sv/messages.json @@ -2132,6 +2132,108 @@ "forwardedEmailDesc": { "message": "Skapa ett e-postalias med en extern vidarebefordranstjänst." }, + "forwarderError": { + "message": "$SERVICENAME$-fel: $ERRORMESSAGE$", + "description": "Reports an error returned by a forwarding service to the user.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + }, + "errormessage": { + "content": "$2", + "example": "Invalid characters in domain name." + } + } + }, + "forwarderGeneratedBy": { + "message": "Generated by Bitwarden.", + "description": "Displayed with the address on the forwarding service's configuration screen." + }, + "forwarderGeneratedByWithWebsite": { + "message": "Website: $WEBSITE$. Generated by Bitwarden.", + "description": "Displayed with the address on the forwarding service's configuration screen.", + "placeholders": { + "WEBSITE": { + "content": "$1", + "example": "www.example.com" + } + } + }, + "forwaderInvalidToken": { + "message": "Invalid $SERVICENAME$ API token", + "description": "Displayed when the user's API token is empty or rejected by the forwarding service.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwaderInvalidTokenWithMessage": { + "message": "Invalid $SERVICENAME$ API token: $ERRORMESSAGE$", + "description": "Displayed when the user's API token is rejected by the forwarding service with an error message.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + }, + "errormessage": { + "content": "$2", + "example": "Please verify your email address to continue." + } + } + }, + "forwarderNoAccountId": { + "message": "Unable to obtain $SERVICENAME$ masked email account ID.", + "description": "Displayed when the forwarding service fails to return an account ID.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderNoDomain": { + "message": "Ogiltig $SERVICENAME$-domän.", + "description": "Displayed when the domain is empty or domain authorization failed at the forwarding service.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderNoUrl": { + "message": "Ogiltig $SERVICENAME$-URL.", + "description": "Displayed when the url of the forwarding service wasn't supplied.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderUnknownError": { + "message": "Unknown $SERVICENAME$ error occurred.", + "description": "Displayed when the forwarding service failed due to an unknown error.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderUnknownForwarder": { + "message": "Unknown forwarder: '$SERVICENAME$'.", + "description": "Displayed when the forwarding service is not supported.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "JustTrust.us" + } + } + }, "hostname": { "message": "Värdnamn", "description": "Part of a URL." @@ -2720,5 +2822,39 @@ }, "errorAssigningTargetFolder": { "message": "Error assigning target folder." + }, + "viewItemsIn": { + "message": "View items in $NAME$", + "description": "Button to view the contents of a folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "backTo": { + "message": "Back to $NAME$", + "description": "Navigate back to a previous folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "back": { + "message": "Back", + "description": "Button text to navigate back" + }, + "removeItem": { + "message": "Remove $NAME$", + "description": "Remove a selected option, such as a folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } } } diff --git a/apps/desktop/src/locales/te/messages.json b/apps/desktop/src/locales/te/messages.json index 889a2beeee0..d8cb372359c 100644 --- a/apps/desktop/src/locales/te/messages.json +++ b/apps/desktop/src/locales/te/messages.json @@ -2132,6 +2132,108 @@ "forwardedEmailDesc": { "message": "Generate an email alias with an external forwarding service." }, + "forwarderError": { + "message": "$SERVICENAME$ error: $ERRORMESSAGE$", + "description": "Reports an error returned by a forwarding service to the user.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + }, + "errormessage": { + "content": "$2", + "example": "Invalid characters in domain name." + } + } + }, + "forwarderGeneratedBy": { + "message": "Generated by Bitwarden.", + "description": "Displayed with the address on the forwarding service's configuration screen." + }, + "forwarderGeneratedByWithWebsite": { + "message": "Website: $WEBSITE$. Generated by Bitwarden.", + "description": "Displayed with the address on the forwarding service's configuration screen.", + "placeholders": { + "WEBSITE": { + "content": "$1", + "example": "www.example.com" + } + } + }, + "forwaderInvalidToken": { + "message": "Invalid $SERVICENAME$ API token", + "description": "Displayed when the user's API token is empty or rejected by the forwarding service.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwaderInvalidTokenWithMessage": { + "message": "Invalid $SERVICENAME$ API token: $ERRORMESSAGE$", + "description": "Displayed when the user's API token is rejected by the forwarding service with an error message.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + }, + "errormessage": { + "content": "$2", + "example": "Please verify your email address to continue." + } + } + }, + "forwarderNoAccountId": { + "message": "Unable to obtain $SERVICENAME$ masked email account ID.", + "description": "Displayed when the forwarding service fails to return an account ID.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderNoDomain": { + "message": "Invalid $SERVICENAME$ domain.", + "description": "Displayed when the domain is empty or domain authorization failed at the forwarding service.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderNoUrl": { + "message": "Invalid $SERVICENAME$ url.", + "description": "Displayed when the url of the forwarding service wasn't supplied.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderUnknownError": { + "message": "Unknown $SERVICENAME$ error occurred.", + "description": "Displayed when the forwarding service failed due to an unknown error.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderUnknownForwarder": { + "message": "Unknown forwarder: '$SERVICENAME$'.", + "description": "Displayed when the forwarding service is not supported.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "JustTrust.us" + } + } + }, "hostname": { "message": "Hostname", "description": "Part of a URL." @@ -2720,5 +2822,39 @@ }, "errorAssigningTargetFolder": { "message": "Error assigning target folder." + }, + "viewItemsIn": { + "message": "View items in $NAME$", + "description": "Button to view the contents of a folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "backTo": { + "message": "Back to $NAME$", + "description": "Navigate back to a previous folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "back": { + "message": "Back", + "description": "Button text to navigate back" + }, + "removeItem": { + "message": "Remove $NAME$", + "description": "Remove a selected option, such as a folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } } } diff --git a/apps/desktop/src/locales/th/messages.json b/apps/desktop/src/locales/th/messages.json index f1cd5351f7f..a89bd7518fb 100644 --- a/apps/desktop/src/locales/th/messages.json +++ b/apps/desktop/src/locales/th/messages.json @@ -2132,6 +2132,108 @@ "forwardedEmailDesc": { "message": "Generate an email alias with an external forwarding service." }, + "forwarderError": { + "message": "$SERVICENAME$ error: $ERRORMESSAGE$", + "description": "Reports an error returned by a forwarding service to the user.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + }, + "errormessage": { + "content": "$2", + "example": "Invalid characters in domain name." + } + } + }, + "forwarderGeneratedBy": { + "message": "Generated by Bitwarden.", + "description": "Displayed with the address on the forwarding service's configuration screen." + }, + "forwarderGeneratedByWithWebsite": { + "message": "Website: $WEBSITE$. Generated by Bitwarden.", + "description": "Displayed with the address on the forwarding service's configuration screen.", + "placeholders": { + "WEBSITE": { + "content": "$1", + "example": "www.example.com" + } + } + }, + "forwaderInvalidToken": { + "message": "Invalid $SERVICENAME$ API token", + "description": "Displayed when the user's API token is empty or rejected by the forwarding service.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwaderInvalidTokenWithMessage": { + "message": "Invalid $SERVICENAME$ API token: $ERRORMESSAGE$", + "description": "Displayed when the user's API token is rejected by the forwarding service with an error message.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + }, + "errormessage": { + "content": "$2", + "example": "Please verify your email address to continue." + } + } + }, + "forwarderNoAccountId": { + "message": "Unable to obtain $SERVICENAME$ masked email account ID.", + "description": "Displayed when the forwarding service fails to return an account ID.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderNoDomain": { + "message": "Invalid $SERVICENAME$ domain.", + "description": "Displayed when the domain is empty or domain authorization failed at the forwarding service.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderNoUrl": { + "message": "Invalid $SERVICENAME$ url.", + "description": "Displayed when the url of the forwarding service wasn't supplied.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderUnknownError": { + "message": "Unknown $SERVICENAME$ error occurred.", + "description": "Displayed when the forwarding service failed due to an unknown error.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderUnknownForwarder": { + "message": "Unknown forwarder: '$SERVICENAME$'.", + "description": "Displayed when the forwarding service is not supported.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "JustTrust.us" + } + } + }, "hostname": { "message": "Hostname", "description": "Part of a URL." @@ -2720,5 +2822,39 @@ }, "errorAssigningTargetFolder": { "message": "Error assigning target folder." + }, + "viewItemsIn": { + "message": "View items in $NAME$", + "description": "Button to view the contents of a folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "backTo": { + "message": "Back to $NAME$", + "description": "Navigate back to a previous folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "back": { + "message": "Back", + "description": "Button text to navigate back" + }, + "removeItem": { + "message": "Remove $NAME$", + "description": "Remove a selected option, such as a folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } } } diff --git a/apps/desktop/src/locales/tr/messages.json b/apps/desktop/src/locales/tr/messages.json index adeb293ccf1..73d2b6dc07d 100644 --- a/apps/desktop/src/locales/tr/messages.json +++ b/apps/desktop/src/locales/tr/messages.json @@ -2132,6 +2132,108 @@ "forwardedEmailDesc": { "message": "Harici bir yönlendirme servisiyle e-posta maskesi oluştur." }, + "forwarderError": { + "message": "$SERVICENAME$ hatası: $ERRORMESSAGE$", + "description": "Reports an error returned by a forwarding service to the user.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + }, + "errormessage": { + "content": "$2", + "example": "Invalid characters in domain name." + } + } + }, + "forwarderGeneratedBy": { + "message": "Bitwarden tarafından üretildi.", + "description": "Displayed with the address on the forwarding service's configuration screen." + }, + "forwarderGeneratedByWithWebsite": { + "message": "Web sitesi: $WEBSITE$. Bitwarden tarafından üretildi.", + "description": "Displayed with the address on the forwarding service's configuration screen.", + "placeholders": { + "WEBSITE": { + "content": "$1", + "example": "www.example.com" + } + } + }, + "forwaderInvalidToken": { + "message": "Invalid $SERVICENAME$ API token", + "description": "Displayed when the user's API token is empty or rejected by the forwarding service.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwaderInvalidTokenWithMessage": { + "message": "Invalid $SERVICENAME$ API token: $ERRORMESSAGE$", + "description": "Displayed when the user's API token is rejected by the forwarding service with an error message.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + }, + "errormessage": { + "content": "$2", + "example": "Please verify your email address to continue." + } + } + }, + "forwarderNoAccountId": { + "message": "Unable to obtain $SERVICENAME$ masked email account ID.", + "description": "Displayed when the forwarding service fails to return an account ID.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderNoDomain": { + "message": "Invalid $SERVICENAME$ domain.", + "description": "Displayed when the domain is empty or domain authorization failed at the forwarding service.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderNoUrl": { + "message": "Invalid $SERVICENAME$ url.", + "description": "Displayed when the url of the forwarding service wasn't supplied.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderUnknownError": { + "message": "Unknown $SERVICENAME$ error occurred.", + "description": "Displayed when the forwarding service failed due to an unknown error.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderUnknownForwarder": { + "message": "Unknown forwarder: '$SERVICENAME$'.", + "description": "Displayed when the forwarding service is not supported.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "JustTrust.us" + } + } + }, "hostname": { "message": "Sunucu", "description": "Part of a URL." @@ -2716,9 +2818,43 @@ "message": "Geçiş anahtarı kaldırıldı" }, "errorAssigningTargetCollection": { - "message": "Error assigning target collection." + "message": "Hedef koleksiyon atama hatası." }, "errorAssigningTargetFolder": { - "message": "Error assigning target folder." + "message": "Hedef klasör atama hatası." + }, + "viewItemsIn": { + "message": "View items in $NAME$", + "description": "Button to view the contents of a folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "backTo": { + "message": "Back to $NAME$", + "description": "Navigate back to a previous folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "back": { + "message": "Back", + "description": "Button text to navigate back" + }, + "removeItem": { + "message": "Remove $NAME$", + "description": "Remove a selected option, such as a folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } } } diff --git a/apps/desktop/src/locales/uk/messages.json b/apps/desktop/src/locales/uk/messages.json index 9ee76520933..dbc0911430d 100644 --- a/apps/desktop/src/locales/uk/messages.json +++ b/apps/desktop/src/locales/uk/messages.json @@ -2132,6 +2132,108 @@ "forwardedEmailDesc": { "message": "Згенеруйте псевдонім е-пошти зі стороннім сервісом пересилання." }, + "forwarderError": { + "message": "$SERVICENAME$ error: $ERRORMESSAGE$", + "description": "Reports an error returned by a forwarding service to the user.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + }, + "errormessage": { + "content": "$2", + "example": "Invalid characters in domain name." + } + } + }, + "forwarderGeneratedBy": { + "message": "Generated by Bitwarden.", + "description": "Displayed with the address on the forwarding service's configuration screen." + }, + "forwarderGeneratedByWithWebsite": { + "message": "Website: $WEBSITE$. Generated by Bitwarden.", + "description": "Displayed with the address on the forwarding service's configuration screen.", + "placeholders": { + "WEBSITE": { + "content": "$1", + "example": "www.example.com" + } + } + }, + "forwaderInvalidToken": { + "message": "Invalid $SERVICENAME$ API token", + "description": "Displayed when the user's API token is empty or rejected by the forwarding service.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwaderInvalidTokenWithMessage": { + "message": "Invalid $SERVICENAME$ API token: $ERRORMESSAGE$", + "description": "Displayed when the user's API token is rejected by the forwarding service with an error message.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + }, + "errormessage": { + "content": "$2", + "example": "Please verify your email address to continue." + } + } + }, + "forwarderNoAccountId": { + "message": "Unable to obtain $SERVICENAME$ masked email account ID.", + "description": "Displayed when the forwarding service fails to return an account ID.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderNoDomain": { + "message": "Invalid $SERVICENAME$ domain.", + "description": "Displayed when the domain is empty or domain authorization failed at the forwarding service.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderNoUrl": { + "message": "Invalid $SERVICENAME$ url.", + "description": "Displayed when the url of the forwarding service wasn't supplied.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderUnknownError": { + "message": "Unknown $SERVICENAME$ error occurred.", + "description": "Displayed when the forwarding service failed due to an unknown error.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderUnknownForwarder": { + "message": "Unknown forwarder: '$SERVICENAME$'.", + "description": "Displayed when the forwarding service is not supported.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "JustTrust.us" + } + } + }, "hostname": { "message": "Ім'я вузла", "description": "Part of a URL." @@ -2720,5 +2822,39 @@ }, "errorAssigningTargetFolder": { "message": "Помилка призначення цільової теки." + }, + "viewItemsIn": { + "message": "View items in $NAME$", + "description": "Button to view the contents of a folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "backTo": { + "message": "Back to $NAME$", + "description": "Navigate back to a previous folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "back": { + "message": "Back", + "description": "Button text to navigate back" + }, + "removeItem": { + "message": "Remove $NAME$", + "description": "Remove a selected option, such as a folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } } } diff --git a/apps/desktop/src/locales/vi/messages.json b/apps/desktop/src/locales/vi/messages.json index 0c0e6f6df73..bea273740f6 100644 --- a/apps/desktop/src/locales/vi/messages.json +++ b/apps/desktop/src/locales/vi/messages.json @@ -2132,6 +2132,108 @@ "forwardedEmailDesc": { "message": "Generate an email alias with an external forwarding service." }, + "forwarderError": { + "message": "$SERVICENAME$ error: $ERRORMESSAGE$", + "description": "Reports an error returned by a forwarding service to the user.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + }, + "errormessage": { + "content": "$2", + "example": "Invalid characters in domain name." + } + } + }, + "forwarderGeneratedBy": { + "message": "Generated by Bitwarden.", + "description": "Displayed with the address on the forwarding service's configuration screen." + }, + "forwarderGeneratedByWithWebsite": { + "message": "Website: $WEBSITE$. Generated by Bitwarden.", + "description": "Displayed with the address on the forwarding service's configuration screen.", + "placeholders": { + "WEBSITE": { + "content": "$1", + "example": "www.example.com" + } + } + }, + "forwaderInvalidToken": { + "message": "Invalid $SERVICENAME$ API token", + "description": "Displayed when the user's API token is empty or rejected by the forwarding service.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwaderInvalidTokenWithMessage": { + "message": "Invalid $SERVICENAME$ API token: $ERRORMESSAGE$", + "description": "Displayed when the user's API token is rejected by the forwarding service with an error message.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + }, + "errormessage": { + "content": "$2", + "example": "Please verify your email address to continue." + } + } + }, + "forwarderNoAccountId": { + "message": "Unable to obtain $SERVICENAME$ masked email account ID.", + "description": "Displayed when the forwarding service fails to return an account ID.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderNoDomain": { + "message": "Invalid $SERVICENAME$ domain.", + "description": "Displayed when the domain is empty or domain authorization failed at the forwarding service.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderNoUrl": { + "message": "Invalid $SERVICENAME$ url.", + "description": "Displayed when the url of the forwarding service wasn't supplied.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderUnknownError": { + "message": "Unknown $SERVICENAME$ error occurred.", + "description": "Displayed when the forwarding service failed due to an unknown error.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderUnknownForwarder": { + "message": "Unknown forwarder: '$SERVICENAME$'.", + "description": "Displayed when the forwarding service is not supported.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "JustTrust.us" + } + } + }, "hostname": { "message": "Hostname", "description": "Part of a URL." @@ -2720,5 +2822,39 @@ }, "errorAssigningTargetFolder": { "message": "Error assigning target folder." + }, + "viewItemsIn": { + "message": "View items in $NAME$", + "description": "Button to view the contents of a folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "backTo": { + "message": "Back to $NAME$", + "description": "Navigate back to a previous folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "back": { + "message": "Back", + "description": "Button text to navigate back" + }, + "removeItem": { + "message": "Remove $NAME$", + "description": "Remove a selected option, such as a folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } } } diff --git a/apps/desktop/src/locales/zh_CN/messages.json b/apps/desktop/src/locales/zh_CN/messages.json index aad13e06ef1..71993f6e7bd 100644 --- a/apps/desktop/src/locales/zh_CN/messages.json +++ b/apps/desktop/src/locales/zh_CN/messages.json @@ -1916,7 +1916,7 @@ "message": "无法完成生物识别。" }, "needADifferentMethod": { - "message": "使用其他方式?" + "message": "尝试其他方式吗?" }, "useMasterPassword": { "message": "使用主密码" @@ -2132,6 +2132,108 @@ "forwardedEmailDesc": { "message": "使用外部转发服务生成一个电子邮件别名。" }, + "forwarderError": { + "message": "$SERVICENAME$ 错误:$ERRORMESSAGE$", + "description": "Reports an error returned by a forwarding service to the user.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + }, + "errormessage": { + "content": "$2", + "example": "Invalid characters in domain name." + } + } + }, + "forwarderGeneratedBy": { + "message": "由 Bitwarden 生成。", + "description": "Displayed with the address on the forwarding service's configuration screen." + }, + "forwarderGeneratedByWithWebsite": { + "message": "网站:$WEBSITE$。由 Bitwarden 生成。", + "description": "Displayed with the address on the forwarding service's configuration screen.", + "placeholders": { + "WEBSITE": { + "content": "$1", + "example": "www.example.com" + } + } + }, + "forwaderInvalidToken": { + "message": "无效的 $SERVICENAME$ API 令牌", + "description": "Displayed when the user's API token is empty or rejected by the forwarding service.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwaderInvalidTokenWithMessage": { + "message": "无效的 $SERVICENAME$ API 令牌:$ERRORMESSAGE$", + "description": "Displayed when the user's API token is rejected by the forwarding service with an error message.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + }, + "errormessage": { + "content": "$2", + "example": "Please verify your email address to continue." + } + } + }, + "forwarderNoAccountId": { + "message": "Unable to obtain $SERVICENAME$ masked email account ID.", + "description": "Displayed when the forwarding service fails to return an account ID.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderNoDomain": { + "message": "无效的 $SERVICENAME$ 域名。", + "description": "Displayed when the domain is empty or domain authorization failed at the forwarding service.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderNoUrl": { + "message": "无效的 $SERVICENAME$ URL。", + "description": "Displayed when the url of the forwarding service wasn't supplied.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderUnknownError": { + "message": "发生未知的 $SERVICENAME$ 错误。", + "description": "Displayed when the forwarding service failed due to an unknown error.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderUnknownForwarder": { + "message": "未知的转发服务:$SERVICENAME$。", + "description": "Displayed when the forwarding service is not supported.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "JustTrust.us" + } + } + }, "hostname": { "message": "主机名", "description": "Part of a URL." @@ -2720,5 +2822,39 @@ }, "errorAssigningTargetFolder": { "message": "分配目标文件夹时出错。" + }, + "viewItemsIn": { + "message": "View items in $NAME$", + "description": "Button to view the contents of a folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "backTo": { + "message": "Back to $NAME$", + "description": "Navigate back to a previous folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "back": { + "message": "Back", + "description": "Button text to navigate back" + }, + "removeItem": { + "message": "Remove $NAME$", + "description": "Remove a selected option, such as a folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } } } diff --git a/apps/desktop/src/locales/zh_TW/messages.json b/apps/desktop/src/locales/zh_TW/messages.json index 5f768b0a43e..373875628a4 100644 --- a/apps/desktop/src/locales/zh_TW/messages.json +++ b/apps/desktop/src/locales/zh_TW/messages.json @@ -2132,6 +2132,108 @@ "forwardedEmailDesc": { "message": "使用外部轉寄服務產生一個電子郵件別名。" }, + "forwarderError": { + "message": "$SERVICENAME$ error: $ERRORMESSAGE$", + "description": "Reports an error returned by a forwarding service to the user.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + }, + "errormessage": { + "content": "$2", + "example": "Invalid characters in domain name." + } + } + }, + "forwarderGeneratedBy": { + "message": "Generated by Bitwarden.", + "description": "Displayed with the address on the forwarding service's configuration screen." + }, + "forwarderGeneratedByWithWebsite": { + "message": "Website: $WEBSITE$. Generated by Bitwarden.", + "description": "Displayed with the address on the forwarding service's configuration screen.", + "placeholders": { + "WEBSITE": { + "content": "$1", + "example": "www.example.com" + } + } + }, + "forwaderInvalidToken": { + "message": "Invalid $SERVICENAME$ API token", + "description": "Displayed when the user's API token is empty or rejected by the forwarding service.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwaderInvalidTokenWithMessage": { + "message": "Invalid $SERVICENAME$ API token: $ERRORMESSAGE$", + "description": "Displayed when the user's API token is rejected by the forwarding service with an error message.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + }, + "errormessage": { + "content": "$2", + "example": "Please verify your email address to continue." + } + } + }, + "forwarderNoAccountId": { + "message": "Unable to obtain $SERVICENAME$ masked email account ID.", + "description": "Displayed when the forwarding service fails to return an account ID.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderNoDomain": { + "message": "Invalid $SERVICENAME$ domain.", + "description": "Displayed when the domain is empty or domain authorization failed at the forwarding service.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderNoUrl": { + "message": "Invalid $SERVICENAME$ url.", + "description": "Displayed when the url of the forwarding service wasn't supplied.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderUnknownError": { + "message": "Unknown $SERVICENAME$ error occurred.", + "description": "Displayed when the forwarding service failed due to an unknown error.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderUnknownForwarder": { + "message": "Unknown forwarder: '$SERVICENAME$'.", + "description": "Displayed when the forwarding service is not supported.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "JustTrust.us" + } + } + }, "hostname": { "message": "主機名稱", "description": "Part of a URL." @@ -2720,5 +2822,39 @@ }, "errorAssigningTargetFolder": { "message": "Error assigning target folder." + }, + "viewItemsIn": { + "message": "View items in $NAME$", + "description": "Button to view the contents of a folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "backTo": { + "message": "Back to $NAME$", + "description": "Navigate back to a previous folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "back": { + "message": "Back", + "description": "Button text to navigate back" + }, + "removeItem": { + "message": "Remove $NAME$", + "description": "Remove a selected option, such as a folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } } } diff --git a/apps/desktop/src/main.ts b/apps/desktop/src/main.ts index d11fceeacc9..63d6e062a1e 100644 --- a/apps/desktop/src/main.ts +++ b/apps/desktop/src/main.ts @@ -119,9 +119,6 @@ export class Main { this.logService = new ElectronLogMainService(null, app.getPath("userData")); const storageDefaults: any = {}; - // Default vault timeout to "on restart", and action to "lock" - storageDefaults["global.vaultTimeout"] = -1; - storageDefaults["global.vaultTimeoutAction"] = "lock"; this.storageService = new ElectronStorageService(app.getPath("userData"), storageDefaults); this.memoryStorageService = new MemoryStorageService(); this.memoryStorageForStateProviders = new MemoryStorageServiceForStateProviders(); diff --git a/apps/desktop/src/scss/misc.scss b/apps/desktop/src/scss/misc.scss index 8ed6a9b54be..ccc0af8fa4a 100644 --- a/apps/desktop/src/scss/misc.scss +++ b/apps/desktop/src/scss/misc.scss @@ -577,6 +577,17 @@ app-vault-view .box-footer { user-select: auto; } +/* override for vault icon in desktop */ +app-vault-icon > div { + display: flex; + justify-content: center; + align-items: center; + float: left; + height: 36px; + width: 34px; + margin-left: -5px; +} + /* tweak for inconsistent line heights in cipher view */ .box-footer button, .box-footer a { diff --git a/apps/desktop/src/services/native-message-handler.service.ts b/apps/desktop/src/services/native-message-handler.service.ts index ebe1ee62484..c50593768d0 100644 --- a/apps/desktop/src/services/native-message-handler.service.ts +++ b/apps/desktop/src/services/native-message-handler.service.ts @@ -24,6 +24,7 @@ import { EncryptedMessageHandlerService } from "./encrypted-message-handler.serv const EncryptionAlgorithm = "sha1"; +// This service handles messages using the protocol created for the DuckDuckGo integration. @Injectable() export class NativeMessageHandlerService { private ddgSharedSecret: SymmetricCryptoKey; diff --git a/apps/desktop/src/services/native-messaging.service.ts b/apps/desktop/src/services/native-messaging.service.ts index 48bdc600476..9abd3b635ad 100644 --- a/apps/desktop/src/services/native-messaging.service.ts +++ b/apps/desktop/src/services/native-messaging.service.ts @@ -1,8 +1,10 @@ import { Injectable, NgZone } from "@angular/core"; -import { firstValueFrom } from "rxjs"; +import { firstValueFrom, map } from "rxjs"; import { AccountService } from "@bitwarden/common/auth/abstractions/account.service"; +import { AuthService } from "@bitwarden/common/auth/abstractions/auth.service"; import { MasterPasswordServiceAbstraction } from "@bitwarden/common/auth/abstractions/master-password.service.abstraction"; +import { AuthenticationStatus } from "@bitwarden/common/auth/enums/authentication-status"; import { CryptoFunctionService } from "@bitwarden/common/platform/abstractions/crypto-function.service"; import { CryptoService } from "@bitwarden/common/platform/abstractions/crypto.service"; import { LogService } from "@bitwarden/common/platform/abstractions/log.service"; @@ -43,6 +45,7 @@ export class NativeMessagingService { private nativeMessageHandler: NativeMessageHandlerService, private dialogService: DialogService, private accountService: AccountService, + private authService: AuthService, private ngZone: NgZone, ) {} @@ -53,6 +56,7 @@ export class NativeMessagingService { private async messageHandler(msg: LegacyMessageWrapper | Message) { const outerMessage = msg as Message; if (outerMessage.version) { + // If there is a version, it is a using the protocol created for the DuckDuckGo integration await this.nativeMessageHandler.handleMessage(outerMessage); return; } @@ -137,6 +141,19 @@ export class NativeMessagingService { return this.send({ command: "biometricUnlock", response: "not supported" }, appId); } + const userId = + (message.userId as UserId) ?? + (await firstValueFrom(this.accountService.activeAccount$.pipe(map((a) => a?.id)))); + + if (userId == null) { + return this.send({ command: "biometricUnlock", response: "not unlocked" }, appId); + } + + const authStatus = await firstValueFrom(this.authService.authStatusFor$(userId)); + if (authStatus !== AuthenticationStatus.Unlocked) { + return this.send({ command: "biometricUnlock", response: "not unlocked" }, appId); + } + const biometricUnlockPromise = message.userId == null ? firstValueFrom(this.biometricStateService.biometricUnlockEnabled$) diff --git a/apps/desktop/src/vault/app/vault/add-edit.component.ts b/apps/desktop/src/vault/app/vault/add-edit.component.ts index 86e0b881eef..d7fd3947953 100644 --- a/apps/desktop/src/vault/app/vault/add-edit.component.ts +++ b/apps/desktop/src/vault/app/vault/add-edit.component.ts @@ -7,13 +7,13 @@ import { AuditService } from "@bitwarden/common/abstractions/audit.service"; import { EventCollectionService } from "@bitwarden/common/abstractions/event/event-collection.service"; import { OrganizationService } from "@bitwarden/common/admin-console/abstractions/organization/organization.service.abstraction"; import { PolicyService } from "@bitwarden/common/admin-console/abstractions/policy/policy.service.abstraction"; +import { AccountService } from "@bitwarden/common/auth/abstractions/account.service"; import { BroadcasterService } from "@bitwarden/common/platform/abstractions/broadcaster.service"; import { ConfigService } from "@bitwarden/common/platform/abstractions/config/config.service"; import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; import { LogService } from "@bitwarden/common/platform/abstractions/log.service"; import { MessagingService } from "@bitwarden/common/platform/abstractions/messaging.service"; import { PlatformUtilsService } from "@bitwarden/common/platform/abstractions/platform-utils.service"; -import { StateService } from "@bitwarden/common/platform/abstractions/state.service"; import { SendApiService } from "@bitwarden/common/tools/send/services/send-api.service.abstraction"; import { CipherService } from "@bitwarden/common/vault/abstractions/cipher.service"; import { CollectionService } from "@bitwarden/common/vault/abstractions/collection.service"; @@ -36,7 +36,7 @@ export class AddEditComponent extends BaseAddEditComponent implements OnChanges, i18nService: I18nService, platformUtilsService: PlatformUtilsService, auditService: AuditService, - stateService: StateService, + accountService: AccountService, collectionService: CollectionService, messagingService: MessagingService, eventCollectionService: EventCollectionService, @@ -57,7 +57,7 @@ export class AddEditComponent extends BaseAddEditComponent implements OnChanges, i18nService, platformUtilsService, auditService, - stateService, + accountService, collectionService, messagingService, eventCollectionService, diff --git a/apps/desktop/tailwind.config.js b/apps/desktop/tailwind.config.js index affbddf2b2d..be5c9ce4d96 100644 --- a/apps/desktop/tailwind.config.js +++ b/apps/desktop/tailwind.config.js @@ -1,6 +1,10 @@ /* eslint-disable no-undef, @typescript-eslint/no-var-requires */ const config = require("../../libs/components/tailwind.config.base"); -config.content = ["./src/**/*.{html,ts}", "../../libs/components/src/**/*.{html,ts}"]; +config.content = [ + "./src/**/*.{html,ts}", + "../../libs/components/src/**/*.{html,ts}", + "../../libs/angular/src/**/*.{html,ts}", +]; module.exports = config; diff --git a/apps/web/src/app/admin-console/common/base.events.component.ts b/apps/web/src/app/admin-console/common/base.events.component.ts index 7af7c3e70d2..e14bb62a35d 100644 --- a/apps/web/src/app/admin-console/common/base.events.component.ts +++ b/apps/web/src/app/admin-console/common/base.events.component.ts @@ -1,4 +1,5 @@ import { Directive } from "@angular/core"; +import { FormControl, FormGroup } from "@angular/forms"; import { EventResponse } from "@bitwarden/common/models/response/event.response"; import { ListResponse } from "@bitwarden/common/models/response/list.response"; @@ -16,16 +17,16 @@ export abstract class BaseEventsComponent { loading = true; loaded = false; events: EventView[]; - start: string; - end: string; dirtyDates = true; continuationToken: string; - refreshPromise: Promise; - exportPromise: Promise; - morePromise: Promise; abstract readonly exportFileName: string; + protected eventsForm = new FormGroup({ + start: new FormControl(null), + end: new FormControl(null), + }); + constructor( protected eventService: EventService, protected i18nService: I18nService, @@ -39,8 +40,32 @@ export abstract class BaseEventsComponent { this.end = defaultDates[1]; } - async exportEvents() { - if (this.appApiPromiseUnfulfilled() || this.dirtyDates) { + get start(): string { + return this.eventsForm.value.start; + } + + set start(val: string) { + this.eventsForm.get("start").setValue(val); + } + + get end(): string { + return this.eventsForm.value.end; + } + + set end(val: string) { + this.eventsForm.get("end").setValue(val); + } + + loadMoreEvents = async () => { + await this.loadEvents(false); + }; + + refreshEvents = async () => { + await this.loadEvents(true); + }; + + exportEvents = async () => { + if (this.dirtyDates) { return; } @@ -51,23 +76,19 @@ export abstract class BaseEventsComponent { return; } + let promise: Promise; try { - this.exportPromise = this.export(dates[0], dates[1]); - - await this.exportPromise; + promise = this.export(dates[0], dates[1]); + await promise; } catch (e) { this.logService.error(`Handled exception: ${e}`); } - this.exportPromise = null; + promise = null; this.loading = false; - } - - async loadEvents(clearExisting: boolean) { - if (this.appApiPromiseUnfulfilled()) { - return; - } + }; + loadEvents = async (clearExisting: boolean) => { const dates = this.parseDates(); if (dates == null) { return; @@ -75,17 +96,14 @@ export abstract class BaseEventsComponent { this.loading = true; let events: EventView[] = []; + let promise: Promise; try { - const promise = this.loadAndParseEvents( + promise = this.loadAndParseEvents( dates[0], dates[1], clearExisting ? null : this.continuationToken, ); - if (clearExisting) { - this.refreshPromise = promise; - } else { - this.morePromise = promise; - } + const result = await promise; this.continuationToken = result.continuationToken; events = result.events; @@ -101,9 +119,8 @@ export abstract class BaseEventsComponent { this.dirtyDates = false; this.loading = false; - this.morePromise = null; - this.refreshPromise = null; - } + promise = null; + }; protected abstract requestEvents( startDate: string, @@ -161,10 +178,6 @@ export abstract class BaseEventsComponent { return dates; } - protected appApiPromiseUnfulfilled() { - return this.refreshPromise != null || this.morePromise != null || this.exportPromise != null; - } - private async export(start: string, end: string) { let continuationToken = this.continuationToken; let events = [].concat(this.events); diff --git a/apps/web/src/app/admin-console/common/base.people.component.ts b/apps/web/src/app/admin-console/common/base.people.component.ts index fbb9faf5694..0dad7ab7b13 100644 --- a/apps/web/src/app/admin-console/common/base.people.component.ts +++ b/apps/web/src/app/admin-console/common/base.people.component.ts @@ -1,5 +1,6 @@ -import { Directive, OnDestroy, OnInit, ViewChild, ViewContainerRef } from "@angular/core"; -import { BehaviorSubject, Subject, firstValueFrom, from, switchMap, takeUntil } from "rxjs"; +import { Directive, ViewChild, ViewContainerRef } from "@angular/core"; +import { FormControl } from "@angular/forms"; +import { firstValueFrom, concatMap, map, lastValueFrom, startWith, debounceTime } from "rxjs"; import { SearchPipe } from "@bitwarden/angular/pipes/search.pipe"; import { UserNamePipe } from "@bitwarden/angular/pipes/user-name.pipe"; @@ -32,10 +33,8 @@ const MaxCheckedCount = 500; @Directive() export abstract class BasePeopleComponent< - UserType extends ProviderUserUserDetailsResponse | OrganizationUserView, - > - implements OnInit, OnDestroy -{ + UserType extends ProviderUserUserDetailsResponse | OrganizationUserView, +> { @ViewChild("confirmTemplate", { read: ViewContainerRef, static: true }) confirmModalRef: ViewContainerRef; @@ -98,19 +97,22 @@ export abstract class BasePeopleComponent< protected didScroll = false; protected pageSize = 100; - protected destroy$ = new Subject(); + protected searchControl = new FormControl("", { nonNullable: true }); + protected isSearching$ = this.searchControl.valueChanges.pipe( + debounceTime(500), + concatMap((searchText) => this.searchService.isSearchable(searchText)), + startWith(false), + ); + protected isPaging$ = this.isSearching$.pipe( + map((isSearching) => { + if (isSearching && this.didScroll) { + this.resetPaging(); + } + return !isSearching && this.users && this.users.length > this.pageSize; + }), + ); private pagedUsersCount = 0; - private _searchText$ = new BehaviorSubject(""); - private isSearching: boolean = false; - - get searchText() { - return this._searchText$.value; - } - - set searchText(value: string) { - this._searchText$.next(value); - } constructor( protected apiService: ApiService, @@ -135,22 +137,6 @@ export abstract class BasePeopleComponent< abstract reinviteUser(id: string): Promise; abstract confirmUser(user: UserType, publicKey: Uint8Array): Promise; - ngOnInit(): void { - this._searchText$ - .pipe( - switchMap((searchText) => from(this.searchService.isSearchable(searchText))), - takeUntil(this.destroy$), - ) - .subscribe((isSearchable) => { - this.isSearching = isSearchable; - }); - } - - ngOnDestroy(): void { - this.destroy$.next(); - this.destroy$.complete(); - } - async load() { const response = await this.getUsers(); this.statusMap.clear(); @@ -194,8 +180,6 @@ export abstract class BasePeopleComponent< } // Reset checkbox selecton this.selectAll(false); - // FIXME: Verify that this floating promise is intentional. If it is, add an explanatory comment and ensure there is proper error handling. - // eslint-disable-next-line @typescript-eslint/no-floating-promises this.resetPaging(); } @@ -228,7 +212,7 @@ export abstract class BasePeopleComponent< const filteredUsers = this.searchPipe.transform( this.users, - this.searchText, + this.searchControl.value, "name", "email", "id", @@ -241,7 +225,7 @@ export abstract class BasePeopleComponent< } } - async resetPaging() { + resetPaging() { this.pagedUsers = []; this.loadMore(); } @@ -385,25 +369,16 @@ export abstract class BasePeopleComponent< this.organizationManagementPreferencesService.autoConfirmFingerPrints.state$, ); if (autoConfirm == null || !autoConfirm) { - const [modal] = await this.modalService.openViewRef( - UserConfirmComponent, - this.confirmModalRef, - (comp) => { - comp.name = this.userNamePipe.transform(user); - comp.userId = user != null ? user.userId : null; - comp.publicKey = publicKey; - // eslint-disable-next-line rxjs/no-async-subscribe - comp.onConfirmedUser.subscribe(async () => { - try { - comp.formPromise = confirmUser(publicKey); - await comp.formPromise; - modal.close(); - } catch (e) { - this.logService.error(e); - } - }); + const dialogRef = UserConfirmComponent.open(this.dialogService, { + data: { + name: this.userNamePipe.transform(user), + userId: user != null ? user.userId : null, + publicKey: publicKey, + confirmUser: () => confirmUser(publicKey), }, - ); + }); + await lastValueFrom(dialogRef.closed); + return; } @@ -419,16 +394,6 @@ export abstract class BasePeopleComponent< } } - isPaging() { - const searching = this.isSearching; - if (searching && this.didScroll) { - // FIXME: Verify that this floating promise is intentional. If it is, add an explanatory comment and ensure there is proper error handling. - // eslint-disable-next-line @typescript-eslint/no-floating-promises - this.resetPaging(); - } - return !searching && this.users && this.users.length > this.pageSize; - } - protected revokeWarningMessage(): string { return this.i18nService.t("revokeUserConfirmation"); } @@ -441,8 +406,6 @@ export abstract class BasePeopleComponent< let index = this.users.indexOf(user); if (index > -1) { this.users.splice(index, 1); - // FIXME: Verify that this floating promise is intentional. If it is, add an explanatory comment and ensure there is proper error handling. - // eslint-disable-next-line @typescript-eslint/no-floating-promises this.resetPaging(); } diff --git a/apps/web/src/app/admin-console/organizations/guards/is-paid-org.guard.ts b/apps/web/src/app/admin-console/organizations/guards/is-paid-org.guard.ts index f6968daca9f..aaf24e48346 100644 --- a/apps/web/src/app/admin-console/organizations/guards/is-paid-org.guard.ts +++ b/apps/web/src/app/admin-console/organizations/guards/is-paid-org.guard.ts @@ -27,15 +27,26 @@ export class IsPaidOrgGuard implements CanActivate { // Users without billing permission can't access billing if (!org.canEditSubscription) { await this.dialogService.openSimpleDialog({ - title: { key: "upgradeOrganization" }, - content: { key: "notAvailableForFreeOrganization" }, + title: { key: "upgradeOrganizationCloseSecurityGaps" }, + content: { key: "upgradeOrganizationCloseSecurityGapsDesc" }, acceptButtonText: { key: "ok" }, cancelButtonText: null, type: "info", }); return false; } else { - this.messagingService.send("upgradeOrganization", { organizationId: org.id }); + const upgradeConfirmed = await this.dialogService.openSimpleDialog({ + title: { key: "upgradeOrganizationCloseSecurityGaps" }, + content: { key: "upgradeOrganizationCloseSecurityGapsDesc" }, + acceptButtonText: { key: "upgradeOrganization" }, + type: "info", + icon: "bwi-arrow-circle-up", + }); + if (upgradeConfirmed) { + await this.router.navigate(["organizations", org.id, "billing", "subscription"], { + queryParams: { upgrade: true }, + }); + } } } diff --git a/apps/web/src/app/admin-console/organizations/layouts/organization-layout.component.html b/apps/web/src/app/admin-console/organizations/layouts/organization-layout.component.html index 2b3be149749..d1a48a78e11 100644 --- a/apps/web/src/app/admin-console/organizations/layouts/organization-layout.component.html +++ b/apps/web/src/app/admin-console/organizations/layouts/organization-layout.component.html @@ -1,5 +1,9 @@ -