diff --git a/.github/renovate.json5 b/.github/renovate.json5 index a0826039bb8..b9de0084c25 100644 --- a/.github/renovate.json5 +++ b/.github/renovate.json5 @@ -123,6 +123,7 @@ matchPackageNames: [ "@emotion/css", "@webcomponents/custom-elements", + "bytes", "concurrently", "cross-env", "del", diff --git a/.github/workflows/build-browser.yml b/.github/workflows/build-browser.yml index b9a26f68eeb..4748a6a9f15 100644 --- a/.github/workflows/build-browser.yml +++ b/.github/workflows/build-browser.yml @@ -200,10 +200,14 @@ jobs: npm_command: "dist:edge" archive_name: "dist-edge.zip" artifact_name: "dist-edge-MV3" + - name: "firefox" + npm_command: "dist:firefox" + archive_name: "dist-firefox.zip" + artifact_name: "dist-firefox" - name: "firefox-mv3" npm_command: "dist:firefox:mv3" archive_name: "dist-firefox.zip" - artifact_name: "dist-firefox-MV3" + artifact_name: "DO-NOT-USE-FOR-PROD-dist-firefox-MV3" - name: "opera-mv3" npm_command: "dist:opera:mv3" archive_name: "dist-opera.zip" diff --git a/.github/workflows/build-cli.yml b/.github/workflows/build-cli.yml index cfbd53505af..8599a699d9d 100644 --- a/.github/workflows/build-cli.yml +++ b/.github/workflows/build-cli.yml @@ -205,6 +205,9 @@ jobs: with: ref: ${{ github.event.pull_request.head.sha }} + - name: Install AST + run: dotnet tool install --global AzureSignTool --version 4.0.1 + - name: Setup Windows builder run: | choco install checksum --no-progress @@ -273,6 +276,24 @@ jobs: ResourceHacker -open version-info.rc -save version-info.res -action compile ResourceHacker -open %WIN_PKG_BUILT% -save %WIN_PKG_BUILT% -action addoverwrite -resource version-info.res + - name: Login to Azure + if: ${{ needs.setup.outputs.has_secrets == 'true' }} + uses: Azure/login@e15b166166a8746d1a47596803bd8c1b595455cf # v1.6.0 + with: + creds: ${{ secrets.AZURE_KV_CI_SERVICE_PRINCIPAL }} + + - name: Retrieve secrets + id: retrieve-secrets + if: ${{ needs.setup.outputs.has_secrets == 'true' }} + uses: bitwarden/gh-actions/get-keyvault-secrets@main + with: + keyvault: "bitwarden-ci" + secrets: "code-signing-vault-url, + code-signing-client-id, + code-signing-tenant-id, + code-signing-client-secret, + code-signing-cert-name" + - name: Install run: npm ci working-directory: ./ @@ -300,6 +321,18 @@ jobs: - name: Build & Package Windows run: npm run dist:${{ matrix.license_type.build_prefix }}:win --quiet + - name: Sign executable + if: ${{ needs.setup.outputs.has_secrets == 'true' }} + shell: pwsh + env: + SIGNING_VAULT_URL: ${{ steps.retrieve-secrets.outputs.code-signing-vault-url }} + SIGNING_CLIENT_ID: ${{ steps.retrieve-secrets.outputs.code-signing-client-id }} + SIGNING_TENANT_ID: ${{ steps.retrieve-secrets.outputs.code-signing-tenant-id }} + SIGNING_CLIENT_SECRET: ${{ steps.retrieve-secrets.outputs.code-signing-client-secret }} + SIGNING_CERT_NAME: ${{ steps.retrieve-secrets.outputs.code-signing-cert-name }} + EXE_PATH: dist/${{ matrix.license_type.build_prefix }}/windows/bw.exe + run: . .\scripts\sign-cli.ps1 + - name: Package Chocolatey shell: pwsh if: ${{ matrix.license_type.build_prefix == 'bit' }} diff --git a/.github/workflows/build-desktop.yml b/.github/workflows/build-desktop.yml index 23722e7c7df..c65366c7796 100644 --- a/.github/workflows/build-desktop.yml +++ b/.github/workflows/build-desktop.yml @@ -392,8 +392,7 @@ jobs: run: node build.js cross-platform - name: Build - run: | - npm run build + run: npm run build - name: Pack if: ${{ needs.setup.outputs.has_secrets == 'false' }} diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 8c214b99ed3..c41fcfa3afd 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -152,7 +152,7 @@ jobs: uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 - name: Install rust - uses: dtolnay/rust-toolchain@a54c7afa936fefeb4456b2dd8068152669aa8203 # stable + uses: dtolnay/rust-toolchain@c5a29ddb4d9d194e7c84ec8c3fba61b1c31fee8c # stable with: toolchain: stable components: llvm-tools diff --git a/apps/browser/package.json b/apps/browser/package.json index 69f6bb2f89f..21784167b9e 100644 --- a/apps/browser/package.json +++ b/apps/browser/package.json @@ -5,7 +5,7 @@ "build": "npm run build:chrome", "build:chrome": "cross-env BROWSER=chrome MANIFEST_VERSION=3 NODE_OPTIONS=\"--max-old-space-size=8192\" webpack", "build:edge": "cross-env BROWSER=edge MANIFEST_VERSION=3 NODE_OPTIONS=\"--max-old-space-size=8192\" webpack", - "build:firefox": "cross-env BROWSER=firefox MANIFEST_VERSION=3 NODE_OPTIONS=\"--max-old-space-size=8192\" webpack", + "build:firefox": "cross-env BROWSER=firefox NODE_OPTIONS=\"--max-old-space-size=8192\" webpack", "build:opera": "cross-env BROWSER=opera MANIFEST_VERSION=3 NODE_OPTIONS=\"--max-old-space-size=8192\" webpack", "build:safari": "cross-env BROWSER=safari NODE_OPTIONS=\"--max-old-space-size=8192\" webpack", "build:watch": "npm run build:watch:chrome", diff --git a/apps/browser/src/_locales/ar/messages.json b/apps/browser/src/_locales/ar/messages.json index c8197b36e73..36c0ef40579 100644 --- a/apps/browser/src/_locales/ar/messages.json +++ b/apps/browser/src/_locales/ar/messages.json @@ -80,6 +80,15 @@ "masterPassHint": { "message": "تلميح كلمة المرور الرئيسية (إختياري)" }, + "passwordStrengthScore": { + "message": "Password strength score $SCORE$", + "placeholders": { + "score": { + "content": "$1", + "example": "4" + } + } + }, "joinOrganization": { "message": "انضم إلى المنظمة" }, @@ -876,6 +885,21 @@ "logInToBitwarden": { "message": "تسجيل الدخول إلى Bitwarden" }, + "enterTheCodeSentToYourEmail": { + "message": "Enter the code sent to your email" + }, + "enterTheCodeFromYourAuthenticatorApp": { + "message": "Enter the code from your authenticator app" + }, + "pressYourYubiKeyToAuthenticate": { + "message": "Press your YubiKey to authenticate" + }, + "duoTwoFactorRequiredPageSubtitle": { + "message": "Duo two-step login is required for your account. Follow the steps below to finish logging in." + }, + "followTheStepsBelowToFinishLoggingIn": { + "message": "Follow the steps below to finish logging in." + }, "restartRegistration": { "message": "إعادة التسجيل" }, @@ -1365,12 +1389,22 @@ "rememberMe": { "message": "تذكرني" }, + "dontAskAgainOnThisDeviceFor30Days": { + "message": "Don't ask again on this device for 30 days" + }, "sendVerificationCodeEmailAgain": { "message": "إرسال رمز التحقق إلى البريد الإلكتروني مرة أخرى" }, "useAnotherTwoStepMethod": { "message": "استخدام طريقة أخرى لتسجيل الدخول بخطوتين" }, + "selectAnotherMethod": { + "message": "Select another method", + "description": "Select another two-step login method" + }, + "useYourRecoveryCode": { + "message": "Use your recovery code" + }, "insertYubiKey": { "message": "أدخل YubiKey الخاص بك في منفذ USB في كمبيوترك، ثم المس الزر." }, @@ -1383,9 +1417,18 @@ "webAuthnNewTabOpen": { "message": "فتح علامة تبويب جديدة" }, + "openInNewTab": { + "message": "Open in new tab" + }, "webAuthnAuthenticate": { "message": "مصادقة WebAuthn" }, + "readSecurityKey": { + "message": "Read security key" + }, + "awaitingSecurityKeyInteraction": { + "message": "Awaiting security key interaction..." + }, "loginUnavailable": { "message": "تسجيل الدخول غير متاح" }, @@ -1398,6 +1441,9 @@ "twoStepOptions": { "message": "خيارات تسجيل الدخول بخطوتين" }, + "selectTwoStepLoginMethod": { + "message": "Select two-step login method" + }, "recoveryCodeDesc": { "message": "هل تفقد الوصول إلى جميع مزودي التحقق بعاملين؟ استخدم رمز الاسترداد الخاص بك لتعطيل جميع مزودي التحقق بعاملين من حسابك." }, @@ -2097,6 +2143,15 @@ "vaultTimeoutAction1": { "message": "Timeout action" }, + "newCustomizationOptionsCalloutTitle": { + "message": "New customization options" + }, + "newCustomizationOptionsCalloutContent": { + "message": "Customize your vault experience with quick copy actions, compact mode, and more!" + }, + "newCustomizationOptionsCalloutLink": { + "message": "View all Appearance settings" + }, "lock": { "message": "قفل", "description": "Verb form: to make secure or inaccessible by" @@ -2391,8 +2446,17 @@ "atRiskPasswords": { "message": "At-risk passwords" }, - "atRiskPasswordsDescSingleOrg": { - "message": "$ORGANIZATION$ is requesting you change the $COUNT$ passwords because they are at risk.", + "atRiskPasswordDescSingleOrg": { + "message": "$ORGANIZATION$ is requesting you change one password because it is at-risk.", + "placeholders": { + "organization": { + "content": "$1", + "example": "Acme Corp" + } + } + }, + "atRiskPasswordsDescSingleOrgPlural": { + "message": "$ORGANIZATION$ is requesting you change the $COUNT$ passwords because they are at-risk.", "placeholders": { "organization": { "content": "$1", @@ -2404,8 +2468,8 @@ } } }, - "atRiskPasswordsDescMultiOrg": { - "message": "Your organizations are requesting you change the $COUNT$ passwords because they are at risk.", + "atRiskPasswordsDescMultiOrgPlural": { + "message": "Your organizations are requesting you change the $COUNT$ passwords because they are at-risk.", "placeholders": { "count": { "content": "$1", @@ -2431,6 +2495,36 @@ "changeAtRiskPasswordsFasterDesc": { "message": "Update your settings so you can quickly autofill your passwords and generate new ones" }, + "reviewAtRiskLogins": { + "message": "Review at-risk logins" + }, + "reviewAtRiskPasswords": { + "message": "Review at-risk passwords" + }, + "reviewAtRiskLoginsSlideDesc": { + "message": "Your organization passwords are at-risk because they are weak, reused, and/or exposed.", + "description": "Description of the review at-risk login slide on the at-risk password page carousel" + }, + "reviewAtRiskLoginSlideImgAlt": { + "message": "Illustration of a list of logins that are at-risk" + }, + "generatePasswordSlideDesc": { + "message": "Quickly generate a strong, unique password with the Bitwarden autofill menu on the at-risk site.", + "description": "Description of the generate password slide on the at-risk password page carousel" + }, + "generatePasswordSlideImgAlt": { + "message": "Illustration of the Bitwarden autofill menu displaying a generated password" + }, + "updateInBitwarden": { + "message": "Update in Bitwarden" + }, + "updateInBitwardenSlideDesc": { + "message": "Bitwarden will then prompt you to update the password in the password manager.", + "description": "Description of the update in Bitwarden slide on the at-risk password page carousel" + }, + "updateInBitwardenSlideImgAlt": { + "message": "Illustration of a Bitwarden’s notification prompting the user to update the login" + }, "turnOnAutofill": { "message": "Turn on autofill" }, @@ -4181,6 +4275,20 @@ } } }, + "copyFieldValue": { + "message": "Copy $FIELD$, $VALUE$", + "description": "Title for a button that copies a field value to the clipboard.", + "placeholders": { + "field": { + "content": "$1", + "example": "Username" + }, + "value": { + "content": "$2", + "example": "Foo" + } + } + }, "noValuesToCopy": { "message": "No values to copy" }, diff --git a/apps/browser/src/_locales/az/messages.json b/apps/browser/src/_locales/az/messages.json index 75946a57dc2..5b9975cb5b9 100644 --- a/apps/browser/src/_locales/az/messages.json +++ b/apps/browser/src/_locales/az/messages.json @@ -80,6 +80,15 @@ "masterPassHint": { "message": "Ana parol ipucu (ixtiyari)" }, + "passwordStrengthScore": { + "message": "Parolun güc xalı: $SCORE$", + "placeholders": { + "score": { + "content": "$1", + "example": "4" + } + } + }, "joinOrganization": { "message": "Təşkilata qoşul" }, @@ -876,6 +885,21 @@ "logInToBitwarden": { "message": "Bitwarden-ə giriş edin" }, + "enterTheCodeSentToYourEmail": { + "message": "E-poçtunuza göndərilən kodu daxil edin" + }, + "enterTheCodeFromYourAuthenticatorApp": { + "message": "Kimlik doğrulayıcı tətbiqinizdəki kodu daxil edin" + }, + "pressYourYubiKeyToAuthenticate": { + "message": "Kimliyi doğrulamaq üçün YubiKey-inizə basın" + }, + "duoTwoFactorRequiredPageSubtitle": { + "message": "Hesabınız üçün Duo iki addımlı giriş tələb olunur. Giriş prosesini tamamlamaq üçün aşağıdakı addımları izləyin." + }, + "followTheStepsBelowToFinishLoggingIn": { + "message": "Giriş prosesini tamamlamaq üçün aşağıdakı addımları izləyin." + }, "restartRegistration": { "message": "Qeydiyyatı yenidən başlat" }, @@ -1365,12 +1389,22 @@ "rememberMe": { "message": "Məni xatırla" }, + "dontAskAgainOnThisDeviceFor30Days": { + "message": "Bu cihazda 30 gün ərzində soruşulmasın" + }, "sendVerificationCodeEmailAgain": { "message": "Doğrulama kodu olan e-poçtu yenidən göndər" }, "useAnotherTwoStepMethod": { "message": "Başqa bir iki addımlı giriş üsulu istifadə edin" }, + "selectAnotherMethod": { + "message": "Başqa üsul seçin", + "description": "Select another two-step login method" + }, + "useYourRecoveryCode": { + "message": "Geri qaytarma kodunuzu istifadə edin" + }, "insertYubiKey": { "message": "\"YubiKey\"i kompüterinizin USB portuna taxın, daha sonra düyməsinə toxunun." }, @@ -1383,9 +1417,18 @@ "webAuthnNewTabOpen": { "message": "Yeni vərəq aç" }, + "openInNewTab": { + "message": "Yeni vərəqdə aç" + }, "webAuthnAuthenticate": { "message": "WebAuthn kimlik doğrulama" }, + "readSecurityKey": { + "message": "Güvənlik açarını oxu" + }, + "awaitingSecurityKeyInteraction": { + "message": "Güvənlik açarı ilə əlaqə gözlənilir..." + }, "loginUnavailable": { "message": "Giriş edilə bilmir" }, @@ -1398,6 +1441,9 @@ "twoStepOptions": { "message": "İki addımlı giriş seçimləri" }, + "selectTwoStepLoginMethod": { + "message": "İki addımlı giriş üsulunu seçin" + }, "recoveryCodeDesc": { "message": "İki faktorlu provayderlərinə müraciəti itirmisiniz? Geri qaytarma kodunuzu istifadə edərək hesabınızdakı bütün iki faktorlu provayderləri sıradan çıxarda bilərsiniz." }, @@ -2097,6 +2143,15 @@ "vaultTimeoutAction1": { "message": "Vaxt bitmə əməliyyatı" }, + "newCustomizationOptionsCalloutTitle": { + "message": "Yeni özəlləşdirmə seçimləri" + }, + "newCustomizationOptionsCalloutContent": { + "message": "Cəld kopyalama fəaliyyəti, yığcam rejim və daha çoxu ilə seyf təcrübənizi özəlləşdirin!" + }, + "newCustomizationOptionsCalloutLink": { + "message": "Bütün Görünüş ayarlarına bax" + }, "lock": { "message": "Kilidlə", "description": "Verb form: to make secure or inaccessible by" @@ -2391,7 +2446,16 @@ "atRiskPasswords": { "message": "Riskli parollar" }, - "atRiskPasswordsDescSingleOrg": { + "atRiskPasswordDescSingleOrg": { + "message": "$ORGANIZATION$, sizdən bir parolu dəyişdirməyinizi tələb edir, çünki risk altındadır.", + "placeholders": { + "organization": { + "content": "$1", + "example": "Acme Corp" + } + } + }, + "atRiskPasswordsDescSingleOrgPlural": { "message": "$ORGANIZATION$, sizdən $COUNT$ parolu dəyişdirməyinizi tələb edir, çünki risk altındadır.", "placeholders": { "organization": { @@ -2404,7 +2468,7 @@ } } }, - "atRiskPasswordsDescMultiOrg": { + "atRiskPasswordsDescMultiOrgPlural": { "message": "Təşkilatlarınız, sizdən $COUNT$ parolu dəyişdirməyinizi tələb edir, çünki risk altındadır.", "placeholders": { "count": { @@ -2431,6 +2495,36 @@ "changeAtRiskPasswordsFasterDesc": { "message": "Cəld şəkildə parollarınızı avto-doldura və yenilərini yarada bilməyiniz üçün ayarlarınızı güncəlləyin" }, + "reviewAtRiskLogins": { + "message": "Risk altındakı giriş məlumatlarını incələ" + }, + "reviewAtRiskPasswords": { + "message": "Risk altındakı parolları incələ" + }, + "reviewAtRiskLoginsSlideDesc": { + "message": "Təşkilatınız parolları zəif, təkrar istifadə olunduğu və/və ya ifşa olunduğu üçün risk altındadır.", + "description": "Description of the review at-risk login slide on the at-risk password page carousel" + }, + "reviewAtRiskLoginSlideImgAlt": { + "message": "Risk altındakı girişlərin olduğu siyahının təsviri" + }, + "generatePasswordSlideDesc": { + "message": "Risk altında olan saytda Bitwarden avto-doldurma menyusu ilə güclü, unikal parolları cəld yaradın.", + "description": "Description of the generate password slide on the at-risk password page carousel" + }, + "generatePasswordSlideImgAlt": { + "message": "Yaradılan parolları göstərən Bitwarden avto-doldurma menyusunun təsviri" + }, + "updateInBitwarden": { + "message": "Bitwarden-də güncəllə" + }, + "updateInBitwardenSlideDesc": { + "message": "Bitwarden, daha sonra parol menecerində parolu güncəlləməyinizi istəyəcək.", + "description": "Description of the update in Bitwarden slide on the at-risk password page carousel" + }, + "updateInBitwardenSlideImgAlt": { + "message": "İstifadəçidən giriş məlumatlarını güncəlləməsini istəyən Bitwarden bildirişinin təsviri" + }, "turnOnAutofill": { "message": "Avto-doldurmanı işə sal" }, @@ -4181,6 +4275,20 @@ } } }, + "copyFieldValue": { + "message": "Kopyala: $FIELD$, $VALUE$", + "description": "Title for a button that copies a field value to the clipboard.", + "placeholders": { + "field": { + "content": "$1", + "example": "Username" + }, + "value": { + "content": "$2", + "example": "Foo" + } + } + }, "noValuesToCopy": { "message": "Kopyalanacaq dəyər yoxdur" }, diff --git a/apps/browser/src/_locales/be/messages.json b/apps/browser/src/_locales/be/messages.json index dad2b89d25f..e5885c34ccc 100644 --- a/apps/browser/src/_locales/be/messages.json +++ b/apps/browser/src/_locales/be/messages.json @@ -80,6 +80,15 @@ "masterPassHint": { "message": "Падказка да асноўнага пароля (неабавязкова)" }, + "passwordStrengthScore": { + "message": "Password strength score $SCORE$", + "placeholders": { + "score": { + "content": "$1", + "example": "4" + } + } + }, "joinOrganization": { "message": "Далучыцца да арганізацыі" }, @@ -876,6 +885,21 @@ "logInToBitwarden": { "message": "Увайсці ў Bitwarden" }, + "enterTheCodeSentToYourEmail": { + "message": "Enter the code sent to your email" + }, + "enterTheCodeFromYourAuthenticatorApp": { + "message": "Enter the code from your authenticator app" + }, + "pressYourYubiKeyToAuthenticate": { + "message": "Press your YubiKey to authenticate" + }, + "duoTwoFactorRequiredPageSubtitle": { + "message": "Duo two-step login is required for your account. Follow the steps below to finish logging in." + }, + "followTheStepsBelowToFinishLoggingIn": { + "message": "Follow the steps below to finish logging in." + }, "restartRegistration": { "message": "Restart registration" }, @@ -1365,12 +1389,22 @@ "rememberMe": { "message": "Запомніць мяне" }, + "dontAskAgainOnThisDeviceFor30Days": { + "message": "Don't ask again on this device for 30 days" + }, "sendVerificationCodeEmailAgain": { "message": "Адправіць праверачны код яшчэ раз" }, "useAnotherTwoStepMethod": { "message": "Выкарыстоўваць іншы метад двухэтапнага ўваходу" }, + "selectAnotherMethod": { + "message": "Select another method", + "description": "Select another two-step login method" + }, + "useYourRecoveryCode": { + "message": "Use your recovery code" + }, "insertYubiKey": { "message": "Устаўце свой YubiKey у порт USB камп'ютара, а потым націсніце на кнопку." }, @@ -1383,9 +1417,18 @@ "webAuthnNewTabOpen": { "message": "Адкрыць новую ўкладку" }, + "openInNewTab": { + "message": "Open in new tab" + }, "webAuthnAuthenticate": { "message": "Аўтэнтыфікацыя WebAuthn" }, + "readSecurityKey": { + "message": "Read security key" + }, + "awaitingSecurityKeyInteraction": { + "message": "Awaiting security key interaction..." + }, "loginUnavailable": { "message": "Уваход недаступны" }, @@ -1398,6 +1441,9 @@ "twoStepOptions": { "message": "Параметры двухэтапнага ўваходу" }, + "selectTwoStepLoginMethod": { + "message": "Select two-step login method" + }, "recoveryCodeDesc": { "message": "Згубілі доступ да ўсіх варыянтаў доступу пастаўшчыкоў двухэтапнай аўтэнтыфікацыі? Скарыстайцеся кодам аднаўлення, каб адключыць праверку пастаўшчыкоў двухэтапнай аўтэнтыфікацыі для вашага ўліковага запісу." }, @@ -2097,6 +2143,15 @@ "vaultTimeoutAction1": { "message": "Timeout action" }, + "newCustomizationOptionsCalloutTitle": { + "message": "New customization options" + }, + "newCustomizationOptionsCalloutContent": { + "message": "Customize your vault experience with quick copy actions, compact mode, and more!" + }, + "newCustomizationOptionsCalloutLink": { + "message": "View all Appearance settings" + }, "lock": { "message": "Заблакіраваць", "description": "Verb form: to make secure or inaccessible by" @@ -2391,8 +2446,17 @@ "atRiskPasswords": { "message": "At-risk passwords" }, - "atRiskPasswordsDescSingleOrg": { - "message": "$ORGANIZATION$ is requesting you change the $COUNT$ passwords because they are at risk.", + "atRiskPasswordDescSingleOrg": { + "message": "$ORGANIZATION$ is requesting you change one password because it is at-risk.", + "placeholders": { + "organization": { + "content": "$1", + "example": "Acme Corp" + } + } + }, + "atRiskPasswordsDescSingleOrgPlural": { + "message": "$ORGANIZATION$ is requesting you change the $COUNT$ passwords because they are at-risk.", "placeholders": { "organization": { "content": "$1", @@ -2404,8 +2468,8 @@ } } }, - "atRiskPasswordsDescMultiOrg": { - "message": "Your organizations are requesting you change the $COUNT$ passwords because they are at risk.", + "atRiskPasswordsDescMultiOrgPlural": { + "message": "Your organizations are requesting you change the $COUNT$ passwords because they are at-risk.", "placeholders": { "count": { "content": "$1", @@ -2431,6 +2495,36 @@ "changeAtRiskPasswordsFasterDesc": { "message": "Update your settings so you can quickly autofill your passwords and generate new ones" }, + "reviewAtRiskLogins": { + "message": "Review at-risk logins" + }, + "reviewAtRiskPasswords": { + "message": "Review at-risk passwords" + }, + "reviewAtRiskLoginsSlideDesc": { + "message": "Your organization passwords are at-risk because they are weak, reused, and/or exposed.", + "description": "Description of the review at-risk login slide on the at-risk password page carousel" + }, + "reviewAtRiskLoginSlideImgAlt": { + "message": "Illustration of a list of logins that are at-risk" + }, + "generatePasswordSlideDesc": { + "message": "Quickly generate a strong, unique password with the Bitwarden autofill menu on the at-risk site.", + "description": "Description of the generate password slide on the at-risk password page carousel" + }, + "generatePasswordSlideImgAlt": { + "message": "Illustration of the Bitwarden autofill menu displaying a generated password" + }, + "updateInBitwarden": { + "message": "Update in Bitwarden" + }, + "updateInBitwardenSlideDesc": { + "message": "Bitwarden will then prompt you to update the password in the password manager.", + "description": "Description of the update in Bitwarden slide on the at-risk password page carousel" + }, + "updateInBitwardenSlideImgAlt": { + "message": "Illustration of a Bitwarden’s notification prompting the user to update the login" + }, "turnOnAutofill": { "message": "Turn on autofill" }, @@ -4181,6 +4275,20 @@ } } }, + "copyFieldValue": { + "message": "Copy $FIELD$, $VALUE$", + "description": "Title for a button that copies a field value to the clipboard.", + "placeholders": { + "field": { + "content": "$1", + "example": "Username" + }, + "value": { + "content": "$2", + "example": "Foo" + } + } + }, "noValuesToCopy": { "message": "No values to copy" }, diff --git a/apps/browser/src/_locales/bg/messages.json b/apps/browser/src/_locales/bg/messages.json index a60f68b9f7b..8238a03d69a 100644 --- a/apps/browser/src/_locales/bg/messages.json +++ b/apps/browser/src/_locales/bg/messages.json @@ -80,6 +80,15 @@ "masterPassHint": { "message": "Подсказване за главната парола (по избор)" }, + "passwordStrengthScore": { + "message": "Оценка на сложността на паролата: $SCORE$", + "placeholders": { + "score": { + "content": "$1", + "example": "4" + } + } + }, "joinOrganization": { "message": "Присъединяване към организацията" }, @@ -876,6 +885,21 @@ "logInToBitwarden": { "message": "Впишете се в Битуорден" }, + "enterTheCodeSentToYourEmail": { + "message": "Въведете кода изпратен на е-пощата Ви" + }, + "enterTheCodeFromYourAuthenticatorApp": { + "message": "Въведете кода от Вашето приложение за удостоверяване" + }, + "pressYourYubiKeyToAuthenticate": { + "message": "Натиснете бутона на своя YubiKey за удостоверяване" + }, + "duoTwoFactorRequiredPageSubtitle": { + "message": "Вашият акаунт изисква вписване чрез двустепенно удостоверяване с Duo. Следвайте стъпките по-долу, за да завършите вписването." + }, + "followTheStepsBelowToFinishLoggingIn": { + "message": "Следвайте стъпките по-долу, за да завършите вписването." + }, "restartRegistration": { "message": "Рестартиране на регистрацията" }, @@ -1365,12 +1389,22 @@ "rememberMe": { "message": "Запомняне" }, + "dontAskAgainOnThisDeviceFor30Days": { + "message": "Не ме питайте отново на това устройство за 30 дни" + }, "sendVerificationCodeEmailAgain": { "message": "Повторно изпращане на писмото за потвърждение" }, "useAnotherTwoStepMethod": { "message": "Използвайте друг начин на двустепенно удостоверяване" }, + "selectAnotherMethod": { + "message": "Изберете друг метод", + "description": "Select another two-step login method" + }, + "useYourRecoveryCode": { + "message": "Използване на код за възстановяване" + }, "insertYubiKey": { "message": "Поставете устройството на YubiKey в USB порт на компютъра и натиснете бутона на устройството." }, @@ -1383,9 +1417,18 @@ "webAuthnNewTabOpen": { "message": "Отваряне на нов раздел" }, + "openInNewTab": { + "message": "Отваряне в нов раздел" + }, "webAuthnAuthenticate": { "message": "Идентификация WebAuthn" }, + "readSecurityKey": { + "message": "Прочитане на ключа за сигурност" + }, + "awaitingSecurityKeyInteraction": { + "message": "Изчакване на действие с ключ за сигурност…" + }, "loginUnavailable": { "message": "Записът липсва" }, @@ -1398,6 +1441,9 @@ "twoStepOptions": { "message": "Настройки на двустепенното удостоверяване" }, + "selectTwoStepLoginMethod": { + "message": "Изберете начин за двустепенно удостоверяване" + }, "recoveryCodeDesc": { "message": "Ако сте загубили достъп до двустепенното удостоверяване, може да използвате код за възстановяване, за да изключите двустепенното удостоверяване в абонамента си." }, @@ -2097,6 +2143,15 @@ "vaultTimeoutAction1": { "message": "Действие при изтичането на времето за достъп" }, + "newCustomizationOptionsCalloutTitle": { + "message": "Нови възможности за персонализиране" + }, + "newCustomizationOptionsCalloutContent": { + "message": "Персонализирайте трезора си с бързи действия за копиране, компактен режим и още!" + }, + "newCustomizationOptionsCalloutLink": { + "message": "Преглед на всички настройки за външния вид" + }, "lock": { "message": "Заключване", "description": "Verb form: to make secure or inaccessible by" @@ -2391,7 +2446,16 @@ "atRiskPasswords": { "message": "Пароли в риск" }, - "atRiskPasswordsDescSingleOrg": { + "atRiskPasswordDescSingleOrg": { + "message": "$ORGANIZATION$ изисква да промените една парола, тъй като е в риск.", + "placeholders": { + "organization": { + "content": "$1", + "example": "Acme Corp" + } + } + }, + "atRiskPasswordsDescSingleOrgPlural": { "message": "$ORGANIZATION$ изисква да промените $COUNT$ пароли, тъй като са в риск.", "placeholders": { "organization": { @@ -2404,7 +2468,7 @@ } } }, - "atRiskPasswordsDescMultiOrg": { + "atRiskPasswordsDescMultiOrgPlural": { "message": "Вашата организация изисква да промените $COUNT$ пароли, тъй като са в риск.", "placeholders": { "count": { @@ -2431,6 +2495,36 @@ "changeAtRiskPasswordsFasterDesc": { "message": "Променете настройките си, така че да можете бързо да попълвате автоматично паролите си, както и да генерирате нови" }, + "reviewAtRiskLogins": { + "message": "Преглед на елементите за вписване в риск" + }, + "reviewAtRiskPasswords": { + "message": "Преглед на паролите в риск" + }, + "reviewAtRiskLoginsSlideDesc": { + "message": "Паролите в организацията Ви са в риск, защото са слаби, преизползвани и/или разкрити.", + "description": "Description of the review at-risk login slide on the at-risk password page carousel" + }, + "reviewAtRiskLoginSlideImgAlt": { + "message": "Илюстрация на списък с елементи за вписване, които са в риск" + }, + "generatePasswordSlideDesc": { + "message": "Генерирайте бързо сложна и уникална парола от менюто за автоматично попълване на Битуорден, на уеб сайта, който е в риск.", + "description": "Description of the generate password slide on the at-risk password page carousel" + }, + "generatePasswordSlideImgAlt": { + "message": "Илюстрация на автоматичното попълване на Битуорден, показващо генерирана парола" + }, + "updateInBitwarden": { + "message": "Обновяване в Битуорден" + }, + "updateInBitwardenSlideDesc": { + "message": "След това Битуорден ще попита дали искате да обновите паролата в управителя на пароли.", + "description": "Description of the update in Bitwarden slide on the at-risk password page carousel" + }, + "updateInBitwardenSlideImgAlt": { + "message": "Илюстрация на известието на Битуорден, чрез което пита потребителя дали да се обновят данните за вписване" + }, "turnOnAutofill": { "message": "Включване на автоматичното попълване" }, @@ -3249,7 +3343,7 @@ "message": "Заявката е изпратена" }, "exposedMasterPassword": { - "message": "Разобличена главна парола" + "message": "Разкрита главна парола" }, "exposedMasterPasswordDesc": { "message": "Паролата е намерена в пробив на данни. Използвайте уникална парола, за да защитите вашия акаунт. Наистина ли искате да използвате слаба парола?" @@ -4181,6 +4275,20 @@ } } }, + "copyFieldValue": { + "message": "Копиране на $FIELD$, $VALUE$", + "description": "Title for a button that copies a field value to the clipboard.", + "placeholders": { + "field": { + "content": "$1", + "example": "Username" + }, + "value": { + "content": "$2", + "example": "Foo" + } + } + }, "noValuesToCopy": { "message": "Няма стойности за копиране" }, diff --git a/apps/browser/src/_locales/bn/messages.json b/apps/browser/src/_locales/bn/messages.json index 27a5b3b5682..eaa80a68b0a 100644 --- a/apps/browser/src/_locales/bn/messages.json +++ b/apps/browser/src/_locales/bn/messages.json @@ -80,6 +80,15 @@ "masterPassHint": { "message": "মূল পাসওয়ার্ড ইঙ্গিত (ঐচ্ছিক)" }, + "passwordStrengthScore": { + "message": "Password strength score $SCORE$", + "placeholders": { + "score": { + "content": "$1", + "example": "4" + } + } + }, "joinOrganization": { "message": "Join organization" }, @@ -876,6 +885,21 @@ "logInToBitwarden": { "message": "Log in to Bitwarden" }, + "enterTheCodeSentToYourEmail": { + "message": "Enter the code sent to your email" + }, + "enterTheCodeFromYourAuthenticatorApp": { + "message": "Enter the code from your authenticator app" + }, + "pressYourYubiKeyToAuthenticate": { + "message": "Press your YubiKey to authenticate" + }, + "duoTwoFactorRequiredPageSubtitle": { + "message": "Duo two-step login is required for your account. Follow the steps below to finish logging in." + }, + "followTheStepsBelowToFinishLoggingIn": { + "message": "Follow the steps below to finish logging in." + }, "restartRegistration": { "message": "Restart registration" }, @@ -1365,12 +1389,22 @@ "rememberMe": { "message": "আমাকে মনে রাখবেন" }, + "dontAskAgainOnThisDeviceFor30Days": { + "message": "Don't ask again on this device for 30 days" + }, "sendVerificationCodeEmailAgain": { "message": "আবার যাচাইকরণ কোড ইমেইলে প্রেরণ করুন" }, "useAnotherTwoStepMethod": { "message": "অন্য দ্বি-পদক্ষেপ প্রবেশ পদ্ধতি ব্যবহার করুন" }, + "selectAnotherMethod": { + "message": "Select another method", + "description": "Select another two-step login method" + }, + "useYourRecoveryCode": { + "message": "Use your recovery code" + }, "insertYubiKey": { "message": "আপনার কম্পিউটারের ইউএসবি পোর্টে আপনার YubiKey ঢোকান, তারপরে তার বোতামটি স্পর্শ করুন।" }, @@ -1383,9 +1417,18 @@ "webAuthnNewTabOpen": { "message": "Open new tab" }, + "openInNewTab": { + "message": "Open in new tab" + }, "webAuthnAuthenticate": { "message": "Authenticate WebAuthn" }, + "readSecurityKey": { + "message": "Read security key" + }, + "awaitingSecurityKeyInteraction": { + "message": "Awaiting security key interaction..." + }, "loginUnavailable": { "message": "লগইন অনুপলব্ধ" }, @@ -1398,6 +1441,9 @@ "twoStepOptions": { "message": "দ্বি-পদক্ষেপ লগইন বিকল্প" }, + "selectTwoStepLoginMethod": { + "message": "Select two-step login method" + }, "recoveryCodeDesc": { "message": "আপনার সমস্ত দ্বি-গুণক সরবরাহকারীদের অ্যাক্সেস হারিয়েছেন? আপনার অ্যাকাউন্ট থেকে সমস্ত দ্বি-গুণক সরবরাহকারীদের অক্ষম করতে আপনার পুনরুদ্ধার কোডটি ব্যবহার করুন।" }, @@ -2097,6 +2143,15 @@ "vaultTimeoutAction1": { "message": "Timeout action" }, + "newCustomizationOptionsCalloutTitle": { + "message": "New customization options" + }, + "newCustomizationOptionsCalloutContent": { + "message": "Customize your vault experience with quick copy actions, compact mode, and more!" + }, + "newCustomizationOptionsCalloutLink": { + "message": "View all Appearance settings" + }, "lock": { "message": "লক", "description": "Verb form: to make secure or inaccessible by" @@ -2391,8 +2446,17 @@ "atRiskPasswords": { "message": "At-risk passwords" }, - "atRiskPasswordsDescSingleOrg": { - "message": "$ORGANIZATION$ is requesting you change the $COUNT$ passwords because they are at risk.", + "atRiskPasswordDescSingleOrg": { + "message": "$ORGANIZATION$ is requesting you change one password because it is at-risk.", + "placeholders": { + "organization": { + "content": "$1", + "example": "Acme Corp" + } + } + }, + "atRiskPasswordsDescSingleOrgPlural": { + "message": "$ORGANIZATION$ is requesting you change the $COUNT$ passwords because they are at-risk.", "placeholders": { "organization": { "content": "$1", @@ -2404,8 +2468,8 @@ } } }, - "atRiskPasswordsDescMultiOrg": { - "message": "Your organizations are requesting you change the $COUNT$ passwords because they are at risk.", + "atRiskPasswordsDescMultiOrgPlural": { + "message": "Your organizations are requesting you change the $COUNT$ passwords because they are at-risk.", "placeholders": { "count": { "content": "$1", @@ -2431,6 +2495,36 @@ "changeAtRiskPasswordsFasterDesc": { "message": "Update your settings so you can quickly autofill your passwords and generate new ones" }, + "reviewAtRiskLogins": { + "message": "Review at-risk logins" + }, + "reviewAtRiskPasswords": { + "message": "Review at-risk passwords" + }, + "reviewAtRiskLoginsSlideDesc": { + "message": "Your organization passwords are at-risk because they are weak, reused, and/or exposed.", + "description": "Description of the review at-risk login slide on the at-risk password page carousel" + }, + "reviewAtRiskLoginSlideImgAlt": { + "message": "Illustration of a list of logins that are at-risk" + }, + "generatePasswordSlideDesc": { + "message": "Quickly generate a strong, unique password with the Bitwarden autofill menu on the at-risk site.", + "description": "Description of the generate password slide on the at-risk password page carousel" + }, + "generatePasswordSlideImgAlt": { + "message": "Illustration of the Bitwarden autofill menu displaying a generated password" + }, + "updateInBitwarden": { + "message": "Update in Bitwarden" + }, + "updateInBitwardenSlideDesc": { + "message": "Bitwarden will then prompt you to update the password in the password manager.", + "description": "Description of the update in Bitwarden slide on the at-risk password page carousel" + }, + "updateInBitwardenSlideImgAlt": { + "message": "Illustration of a Bitwarden’s notification prompting the user to update the login" + }, "turnOnAutofill": { "message": "Turn on autofill" }, @@ -4181,6 +4275,20 @@ } } }, + "copyFieldValue": { + "message": "Copy $FIELD$, $VALUE$", + "description": "Title for a button that copies a field value to the clipboard.", + "placeholders": { + "field": { + "content": "$1", + "example": "Username" + }, + "value": { + "content": "$2", + "example": "Foo" + } + } + }, "noValuesToCopy": { "message": "No values to copy" }, diff --git a/apps/browser/src/_locales/bs/messages.json b/apps/browser/src/_locales/bs/messages.json index c8031f0a0e5..e2a4c09ce3d 100644 --- a/apps/browser/src/_locales/bs/messages.json +++ b/apps/browser/src/_locales/bs/messages.json @@ -80,6 +80,15 @@ "masterPassHint": { "message": "Master password hint (optional)" }, + "passwordStrengthScore": { + "message": "Password strength score $SCORE$", + "placeholders": { + "score": { + "content": "$1", + "example": "4" + } + } + }, "joinOrganization": { "message": "Join organization" }, @@ -876,6 +885,21 @@ "logInToBitwarden": { "message": "Log in to Bitwarden" }, + "enterTheCodeSentToYourEmail": { + "message": "Enter the code sent to your email" + }, + "enterTheCodeFromYourAuthenticatorApp": { + "message": "Enter the code from your authenticator app" + }, + "pressYourYubiKeyToAuthenticate": { + "message": "Press your YubiKey to authenticate" + }, + "duoTwoFactorRequiredPageSubtitle": { + "message": "Duo two-step login is required for your account. Follow the steps below to finish logging in." + }, + "followTheStepsBelowToFinishLoggingIn": { + "message": "Follow the steps below to finish logging in." + }, "restartRegistration": { "message": "Restart registration" }, @@ -1365,12 +1389,22 @@ "rememberMe": { "message": "Remember me" }, + "dontAskAgainOnThisDeviceFor30Days": { + "message": "Don't ask again on this device for 30 days" + }, "sendVerificationCodeEmailAgain": { "message": "Send verification code email again" }, "useAnotherTwoStepMethod": { "message": "Use another two-step login method" }, + "selectAnotherMethod": { + "message": "Select another method", + "description": "Select another two-step login method" + }, + "useYourRecoveryCode": { + "message": "Use your recovery code" + }, "insertYubiKey": { "message": "Insert your YubiKey into your computer's USB port, then touch its button." }, @@ -1383,9 +1417,18 @@ "webAuthnNewTabOpen": { "message": "Open new tab" }, + "openInNewTab": { + "message": "Open in new tab" + }, "webAuthnAuthenticate": { "message": "Authenticate WebAuthn" }, + "readSecurityKey": { + "message": "Read security key" + }, + "awaitingSecurityKeyInteraction": { + "message": "Awaiting security key interaction..." + }, "loginUnavailable": { "message": "Login unavailable" }, @@ -1398,6 +1441,9 @@ "twoStepOptions": { "message": "Two-step login options" }, + "selectTwoStepLoginMethod": { + "message": "Select two-step login method" + }, "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." }, @@ -2097,6 +2143,15 @@ "vaultTimeoutAction1": { "message": "Timeout action" }, + "newCustomizationOptionsCalloutTitle": { + "message": "New customization options" + }, + "newCustomizationOptionsCalloutContent": { + "message": "Customize your vault experience with quick copy actions, compact mode, and more!" + }, + "newCustomizationOptionsCalloutLink": { + "message": "View all Appearance settings" + }, "lock": { "message": "Zaključaj", "description": "Verb form: to make secure or inaccessible by" @@ -2391,8 +2446,17 @@ "atRiskPasswords": { "message": "At-risk passwords" }, - "atRiskPasswordsDescSingleOrg": { - "message": "$ORGANIZATION$ is requesting you change the $COUNT$ passwords because they are at risk.", + "atRiskPasswordDescSingleOrg": { + "message": "$ORGANIZATION$ is requesting you change one password because it is at-risk.", + "placeholders": { + "organization": { + "content": "$1", + "example": "Acme Corp" + } + } + }, + "atRiskPasswordsDescSingleOrgPlural": { + "message": "$ORGANIZATION$ is requesting you change the $COUNT$ passwords because they are at-risk.", "placeholders": { "organization": { "content": "$1", @@ -2404,8 +2468,8 @@ } } }, - "atRiskPasswordsDescMultiOrg": { - "message": "Your organizations are requesting you change the $COUNT$ passwords because they are at risk.", + "atRiskPasswordsDescMultiOrgPlural": { + "message": "Your organizations are requesting you change the $COUNT$ passwords because they are at-risk.", "placeholders": { "count": { "content": "$1", @@ -2431,6 +2495,36 @@ "changeAtRiskPasswordsFasterDesc": { "message": "Update your settings so you can quickly autofill your passwords and generate new ones" }, + "reviewAtRiskLogins": { + "message": "Review at-risk logins" + }, + "reviewAtRiskPasswords": { + "message": "Review at-risk passwords" + }, + "reviewAtRiskLoginsSlideDesc": { + "message": "Your organization passwords are at-risk because they are weak, reused, and/or exposed.", + "description": "Description of the review at-risk login slide on the at-risk password page carousel" + }, + "reviewAtRiskLoginSlideImgAlt": { + "message": "Illustration of a list of logins that are at-risk" + }, + "generatePasswordSlideDesc": { + "message": "Quickly generate a strong, unique password with the Bitwarden autofill menu on the at-risk site.", + "description": "Description of the generate password slide on the at-risk password page carousel" + }, + "generatePasswordSlideImgAlt": { + "message": "Illustration of the Bitwarden autofill menu displaying a generated password" + }, + "updateInBitwarden": { + "message": "Update in Bitwarden" + }, + "updateInBitwardenSlideDesc": { + "message": "Bitwarden will then prompt you to update the password in the password manager.", + "description": "Description of the update in Bitwarden slide on the at-risk password page carousel" + }, + "updateInBitwardenSlideImgAlt": { + "message": "Illustration of a Bitwarden’s notification prompting the user to update the login" + }, "turnOnAutofill": { "message": "Turn on autofill" }, @@ -4181,6 +4275,20 @@ } } }, + "copyFieldValue": { + "message": "Copy $FIELD$, $VALUE$", + "description": "Title for a button that copies a field value to the clipboard.", + "placeholders": { + "field": { + "content": "$1", + "example": "Username" + }, + "value": { + "content": "$2", + "example": "Foo" + } + } + }, "noValuesToCopy": { "message": "No values to copy" }, diff --git a/apps/browser/src/_locales/ca/messages.json b/apps/browser/src/_locales/ca/messages.json index 11ffc21f3e4..9c5874ee522 100644 --- a/apps/browser/src/_locales/ca/messages.json +++ b/apps/browser/src/_locales/ca/messages.json @@ -80,6 +80,15 @@ "masterPassHint": { "message": "Pista de la contrasenya mestra (opcional)" }, + "passwordStrengthScore": { + "message": "Password strength score $SCORE$", + "placeholders": { + "score": { + "content": "$1", + "example": "4" + } + } + }, "joinOrganization": { "message": "Uneix-te a l'organització" }, @@ -876,6 +885,21 @@ "logInToBitwarden": { "message": "Inicia sessió a Bitwarden" }, + "enterTheCodeSentToYourEmail": { + "message": "Enter the code sent to your email" + }, + "enterTheCodeFromYourAuthenticatorApp": { + "message": "Enter the code from your authenticator app" + }, + "pressYourYubiKeyToAuthenticate": { + "message": "Press your YubiKey to authenticate" + }, + "duoTwoFactorRequiredPageSubtitle": { + "message": "Duo two-step login is required for your account. Follow the steps below to finish logging in." + }, + "followTheStepsBelowToFinishLoggingIn": { + "message": "Follow the steps below to finish logging in." + }, "restartRegistration": { "message": "Reinicia el registre" }, @@ -1365,12 +1389,22 @@ "rememberMe": { "message": "Recorda'm" }, + "dontAskAgainOnThisDeviceFor30Days": { + "message": "Don't ask again on this device for 30 days" + }, "sendVerificationCodeEmailAgain": { "message": "Envia el codi de verificació altra vegada" }, "useAnotherTwoStepMethod": { "message": "Utilitzeu un altre mètode d'inici de sessió en dues passes" }, + "selectAnotherMethod": { + "message": "Select another method", + "description": "Select another two-step login method" + }, + "useYourRecoveryCode": { + "message": "Use your recovery code" + }, "insertYubiKey": { "message": "Introduïu la vostra YubiKey al port USB de l'ordinador i, a continuació, premeu el seu botó." }, @@ -1383,9 +1417,18 @@ "webAuthnNewTabOpen": { "message": "Obri una pestanya nova" }, + "openInNewTab": { + "message": "Open in new tab" + }, "webAuthnAuthenticate": { "message": "Autenticar WebAuthn" }, + "readSecurityKey": { + "message": "Read security key" + }, + "awaitingSecurityKeyInteraction": { + "message": "Awaiting security key interaction..." + }, "loginUnavailable": { "message": "Inici de sessió no disponible" }, @@ -1398,6 +1441,9 @@ "twoStepOptions": { "message": "Opcions d'inici de sessió en dues passes" }, + "selectTwoStepLoginMethod": { + "message": "Select two-step login method" + }, "recoveryCodeDesc": { "message": "Heu perdut l'accés a tots els vostres proveïdors de dos factors? Utilitzeu el vostre codi de recuperació per desactivar tots els proveïdors de dos factors del vostre compte." }, @@ -2097,6 +2143,15 @@ "vaultTimeoutAction1": { "message": "Acció després del temps d'espera" }, + "newCustomizationOptionsCalloutTitle": { + "message": "New customization options" + }, + "newCustomizationOptionsCalloutContent": { + "message": "Customize your vault experience with quick copy actions, compact mode, and more!" + }, + "newCustomizationOptionsCalloutLink": { + "message": "View all Appearance settings" + }, "lock": { "message": "Bloqueja", "description": "Verb form: to make secure or inaccessible by" @@ -2391,8 +2446,17 @@ "atRiskPasswords": { "message": "At-risk passwords" }, - "atRiskPasswordsDescSingleOrg": { - "message": "$ORGANIZATION$ is requesting you change the $COUNT$ passwords because they are at risk.", + "atRiskPasswordDescSingleOrg": { + "message": "$ORGANIZATION$ is requesting you change one password because it is at-risk.", + "placeholders": { + "organization": { + "content": "$1", + "example": "Acme Corp" + } + } + }, + "atRiskPasswordsDescSingleOrgPlural": { + "message": "$ORGANIZATION$ is requesting you change the $COUNT$ passwords because they are at-risk.", "placeholders": { "organization": { "content": "$1", @@ -2404,8 +2468,8 @@ } } }, - "atRiskPasswordsDescMultiOrg": { - "message": "Your organizations are requesting you change the $COUNT$ passwords because they are at risk.", + "atRiskPasswordsDescMultiOrgPlural": { + "message": "Your organizations are requesting you change the $COUNT$ passwords because they are at-risk.", "placeholders": { "count": { "content": "$1", @@ -2431,6 +2495,36 @@ "changeAtRiskPasswordsFasterDesc": { "message": "Update your settings so you can quickly autofill your passwords and generate new ones" }, + "reviewAtRiskLogins": { + "message": "Review at-risk logins" + }, + "reviewAtRiskPasswords": { + "message": "Review at-risk passwords" + }, + "reviewAtRiskLoginsSlideDesc": { + "message": "Your organization passwords are at-risk because they are weak, reused, and/or exposed.", + "description": "Description of the review at-risk login slide on the at-risk password page carousel" + }, + "reviewAtRiskLoginSlideImgAlt": { + "message": "Illustration of a list of logins that are at-risk" + }, + "generatePasswordSlideDesc": { + "message": "Quickly generate a strong, unique password with the Bitwarden autofill menu on the at-risk site.", + "description": "Description of the generate password slide on the at-risk password page carousel" + }, + "generatePasswordSlideImgAlt": { + "message": "Illustration of the Bitwarden autofill menu displaying a generated password" + }, + "updateInBitwarden": { + "message": "Update in Bitwarden" + }, + "updateInBitwardenSlideDesc": { + "message": "Bitwarden will then prompt you to update the password in the password manager.", + "description": "Description of the update in Bitwarden slide on the at-risk password page carousel" + }, + "updateInBitwardenSlideImgAlt": { + "message": "Illustration of a Bitwarden’s notification prompting the user to update the login" + }, "turnOnAutofill": { "message": "Turn on autofill" }, @@ -4181,6 +4275,20 @@ } } }, + "copyFieldValue": { + "message": "Copy $FIELD$, $VALUE$", + "description": "Title for a button that copies a field value to the clipboard.", + "placeholders": { + "field": { + "content": "$1", + "example": "Username" + }, + "value": { + "content": "$2", + "example": "Foo" + } + } + }, "noValuesToCopy": { "message": "No values to copy" }, diff --git a/apps/browser/src/_locales/cs/messages.json b/apps/browser/src/_locales/cs/messages.json index 8dc3f40f44a..8b91245b8f0 100644 --- a/apps/browser/src/_locales/cs/messages.json +++ b/apps/browser/src/_locales/cs/messages.json @@ -80,6 +80,15 @@ "masterPassHint": { "message": "Nápověda k hlavnímu heslu (volitelné)" }, + "passwordStrengthScore": { + "message": "Skóre síly hesla: $SCORE$", + "placeholders": { + "score": { + "content": "$1", + "example": "4" + } + } + }, "joinOrganization": { "message": "Přidat se k organizaci" }, @@ -876,6 +885,21 @@ "logInToBitwarden": { "message": "Přihlásit se do Bitwardenu" }, + "enterTheCodeSentToYourEmail": { + "message": "Zadejte kód odeslaný na Váš e-mail" + }, + "enterTheCodeFromYourAuthenticatorApp": { + "message": "Zadejte kód z Vaší ověřovací aplikace" + }, + "pressYourYubiKeyToAuthenticate": { + "message": "Stiskněte svůj YubiKey pro ověření" + }, + "duoTwoFactorRequiredPageSubtitle": { + "message": "Pro Váš účet je nutné dvoufázové přihlášení. Pro dokončení přihlášení postupujte podle následujících kroků." + }, + "followTheStepsBelowToFinishLoggingIn": { + "message": "Postupujte podle kroků níže pro dokončení přihlášení." + }, "restartRegistration": { "message": "Restartovat registraci" }, @@ -1365,12 +1389,22 @@ "rememberMe": { "message": "Zapamatovat mě" }, + "dontAskAgainOnThisDeviceFor30Days": { + "message": "Neptat se na tomto zařízení 30 dnů" + }, "sendVerificationCodeEmailAgain": { "message": "Znovu zaslat ověřovací kód na e-mail" }, "useAnotherTwoStepMethod": { "message": "Použít jinou metodu dvoufázového přihlášení" }, + "selectAnotherMethod": { + "message": "Vybrat jinou metodu", + "description": "Select another two-step login method" + }, + "useYourRecoveryCode": { + "message": "Použít obnovovací kód" + }, "insertYubiKey": { "message": "Vložte YubiKey do USB portu Vašeho počítače a stiskněte jeho tlačítko." }, @@ -1383,9 +1417,18 @@ "webAuthnNewTabOpen": { "message": "Otevřít novou kartu" }, + "openInNewTab": { + "message": "Otevřít v nové kartě" + }, "webAuthnAuthenticate": { "message": "Ověřit WebAuthn" }, + "readSecurityKey": { + "message": "Přečíst bezpečnostní klíč" + }, + "awaitingSecurityKeyInteraction": { + "message": "Čeká se na interakci s bezpečnostním klíčem..." + }, "loginUnavailable": { "message": "Přihlášení není dostupné" }, @@ -1398,6 +1441,9 @@ "twoStepOptions": { "message": "Volby dvoufázového přihlášení" }, + "selectTwoStepLoginMethod": { + "message": "Vyberte metodu dvoufázového přihlášení" + }, "recoveryCodeDesc": { "message": "Ztratili jste přístup ke všem nastaveným poskytovatelům dvoufázového přihlášení? Použijte obnovovací kód pro vypnutí dvoufázového přihlášení." }, @@ -2097,6 +2143,15 @@ "vaultTimeoutAction1": { "message": "Akce vypršení časového limitu" }, + "newCustomizationOptionsCalloutTitle": { + "message": "Nové volby přizpůsobení" + }, + "newCustomizationOptionsCalloutContent": { + "message": "Přizpůsobte si svůj trezor s rychlými kopírovacími akcemi, kompaktním režimem a dalším!" + }, + "newCustomizationOptionsCalloutLink": { + "message": "Zobrazit všechna nastavení vzhledu" + }, "lock": { "message": "Zamknout", "description": "Verb form: to make secure or inaccessible by" @@ -2391,7 +2446,16 @@ "atRiskPasswords": { "message": "Ohrožená hesla" }, - "atRiskPasswordsDescSingleOrg": { + "atRiskPasswordDescSingleOrg": { + "message": "$ORGANIZATION$ Vás žádá o změnu 1 hesla, protože je v ohrožení.", + "placeholders": { + "organization": { + "content": "$1", + "example": "Acme Corp" + } + } + }, + "atRiskPasswordsDescSingleOrgPlural": { "message": "$ORGANIZATION$ Vás žádá o změnu $COUNT$ hesel, protože jsou v ohrožení.", "placeholders": { "organization": { @@ -2404,7 +2468,7 @@ } } }, - "atRiskPasswordsDescMultiOrg": { + "atRiskPasswordsDescMultiOrgPlural": { "message": "Vaše organizace Vás žádají o změnu $COUNT$ hesel, protože jsou v ohrožení.", "placeholders": { "count": { @@ -2431,6 +2495,36 @@ "changeAtRiskPasswordsFasterDesc": { "message": "Aktualizujte svá nastavení, abyste mohli rychle automaticky vyplňovat hesla a generovat nová hesla." }, + "reviewAtRiskLogins": { + "message": "Kontrola rizikových přihlášení" + }, + "reviewAtRiskPasswords": { + "message": "Kontrola rizikových hesel" + }, + "reviewAtRiskLoginsSlideDesc": { + "message": "Hesla Vaší organizace jsou ohrožena, protože jsou slabá, opakovaně používaná nebo odhalená.", + "description": "Description of the review at-risk login slide on the at-risk password page carousel" + }, + "reviewAtRiskLoginSlideImgAlt": { + "message": "Ilustrace seznamu přihlášení, která jsou riziková" + }, + "generatePasswordSlideDesc": { + "message": "Rychle vygeneruje silné, unikátní heslo s nabídkou automatického vyplňování Bitwarden na rizikových stránkách.", + "description": "Description of the generate password slide on the at-risk password page carousel" + }, + "generatePasswordSlideImgAlt": { + "message": "Ilustrace nabídky automatického vyplňování Bitwarden zobrazující vygenerované heslo" + }, + "updateInBitwarden": { + "message": "Aktualizovat v Bitwardenu" + }, + "updateInBitwardenSlideDesc": { + "message": "Bitwarden Vás poté požádá o aktualizaci hesla ve správci hesel.", + "description": "Description of the update in Bitwarden slide on the at-risk password page carousel" + }, + "updateInBitwardenSlideImgAlt": { + "message": "Ilustrace oznámení v Bitwardenu, která uživatele vyzývá k aktualizaci přihlášení" + }, "turnOnAutofill": { "message": "Zapnout automatické vyplňování" }, @@ -4181,6 +4275,20 @@ } } }, + "copyFieldValue": { + "message": "Kopírovat $FIELD$, $VALUE$", + "description": "Title for a button that copies a field value to the clipboard.", + "placeholders": { + "field": { + "content": "$1", + "example": "Username" + }, + "value": { + "content": "$2", + "example": "Foo" + } + } + }, "noValuesToCopy": { "message": "Žádné hodnoty ke zkopírování" }, diff --git a/apps/browser/src/_locales/cy/messages.json b/apps/browser/src/_locales/cy/messages.json index f07d598d6f6..17a8dead9ed 100644 --- a/apps/browser/src/_locales/cy/messages.json +++ b/apps/browser/src/_locales/cy/messages.json @@ -80,6 +80,15 @@ "masterPassHint": { "message": "Master password hint (optional)" }, + "passwordStrengthScore": { + "message": "Password strength score $SCORE$", + "placeholders": { + "score": { + "content": "$1", + "example": "4" + } + } + }, "joinOrganization": { "message": "Join organization" }, @@ -876,6 +885,21 @@ "logInToBitwarden": { "message": "Log in to Bitwarden" }, + "enterTheCodeSentToYourEmail": { + "message": "Enter the code sent to your email" + }, + "enterTheCodeFromYourAuthenticatorApp": { + "message": "Enter the code from your authenticator app" + }, + "pressYourYubiKeyToAuthenticate": { + "message": "Press your YubiKey to authenticate" + }, + "duoTwoFactorRequiredPageSubtitle": { + "message": "Duo two-step login is required for your account. Follow the steps below to finish logging in." + }, + "followTheStepsBelowToFinishLoggingIn": { + "message": "Follow the steps below to finish logging in." + }, "restartRegistration": { "message": "Restart registration" }, @@ -1365,12 +1389,22 @@ "rememberMe": { "message": "Fy nghofio i" }, + "dontAskAgainOnThisDeviceFor30Days": { + "message": "Don't ask again on this device for 30 days" + }, "sendVerificationCodeEmailAgain": { "message": "Anfon ebost â chod dilysu eto" }, "useAnotherTwoStepMethod": { "message": "Use another two-step login method" }, + "selectAnotherMethod": { + "message": "Select another method", + "description": "Select another two-step login method" + }, + "useYourRecoveryCode": { + "message": "Use your recovery code" + }, "insertYubiKey": { "message": "Rhowch eich YubiKey i mewn i borth USB eich cyfrifiadur, yna gwasgwch y botwm." }, @@ -1383,9 +1417,18 @@ "webAuthnNewTabOpen": { "message": "Agor tab newydd" }, + "openInNewTab": { + "message": "Open in new tab" + }, "webAuthnAuthenticate": { "message": "Authenticate WebAuthn" }, + "readSecurityKey": { + "message": "Read security key" + }, + "awaitingSecurityKeyInteraction": { + "message": "Awaiting security key interaction..." + }, "loginUnavailable": { "message": "Login unavailable" }, @@ -1398,6 +1441,9 @@ "twoStepOptions": { "message": "Dewisiadau mewngofnodi dau gam" }, + "selectTwoStepLoginMethod": { + "message": "Select two-step login method" + }, "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." }, @@ -2097,6 +2143,15 @@ "vaultTimeoutAction1": { "message": "Timeout action" }, + "newCustomizationOptionsCalloutTitle": { + "message": "New customization options" + }, + "newCustomizationOptionsCalloutContent": { + "message": "Customize your vault experience with quick copy actions, compact mode, and more!" + }, + "newCustomizationOptionsCalloutLink": { + "message": "View all Appearance settings" + }, "lock": { "message": "Cloi", "description": "Verb form: to make secure or inaccessible by" @@ -2391,8 +2446,17 @@ "atRiskPasswords": { "message": "At-risk passwords" }, - "atRiskPasswordsDescSingleOrg": { - "message": "$ORGANIZATION$ is requesting you change the $COUNT$ passwords because they are at risk.", + "atRiskPasswordDescSingleOrg": { + "message": "$ORGANIZATION$ is requesting you change one password because it is at-risk.", + "placeholders": { + "organization": { + "content": "$1", + "example": "Acme Corp" + } + } + }, + "atRiskPasswordsDescSingleOrgPlural": { + "message": "$ORGANIZATION$ is requesting you change the $COUNT$ passwords because they are at-risk.", "placeholders": { "organization": { "content": "$1", @@ -2404,8 +2468,8 @@ } } }, - "atRiskPasswordsDescMultiOrg": { - "message": "Your organizations are requesting you change the $COUNT$ passwords because they are at risk.", + "atRiskPasswordsDescMultiOrgPlural": { + "message": "Your organizations are requesting you change the $COUNT$ passwords because they are at-risk.", "placeholders": { "count": { "content": "$1", @@ -2431,6 +2495,36 @@ "changeAtRiskPasswordsFasterDesc": { "message": "Update your settings so you can quickly autofill your passwords and generate new ones" }, + "reviewAtRiskLogins": { + "message": "Review at-risk logins" + }, + "reviewAtRiskPasswords": { + "message": "Review at-risk passwords" + }, + "reviewAtRiskLoginsSlideDesc": { + "message": "Your organization passwords are at-risk because they are weak, reused, and/or exposed.", + "description": "Description of the review at-risk login slide on the at-risk password page carousel" + }, + "reviewAtRiskLoginSlideImgAlt": { + "message": "Illustration of a list of logins that are at-risk" + }, + "generatePasswordSlideDesc": { + "message": "Quickly generate a strong, unique password with the Bitwarden autofill menu on the at-risk site.", + "description": "Description of the generate password slide on the at-risk password page carousel" + }, + "generatePasswordSlideImgAlt": { + "message": "Illustration of the Bitwarden autofill menu displaying a generated password" + }, + "updateInBitwarden": { + "message": "Update in Bitwarden" + }, + "updateInBitwardenSlideDesc": { + "message": "Bitwarden will then prompt you to update the password in the password manager.", + "description": "Description of the update in Bitwarden slide on the at-risk password page carousel" + }, + "updateInBitwardenSlideImgAlt": { + "message": "Illustration of a Bitwarden’s notification prompting the user to update the login" + }, "turnOnAutofill": { "message": "Turn on autofill" }, @@ -4181,6 +4275,20 @@ } } }, + "copyFieldValue": { + "message": "Copy $FIELD$, $VALUE$", + "description": "Title for a button that copies a field value to the clipboard.", + "placeholders": { + "field": { + "content": "$1", + "example": "Username" + }, + "value": { + "content": "$2", + "example": "Foo" + } + } + }, "noValuesToCopy": { "message": "No values to copy" }, diff --git a/apps/browser/src/_locales/da/messages.json b/apps/browser/src/_locales/da/messages.json index 796a5ce4ab2..b33960470cf 100644 --- a/apps/browser/src/_locales/da/messages.json +++ b/apps/browser/src/_locales/da/messages.json @@ -80,6 +80,15 @@ "masterPassHint": { "message": "Hovedadgangskodetip (valgfrit)" }, + "passwordStrengthScore": { + "message": "Password strength score $SCORE$", + "placeholders": { + "score": { + "content": "$1", + "example": "4" + } + } + }, "joinOrganization": { "message": "Bliv medlem af organisation" }, @@ -876,6 +885,21 @@ "logInToBitwarden": { "message": "Log ind på Bitwarden" }, + "enterTheCodeSentToYourEmail": { + "message": "Enter the code sent to your email" + }, + "enterTheCodeFromYourAuthenticatorApp": { + "message": "Enter the code from your authenticator app" + }, + "pressYourYubiKeyToAuthenticate": { + "message": "Press your YubiKey to authenticate" + }, + "duoTwoFactorRequiredPageSubtitle": { + "message": "Duo two-step login is required for your account. Follow the steps below to finish logging in." + }, + "followTheStepsBelowToFinishLoggingIn": { + "message": "Follow the steps below to finish logging in." + }, "restartRegistration": { "message": "Genstart registrering" }, @@ -1365,12 +1389,22 @@ "rememberMe": { "message": "Husk mig" }, + "dontAskAgainOnThisDeviceFor30Days": { + "message": "Don't ask again on this device for 30 days" + }, "sendVerificationCodeEmailAgain": { "message": "Send verifikationskode-email igen" }, "useAnotherTwoStepMethod": { "message": "Brug en anden to-trins login metode" }, + "selectAnotherMethod": { + "message": "Select another method", + "description": "Select another two-step login method" + }, + "useYourRecoveryCode": { + "message": "Use your recovery code" + }, "insertYubiKey": { "message": "Indsæt din YubiKey i din computers USB-port, og tryk derefter på dens knap." }, @@ -1383,9 +1417,18 @@ "webAuthnNewTabOpen": { "message": "Åbn ny fane" }, + "openInNewTab": { + "message": "Open in new tab" + }, "webAuthnAuthenticate": { "message": "Godkend WebAuthn" }, + "readSecurityKey": { + "message": "Read security key" + }, + "awaitingSecurityKeyInteraction": { + "message": "Awaiting security key interaction..." + }, "loginUnavailable": { "message": "Login ikke tilgængelig" }, @@ -1398,6 +1441,9 @@ "twoStepOptions": { "message": "To-trins-login indstillinger" }, + "selectTwoStepLoginMethod": { + "message": "Select two-step login method" + }, "recoveryCodeDesc": { "message": "Mistet adgang til alle dine to-faktor-udbydere? Brug din genoprettelseskode til at deaktivere alle to-faktor udbydere på din konto." }, @@ -2097,6 +2143,15 @@ "vaultTimeoutAction1": { "message": "Timeouthandling" }, + "newCustomizationOptionsCalloutTitle": { + "message": "New customization options" + }, + "newCustomizationOptionsCalloutContent": { + "message": "Customize your vault experience with quick copy actions, compact mode, and more!" + }, + "newCustomizationOptionsCalloutLink": { + "message": "View all Appearance settings" + }, "lock": { "message": "Lås", "description": "Verb form: to make secure or inaccessible by" @@ -2391,8 +2446,17 @@ "atRiskPasswords": { "message": "At-risk passwords" }, - "atRiskPasswordsDescSingleOrg": { - "message": "$ORGANIZATION$ is requesting you change the $COUNT$ passwords because they are at risk.", + "atRiskPasswordDescSingleOrg": { + "message": "$ORGANIZATION$ is requesting you change one password because it is at-risk.", + "placeholders": { + "organization": { + "content": "$1", + "example": "Acme Corp" + } + } + }, + "atRiskPasswordsDescSingleOrgPlural": { + "message": "$ORGANIZATION$ is requesting you change the $COUNT$ passwords because they are at-risk.", "placeholders": { "organization": { "content": "$1", @@ -2404,8 +2468,8 @@ } } }, - "atRiskPasswordsDescMultiOrg": { - "message": "Your organizations are requesting you change the $COUNT$ passwords because they are at risk.", + "atRiskPasswordsDescMultiOrgPlural": { + "message": "Your organizations are requesting you change the $COUNT$ passwords because they are at-risk.", "placeholders": { "count": { "content": "$1", @@ -2431,6 +2495,36 @@ "changeAtRiskPasswordsFasterDesc": { "message": "Update your settings so you can quickly autofill your passwords and generate new ones" }, + "reviewAtRiskLogins": { + "message": "Review at-risk logins" + }, + "reviewAtRiskPasswords": { + "message": "Review at-risk passwords" + }, + "reviewAtRiskLoginsSlideDesc": { + "message": "Your organization passwords are at-risk because they are weak, reused, and/or exposed.", + "description": "Description of the review at-risk login slide on the at-risk password page carousel" + }, + "reviewAtRiskLoginSlideImgAlt": { + "message": "Illustration of a list of logins that are at-risk" + }, + "generatePasswordSlideDesc": { + "message": "Quickly generate a strong, unique password with the Bitwarden autofill menu on the at-risk site.", + "description": "Description of the generate password slide on the at-risk password page carousel" + }, + "generatePasswordSlideImgAlt": { + "message": "Illustration of the Bitwarden autofill menu displaying a generated password" + }, + "updateInBitwarden": { + "message": "Update in Bitwarden" + }, + "updateInBitwardenSlideDesc": { + "message": "Bitwarden will then prompt you to update the password in the password manager.", + "description": "Description of the update in Bitwarden slide on the at-risk password page carousel" + }, + "updateInBitwardenSlideImgAlt": { + "message": "Illustration of a Bitwarden’s notification prompting the user to update the login" + }, "turnOnAutofill": { "message": "Turn on autofill" }, @@ -4181,6 +4275,20 @@ } } }, + "copyFieldValue": { + "message": "Copy $FIELD$, $VALUE$", + "description": "Title for a button that copies a field value to the clipboard.", + "placeholders": { + "field": { + "content": "$1", + "example": "Username" + }, + "value": { + "content": "$2", + "example": "Foo" + } + } + }, "noValuesToCopy": { "message": "Ingen værdier at kopiere" }, diff --git a/apps/browser/src/_locales/de/messages.json b/apps/browser/src/_locales/de/messages.json index 75fc90150b9..7a81a501c04 100644 --- a/apps/browser/src/_locales/de/messages.json +++ b/apps/browser/src/_locales/de/messages.json @@ -80,6 +80,15 @@ "masterPassHint": { "message": "Master-Passwort-Hinweis (optional)" }, + "passwordStrengthScore": { + "message": "Bewertung der Passwortstärke $SCORE$", + "placeholders": { + "score": { + "content": "$1", + "example": "4" + } + } + }, "joinOrganization": { "message": "Organisation beitreten" }, @@ -876,6 +885,21 @@ "logInToBitwarden": { "message": "Bei Bitwarden anmelden" }, + "enterTheCodeSentToYourEmail": { + "message": "Gib den an deine E-Mail-Adresse gesendeten Code ein" + }, + "enterTheCodeFromYourAuthenticatorApp": { + "message": "Gib den Code aus deiner Authenticator-App ein" + }, + "pressYourYubiKeyToAuthenticate": { + "message": "Drücke zum Authentifizieren auf deinen YubiKey" + }, + "duoTwoFactorRequiredPageSubtitle": { + "message": "Die Duo-Zwei-Faktor-Authentifizierung ist für dein Konto erforderlich. Folge den Schritten unten, um die Anmeldung abzuschließen." + }, + "followTheStepsBelowToFinishLoggingIn": { + "message": "Folge den Schritten unten, um die Anmeldung abzuschließen." + }, "restartRegistration": { "message": "Registrierung neu starten" }, @@ -1365,12 +1389,22 @@ "rememberMe": { "message": "Angemeldet bleiben" }, + "dontAskAgainOnThisDeviceFor30Days": { + "message": "Für 30 Tage auf diesem Gerät nicht mehr fragen" + }, "sendVerificationCodeEmailAgain": { "message": "E-Mail mit Bestätigungscode erneut versenden" }, "useAnotherTwoStepMethod": { "message": "Verwende eine andere zweistufige Login-Methode" }, + "selectAnotherMethod": { + "message": "Wähle eine andere Methode", + "description": "Select another two-step login method" + }, + "useYourRecoveryCode": { + "message": "Verwende deinen Wiederherstellungscode" + }, "insertYubiKey": { "message": "Stecke deinen YubiKey in den USB-Port Ihres Computers, dann berühre den Button." }, @@ -1383,9 +1417,18 @@ "webAuthnNewTabOpen": { "message": "Neuen Tab öffnen" }, + "openInNewTab": { + "message": "In neuem Tab öffnen" + }, "webAuthnAuthenticate": { "message": "Authentifiziere WebAuthn" }, + "readSecurityKey": { + "message": "Sicherheitsschlüssel auslesen" + }, + "awaitingSecurityKeyInteraction": { + "message": "Warte auf Sicherheitsschlüssel-Interaktion..." + }, "loginUnavailable": { "message": "Anmeldung nicht verfügbar" }, @@ -1398,6 +1441,9 @@ "twoStepOptions": { "message": "Optionen für Zwei-Faktor-Authentifizierung" }, + "selectTwoStepLoginMethod": { + "message": "Zwei-Faktor-Authentifizierungsmethode auswählen" + }, "recoveryCodeDesc": { "message": "Zugang zu allen Zwei-Faktor Anbietern verloren? Benutze deinen Wiederherstellungscode, um alle Zwei-Faktor Anbieter in deinem Konto zu deaktivieren." }, @@ -2097,6 +2143,15 @@ "vaultTimeoutAction1": { "message": "Timeout-Aktion" }, + "newCustomizationOptionsCalloutTitle": { + "message": "Neue Personalisierungs-Optionen" + }, + "newCustomizationOptionsCalloutContent": { + "message": "Personalisiere deinen Tresor mit Schnellkopier-Aktionen, Kompaktmodus und mehr!" + }, + "newCustomizationOptionsCalloutLink": { + "message": "Alle Aussehen-Einstellungen anzeigen" + }, "lock": { "message": "Sperren", "description": "Verb form: to make secure or inaccessible by" @@ -2391,8 +2446,17 @@ "atRiskPasswords": { "message": "Gefährdete Passwörter" }, - "atRiskPasswordsDescSingleOrg": { - "message": "$ORGANIZATION$ fordert dich auf, diese $COUNT$ Passwörter zu ändern, da diese gefährdet sind.", + "atRiskPasswordDescSingleOrg": { + "message": "$ORGANIZATION$ is requesting you change one password because it is at-risk.", + "placeholders": { + "organization": { + "content": "$1", + "example": "Acme Corp" + } + } + }, + "atRiskPasswordsDescSingleOrgPlural": { + "message": "$ORGANIZATION$ is requesting you change the $COUNT$ passwords because they are at-risk.", "placeholders": { "organization": { "content": "$1", @@ -2404,8 +2468,8 @@ } } }, - "atRiskPasswordsDescMultiOrg": { - "message": "Deine Organisationen fordern dich auf, diese $COUNT$ Passwörter zu ändern, da diese gefährdet sind.", + "atRiskPasswordsDescMultiOrgPlural": { + "message": "Your organizations are requesting you change the $COUNT$ passwords because they are at-risk.", "placeholders": { "count": { "content": "$1", @@ -2431,6 +2495,36 @@ "changeAtRiskPasswordsFasterDesc": { "message": "Aktualisiere deine Einstellungen, damit du deine Passwörter schnell automatisch ausfüllen kannst und neue generieren kannst" }, + "reviewAtRiskLogins": { + "message": "Review at-risk logins" + }, + "reviewAtRiskPasswords": { + "message": "Review at-risk passwords" + }, + "reviewAtRiskLoginsSlideDesc": { + "message": "Your organization passwords are at-risk because they are weak, reused, and/or exposed.", + "description": "Description of the review at-risk login slide on the at-risk password page carousel" + }, + "reviewAtRiskLoginSlideImgAlt": { + "message": "Illustration of a list of logins that are at-risk" + }, + "generatePasswordSlideDesc": { + "message": "Quickly generate a strong, unique password with the Bitwarden autofill menu on the at-risk site.", + "description": "Description of the generate password slide on the at-risk password page carousel" + }, + "generatePasswordSlideImgAlt": { + "message": "Illustration of the Bitwarden autofill menu displaying a generated password" + }, + "updateInBitwarden": { + "message": "Update in Bitwarden" + }, + "updateInBitwardenSlideDesc": { + "message": "Bitwarden will then prompt you to update the password in the password manager.", + "description": "Description of the update in Bitwarden slide on the at-risk password page carousel" + }, + "updateInBitwardenSlideImgAlt": { + "message": "Illustration of a Bitwarden’s notification prompting the user to update the login" + }, "turnOnAutofill": { "message": "Auto-Ausfüllen aktivieren" }, @@ -4181,6 +4275,20 @@ } } }, + "copyFieldValue": { + "message": "$FIELD$, $VALUE$ kopieren", + "description": "Title for a button that copies a field value to the clipboard.", + "placeholders": { + "field": { + "content": "$1", + "example": "Username" + }, + "value": { + "content": "$2", + "example": "Foo" + } + } + }, "noValuesToCopy": { "message": "Keine Werte zum Kopieren" }, diff --git a/apps/browser/src/_locales/el/messages.json b/apps/browser/src/_locales/el/messages.json index 8095cc41476..dd4be61b1d2 100644 --- a/apps/browser/src/_locales/el/messages.json +++ b/apps/browser/src/_locales/el/messages.json @@ -80,6 +80,15 @@ "masterPassHint": { "message": "Υπόδειξη κύριου κωδικού πρόσβασης (προαιρετικό)" }, + "passwordStrengthScore": { + "message": "Password strength score $SCORE$", + "placeholders": { + "score": { + "content": "$1", + "example": "4" + } + } + }, "joinOrganization": { "message": "Συμμετοχή στον οργανισμό" }, @@ -876,6 +885,21 @@ "logInToBitwarden": { "message": "Σύνδεση στο Bitwarden" }, + "enterTheCodeSentToYourEmail": { + "message": "Enter the code sent to your email" + }, + "enterTheCodeFromYourAuthenticatorApp": { + "message": "Enter the code from your authenticator app" + }, + "pressYourYubiKeyToAuthenticate": { + "message": "Press your YubiKey to authenticate" + }, + "duoTwoFactorRequiredPageSubtitle": { + "message": "Duo two-step login is required for your account. Follow the steps below to finish logging in." + }, + "followTheStepsBelowToFinishLoggingIn": { + "message": "Follow the steps below to finish logging in." + }, "restartRegistration": { "message": "Επανεκκίνηση εγγραφής" }, @@ -1365,12 +1389,22 @@ "rememberMe": { "message": "Να με θυμάσαι" }, + "dontAskAgainOnThisDeviceFor30Days": { + "message": "Don't ask again on this device for 30 days" + }, "sendVerificationCodeEmailAgain": { "message": "Αποστολή email κωδικού επαλήθευσης ξανά" }, "useAnotherTwoStepMethod": { "message": "Χρήση άλλης μεθόδου σύνδεσης δύο παραγόντων" }, + "selectAnotherMethod": { + "message": "Select another method", + "description": "Select another two-step login method" + }, + "useYourRecoveryCode": { + "message": "Use your recovery code" + }, "insertYubiKey": { "message": "Τοποθετήστε το YubiKey στη θύρα USB του υπολογιστή σας και έπειτα κάντε κλικ στο κουμπί του." }, @@ -1383,9 +1417,18 @@ "webAuthnNewTabOpen": { "message": "Άνοιγμα νέας καρτέλας" }, + "openInNewTab": { + "message": "Open in new tab" + }, "webAuthnAuthenticate": { "message": "Ταυτοποίηση WebAuthn" }, + "readSecurityKey": { + "message": "Read security key" + }, + "awaitingSecurityKeyInteraction": { + "message": "Awaiting security key interaction..." + }, "loginUnavailable": { "message": "Μη διαθέσιμη σύνδεση" }, @@ -1398,6 +1441,9 @@ "twoStepOptions": { "message": "Επιλογές σύνδεσης δύο βημάτων" }, + "selectTwoStepLoginMethod": { + "message": "Select two-step login method" + }, "recoveryCodeDesc": { "message": "Έχετε χάσει την πρόσβαση σε όλους τους παρόχους δύο παραγόντων; Χρησιμοποιήστε τον κωδικό ανάκτησης για να απενεργοποιήσετε όλους τους παρόχους δύο παραγόντων από το λογαριασμό σας." }, @@ -2097,6 +2143,15 @@ "vaultTimeoutAction1": { "message": "Ενέργεια κατά τη λήξη χρονικού ορίου" }, + "newCustomizationOptionsCalloutTitle": { + "message": "New customization options" + }, + "newCustomizationOptionsCalloutContent": { + "message": "Customize your vault experience with quick copy actions, compact mode, and more!" + }, + "newCustomizationOptionsCalloutLink": { + "message": "View all Appearance settings" + }, "lock": { "message": "Κλείδωμα", "description": "Verb form: to make secure or inaccessible by" @@ -2391,8 +2446,17 @@ "atRiskPasswords": { "message": "Κωδικοί πρόσβασης σε κίνδυνο" }, - "atRiskPasswordsDescSingleOrg": { - "message": "$ORGANIZATION$ is requesting you change the $COUNT$ passwords because they are at risk.", + "atRiskPasswordDescSingleOrg": { + "message": "$ORGANIZATION$ is requesting you change one password because it is at-risk.", + "placeholders": { + "organization": { + "content": "$1", + "example": "Acme Corp" + } + } + }, + "atRiskPasswordsDescSingleOrgPlural": { + "message": "$ORGANIZATION$ is requesting you change the $COUNT$ passwords because they are at-risk.", "placeholders": { "organization": { "content": "$1", @@ -2404,8 +2468,8 @@ } } }, - "atRiskPasswordsDescMultiOrg": { - "message": "Your organizations are requesting you change the $COUNT$ passwords because they are at risk.", + "atRiskPasswordsDescMultiOrgPlural": { + "message": "Your organizations are requesting you change the $COUNT$ passwords because they are at-risk.", "placeholders": { "count": { "content": "$1", @@ -2431,6 +2495,36 @@ "changeAtRiskPasswordsFasterDesc": { "message": "Update your settings so you can quickly autofill your passwords and generate new ones" }, + "reviewAtRiskLogins": { + "message": "Review at-risk logins" + }, + "reviewAtRiskPasswords": { + "message": "Review at-risk passwords" + }, + "reviewAtRiskLoginsSlideDesc": { + "message": "Your organization passwords are at-risk because they are weak, reused, and/or exposed.", + "description": "Description of the review at-risk login slide on the at-risk password page carousel" + }, + "reviewAtRiskLoginSlideImgAlt": { + "message": "Illustration of a list of logins that are at-risk" + }, + "generatePasswordSlideDesc": { + "message": "Quickly generate a strong, unique password with the Bitwarden autofill menu on the at-risk site.", + "description": "Description of the generate password slide on the at-risk password page carousel" + }, + "generatePasswordSlideImgAlt": { + "message": "Illustration of the Bitwarden autofill menu displaying a generated password" + }, + "updateInBitwarden": { + "message": "Update in Bitwarden" + }, + "updateInBitwardenSlideDesc": { + "message": "Bitwarden will then prompt you to update the password in the password manager.", + "description": "Description of the update in Bitwarden slide on the at-risk password page carousel" + }, + "updateInBitwardenSlideImgAlt": { + "message": "Illustration of a Bitwarden’s notification prompting the user to update the login" + }, "turnOnAutofill": { "message": "Ενεργοποίηση αυτόματης συμπλήρωσης" }, @@ -4181,6 +4275,20 @@ } } }, + "copyFieldValue": { + "message": "Copy $FIELD$, $VALUE$", + "description": "Title for a button that copies a field value to the clipboard.", + "placeholders": { + "field": { + "content": "$1", + "example": "Username" + }, + "value": { + "content": "$2", + "example": "Foo" + } + } + }, "noValuesToCopy": { "message": "Δεν υπάρχουν τιμές για αντιγραφή" }, diff --git a/apps/browser/src/_locales/en/messages.json b/apps/browser/src/_locales/en/messages.json index ea9e62916a2..e9602ae96c0 100644 --- a/apps/browser/src/_locales/en/messages.json +++ b/apps/browser/src/_locales/en/messages.json @@ -1070,6 +1070,56 @@ "notificationAddSave": { "message": "Save" }, + "loginSaveSuccessDetails": { + "message": "$USERNAME$ saved to Bitwarden.", + "placeholders": { + "username": { + "content": "$1" + } + }, + "description": "Shown to user after login is saved." + }, + "loginUpdatedSuccessDetails": { + "message": "$USERNAME$ updated in Bitwarden.", + "placeholders": { + "username": { + "content": "$1" + } + }, + "description": "Shown to user after login is updated." + }, + "saveAsNewLoginAction": { + "message": "Save as new login", + "description": "Button text for saving login details as a new entry." + }, + "updateLoginAction": { + "message": "Update login", + "description": "Button text for updating an existing login entry." + }, + "saveLoginPrompt": { + "message": "Save login?", + "description": "Prompt asking the user if they want to save their login details." + }, + "updateLoginPrompt": { + "message": "Update existing login?", + "description": "Prompt asking the user if they want to update an existing login entry." + }, + "loginSaveSuccess": { + "message": "Login saved", + "description": "Message displayed when login details are successfully saved." + }, + "loginUpdateSuccess": { + "message": "Login updated", + "description": "Message displayed when login details are successfully updated." + }, + "saveFailure": { + "message": "Error saving", + "description": "Error message shown when the system fails to save login details." + }, + "saveFailureDetails": { + "message": "Oh no! We couldn't save this. Try entering the details manually.", + "description": "Detailed error message shown when saving login details fails." + }, "enableChangedPasswordNotification": { "message": "Ask to update existing login" }, @@ -1397,14 +1447,14 @@ }, "useAnotherTwoStepMethod": { "message": "Use another two-step login method" - }, + }, "selectAnotherMethod": { "message": "Select another method", "description": "Select another two-step login method" }, "useYourRecoveryCode": { "message": "Use your recovery code" - }, + }, "insertYubiKey": { "message": "Insert your YubiKey into your computer's USB port, then touch its button." }, @@ -2446,8 +2496,17 @@ "atRiskPasswords": { "message": "At-risk passwords" }, - "atRiskPasswordsDescSingleOrg": { - "message": "$ORGANIZATION$ is requesting you change the $COUNT$ passwords because they are at risk.", + "atRiskPasswordDescSingleOrg": { + "message": "$ORGANIZATION$ is requesting you change one password because it is at-risk.", + "placeholders": { + "organization": { + "content": "$1", + "example": "Acme Corp" + } + } + }, + "atRiskPasswordsDescSingleOrgPlural": { + "message": "$ORGANIZATION$ is requesting you change the $COUNT$ passwords because they are at-risk.", "placeholders": { "organization": { "content": "$1", @@ -2459,8 +2518,8 @@ } } }, - "atRiskPasswordsDescMultiOrg": { - "message": "Your organizations are requesting you change the $COUNT$ passwords because they are at risk.", + "atRiskPasswordsDescMultiOrgPlural": { + "message": "Your organizations are requesting you change the $COUNT$ passwords because they are at-risk.", "placeholders": { "count": { "content": "$1", @@ -2486,6 +2545,36 @@ "changeAtRiskPasswordsFasterDesc": { "message": "Update your settings so you can quickly autofill your passwords and generate new ones" }, + "reviewAtRiskLogins": { + "message": "Review at-risk logins" + }, + "reviewAtRiskPasswords": { + "message": "Review at-risk passwords" + }, + "reviewAtRiskLoginsSlideDesc": { + "message": "Your organization passwords are at-risk because they are weak, reused, and/or exposed.", + "description": "Description of the review at-risk login slide on the at-risk password page carousel" + }, + "reviewAtRiskLoginSlideImgAlt": { + "message": "Illustration of a list of logins that are at-risk" + }, + "generatePasswordSlideDesc": { + "message": "Quickly generate a strong, unique password with the Bitwarden autofill menu on the at-risk site.", + "description": "Description of the generate password slide on the at-risk password page carousel" + }, + "generatePasswordSlideImgAlt": { + "message": "Illustration of the Bitwarden autofill menu displaying a generated password" + }, + "updateInBitwarden": { + "message": "Update in Bitwarden" + }, + "updateInBitwardenSlideDesc": { + "message": "Bitwarden will then prompt you to update the password in the password manager.", + "description": "Description of the update in Bitwarden slide on the at-risk password page carousel" + }, + "updateInBitwardenSlideImgAlt": { + "message": "Illustration of a Bitwarden’s notification prompting the user to update the login" + }, "turnOnAutofill": { "message": "Turn on autofill" }, @@ -4038,6 +4127,9 @@ "activeAccount": { "message": "Active account" }, + "bitwardenAccount": { + "message": "Bitwarden account" + }, "availableAccounts": { "message": "Available accounts" }, diff --git a/apps/browser/src/_locales/en_GB/messages.json b/apps/browser/src/_locales/en_GB/messages.json index 291c9614de4..e06dd05575d 100644 --- a/apps/browser/src/_locales/en_GB/messages.json +++ b/apps/browser/src/_locales/en_GB/messages.json @@ -80,6 +80,15 @@ "masterPassHint": { "message": "Master password hint (optional)" }, + "passwordStrengthScore": { + "message": "Password strength score $SCORE$", + "placeholders": { + "score": { + "content": "$1", + "example": "4" + } + } + }, "joinOrganization": { "message": "Join organisation" }, @@ -876,6 +885,21 @@ "logInToBitwarden": { "message": "Log in to Bitwarden" }, + "enterTheCodeSentToYourEmail": { + "message": "Enter the code sent to your email" + }, + "enterTheCodeFromYourAuthenticatorApp": { + "message": "Enter the code from your authenticator app" + }, + "pressYourYubiKeyToAuthenticate": { + "message": "Press your YubiKey to authenticate" + }, + "duoTwoFactorRequiredPageSubtitle": { + "message": "Duo two-step login is required for your account. Follow the steps below to finish logging in." + }, + "followTheStepsBelowToFinishLoggingIn": { + "message": "Follow the steps below to finish logging in." + }, "restartRegistration": { "message": "Restart registration" }, @@ -1365,12 +1389,22 @@ "rememberMe": { "message": "Remember me" }, + "dontAskAgainOnThisDeviceFor30Days": { + "message": "Don't ask again on this device for 30 days" + }, "sendVerificationCodeEmailAgain": { "message": "Send verification code email again" }, "useAnotherTwoStepMethod": { "message": "Use another two-step login method" }, + "selectAnotherMethod": { + "message": "Select another method", + "description": "Select another two-step login method" + }, + "useYourRecoveryCode": { + "message": "Use your recovery code" + }, "insertYubiKey": { "message": "Insert your YubiKey into your computer's USB port, then touch its button." }, @@ -1383,9 +1417,18 @@ "webAuthnNewTabOpen": { "message": "Open new tab" }, + "openInNewTab": { + "message": "Open in new tab" + }, "webAuthnAuthenticate": { "message": "Authenticate WebAuthn" }, + "readSecurityKey": { + "message": "Read security key" + }, + "awaitingSecurityKeyInteraction": { + "message": "Awaiting security key interaction..." + }, "loginUnavailable": { "message": "Login unavailable" }, @@ -1398,6 +1441,9 @@ "twoStepOptions": { "message": "Two-step login options" }, + "selectTwoStepLoginMethod": { + "message": "Select two-step login method" + }, "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." }, @@ -2097,6 +2143,15 @@ "vaultTimeoutAction1": { "message": "Timeout action" }, + "newCustomizationOptionsCalloutTitle": { + "message": "New customisation options" + }, + "newCustomizationOptionsCalloutContent": { + "message": "Customise your vault experience with quick copy actions, compact mode, and more!" + }, + "newCustomizationOptionsCalloutLink": { + "message": "View all Appearance settings" + }, "lock": { "message": "Lock", "description": "Verb form: to make secure or inaccessible by" @@ -2391,8 +2446,17 @@ "atRiskPasswords": { "message": "At-risk passwords" }, - "atRiskPasswordsDescSingleOrg": { - "message": "$ORGANIZATION$ is requesting you change the $COUNT$ passwords because they are at risk.", + "atRiskPasswordDescSingleOrg": { + "message": "$ORGANIZATION$ is requesting you change one password because it is at-risk.", + "placeholders": { + "organization": { + "content": "$1", + "example": "Acme Corp" + } + } + }, + "atRiskPasswordsDescSingleOrgPlural": { + "message": "$ORGANIZATION$ is requesting you change the $COUNT$ passwords because they are at-risk.", "placeholders": { "organization": { "content": "$1", @@ -2404,8 +2468,8 @@ } } }, - "atRiskPasswordsDescMultiOrg": { - "message": "Your organisations are requesting you change the $COUNT$ passwords because they are at risk.", + "atRiskPasswordsDescMultiOrgPlural": { + "message": "Your organisations are requesting you change the $COUNT$ passwords because they are at-risk.", "placeholders": { "count": { "content": "$1", @@ -2431,6 +2495,36 @@ "changeAtRiskPasswordsFasterDesc": { "message": "Update your settings so you can quickly autofill your passwords and generate new ones" }, + "reviewAtRiskLogins": { + "message": "Review at-risk logins" + }, + "reviewAtRiskPasswords": { + "message": "Review at-risk passwords" + }, + "reviewAtRiskLoginsSlideDesc": { + "message": "Your organisation passwords are at-risk because they are weak, reused, and/or exposed.", + "description": "Description of the review at-risk login slide on the at-risk password page carousel" + }, + "reviewAtRiskLoginSlideImgAlt": { + "message": "Illustration of a list of logins that are at-risk" + }, + "generatePasswordSlideDesc": { + "message": "Quickly generate a strong, unique password with the Bitwarden autofill menu on the at-risk site.", + "description": "Description of the generate password slide on the at-risk password page carousel" + }, + "generatePasswordSlideImgAlt": { + "message": "Illustration of the Bitwarden autofill menu displaying a generated password" + }, + "updateInBitwarden": { + "message": "Update in Bitwarden" + }, + "updateInBitwardenSlideDesc": { + "message": "Bitwarden will then prompt you to update the password in the password manager.", + "description": "Description of the update in Bitwarden slide on the at-risk password page carousel" + }, + "updateInBitwardenSlideImgAlt": { + "message": "Illustration of a Bitwarden’s notification prompting the user to update the login" + }, "turnOnAutofill": { "message": "Turn on autofill" }, @@ -4181,6 +4275,20 @@ } } }, + "copyFieldValue": { + "message": "Copy $FIELD$, $VALUE$", + "description": "Title for a button that copies a field value to the clipboard.", + "placeholders": { + "field": { + "content": "$1", + "example": "Username" + }, + "value": { + "content": "$2", + "example": "Foo" + } + } + }, "noValuesToCopy": { "message": "No values to copy" }, diff --git a/apps/browser/src/_locales/en_IN/messages.json b/apps/browser/src/_locales/en_IN/messages.json index 11beca8f909..23fe1e28140 100644 --- a/apps/browser/src/_locales/en_IN/messages.json +++ b/apps/browser/src/_locales/en_IN/messages.json @@ -80,6 +80,15 @@ "masterPassHint": { "message": "Master password hint (optional)" }, + "passwordStrengthScore": { + "message": "Password strength score $SCORE$", + "placeholders": { + "score": { + "content": "$1", + "example": "4" + } + } + }, "joinOrganization": { "message": "Join organisation" }, @@ -876,6 +885,21 @@ "logInToBitwarden": { "message": "Log in to Bitwarden" }, + "enterTheCodeSentToYourEmail": { + "message": "Enter the code sent to your email" + }, + "enterTheCodeFromYourAuthenticatorApp": { + "message": "Enter the code from your authenticator app" + }, + "pressYourYubiKeyToAuthenticate": { + "message": "Press your YubiKey to authenticate" + }, + "duoTwoFactorRequiredPageSubtitle": { + "message": "Duo two-step login is required for your account. Follow the steps below to finish logging in." + }, + "followTheStepsBelowToFinishLoggingIn": { + "message": "Follow the steps below to finish logging in." + }, "restartRegistration": { "message": "Restart registration" }, @@ -1365,12 +1389,22 @@ "rememberMe": { "message": "Remember me" }, + "dontAskAgainOnThisDeviceFor30Days": { + "message": "Don't ask again on this device for 30 days" + }, "sendVerificationCodeEmailAgain": { "message": "Send verification code email again" }, "useAnotherTwoStepMethod": { "message": "Use another two-step login method" }, + "selectAnotherMethod": { + "message": "Select another method", + "description": "Select another two-step login method" + }, + "useYourRecoveryCode": { + "message": "Use your recovery code" + }, "insertYubiKey": { "message": "Insert your YubiKey into your computer's USB port, then touch its button." }, @@ -1383,9 +1417,18 @@ "webAuthnNewTabOpen": { "message": "Open new tab" }, + "openInNewTab": { + "message": "Open in new tab" + }, "webAuthnAuthenticate": { "message": "Authenticate WebAuthn" }, + "readSecurityKey": { + "message": "Read security key" + }, + "awaitingSecurityKeyInteraction": { + "message": "Awaiting security key interaction..." + }, "loginUnavailable": { "message": "Login unavailable" }, @@ -1398,6 +1441,9 @@ "twoStepOptions": { "message": "Two-step login options" }, + "selectTwoStepLoginMethod": { + "message": "Select two-step login method" + }, "recoveryCodeDesc": { "message": "Lost access to all of your two-factor providers? Use your recovery code to disable all two-factor providers from your account." }, @@ -2097,6 +2143,15 @@ "vaultTimeoutAction1": { "message": "Timeout action" }, + "newCustomizationOptionsCalloutTitle": { + "message": "New customisation options" + }, + "newCustomizationOptionsCalloutContent": { + "message": "Customise your vault experience with quick copy actions, compact mode, and more!" + }, + "newCustomizationOptionsCalloutLink": { + "message": "View all Appearance settings" + }, "lock": { "message": "Lock", "description": "Verb form: to make secure or inaccessible by" @@ -2391,8 +2446,17 @@ "atRiskPasswords": { "message": "At-risk passwords" }, - "atRiskPasswordsDescSingleOrg": { - "message": "$ORGANIZATION$ is requesting you change the $COUNT$ passwords because they are at risk.", + "atRiskPasswordDescSingleOrg": { + "message": "$ORGANIZATION$ is requesting you change one password because it is at-risk.", + "placeholders": { + "organization": { + "content": "$1", + "example": "Acme Corp" + } + } + }, + "atRiskPasswordsDescSingleOrgPlural": { + "message": "$ORGANIZATION$ is requesting you change the $COUNT$ passwords because they are at-risk.", "placeholders": { "organization": { "content": "$1", @@ -2404,8 +2468,8 @@ } } }, - "atRiskPasswordsDescMultiOrg": { - "message": "Your organisations are requesting you change the $COUNT$ passwords because they are at risk.", + "atRiskPasswordsDescMultiOrgPlural": { + "message": "Your organisations are requesting you change the $COUNT$ passwords because they are at-risk.", "placeholders": { "count": { "content": "$1", @@ -2431,6 +2495,36 @@ "changeAtRiskPasswordsFasterDesc": { "message": "Update your settings so you can quickly autofill your passwords and generate new ones" }, + "reviewAtRiskLogins": { + "message": "Review at-risk logins" + }, + "reviewAtRiskPasswords": { + "message": "Review at-risk passwords" + }, + "reviewAtRiskLoginsSlideDesc": { + "message": "Your organisation passwords are at-risk because they are weak, reused, and/or exposed.", + "description": "Description of the review at-risk login slide on the at-risk password page carousel" + }, + "reviewAtRiskLoginSlideImgAlt": { + "message": "Illustration of a list of logins that are at-risk" + }, + "generatePasswordSlideDesc": { + "message": "Quickly generate a strong, unique password with the Bitwarden autofill menu on the at-risk site.", + "description": "Description of the generate password slide on the at-risk password page carousel" + }, + "generatePasswordSlideImgAlt": { + "message": "Illustration of the Bitwarden autofill menu displaying a generated password" + }, + "updateInBitwarden": { + "message": "Update in Bitwarden" + }, + "updateInBitwardenSlideDesc": { + "message": "Bitwarden will then prompt you to update the password in the password manager.", + "description": "Description of the update in Bitwarden slide on the at-risk password page carousel" + }, + "updateInBitwardenSlideImgAlt": { + "message": "Illustration of a Bitwarden’s notification prompting the user to update the login" + }, "turnOnAutofill": { "message": "Turn on autofill" }, @@ -4181,6 +4275,20 @@ } } }, + "copyFieldValue": { + "message": "Copy $FIELD$, $VALUE$", + "description": "Title for a button that copies a field value to the clipboard.", + "placeholders": { + "field": { + "content": "$1", + "example": "Username" + }, + "value": { + "content": "$2", + "example": "Foo" + } + } + }, "noValuesToCopy": { "message": "No values to copy" }, diff --git a/apps/browser/src/_locales/es/messages.json b/apps/browser/src/_locales/es/messages.json index 6cd70552b19..9b6d1a48936 100644 --- a/apps/browser/src/_locales/es/messages.json +++ b/apps/browser/src/_locales/es/messages.json @@ -80,6 +80,15 @@ "masterPassHint": { "message": "Pista de contraseña maestra (opcional)" }, + "passwordStrengthScore": { + "message": "Password strength score $SCORE$", + "placeholders": { + "score": { + "content": "$1", + "example": "4" + } + } + }, "joinOrganization": { "message": "Incorporarse a la organización" }, @@ -876,6 +885,21 @@ "logInToBitwarden": { "message": "Iniciar sesión en Bitwarden" }, + "enterTheCodeSentToYourEmail": { + "message": "Enter the code sent to your email" + }, + "enterTheCodeFromYourAuthenticatorApp": { + "message": "Enter the code from your authenticator app" + }, + "pressYourYubiKeyToAuthenticate": { + "message": "Press your YubiKey to authenticate" + }, + "duoTwoFactorRequiredPageSubtitle": { + "message": "Duo two-step login is required for your account. Follow the steps below to finish logging in." + }, + "followTheStepsBelowToFinishLoggingIn": { + "message": "Follow the steps below to finish logging in." + }, "restartRegistration": { "message": "Reiniciar registro" }, @@ -1365,12 +1389,22 @@ "rememberMe": { "message": "Recordarme" }, + "dontAskAgainOnThisDeviceFor30Days": { + "message": "Don't ask again on this device for 30 days" + }, "sendVerificationCodeEmailAgain": { "message": "Reenviar código de verificación por correo electrónico" }, "useAnotherTwoStepMethod": { "message": "Utilizar otro método de autenticación en dos pasos" }, + "selectAnotherMethod": { + "message": "Select another method", + "description": "Select another two-step login method" + }, + "useYourRecoveryCode": { + "message": "Use your recovery code" + }, "insertYubiKey": { "message": "Inserta tu YubiKey en el puerto USB de tu equipo y posteriormente pulsa su botón." }, @@ -1383,9 +1417,18 @@ "webAuthnNewTabOpen": { "message": "Abrir nueva pestaña" }, + "openInNewTab": { + "message": "Open in new tab" + }, "webAuthnAuthenticate": { "message": "Autenticar WebAuthn" }, + "readSecurityKey": { + "message": "Read security key" + }, + "awaitingSecurityKeyInteraction": { + "message": "Awaiting security key interaction..." + }, "loginUnavailable": { "message": "Entrada no disponible" }, @@ -1398,6 +1441,9 @@ "twoStepOptions": { "message": "Opciones de la autenticación en dos pasos" }, + "selectTwoStepLoginMethod": { + "message": "Select two-step login method" + }, "recoveryCodeDesc": { "message": "¿Has perdido el acceso a todos tus métodos de autenticación en dos pasos? Utiliza tu código de recuperación para deshabilitar todos los métodos de autenticación en dos pasos de tu cuenta." }, @@ -2097,6 +2143,15 @@ "vaultTimeoutAction1": { "message": "Acción de tiempo agotado" }, + "newCustomizationOptionsCalloutTitle": { + "message": "New customization options" + }, + "newCustomizationOptionsCalloutContent": { + "message": "Customize your vault experience with quick copy actions, compact mode, and more!" + }, + "newCustomizationOptionsCalloutLink": { + "message": "View all Appearance settings" + }, "lock": { "message": "Bloquear", "description": "Verb form: to make secure or inaccessible by" @@ -2391,8 +2446,17 @@ "atRiskPasswords": { "message": "Contraseñas de riesgo" }, - "atRiskPasswordsDescSingleOrg": { - "message": "$ORGANIZATION$ is requesting you change the $COUNT$ passwords because they are at risk.", + "atRiskPasswordDescSingleOrg": { + "message": "$ORGANIZATION$ is requesting you change one password because it is at-risk.", + "placeholders": { + "organization": { + "content": "$1", + "example": "Acme Corp" + } + } + }, + "atRiskPasswordsDescSingleOrgPlural": { + "message": "$ORGANIZATION$ is requesting you change the $COUNT$ passwords because they are at-risk.", "placeholders": { "organization": { "content": "$1", @@ -2404,8 +2468,8 @@ } } }, - "atRiskPasswordsDescMultiOrg": { - "message": "Your organizations are requesting you change the $COUNT$ passwords because they are at risk.", + "atRiskPasswordsDescMultiOrgPlural": { + "message": "Your organizations are requesting you change the $COUNT$ passwords because they are at-risk.", "placeholders": { "count": { "content": "$1", @@ -2431,6 +2495,36 @@ "changeAtRiskPasswordsFasterDesc": { "message": "Update your settings so you can quickly autofill your passwords and generate new ones" }, + "reviewAtRiskLogins": { + "message": "Review at-risk logins" + }, + "reviewAtRiskPasswords": { + "message": "Review at-risk passwords" + }, + "reviewAtRiskLoginsSlideDesc": { + "message": "Your organization passwords are at-risk because they are weak, reused, and/or exposed.", + "description": "Description of the review at-risk login slide on the at-risk password page carousel" + }, + "reviewAtRiskLoginSlideImgAlt": { + "message": "Illustration of a list of logins that are at-risk" + }, + "generatePasswordSlideDesc": { + "message": "Quickly generate a strong, unique password with the Bitwarden autofill menu on the at-risk site.", + "description": "Description of the generate password slide on the at-risk password page carousel" + }, + "generatePasswordSlideImgAlt": { + "message": "Illustration of the Bitwarden autofill menu displaying a generated password" + }, + "updateInBitwarden": { + "message": "Update in Bitwarden" + }, + "updateInBitwardenSlideDesc": { + "message": "Bitwarden will then prompt you to update the password in the password manager.", + "description": "Description of the update in Bitwarden slide on the at-risk password page carousel" + }, + "updateInBitwardenSlideImgAlt": { + "message": "Illustration of a Bitwarden’s notification prompting the user to update the login" + }, "turnOnAutofill": { "message": "Activar autorrelleno" }, @@ -4181,6 +4275,20 @@ } } }, + "copyFieldValue": { + "message": "Copy $FIELD$, $VALUE$", + "description": "Title for a button that copies a field value to the clipboard.", + "placeholders": { + "field": { + "content": "$1", + "example": "Username" + }, + "value": { + "content": "$2", + "example": "Foo" + } + } + }, "noValuesToCopy": { "message": "No hay valores para copiar" }, diff --git a/apps/browser/src/_locales/et/messages.json b/apps/browser/src/_locales/et/messages.json index e4b02553b85..81dd447ea9f 100644 --- a/apps/browser/src/_locales/et/messages.json +++ b/apps/browser/src/_locales/et/messages.json @@ -80,6 +80,15 @@ "masterPassHint": { "message": "Ülemparooli vihje (ei ole kohustuslik)" }, + "passwordStrengthScore": { + "message": "Password strength score $SCORE$", + "placeholders": { + "score": { + "content": "$1", + "example": "4" + } + } + }, "joinOrganization": { "message": "Liitu organisatsiooniga" }, @@ -876,6 +885,21 @@ "logInToBitwarden": { "message": "Log in to Bitwarden" }, + "enterTheCodeSentToYourEmail": { + "message": "Enter the code sent to your email" + }, + "enterTheCodeFromYourAuthenticatorApp": { + "message": "Enter the code from your authenticator app" + }, + "pressYourYubiKeyToAuthenticate": { + "message": "Press your YubiKey to authenticate" + }, + "duoTwoFactorRequiredPageSubtitle": { + "message": "Duo two-step login is required for your account. Follow the steps below to finish logging in." + }, + "followTheStepsBelowToFinishLoggingIn": { + "message": "Follow the steps below to finish logging in." + }, "restartRegistration": { "message": "Alusta registreerimist uuesti" }, @@ -1365,12 +1389,22 @@ "rememberMe": { "message": "Jäta mind meelde" }, + "dontAskAgainOnThisDeviceFor30Days": { + "message": "Don't ask again on this device for 30 days" + }, "sendVerificationCodeEmailAgain": { "message": "Saada kinnituskood uuesti e-postile" }, "useAnotherTwoStepMethod": { "message": "Kasuta teist kaheastmelist sisselogimise meetodit" }, + "selectAnotherMethod": { + "message": "Select another method", + "description": "Select another two-step login method" + }, + "useYourRecoveryCode": { + "message": "Use your recovery code" + }, "insertYubiKey": { "message": "Sisesta oma YubiKey arvuti USB porti ja kliki sellele nupule." }, @@ -1383,9 +1417,18 @@ "webAuthnNewTabOpen": { "message": "Ava uus vahekaart" }, + "openInNewTab": { + "message": "Open in new tab" + }, "webAuthnAuthenticate": { "message": "WebAuthn kinnitamine" }, + "readSecurityKey": { + "message": "Read security key" + }, + "awaitingSecurityKeyInteraction": { + "message": "Awaiting security key interaction..." + }, "loginUnavailable": { "message": "Sisselogimine ei ole saadaval" }, @@ -1398,6 +1441,9 @@ "twoStepOptions": { "message": "Kaheastmelise sisselogimise valikud" }, + "selectTwoStepLoginMethod": { + "message": "Select two-step login method" + }, "recoveryCodeDesc": { "message": "Puudub ligipääs kaheastmelise kinnitamise teenusele? Kasuta Taastamise koodi, et kaheastmeline kinnitamine oma kontol välja lülitada." }, @@ -2097,6 +2143,15 @@ "vaultTimeoutAction1": { "message": "Timeout action" }, + "newCustomizationOptionsCalloutTitle": { + "message": "New customization options" + }, + "newCustomizationOptionsCalloutContent": { + "message": "Customize your vault experience with quick copy actions, compact mode, and more!" + }, + "newCustomizationOptionsCalloutLink": { + "message": "View all Appearance settings" + }, "lock": { "message": "Lukusta", "description": "Verb form: to make secure or inaccessible by" @@ -2391,8 +2446,17 @@ "atRiskPasswords": { "message": "At-risk passwords" }, - "atRiskPasswordsDescSingleOrg": { - "message": "$ORGANIZATION$ is requesting you change the $COUNT$ passwords because they are at risk.", + "atRiskPasswordDescSingleOrg": { + "message": "$ORGANIZATION$ is requesting you change one password because it is at-risk.", + "placeholders": { + "organization": { + "content": "$1", + "example": "Acme Corp" + } + } + }, + "atRiskPasswordsDescSingleOrgPlural": { + "message": "$ORGANIZATION$ is requesting you change the $COUNT$ passwords because they are at-risk.", "placeholders": { "organization": { "content": "$1", @@ -2404,8 +2468,8 @@ } } }, - "atRiskPasswordsDescMultiOrg": { - "message": "Your organizations are requesting you change the $COUNT$ passwords because they are at risk.", + "atRiskPasswordsDescMultiOrgPlural": { + "message": "Your organizations are requesting you change the $COUNT$ passwords because they are at-risk.", "placeholders": { "count": { "content": "$1", @@ -2431,6 +2495,36 @@ "changeAtRiskPasswordsFasterDesc": { "message": "Update your settings so you can quickly autofill your passwords and generate new ones" }, + "reviewAtRiskLogins": { + "message": "Review at-risk logins" + }, + "reviewAtRiskPasswords": { + "message": "Review at-risk passwords" + }, + "reviewAtRiskLoginsSlideDesc": { + "message": "Your organization passwords are at-risk because they are weak, reused, and/or exposed.", + "description": "Description of the review at-risk login slide on the at-risk password page carousel" + }, + "reviewAtRiskLoginSlideImgAlt": { + "message": "Illustration of a list of logins that are at-risk" + }, + "generatePasswordSlideDesc": { + "message": "Quickly generate a strong, unique password with the Bitwarden autofill menu on the at-risk site.", + "description": "Description of the generate password slide on the at-risk password page carousel" + }, + "generatePasswordSlideImgAlt": { + "message": "Illustration of the Bitwarden autofill menu displaying a generated password" + }, + "updateInBitwarden": { + "message": "Update in Bitwarden" + }, + "updateInBitwardenSlideDesc": { + "message": "Bitwarden will then prompt you to update the password in the password manager.", + "description": "Description of the update in Bitwarden slide on the at-risk password page carousel" + }, + "updateInBitwardenSlideImgAlt": { + "message": "Illustration of a Bitwarden’s notification prompting the user to update the login" + }, "turnOnAutofill": { "message": "Turn on autofill" }, @@ -4181,6 +4275,20 @@ } } }, + "copyFieldValue": { + "message": "Copy $FIELD$, $VALUE$", + "description": "Title for a button that copies a field value to the clipboard.", + "placeholders": { + "field": { + "content": "$1", + "example": "Username" + }, + "value": { + "content": "$2", + "example": "Foo" + } + } + }, "noValuesToCopy": { "message": "No values to copy" }, diff --git a/apps/browser/src/_locales/eu/messages.json b/apps/browser/src/_locales/eu/messages.json index 36a2cb365ab..106a4405aa1 100644 --- a/apps/browser/src/_locales/eu/messages.json +++ b/apps/browser/src/_locales/eu/messages.json @@ -80,6 +80,15 @@ "masterPassHint": { "message": "Pasahitz nagusirako pista (aukerakoa)" }, + "passwordStrengthScore": { + "message": "Password strength score $SCORE$", + "placeholders": { + "score": { + "content": "$1", + "example": "4" + } + } + }, "joinOrganization": { "message": "Join organization" }, @@ -876,6 +885,21 @@ "logInToBitwarden": { "message": "Log in to Bitwarden" }, + "enterTheCodeSentToYourEmail": { + "message": "Enter the code sent to your email" + }, + "enterTheCodeFromYourAuthenticatorApp": { + "message": "Enter the code from your authenticator app" + }, + "pressYourYubiKeyToAuthenticate": { + "message": "Press your YubiKey to authenticate" + }, + "duoTwoFactorRequiredPageSubtitle": { + "message": "Duo two-step login is required for your account. Follow the steps below to finish logging in." + }, + "followTheStepsBelowToFinishLoggingIn": { + "message": "Follow the steps below to finish logging in." + }, "restartRegistration": { "message": "Restart registration" }, @@ -1365,12 +1389,22 @@ "rememberMe": { "message": "Gogora nazazu" }, + "dontAskAgainOnThisDeviceFor30Days": { + "message": "Don't ask again on this device for 30 days" + }, "sendVerificationCodeEmailAgain": { "message": "Berbidali email bidezko egiaztatze-kodea." }, "useAnotherTwoStepMethod": { "message": "Erabili bi urratseko saio hasierarako beste modu bat" }, + "selectAnotherMethod": { + "message": "Select another method", + "description": "Select another two-step login method" + }, + "useYourRecoveryCode": { + "message": "Use your recovery code" + }, "insertYubiKey": { "message": "Sartu zure YubiKey-a ordenagailuko USB atakan, ondoren, sakatu bere botoia." }, @@ -1383,9 +1417,18 @@ "webAuthnNewTabOpen": { "message": "Ireki fitxa berria" }, + "openInNewTab": { + "message": "Open in new tab" + }, "webAuthnAuthenticate": { "message": "WebAuthn autentifikatu" }, + "readSecurityKey": { + "message": "Read security key" + }, + "awaitingSecurityKeyInteraction": { + "message": "Awaiting security key interaction..." + }, "loginUnavailable": { "message": "Ez dago eskuragarri saio-hasierarik" }, @@ -1398,6 +1441,9 @@ "twoStepOptions": { "message": "Bi urratseko saio hasieraren aukerak" }, + "selectTwoStepLoginMethod": { + "message": "Select two-step login method" + }, "recoveryCodeDesc": { "message": "Bi urratseko egiaztatzeko modu guztietarako sarbidea galdu duzu? Erabili zure berreskuratze-kodea zure kontuko bi urratseko egiaztatze hornitzaile guztiak desaktibatzeko." }, @@ -2097,6 +2143,15 @@ "vaultTimeoutAction1": { "message": "Timeout action" }, + "newCustomizationOptionsCalloutTitle": { + "message": "New customization options" + }, + "newCustomizationOptionsCalloutContent": { + "message": "Customize your vault experience with quick copy actions, compact mode, and more!" + }, + "newCustomizationOptionsCalloutLink": { + "message": "View all Appearance settings" + }, "lock": { "message": "Blokeatu", "description": "Verb form: to make secure or inaccessible by" @@ -2391,8 +2446,17 @@ "atRiskPasswords": { "message": "At-risk passwords" }, - "atRiskPasswordsDescSingleOrg": { - "message": "$ORGANIZATION$ is requesting you change the $COUNT$ passwords because they are at risk.", + "atRiskPasswordDescSingleOrg": { + "message": "$ORGANIZATION$ is requesting you change one password because it is at-risk.", + "placeholders": { + "organization": { + "content": "$1", + "example": "Acme Corp" + } + } + }, + "atRiskPasswordsDescSingleOrgPlural": { + "message": "$ORGANIZATION$ is requesting you change the $COUNT$ passwords because they are at-risk.", "placeholders": { "organization": { "content": "$1", @@ -2404,8 +2468,8 @@ } } }, - "atRiskPasswordsDescMultiOrg": { - "message": "Your organizations are requesting you change the $COUNT$ passwords because they are at risk.", + "atRiskPasswordsDescMultiOrgPlural": { + "message": "Your organizations are requesting you change the $COUNT$ passwords because they are at-risk.", "placeholders": { "count": { "content": "$1", @@ -2431,6 +2495,36 @@ "changeAtRiskPasswordsFasterDesc": { "message": "Update your settings so you can quickly autofill your passwords and generate new ones" }, + "reviewAtRiskLogins": { + "message": "Review at-risk logins" + }, + "reviewAtRiskPasswords": { + "message": "Review at-risk passwords" + }, + "reviewAtRiskLoginsSlideDesc": { + "message": "Your organization passwords are at-risk because they are weak, reused, and/or exposed.", + "description": "Description of the review at-risk login slide on the at-risk password page carousel" + }, + "reviewAtRiskLoginSlideImgAlt": { + "message": "Illustration of a list of logins that are at-risk" + }, + "generatePasswordSlideDesc": { + "message": "Quickly generate a strong, unique password with the Bitwarden autofill menu on the at-risk site.", + "description": "Description of the generate password slide on the at-risk password page carousel" + }, + "generatePasswordSlideImgAlt": { + "message": "Illustration of the Bitwarden autofill menu displaying a generated password" + }, + "updateInBitwarden": { + "message": "Update in Bitwarden" + }, + "updateInBitwardenSlideDesc": { + "message": "Bitwarden will then prompt you to update the password in the password manager.", + "description": "Description of the update in Bitwarden slide on the at-risk password page carousel" + }, + "updateInBitwardenSlideImgAlt": { + "message": "Illustration of a Bitwarden’s notification prompting the user to update the login" + }, "turnOnAutofill": { "message": "Turn on autofill" }, @@ -4181,6 +4275,20 @@ } } }, + "copyFieldValue": { + "message": "Copy $FIELD$, $VALUE$", + "description": "Title for a button that copies a field value to the clipboard.", + "placeholders": { + "field": { + "content": "$1", + "example": "Username" + }, + "value": { + "content": "$2", + "example": "Foo" + } + } + }, "noValuesToCopy": { "message": "No values to copy" }, diff --git a/apps/browser/src/_locales/fa/messages.json b/apps/browser/src/_locales/fa/messages.json index 07cb47c8919..cbd12fd6869 100644 --- a/apps/browser/src/_locales/fa/messages.json +++ b/apps/browser/src/_locales/fa/messages.json @@ -80,6 +80,15 @@ "masterPassHint": { "message": "یادآور کلمه عبور اصلی (اختیاری)" }, + "passwordStrengthScore": { + "message": "Password strength score $SCORE$", + "placeholders": { + "score": { + "content": "$1", + "example": "4" + } + } + }, "joinOrganization": { "message": "Join organization" }, @@ -876,6 +885,21 @@ "logInToBitwarden": { "message": "Log in to Bitwarden" }, + "enterTheCodeSentToYourEmail": { + "message": "Enter the code sent to your email" + }, + "enterTheCodeFromYourAuthenticatorApp": { + "message": "Enter the code from your authenticator app" + }, + "pressYourYubiKeyToAuthenticate": { + "message": "Press your YubiKey to authenticate" + }, + "duoTwoFactorRequiredPageSubtitle": { + "message": "Duo two-step login is required for your account. Follow the steps below to finish logging in." + }, + "followTheStepsBelowToFinishLoggingIn": { + "message": "Follow the steps below to finish logging in." + }, "restartRegistration": { "message": "Restart registration" }, @@ -1365,12 +1389,22 @@ "rememberMe": { "message": "مرا به خاطر بسپار" }, + "dontAskAgainOnThisDeviceFor30Days": { + "message": "Don't ask again on this device for 30 days" + }, "sendVerificationCodeEmailAgain": { "message": "ارسال دوباره ایمیل کد تأیید" }, "useAnotherTwoStepMethod": { "message": "استفاده از روش ورود دو مرحله‌ای دیگر" }, + "selectAnotherMethod": { + "message": "Select another method", + "description": "Select another two-step login method" + }, + "useYourRecoveryCode": { + "message": "Use your recovery code" + }, "insertYubiKey": { "message": "YubiKey خود را وارد پورت USB رایانه کنید، بعد دکمه آن را بفشارید." }, @@ -1383,9 +1417,18 @@ "webAuthnNewTabOpen": { "message": "باز کردن زبانه جدید" }, + "openInNewTab": { + "message": "Open in new tab" + }, "webAuthnAuthenticate": { "message": "تأیید اعتبار در WebAuthn" }, + "readSecurityKey": { + "message": "Read security key" + }, + "awaitingSecurityKeyInteraction": { + "message": "Awaiting security key interaction..." + }, "loginUnavailable": { "message": "ورود به سیستم در دسترس نیست" }, @@ -1398,6 +1441,9 @@ "twoStepOptions": { "message": "گزینه‌های ورود دو مرحله‌ای" }, + "selectTwoStepLoginMethod": { + "message": "Select two-step login method" + }, "recoveryCodeDesc": { "message": "دسترسی به تمامی ارائه‌دهندگان دو مرحله‌ای را از دست داده‌اید؟ از کد بازیابی خود برای غیرفعال‌سازی ارائه‌دهندگان دو مرحله‌ای از حسابتان استفاده کنید." }, @@ -2097,6 +2143,15 @@ "vaultTimeoutAction1": { "message": "Timeout action" }, + "newCustomizationOptionsCalloutTitle": { + "message": "New customization options" + }, + "newCustomizationOptionsCalloutContent": { + "message": "Customize your vault experience with quick copy actions, compact mode, and more!" + }, + "newCustomizationOptionsCalloutLink": { + "message": "View all Appearance settings" + }, "lock": { "message": "قفل", "description": "Verb form: to make secure or inaccessible by" @@ -2391,8 +2446,17 @@ "atRiskPasswords": { "message": "At-risk passwords" }, - "atRiskPasswordsDescSingleOrg": { - "message": "$ORGANIZATION$ is requesting you change the $COUNT$ passwords because they are at risk.", + "atRiskPasswordDescSingleOrg": { + "message": "$ORGANIZATION$ is requesting you change one password because it is at-risk.", + "placeholders": { + "organization": { + "content": "$1", + "example": "Acme Corp" + } + } + }, + "atRiskPasswordsDescSingleOrgPlural": { + "message": "$ORGANIZATION$ is requesting you change the $COUNT$ passwords because they are at-risk.", "placeholders": { "organization": { "content": "$1", @@ -2404,8 +2468,8 @@ } } }, - "atRiskPasswordsDescMultiOrg": { - "message": "Your organizations are requesting you change the $COUNT$ passwords because they are at risk.", + "atRiskPasswordsDescMultiOrgPlural": { + "message": "Your organizations are requesting you change the $COUNT$ passwords because they are at-risk.", "placeholders": { "count": { "content": "$1", @@ -2431,6 +2495,36 @@ "changeAtRiskPasswordsFasterDesc": { "message": "Update your settings so you can quickly autofill your passwords and generate new ones" }, + "reviewAtRiskLogins": { + "message": "Review at-risk logins" + }, + "reviewAtRiskPasswords": { + "message": "Review at-risk passwords" + }, + "reviewAtRiskLoginsSlideDesc": { + "message": "Your organization passwords are at-risk because they are weak, reused, and/or exposed.", + "description": "Description of the review at-risk login slide on the at-risk password page carousel" + }, + "reviewAtRiskLoginSlideImgAlt": { + "message": "Illustration of a list of logins that are at-risk" + }, + "generatePasswordSlideDesc": { + "message": "Quickly generate a strong, unique password with the Bitwarden autofill menu on the at-risk site.", + "description": "Description of the generate password slide on the at-risk password page carousel" + }, + "generatePasswordSlideImgAlt": { + "message": "Illustration of the Bitwarden autofill menu displaying a generated password" + }, + "updateInBitwarden": { + "message": "Update in Bitwarden" + }, + "updateInBitwardenSlideDesc": { + "message": "Bitwarden will then prompt you to update the password in the password manager.", + "description": "Description of the update in Bitwarden slide on the at-risk password page carousel" + }, + "updateInBitwardenSlideImgAlt": { + "message": "Illustration of a Bitwarden’s notification prompting the user to update the login" + }, "turnOnAutofill": { "message": "Turn on autofill" }, @@ -4181,6 +4275,20 @@ } } }, + "copyFieldValue": { + "message": "Copy $FIELD$, $VALUE$", + "description": "Title for a button that copies a field value to the clipboard.", + "placeholders": { + "field": { + "content": "$1", + "example": "Username" + }, + "value": { + "content": "$2", + "example": "Foo" + } + } + }, "noValuesToCopy": { "message": "No values to copy" }, diff --git a/apps/browser/src/_locales/fi/messages.json b/apps/browser/src/_locales/fi/messages.json index e917a43c29e..a19302bba13 100644 --- a/apps/browser/src/_locales/fi/messages.json +++ b/apps/browser/src/_locales/fi/messages.json @@ -80,6 +80,15 @@ "masterPassHint": { "message": "Pääsalasanan vihje (valinnainen)" }, + "passwordStrengthScore": { + "message": "Salasanan vahvuusarvio $SCORE$", + "placeholders": { + "score": { + "content": "$1", + "example": "4" + } + } + }, "joinOrganization": { "message": "Liity organisaatioon" }, @@ -177,7 +186,7 @@ "message": "Kopioi merkinnät" }, "copy": { - "message": "Copy", + "message": "Kopioi", "description": "Copy to clipboard" }, "fill": { @@ -876,6 +885,21 @@ "logInToBitwarden": { "message": "Kirjaudu Bitwardeniin" }, + "enterTheCodeSentToYourEmail": { + "message": "Syötä sähköpostitse vastaanottamasi koodi" + }, + "enterTheCodeFromYourAuthenticatorApp": { + "message": "Syötä todennussovelluksesi näyttämä koodi" + }, + "pressYourYubiKeyToAuthenticate": { + "message": "Tunnistaudu painalla YubiKeytäsi" + }, + "duoTwoFactorRequiredPageSubtitle": { + "message": "Duon edellyttää tililtäsi kaksivaiheista tunnistautumista. Viimeistele kirjautuminen seuraamalla seuraavia vaiheita." + }, + "followTheStepsBelowToFinishLoggingIn": { + "message": "Viimeistele kirjautuminen seuraamalla seuraavia vaiheita." + }, "restartRegistration": { "message": "Aloita rekisteröityminen alusta" }, @@ -1030,7 +1054,7 @@ "message": "Valitse kohteita täyttääksesi tiedot automaattisesti Holvi-näkymässä" }, "clickToAutofill": { - "message": "Click items in autofill suggestion to fill" + "message": "Täytä automaattitäytön ehdotus napsauttamalla sitä" }, "clearClipboard": { "message": "Tyhjennä leikepöytä", @@ -1365,12 +1389,22 @@ "rememberMe": { "message": "Muista minut" }, + "dontAskAgainOnThisDeviceFor30Days": { + "message": "Älä kysy uudelleen tällä laitteella 30 päivään" + }, "sendVerificationCodeEmailAgain": { "message": "Lähetä todennuskoodi sähköpostitse uudelleen" }, "useAnotherTwoStepMethod": { "message": "Käytä vaihtoehtoista todennustapaa" }, + "selectAnotherMethod": { + "message": "Valitse vaihtoehtoinen tapa", + "description": "Select another two-step login method" + }, + "useYourRecoveryCode": { + "message": "Käytä palautuskoodiasi" + }, "insertYubiKey": { "message": "Kytke YubiKey-todennuslaitteesi tietokoneen USB-porttiin ja paina sen painiketta." }, @@ -1383,9 +1417,18 @@ "webAuthnNewTabOpen": { "message": "Avaa uusi välilehti" }, + "openInNewTab": { + "message": "Avaa uudessa välilehdessä" + }, "webAuthnAuthenticate": { "message": "WebAuthn-todennus" }, + "readSecurityKey": { + "message": "Lue todennuslaite" + }, + "awaitingSecurityKeyInteraction": { + "message": "Odotetaan suojausavaimen aktivointia..." + }, "loginUnavailable": { "message": "Kirjautuminen ei ole käytettävissä" }, @@ -1398,6 +1441,9 @@ "twoStepOptions": { "message": "Kaksivaiheisen kirjautumisen asetukset" }, + "selectTwoStepLoginMethod": { + "message": "Käytä vaihtoehtoista tunnistautumistapaa" + }, "recoveryCodeDesc": { "message": "Etkö pysty käyttämään kaksivaiheisen kirjautumisen todentajiasi? Poista kaikki tilillesi määritetyt todentajat käytöstä palautuskoodillasi." }, @@ -2089,7 +2135,7 @@ "description": "This will be used as part of a larger sentence, broken up to include the generator icon. The full sentence will read 'Use the generator [GENERATOR_ICON] to create a strong unique password'" }, "vaultCustomization": { - "message": "Vault customization" + "message": "Holvin mukautus" }, "vaultTimeoutAction": { "message": "Holvin aikakatkaisutoiminto" @@ -2097,6 +2143,15 @@ "vaultTimeoutAction1": { "message": "Aikakatkaisutoiminto" }, + "newCustomizationOptionsCalloutTitle": { + "message": "New customization options" + }, + "newCustomizationOptionsCalloutContent": { + "message": "Customize your vault experience with quick copy actions, compact mode, and more!" + }, + "newCustomizationOptionsCalloutLink": { + "message": "View all Appearance settings" + }, "lock": { "message": "Lukitse", "description": "Verb form: to make secure or inaccessible by" @@ -2356,7 +2411,7 @@ "message": "Estetyt verkkotunnukset" }, "learnMoreAboutBlockedDomains": { - "message": "Learn more about blocked domains" + "message": "Lisätietoja estetyistä verkkotunnuksista" }, "excludedDomains": { "message": "Ohitettavat verkkotunnukset" @@ -2377,10 +2432,10 @@ "message": "Muuta tätä asetuksissa" }, "change": { - "message": "Change" + "message": "Vaihda" }, "changeButtonTitle": { - "message": "Change password - $ITEMNAME$", + "message": "Vaihda salasana - $ITEMNAME$", "placeholders": { "itemname": { "content": "$1", @@ -2389,10 +2444,19 @@ } }, "atRiskPasswords": { - "message": "At-risk passwords" + "message": "Vaarantuneet salasanat" }, - "atRiskPasswordsDescSingleOrg": { - "message": "$ORGANIZATION$ is requesting you change the $COUNT$ passwords because they are at risk.", + "atRiskPasswordDescSingleOrg": { + "message": "$ORGANIZATION$ is requesting you change one password because it is at-risk.", + "placeholders": { + "organization": { + "content": "$1", + "example": "Acme Corp" + } + } + }, + "atRiskPasswordsDescSingleOrgPlural": { + "message": "$ORGANIZATION$ is requesting you change the $COUNT$ passwords because they are at-risk.", "placeholders": { "organization": { "content": "$1", @@ -2404,8 +2468,8 @@ } } }, - "atRiskPasswordsDescMultiOrg": { - "message": "Your organizations are requesting you change the $COUNT$ passwords because they are at risk.", + "atRiskPasswordsDescMultiOrgPlural": { + "message": "Your organizations are requesting you change the $COUNT$ passwords because they are at-risk.", "placeholders": { "count": { "content": "$1", @@ -2414,10 +2478,10 @@ } }, "reviewAndChangeAtRiskPassword": { - "message": "Review and change one at-risk password" + "message": "Tarkasta ja vaihda yksi vaarantunut salasana" }, "reviewAndChangeAtRiskPasswordsPlural": { - "message": "Review and change $COUNT$ at-risk passwords", + "message": "Tarkasta ja vaihda $COUNT$ vaarantunutta salasanaa", "placeholders": { "count": { "content": "$1", @@ -2426,19 +2490,49 @@ } }, "changeAtRiskPasswordsFaster": { - "message": "Change at-risk passwords faster" + "message": "Vaihda vaarantuneet salasanat nopeammin" }, "changeAtRiskPasswordsFasterDesc": { - "message": "Update your settings so you can quickly autofill your passwords and generate new ones" + "message": "Päivitä asetuksesi, jotta voit täyttää salasanasi ja luoda uusia nopeasti." + }, + "reviewAtRiskLogins": { + "message": "Review at-risk logins" + }, + "reviewAtRiskPasswords": { + "message": "Review at-risk passwords" + }, + "reviewAtRiskLoginsSlideDesc": { + "message": "Your organization passwords are at-risk because they are weak, reused, and/or exposed.", + "description": "Description of the review at-risk login slide on the at-risk password page carousel" + }, + "reviewAtRiskLoginSlideImgAlt": { + "message": "Illustration of a list of logins that are at-risk" + }, + "generatePasswordSlideDesc": { + "message": "Quickly generate a strong, unique password with the Bitwarden autofill menu on the at-risk site.", + "description": "Description of the generate password slide on the at-risk password page carousel" + }, + "generatePasswordSlideImgAlt": { + "message": "Illustration of the Bitwarden autofill menu displaying a generated password" + }, + "updateInBitwarden": { + "message": "Update in Bitwarden" + }, + "updateInBitwardenSlideDesc": { + "message": "Bitwarden will then prompt you to update the password in the password manager.", + "description": "Description of the update in Bitwarden slide on the at-risk password page carousel" + }, + "updateInBitwardenSlideImgAlt": { + "message": "Illustration of a Bitwarden’s notification prompting the user to update the login" }, "turnOnAutofill": { - "message": "Turn on autofill" + "message": "Ota automaattitäyttö käyttöön" }, "turnedOnAutofill": { - "message": "Turned on autofill" + "message": "Automaattitäyttö otettiin käyttöön" }, "dismiss": { - "message": "Dismiss" + "message": "Sulje" }, "websiteItemLabel": { "message": "Verkkotunnus $number$ (URI)", @@ -3045,7 +3139,7 @@ } }, "forwaderInvalidOperation": { - "message": "$SERVICENAME$ refused your request. Please contact your service provider for assistance.", + "message": "$SERVICENAME$ hylkäsi pyyntösi. Ole yhteydessä palveluntarjoajaasi saadaksesi apua.", "description": "Displayed when the user is forbidden from using the API by the forwarding service.", "placeholders": { "servicename": { @@ -3055,7 +3149,7 @@ } }, "forwaderInvalidOperationWithMessage": { - "message": "$SERVICENAME$ refused your request: $ERRORMESSAGE$", + "message": "$SERVICENAME$ hylkäsi pyyntösi: $ERRORMESSAGE$", "description": "Displayed when the user is forbidden from using the API by the forwarding service with an error message.", "placeholders": { "servicename": { @@ -3225,13 +3319,13 @@ "message": "Laitteellesi on lähetetty ilmoitus." }, "notificationSentDevicePart1": { - "message": "Unlock Bitwarden on your device or on the" + "message": "Avaa Bitwarden laitteellasi tai" }, "notificationSentDeviceAnchor": { - "message": "web app" + "message": "verkkosovelluksena" }, "notificationSentDevicePart2": { - "message": "Make sure the Fingerprint phrase matches the one below before approving." + "message": "Ennen hyväksyntää varmista, että tunnistelause vastaa alla olevaa lausetta." }, "aNotificationWasSentToYourDevice": { "message": "Laitteeseesi lähetettiin ilmoitus" @@ -3246,7 +3340,7 @@ "message": "Kirjautuminen aloitettu" }, "logInRequestSent": { - "message": "Request sent" + "message": "Pyyntö lähetetty" }, "exposedMasterPassword": { "message": "Paljastunut pääsalasana" @@ -4181,6 +4275,20 @@ } } }, + "copyFieldValue": { + "message": "Copy $FIELD$, $VALUE$", + "description": "Title for a button that copies a field value to the clipboard.", + "placeholders": { + "field": { + "content": "$1", + "example": "Username" + }, + "value": { + "content": "$2", + "example": "Foo" + } + } + }, "noValuesToCopy": { "message": "Ei kopioitavia arvoja" }, diff --git a/apps/browser/src/_locales/fil/messages.json b/apps/browser/src/_locales/fil/messages.json index e9d918dc58f..5dc6e6a59b7 100644 --- a/apps/browser/src/_locales/fil/messages.json +++ b/apps/browser/src/_locales/fil/messages.json @@ -80,6 +80,15 @@ "masterPassHint": { "message": "Mungkahi sa Master Password (opsyonal)" }, + "passwordStrengthScore": { + "message": "Password strength score $SCORE$", + "placeholders": { + "score": { + "content": "$1", + "example": "4" + } + } + }, "joinOrganization": { "message": "Join organization" }, @@ -876,6 +885,21 @@ "logInToBitwarden": { "message": "Log in to Bitwarden" }, + "enterTheCodeSentToYourEmail": { + "message": "Enter the code sent to your email" + }, + "enterTheCodeFromYourAuthenticatorApp": { + "message": "Enter the code from your authenticator app" + }, + "pressYourYubiKeyToAuthenticate": { + "message": "Press your YubiKey to authenticate" + }, + "duoTwoFactorRequiredPageSubtitle": { + "message": "Duo two-step login is required for your account. Follow the steps below to finish logging in." + }, + "followTheStepsBelowToFinishLoggingIn": { + "message": "Follow the steps below to finish logging in." + }, "restartRegistration": { "message": "Restart registration" }, @@ -1365,12 +1389,22 @@ "rememberMe": { "message": "Tandaan mo ako" }, + "dontAskAgainOnThisDeviceFor30Days": { + "message": "Don't ask again on this device for 30 days" + }, "sendVerificationCodeEmailAgain": { "message": "Ipadala muli ang email ng verification code" }, "useAnotherTwoStepMethod": { "message": "Gamitin ang isa pang two-step na paraan ng pag-login" }, + "selectAnotherMethod": { + "message": "Select another method", + "description": "Select another two-step login method" + }, + "useYourRecoveryCode": { + "message": "Use your recovery code" + }, "insertYubiKey": { "message": "I-insert ang iyong YubiKey sa USB port ng iyong computer, pagkatapos ay tindigin ang buton nito." }, @@ -1383,9 +1417,18 @@ "webAuthnNewTabOpen": { "message": "Buksan ang bagong tab" }, + "openInNewTab": { + "message": "Open in new tab" + }, "webAuthnAuthenticate": { "message": "I-authenticate ang WebAuthn" }, + "readSecurityKey": { + "message": "Read security key" + }, + "awaitingSecurityKeyInteraction": { + "message": "Awaiting security key interaction..." + }, "loginUnavailable": { "message": "Hindi magagamit ang pag-login" }, @@ -1398,6 +1441,9 @@ "twoStepOptions": { "message": "Mga pagpipilian para sa two-step login" }, + "selectTwoStepLoginMethod": { + "message": "Select two-step login method" + }, "recoveryCodeDesc": { "message": "Nawalan ka ng access sa lahat ng iyong mga two-factor provider? Gamitin ang iyong recovery code para i-off ang lahat ng two-factor providers mula sa iyong account." }, @@ -2097,6 +2143,15 @@ "vaultTimeoutAction1": { "message": "Timeout action" }, + "newCustomizationOptionsCalloutTitle": { + "message": "New customization options" + }, + "newCustomizationOptionsCalloutContent": { + "message": "Customize your vault experience with quick copy actions, compact mode, and more!" + }, + "newCustomizationOptionsCalloutLink": { + "message": "View all Appearance settings" + }, "lock": { "message": "I-lock", "description": "Verb form: to make secure or inaccessible by" @@ -2391,8 +2446,17 @@ "atRiskPasswords": { "message": "At-risk passwords" }, - "atRiskPasswordsDescSingleOrg": { - "message": "$ORGANIZATION$ is requesting you change the $COUNT$ passwords because they are at risk.", + "atRiskPasswordDescSingleOrg": { + "message": "$ORGANIZATION$ is requesting you change one password because it is at-risk.", + "placeholders": { + "organization": { + "content": "$1", + "example": "Acme Corp" + } + } + }, + "atRiskPasswordsDescSingleOrgPlural": { + "message": "$ORGANIZATION$ is requesting you change the $COUNT$ passwords because they are at-risk.", "placeholders": { "organization": { "content": "$1", @@ -2404,8 +2468,8 @@ } } }, - "atRiskPasswordsDescMultiOrg": { - "message": "Your organizations are requesting you change the $COUNT$ passwords because they are at risk.", + "atRiskPasswordsDescMultiOrgPlural": { + "message": "Your organizations are requesting you change the $COUNT$ passwords because they are at-risk.", "placeholders": { "count": { "content": "$1", @@ -2431,6 +2495,36 @@ "changeAtRiskPasswordsFasterDesc": { "message": "Update your settings so you can quickly autofill your passwords and generate new ones" }, + "reviewAtRiskLogins": { + "message": "Review at-risk logins" + }, + "reviewAtRiskPasswords": { + "message": "Review at-risk passwords" + }, + "reviewAtRiskLoginsSlideDesc": { + "message": "Your organization passwords are at-risk because they are weak, reused, and/or exposed.", + "description": "Description of the review at-risk login slide on the at-risk password page carousel" + }, + "reviewAtRiskLoginSlideImgAlt": { + "message": "Illustration of a list of logins that are at-risk" + }, + "generatePasswordSlideDesc": { + "message": "Quickly generate a strong, unique password with the Bitwarden autofill menu on the at-risk site.", + "description": "Description of the generate password slide on the at-risk password page carousel" + }, + "generatePasswordSlideImgAlt": { + "message": "Illustration of the Bitwarden autofill menu displaying a generated password" + }, + "updateInBitwarden": { + "message": "Update in Bitwarden" + }, + "updateInBitwardenSlideDesc": { + "message": "Bitwarden will then prompt you to update the password in the password manager.", + "description": "Description of the update in Bitwarden slide on the at-risk password page carousel" + }, + "updateInBitwardenSlideImgAlt": { + "message": "Illustration of a Bitwarden’s notification prompting the user to update the login" + }, "turnOnAutofill": { "message": "Turn on autofill" }, @@ -4181,6 +4275,20 @@ } } }, + "copyFieldValue": { + "message": "Copy $FIELD$, $VALUE$", + "description": "Title for a button that copies a field value to the clipboard.", + "placeholders": { + "field": { + "content": "$1", + "example": "Username" + }, + "value": { + "content": "$2", + "example": "Foo" + } + } + }, "noValuesToCopy": { "message": "No values to copy" }, diff --git a/apps/browser/src/_locales/fr/messages.json b/apps/browser/src/_locales/fr/messages.json index 960de5ff252..c37c772acf9 100644 --- a/apps/browser/src/_locales/fr/messages.json +++ b/apps/browser/src/_locales/fr/messages.json @@ -80,6 +80,15 @@ "masterPassHint": { "message": "Indice du mot de passe principal (facultatif)" }, + "passwordStrengthScore": { + "message": "Score de force du mot de passe $SCORE$", + "placeholders": { + "score": { + "content": "$1", + "example": "4" + } + } + }, "joinOrganization": { "message": "Rejoindre l'organisation" }, @@ -177,7 +186,7 @@ "message": "Copier les notes" }, "copy": { - "message": "Copy", + "message": "Copier", "description": "Copy to clipboard" }, "fill": { @@ -664,7 +673,7 @@ "message": "Vérifier l'identité" }, "weDontRecognizeThisDevice": { - "message": "We don't recognize this device. Enter the code sent to your email to verify your identity." + "message": "Nous ne reconnaissons pas cet appareil. Saisissez le code envoyé à votre courriel pour vérifier votre identité." }, "continueLoggingIn": { "message": "Continuer à se connecter" @@ -876,6 +885,21 @@ "logInToBitwarden": { "message": "Se connecter à Bitwarden" }, + "enterTheCodeSentToYourEmail": { + "message": "Saisissez le code envoyé par courriel" + }, + "enterTheCodeFromYourAuthenticatorApp": { + "message": "Saisissez le code de votre application d'authentification" + }, + "pressYourYubiKeyToAuthenticate": { + "message": "Appuyez sur votre YubiKey pour vous authentifier" + }, + "duoTwoFactorRequiredPageSubtitle": { + "message": "Les identifiants de l'authentification à deux facteurs Duo sont requis pour votre compte. Suivez les étapes ci-dessous afin de réussir à vous connecter." + }, + "followTheStepsBelowToFinishLoggingIn": { + "message": "Suivez les étapes ci-dessous afin de réussir à vous connecter." + }, "restartRegistration": { "message": "Redémarrer l'inscription" }, @@ -1009,7 +1033,7 @@ "message": "Demande l'ajout d'un élément si celui-ci n'est pas trouvé dans votre coffre. S'applique à tous les comptes connectés." }, "showCardsInVaultViewV2": { - "message": "Always show cards as Autofill suggestions on Vault view" + "message": "Toujours montrer les cartes de paiement en tant que suggestions de remplissage automatique dans l'affichage du coffre" }, "showCardsCurrentTab": { "message": "Afficher les cartes de paiement sur la Page d'onglet" @@ -1018,7 +1042,7 @@ "message": "Liste les éléments des cartes de paiement sur la Page d'onglet pour faciliter la saisie automatique." }, "showIdentitiesInVaultViewV2": { - "message": "Always show identities as Autofill suggestions on Vault view" + "message": "Toujours montrer les identités en tant que suggestions de remplissage automatique dans l'affichage du coffre" }, "showIdentitiesCurrentTab": { "message": "Afficher les identités sur la Page d'onglet" @@ -1027,10 +1051,10 @@ "message": "Liste les éléments d'identité sur la Page d'onglet pour faciliter la saisie automatique." }, "clickToAutofillOnVault": { - "message": "Click items to autofill on Vault view" + "message": "Cliquez sur les éléments pour le remplissage automatique dans 'affichage du coffre" }, "clickToAutofill": { - "message": "Click items in autofill suggestion to fill" + "message": "Cliquez sur les éléments de la suggestion de remplissage automatique pour les remplir" }, "clearClipboard": { "message": "Effacer le presse-papiers", @@ -1365,12 +1389,22 @@ "rememberMe": { "message": "Rester connecté" }, + "dontAskAgainOnThisDeviceFor30Days": { + "message": "Ne plus demander sur cet appareil pendant 30 jours" + }, "sendVerificationCodeEmailAgain": { "message": "Envoyer à nouveau le courriel de code de vérification" }, "useAnotherTwoStepMethod": { "message": "Utiliser une autre méthode d'identification en deux étapes" }, + "selectAnotherMethod": { + "message": "Sélectionnez une autre méthode", + "description": "Select another two-step login method" + }, + "useYourRecoveryCode": { + "message": "Utilisez votre code de récupération" + }, "insertYubiKey": { "message": "Insérez votre YubiKey dans le port USB de votre ordinateur puis appuyez sur son bouton." }, @@ -1383,9 +1417,18 @@ "webAuthnNewTabOpen": { "message": "Ouvrir un nouvel onglet" }, + "openInNewTab": { + "message": "Ouvrir dans un nouvel onglet" + }, "webAuthnAuthenticate": { "message": "Authentifier WebAuthn" }, + "readSecurityKey": { + "message": "Lire la clé de sécurité" + }, + "awaitingSecurityKeyInteraction": { + "message": "En attente d'interaction de la clé de sécurité..." + }, "loginUnavailable": { "message": "Identifiant indisponible" }, @@ -1398,6 +1441,9 @@ "twoStepOptions": { "message": "Options d'authentification à feux facteurs" }, + "selectTwoStepLoginMethod": { + "message": "Sélectionnez la méthode d'authentification à deux facteurs" + }, "recoveryCodeDesc": { "message": "Accès perdu à tous vos services d'authentification à double facteurs ? Utilisez votre code de récupération pour désactiver tous les services de double authentifications sur votre compte." }, @@ -2069,7 +2115,7 @@ "message": "Générateur de nom d'utilisateur" }, "useThisEmail": { - "message": "Use this email" + "message": "Utiliser ce courriel" }, "useThisPassword": { "message": "Utiliser ce mot de passe" @@ -2089,7 +2135,7 @@ "description": "This will be used as part of a larger sentence, broken up to include the generator icon. The full sentence will read 'Use the generator [GENERATOR_ICON] to create a strong unique password'" }, "vaultCustomization": { - "message": "Vault customization" + "message": "Personnalisation du coffre" }, "vaultTimeoutAction": { "message": "Action après délai d'expiration du coffre" @@ -2097,6 +2143,15 @@ "vaultTimeoutAction1": { "message": "Expiration de l'action" }, + "newCustomizationOptionsCalloutTitle": { + "message": "Nouvelles options de personnalisation" + }, + "newCustomizationOptionsCalloutContent": { + "message": "Personnalisez votre expérience utilisateur du coffre avec des actions de copie rapide, un mode compact et bien plus encore !" + }, + "newCustomizationOptionsCalloutLink": { + "message": "View all Appearance settings" + }, "lock": { "message": "Verrouiller", "description": "Verb form: to make secure or inaccessible by" @@ -2356,7 +2411,7 @@ "message": "Domaines bloqués" }, "learnMoreAboutBlockedDomains": { - "message": "Learn more about blocked domains" + "message": "En savoir plus sur les domaines bloqués" }, "excludedDomains": { "message": "Domaines exclus" @@ -2368,19 +2423,19 @@ "message": "Bitwarden ne demandera pas d'enregistrer les détails de connexion pour ces domaines pour tous les comptes connectés. Vous devez actualiser la page pour que les modifications prennent effet." }, "blockedDomainsDesc": { - "message": "Autofill and other related features will not be offered for these websites. You must refresh the page for changes to take effect." + "message": "Le remplissage automatique et d'autres fonctionnalités connexes ne seront pas proposés pour ces sites web. Vous devez actualiser la page pour que les modifications soient prises en compte." }, "autofillBlockedNoticeV2": { - "message": "Autofill is blocked for this website." + "message": "Le remplissage automatique est bloqué pour ce site web." }, "autofillBlockedNoticeGuidance": { - "message": "Change this in settings" + "message": "Modifier ceci dans les paramètres" }, "change": { - "message": "Change" + "message": "Modifier" }, "changeButtonTitle": { - "message": "Change password - $ITEMNAME$", + "message": "Modifier le mot de passe - $ITEMNAME$", "placeholders": { "itemname": { "content": "$1", @@ -2389,10 +2444,19 @@ } }, "atRiskPasswords": { - "message": "At-risk passwords" + "message": "Mots de passe à risque" }, - "atRiskPasswordsDescSingleOrg": { - "message": "$ORGANIZATION$ is requesting you change the $COUNT$ passwords because they are at risk.", + "atRiskPasswordDescSingleOrg": { + "message": "$ORGANIZATION$ is requesting you change one password because it is at-risk.", + "placeholders": { + "organization": { + "content": "$1", + "example": "Acme Corp" + } + } + }, + "atRiskPasswordsDescSingleOrgPlural": { + "message": "$ORGANIZATION$ is requesting you change the $COUNT$ passwords because they are at-risk.", "placeholders": { "organization": { "content": "$1", @@ -2404,8 +2468,8 @@ } } }, - "atRiskPasswordsDescMultiOrg": { - "message": "Your organizations are requesting you change the $COUNT$ passwords because they are at risk.", + "atRiskPasswordsDescMultiOrgPlural": { + "message": "Your organizations are requesting you change the $COUNT$ passwords because they are at-risk.", "placeholders": { "count": { "content": "$1", @@ -2414,10 +2478,10 @@ } }, "reviewAndChangeAtRiskPassword": { - "message": "Review and change one at-risk password" + "message": "Examiner et modifier un mot de passe à risque" }, "reviewAndChangeAtRiskPasswordsPlural": { - "message": "Review and change $COUNT$ at-risk passwords", + "message": "Examiner et modifier les mots de passe à risque $COUNT$", "placeholders": { "count": { "content": "$1", @@ -2426,11 +2490,41 @@ } }, "changeAtRiskPasswordsFaster": { - "message": "Change at-risk passwords faster" + "message": "Modifier plus rapidement les mots de passe à risque" }, "changeAtRiskPasswordsFasterDesc": { "message": "Update your settings so you can quickly autofill your passwords and generate new ones" }, + "reviewAtRiskLogins": { + "message": "Review at-risk logins" + }, + "reviewAtRiskPasswords": { + "message": "Review at-risk passwords" + }, + "reviewAtRiskLoginsSlideDesc": { + "message": "Your organization passwords are at-risk because they are weak, reused, and/or exposed.", + "description": "Description of the review at-risk login slide on the at-risk password page carousel" + }, + "reviewAtRiskLoginSlideImgAlt": { + "message": "Illustration of a list of logins that are at-risk" + }, + "generatePasswordSlideDesc": { + "message": "Quickly generate a strong, unique password with the Bitwarden autofill menu on the at-risk site.", + "description": "Description of the generate password slide on the at-risk password page carousel" + }, + "generatePasswordSlideImgAlt": { + "message": "Illustration of the Bitwarden autofill menu displaying a generated password" + }, + "updateInBitwarden": { + "message": "Update in Bitwarden" + }, + "updateInBitwardenSlideDesc": { + "message": "Bitwarden will then prompt you to update the password in the password manager.", + "description": "Description of the update in Bitwarden slide on the at-risk password page carousel" + }, + "updateInBitwardenSlideImgAlt": { + "message": "Illustration of a Bitwarden’s notification prompting the user to update the login" + }, "turnOnAutofill": { "message": "Turn on autofill" }, @@ -4181,6 +4275,20 @@ } } }, + "copyFieldValue": { + "message": "Copy $FIELD$, $VALUE$", + "description": "Title for a button that copies a field value to the clipboard.", + "placeholders": { + "field": { + "content": "$1", + "example": "Username" + }, + "value": { + "content": "$2", + "example": "Foo" + } + } + }, "noValuesToCopy": { "message": "Aucune valeur à copier" }, diff --git a/apps/browser/src/_locales/gl/messages.json b/apps/browser/src/_locales/gl/messages.json index 25ebb2df75d..3a2348072f0 100644 --- a/apps/browser/src/_locales/gl/messages.json +++ b/apps/browser/src/_locales/gl/messages.json @@ -80,6 +80,15 @@ "masterPassHint": { "message": "Pista do contrasinal mestre (opcional)" }, + "passwordStrengthScore": { + "message": "Password strength score $SCORE$", + "placeholders": { + "score": { + "content": "$1", + "example": "4" + } + } + }, "joinOrganization": { "message": "Unirse a esta organización" }, @@ -876,6 +885,21 @@ "logInToBitwarden": { "message": "Iniciar sesión en Bitwarden" }, + "enterTheCodeSentToYourEmail": { + "message": "Enter the code sent to your email" + }, + "enterTheCodeFromYourAuthenticatorApp": { + "message": "Enter the code from your authenticator app" + }, + "pressYourYubiKeyToAuthenticate": { + "message": "Press your YubiKey to authenticate" + }, + "duoTwoFactorRequiredPageSubtitle": { + "message": "Duo two-step login is required for your account. Follow the steps below to finish logging in." + }, + "followTheStepsBelowToFinishLoggingIn": { + "message": "Follow the steps below to finish logging in." + }, "restartRegistration": { "message": "Reiniciar rexistro" }, @@ -1365,12 +1389,22 @@ "rememberMe": { "message": "Lémbrame" }, + "dontAskAgainOnThisDeviceFor30Days": { + "message": "Don't ask again on this device for 30 days" + }, "sendVerificationCodeEmailAgain": { "message": "Enviar un novo correo de verificación" }, "useAnotherTwoStepMethod": { "message": "Empregar outro método de verificación en 2 pasos" }, + "selectAnotherMethod": { + "message": "Select another method", + "description": "Select another two-step login method" + }, + "useYourRecoveryCode": { + "message": "Use your recovery code" + }, "insertYubiKey": { "message": "Conecta a túa YubiKey no porto USB, despois preme o seu botón." }, @@ -1383,9 +1417,18 @@ "webAuthnNewTabOpen": { "message": "Abrir nova pestana" }, + "openInNewTab": { + "message": "Open in new tab" + }, "webAuthnAuthenticate": { "message": "Autenticar con WebAuthn" }, + "readSecurityKey": { + "message": "Read security key" + }, + "awaitingSecurityKeyInteraction": { + "message": "Awaiting security key interaction..." + }, "loginUnavailable": { "message": "Inicio de sesión non dispoñible" }, @@ -1398,6 +1441,9 @@ "twoStepOptions": { "message": "Opcións de verificación en dous pasos" }, + "selectTwoStepLoginMethod": { + "message": "Select two-step login method" + }, "recoveryCodeDesc": { "message": "Perdiche o acceso ós provedores de verificación en dous pasos (2FA)? Emprega o teu código de recuperación para desactivalos." }, @@ -2097,6 +2143,15 @@ "vaultTimeoutAction1": { "message": "Acción do temporizador" }, + "newCustomizationOptionsCalloutTitle": { + "message": "New customization options" + }, + "newCustomizationOptionsCalloutContent": { + "message": "Customize your vault experience with quick copy actions, compact mode, and more!" + }, + "newCustomizationOptionsCalloutLink": { + "message": "View all Appearance settings" + }, "lock": { "message": "Bloquear", "description": "Verb form: to make secure or inaccessible by" @@ -2391,8 +2446,17 @@ "atRiskPasswords": { "message": "At-risk passwords" }, - "atRiskPasswordsDescSingleOrg": { - "message": "$ORGANIZATION$ is requesting you change the $COUNT$ passwords because they are at risk.", + "atRiskPasswordDescSingleOrg": { + "message": "$ORGANIZATION$ is requesting you change one password because it is at-risk.", + "placeholders": { + "organization": { + "content": "$1", + "example": "Acme Corp" + } + } + }, + "atRiskPasswordsDescSingleOrgPlural": { + "message": "$ORGANIZATION$ is requesting you change the $COUNT$ passwords because they are at-risk.", "placeholders": { "organization": { "content": "$1", @@ -2404,8 +2468,8 @@ } } }, - "atRiskPasswordsDescMultiOrg": { - "message": "Your organizations are requesting you change the $COUNT$ passwords because they are at risk.", + "atRiskPasswordsDescMultiOrgPlural": { + "message": "Your organizations are requesting you change the $COUNT$ passwords because they are at-risk.", "placeholders": { "count": { "content": "$1", @@ -2431,6 +2495,36 @@ "changeAtRiskPasswordsFasterDesc": { "message": "Update your settings so you can quickly autofill your passwords and generate new ones" }, + "reviewAtRiskLogins": { + "message": "Review at-risk logins" + }, + "reviewAtRiskPasswords": { + "message": "Review at-risk passwords" + }, + "reviewAtRiskLoginsSlideDesc": { + "message": "Your organization passwords are at-risk because they are weak, reused, and/or exposed.", + "description": "Description of the review at-risk login slide on the at-risk password page carousel" + }, + "reviewAtRiskLoginSlideImgAlt": { + "message": "Illustration of a list of logins that are at-risk" + }, + "generatePasswordSlideDesc": { + "message": "Quickly generate a strong, unique password with the Bitwarden autofill menu on the at-risk site.", + "description": "Description of the generate password slide on the at-risk password page carousel" + }, + "generatePasswordSlideImgAlt": { + "message": "Illustration of the Bitwarden autofill menu displaying a generated password" + }, + "updateInBitwarden": { + "message": "Update in Bitwarden" + }, + "updateInBitwardenSlideDesc": { + "message": "Bitwarden will then prompt you to update the password in the password manager.", + "description": "Description of the update in Bitwarden slide on the at-risk password page carousel" + }, + "updateInBitwardenSlideImgAlt": { + "message": "Illustration of a Bitwarden’s notification prompting the user to update the login" + }, "turnOnAutofill": { "message": "Turn on autofill" }, @@ -4181,6 +4275,20 @@ } } }, + "copyFieldValue": { + "message": "Copy $FIELD$, $VALUE$", + "description": "Title for a button that copies a field value to the clipboard.", + "placeholders": { + "field": { + "content": "$1", + "example": "Username" + }, + "value": { + "content": "$2", + "example": "Foo" + } + } + }, "noValuesToCopy": { "message": "Non hai valores que copiar" }, diff --git a/apps/browser/src/_locales/he/messages.json b/apps/browser/src/_locales/he/messages.json index b5128e2fd09..174dcd4ede2 100644 --- a/apps/browser/src/_locales/he/messages.json +++ b/apps/browser/src/_locales/he/messages.json @@ -26,7 +26,7 @@ "message": "כניסה עם מפתח גישה" }, "useSingleSignOn": { - "message": "השתמש בהזדהות חד פעמית" + "message": "השתמש בכניסה יחידה" }, "welcomeBack": { "message": "ברוך שובך" @@ -80,6 +80,15 @@ "masterPassHint": { "message": "רמז לסיסמה הראשית (אופציונלי)" }, + "passwordStrengthScore": { + "message": "ציון חוזק סיסמה $SCORE$", + "placeholders": { + "score": { + "content": "$1", + "example": "4" + } + } + }, "joinOrganization": { "message": "הצטרף לארגון" }, @@ -377,13 +386,13 @@ "message": "ערוך תיקייה" }, "newFolder": { - "message": "תיקיה חדשה" + "message": "תיקייה חדשה" }, "folderName": { - "message": "שם תיקיה" + "message": "שם תיקייה" }, "folderHintText": { - "message": "קונן תיקיה על ידי הוספת שם תיקיית האב ואחריו “/”. דוגמה: חברתי/פורומים" + "message": "קונן תיקייה על ידי הוספת שם תיקיית האב ואחריו “/”. דוגמה: חברתי/פורומים" }, "noFoldersAdded": { "message": "לא נוספו תיקיות" @@ -392,7 +401,7 @@ "message": "צור תיקיות כדי לארגן את פריטי הכספת שלך" }, "deleteFolderPermanently": { - "message": "האם אתה בטוח שברצונך למחוק תיקיה זו לצמיתות?" + "message": "האם אתה בטוח שברצונך למחוק תיקייה זו לצמיתות?" }, "deleteFolder": { "message": "מחק תיקייה" @@ -580,7 +589,7 @@ "message": "מועדף" }, "unfavorite": { - "message": "מחק ממועדפים" + "message": "הסר ממועדפים" }, "itemAddedToFavorites": { "message": "פריט נוסף למועדפים" @@ -841,7 +850,7 @@ "message": "אי אפשר לסרוק קוד QR מהדף הנוכחי" }, "totpCaptureSuccess": { - "message": "נוסף מפתח מאמת" + "message": "מפתח מאמת נוסף" }, "totpCapture": { "message": "סרוק קוד QR מאמת מהדף הנוכחי" @@ -874,7 +883,22 @@ "message": "היכנס" }, "logInToBitwarden": { - "message": "כניסה אל Bitwarden" + "message": "היכנס אל Bitwarden" + }, + "enterTheCodeSentToYourEmail": { + "message": "הזן את הקוד שנשלח לדוא\"ל שלך" + }, + "enterTheCodeFromYourAuthenticatorApp": { + "message": "הזן את הקוד מיישום המאמת שלך" + }, + "pressYourYubiKeyToAuthenticate": { + "message": "לחץ על ה־YubiKey שלך כדי לאמת" + }, + "duoTwoFactorRequiredPageSubtitle": { + "message": "נדרשת כניסה דו-שלבית של Duo עבור החשבון שלך. עקוב אחר השלבים למטה כדי לסיים להיכנס." + }, + "followTheStepsBelowToFinishLoggingIn": { + "message": "עקוב אחר השלבים למטה כדי לסיים להיכנס." }, "restartRegistration": { "message": "התחל הרשמה מחדש" @@ -997,7 +1021,7 @@ "description": "This is the folder for uncategorized items" }, "enableAddLoginNotification": { - "message": "שאל אם לשמור פרטי כניסה" + "message": "בקש לשמור כניסה" }, "vaultSaveOptionsTitle": { "message": "שמור בהגדרות כספת" @@ -1006,7 +1030,7 @@ "message": "בקש להוסיף פריט אם לא נמצא פריט בכספת שלך." }, "addLoginNotificationDescAlt": { - "message": "שאל אם להוסיף פריט אם הוא אינו נמצא בכספת שלך. חל על כל החשבונות המחוברים." + "message": "בקש להוסיף פריט אם לא נמצא פריט בכספת שלך. חל על כל החשבונות המחוברים." }, "showCardsInVaultViewV2": { "message": "הצג תמיד כרטיסים כהצעות מילוי אוטומטי בתצוגת כספת" @@ -1365,12 +1389,22 @@ "rememberMe": { "message": "זכור אותי" }, + "dontAskAgainOnThisDeviceFor30Days": { + "message": "אל תשאל אותי שוב במכשיר זה למשך 30 יום" + }, "sendVerificationCodeEmailAgain": { "message": "שלח שוב קוד אימות לאימייל" }, "useAnotherTwoStepMethod": { "message": "השתמש בשיטה אחרת עבור כניסה דו שלבית" }, + "selectAnotherMethod": { + "message": "בחר שיטה אחרת", + "description": "Select another two-step login method" + }, + "useYourRecoveryCode": { + "message": "השתמש בקוד השחזור שלך" + }, "insertYubiKey": { "message": "הכנס את ה-YubiKey אל כניסת ה-USB במחשבך, ואז גע בכפתור שלו." }, @@ -1378,14 +1412,23 @@ "message": "הכנס את מפתח האבטחה שלך אל כניסת ה-USB במחשבך. אם יש לו כפתור, לחץ עליו." }, "webAuthnNewTab": { - "message": "על מנת להתחיל אימות WebAuthn דו-שלבי. לחץ על הכפתור למטה כדי לפתוח כרטיסייה חדשה ועקוב אחר ההוראות המסופקת בכרטיסייה החדשה." + "message": "על מנת להתחיל אימות WebAuthn דו-שלבי. לחץ על הלחצן למטה כדי לפתוח כרטיסייה חדשה ועקוב אחר ההוראות המסופקת בכרטיסייה החדשה." }, "webAuthnNewTabOpen": { "message": "פתח כרטיסייה חדשה" }, + "openInNewTab": { + "message": "פתח בכרטיסייה חדשה" + }, "webAuthnAuthenticate": { "message": "אמת WebAuthn" }, + "readSecurityKey": { + "message": "קרא מפתח אבטחה" + }, + "awaitingSecurityKeyInteraction": { + "message": "ממתין לאינטראקציה עם מפתח אבטחה..." + }, "loginUnavailable": { "message": "כניסה לא זמינה" }, @@ -1398,8 +1441,11 @@ "twoStepOptions": { "message": "אפשרויות כניסה דו-שלבית" }, + "selectTwoStepLoginMethod": { + "message": "בחר שיטת כניסה דו-שלבית" + }, "recoveryCodeDesc": { - "message": "איבדת גישה לכל הספקים הדו-שלביים שלך? השתמש בקוד השחזור שלך כדי להשבית את כל הספקים הדו-שלביים מהחשבון שלך." + "message": "איבדת גישה לכל הספקים הדו-גורמיים שלך? השתמש בקוד השחזור שלך כדי להשבית את כל הספקים הדו-גורמיים בחשבון שלך." }, "recoveryCodeTitle": { "message": "קוד שחזור" @@ -1622,7 +1668,7 @@ "message": "דפדפן זה לא יכול לעבד בקשות U2F בחלון צף זה. האם ברצונך לפתוח את החלון הצף כחלון חדש רגיל כדי שתוכל להכנס באמצעות U2F?" }, "enableFavicon": { - "message": "הצג סמלים של אתרי אינטרנט" + "message": "הצג סמלי אתר אינטרנט" }, "faviconDesc": { "message": "הצג תמונה ניתנת לזיהוי ליד כל כניסה." @@ -2097,6 +2143,15 @@ "vaultTimeoutAction1": { "message": "פעולת פסק זמן" }, + "newCustomizationOptionsCalloutTitle": { + "message": "אפשרויות התאמה אישית חדשות" + }, + "newCustomizationOptionsCalloutContent": { + "message": "התאם אישית את חווית הכספת שלך עם פעולות העתקה מהירות, מצב קומפקטי, ועוד!" + }, + "newCustomizationOptionsCalloutLink": { + "message": "הצג את כל הגדרות המראה" + }, "lock": { "message": "נעילה", "description": "Verb form: to make secure or inaccessible by" @@ -2139,10 +2194,10 @@ "message": "מלא ושמור" }, "autoFillSuccessAndSavedUri": { - "message": "הפריט התמלא אוטומטית וה־URI נשמר" + "message": "הפריט מולא אוטומטית וה־URI נשמר" }, "autoFillSuccess": { - "message": "פריט התמלא אוטומטית " + "message": "הפריט מולא אוטומטית " }, "insecurePageWarning": { "message": "אזהרה: זהו דף HTTP לא מאובטח, וכל מידע שאתה שולח יכול באופן פוטנציאלי להיראות ולהשתנות על ידי אחרים. הכניסה הזאת נשמרה במקור בדף מאובטח (HTTPS)." @@ -2151,7 +2206,7 @@ "message": "האם עדיין ברצונך להשלים כניסה זו?" }, "autofillIframeWarning": { - "message": "הטופס מאורח על ידי דומיין שונה מה־URI של הכניסה השמורה שלך. בחר \"בסדר\" כדי להשלים אוטומטית בכל זאת, או \"ביטול\" כדי לעצור." + "message": "הטופס מאורח על ידי דומיין שונה מה־URI של הכניסה השמורה שלך. בחר \"בסדר\" כדי למלא אוטומטית בכל זאת, או \"ביטול\" כדי לעצור." }, "autofillIframeWarningTip": { "message": "כדי למנוע אזהרה זו בעתיד, שמור את URI זה, $HOSTNAME$, בפריט כניסת Bitwarden שלך עבור אתר זה.", @@ -2389,10 +2444,19 @@ } }, "atRiskPasswords": { - "message": "סיסמאות בסכנה" + "message": "סיסמאות בסיכון" }, - "atRiskPasswordsDescSingleOrg": { - "message": "$ORGANIZATION$ מבקש/ת שתשנה $COUNT$ סיסמאות בגלל שהן בסכנה.", + "atRiskPasswordDescSingleOrg": { + "message": "$ORGANIZATION$ מבקש/ת ממך לשנות סיסמה אחת בגלל שהיא בסיכון.", + "placeholders": { + "organization": { + "content": "$1", + "example": "Acme Corp" + } + } + }, + "atRiskPasswordsDescSingleOrgPlural": { + "message": "$ORGANIZATION$ מבקש/ת ממך לשנות $COUNT$ סיסמאות בגלל שהן בסיכון.", "placeholders": { "organization": { "content": "$1", @@ -2404,8 +2468,8 @@ } } }, - "atRiskPasswordsDescMultiOrg": { - "message": "הארגונים שלך מבקשים שתשנה $COUNT$ סיסמאות בגלל שהן בסכנה.", + "atRiskPasswordsDescMultiOrgPlural": { + "message": "הארגונים שלך מבקשים שתשנה $COUNT$ סיסמאות בגלל שהן בסיכון.", "placeholders": { "count": { "content": "$1", @@ -2414,10 +2478,10 @@ } }, "reviewAndChangeAtRiskPassword": { - "message": "סקור ושנה סיסמה אחת בסכנה" + "message": "סקור ושנה סיסמה אחת בסיכון" }, "reviewAndChangeAtRiskPasswordsPlural": { - "message": "סקור ושנה $COUNT$ סיסמאות בסכנה", + "message": "סקור ושנה $COUNT$ סיסמאות בסיכון", "placeholders": { "count": { "content": "$1", @@ -2426,16 +2490,46 @@ } }, "changeAtRiskPasswordsFaster": { - "message": "שנה סיסמאות בסכנה מהר יותר" + "message": "שנה סיסמאות בסיכון מהר יותר" }, "changeAtRiskPasswordsFasterDesc": { "message": "עדכן את ההגדרות שלך כך שתוכל למלא במהירות את הסיסמאות שלך וליצור חדשות" }, + "reviewAtRiskLogins": { + "message": "סקור כניסות בסיכון" + }, + "reviewAtRiskPasswords": { + "message": "סקור סיסמאות בסיכון" + }, + "reviewAtRiskLoginsSlideDesc": { + "message": "סיסמאות הארגון שלך הן בסכנה בגלל שהן חלשות, משומשות, ו/או חשופות.", + "description": "Description of the review at-risk login slide on the at-risk password page carousel" + }, + "reviewAtRiskLoginSlideImgAlt": { + "message": "איור של רשימת כניסות בסיכון" + }, + "generatePasswordSlideDesc": { + "message": "צור במהירות סיסמה חזקה וייחודית עם תפריט המילוי האוטומטי של Bitwarden באתר שבסיכון.", + "description": "Description of the generate password slide on the at-risk password page carousel" + }, + "generatePasswordSlideImgAlt": { + "message": "איור של תפריט המילוי האוטומטי של Bitwarden המציג סיסמה שנוצרה" + }, + "updateInBitwarden": { + "message": "עדכן ב־Bitwarden" + }, + "updateInBitwardenSlideDesc": { + "message": "Bitwarden אז ינחה אותך לעדכן את הסיסמה במנהל הסיסמאות.", + "description": "Description of the update in Bitwarden slide on the at-risk password page carousel" + }, + "updateInBitwardenSlideImgAlt": { + "message": "איור של התראת Bitwarden המנחה את המשתמש לעדכן את הכניסה" + }, "turnOnAutofill": { - "message": "הפעל השלמה אוטומטית" + "message": "הפעל מילוי אוטומטי" }, "turnedOnAutofill": { - "message": "השלמה אוטומטית הופעלה" + "message": "מילוי אוטומטי הופעל" }, "dismiss": { "message": "התעלם" @@ -2468,7 +2562,7 @@ "message": "הגבל צפיות" }, "limitSendViewsHint": { - "message": "אף אחד לא יכול לצפות בסנד זה לאחר ההגעה למגבלה.", + "message": "אף אחד לא יכול לצפות בסֵנְד זה לאחר ההגעה למגבלה.", "description": "Displayed under the limit views field on Send" }, "limitSendViewsCount": { @@ -2482,11 +2576,11 @@ } }, "send": { - "message": "סנד", + "message": "סֵנְד", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendDetails": { - "message": "פרטי סנד", + "message": "פרטי סֵנְד", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendTypeText": { @@ -2499,7 +2593,7 @@ "message": "קובץ" }, "allSends": { - "message": "כל הסנדים", + "message": "כל הסֵנְדים", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "hideTextByDefault": { @@ -2515,7 +2609,7 @@ "message": "העתק קישור" }, "copySendLink": { - "message": "העתק קישור סנד", + "message": "העתק קישור סֵנְד", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "removePassword": { @@ -2528,11 +2622,11 @@ "message": "הסיסמה הוסרה" }, "deletedSend": { - "message": "סנד נמחק", + "message": "סֵנְד נמחק", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendLink": { - "message": "קישור סנד", + "message": "קישור סֵנְד", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "disabled": { @@ -2542,26 +2636,26 @@ "message": "האם אתה בטוח שברצונך להסיר את הסיסמה?" }, "deleteSend": { - "message": "מחק סנד", + "message": "מחק סֵנְד", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "deleteSendConfirmation": { - "message": "האם אתה בטוח שברצונך למחוק סנד זה?", + "message": "האם אתה בטוח שברצונך למחוק סֵנְד זה?", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "deleteSendPermanentConfirmation": { - "message": "האם אתה בטוח שברצונך למחוק לצמיתות סנד זה?", + "message": "האם אתה בטוח שברצונך למחוק לצמיתות סֵנְד זה?", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "editSend": { - "message": "ערוך סנד", + "message": "ערוך סֵנְד", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "deletionDate": { "message": "תאריך מחיקה" }, "deletionDateDescV2": { - "message": "סנד זה יימחק לצמיתות בתאריך זה.", + "message": "סֵנְד זה יימחק לצמיתות בתאריך זה.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "expirationDate": { @@ -2583,38 +2677,38 @@ "message": "מותאם אישית" }, "sendPasswordDescV3": { - "message": "הוסף סיסמה אופציונלית עבור נמענים כדי לגשת לסנד זה.", + "message": "הוסף סיסמה אופציונלית עבור נמענים כדי לגשת לסֵנְד זה.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "createSend": { - "message": "סנד חדש", + "message": "סֵנְד חדש", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "newPassword": { "message": "סיסמה חדשה" }, "sendDisabled": { - "message": "סנד הוסר", + "message": "סֵנְד הוסר", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendDisabledWarning": { - "message": "בשל מדיניות ארגונית, אתה יכול למחוק רק סנד קיים.", + "message": "בשל מדיניות ארגונית, אתה יכול למחוק רק סֵנְד קיים.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "createdSend": { - "message": "סנד נוצר", + "message": "סֵנְד נוצר", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "createdSendSuccessfully": { - "message": "סנד נוצר בהצלחה!", + "message": "סֵנְד נוצר בהצלחה!", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendExpiresInHoursSingle": { - "message": "הסנד יהיה זמין לכל אחד עם הקישור במשך השעה הבאה.", + "message": "הסֵנְד יהיה זמין לכל אחד עם הקישור במשך השעה הבאה.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendExpiresInHours": { - "message": "הסנד יהיה זמין לכל אחד עם הקישור במשך $HOURS$ השעות הבאות.", + "message": "הסֵנְד יהיה זמין לכל אחד עם הקישור במשך $HOURS$ השעות הבאות.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated.", "placeholders": { "hours": { @@ -2624,11 +2718,11 @@ } }, "sendExpiresInDaysSingle": { - "message": "הסנד יהיה זמין לכל אחד עם הקישור במשך היום הבא.", + "message": "הסֵנְד יהיה זמין לכל אחד עם הקישור במשך היום הבא.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendExpiresInDays": { - "message": "הסנד יהיה זמין לכל אחד עם הקישור במשך $DAYS$ הימים הבאים.", + "message": "הסֵנְד יהיה זמין לכל אחד עם הקישור במשך $DAYS$ הימים הבאים.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated.", "placeholders": { "days": { @@ -2638,11 +2732,11 @@ } }, "sendLinkCopied": { - "message": "קישור סנד הועתק", + "message": "קישור סֵנְד הועתק", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "editedSend": { - "message": "סנד נשמר", + "message": "סֵנְד נשמר", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendFilePopoutDialogText": { @@ -2650,7 +2744,7 @@ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendFilePopoutDialogDesc": { - "message": "כדי ליצור קובץ סנד, אתה צריך להקפיץ את ההרחבה לחלון חדש.", + "message": "כדי ליצור קובץ סֵנְד, אתה צריך להקפיץ את ההרחבה לחלון חדש.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendLinuxChromiumFileWarning": { @@ -2705,7 +2799,7 @@ "message": "עליך לאמת את הדוא\"ל שלך כדי להשתמש בתכונה זו. ניתן לאמת את הדוא\"ל שלך בכספת הרשת." }, "updatedMasterPassword": { - "message": "הסיסמה הראשית עודכנה" + "message": "סיסמה ראשית עודכנה" }, "updateMasterPassword": { "message": "עדכן סיסמה ראשית" @@ -2726,7 +2820,7 @@ "message": "לארגון זה יש מדיניות ארגונית שתרשום אותך באופן אוטומטי לאיפוס סיסמה. הרישום יאפשר למנהלי הארגון לשנות את הסיסמה הראשית שלך." }, "selectFolder": { - "message": "בחר תיקיה..." + "message": "בחר תיקייה..." }, "noFoldersFound": { "message": "לא נמצאו תיקיות", @@ -2843,7 +2937,7 @@ "message": "לא נמצא מזהה ייחודי." }, "convertOrganizationEncryptionDesc": { - "message": "$ORGANIZATION$ משתמשת ב־SSO עם שרת מפתחות באירוח עצמי. סיסמה ראשית לא דרושה יותר כדי להיכנס עבור חברים של ארגון זה.", + "message": "$ORGANIZATION$ משתמש/ת ב־SSO עם שרת מפתחות באירוח עצמי. סיסמה ראשית לא דרושה יותר כדי להיכנס עבור חברים של ארגון זה.", "placeholders": { "organization": { "content": "$1", @@ -3123,7 +3217,7 @@ "description": "Part of a URL." }, "apiAccessToken": { - "message": "אסימון גישה ל־API" + "message": "אסימון גישת API" }, "apiKey": { "message": "מפתח API" @@ -3430,11 +3524,11 @@ "message": "מכשיר מהימן" }, "sendsNoItemsTitle": { - "message": "אין סנדים פעילים", + "message": "אין סֵנְדים פעילים", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendsNoItemsMessage": { - "message": "השתמש בסנד כדי לשתף באופן מאובטח מידע מוצפן עם כל אחד.", + "message": "השתמש בסֵנְד כדי לשתף באופן מאובטח מידע מוצפן עם כל אחד.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "inputRequired": { @@ -3575,7 +3669,7 @@ "message": "דלג לתוכן" }, "bitwardenOverlayButton": { - "message": "כפתור תפריט מילוי אוטומטי של Bitwarden", + "message": "לחצן תפריט מילוי אוטומטי של Bitwarden", "description": "Page title for the iframe containing the overlay button" }, "toggleBitwardenVaultOverlay": { @@ -3777,7 +3871,7 @@ "message": "למד על אפשרויות הייבוא שלך" }, "selectImportFolder": { - "message": "בחר תיקיה" + "message": "בחר תיקייה" }, "selectImportCollection": { "message": "בחר אוסף" @@ -3899,7 +3993,7 @@ "message": "אימות נדרש כדי להשתמש במפתח גישה. אמת את זהותך כדי להמשיך." }, "multifactorAuthenticationCancelled": { - "message": "אימות רב-שלבי בוטל" + "message": "אימות רב-גורמי בוטל" }, "noLastPassDataFound": { "message": "לא נמצאו נתוני LastPass" @@ -3917,7 +4011,7 @@ "message": "PIN שגוי" }, "multifactorAuthenticationFailed": { - "message": "אימות רב-שלבי נכשל" + "message": "אימות רב-גורמי נכשל" }, "includeSharedFolders": { "message": "כלול תיקיות משותפות" @@ -3929,7 +4023,7 @@ "message": "מייבא את החשבון שלך..." }, "lastPassMFARequired": { - "message": "נדרש אימות רב-שלבי של LastPass" + "message": "נדרש אימות רב-גורמי של LastPass" }, "lastPassMFADesc": { "message": "הזן את קוד הגישה החד פעמי שלך מיישום האימות שלך" @@ -4181,6 +4275,20 @@ } } }, + "copyFieldValue": { + "message": "העתק $FIELD$, $VALUE$", + "description": "Title for a button that copies a field value to the clipboard.", + "placeholders": { + "field": { + "content": "$1", + "example": "Username" + }, + "value": { + "content": "$2", + "example": "Foo" + } + } + }, "noValuesToCopy": { "message": "אין ערכים להעתקה" }, @@ -4200,7 +4308,7 @@ "message": "מסוף ניהול" }, "accountSecurity": { - "message": "אבטחת חשבון" + "message": "אבטחת החשבון" }, "notifications": { "message": "התראות" @@ -4248,7 +4356,7 @@ } }, "itemsWithNoFolder": { - "message": "פריטים ללא תיקיה" + "message": "פריטים ללא תיקייה" }, "itemDetails": { "message": "פרטי הפריט" @@ -4467,7 +4575,7 @@ "description": "A section header for a list of passwords." }, "logInWithPasskeyAriaLabel": { - "message": "היכנס עם מפתח גישה", + "message": "כניסה עם מפתח גישה", "description": "ARIA label for the inline menu button that logs in with a passkey." }, "assign": { @@ -4665,16 +4773,16 @@ "message": "מיקום פריט" }, "fileSend": { - "message": "קובץ סנד" + "message": "סֵנְד של קובץ" }, "fileSends": { - "message": "סנדים של קובץ" + "message": "סֵנְדים של קובץ" }, "textSend": { - "message": "טקסט סנד" + "message": "סֵנְד של טקסט" }, "textSends": { - "message": "סנדים של טקסט" + "message": "סֵנְדים של טקסט" }, "accountActions": { "message": "פעולות חשבון" @@ -4833,7 +4941,7 @@ "description": "Represents the ^ key in screen reader content as a readable word" }, "ampersandCharacterDescriptor": { - "message": "אמפרסנד", + "message": "אמפרסֵנְד", "description": "Represents the & key in screen reader content as a readable word" }, "asteriskCharacterDescriptor": { @@ -4953,7 +5061,7 @@ "message": "Bitwarden ישלח קוד לדוא\"ל החשבון שלך כדי לאמת כניסות ממכשירים חדשים החל מפברואר 2025." }, "newDeviceVerificationNoticeContentPage2": { - "message": "אתה יכול להגדיר כניסה דו-שלבית כדרך חלופית להגן על החשבון שלך או לשנות את הדוא\"ל שלך לאחד שתוכל לגשת אליו." + "message": "אתה יכול להגדיר כניסה דו-שלבית כדרך חלופית להגן על החשבון שלך או לשנות את הדוא\"ל שלך לאחד שאתה יכול לגשת אליו." }, "remindMeLater": { "message": "הזכר לי מאוחר יותר" diff --git a/apps/browser/src/_locales/hi/messages.json b/apps/browser/src/_locales/hi/messages.json index de5ecb22984..430ffbf0849 100644 --- a/apps/browser/src/_locales/hi/messages.json +++ b/apps/browser/src/_locales/hi/messages.json @@ -80,6 +80,15 @@ "masterPassHint": { "message": "Master Password Hint (optional)" }, + "passwordStrengthScore": { + "message": "Password strength score $SCORE$", + "placeholders": { + "score": { + "content": "$1", + "example": "4" + } + } + }, "joinOrganization": { "message": "Join organization" }, @@ -876,6 +885,21 @@ "logInToBitwarden": { "message": "Log in to Bitwarden" }, + "enterTheCodeSentToYourEmail": { + "message": "आपके ईमेल पर भेजा गया कोड भरें" + }, + "enterTheCodeFromYourAuthenticatorApp": { + "message": "अपने प्रमाणक ऐप से कोड डालें" + }, + "pressYourYubiKeyToAuthenticate": { + "message": "Press your YubiKey to authenticate" + }, + "duoTwoFactorRequiredPageSubtitle": { + "message": "Duo two-step login is required for your account. Follow the steps below to finish logging in." + }, + "followTheStepsBelowToFinishLoggingIn": { + "message": "Follow the steps below to finish logging in." + }, "restartRegistration": { "message": "Restart registration" }, @@ -1365,12 +1389,22 @@ "rememberMe": { "message": "मुझे याद रखें" }, + "dontAskAgainOnThisDeviceFor30Days": { + "message": "Don't ask again on this device for 30 days" + }, "sendVerificationCodeEmailAgain": { "message": "फिर से सत्यापन कोड ईमेल भेजें" }, "useAnotherTwoStepMethod": { "message": "एक और दो-चरण लॉगिन विधि का उपयोग करें" }, + "selectAnotherMethod": { + "message": "Select another method", + "description": "Select another two-step login method" + }, + "useYourRecoveryCode": { + "message": "Use your recovery code" + }, "insertYubiKey": { "message": "अपने कंप्यूटर के यूएसबी पोर्ट में अपने YubiKey डालें, फिर इसके बटन को स्पर्श करें।" }, @@ -1383,9 +1417,18 @@ "webAuthnNewTabOpen": { "message": "नया टैब खोलें" }, + "openInNewTab": { + "message": "Open in new tab" + }, "webAuthnAuthenticate": { "message": "वेबऑथन प्रमाणित करें" }, + "readSecurityKey": { + "message": "Read security key" + }, + "awaitingSecurityKeyInteraction": { + "message": "Awaiting security key interaction..." + }, "loginUnavailable": { "message": "Login Unavailable" }, @@ -1398,6 +1441,9 @@ "twoStepOptions": { "message": "Two-step Login Options" }, + "selectTwoStepLoginMethod": { + "message": "Select two-step login method" + }, "recoveryCodeDesc": { "message": "अपने दो कारक प्रदाताओं के सभी के लिए उपयोग खो दिया है? अपने खाते से सभी दो-कारक प्रदाताओं को अक्षम करने के लिए अपने रिकवरी कोड का उपयोग करें।" }, @@ -2097,6 +2143,15 @@ "vaultTimeoutAction1": { "message": "टाइमआउट कार्रवाई" }, + "newCustomizationOptionsCalloutTitle": { + "message": "New customization options" + }, + "newCustomizationOptionsCalloutContent": { + "message": "Customize your vault experience with quick copy actions, compact mode, and more!" + }, + "newCustomizationOptionsCalloutLink": { + "message": "View all Appearance settings" + }, "lock": { "message": "लॉक", "description": "Verb form: to make secure or inaccessible by" @@ -2391,8 +2446,17 @@ "atRiskPasswords": { "message": "At-risk passwords" }, - "atRiskPasswordsDescSingleOrg": { - "message": "$ORGANIZATION$ is requesting you change the $COUNT$ passwords because they are at risk.", + "atRiskPasswordDescSingleOrg": { + "message": "$ORGANIZATION$ is requesting you change one password because it is at-risk.", + "placeholders": { + "organization": { + "content": "$1", + "example": "Acme Corp" + } + } + }, + "atRiskPasswordsDescSingleOrgPlural": { + "message": "$ORGANIZATION$ is requesting you change the $COUNT$ passwords because they are at-risk.", "placeholders": { "organization": { "content": "$1", @@ -2404,8 +2468,8 @@ } } }, - "atRiskPasswordsDescMultiOrg": { - "message": "Your organizations are requesting you change the $COUNT$ passwords because they are at risk.", + "atRiskPasswordsDescMultiOrgPlural": { + "message": "Your organizations are requesting you change the $COUNT$ passwords because they are at-risk.", "placeholders": { "count": { "content": "$1", @@ -2431,6 +2495,36 @@ "changeAtRiskPasswordsFasterDesc": { "message": "Update your settings so you can quickly autofill your passwords and generate new ones" }, + "reviewAtRiskLogins": { + "message": "Review at-risk logins" + }, + "reviewAtRiskPasswords": { + "message": "Review at-risk passwords" + }, + "reviewAtRiskLoginsSlideDesc": { + "message": "Your organization passwords are at-risk because they are weak, reused, and/or exposed.", + "description": "Description of the review at-risk login slide on the at-risk password page carousel" + }, + "reviewAtRiskLoginSlideImgAlt": { + "message": "Illustration of a list of logins that are at-risk" + }, + "generatePasswordSlideDesc": { + "message": "Quickly generate a strong, unique password with the Bitwarden autofill menu on the at-risk site.", + "description": "Description of the generate password slide on the at-risk password page carousel" + }, + "generatePasswordSlideImgAlt": { + "message": "Illustration of the Bitwarden autofill menu displaying a generated password" + }, + "updateInBitwarden": { + "message": "Update in Bitwarden" + }, + "updateInBitwardenSlideDesc": { + "message": "Bitwarden will then prompt you to update the password in the password manager.", + "description": "Description of the update in Bitwarden slide on the at-risk password page carousel" + }, + "updateInBitwardenSlideImgAlt": { + "message": "Illustration of a Bitwarden’s notification prompting the user to update the login" + }, "turnOnAutofill": { "message": "Turn on autofill" }, @@ -4181,6 +4275,20 @@ } } }, + "copyFieldValue": { + "message": "Copy $FIELD$, $VALUE$", + "description": "Title for a button that copies a field value to the clipboard.", + "placeholders": { + "field": { + "content": "$1", + "example": "Username" + }, + "value": { + "content": "$2", + "example": "Foo" + } + } + }, "noValuesToCopy": { "message": "No values to copy" }, diff --git a/apps/browser/src/_locales/hr/messages.json b/apps/browser/src/_locales/hr/messages.json index 70d3b7b0446..b1677323605 100644 --- a/apps/browser/src/_locales/hr/messages.json +++ b/apps/browser/src/_locales/hr/messages.json @@ -80,6 +80,15 @@ "masterPassHint": { "message": "Podsjetnik glavne lozinke (neobavezno)" }, + "passwordStrengthScore": { + "message": "Password strength score $SCORE$", + "placeholders": { + "score": { + "content": "$1", + "example": "4" + } + } + }, "joinOrganization": { "message": "Pridruži se organizaciji" }, @@ -876,6 +885,21 @@ "logInToBitwarden": { "message": "Prijavi se u Bitwarden" }, + "enterTheCodeSentToYourEmail": { + "message": "Enter the code sent to your email" + }, + "enterTheCodeFromYourAuthenticatorApp": { + "message": "Enter the code from your authenticator app" + }, + "pressYourYubiKeyToAuthenticate": { + "message": "Press your YubiKey to authenticate" + }, + "duoTwoFactorRequiredPageSubtitle": { + "message": "Duo two-step login is required for your account. Follow the steps below to finish logging in." + }, + "followTheStepsBelowToFinishLoggingIn": { + "message": "Follow the steps below to finish logging in." + }, "restartRegistration": { "message": "Ponovno pokreni registraciju" }, @@ -1365,12 +1389,22 @@ "rememberMe": { "message": "Zapamti me" }, + "dontAskAgainOnThisDeviceFor30Days": { + "message": "Don't ask again on this device for 30 days" + }, "sendVerificationCodeEmailAgain": { "message": "Ponovno slanje kontrolnog koda e-poštom" }, "useAnotherTwoStepMethod": { "message": "Koristiti drugi način prijave dvostrukom autentifikacijom" }, + "selectAnotherMethod": { + "message": "Select another method", + "description": "Select another two-step login method" + }, + "useYourRecoveryCode": { + "message": "Use your recovery code" + }, "insertYubiKey": { "message": "Umetni svoj YubiKey u USB priključak računala, a zatim dodirni njegovu tipku." }, @@ -1383,9 +1417,18 @@ "webAuthnNewTabOpen": { "message": "Otvori novu karticu" }, + "openInNewTab": { + "message": "Open in new tab" + }, "webAuthnAuthenticate": { "message": "Ovjeri WebAuthn" }, + "readSecurityKey": { + "message": "Read security key" + }, + "awaitingSecurityKeyInteraction": { + "message": "Awaiting security key interaction..." + }, "loginUnavailable": { "message": "Prijava nije dostupna" }, @@ -1398,6 +1441,9 @@ "twoStepOptions": { "message": "Mogućnosti prijave dvostrukom autentifikacijom" }, + "selectTwoStepLoginMethod": { + "message": "Select two-step login method" + }, "recoveryCodeDesc": { "message": "Izgubljen je pristup uređaju za dvostruku autentifikaciju? Koristi svoj kôd za oporavak za onemogućavanje svih pružatelja usluga dvostruke autentifikacije na tvojem računu." }, @@ -2097,6 +2143,15 @@ "vaultTimeoutAction1": { "message": "Radnja nakon isteka " }, + "newCustomizationOptionsCalloutTitle": { + "message": "New customization options" + }, + "newCustomizationOptionsCalloutContent": { + "message": "Customize your vault experience with quick copy actions, compact mode, and more!" + }, + "newCustomizationOptionsCalloutLink": { + "message": "View all Appearance settings" + }, "lock": { "message": "Zaključaj", "description": "Verb form: to make secure or inaccessible by" @@ -2391,8 +2446,17 @@ "atRiskPasswords": { "message": "Rizične lozinke" }, - "atRiskPasswordsDescSingleOrg": { - "message": "Broj rizičnih lozinki koje $ORGANIZATION$ traži da promijeniš: $COUNT$.", + "atRiskPasswordDescSingleOrg": { + "message": "$ORGANIZATION$ is requesting you change one password because it is at-risk.", + "placeholders": { + "organization": { + "content": "$1", + "example": "Acme Corp" + } + } + }, + "atRiskPasswordsDescSingleOrgPlural": { + "message": "$ORGANIZATION$ is requesting you change the $COUNT$ passwords because they are at-risk.", "placeholders": { "organization": { "content": "$1", @@ -2404,8 +2468,8 @@ } } }, - "atRiskPasswordsDescMultiOrg": { - "message": "Broj rizičnih lozinki koje tvoja organizacija traži da promijeniš: $COUNT$.", + "atRiskPasswordsDescMultiOrgPlural": { + "message": "Your organizations are requesting you change the $COUNT$ passwords because they are at-risk.", "placeholders": { "count": { "content": "$1", @@ -2431,6 +2495,36 @@ "changeAtRiskPasswordsFasterDesc": { "message": "Ažuriraj svoje postavke kako za brzu auto-ispunu svojih lozinki i generiranje novih" }, + "reviewAtRiskLogins": { + "message": "Review at-risk logins" + }, + "reviewAtRiskPasswords": { + "message": "Review at-risk passwords" + }, + "reviewAtRiskLoginsSlideDesc": { + "message": "Your organization passwords are at-risk because they are weak, reused, and/or exposed.", + "description": "Description of the review at-risk login slide on the at-risk password page carousel" + }, + "reviewAtRiskLoginSlideImgAlt": { + "message": "Illustration of a list of logins that are at-risk" + }, + "generatePasswordSlideDesc": { + "message": "Quickly generate a strong, unique password with the Bitwarden autofill menu on the at-risk site.", + "description": "Description of the generate password slide on the at-risk password page carousel" + }, + "generatePasswordSlideImgAlt": { + "message": "Illustration of the Bitwarden autofill menu displaying a generated password" + }, + "updateInBitwarden": { + "message": "Update in Bitwarden" + }, + "updateInBitwardenSlideDesc": { + "message": "Bitwarden will then prompt you to update the password in the password manager.", + "description": "Description of the update in Bitwarden slide on the at-risk password page carousel" + }, + "updateInBitwardenSlideImgAlt": { + "message": "Illustration of a Bitwarden’s notification prompting the user to update the login" + }, "turnOnAutofill": { "message": "Uključi auto-ispunu" }, @@ -4181,6 +4275,20 @@ } } }, + "copyFieldValue": { + "message": "Copy $FIELD$, $VALUE$", + "description": "Title for a button that copies a field value to the clipboard.", + "placeholders": { + "field": { + "content": "$1", + "example": "Username" + }, + "value": { + "content": "$2", + "example": "Foo" + } + } + }, "noValuesToCopy": { "message": "Nema vrijednosti za kopiranje" }, diff --git a/apps/browser/src/_locales/hu/messages.json b/apps/browser/src/_locales/hu/messages.json index 4d547f3b62d..e134c7f1f26 100644 --- a/apps/browser/src/_locales/hu/messages.json +++ b/apps/browser/src/_locales/hu/messages.json @@ -80,6 +80,15 @@ "masterPassHint": { "message": "Mesterjelszó emlékeztető (nem kötelező)" }, + "passwordStrengthScore": { + "message": "A jelszó erősségi pontszáma $SCORE$", + "placeholders": { + "score": { + "content": "$1", + "example": "4" + } + } + }, "joinOrganization": { "message": "Csatlakozás szervezethez" }, @@ -876,6 +885,21 @@ "logInToBitwarden": { "message": "Bejelentkezés a Bitwardenbe" }, + "enterTheCodeSentToYourEmail": { + "message": "Adjuk meg az email címre elküldött kódot." + }, + "enterTheCodeFromYourAuthenticatorApp": { + "message": "Adjuk meg a hitelesítő alkalmazása által generált kódot." + }, + "pressYourYubiKeyToAuthenticate": { + "message": "Nyomjuk meg a YubiKey-t a hitelesítéshez." + }, + "duoTwoFactorRequiredPageSubtitle": { + "message": "Duo kétlépcsős bejelentkezés szükséges a fiókhoz. Kövessük az alábbi lépéseket a bejelentkezés befejezéséhez." + }, + "followTheStepsBelowToFinishLoggingIn": { + "message": "Kövessük az alábbi lépéseket a bejelentkezés befejezéséhez." + }, "restartRegistration": { "message": "Restart registration" }, @@ -1365,12 +1389,22 @@ "rememberMe": { "message": "Emlékezz rám" }, + "dontAskAgainOnThisDeviceFor30Days": { + "message": "Ne kérdezzen újra ezen az eszközön 30 napig" + }, "sendVerificationCodeEmailAgain": { "message": "Megerősítő kód e-mail újra küldése" }, "useAnotherTwoStepMethod": { "message": "Más két lépcsős bejelentkezés használata" }, + "selectAnotherMethod": { + "message": "Másik módszer választás", + "description": "Select another two-step login method" + }, + "useYourRecoveryCode": { + "message": "Helyreállító kód használata" + }, "insertYubiKey": { "message": "Illeszd be a YubiKey-t a számítógéped egyik USB portjába, majd nyomd meg a gombját." }, @@ -1383,9 +1417,18 @@ "webAuthnNewTabOpen": { "message": "Új fül megnyitása" }, + "openInNewTab": { + "message": "Megnyitás új fülön" + }, "webAuthnAuthenticate": { "message": "WebAutn hitelesítés" }, + "readSecurityKey": { + "message": "Biztonsági kulcs olvasása" + }, + "awaitingSecurityKeyInteraction": { + "message": "Várakozás a biztonsági kulcs interakciójára..." + }, "loginUnavailable": { "message": "A bejelentkezés nem érhető el." }, @@ -1398,6 +1441,9 @@ "twoStepOptions": { "message": "Kétlépcsős bejelentkezés opciók" }, + "selectTwoStepLoginMethod": { + "message": "Kétlépcsős bejelentkezési mód használata" + }, "recoveryCodeDesc": { "message": "Elveszett a hozzáférés az összes kétlépcsős szolgáltatóhoz? A helyreállító kód használatával letilthatók fiókból a kétlépcsős szolgáltatók." }, @@ -2097,6 +2143,15 @@ "vaultTimeoutAction1": { "message": "Időkifutási művelet" }, + "newCustomizationOptionsCalloutTitle": { + "message": "Új testreszabási opciók" + }, + "newCustomizationOptionsCalloutContent": { + "message": "Szabjuk testre tárhely élményét gyors másolási műveletekkel, kompakt móddal és még sok mással!" + }, + "newCustomizationOptionsCalloutLink": { + "message": "Az összes megjelenési beállítás megtekintése" + }, "lock": { "message": "Lezárás", "description": "Verb form: to make secure or inaccessible by" @@ -2391,8 +2446,17 @@ "atRiskPasswords": { "message": "Veszélyes jelszavak" }, - "atRiskPasswordsDescSingleOrg": { - "message": "$ORGANIZATION$ $COUNT$ jelszó meegváltoztatását kéri, mert veszélyben vannak.", + "atRiskPasswordDescSingleOrg": { + "message": "$ORGANIZATION$ egy jelszó megváltoztatását kéri, mert az kockázatos.", + "placeholders": { + "organization": { + "content": "$1", + "example": "Acme Corp" + } + } + }, + "atRiskPasswordsDescSingleOrgPlural": { + "message": "$ORGANIZATION$ $COUNT$ jelszó megváltoztatását kéri, mert azok kockázatosak.", "placeholders": { "organization": { "content": "$1", @@ -2404,8 +2468,8 @@ } } }, - "atRiskPasswordsDescMultiOrg": { - "message": "A szervezetek $COUNT$ jelszó meegváltoztatását kérik, mert veszélyben vannak.", + "atRiskPasswordsDescMultiOrgPlural": { + "message": "A szervezetek $COUNT$ jelszó megváltoztatását kérik, mert azok kockázatosak.", "placeholders": { "count": { "content": "$1", @@ -2431,6 +2495,36 @@ "changeAtRiskPasswordsFasterDesc": { "message": "Frissítsük a beállításokat, hogy gyorsan automatikusan kitölthessük a jelszavakat és újakat generálhassunk." }, + "reviewAtRiskLogins": { + "message": "Kockázatos bejelentkezések áttekintése" + }, + "reviewAtRiskPasswords": { + "message": "Kockázatos jelszavak áttekintése" + }, + "reviewAtRiskLoginsSlideDesc": { + "message": "A szervezeti jelszavak kockázatosak, mert gyengék, újra felhasználásra kerültek és/vagy nyilvánosságra kerültek.", + "description": "Description of the review at-risk login slide on the at-risk password page carousel" + }, + "reviewAtRiskLoginSlideImgAlt": { + "message": "A kockázatos bejelentkezések listájának illusztrációja" + }, + "generatePasswordSlideDesc": { + "message": "Gyorsan generálhatunk erős, egyedi jelszót a Bitwarden automatikus kitöltési menüjével a kockázatos webhelyen.", + "description": "Description of the generate password slide on the at-risk password page carousel" + }, + "generatePasswordSlideImgAlt": { + "message": "A Bitwarden automatikus kitöltési menüjének illusztrációja, amely egy generált jelszót jelenít meg." + }, + "updateInBitwarden": { + "message": "Frissítés a Bitwardenben" + }, + "updateInBitwardenSlideDesc": { + "message": "A Bitwarden ezután felkér a jelszó frissítésére a jelszókezelőben.", + "description": "Description of the update in Bitwarden slide on the at-risk password page carousel" + }, + "updateInBitwardenSlideImgAlt": { + "message": "Illusztráció a Bitwarden értesítéséről, amely felszólítja a felhasználót a bejelentkezési adatok frissítésére." + }, "turnOnAutofill": { "message": "Automatikus kitöltés bekapcsolása" }, @@ -4181,6 +4275,20 @@ } } }, + "copyFieldValue": { + "message": "$FIELD$, $VALUE$ másolása", + "description": "Title for a button that copies a field value to the clipboard.", + "placeholders": { + "field": { + "content": "$1", + "example": "Username" + }, + "value": { + "content": "$2", + "example": "Foo" + } + } + }, "noValuesToCopy": { "message": "Nincsenek másolandó értékek." }, diff --git a/apps/browser/src/_locales/id/messages.json b/apps/browser/src/_locales/id/messages.json index 57a1ed59026..c4f3af84e34 100644 --- a/apps/browser/src/_locales/id/messages.json +++ b/apps/browser/src/_locales/id/messages.json @@ -80,6 +80,15 @@ "masterPassHint": { "message": "Petunjuk Kata Sandi Utama (opsional)" }, + "passwordStrengthScore": { + "message": "Password strength score $SCORE$", + "placeholders": { + "score": { + "content": "$1", + "example": "4" + } + } + }, "joinOrganization": { "message": "Bergabung ke organisasi" }, @@ -876,6 +885,21 @@ "logInToBitwarden": { "message": "Masuk ke Bitwarden" }, + "enterTheCodeSentToYourEmail": { + "message": "Enter the code sent to your email" + }, + "enterTheCodeFromYourAuthenticatorApp": { + "message": "Enter the code from your authenticator app" + }, + "pressYourYubiKeyToAuthenticate": { + "message": "Press your YubiKey to authenticate" + }, + "duoTwoFactorRequiredPageSubtitle": { + "message": "Duo two-step login is required for your account. Follow the steps below to finish logging in." + }, + "followTheStepsBelowToFinishLoggingIn": { + "message": "Follow the steps below to finish logging in." + }, "restartRegistration": { "message": "Mulai ulang pendaftaran" }, @@ -1365,12 +1389,22 @@ "rememberMe": { "message": "Ingat saya" }, + "dontAskAgainOnThisDeviceFor30Days": { + "message": "Don't ask again on this device for 30 days" + }, "sendVerificationCodeEmailAgain": { "message": "Kirim ulang email kode verifikasi" }, "useAnotherTwoStepMethod": { "message": "Gunakan metode masuk dua langkah lainnya" }, + "selectAnotherMethod": { + "message": "Select another method", + "description": "Select another two-step login method" + }, + "useYourRecoveryCode": { + "message": "Use your recovery code" + }, "insertYubiKey": { "message": "Masukkan YubiKey Anda ke port USB komputer Anda, lalu sentuh tombolnya." }, @@ -1383,9 +1417,18 @@ "webAuthnNewTabOpen": { "message": "Buka tab baru" }, + "openInNewTab": { + "message": "Open in new tab" + }, "webAuthnAuthenticate": { "message": "Autentikasi dengan WebAuthn." }, + "readSecurityKey": { + "message": "Read security key" + }, + "awaitingSecurityKeyInteraction": { + "message": "Awaiting security key interaction..." + }, "loginUnavailable": { "message": "Info Masuk Tidak Tersedia" }, @@ -1398,6 +1441,9 @@ "twoStepOptions": { "message": "Opsi Info Masuk Dua Langkah" }, + "selectTwoStepLoginMethod": { + "message": "Select two-step login method" + }, "recoveryCodeDesc": { "message": "Kehilangan akses ke semua penyedia dua faktor Anda? Gunakan kode pemulihan untuk menonaktifkan semua penyedia dua faktor dari akun Anda." }, @@ -2097,6 +2143,15 @@ "vaultTimeoutAction1": { "message": "Batas waktu tindakan" }, + "newCustomizationOptionsCalloutTitle": { + "message": "New customization options" + }, + "newCustomizationOptionsCalloutContent": { + "message": "Customize your vault experience with quick copy actions, compact mode, and more!" + }, + "newCustomizationOptionsCalloutLink": { + "message": "View all Appearance settings" + }, "lock": { "message": "Kunci", "description": "Verb form: to make secure or inaccessible by" @@ -2391,8 +2446,17 @@ "atRiskPasswords": { "message": "At-risk passwords" }, - "atRiskPasswordsDescSingleOrg": { - "message": "$ORGANIZATION$ is requesting you change the $COUNT$ passwords because they are at risk.", + "atRiskPasswordDescSingleOrg": { + "message": "$ORGANIZATION$ is requesting you change one password because it is at-risk.", + "placeholders": { + "organization": { + "content": "$1", + "example": "Acme Corp" + } + } + }, + "atRiskPasswordsDescSingleOrgPlural": { + "message": "$ORGANIZATION$ is requesting you change the $COUNT$ passwords because they are at-risk.", "placeholders": { "organization": { "content": "$1", @@ -2404,8 +2468,8 @@ } } }, - "atRiskPasswordsDescMultiOrg": { - "message": "Your organizations are requesting you change the $COUNT$ passwords because they are at risk.", + "atRiskPasswordsDescMultiOrgPlural": { + "message": "Your organizations are requesting you change the $COUNT$ passwords because they are at-risk.", "placeholders": { "count": { "content": "$1", @@ -2431,6 +2495,36 @@ "changeAtRiskPasswordsFasterDesc": { "message": "Update your settings so you can quickly autofill your passwords and generate new ones" }, + "reviewAtRiskLogins": { + "message": "Review at-risk logins" + }, + "reviewAtRiskPasswords": { + "message": "Review at-risk passwords" + }, + "reviewAtRiskLoginsSlideDesc": { + "message": "Your organization passwords are at-risk because they are weak, reused, and/or exposed.", + "description": "Description of the review at-risk login slide on the at-risk password page carousel" + }, + "reviewAtRiskLoginSlideImgAlt": { + "message": "Illustration of a list of logins that are at-risk" + }, + "generatePasswordSlideDesc": { + "message": "Quickly generate a strong, unique password with the Bitwarden autofill menu on the at-risk site.", + "description": "Description of the generate password slide on the at-risk password page carousel" + }, + "generatePasswordSlideImgAlt": { + "message": "Illustration of the Bitwarden autofill menu displaying a generated password" + }, + "updateInBitwarden": { + "message": "Update in Bitwarden" + }, + "updateInBitwardenSlideDesc": { + "message": "Bitwarden will then prompt you to update the password in the password manager.", + "description": "Description of the update in Bitwarden slide on the at-risk password page carousel" + }, + "updateInBitwardenSlideImgAlt": { + "message": "Illustration of a Bitwarden’s notification prompting the user to update the login" + }, "turnOnAutofill": { "message": "Turn on autofill" }, @@ -4181,6 +4275,20 @@ } } }, + "copyFieldValue": { + "message": "Copy $FIELD$, $VALUE$", + "description": "Title for a button that copies a field value to the clipboard.", + "placeholders": { + "field": { + "content": "$1", + "example": "Username" + }, + "value": { + "content": "$2", + "example": "Foo" + } + } + }, "noValuesToCopy": { "message": "Tidak ada nilai untuk disalin" }, diff --git a/apps/browser/src/_locales/it/messages.json b/apps/browser/src/_locales/it/messages.json index 4f85ed889ff..e33d1276ecf 100644 --- a/apps/browser/src/_locales/it/messages.json +++ b/apps/browser/src/_locales/it/messages.json @@ -80,6 +80,15 @@ "masterPassHint": { "message": "Suggerimento per la password principale (facoltativo)" }, + "passwordStrengthScore": { + "message": "Valutazione complessità parola d'accesso $SCORE$", + "placeholders": { + "score": { + "content": "$1", + "example": "4" + } + } + }, "joinOrganization": { "message": "Unisciti all'organizzazione" }, @@ -876,6 +885,21 @@ "logInToBitwarden": { "message": "Accedi a Bitwarden" }, + "enterTheCodeSentToYourEmail": { + "message": "Inserisci il codice inviato alla tua e-mail" + }, + "enterTheCodeFromYourAuthenticatorApp": { + "message": "Inserisci il codice dalla tua app di autenticazione" + }, + "pressYourYubiKeyToAuthenticate": { + "message": "Premi la tua chiave Yubi per autenticare" + }, + "duoTwoFactorRequiredPageSubtitle": { + "message": "Il login Duo in due passaggi è richiesto per il tuo account. Segui i passaggi qui sotto per completare l'accesso." + }, + "followTheStepsBelowToFinishLoggingIn": { + "message": "Segui i passaggi qui sotto per completare l'accesso." + }, "restartRegistration": { "message": "Riprova la registrazione" }, @@ -1365,12 +1389,22 @@ "rememberMe": { "message": "Ricordami" }, + "dontAskAgainOnThisDeviceFor30Days": { + "message": "Non chiedere più su questo dispositivo per 30 giorni" + }, "sendVerificationCodeEmailAgain": { "message": "Invia di nuovo l'email con codice di verifica" }, "useAnotherTwoStepMethod": { "message": "Usa un altro metodo di verifica in due passaggi" }, + "selectAnotherMethod": { + "message": "Seleziona un altro metodo", + "description": "Select another two-step login method" + }, + "useYourRecoveryCode": { + "message": "Usa il tuo codice di recupero" + }, "insertYubiKey": { "message": "Inserisci la tua YubiKey nella porta USB del computer, poi premi il suo pulsante." }, @@ -1383,9 +1417,18 @@ "webAuthnNewTabOpen": { "message": "Apri nuova scheda" }, + "openInNewTab": { + "message": "Apri in una nuova scheda" + }, "webAuthnAuthenticate": { "message": "Autenticazione WebAuthn" }, + "readSecurityKey": { + "message": "Leggi chiave di sicurezza" + }, + "awaitingSecurityKeyInteraction": { + "message": "In attesa di interazione con la chiave di sicurezza..." + }, "loginUnavailable": { "message": "Login non disponibile" }, @@ -1398,6 +1441,9 @@ "twoStepOptions": { "message": "Opzioni di verifica in due passaggi" }, + "selectTwoStepLoginMethod": { + "message": "Seleziona metodo di accesso in due passaggi" + }, "recoveryCodeDesc": { "message": "Hai perso l'accesso a tutti i tuoi metodi di verifica in due passaggi? Usa il tuo codice di recupero per disattivarli tutti dal tuo account." }, @@ -2097,6 +2143,15 @@ "vaultTimeoutAction1": { "message": "Azione al timeout" }, + "newCustomizationOptionsCalloutTitle": { + "message": "Nuove opzioni di personalizzazione" + }, + "newCustomizationOptionsCalloutContent": { + "message": "Personalizza l'esperienza della tua cassaforte con azioni di copia rapida, modalità compatta e altro ancora!" + }, + "newCustomizationOptionsCalloutLink": { + "message": "Vedi tutte le impostazioni di aspetto" + }, "lock": { "message": "Blocca", "description": "Verb form: to make secure or inaccessible by" @@ -2391,7 +2446,16 @@ "atRiskPasswords": { "message": "Parola d'accesso a rischio" }, - "atRiskPasswordsDescSingleOrg": { + "atRiskPasswordDescSingleOrg": { + "message": "$ORGANIZATION$ ti chiede di cambiare una parola d'accesso perché è a rischio.", + "placeholders": { + "organization": { + "content": "$1", + "example": "Acme Corp" + } + } + }, + "atRiskPasswordsDescSingleOrgPlural": { "message": "$ORGANIZATION$ ti sta richiedendo di modificare $COUNT$ parole d'accesso perché sono a rischio.", "placeholders": { "organization": { @@ -2404,7 +2468,7 @@ } } }, - "atRiskPasswordsDescMultiOrg": { + "atRiskPasswordsDescMultiOrgPlural": { "message": "Le tue organizzazioni ti chiedono di modificare le $COUNT$ parole d'accesso perché sono a rischio.", "placeholders": { "count": { @@ -2431,6 +2495,36 @@ "changeAtRiskPasswordsFasterDesc": { "message": "Aggiorna le impostazioni in modo da poter rapidamente riempire automaticamente le parole d'accesso e generarne di nuove" }, + "reviewAtRiskLogins": { + "message": "Redi accessi a rischio" + }, + "reviewAtRiskPasswords": { + "message": "Rivedi parole d'accesso a rischio" + }, + "reviewAtRiskLoginsSlideDesc": { + "message": "Le parole d'accesso dell'organizzazione sono a rischio perché sono deboli, riutilizzate, e/o esposte.", + "description": "Description of the review at-risk login slide on the at-risk password page carousel" + }, + "reviewAtRiskLoginSlideImgAlt": { + "message": "Illustrazione di un elenco di accessi a rischio" + }, + "generatePasswordSlideDesc": { + "message": "Genera rapidamente una parola d'accesso forte e unica con il menu' di riempimento automatico Bitwarden nel sito a rischio.", + "description": "Description of the generate password slide on the at-risk password page carousel" + }, + "generatePasswordSlideImgAlt": { + "message": "Illustrazione del menu' di riempimento automatico Bitwarden che mostra una parola d'accesso generata" + }, + "updateInBitwarden": { + "message": "Aggiorna in Bitwarden" + }, + "updateInBitwardenSlideDesc": { + "message": "Bitwarden ti chiederà quindi di aggiornare la parola d'accesso nel gestore di parole d'accesso.", + "description": "Description of the update in Bitwarden slide on the at-risk password page carousel" + }, + "updateInBitwardenSlideImgAlt": { + "message": "Illustrazione di una notifica Bitwarden che richiede all'utente di aggiornare l'accesso" + }, "turnOnAutofill": { "message": "Attiva riempimento automatico" }, @@ -4181,6 +4275,20 @@ } } }, + "copyFieldValue": { + "message": "Copia $FIELD$, $VALUE$", + "description": "Title for a button that copies a field value to the clipboard.", + "placeholders": { + "field": { + "content": "$1", + "example": "Username" + }, + "value": { + "content": "$2", + "example": "Foo" + } + } + }, "noValuesToCopy": { "message": "Nessun valore da copiare" }, diff --git a/apps/browser/src/_locales/ja/messages.json b/apps/browser/src/_locales/ja/messages.json index 2a0c926118a..34a91f6e74d 100644 --- a/apps/browser/src/_locales/ja/messages.json +++ b/apps/browser/src/_locales/ja/messages.json @@ -80,6 +80,15 @@ "masterPassHint": { "message": "マスターパスワードのヒント (省略可能)" }, + "passwordStrengthScore": { + "message": "Password strength score $SCORE$", + "placeholders": { + "score": { + "content": "$1", + "example": "4" + } + } + }, "joinOrganization": { "message": "組織に参加" }, @@ -876,6 +885,21 @@ "logInToBitwarden": { "message": "Bitwarden にログイン" }, + "enterTheCodeSentToYourEmail": { + "message": "Enter the code sent to your email" + }, + "enterTheCodeFromYourAuthenticatorApp": { + "message": "Enter the code from your authenticator app" + }, + "pressYourYubiKeyToAuthenticate": { + "message": "Press your YubiKey to authenticate" + }, + "duoTwoFactorRequiredPageSubtitle": { + "message": "Duo two-step login is required for your account. Follow the steps below to finish logging in." + }, + "followTheStepsBelowToFinishLoggingIn": { + "message": "Follow the steps below to finish logging in." + }, "restartRegistration": { "message": "登録を再度始める" }, @@ -1365,12 +1389,22 @@ "rememberMe": { "message": "情報を保存する" }, + "dontAskAgainOnThisDeviceFor30Days": { + "message": "Don't ask again on this device for 30 days" + }, "sendVerificationCodeEmailAgain": { "message": "確認コードをメールで再送" }, "useAnotherTwoStepMethod": { "message": "他の2段階認証方法を使用" }, + "selectAnotherMethod": { + "message": "Select another method", + "description": "Select another two-step login method" + }, + "useYourRecoveryCode": { + "message": "Use your recovery code" + }, "insertYubiKey": { "message": " YubiKey を USB ポートに挿入し、ボタンをタッチしてください。" }, @@ -1383,9 +1417,18 @@ "webAuthnNewTabOpen": { "message": "新しいタブを開く" }, + "openInNewTab": { + "message": "Open in new tab" + }, "webAuthnAuthenticate": { "message": "WebAuthn の認証" }, + "readSecurityKey": { + "message": "Read security key" + }, + "awaitingSecurityKeyInteraction": { + "message": "Awaiting security key interaction..." + }, "loginUnavailable": { "message": "ログインできません。" }, @@ -1398,6 +1441,9 @@ "twoStepOptions": { "message": "2段階認証オプション" }, + "selectTwoStepLoginMethod": { + "message": "Select two-step login method" + }, "recoveryCodeDesc": { "message": "すべての2段階認証プロパイダにアクセスできなくなったときは、リカバリーコードを使用するとアカウントの2段階認証を無効化できます。" }, @@ -2097,6 +2143,15 @@ "vaultTimeoutAction1": { "message": "タイムアウト時のアクション" }, + "newCustomizationOptionsCalloutTitle": { + "message": "New customization options" + }, + "newCustomizationOptionsCalloutContent": { + "message": "Customize your vault experience with quick copy actions, compact mode, and more!" + }, + "newCustomizationOptionsCalloutLink": { + "message": "View all Appearance settings" + }, "lock": { "message": "ロック", "description": "Verb form: to make secure or inaccessible by" @@ -2391,8 +2446,17 @@ "atRiskPasswords": { "message": "At-risk passwords" }, - "atRiskPasswordsDescSingleOrg": { - "message": "$ORGANIZATION$ is requesting you change the $COUNT$ passwords because they are at risk.", + "atRiskPasswordDescSingleOrg": { + "message": "$ORGANIZATION$ is requesting you change one password because it is at-risk.", + "placeholders": { + "organization": { + "content": "$1", + "example": "Acme Corp" + } + } + }, + "atRiskPasswordsDescSingleOrgPlural": { + "message": "$ORGANIZATION$ is requesting you change the $COUNT$ passwords because they are at-risk.", "placeholders": { "organization": { "content": "$1", @@ -2404,8 +2468,8 @@ } } }, - "atRiskPasswordsDescMultiOrg": { - "message": "Your organizations are requesting you change the $COUNT$ passwords because they are at risk.", + "atRiskPasswordsDescMultiOrgPlural": { + "message": "Your organizations are requesting you change the $COUNT$ passwords because they are at-risk.", "placeholders": { "count": { "content": "$1", @@ -2431,6 +2495,36 @@ "changeAtRiskPasswordsFasterDesc": { "message": "Update your settings so you can quickly autofill your passwords and generate new ones" }, + "reviewAtRiskLogins": { + "message": "Review at-risk logins" + }, + "reviewAtRiskPasswords": { + "message": "Review at-risk passwords" + }, + "reviewAtRiskLoginsSlideDesc": { + "message": "Your organization passwords are at-risk because they are weak, reused, and/or exposed.", + "description": "Description of the review at-risk login slide on the at-risk password page carousel" + }, + "reviewAtRiskLoginSlideImgAlt": { + "message": "Illustration of a list of logins that are at-risk" + }, + "generatePasswordSlideDesc": { + "message": "Quickly generate a strong, unique password with the Bitwarden autofill menu on the at-risk site.", + "description": "Description of the generate password slide on the at-risk password page carousel" + }, + "generatePasswordSlideImgAlt": { + "message": "Illustration of the Bitwarden autofill menu displaying a generated password" + }, + "updateInBitwarden": { + "message": "Update in Bitwarden" + }, + "updateInBitwardenSlideDesc": { + "message": "Bitwarden will then prompt you to update the password in the password manager.", + "description": "Description of the update in Bitwarden slide on the at-risk password page carousel" + }, + "updateInBitwardenSlideImgAlt": { + "message": "Illustration of a Bitwarden’s notification prompting the user to update the login" + }, "turnOnAutofill": { "message": "Turn on autofill" }, @@ -4181,6 +4275,20 @@ } } }, + "copyFieldValue": { + "message": "Copy $FIELD$, $VALUE$", + "description": "Title for a button that copies a field value to the clipboard.", + "placeholders": { + "field": { + "content": "$1", + "example": "Username" + }, + "value": { + "content": "$2", + "example": "Foo" + } + } + }, "noValuesToCopy": { "message": "コピーする値がありません" }, diff --git a/apps/browser/src/_locales/ka/messages.json b/apps/browser/src/_locales/ka/messages.json index 92f0d2c5416..2a066ebe1f2 100644 --- a/apps/browser/src/_locales/ka/messages.json +++ b/apps/browser/src/_locales/ka/messages.json @@ -80,6 +80,15 @@ "masterPassHint": { "message": "Master password hint (optional)" }, + "passwordStrengthScore": { + "message": "Password strength score $SCORE$", + "placeholders": { + "score": { + "content": "$1", + "example": "4" + } + } + }, "joinOrganization": { "message": "Join organization" }, @@ -876,6 +885,21 @@ "logInToBitwarden": { "message": "Log in to Bitwarden" }, + "enterTheCodeSentToYourEmail": { + "message": "Enter the code sent to your email" + }, + "enterTheCodeFromYourAuthenticatorApp": { + "message": "Enter the code from your authenticator app" + }, + "pressYourYubiKeyToAuthenticate": { + "message": "Press your YubiKey to authenticate" + }, + "duoTwoFactorRequiredPageSubtitle": { + "message": "Duo two-step login is required for your account. Follow the steps below to finish logging in." + }, + "followTheStepsBelowToFinishLoggingIn": { + "message": "Follow the steps below to finish logging in." + }, "restartRegistration": { "message": "Restart registration" }, @@ -1365,12 +1389,22 @@ "rememberMe": { "message": "დამიმახსოვრე" }, + "dontAskAgainOnThisDeviceFor30Days": { + "message": "Don't ask again on this device for 30 days" + }, "sendVerificationCodeEmailAgain": { "message": "Send verification code email again" }, "useAnotherTwoStepMethod": { "message": "Use another two-step login method" }, + "selectAnotherMethod": { + "message": "Select another method", + "description": "Select another two-step login method" + }, + "useYourRecoveryCode": { + "message": "Use your recovery code" + }, "insertYubiKey": { "message": "Insert your YubiKey into your computer's USB port, then touch its button." }, @@ -1383,9 +1417,18 @@ "webAuthnNewTabOpen": { "message": "ახალი ჩანართის გახსნა" }, + "openInNewTab": { + "message": "Open in new tab" + }, "webAuthnAuthenticate": { "message": "Authenticate WebAuthn" }, + "readSecurityKey": { + "message": "Read security key" + }, + "awaitingSecurityKeyInteraction": { + "message": "Awaiting security key interaction..." + }, "loginUnavailable": { "message": "Login unavailable" }, @@ -1398,6 +1441,9 @@ "twoStepOptions": { "message": "Two-step login options" }, + "selectTwoStepLoginMethod": { + "message": "Select two-step login method" + }, "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." }, @@ -2097,6 +2143,15 @@ "vaultTimeoutAction1": { "message": "Timeout action" }, + "newCustomizationOptionsCalloutTitle": { + "message": "New customization options" + }, + "newCustomizationOptionsCalloutContent": { + "message": "Customize your vault experience with quick copy actions, compact mode, and more!" + }, + "newCustomizationOptionsCalloutLink": { + "message": "View all Appearance settings" + }, "lock": { "message": "ჩაკეტვა", "description": "Verb form: to make secure or inaccessible by" @@ -2391,8 +2446,17 @@ "atRiskPasswords": { "message": "At-risk passwords" }, - "atRiskPasswordsDescSingleOrg": { - "message": "$ORGANIZATION$ is requesting you change the $COUNT$ passwords because they are at risk.", + "atRiskPasswordDescSingleOrg": { + "message": "$ORGANIZATION$ is requesting you change one password because it is at-risk.", + "placeholders": { + "organization": { + "content": "$1", + "example": "Acme Corp" + } + } + }, + "atRiskPasswordsDescSingleOrgPlural": { + "message": "$ORGANIZATION$ is requesting you change the $COUNT$ passwords because they are at-risk.", "placeholders": { "organization": { "content": "$1", @@ -2404,8 +2468,8 @@ } } }, - "atRiskPasswordsDescMultiOrg": { - "message": "Your organizations are requesting you change the $COUNT$ passwords because they are at risk.", + "atRiskPasswordsDescMultiOrgPlural": { + "message": "Your organizations are requesting you change the $COUNT$ passwords because they are at-risk.", "placeholders": { "count": { "content": "$1", @@ -2431,6 +2495,36 @@ "changeAtRiskPasswordsFasterDesc": { "message": "Update your settings so you can quickly autofill your passwords and generate new ones" }, + "reviewAtRiskLogins": { + "message": "Review at-risk logins" + }, + "reviewAtRiskPasswords": { + "message": "Review at-risk passwords" + }, + "reviewAtRiskLoginsSlideDesc": { + "message": "Your organization passwords are at-risk because they are weak, reused, and/or exposed.", + "description": "Description of the review at-risk login slide on the at-risk password page carousel" + }, + "reviewAtRiskLoginSlideImgAlt": { + "message": "Illustration of a list of logins that are at-risk" + }, + "generatePasswordSlideDesc": { + "message": "Quickly generate a strong, unique password with the Bitwarden autofill menu on the at-risk site.", + "description": "Description of the generate password slide on the at-risk password page carousel" + }, + "generatePasswordSlideImgAlt": { + "message": "Illustration of the Bitwarden autofill menu displaying a generated password" + }, + "updateInBitwarden": { + "message": "Update in Bitwarden" + }, + "updateInBitwardenSlideDesc": { + "message": "Bitwarden will then prompt you to update the password in the password manager.", + "description": "Description of the update in Bitwarden slide on the at-risk password page carousel" + }, + "updateInBitwardenSlideImgAlt": { + "message": "Illustration of a Bitwarden’s notification prompting the user to update the login" + }, "turnOnAutofill": { "message": "Turn on autofill" }, @@ -4181,6 +4275,20 @@ } } }, + "copyFieldValue": { + "message": "Copy $FIELD$, $VALUE$", + "description": "Title for a button that copies a field value to the clipboard.", + "placeholders": { + "field": { + "content": "$1", + "example": "Username" + }, + "value": { + "content": "$2", + "example": "Foo" + } + } + }, "noValuesToCopy": { "message": "No values to copy" }, diff --git a/apps/browser/src/_locales/km/messages.json b/apps/browser/src/_locales/km/messages.json index 9fe497bc1c7..41ca7e5dcd2 100644 --- a/apps/browser/src/_locales/km/messages.json +++ b/apps/browser/src/_locales/km/messages.json @@ -80,6 +80,15 @@ "masterPassHint": { "message": "Master password hint (optional)" }, + "passwordStrengthScore": { + "message": "Password strength score $SCORE$", + "placeholders": { + "score": { + "content": "$1", + "example": "4" + } + } + }, "joinOrganization": { "message": "Join organization" }, @@ -876,6 +885,21 @@ "logInToBitwarden": { "message": "Log in to Bitwarden" }, + "enterTheCodeSentToYourEmail": { + "message": "Enter the code sent to your email" + }, + "enterTheCodeFromYourAuthenticatorApp": { + "message": "Enter the code from your authenticator app" + }, + "pressYourYubiKeyToAuthenticate": { + "message": "Press your YubiKey to authenticate" + }, + "duoTwoFactorRequiredPageSubtitle": { + "message": "Duo two-step login is required for your account. Follow the steps below to finish logging in." + }, + "followTheStepsBelowToFinishLoggingIn": { + "message": "Follow the steps below to finish logging in." + }, "restartRegistration": { "message": "Restart registration" }, @@ -1365,12 +1389,22 @@ "rememberMe": { "message": "Remember me" }, + "dontAskAgainOnThisDeviceFor30Days": { + "message": "Don't ask again on this device for 30 days" + }, "sendVerificationCodeEmailAgain": { "message": "Send verification code email again" }, "useAnotherTwoStepMethod": { "message": "Use another two-step login method" }, + "selectAnotherMethod": { + "message": "Select another method", + "description": "Select another two-step login method" + }, + "useYourRecoveryCode": { + "message": "Use your recovery code" + }, "insertYubiKey": { "message": "Insert your YubiKey into your computer's USB port, then touch its button." }, @@ -1383,9 +1417,18 @@ "webAuthnNewTabOpen": { "message": "Open new tab" }, + "openInNewTab": { + "message": "Open in new tab" + }, "webAuthnAuthenticate": { "message": "Authenticate WebAuthn" }, + "readSecurityKey": { + "message": "Read security key" + }, + "awaitingSecurityKeyInteraction": { + "message": "Awaiting security key interaction..." + }, "loginUnavailable": { "message": "Login unavailable" }, @@ -1398,6 +1441,9 @@ "twoStepOptions": { "message": "Two-step login options" }, + "selectTwoStepLoginMethod": { + "message": "Select two-step login method" + }, "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." }, @@ -2097,6 +2143,15 @@ "vaultTimeoutAction1": { "message": "Timeout action" }, + "newCustomizationOptionsCalloutTitle": { + "message": "New customization options" + }, + "newCustomizationOptionsCalloutContent": { + "message": "Customize your vault experience with quick copy actions, compact mode, and more!" + }, + "newCustomizationOptionsCalloutLink": { + "message": "View all Appearance settings" + }, "lock": { "message": "Lock", "description": "Verb form: to make secure or inaccessible by" @@ -2391,8 +2446,17 @@ "atRiskPasswords": { "message": "At-risk passwords" }, - "atRiskPasswordsDescSingleOrg": { - "message": "$ORGANIZATION$ is requesting you change the $COUNT$ passwords because they are at risk.", + "atRiskPasswordDescSingleOrg": { + "message": "$ORGANIZATION$ is requesting you change one password because it is at-risk.", + "placeholders": { + "organization": { + "content": "$1", + "example": "Acme Corp" + } + } + }, + "atRiskPasswordsDescSingleOrgPlural": { + "message": "$ORGANIZATION$ is requesting you change the $COUNT$ passwords because they are at-risk.", "placeholders": { "organization": { "content": "$1", @@ -2404,8 +2468,8 @@ } } }, - "atRiskPasswordsDescMultiOrg": { - "message": "Your organizations are requesting you change the $COUNT$ passwords because they are at risk.", + "atRiskPasswordsDescMultiOrgPlural": { + "message": "Your organizations are requesting you change the $COUNT$ passwords because they are at-risk.", "placeholders": { "count": { "content": "$1", @@ -2431,6 +2495,36 @@ "changeAtRiskPasswordsFasterDesc": { "message": "Update your settings so you can quickly autofill your passwords and generate new ones" }, + "reviewAtRiskLogins": { + "message": "Review at-risk logins" + }, + "reviewAtRiskPasswords": { + "message": "Review at-risk passwords" + }, + "reviewAtRiskLoginsSlideDesc": { + "message": "Your organization passwords are at-risk because they are weak, reused, and/or exposed.", + "description": "Description of the review at-risk login slide on the at-risk password page carousel" + }, + "reviewAtRiskLoginSlideImgAlt": { + "message": "Illustration of a list of logins that are at-risk" + }, + "generatePasswordSlideDesc": { + "message": "Quickly generate a strong, unique password with the Bitwarden autofill menu on the at-risk site.", + "description": "Description of the generate password slide on the at-risk password page carousel" + }, + "generatePasswordSlideImgAlt": { + "message": "Illustration of the Bitwarden autofill menu displaying a generated password" + }, + "updateInBitwarden": { + "message": "Update in Bitwarden" + }, + "updateInBitwardenSlideDesc": { + "message": "Bitwarden will then prompt you to update the password in the password manager.", + "description": "Description of the update in Bitwarden slide on the at-risk password page carousel" + }, + "updateInBitwardenSlideImgAlt": { + "message": "Illustration of a Bitwarden’s notification prompting the user to update the login" + }, "turnOnAutofill": { "message": "Turn on autofill" }, @@ -4181,6 +4275,20 @@ } } }, + "copyFieldValue": { + "message": "Copy $FIELD$, $VALUE$", + "description": "Title for a button that copies a field value to the clipboard.", + "placeholders": { + "field": { + "content": "$1", + "example": "Username" + }, + "value": { + "content": "$2", + "example": "Foo" + } + } + }, "noValuesToCopy": { "message": "No values to copy" }, diff --git a/apps/browser/src/_locales/kn/messages.json b/apps/browser/src/_locales/kn/messages.json index af436923b14..b9f37778020 100644 --- a/apps/browser/src/_locales/kn/messages.json +++ b/apps/browser/src/_locales/kn/messages.json @@ -80,6 +80,15 @@ "masterPassHint": { "message": "ಮಾಸ್ಟರ್ ಪಾಸ್ವರ್ಡ್ ಸುಳಿವು (ಐಚ್ಛಿಕ)" }, + "passwordStrengthScore": { + "message": "Password strength score $SCORE$", + "placeholders": { + "score": { + "content": "$1", + "example": "4" + } + } + }, "joinOrganization": { "message": "Join organization" }, @@ -876,6 +885,21 @@ "logInToBitwarden": { "message": "Log in to Bitwarden" }, + "enterTheCodeSentToYourEmail": { + "message": "Enter the code sent to your email" + }, + "enterTheCodeFromYourAuthenticatorApp": { + "message": "Enter the code from your authenticator app" + }, + "pressYourYubiKeyToAuthenticate": { + "message": "Press your YubiKey to authenticate" + }, + "duoTwoFactorRequiredPageSubtitle": { + "message": "Duo two-step login is required for your account. Follow the steps below to finish logging in." + }, + "followTheStepsBelowToFinishLoggingIn": { + "message": "Follow the steps below to finish logging in." + }, "restartRegistration": { "message": "Restart registration" }, @@ -1365,12 +1389,22 @@ "rememberMe": { "message": "ನನ್ನನ್ನು ನೆನಪಿನಲ್ಲಿ ಇಡು" }, + "dontAskAgainOnThisDeviceFor30Days": { + "message": "Don't ask again on this device for 30 days" + }, "sendVerificationCodeEmailAgain": { "message": "ಪರಿಶೀಲನೆ ಕೋಡ್ ಇಮೇಲ್ ಅನ್ನು ಮತ್ತೆ ಕಳುಹಿಸಿ" }, "useAnotherTwoStepMethod": { "message": "ಮತ್ತೊಂದು ಎರಡು-ಹಂತದ ಲಾಗಿನ್ ವಿಧಾನವನ್ನು ಬಳಸಿ" }, + "selectAnotherMethod": { + "message": "Select another method", + "description": "Select another two-step login method" + }, + "useYourRecoveryCode": { + "message": "Use your recovery code" + }, "insertYubiKey": { "message": "ನಿಮ್ಮ ಯುಬಿಕಿಯನ್ನು ನಿಮ್ಮ ಕಂಪ್ಯೂಟರ್‌ನ ಯುಎಸ್‌ಬಿ ಪೋರ್ಟ್ಗೆ ಸೇರಿಸಿ, ನಂತರ ಅದರ ಗುಂಡಿಯನ್ನು ಸ್ಪರ್ಶಿಸಿ." }, @@ -1383,9 +1417,18 @@ "webAuthnNewTabOpen": { "message": "ಹೊಸ ಟ್ಯಾಬ್ ತೆರೆಯಿರಿ" }, + "openInNewTab": { + "message": "Open in new tab" + }, "webAuthnAuthenticate": { "message": "WebAuthn ಅನ್ನು ಪ್ರಮಾಣಿಕರಿಸು" }, + "readSecurityKey": { + "message": "Read security key" + }, + "awaitingSecurityKeyInteraction": { + "message": "Awaiting security key interaction..." + }, "loginUnavailable": { "message": "ಲಾಗಿನ್ ಲಭ್ಯವಿಲ್ಲ" }, @@ -1398,6 +1441,9 @@ "twoStepOptions": { "message": "ಎರಡು ಹಂತದ ಲಾಗಿನ್ ಆಯ್ಕೆಗಳು" }, + "selectTwoStepLoginMethod": { + "message": "Select two-step login method" + }, "recoveryCodeDesc": { "message": "ನಿಮ್ಮ ಎಲ್ಲಾ ಎರಡು ಅಂಶ ಪೂರೈಕೆದಾರರಿಗೆ ಪ್ರವೇಶವನ್ನು ಕಳೆದುಕೊಂಡಿದ್ದೀರಾ? ನಿಮ್ಮ ಖಾತೆಯಿಂದ ಎಲ್ಲಾ ಎರಡು ಅಂಶ ಪೂರೈಕೆದಾರರನ್ನು ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಲು ನಿಮ್ಮ ಮರುಪಡೆಯುವಿಕೆ ಕೋಡ್ ಬಳಸಿ." }, @@ -2097,6 +2143,15 @@ "vaultTimeoutAction1": { "message": "Timeout action" }, + "newCustomizationOptionsCalloutTitle": { + "message": "New customization options" + }, + "newCustomizationOptionsCalloutContent": { + "message": "Customize your vault experience with quick copy actions, compact mode, and more!" + }, + "newCustomizationOptionsCalloutLink": { + "message": "View all Appearance settings" + }, "lock": { "message": "ಲಾಕ್‌", "description": "Verb form: to make secure or inaccessible by" @@ -2391,8 +2446,17 @@ "atRiskPasswords": { "message": "At-risk passwords" }, - "atRiskPasswordsDescSingleOrg": { - "message": "$ORGANIZATION$ is requesting you change the $COUNT$ passwords because they are at risk.", + "atRiskPasswordDescSingleOrg": { + "message": "$ORGANIZATION$ is requesting you change one password because it is at-risk.", + "placeholders": { + "organization": { + "content": "$1", + "example": "Acme Corp" + } + } + }, + "atRiskPasswordsDescSingleOrgPlural": { + "message": "$ORGANIZATION$ is requesting you change the $COUNT$ passwords because they are at-risk.", "placeholders": { "organization": { "content": "$1", @@ -2404,8 +2468,8 @@ } } }, - "atRiskPasswordsDescMultiOrg": { - "message": "Your organizations are requesting you change the $COUNT$ passwords because they are at risk.", + "atRiskPasswordsDescMultiOrgPlural": { + "message": "Your organizations are requesting you change the $COUNT$ passwords because they are at-risk.", "placeholders": { "count": { "content": "$1", @@ -2431,6 +2495,36 @@ "changeAtRiskPasswordsFasterDesc": { "message": "Update your settings so you can quickly autofill your passwords and generate new ones" }, + "reviewAtRiskLogins": { + "message": "Review at-risk logins" + }, + "reviewAtRiskPasswords": { + "message": "Review at-risk passwords" + }, + "reviewAtRiskLoginsSlideDesc": { + "message": "Your organization passwords are at-risk because they are weak, reused, and/or exposed.", + "description": "Description of the review at-risk login slide on the at-risk password page carousel" + }, + "reviewAtRiskLoginSlideImgAlt": { + "message": "Illustration of a list of logins that are at-risk" + }, + "generatePasswordSlideDesc": { + "message": "Quickly generate a strong, unique password with the Bitwarden autofill menu on the at-risk site.", + "description": "Description of the generate password slide on the at-risk password page carousel" + }, + "generatePasswordSlideImgAlt": { + "message": "Illustration of the Bitwarden autofill menu displaying a generated password" + }, + "updateInBitwarden": { + "message": "Update in Bitwarden" + }, + "updateInBitwardenSlideDesc": { + "message": "Bitwarden will then prompt you to update the password in the password manager.", + "description": "Description of the update in Bitwarden slide on the at-risk password page carousel" + }, + "updateInBitwardenSlideImgAlt": { + "message": "Illustration of a Bitwarden’s notification prompting the user to update the login" + }, "turnOnAutofill": { "message": "Turn on autofill" }, @@ -4181,6 +4275,20 @@ } } }, + "copyFieldValue": { + "message": "Copy $FIELD$, $VALUE$", + "description": "Title for a button that copies a field value to the clipboard.", + "placeholders": { + "field": { + "content": "$1", + "example": "Username" + }, + "value": { + "content": "$2", + "example": "Foo" + } + } + }, "noValuesToCopy": { "message": "No values to copy" }, diff --git a/apps/browser/src/_locales/ko/messages.json b/apps/browser/src/_locales/ko/messages.json index 7c484651f5a..b607fa3910b 100644 --- a/apps/browser/src/_locales/ko/messages.json +++ b/apps/browser/src/_locales/ko/messages.json @@ -80,6 +80,15 @@ "masterPassHint": { "message": "마스터 비밀번호 힌트 (선택)" }, + "passwordStrengthScore": { + "message": "Password strength score $SCORE$", + "placeholders": { + "score": { + "content": "$1", + "example": "4" + } + } + }, "joinOrganization": { "message": "\"조직\"에 가입하기" }, @@ -876,6 +885,21 @@ "logInToBitwarden": { "message": "Bitwarden에 로그인" }, + "enterTheCodeSentToYourEmail": { + "message": "Enter the code sent to your email" + }, + "enterTheCodeFromYourAuthenticatorApp": { + "message": "Enter the code from your authenticator app" + }, + "pressYourYubiKeyToAuthenticate": { + "message": "Press your YubiKey to authenticate" + }, + "duoTwoFactorRequiredPageSubtitle": { + "message": "Duo two-step login is required for your account. Follow the steps below to finish logging in." + }, + "followTheStepsBelowToFinishLoggingIn": { + "message": "Follow the steps below to finish logging in." + }, "restartRegistration": { "message": "등록 재시작" }, @@ -1365,12 +1389,22 @@ "rememberMe": { "message": "기억하기" }, + "dontAskAgainOnThisDeviceFor30Days": { + "message": "Don't ask again on this device for 30 days" + }, "sendVerificationCodeEmailAgain": { "message": "인증 코드 이메일 다시 보내기" }, "useAnotherTwoStepMethod": { "message": "다른 2단계 인증 사용" }, + "selectAnotherMethod": { + "message": "Select another method", + "description": "Select another two-step login method" + }, + "useYourRecoveryCode": { + "message": "Use your recovery code" + }, "insertYubiKey": { "message": "YubiKey를 컴퓨터의 USB 포트에 삽입하고 이 버튼을 누르세요." }, @@ -1383,9 +1417,18 @@ "webAuthnNewTabOpen": { "message": "새 탭 열기" }, + "openInNewTab": { + "message": "Open in new tab" + }, "webAuthnAuthenticate": { "message": "WebAuthn 인증" }, + "readSecurityKey": { + "message": "Read security key" + }, + "awaitingSecurityKeyInteraction": { + "message": "Awaiting security key interaction..." + }, "loginUnavailable": { "message": "로그인 불가능" }, @@ -1398,6 +1441,9 @@ "twoStepOptions": { "message": "2단계 인증 옵션" }, + "selectTwoStepLoginMethod": { + "message": "Select two-step login method" + }, "recoveryCodeDesc": { "message": "모든 2단계 인증을 사용할 수 없는 상황인가요? 복구 코드를 사용하여 계정의 모든 2단계 인증을 비활성화할 수 있습니다." }, @@ -2097,6 +2143,15 @@ "vaultTimeoutAction1": { "message": "시간초과 시 행동" }, + "newCustomizationOptionsCalloutTitle": { + "message": "New customization options" + }, + "newCustomizationOptionsCalloutContent": { + "message": "Customize your vault experience with quick copy actions, compact mode, and more!" + }, + "newCustomizationOptionsCalloutLink": { + "message": "View all Appearance settings" + }, "lock": { "message": "잠금", "description": "Verb form: to make secure or inaccessible by" @@ -2391,8 +2446,17 @@ "atRiskPasswords": { "message": "At-risk passwords" }, - "atRiskPasswordsDescSingleOrg": { - "message": "$ORGANIZATION$ is requesting you change the $COUNT$ passwords because they are at risk.", + "atRiskPasswordDescSingleOrg": { + "message": "$ORGANIZATION$ is requesting you change one password because it is at-risk.", + "placeholders": { + "organization": { + "content": "$1", + "example": "Acme Corp" + } + } + }, + "atRiskPasswordsDescSingleOrgPlural": { + "message": "$ORGANIZATION$ is requesting you change the $COUNT$ passwords because they are at-risk.", "placeholders": { "organization": { "content": "$1", @@ -2404,8 +2468,8 @@ } } }, - "atRiskPasswordsDescMultiOrg": { - "message": "Your organizations are requesting you change the $COUNT$ passwords because they are at risk.", + "atRiskPasswordsDescMultiOrgPlural": { + "message": "Your organizations are requesting you change the $COUNT$ passwords because they are at-risk.", "placeholders": { "count": { "content": "$1", @@ -2431,6 +2495,36 @@ "changeAtRiskPasswordsFasterDesc": { "message": "Update your settings so you can quickly autofill your passwords and generate new ones" }, + "reviewAtRiskLogins": { + "message": "Review at-risk logins" + }, + "reviewAtRiskPasswords": { + "message": "Review at-risk passwords" + }, + "reviewAtRiskLoginsSlideDesc": { + "message": "Your organization passwords are at-risk because they are weak, reused, and/or exposed.", + "description": "Description of the review at-risk login slide on the at-risk password page carousel" + }, + "reviewAtRiskLoginSlideImgAlt": { + "message": "Illustration of a list of logins that are at-risk" + }, + "generatePasswordSlideDesc": { + "message": "Quickly generate a strong, unique password with the Bitwarden autofill menu on the at-risk site.", + "description": "Description of the generate password slide on the at-risk password page carousel" + }, + "generatePasswordSlideImgAlt": { + "message": "Illustration of the Bitwarden autofill menu displaying a generated password" + }, + "updateInBitwarden": { + "message": "Update in Bitwarden" + }, + "updateInBitwardenSlideDesc": { + "message": "Bitwarden will then prompt you to update the password in the password manager.", + "description": "Description of the update in Bitwarden slide on the at-risk password page carousel" + }, + "updateInBitwardenSlideImgAlt": { + "message": "Illustration of a Bitwarden’s notification prompting the user to update the login" + }, "turnOnAutofill": { "message": "Turn on autofill" }, @@ -4181,6 +4275,20 @@ } } }, + "copyFieldValue": { + "message": "Copy $FIELD$, $VALUE$", + "description": "Title for a button that copies a field value to the clipboard.", + "placeholders": { + "field": { + "content": "$1", + "example": "Username" + }, + "value": { + "content": "$2", + "example": "Foo" + } + } + }, "noValuesToCopy": { "message": "복사할 값이 없습니다" }, diff --git a/apps/browser/src/_locales/lt/messages.json b/apps/browser/src/_locales/lt/messages.json index 58814072686..f3313844eab 100644 --- a/apps/browser/src/_locales/lt/messages.json +++ b/apps/browser/src/_locales/lt/messages.json @@ -80,6 +80,15 @@ "masterPassHint": { "message": "Pagrindinio slaptažodžio užuomina (neprivaloma)" }, + "passwordStrengthScore": { + "message": "Password strength score $SCORE$", + "placeholders": { + "score": { + "content": "$1", + "example": "4" + } + } + }, "joinOrganization": { "message": "Join organization" }, @@ -876,6 +885,21 @@ "logInToBitwarden": { "message": "Log in to Bitwarden" }, + "enterTheCodeSentToYourEmail": { + "message": "Enter the code sent to your email" + }, + "enterTheCodeFromYourAuthenticatorApp": { + "message": "Enter the code from your authenticator app" + }, + "pressYourYubiKeyToAuthenticate": { + "message": "Press your YubiKey to authenticate" + }, + "duoTwoFactorRequiredPageSubtitle": { + "message": "Duo two-step login is required for your account. Follow the steps below to finish logging in." + }, + "followTheStepsBelowToFinishLoggingIn": { + "message": "Follow the steps below to finish logging in." + }, "restartRegistration": { "message": "Restart registration" }, @@ -1365,12 +1389,22 @@ "rememberMe": { "message": "Prisiminti mane" }, + "dontAskAgainOnThisDeviceFor30Days": { + "message": "Don't ask again on this device for 30 days" + }, "sendVerificationCodeEmailAgain": { "message": "Pakartotinai atsiųsti patvirtinimo koda el. paštu" }, "useAnotherTwoStepMethod": { "message": "Naudoti dar vieną dviejų žingsnių prisijungimo metodą" }, + "selectAnotherMethod": { + "message": "Select another method", + "description": "Select another two-step login method" + }, + "useYourRecoveryCode": { + "message": "Use your recovery code" + }, "insertYubiKey": { "message": "Įkišk YubiKey į savo kompiuterio USB prievadą, tada paliesk jo mygtuką." }, @@ -1383,9 +1417,18 @@ "webAuthnNewTabOpen": { "message": "Atidaryti naują skirtuką" }, + "openInNewTab": { + "message": "Open in new tab" + }, "webAuthnAuthenticate": { "message": "Autentifikuoti WebAuthn" }, + "readSecurityKey": { + "message": "Read security key" + }, + "awaitingSecurityKeyInteraction": { + "message": "Awaiting security key interaction..." + }, "loginUnavailable": { "message": "Prisijungimas nepasiekiamas" }, @@ -1398,6 +1441,9 @@ "twoStepOptions": { "message": "Dviejų žingsnių prisijungimo parinktys" }, + "selectTwoStepLoginMethod": { + "message": "Select two-step login method" + }, "recoveryCodeDesc": { "message": "Praradai prieigą prie visų savo dviejų veiksnių teikėjų? Naudok atkūrimo kodą, kad iš savo paskyros išjungtum visus dviejų veiksnių teikėjus." }, @@ -2097,6 +2143,15 @@ "vaultTimeoutAction1": { "message": "Timeout action" }, + "newCustomizationOptionsCalloutTitle": { + "message": "New customization options" + }, + "newCustomizationOptionsCalloutContent": { + "message": "Customize your vault experience with quick copy actions, compact mode, and more!" + }, + "newCustomizationOptionsCalloutLink": { + "message": "View all Appearance settings" + }, "lock": { "message": "Užrakinti", "description": "Verb form: to make secure or inaccessible by" @@ -2391,8 +2446,17 @@ "atRiskPasswords": { "message": "At-risk passwords" }, - "atRiskPasswordsDescSingleOrg": { - "message": "$ORGANIZATION$ is requesting you change the $COUNT$ passwords because they are at risk.", + "atRiskPasswordDescSingleOrg": { + "message": "$ORGANIZATION$ is requesting you change one password because it is at-risk.", + "placeholders": { + "organization": { + "content": "$1", + "example": "Acme Corp" + } + } + }, + "atRiskPasswordsDescSingleOrgPlural": { + "message": "$ORGANIZATION$ is requesting you change the $COUNT$ passwords because they are at-risk.", "placeholders": { "organization": { "content": "$1", @@ -2404,8 +2468,8 @@ } } }, - "atRiskPasswordsDescMultiOrg": { - "message": "Your organizations are requesting you change the $COUNT$ passwords because they are at risk.", + "atRiskPasswordsDescMultiOrgPlural": { + "message": "Your organizations are requesting you change the $COUNT$ passwords because they are at-risk.", "placeholders": { "count": { "content": "$1", @@ -2431,6 +2495,36 @@ "changeAtRiskPasswordsFasterDesc": { "message": "Update your settings so you can quickly autofill your passwords and generate new ones" }, + "reviewAtRiskLogins": { + "message": "Review at-risk logins" + }, + "reviewAtRiskPasswords": { + "message": "Review at-risk passwords" + }, + "reviewAtRiskLoginsSlideDesc": { + "message": "Your organization passwords are at-risk because they are weak, reused, and/or exposed.", + "description": "Description of the review at-risk login slide on the at-risk password page carousel" + }, + "reviewAtRiskLoginSlideImgAlt": { + "message": "Illustration of a list of logins that are at-risk" + }, + "generatePasswordSlideDesc": { + "message": "Quickly generate a strong, unique password with the Bitwarden autofill menu on the at-risk site.", + "description": "Description of the generate password slide on the at-risk password page carousel" + }, + "generatePasswordSlideImgAlt": { + "message": "Illustration of the Bitwarden autofill menu displaying a generated password" + }, + "updateInBitwarden": { + "message": "Update in Bitwarden" + }, + "updateInBitwardenSlideDesc": { + "message": "Bitwarden will then prompt you to update the password in the password manager.", + "description": "Description of the update in Bitwarden slide on the at-risk password page carousel" + }, + "updateInBitwardenSlideImgAlt": { + "message": "Illustration of a Bitwarden’s notification prompting the user to update the login" + }, "turnOnAutofill": { "message": "Turn on autofill" }, @@ -4181,6 +4275,20 @@ } } }, + "copyFieldValue": { + "message": "Copy $FIELD$, $VALUE$", + "description": "Title for a button that copies a field value to the clipboard.", + "placeholders": { + "field": { + "content": "$1", + "example": "Username" + }, + "value": { + "content": "$2", + "example": "Foo" + } + } + }, "noValuesToCopy": { "message": "No values to copy" }, diff --git a/apps/browser/src/_locales/lv/messages.json b/apps/browser/src/_locales/lv/messages.json index 9799ff17146..2c80b0b6f10 100644 --- a/apps/browser/src/_locales/lv/messages.json +++ b/apps/browser/src/_locales/lv/messages.json @@ -80,6 +80,15 @@ "masterPassHint": { "message": "Galvenās paroles norāde (nav nepieciešama)" }, + "passwordStrengthScore": { + "message": "Paroles stipruma novērtējums $SCORE$", + "placeholders": { + "score": { + "content": "$1", + "example": "4" + } + } + }, "joinOrganization": { "message": "Pievienoties apvienībai" }, @@ -876,6 +885,21 @@ "logInToBitwarden": { "message": "Pieteikties Bitwarden" }, + "enterTheCodeSentToYourEmail": { + "message": "Jāievada e-pastā nosūtītais kods" + }, + "enterTheCodeFromYourAuthenticatorApp": { + "message": "Jāievada kods no savas autentificētājlietotnes" + }, + "pressYourYubiKeyToAuthenticate": { + "message": "Jāpiespiež sava YubiKey ierīce, lai autentificētu" + }, + "duoTwoFactorRequiredPageSubtitle": { + "message": "Ir nepieciešama Duo divpakāpju pieteikšanās, lai pieteiktos savā kontā. Jāseko zemāk esošajām norādēm, lai pabeigtu pieteikšanos." + }, + "followTheStepsBelowToFinishLoggingIn": { + "message": "Jāseko zemāk esošajām norādēm, lai pabeigtu pieteikšanos." + }, "restartRegistration": { "message": "Sākt reģistrēšanos no jauna" }, @@ -1365,12 +1389,22 @@ "rememberMe": { "message": "Atcerēties mani" }, + "dontAskAgainOnThisDeviceFor30Days": { + "message": "Šajā ierīcē 30 dienas vairs nevaicāt" + }, "sendVerificationCodeEmailAgain": { "message": "Sūtīt apstiprinājuma koda e-pastu vēlreiz" }, "useAnotherTwoStepMethod": { "message": "Izmantot citu divpakāpju pieteikšanās veidu" }, + "selectAnotherMethod": { + "message": "Atlasīt citu veidu", + "description": "Select another two-step login method" + }, + "useYourRecoveryCode": { + "message": "Izmantot savu atkopes kodu" + }, "insertYubiKey": { "message": "Ievieto savu YubiKey datora USB ligzdā un pieskaries tā pogai!" }, @@ -1383,9 +1417,18 @@ "webAuthnNewTabOpen": { "message": "Atvērt jaunu cilni" }, + "openInNewTab": { + "message": "Atvērt jaunā cilnē" + }, "webAuthnAuthenticate": { "message": "Autentificēt WebAuthn" }, + "readSecurityKey": { + "message": "Nolasīt drošības atslēgu" + }, + "awaitingSecurityKeyInteraction": { + "message": "Gaida mijiedarbību ar drošības atslēgu..." + }, "loginUnavailable": { "message": "Pieteikšanās nav pieejama" }, @@ -1398,6 +1441,9 @@ "twoStepOptions": { "message": "Divpakāpju pieteikšanās iespējas" }, + "selectTwoStepLoginMethod": { + "message": "Atlasīt divpakāpju pieteikšanās veidu" + }, "recoveryCodeDesc": { "message": "Zaudēta piekļuve visiem divpakāpju nodrošinātājiem? Izmanto atkopšanas kodus, lai atspējotu visus sava konta divpakāpju nodrošinātājus!" }, @@ -2097,6 +2143,15 @@ "vaultTimeoutAction1": { "message": "Noildzes darbība" }, + "newCustomizationOptionsCalloutTitle": { + "message": "Jaunas pielāgošanas iespējas" + }, + "newCustomizationOptionsCalloutContent": { + "message": "Savu glabātavas pieredzi var pielāgot ar ātrām kopēšanas darbībām, ciešo izkārtojumu un vēl." + }, + "newCustomizationOptionsCalloutLink": { + "message": "Apskatīt visus izskata iestatījumus" + }, "lock": { "message": "Slēgt", "description": "Verb form: to make secure or inaccessible by" @@ -2391,7 +2446,16 @@ "atRiskPasswords": { "message": "Riskam pakļautās paroles" }, - "atRiskPasswordsDescSingleOrg": { + "atRiskPasswordDescSingleOrg": { + "message": "$ORGANIZATION$ pieprasa mainīt vienu paroli, jo tā ir pakļauta riskam.", + "placeholders": { + "organization": { + "content": "$1", + "example": "Acme Corp" + } + } + }, + "atRiskPasswordsDescSingleOrgPlural": { "message": "$ORGANIZATION$ pieprasa mainīt $COUNT$ paroles, jo tās ir pakļautas riskam.", "placeholders": { "organization": { @@ -2404,7 +2468,7 @@ } } }, - "atRiskPasswordsDescMultiOrg": { + "atRiskPasswordsDescMultiOrgPlural": { "message": "Apvienības pieprasa mainīt $COUNT$ paroles, jo tās ir pakļautas riskam.", "placeholders": { "count": { @@ -2431,6 +2495,36 @@ "changeAtRiskPasswordsFasterDesc": { "message": "Jāatjaunina savi iestatījumi, lai varētu veikli aizpildīt paroles automātiski un izveidot jaunas" }, + "reviewAtRiskLogins": { + "message": "Pārskatīt riskam pakļautos pieteikšanās vienumus" + }, + "reviewAtRiskPasswords": { + "message": "Pārskatīt riskam pakļautās paroles" + }, + "reviewAtRiskLoginsSlideDesc": { + "message": "Apvienības paroles ir pakļautas riskam, jo tās ir vājas, atkārtoti izmantotas un/vai noplūdušas.", + "description": "Description of the review at-risk login slide on the at-risk password page carousel" + }, + "reviewAtRiskLoginSlideImgAlt": { + "message": "Riskam pakļauto pieteikšanās vienumu saraksta attēlojums" + }, + "generatePasswordSlideDesc": { + "message": "Riskam pakļauto vienumu vietnē ar automātiskās aizpildes izvēlni var ātri izveidot stipru, neatkārtojamu paroli.", + "description": "Description of the generate password slide on the at-risk password page carousel" + }, + "generatePasswordSlideImgAlt": { + "message": "Bitwarden automātiskās izvēlnes attēlojums, kurā ir redzama izveidota parole" + }, + "updateInBitwarden": { + "message": "Atjaunināt Bitwarden" + }, + "updateInBitwardenSlideDesc": { + "message": "Bitwarden tad vaicās atjaunināt paroli paroļu pārvaldniekā.", + "description": "Description of the update in Bitwarden slide on the at-risk password page carousel" + }, + "updateInBitwardenSlideImgAlt": { + "message": "Bitwarden paziņojuma, kas aicina lietotāju atjaunināt pieteikšanās vienumu, attēlojums" + }, "turnOnAutofill": { "message": "Ieslēgt automātisko aizpildi" }, @@ -4181,6 +4275,20 @@ } } }, + "copyFieldValue": { + "message": "Ievietot starpliktuvē $FIELD$, $VALUE$", + "description": "Title for a button that copies a field value to the clipboard.", + "placeholders": { + "field": { + "content": "$1", + "example": "Username" + }, + "value": { + "content": "$2", + "example": "Foo" + } + } + }, "noValuesToCopy": { "message": "Nav vērtību, ko ievietot starpliktuvē" }, diff --git a/apps/browser/src/_locales/ml/messages.json b/apps/browser/src/_locales/ml/messages.json index 7bed62eb24b..637f139e816 100644 --- a/apps/browser/src/_locales/ml/messages.json +++ b/apps/browser/src/_locales/ml/messages.json @@ -80,6 +80,15 @@ "masterPassHint": { "message": "പ്രാഥമിക പാസ്‌വേഡ് സൂചന (ഇഷ്ടാനുസൃതമായ)" }, + "passwordStrengthScore": { + "message": "Password strength score $SCORE$", + "placeholders": { + "score": { + "content": "$1", + "example": "4" + } + } + }, "joinOrganization": { "message": "Join organization" }, @@ -876,6 +885,21 @@ "logInToBitwarden": { "message": "Log in to Bitwarden" }, + "enterTheCodeSentToYourEmail": { + "message": "Enter the code sent to your email" + }, + "enterTheCodeFromYourAuthenticatorApp": { + "message": "Enter the code from your authenticator app" + }, + "pressYourYubiKeyToAuthenticate": { + "message": "Press your YubiKey to authenticate" + }, + "duoTwoFactorRequiredPageSubtitle": { + "message": "Duo two-step login is required for your account. Follow the steps below to finish logging in." + }, + "followTheStepsBelowToFinishLoggingIn": { + "message": "Follow the steps below to finish logging in." + }, "restartRegistration": { "message": "Restart registration" }, @@ -1365,12 +1389,22 @@ "rememberMe": { "message": "എന്നെ ഓർക്കുക" }, + "dontAskAgainOnThisDeviceFor30Days": { + "message": "Don't ask again on this device for 30 days" + }, "sendVerificationCodeEmailAgain": { "message": "സ്ഥിരീകരണ കോഡ് ഇമെയിൽ വഴി അയയ്ക്കുക" }, "useAnotherTwoStepMethod": { "message": "മറ്റൊരു രണ്ട് ഘട്ട ലോഗിൻ രീതി ഉപയോഗിക്കുക" }, + "selectAnotherMethod": { + "message": "Select another method", + "description": "Select another two-step login method" + }, + "useYourRecoveryCode": { + "message": "Use your recovery code" + }, "insertYubiKey": { "message": "നിങ്ങളുടെ കമ്പ്യൂട്ടറിന്റെ യു‌എസ്‌ബി പോർട്ടിലേക്ക് യുബിക്കി ഇടുക, തുടർന്ന് അതിന്റെ ബട്ടൺ അമർത്തുക." }, @@ -1383,9 +1417,18 @@ "webAuthnNewTabOpen": { "message": "Open new tab" }, + "openInNewTab": { + "message": "Open in new tab" + }, "webAuthnAuthenticate": { "message": "Authenticate WebAuthn" }, + "readSecurityKey": { + "message": "Read security key" + }, + "awaitingSecurityKeyInteraction": { + "message": "Awaiting security key interaction..." + }, "loginUnavailable": { "message": "പ്രവേശനം ലഭ്യമല്ല" }, @@ -1398,6 +1441,9 @@ "twoStepOptions": { "message": "രണ്ട്-ഘട്ട പ്രവേശനം ഓപ്ഷനുകൾ" }, + "selectTwoStepLoginMethod": { + "message": "Select two-step login method" + }, "recoveryCodeDesc": { "message": "നിങ്ങളുടെ രണ്ട്-ഘടക ദാതാക്കളിലേക്കുള്ള ആക്‌സസ്സ് നഷ്‌ടപ്പെട്ടോ? നിങ്ങളുടെ അക്കൗണ്ടിൽ നിന്ന് രണ്ട്-ഘടക ദാതാക്കളെ പ്രവർത്തനരഹിതമാക്കാൻ നിങ്ങളുടെ റിക്കവറി കോഡ് ഉപയോഗിക്കുക." }, @@ -2097,6 +2143,15 @@ "vaultTimeoutAction1": { "message": "Timeout action" }, + "newCustomizationOptionsCalloutTitle": { + "message": "New customization options" + }, + "newCustomizationOptionsCalloutContent": { + "message": "Customize your vault experience with quick copy actions, compact mode, and more!" + }, + "newCustomizationOptionsCalloutLink": { + "message": "View all Appearance settings" + }, "lock": { "message": "പൂട്ടുക", "description": "Verb form: to make secure or inaccessible by" @@ -2391,8 +2446,17 @@ "atRiskPasswords": { "message": "At-risk passwords" }, - "atRiskPasswordsDescSingleOrg": { - "message": "$ORGANIZATION$ is requesting you change the $COUNT$ passwords because they are at risk.", + "atRiskPasswordDescSingleOrg": { + "message": "$ORGANIZATION$ is requesting you change one password because it is at-risk.", + "placeholders": { + "organization": { + "content": "$1", + "example": "Acme Corp" + } + } + }, + "atRiskPasswordsDescSingleOrgPlural": { + "message": "$ORGANIZATION$ is requesting you change the $COUNT$ passwords because they are at-risk.", "placeholders": { "organization": { "content": "$1", @@ -2404,8 +2468,8 @@ } } }, - "atRiskPasswordsDescMultiOrg": { - "message": "Your organizations are requesting you change the $COUNT$ passwords because they are at risk.", + "atRiskPasswordsDescMultiOrgPlural": { + "message": "Your organizations are requesting you change the $COUNT$ passwords because they are at-risk.", "placeholders": { "count": { "content": "$1", @@ -2431,6 +2495,36 @@ "changeAtRiskPasswordsFasterDesc": { "message": "Update your settings so you can quickly autofill your passwords and generate new ones" }, + "reviewAtRiskLogins": { + "message": "Review at-risk logins" + }, + "reviewAtRiskPasswords": { + "message": "Review at-risk passwords" + }, + "reviewAtRiskLoginsSlideDesc": { + "message": "Your organization passwords are at-risk because they are weak, reused, and/or exposed.", + "description": "Description of the review at-risk login slide on the at-risk password page carousel" + }, + "reviewAtRiskLoginSlideImgAlt": { + "message": "Illustration of a list of logins that are at-risk" + }, + "generatePasswordSlideDesc": { + "message": "Quickly generate a strong, unique password with the Bitwarden autofill menu on the at-risk site.", + "description": "Description of the generate password slide on the at-risk password page carousel" + }, + "generatePasswordSlideImgAlt": { + "message": "Illustration of the Bitwarden autofill menu displaying a generated password" + }, + "updateInBitwarden": { + "message": "Update in Bitwarden" + }, + "updateInBitwardenSlideDesc": { + "message": "Bitwarden will then prompt you to update the password in the password manager.", + "description": "Description of the update in Bitwarden slide on the at-risk password page carousel" + }, + "updateInBitwardenSlideImgAlt": { + "message": "Illustration of a Bitwarden’s notification prompting the user to update the login" + }, "turnOnAutofill": { "message": "Turn on autofill" }, @@ -4181,6 +4275,20 @@ } } }, + "copyFieldValue": { + "message": "Copy $FIELD$, $VALUE$", + "description": "Title for a button that copies a field value to the clipboard.", + "placeholders": { + "field": { + "content": "$1", + "example": "Username" + }, + "value": { + "content": "$2", + "example": "Foo" + } + } + }, "noValuesToCopy": { "message": "No values to copy" }, diff --git a/apps/browser/src/_locales/mr/messages.json b/apps/browser/src/_locales/mr/messages.json index c264ec60f09..181627cd358 100644 --- a/apps/browser/src/_locales/mr/messages.json +++ b/apps/browser/src/_locales/mr/messages.json @@ -80,6 +80,15 @@ "masterPassHint": { "message": "मुख्य पासवर्डचा संकेत (पर्यायी)" }, + "passwordStrengthScore": { + "message": "Password strength score $SCORE$", + "placeholders": { + "score": { + "content": "$1", + "example": "4" + } + } + }, "joinOrganization": { "message": "Join organization" }, @@ -876,6 +885,21 @@ "logInToBitwarden": { "message": "Log in to Bitwarden" }, + "enterTheCodeSentToYourEmail": { + "message": "Enter the code sent to your email" + }, + "enterTheCodeFromYourAuthenticatorApp": { + "message": "Enter the code from your authenticator app" + }, + "pressYourYubiKeyToAuthenticate": { + "message": "Press your YubiKey to authenticate" + }, + "duoTwoFactorRequiredPageSubtitle": { + "message": "Duo two-step login is required for your account. Follow the steps below to finish logging in." + }, + "followTheStepsBelowToFinishLoggingIn": { + "message": "Follow the steps below to finish logging in." + }, "restartRegistration": { "message": "Restart registration" }, @@ -1365,12 +1389,22 @@ "rememberMe": { "message": "Remember me" }, + "dontAskAgainOnThisDeviceFor30Days": { + "message": "Don't ask again on this device for 30 days" + }, "sendVerificationCodeEmailAgain": { "message": "Send verification code email again" }, "useAnotherTwoStepMethod": { "message": "Use another two-step login method" }, + "selectAnotherMethod": { + "message": "Select another method", + "description": "Select another two-step login method" + }, + "useYourRecoveryCode": { + "message": "Use your recovery code" + }, "insertYubiKey": { "message": "Insert your YubiKey into your computer's USB port, then touch its button." }, @@ -1383,9 +1417,18 @@ "webAuthnNewTabOpen": { "message": "Open new tab" }, + "openInNewTab": { + "message": "Open in new tab" + }, "webAuthnAuthenticate": { "message": "Authenticate WebAuthn" }, + "readSecurityKey": { + "message": "Read security key" + }, + "awaitingSecurityKeyInteraction": { + "message": "Awaiting security key interaction..." + }, "loginUnavailable": { "message": "Login unavailable" }, @@ -1398,6 +1441,9 @@ "twoStepOptions": { "message": "Two-step login options" }, + "selectTwoStepLoginMethod": { + "message": "Select two-step login method" + }, "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." }, @@ -2097,6 +2143,15 @@ "vaultTimeoutAction1": { "message": "Timeout action" }, + "newCustomizationOptionsCalloutTitle": { + "message": "New customization options" + }, + "newCustomizationOptionsCalloutContent": { + "message": "Customize your vault experience with quick copy actions, compact mode, and more!" + }, + "newCustomizationOptionsCalloutLink": { + "message": "View all Appearance settings" + }, "lock": { "message": "Lock", "description": "Verb form: to make secure or inaccessible by" @@ -2391,8 +2446,17 @@ "atRiskPasswords": { "message": "At-risk passwords" }, - "atRiskPasswordsDescSingleOrg": { - "message": "$ORGANIZATION$ is requesting you change the $COUNT$ passwords because they are at risk.", + "atRiskPasswordDescSingleOrg": { + "message": "$ORGANIZATION$ is requesting you change one password because it is at-risk.", + "placeholders": { + "organization": { + "content": "$1", + "example": "Acme Corp" + } + } + }, + "atRiskPasswordsDescSingleOrgPlural": { + "message": "$ORGANIZATION$ is requesting you change the $COUNT$ passwords because they are at-risk.", "placeholders": { "organization": { "content": "$1", @@ -2404,8 +2468,8 @@ } } }, - "atRiskPasswordsDescMultiOrg": { - "message": "Your organizations are requesting you change the $COUNT$ passwords because they are at risk.", + "atRiskPasswordsDescMultiOrgPlural": { + "message": "Your organizations are requesting you change the $COUNT$ passwords because they are at-risk.", "placeholders": { "count": { "content": "$1", @@ -2431,6 +2495,36 @@ "changeAtRiskPasswordsFasterDesc": { "message": "Update your settings so you can quickly autofill your passwords and generate new ones" }, + "reviewAtRiskLogins": { + "message": "Review at-risk logins" + }, + "reviewAtRiskPasswords": { + "message": "Review at-risk passwords" + }, + "reviewAtRiskLoginsSlideDesc": { + "message": "Your organization passwords are at-risk because they are weak, reused, and/or exposed.", + "description": "Description of the review at-risk login slide on the at-risk password page carousel" + }, + "reviewAtRiskLoginSlideImgAlt": { + "message": "Illustration of a list of logins that are at-risk" + }, + "generatePasswordSlideDesc": { + "message": "Quickly generate a strong, unique password with the Bitwarden autofill menu on the at-risk site.", + "description": "Description of the generate password slide on the at-risk password page carousel" + }, + "generatePasswordSlideImgAlt": { + "message": "Illustration of the Bitwarden autofill menu displaying a generated password" + }, + "updateInBitwarden": { + "message": "Update in Bitwarden" + }, + "updateInBitwardenSlideDesc": { + "message": "Bitwarden will then prompt you to update the password in the password manager.", + "description": "Description of the update in Bitwarden slide on the at-risk password page carousel" + }, + "updateInBitwardenSlideImgAlt": { + "message": "Illustration of a Bitwarden’s notification prompting the user to update the login" + }, "turnOnAutofill": { "message": "Turn on autofill" }, @@ -4181,6 +4275,20 @@ } } }, + "copyFieldValue": { + "message": "Copy $FIELD$, $VALUE$", + "description": "Title for a button that copies a field value to the clipboard.", + "placeholders": { + "field": { + "content": "$1", + "example": "Username" + }, + "value": { + "content": "$2", + "example": "Foo" + } + } + }, "noValuesToCopy": { "message": "No values to copy" }, diff --git a/apps/browser/src/_locales/my/messages.json b/apps/browser/src/_locales/my/messages.json index 9fe497bc1c7..41ca7e5dcd2 100644 --- a/apps/browser/src/_locales/my/messages.json +++ b/apps/browser/src/_locales/my/messages.json @@ -80,6 +80,15 @@ "masterPassHint": { "message": "Master password hint (optional)" }, + "passwordStrengthScore": { + "message": "Password strength score $SCORE$", + "placeholders": { + "score": { + "content": "$1", + "example": "4" + } + } + }, "joinOrganization": { "message": "Join organization" }, @@ -876,6 +885,21 @@ "logInToBitwarden": { "message": "Log in to Bitwarden" }, + "enterTheCodeSentToYourEmail": { + "message": "Enter the code sent to your email" + }, + "enterTheCodeFromYourAuthenticatorApp": { + "message": "Enter the code from your authenticator app" + }, + "pressYourYubiKeyToAuthenticate": { + "message": "Press your YubiKey to authenticate" + }, + "duoTwoFactorRequiredPageSubtitle": { + "message": "Duo two-step login is required for your account. Follow the steps below to finish logging in." + }, + "followTheStepsBelowToFinishLoggingIn": { + "message": "Follow the steps below to finish logging in." + }, "restartRegistration": { "message": "Restart registration" }, @@ -1365,12 +1389,22 @@ "rememberMe": { "message": "Remember me" }, + "dontAskAgainOnThisDeviceFor30Days": { + "message": "Don't ask again on this device for 30 days" + }, "sendVerificationCodeEmailAgain": { "message": "Send verification code email again" }, "useAnotherTwoStepMethod": { "message": "Use another two-step login method" }, + "selectAnotherMethod": { + "message": "Select another method", + "description": "Select another two-step login method" + }, + "useYourRecoveryCode": { + "message": "Use your recovery code" + }, "insertYubiKey": { "message": "Insert your YubiKey into your computer's USB port, then touch its button." }, @@ -1383,9 +1417,18 @@ "webAuthnNewTabOpen": { "message": "Open new tab" }, + "openInNewTab": { + "message": "Open in new tab" + }, "webAuthnAuthenticate": { "message": "Authenticate WebAuthn" }, + "readSecurityKey": { + "message": "Read security key" + }, + "awaitingSecurityKeyInteraction": { + "message": "Awaiting security key interaction..." + }, "loginUnavailable": { "message": "Login unavailable" }, @@ -1398,6 +1441,9 @@ "twoStepOptions": { "message": "Two-step login options" }, + "selectTwoStepLoginMethod": { + "message": "Select two-step login method" + }, "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." }, @@ -2097,6 +2143,15 @@ "vaultTimeoutAction1": { "message": "Timeout action" }, + "newCustomizationOptionsCalloutTitle": { + "message": "New customization options" + }, + "newCustomizationOptionsCalloutContent": { + "message": "Customize your vault experience with quick copy actions, compact mode, and more!" + }, + "newCustomizationOptionsCalloutLink": { + "message": "View all Appearance settings" + }, "lock": { "message": "Lock", "description": "Verb form: to make secure or inaccessible by" @@ -2391,8 +2446,17 @@ "atRiskPasswords": { "message": "At-risk passwords" }, - "atRiskPasswordsDescSingleOrg": { - "message": "$ORGANIZATION$ is requesting you change the $COUNT$ passwords because they are at risk.", + "atRiskPasswordDescSingleOrg": { + "message": "$ORGANIZATION$ is requesting you change one password because it is at-risk.", + "placeholders": { + "organization": { + "content": "$1", + "example": "Acme Corp" + } + } + }, + "atRiskPasswordsDescSingleOrgPlural": { + "message": "$ORGANIZATION$ is requesting you change the $COUNT$ passwords because they are at-risk.", "placeholders": { "organization": { "content": "$1", @@ -2404,8 +2468,8 @@ } } }, - "atRiskPasswordsDescMultiOrg": { - "message": "Your organizations are requesting you change the $COUNT$ passwords because they are at risk.", + "atRiskPasswordsDescMultiOrgPlural": { + "message": "Your organizations are requesting you change the $COUNT$ passwords because they are at-risk.", "placeholders": { "count": { "content": "$1", @@ -2431,6 +2495,36 @@ "changeAtRiskPasswordsFasterDesc": { "message": "Update your settings so you can quickly autofill your passwords and generate new ones" }, + "reviewAtRiskLogins": { + "message": "Review at-risk logins" + }, + "reviewAtRiskPasswords": { + "message": "Review at-risk passwords" + }, + "reviewAtRiskLoginsSlideDesc": { + "message": "Your organization passwords are at-risk because they are weak, reused, and/or exposed.", + "description": "Description of the review at-risk login slide on the at-risk password page carousel" + }, + "reviewAtRiskLoginSlideImgAlt": { + "message": "Illustration of a list of logins that are at-risk" + }, + "generatePasswordSlideDesc": { + "message": "Quickly generate a strong, unique password with the Bitwarden autofill menu on the at-risk site.", + "description": "Description of the generate password slide on the at-risk password page carousel" + }, + "generatePasswordSlideImgAlt": { + "message": "Illustration of the Bitwarden autofill menu displaying a generated password" + }, + "updateInBitwarden": { + "message": "Update in Bitwarden" + }, + "updateInBitwardenSlideDesc": { + "message": "Bitwarden will then prompt you to update the password in the password manager.", + "description": "Description of the update in Bitwarden slide on the at-risk password page carousel" + }, + "updateInBitwardenSlideImgAlt": { + "message": "Illustration of a Bitwarden’s notification prompting the user to update the login" + }, "turnOnAutofill": { "message": "Turn on autofill" }, @@ -4181,6 +4275,20 @@ } } }, + "copyFieldValue": { + "message": "Copy $FIELD$, $VALUE$", + "description": "Title for a button that copies a field value to the clipboard.", + "placeholders": { + "field": { + "content": "$1", + "example": "Username" + }, + "value": { + "content": "$2", + "example": "Foo" + } + } + }, "noValuesToCopy": { "message": "No values to copy" }, diff --git a/apps/browser/src/_locales/nb/messages.json b/apps/browser/src/_locales/nb/messages.json index 18d889863a4..8022d4372d3 100644 --- a/apps/browser/src/_locales/nb/messages.json +++ b/apps/browser/src/_locales/nb/messages.json @@ -80,6 +80,15 @@ "masterPassHint": { "message": "Et hint for hovedpassordet (valgfritt)" }, + "passwordStrengthScore": { + "message": "Password strength score $SCORE$", + "placeholders": { + "score": { + "content": "$1", + "example": "4" + } + } + }, "joinOrganization": { "message": "Bli med i organisasjonen" }, @@ -876,6 +885,21 @@ "logInToBitwarden": { "message": "Logg inn på Bitwarden" }, + "enterTheCodeSentToYourEmail": { + "message": "Enter the code sent to your email" + }, + "enterTheCodeFromYourAuthenticatorApp": { + "message": "Enter the code from your authenticator app" + }, + "pressYourYubiKeyToAuthenticate": { + "message": "Press your YubiKey to authenticate" + }, + "duoTwoFactorRequiredPageSubtitle": { + "message": "Duo two-step login is required for your account. Follow the steps below to finish logging in." + }, + "followTheStepsBelowToFinishLoggingIn": { + "message": "Follow the steps below to finish logging in." + }, "restartRegistration": { "message": "Start registreringen på nytt" }, @@ -1365,12 +1389,22 @@ "rememberMe": { "message": "Husk på meg" }, + "dontAskAgainOnThisDeviceFor30Days": { + "message": "Don't ask again on this device for 30 days" + }, "sendVerificationCodeEmailAgain": { "message": "Send E-posten med verifiseringskoden på nytt" }, "useAnotherTwoStepMethod": { "message": "Bruk en annen 2-trinnsinnloggingsmetode" }, + "selectAnotherMethod": { + "message": "Select another method", + "description": "Select another two-step login method" + }, + "useYourRecoveryCode": { + "message": "Use your recovery code" + }, "insertYubiKey": { "message": "Sett inn din YubiKey i din datamaskins USB-uttak, og så trykk på dens knapp." }, @@ -1383,9 +1417,18 @@ "webAuthnNewTabOpen": { "message": "Åpne ny fane" }, + "openInNewTab": { + "message": "Open in new tab" + }, "webAuthnAuthenticate": { "message": "Autentiser WebAuthn" }, + "readSecurityKey": { + "message": "Read security key" + }, + "awaitingSecurityKeyInteraction": { + "message": "Awaiting security key interaction..." + }, "loginUnavailable": { "message": "Innloggingen er utilgjengelig" }, @@ -1398,6 +1441,9 @@ "twoStepOptions": { "message": "Alternativer for 2-trinnsinnlogging" }, + "selectTwoStepLoginMethod": { + "message": "Select two-step login method" + }, "recoveryCodeDesc": { "message": "Har du mistet tilgang til alle dine 2-trinnsleverandører? Bruk din gjenopprettingskode til å fjerne alle 2-trinnsleverandører fra din konto." }, @@ -2097,6 +2143,15 @@ "vaultTimeoutAction1": { "message": "Handling ved tidsavbrudd" }, + "newCustomizationOptionsCalloutTitle": { + "message": "New customization options" + }, + "newCustomizationOptionsCalloutContent": { + "message": "Customize your vault experience with quick copy actions, compact mode, and more!" + }, + "newCustomizationOptionsCalloutLink": { + "message": "View all Appearance settings" + }, "lock": { "message": "Lås", "description": "Verb form: to make secure or inaccessible by" @@ -2391,8 +2446,17 @@ "atRiskPasswords": { "message": "At-risk passwords" }, - "atRiskPasswordsDescSingleOrg": { - "message": "$ORGANIZATION$ is requesting you change the $COUNT$ passwords because they are at risk.", + "atRiskPasswordDescSingleOrg": { + "message": "$ORGANIZATION$ is requesting you change one password because it is at-risk.", + "placeholders": { + "organization": { + "content": "$1", + "example": "Acme Corp" + } + } + }, + "atRiskPasswordsDescSingleOrgPlural": { + "message": "$ORGANIZATION$ is requesting you change the $COUNT$ passwords because they are at-risk.", "placeholders": { "organization": { "content": "$1", @@ -2404,8 +2468,8 @@ } } }, - "atRiskPasswordsDescMultiOrg": { - "message": "Your organizations are requesting you change the $COUNT$ passwords because they are at risk.", + "atRiskPasswordsDescMultiOrgPlural": { + "message": "Your organizations are requesting you change the $COUNT$ passwords because they are at-risk.", "placeholders": { "count": { "content": "$1", @@ -2431,6 +2495,36 @@ "changeAtRiskPasswordsFasterDesc": { "message": "Update your settings so you can quickly autofill your passwords and generate new ones" }, + "reviewAtRiskLogins": { + "message": "Review at-risk logins" + }, + "reviewAtRiskPasswords": { + "message": "Review at-risk passwords" + }, + "reviewAtRiskLoginsSlideDesc": { + "message": "Your organization passwords are at-risk because they are weak, reused, and/or exposed.", + "description": "Description of the review at-risk login slide on the at-risk password page carousel" + }, + "reviewAtRiskLoginSlideImgAlt": { + "message": "Illustration of a list of logins that are at-risk" + }, + "generatePasswordSlideDesc": { + "message": "Quickly generate a strong, unique password with the Bitwarden autofill menu on the at-risk site.", + "description": "Description of the generate password slide on the at-risk password page carousel" + }, + "generatePasswordSlideImgAlt": { + "message": "Illustration of the Bitwarden autofill menu displaying a generated password" + }, + "updateInBitwarden": { + "message": "Update in Bitwarden" + }, + "updateInBitwardenSlideDesc": { + "message": "Bitwarden will then prompt you to update the password in the password manager.", + "description": "Description of the update in Bitwarden slide on the at-risk password page carousel" + }, + "updateInBitwardenSlideImgAlt": { + "message": "Illustration of a Bitwarden’s notification prompting the user to update the login" + }, "turnOnAutofill": { "message": "Turn on autofill" }, @@ -4181,6 +4275,20 @@ } } }, + "copyFieldValue": { + "message": "Copy $FIELD$, $VALUE$", + "description": "Title for a button that copies a field value to the clipboard.", + "placeholders": { + "field": { + "content": "$1", + "example": "Username" + }, + "value": { + "content": "$2", + "example": "Foo" + } + } + }, "noValuesToCopy": { "message": "Ingen verdier å kopiere" }, diff --git a/apps/browser/src/_locales/ne/messages.json b/apps/browser/src/_locales/ne/messages.json index 9fe497bc1c7..41ca7e5dcd2 100644 --- a/apps/browser/src/_locales/ne/messages.json +++ b/apps/browser/src/_locales/ne/messages.json @@ -80,6 +80,15 @@ "masterPassHint": { "message": "Master password hint (optional)" }, + "passwordStrengthScore": { + "message": "Password strength score $SCORE$", + "placeholders": { + "score": { + "content": "$1", + "example": "4" + } + } + }, "joinOrganization": { "message": "Join organization" }, @@ -876,6 +885,21 @@ "logInToBitwarden": { "message": "Log in to Bitwarden" }, + "enterTheCodeSentToYourEmail": { + "message": "Enter the code sent to your email" + }, + "enterTheCodeFromYourAuthenticatorApp": { + "message": "Enter the code from your authenticator app" + }, + "pressYourYubiKeyToAuthenticate": { + "message": "Press your YubiKey to authenticate" + }, + "duoTwoFactorRequiredPageSubtitle": { + "message": "Duo two-step login is required for your account. Follow the steps below to finish logging in." + }, + "followTheStepsBelowToFinishLoggingIn": { + "message": "Follow the steps below to finish logging in." + }, "restartRegistration": { "message": "Restart registration" }, @@ -1365,12 +1389,22 @@ "rememberMe": { "message": "Remember me" }, + "dontAskAgainOnThisDeviceFor30Days": { + "message": "Don't ask again on this device for 30 days" + }, "sendVerificationCodeEmailAgain": { "message": "Send verification code email again" }, "useAnotherTwoStepMethod": { "message": "Use another two-step login method" }, + "selectAnotherMethod": { + "message": "Select another method", + "description": "Select another two-step login method" + }, + "useYourRecoveryCode": { + "message": "Use your recovery code" + }, "insertYubiKey": { "message": "Insert your YubiKey into your computer's USB port, then touch its button." }, @@ -1383,9 +1417,18 @@ "webAuthnNewTabOpen": { "message": "Open new tab" }, + "openInNewTab": { + "message": "Open in new tab" + }, "webAuthnAuthenticate": { "message": "Authenticate WebAuthn" }, + "readSecurityKey": { + "message": "Read security key" + }, + "awaitingSecurityKeyInteraction": { + "message": "Awaiting security key interaction..." + }, "loginUnavailable": { "message": "Login unavailable" }, @@ -1398,6 +1441,9 @@ "twoStepOptions": { "message": "Two-step login options" }, + "selectTwoStepLoginMethod": { + "message": "Select two-step login method" + }, "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." }, @@ -2097,6 +2143,15 @@ "vaultTimeoutAction1": { "message": "Timeout action" }, + "newCustomizationOptionsCalloutTitle": { + "message": "New customization options" + }, + "newCustomizationOptionsCalloutContent": { + "message": "Customize your vault experience with quick copy actions, compact mode, and more!" + }, + "newCustomizationOptionsCalloutLink": { + "message": "View all Appearance settings" + }, "lock": { "message": "Lock", "description": "Verb form: to make secure or inaccessible by" @@ -2391,8 +2446,17 @@ "atRiskPasswords": { "message": "At-risk passwords" }, - "atRiskPasswordsDescSingleOrg": { - "message": "$ORGANIZATION$ is requesting you change the $COUNT$ passwords because they are at risk.", + "atRiskPasswordDescSingleOrg": { + "message": "$ORGANIZATION$ is requesting you change one password because it is at-risk.", + "placeholders": { + "organization": { + "content": "$1", + "example": "Acme Corp" + } + } + }, + "atRiskPasswordsDescSingleOrgPlural": { + "message": "$ORGANIZATION$ is requesting you change the $COUNT$ passwords because they are at-risk.", "placeholders": { "organization": { "content": "$1", @@ -2404,8 +2468,8 @@ } } }, - "atRiskPasswordsDescMultiOrg": { - "message": "Your organizations are requesting you change the $COUNT$ passwords because they are at risk.", + "atRiskPasswordsDescMultiOrgPlural": { + "message": "Your organizations are requesting you change the $COUNT$ passwords because they are at-risk.", "placeholders": { "count": { "content": "$1", @@ -2431,6 +2495,36 @@ "changeAtRiskPasswordsFasterDesc": { "message": "Update your settings so you can quickly autofill your passwords and generate new ones" }, + "reviewAtRiskLogins": { + "message": "Review at-risk logins" + }, + "reviewAtRiskPasswords": { + "message": "Review at-risk passwords" + }, + "reviewAtRiskLoginsSlideDesc": { + "message": "Your organization passwords are at-risk because they are weak, reused, and/or exposed.", + "description": "Description of the review at-risk login slide on the at-risk password page carousel" + }, + "reviewAtRiskLoginSlideImgAlt": { + "message": "Illustration of a list of logins that are at-risk" + }, + "generatePasswordSlideDesc": { + "message": "Quickly generate a strong, unique password with the Bitwarden autofill menu on the at-risk site.", + "description": "Description of the generate password slide on the at-risk password page carousel" + }, + "generatePasswordSlideImgAlt": { + "message": "Illustration of the Bitwarden autofill menu displaying a generated password" + }, + "updateInBitwarden": { + "message": "Update in Bitwarden" + }, + "updateInBitwardenSlideDesc": { + "message": "Bitwarden will then prompt you to update the password in the password manager.", + "description": "Description of the update in Bitwarden slide on the at-risk password page carousel" + }, + "updateInBitwardenSlideImgAlt": { + "message": "Illustration of a Bitwarden’s notification prompting the user to update the login" + }, "turnOnAutofill": { "message": "Turn on autofill" }, @@ -4181,6 +4275,20 @@ } } }, + "copyFieldValue": { + "message": "Copy $FIELD$, $VALUE$", + "description": "Title for a button that copies a field value to the clipboard.", + "placeholders": { + "field": { + "content": "$1", + "example": "Username" + }, + "value": { + "content": "$2", + "example": "Foo" + } + } + }, "noValuesToCopy": { "message": "No values to copy" }, diff --git a/apps/browser/src/_locales/nl/messages.json b/apps/browser/src/_locales/nl/messages.json index 6019c5aa339..c07244d8cde 100644 --- a/apps/browser/src/_locales/nl/messages.json +++ b/apps/browser/src/_locales/nl/messages.json @@ -80,6 +80,15 @@ "masterPassHint": { "message": "Hoofdwachtwoordhint (optioneel)" }, + "passwordStrengthScore": { + "message": "Score wachtwoordsterkte $SCORE$", + "placeholders": { + "score": { + "content": "$1", + "example": "4" + } + } + }, "joinOrganization": { "message": "Lid van organisatie worden" }, @@ -876,6 +885,21 @@ "logInToBitwarden": { "message": "Inloggen op Bitwarden" }, + "enterTheCodeSentToYourEmail": { + "message": "Voer de code in die naar je e-mailadres is verstuurd" + }, + "enterTheCodeFromYourAuthenticatorApp": { + "message": "Voer de code uit je authenticatie-app in" + }, + "pressYourYubiKeyToAuthenticate": { + "message": "Druk op je YubiKey om te verifiëren" + }, + "duoTwoFactorRequiredPageSubtitle": { + "message": "Jouw account vereist Duo-tweestapsaanmelding. Volg de onderstaande stappen om het inloggen te voltooien." + }, + "followTheStepsBelowToFinishLoggingIn": { + "message": "Volg de onderstaande stappen om in te loggen." + }, "restartRegistration": { "message": "Registratie herstarten" }, @@ -1365,12 +1389,22 @@ "rememberMe": { "message": "Mijn gegevens onthouden" }, + "dontAskAgainOnThisDeviceFor30Days": { + "message": "30 dagen niet meer vragen op dit apparaat" + }, "sendVerificationCodeEmailAgain": { "message": "E-mail met verificatiecode opnieuw versturen" }, "useAnotherTwoStepMethod": { "message": "Gebruik een andere methode voor tweestapsaanmelding" }, + "selectAnotherMethod": { + "message": "Kies een andere methode", + "description": "Select another two-step login method" + }, + "useYourRecoveryCode": { + "message": "Gebruik je herstelcode" + }, "insertYubiKey": { "message": "Plaats je YubiKey in de USB-poort van je computer en druk op de knop." }, @@ -1383,9 +1417,18 @@ "webAuthnNewTabOpen": { "message": "Nieuwe tab openen" }, + "openInNewTab": { + "message": "Openen in nieuwe tab" + }, "webAuthnAuthenticate": { "message": "Authenticeer WebAuthn" }, + "readSecurityKey": { + "message": "Beveiligingssleutel lezen" + }, + "awaitingSecurityKeyInteraction": { + "message": "Wacht op interactie met beveiligingssleutel..." + }, "loginUnavailable": { "message": "Login niet beschikbaar" }, @@ -1398,6 +1441,9 @@ "twoStepOptions": { "message": "Opties voor tweestapsaanmelding" }, + "selectTwoStepLoginMethod": { + "message": "Kies methode voor tweestapsaanmelding" + }, "recoveryCodeDesc": { "message": "Ben je de toegang tot al je tweestapsaanbieders verloren? Gebruik dan je herstelcode om alle tweestapsaanbieders op je account uit te schakelen." }, @@ -2097,6 +2143,15 @@ "vaultTimeoutAction1": { "message": "Time-out actie" }, + "newCustomizationOptionsCalloutTitle": { + "message": "Nieuwe aanpassingsopties" + }, + "newCustomizationOptionsCalloutContent": { + "message": "Personaliseer je kluiservaring met snelle kopieeracties, compacte modus en meer!" + }, + "newCustomizationOptionsCalloutLink": { + "message": "Alle personalisatie-instellingen bekijken" + }, "lock": { "message": "Vergrendelen", "description": "Verb form: to make secure or inaccessible by" @@ -2391,7 +2446,16 @@ "atRiskPasswords": { "message": "Wachtwoorden in gevaar" }, - "atRiskPasswordsDescSingleOrg": { + "atRiskPasswordDescSingleOrg": { + "message": "$ORGANIZATION$ vraagt je om één wachtwoord te wijzigen omdat deze een risico vormt.", + "placeholders": { + "organization": { + "content": "$1", + "example": "Acme Corp" + } + } + }, + "atRiskPasswordsDescSingleOrgPlural": { "message": "$ORGANIZATION$ vraagt je om de $COUNT$ wachtwoorden te wijzigen omdat ze een risico vormen.", "placeholders": { "organization": { @@ -2404,7 +2468,7 @@ } } }, - "atRiskPasswordsDescMultiOrg": { + "atRiskPasswordsDescMultiOrgPlural": { "message": "Je organisatie(s) vragen je de $COUNT$ wachtwoorden te wijzigen omdat ze een risico vormen.", "placeholders": { "count": { @@ -2431,6 +2495,36 @@ "changeAtRiskPasswordsFasterDesc": { "message": "Werk je instellingen bij voor het snel automatisch invullen van je wachtwoorden en genereren van nieuwe" }, + "reviewAtRiskLogins": { + "message": "Risicovolle logins bekijken" + }, + "reviewAtRiskPasswords": { + "message": "Risicovolle wachtwoorden bekijken" + }, + "reviewAtRiskLoginsSlideDesc": { + "message": "De wachtwoorden van je organisatie zijn in gevaar omdat ze zwak, hergebruikt en/of blootgelegd zijn.", + "description": "Description of the review at-risk login slide on the at-risk password page carousel" + }, + "reviewAtRiskLoginSlideImgAlt": { + "message": "Voorbeeld van een lijst van risicovolle logins" + }, + "generatePasswordSlideDesc": { + "message": "Genereer snel een sterk, uniek wachtwoord met het automatisch invulmenu van Bitwaren op de risicovolle website.", + "description": "Description of the generate password slide on the at-risk password page carousel" + }, + "generatePasswordSlideImgAlt": { + "message": "Voorbeeld van het automatisch invulmenu van Bitwarden met een gegenereerd wachtwoord" + }, + "updateInBitwarden": { + "message": "Bijwerken in Bitwarden" + }, + "updateInBitwardenSlideDesc": { + "message": "Bitwarden vraagt je vervolgens het wachtwoord bij te werken in de wachtwoordbeheerder.", + "description": "Description of the update in Bitwarden slide on the at-risk password page carousel" + }, + "updateInBitwardenSlideImgAlt": { + "message": "Voorbeeld van een Bitwarden-melding die de gebruiker aanspoort tot het bijwerken van de login" + }, "turnOnAutofill": { "message": "Automatisch invullen inschakelen" }, @@ -4181,6 +4275,20 @@ } } }, + "copyFieldValue": { + "message": "$FIELD$, $VALUE$ kopiëren", + "description": "Title for a button that copies a field value to the clipboard.", + "placeholders": { + "field": { + "content": "$1", + "example": "Username" + }, + "value": { + "content": "$2", + "example": "Foo" + } + } + }, "noValuesToCopy": { "message": "Geen waarden om te kopiëren" }, diff --git a/apps/browser/src/_locales/nn/messages.json b/apps/browser/src/_locales/nn/messages.json index 9fe497bc1c7..41ca7e5dcd2 100644 --- a/apps/browser/src/_locales/nn/messages.json +++ b/apps/browser/src/_locales/nn/messages.json @@ -80,6 +80,15 @@ "masterPassHint": { "message": "Master password hint (optional)" }, + "passwordStrengthScore": { + "message": "Password strength score $SCORE$", + "placeholders": { + "score": { + "content": "$1", + "example": "4" + } + } + }, "joinOrganization": { "message": "Join organization" }, @@ -876,6 +885,21 @@ "logInToBitwarden": { "message": "Log in to Bitwarden" }, + "enterTheCodeSentToYourEmail": { + "message": "Enter the code sent to your email" + }, + "enterTheCodeFromYourAuthenticatorApp": { + "message": "Enter the code from your authenticator app" + }, + "pressYourYubiKeyToAuthenticate": { + "message": "Press your YubiKey to authenticate" + }, + "duoTwoFactorRequiredPageSubtitle": { + "message": "Duo two-step login is required for your account. Follow the steps below to finish logging in." + }, + "followTheStepsBelowToFinishLoggingIn": { + "message": "Follow the steps below to finish logging in." + }, "restartRegistration": { "message": "Restart registration" }, @@ -1365,12 +1389,22 @@ "rememberMe": { "message": "Remember me" }, + "dontAskAgainOnThisDeviceFor30Days": { + "message": "Don't ask again on this device for 30 days" + }, "sendVerificationCodeEmailAgain": { "message": "Send verification code email again" }, "useAnotherTwoStepMethod": { "message": "Use another two-step login method" }, + "selectAnotherMethod": { + "message": "Select another method", + "description": "Select another two-step login method" + }, + "useYourRecoveryCode": { + "message": "Use your recovery code" + }, "insertYubiKey": { "message": "Insert your YubiKey into your computer's USB port, then touch its button." }, @@ -1383,9 +1417,18 @@ "webAuthnNewTabOpen": { "message": "Open new tab" }, + "openInNewTab": { + "message": "Open in new tab" + }, "webAuthnAuthenticate": { "message": "Authenticate WebAuthn" }, + "readSecurityKey": { + "message": "Read security key" + }, + "awaitingSecurityKeyInteraction": { + "message": "Awaiting security key interaction..." + }, "loginUnavailable": { "message": "Login unavailable" }, @@ -1398,6 +1441,9 @@ "twoStepOptions": { "message": "Two-step login options" }, + "selectTwoStepLoginMethod": { + "message": "Select two-step login method" + }, "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." }, @@ -2097,6 +2143,15 @@ "vaultTimeoutAction1": { "message": "Timeout action" }, + "newCustomizationOptionsCalloutTitle": { + "message": "New customization options" + }, + "newCustomizationOptionsCalloutContent": { + "message": "Customize your vault experience with quick copy actions, compact mode, and more!" + }, + "newCustomizationOptionsCalloutLink": { + "message": "View all Appearance settings" + }, "lock": { "message": "Lock", "description": "Verb form: to make secure or inaccessible by" @@ -2391,8 +2446,17 @@ "atRiskPasswords": { "message": "At-risk passwords" }, - "atRiskPasswordsDescSingleOrg": { - "message": "$ORGANIZATION$ is requesting you change the $COUNT$ passwords because they are at risk.", + "atRiskPasswordDescSingleOrg": { + "message": "$ORGANIZATION$ is requesting you change one password because it is at-risk.", + "placeholders": { + "organization": { + "content": "$1", + "example": "Acme Corp" + } + } + }, + "atRiskPasswordsDescSingleOrgPlural": { + "message": "$ORGANIZATION$ is requesting you change the $COUNT$ passwords because they are at-risk.", "placeholders": { "organization": { "content": "$1", @@ -2404,8 +2468,8 @@ } } }, - "atRiskPasswordsDescMultiOrg": { - "message": "Your organizations are requesting you change the $COUNT$ passwords because they are at risk.", + "atRiskPasswordsDescMultiOrgPlural": { + "message": "Your organizations are requesting you change the $COUNT$ passwords because they are at-risk.", "placeholders": { "count": { "content": "$1", @@ -2431,6 +2495,36 @@ "changeAtRiskPasswordsFasterDesc": { "message": "Update your settings so you can quickly autofill your passwords and generate new ones" }, + "reviewAtRiskLogins": { + "message": "Review at-risk logins" + }, + "reviewAtRiskPasswords": { + "message": "Review at-risk passwords" + }, + "reviewAtRiskLoginsSlideDesc": { + "message": "Your organization passwords are at-risk because they are weak, reused, and/or exposed.", + "description": "Description of the review at-risk login slide on the at-risk password page carousel" + }, + "reviewAtRiskLoginSlideImgAlt": { + "message": "Illustration of a list of logins that are at-risk" + }, + "generatePasswordSlideDesc": { + "message": "Quickly generate a strong, unique password with the Bitwarden autofill menu on the at-risk site.", + "description": "Description of the generate password slide on the at-risk password page carousel" + }, + "generatePasswordSlideImgAlt": { + "message": "Illustration of the Bitwarden autofill menu displaying a generated password" + }, + "updateInBitwarden": { + "message": "Update in Bitwarden" + }, + "updateInBitwardenSlideDesc": { + "message": "Bitwarden will then prompt you to update the password in the password manager.", + "description": "Description of the update in Bitwarden slide on the at-risk password page carousel" + }, + "updateInBitwardenSlideImgAlt": { + "message": "Illustration of a Bitwarden’s notification prompting the user to update the login" + }, "turnOnAutofill": { "message": "Turn on autofill" }, @@ -4181,6 +4275,20 @@ } } }, + "copyFieldValue": { + "message": "Copy $FIELD$, $VALUE$", + "description": "Title for a button that copies a field value to the clipboard.", + "placeholders": { + "field": { + "content": "$1", + "example": "Username" + }, + "value": { + "content": "$2", + "example": "Foo" + } + } + }, "noValuesToCopy": { "message": "No values to copy" }, diff --git a/apps/browser/src/_locales/or/messages.json b/apps/browser/src/_locales/or/messages.json index 9fe497bc1c7..41ca7e5dcd2 100644 --- a/apps/browser/src/_locales/or/messages.json +++ b/apps/browser/src/_locales/or/messages.json @@ -80,6 +80,15 @@ "masterPassHint": { "message": "Master password hint (optional)" }, + "passwordStrengthScore": { + "message": "Password strength score $SCORE$", + "placeholders": { + "score": { + "content": "$1", + "example": "4" + } + } + }, "joinOrganization": { "message": "Join organization" }, @@ -876,6 +885,21 @@ "logInToBitwarden": { "message": "Log in to Bitwarden" }, + "enterTheCodeSentToYourEmail": { + "message": "Enter the code sent to your email" + }, + "enterTheCodeFromYourAuthenticatorApp": { + "message": "Enter the code from your authenticator app" + }, + "pressYourYubiKeyToAuthenticate": { + "message": "Press your YubiKey to authenticate" + }, + "duoTwoFactorRequiredPageSubtitle": { + "message": "Duo two-step login is required for your account. Follow the steps below to finish logging in." + }, + "followTheStepsBelowToFinishLoggingIn": { + "message": "Follow the steps below to finish logging in." + }, "restartRegistration": { "message": "Restart registration" }, @@ -1365,12 +1389,22 @@ "rememberMe": { "message": "Remember me" }, + "dontAskAgainOnThisDeviceFor30Days": { + "message": "Don't ask again on this device for 30 days" + }, "sendVerificationCodeEmailAgain": { "message": "Send verification code email again" }, "useAnotherTwoStepMethod": { "message": "Use another two-step login method" }, + "selectAnotherMethod": { + "message": "Select another method", + "description": "Select another two-step login method" + }, + "useYourRecoveryCode": { + "message": "Use your recovery code" + }, "insertYubiKey": { "message": "Insert your YubiKey into your computer's USB port, then touch its button." }, @@ -1383,9 +1417,18 @@ "webAuthnNewTabOpen": { "message": "Open new tab" }, + "openInNewTab": { + "message": "Open in new tab" + }, "webAuthnAuthenticate": { "message": "Authenticate WebAuthn" }, + "readSecurityKey": { + "message": "Read security key" + }, + "awaitingSecurityKeyInteraction": { + "message": "Awaiting security key interaction..." + }, "loginUnavailable": { "message": "Login unavailable" }, @@ -1398,6 +1441,9 @@ "twoStepOptions": { "message": "Two-step login options" }, + "selectTwoStepLoginMethod": { + "message": "Select two-step login method" + }, "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." }, @@ -2097,6 +2143,15 @@ "vaultTimeoutAction1": { "message": "Timeout action" }, + "newCustomizationOptionsCalloutTitle": { + "message": "New customization options" + }, + "newCustomizationOptionsCalloutContent": { + "message": "Customize your vault experience with quick copy actions, compact mode, and more!" + }, + "newCustomizationOptionsCalloutLink": { + "message": "View all Appearance settings" + }, "lock": { "message": "Lock", "description": "Verb form: to make secure or inaccessible by" @@ -2391,8 +2446,17 @@ "atRiskPasswords": { "message": "At-risk passwords" }, - "atRiskPasswordsDescSingleOrg": { - "message": "$ORGANIZATION$ is requesting you change the $COUNT$ passwords because they are at risk.", + "atRiskPasswordDescSingleOrg": { + "message": "$ORGANIZATION$ is requesting you change one password because it is at-risk.", + "placeholders": { + "organization": { + "content": "$1", + "example": "Acme Corp" + } + } + }, + "atRiskPasswordsDescSingleOrgPlural": { + "message": "$ORGANIZATION$ is requesting you change the $COUNT$ passwords because they are at-risk.", "placeholders": { "organization": { "content": "$1", @@ -2404,8 +2468,8 @@ } } }, - "atRiskPasswordsDescMultiOrg": { - "message": "Your organizations are requesting you change the $COUNT$ passwords because they are at risk.", + "atRiskPasswordsDescMultiOrgPlural": { + "message": "Your organizations are requesting you change the $COUNT$ passwords because they are at-risk.", "placeholders": { "count": { "content": "$1", @@ -2431,6 +2495,36 @@ "changeAtRiskPasswordsFasterDesc": { "message": "Update your settings so you can quickly autofill your passwords and generate new ones" }, + "reviewAtRiskLogins": { + "message": "Review at-risk logins" + }, + "reviewAtRiskPasswords": { + "message": "Review at-risk passwords" + }, + "reviewAtRiskLoginsSlideDesc": { + "message": "Your organization passwords are at-risk because they are weak, reused, and/or exposed.", + "description": "Description of the review at-risk login slide on the at-risk password page carousel" + }, + "reviewAtRiskLoginSlideImgAlt": { + "message": "Illustration of a list of logins that are at-risk" + }, + "generatePasswordSlideDesc": { + "message": "Quickly generate a strong, unique password with the Bitwarden autofill menu on the at-risk site.", + "description": "Description of the generate password slide on the at-risk password page carousel" + }, + "generatePasswordSlideImgAlt": { + "message": "Illustration of the Bitwarden autofill menu displaying a generated password" + }, + "updateInBitwarden": { + "message": "Update in Bitwarden" + }, + "updateInBitwardenSlideDesc": { + "message": "Bitwarden will then prompt you to update the password in the password manager.", + "description": "Description of the update in Bitwarden slide on the at-risk password page carousel" + }, + "updateInBitwardenSlideImgAlt": { + "message": "Illustration of a Bitwarden’s notification prompting the user to update the login" + }, "turnOnAutofill": { "message": "Turn on autofill" }, @@ -4181,6 +4275,20 @@ } } }, + "copyFieldValue": { + "message": "Copy $FIELD$, $VALUE$", + "description": "Title for a button that copies a field value to the clipboard.", + "placeholders": { + "field": { + "content": "$1", + "example": "Username" + }, + "value": { + "content": "$2", + "example": "Foo" + } + } + }, "noValuesToCopy": { "message": "No values to copy" }, diff --git a/apps/browser/src/_locales/pl/messages.json b/apps/browser/src/_locales/pl/messages.json index 0f552edd4eb..70c567f1938 100644 --- a/apps/browser/src/_locales/pl/messages.json +++ b/apps/browser/src/_locales/pl/messages.json @@ -80,6 +80,15 @@ "masterPassHint": { "message": "Podpowiedź do hasła głównego (opcjonalnie)" }, + "passwordStrengthScore": { + "message": "Siła hasła: $SCORE$", + "placeholders": { + "score": { + "content": "$1", + "example": "4" + } + } + }, "joinOrganization": { "message": "Dołącz do organizacji" }, @@ -876,6 +885,21 @@ "logInToBitwarden": { "message": "Zaloguj się do Bitwarden" }, + "enterTheCodeSentToYourEmail": { + "message": "Wpisz kod wysłany na Twój adres e-mail" + }, + "enterTheCodeFromYourAuthenticatorApp": { + "message": "Wpisz kod z aplikacji uwierzytelniającej" + }, + "pressYourYubiKeyToAuthenticate": { + "message": "Naciśnij YubiKey aby uwierzytelnić" + }, + "duoTwoFactorRequiredPageSubtitle": { + "message": "Logowanie dwustopniowe Duo jest wymagane dla twojego konta. Wykonaj poniższe kroki, by dokończyć logowanie" + }, + "followTheStepsBelowToFinishLoggingIn": { + "message": "Wykonaj poniższe kroki, by dokończyć logowanie" + }, "restartRegistration": { "message": "Zrestartuj rejestrację" }, @@ -1365,12 +1389,22 @@ "rememberMe": { "message": "Zapamiętaj mnie" }, + "dontAskAgainOnThisDeviceFor30Days": { + "message": "Nie pytaj ponownie na tym urządzeniu przez 30 dni" + }, "sendVerificationCodeEmailAgain": { "message": "Wyślij ponownie wiadomość z kodem weryfikacyjnym" }, "useAnotherTwoStepMethod": { "message": "Użyj innej metody logowania dwustopniowego" }, + "selectAnotherMethod": { + "message": "Wybierz inną metodę", + "description": "Select another two-step login method" + }, + "useYourRecoveryCode": { + "message": "Użyj kodu odzyskiwania" + }, "insertYubiKey": { "message": "Włóż klucz YubiKey do portu USB komputera, a następnie dotknij jego przycisku." }, @@ -1383,9 +1417,18 @@ "webAuthnNewTabOpen": { "message": "Otwórz nową kartę" }, + "openInNewTab": { + "message": "Otwórz w nowej karcie" + }, "webAuthnAuthenticate": { "message": "Uwierzytelnianie WebAuthn" }, + "readSecurityKey": { + "message": "Odczytaj klucz bezpieczeństwa" + }, + "awaitingSecurityKeyInteraction": { + "message": "Oczekiwanie na interakcję z kluczem bezpieczeństwa..." + }, "loginUnavailable": { "message": "Logowanie jest niedostępne" }, @@ -1398,6 +1441,9 @@ "twoStepOptions": { "message": "Opcje logowania dwustopniowego" }, + "selectTwoStepLoginMethod": { + "message": "Wybierz metodę logowania dwustopniowego" + }, "recoveryCodeDesc": { "message": "Utraciłeś dostęp do wszystkich swoich mechanizmów dwustopniowego logowania? Użyj kodów odzyskiwania, aby wyłączyć dwustopniowe logowanie na Twoim koncie." }, @@ -2097,6 +2143,15 @@ "vaultTimeoutAction1": { "message": "Akcja po przekroczeniu limitu czasu" }, + "newCustomizationOptionsCalloutTitle": { + "message": "Nowe opcje dostosowywania" + }, + "newCustomizationOptionsCalloutContent": { + "message": "Dostosuj swój sejf dzięki akcjom szybkiego kopiowania, trybowi kompaktowemu i więcej!" + }, + "newCustomizationOptionsCalloutLink": { + "message": "Zobacz wszystkie ustawienia wyglądu" + }, "lock": { "message": "Zablokuj", "description": "Verb form: to make secure or inaccessible by" @@ -2391,7 +2446,16 @@ "atRiskPasswords": { "message": "Zagrożone hasła" }, - "atRiskPasswordsDescSingleOrg": { + "atRiskPasswordDescSingleOrg": { + "message": "$ORGANIZATION$ prosi o zmianę jednego hasła, ponieważ jest ono zagrożone.", + "placeholders": { + "organization": { + "content": "$1", + "example": "Acme Corp" + } + } + }, + "atRiskPasswordsDescSingleOrgPlural": { "message": "$ORGANIZATION$ prosi o zmianę $COUNT$ haseł, ponieważ są one zagrożone.", "placeholders": { "organization": { @@ -2404,7 +2468,7 @@ } } }, - "atRiskPasswordsDescMultiOrg": { + "atRiskPasswordsDescMultiOrgPlural": { "message": "Twoje organizacje proszą o zmianę $COUNT$ haseł, ponieważ są one zagrożone.", "placeholders": { "count": { @@ -2431,6 +2495,36 @@ "changeAtRiskPasswordsFasterDesc": { "message": "Zaktualizuj swoje ustawienia, aby szybko autouzupełniać hasła i generować nowe" }, + "reviewAtRiskLogins": { + "message": "Przejrzyj zagrożone loginy" + }, + "reviewAtRiskPasswords": { + "message": "Przejrzyj zagrożone hasła" + }, + "reviewAtRiskLoginsSlideDesc": { + "message": "Twoje hasła organizacji są zagrożone, ponieważ są słabe, ponownie używane i/lub narażone.", + "description": "Description of the review at-risk login slide on the at-risk password page carousel" + }, + "reviewAtRiskLoginSlideImgAlt": { + "message": "Ilustracja listy loginów, które są zagrożone" + }, + "generatePasswordSlideDesc": { + "message": "Szybko wygeneruj silne, unikalne hasło z menu autouzupełniania Bitwarden na stronie narażonej na ryzyko.", + "description": "Description of the generate password slide on the at-risk password page carousel" + }, + "generatePasswordSlideImgAlt": { + "message": "Ilustracja menu autouzupełniania Bitwarden pokazująca wygenerowane hasło" + }, + "updateInBitwarden": { + "message": "Aktualizacja w Bitwarden" + }, + "updateInBitwardenSlideDesc": { + "message": "Bitwarden poprosi Cię o aktualizację hasła w menedżerze haseł.", + "description": "Description of the update in Bitwarden slide on the at-risk password page carousel" + }, + "updateInBitwardenSlideImgAlt": { + "message": "Ilustracja powiadomienia Bitwardena, która prosi użytkownika o aktualizację logowania" + }, "turnOnAutofill": { "message": "Włącz autouzupełnienie" }, @@ -4181,6 +4275,20 @@ } } }, + "copyFieldValue": { + "message": "Kopiuj $FIELD$, $VALUE$", + "description": "Title for a button that copies a field value to the clipboard.", + "placeholders": { + "field": { + "content": "$1", + "example": "Username" + }, + "value": { + "content": "$2", + "example": "Foo" + } + } + }, "noValuesToCopy": { "message": "Brak wartości do skopiowania" }, diff --git a/apps/browser/src/_locales/pt_BR/messages.json b/apps/browser/src/_locales/pt_BR/messages.json index 1e0d2f7241c..8066ece4829 100644 --- a/apps/browser/src/_locales/pt_BR/messages.json +++ b/apps/browser/src/_locales/pt_BR/messages.json @@ -80,6 +80,15 @@ "masterPassHint": { "message": "Dica de Senha Mestra (opcional)" }, + "passwordStrengthScore": { + "message": "Password strength score $SCORE$", + "placeholders": { + "score": { + "content": "$1", + "example": "4" + } + } + }, "joinOrganization": { "message": "Juntar-se à organização" }, @@ -876,6 +885,21 @@ "logInToBitwarden": { "message": "Inicie a sessão no Bitwarden" }, + "enterTheCodeSentToYourEmail": { + "message": "Enter the code sent to your email" + }, + "enterTheCodeFromYourAuthenticatorApp": { + "message": "Enter the code from your authenticator app" + }, + "pressYourYubiKeyToAuthenticate": { + "message": "Press your YubiKey to authenticate" + }, + "duoTwoFactorRequiredPageSubtitle": { + "message": "Duo two-step login is required for your account. Follow the steps below to finish logging in." + }, + "followTheStepsBelowToFinishLoggingIn": { + "message": "Follow the steps below to finish logging in." + }, "restartRegistration": { "message": "Reiniciar registro" }, @@ -1365,12 +1389,22 @@ "rememberMe": { "message": "Lembrar de mim" }, + "dontAskAgainOnThisDeviceFor30Days": { + "message": "Don't ask again on this device for 30 days" + }, "sendVerificationCodeEmailAgain": { "message": "Enviar código de verificação para o e-mail novamente" }, "useAnotherTwoStepMethod": { "message": "Utilizar outro método de verificação em duas etapas" }, + "selectAnotherMethod": { + "message": "Select another method", + "description": "Select another two-step login method" + }, + "useYourRecoveryCode": { + "message": "Use your recovery code" + }, "insertYubiKey": { "message": "Insira a sua YubiKey na porta USB do seu computador, e depois toque no botão da mesma." }, @@ -1383,9 +1417,18 @@ "webAuthnNewTabOpen": { "message": "Abrir nova aba" }, + "openInNewTab": { + "message": "Open in new tab" + }, "webAuthnAuthenticate": { "message": "Autenticar WebAuthn" }, + "readSecurityKey": { + "message": "Read security key" + }, + "awaitingSecurityKeyInteraction": { + "message": "Awaiting security key interaction..." + }, "loginUnavailable": { "message": "Sessão Indisponível" }, @@ -1398,6 +1441,9 @@ "twoStepOptions": { "message": "Opções de Login em Duas Etapas" }, + "selectTwoStepLoginMethod": { + "message": "Select two-step login method" + }, "recoveryCodeDesc": { "message": "Perdeu o acesso a todos os seus provedores de duas etapas? Utilize o seu código de recuperação para desativar todos os provedores de duas etapas da sua conta." }, @@ -2097,6 +2143,15 @@ "vaultTimeoutAction1": { "message": "Ação do tempo" }, + "newCustomizationOptionsCalloutTitle": { + "message": "New customization options" + }, + "newCustomizationOptionsCalloutContent": { + "message": "Customize your vault experience with quick copy actions, compact mode, and more!" + }, + "newCustomizationOptionsCalloutLink": { + "message": "View all Appearance settings" + }, "lock": { "message": "Bloquear", "description": "Verb form: to make secure or inaccessible by" @@ -2391,8 +2446,17 @@ "atRiskPasswords": { "message": "At-risk passwords" }, - "atRiskPasswordsDescSingleOrg": { - "message": "$ORGANIZATION$ is requesting you change the $COUNT$ passwords because they are at risk.", + "atRiskPasswordDescSingleOrg": { + "message": "$ORGANIZATION$ is requesting you change one password because it is at-risk.", + "placeholders": { + "organization": { + "content": "$1", + "example": "Acme Corp" + } + } + }, + "atRiskPasswordsDescSingleOrgPlural": { + "message": "$ORGANIZATION$ is requesting you change the $COUNT$ passwords because they are at-risk.", "placeholders": { "organization": { "content": "$1", @@ -2404,8 +2468,8 @@ } } }, - "atRiskPasswordsDescMultiOrg": { - "message": "Your organizations are requesting you change the $COUNT$ passwords because they are at risk.", + "atRiskPasswordsDescMultiOrgPlural": { + "message": "Your organizations are requesting you change the $COUNT$ passwords because they are at-risk.", "placeholders": { "count": { "content": "$1", @@ -2431,6 +2495,36 @@ "changeAtRiskPasswordsFasterDesc": { "message": "Update your settings so you can quickly autofill your passwords and generate new ones" }, + "reviewAtRiskLogins": { + "message": "Review at-risk logins" + }, + "reviewAtRiskPasswords": { + "message": "Review at-risk passwords" + }, + "reviewAtRiskLoginsSlideDesc": { + "message": "Your organization passwords are at-risk because they are weak, reused, and/or exposed.", + "description": "Description of the review at-risk login slide on the at-risk password page carousel" + }, + "reviewAtRiskLoginSlideImgAlt": { + "message": "Illustration of a list of logins that are at-risk" + }, + "generatePasswordSlideDesc": { + "message": "Quickly generate a strong, unique password with the Bitwarden autofill menu on the at-risk site.", + "description": "Description of the generate password slide on the at-risk password page carousel" + }, + "generatePasswordSlideImgAlt": { + "message": "Illustration of the Bitwarden autofill menu displaying a generated password" + }, + "updateInBitwarden": { + "message": "Update in Bitwarden" + }, + "updateInBitwardenSlideDesc": { + "message": "Bitwarden will then prompt you to update the password in the password manager.", + "description": "Description of the update in Bitwarden slide on the at-risk password page carousel" + }, + "updateInBitwardenSlideImgAlt": { + "message": "Illustration of a Bitwarden’s notification prompting the user to update the login" + }, "turnOnAutofill": { "message": "Turn on autofill" }, @@ -4181,6 +4275,20 @@ } } }, + "copyFieldValue": { + "message": "Copy $FIELD$, $VALUE$", + "description": "Title for a button that copies a field value to the clipboard.", + "placeholders": { + "field": { + "content": "$1", + "example": "Username" + }, + "value": { + "content": "$2", + "example": "Foo" + } + } + }, "noValuesToCopy": { "message": "Não há valores para copiar" }, diff --git a/apps/browser/src/_locales/pt_PT/messages.json b/apps/browser/src/_locales/pt_PT/messages.json index 28c1e2661df..007a4092431 100644 --- a/apps/browser/src/_locales/pt_PT/messages.json +++ b/apps/browser/src/_locales/pt_PT/messages.json @@ -80,6 +80,15 @@ "masterPassHint": { "message": "Dica da palavra-passe mestra (opcional)" }, + "passwordStrengthScore": { + "message": "Pontuação da força da palavra-passe: $SCORE$", + "placeholders": { + "score": { + "content": "$1", + "example": "4" + } + } + }, "joinOrganization": { "message": "Aderir à organização" }, @@ -876,6 +885,21 @@ "logInToBitwarden": { "message": "Iniciar sessão no Bitwarden" }, + "enterTheCodeSentToYourEmail": { + "message": "Introduza o código enviado para o seu e-mail" + }, + "enterTheCodeFromYourAuthenticatorApp": { + "message": "Introduza o código da sua app de autenticação" + }, + "pressYourYubiKeyToAuthenticate": { + "message": "Prima a sua YubiKey para se autenticar" + }, + "duoTwoFactorRequiredPageSubtitle": { + "message": "A verificação de dois passos do Duo é necessária para a sua conta. Siga os passos abaixo para concluir o início de sessão." + }, + "followTheStepsBelowToFinishLoggingIn": { + "message": "Siga os passos abaixo para concluir o início de sessão." + }, "restartRegistration": { "message": "Reiniciar registo" }, @@ -1365,12 +1389,22 @@ "rememberMe": { "message": "Memorizar" }, + "dontAskAgainOnThisDeviceFor30Days": { + "message": "Não voltar a perguntar neste dispositivo durante 30 dias" + }, "sendVerificationCodeEmailAgain": { "message": "Enviar e-mail com o código de verificação novamente" }, "useAnotherTwoStepMethod": { "message": "Utilizar outro método de verificação de dois passos" }, + "selectAnotherMethod": { + "message": "Selecionar outro método", + "description": "Select another two-step login method" + }, + "useYourRecoveryCode": { + "message": "Utilize o seu código de recuperação" + }, "insertYubiKey": { "message": "Introduza a sua YubiKey na porta USB do seu computador, depois toque no botão da mesma." }, @@ -1383,9 +1417,18 @@ "webAuthnNewTabOpen": { "message": "Abrir novo separador" }, + "openInNewTab": { + "message": "Abrir num novo separador" + }, "webAuthnAuthenticate": { "message": "Autenticar o WebAuthn" }, + "readSecurityKey": { + "message": "Ler chave de segurança" + }, + "awaitingSecurityKeyInteraction": { + "message": "A aguardar interação da chave de segurança..." + }, "loginUnavailable": { "message": "Início de sessão indisponível" }, @@ -1398,6 +1441,9 @@ "twoStepOptions": { "message": "Opções de verificação de dois passos" }, + "selectTwoStepLoginMethod": { + "message": "Selecionar método de verificação de dois passos" + }, "recoveryCodeDesc": { "message": "Perdeu o acesso a todos os seus fornecedores de verificação de dois passos? Utilize o seu código de recuperação para desativar todos os fornecedores de verificação de dois passos da sua conta." }, @@ -2097,6 +2143,15 @@ "vaultTimeoutAction1": { "message": "Ação de tempo limite" }, + "newCustomizationOptionsCalloutTitle": { + "message": "Novas opções de personalização" + }, + "newCustomizationOptionsCalloutContent": { + "message": "Personalize a sua experiência no cofre com ações de cópia rápida, modo compacto e muito mais!" + }, + "newCustomizationOptionsCalloutLink": { + "message": "Ver todas as definições de Aspeto" + }, "lock": { "message": "Bloquear", "description": "Verb form: to make secure or inaccessible by" @@ -2391,7 +2446,16 @@ "atRiskPasswords": { "message": "Palavras-passe em risco" }, - "atRiskPasswordsDescSingleOrg": { + "atRiskPasswordDescSingleOrg": { + "message": "A $ORGANIZATION$ pede-lhe que altere uma palavra-passe por estarem em risco.", + "placeholders": { + "organization": { + "content": "$1", + "example": "Acme Corp" + } + } + }, + "atRiskPasswordsDescSingleOrgPlural": { "message": "A $ORGANIZATION$ pede-lhe que altere as $COUNT$ palavras-passe por estarem em risco.", "placeholders": { "organization": { @@ -2404,7 +2468,7 @@ } } }, - "atRiskPasswordsDescMultiOrg": { + "atRiskPasswordsDescMultiOrgPlural": { "message": "As suas organizações pedem-lhe que altere as $COUNT$ palavras-passe por estarem em risco.", "placeholders": { "count": { @@ -2431,6 +2495,36 @@ "changeAtRiskPasswordsFasterDesc": { "message": "Atualize as suas definições para poder preencher automaticamente as suas palavras-passe e gerar novas palavras-passe" }, + "reviewAtRiskLogins": { + "message": "Rever credenciais em risco" + }, + "reviewAtRiskPasswords": { + "message": "Rever palavras-passe em risco" + }, + "reviewAtRiskLoginsSlideDesc": { + "message": "As palavras-passe da sua organização estão em risco porque são fracas, reutilizadas e/ou expostas.", + "description": "Description of the review at-risk login slide on the at-risk password page carousel" + }, + "reviewAtRiskLoginSlideImgAlt": { + "message": "Ilustração de uma lista de credenciais que estão em risco" + }, + "generatePasswordSlideDesc": { + "message": "Gira rapidamente uma palavra-passe forte e única com o menu de preenchimento automático do Bitwarden no site em risco.", + "description": "Description of the generate password slide on the at-risk password page carousel" + }, + "generatePasswordSlideImgAlt": { + "message": "Ilustração do menu de preenchimento automático do Bitwarden com uma palavra-passe gerada" + }, + "updateInBitwarden": { + "message": "Atualização no Bitwarden" + }, + "updateInBitwardenSlideDesc": { + "message": "O Bitwarden pedir-lhe-á então para atualizar a palavra-passe no gestor de palavras-passe.", + "description": "Description of the update in Bitwarden slide on the at-risk password page carousel" + }, + "updateInBitwardenSlideImgAlt": { + "message": "Ilustração de uma notificação do Bitwarden a pedir ao utilizador que atualize a credencial" + }, "turnOnAutofill": { "message": "Ativar o preenchimento automático" }, @@ -4181,6 +4275,20 @@ } } }, + "copyFieldValue": { + "message": "Copiar $FIELD$, $VALUE$", + "description": "Title for a button that copies a field value to the clipboard.", + "placeholders": { + "field": { + "content": "$1", + "example": "Username" + }, + "value": { + "content": "$2", + "example": "Foo" + } + } + }, "noValuesToCopy": { "message": "Não há valores a copiar" }, diff --git a/apps/browser/src/_locales/ro/messages.json b/apps/browser/src/_locales/ro/messages.json index c3291112629..8f6b2fdf6bb 100644 --- a/apps/browser/src/_locales/ro/messages.json +++ b/apps/browser/src/_locales/ro/messages.json @@ -80,6 +80,15 @@ "masterPassHint": { "message": "Indiciu pentru parola principală (opțional)" }, + "passwordStrengthScore": { + "message": "Password strength score $SCORE$", + "placeholders": { + "score": { + "content": "$1", + "example": "4" + } + } + }, "joinOrganization": { "message": "Alăturați-vă organizației" }, @@ -876,6 +885,21 @@ "logInToBitwarden": { "message": "Log in to Bitwarden" }, + "enterTheCodeSentToYourEmail": { + "message": "Enter the code sent to your email" + }, + "enterTheCodeFromYourAuthenticatorApp": { + "message": "Enter the code from your authenticator app" + }, + "pressYourYubiKeyToAuthenticate": { + "message": "Press your YubiKey to authenticate" + }, + "duoTwoFactorRequiredPageSubtitle": { + "message": "Duo two-step login is required for your account. Follow the steps below to finish logging in." + }, + "followTheStepsBelowToFinishLoggingIn": { + "message": "Follow the steps below to finish logging in." + }, "restartRegistration": { "message": "Reporniți înregistrarea" }, @@ -1365,12 +1389,22 @@ "rememberMe": { "message": "Memorare autentificare" }, + "dontAskAgainOnThisDeviceFor30Days": { + "message": "Don't ask again on this device for 30 days" + }, "sendVerificationCodeEmailAgain": { "message": "Retrimitere e-mail cu codul de verificare" }, "useAnotherTwoStepMethod": { "message": "Utilizare de metodă diferită de autentificare în două etape" }, + "selectAnotherMethod": { + "message": "Select another method", + "description": "Select another two-step login method" + }, + "useYourRecoveryCode": { + "message": "Use your recovery code" + }, "insertYubiKey": { "message": "Introduceți YubiKey în portul USB al calculatorului apoi apăsați butonul acestuia." }, @@ -1383,9 +1417,18 @@ "webAuthnNewTabOpen": { "message": "Deschideți o filă nouă" }, + "openInNewTab": { + "message": "Open in new tab" + }, "webAuthnAuthenticate": { "message": "Autentificare WebAuthn" }, + "readSecurityKey": { + "message": "Read security key" + }, + "awaitingSecurityKeyInteraction": { + "message": "Awaiting security key interaction..." + }, "loginUnavailable": { "message": "Autentificare indisponibilă" }, @@ -1398,6 +1441,9 @@ "twoStepOptions": { "message": "Opțiuni de autentificare în două etape" }, + "selectTwoStepLoginMethod": { + "message": "Select two-step login method" + }, "recoveryCodeDesc": { "message": "Ați pierdut accesul la toți furnizorii de autentificare în două etape? Utilizați codul de recuperare pentru a dezactiva toți acești furnizori din contul dvs." }, @@ -2097,6 +2143,15 @@ "vaultTimeoutAction1": { "message": "Timeout action" }, + "newCustomizationOptionsCalloutTitle": { + "message": "New customization options" + }, + "newCustomizationOptionsCalloutContent": { + "message": "Customize your vault experience with quick copy actions, compact mode, and more!" + }, + "newCustomizationOptionsCalloutLink": { + "message": "View all Appearance settings" + }, "lock": { "message": "Blocare", "description": "Verb form: to make secure or inaccessible by" @@ -2391,8 +2446,17 @@ "atRiskPasswords": { "message": "At-risk passwords" }, - "atRiskPasswordsDescSingleOrg": { - "message": "$ORGANIZATION$ is requesting you change the $COUNT$ passwords because they are at risk.", + "atRiskPasswordDescSingleOrg": { + "message": "$ORGANIZATION$ is requesting you change one password because it is at-risk.", + "placeholders": { + "organization": { + "content": "$1", + "example": "Acme Corp" + } + } + }, + "atRiskPasswordsDescSingleOrgPlural": { + "message": "$ORGANIZATION$ is requesting you change the $COUNT$ passwords because they are at-risk.", "placeholders": { "organization": { "content": "$1", @@ -2404,8 +2468,8 @@ } } }, - "atRiskPasswordsDescMultiOrg": { - "message": "Your organizations are requesting you change the $COUNT$ passwords because they are at risk.", + "atRiskPasswordsDescMultiOrgPlural": { + "message": "Your organizations are requesting you change the $COUNT$ passwords because they are at-risk.", "placeholders": { "count": { "content": "$1", @@ -2431,6 +2495,36 @@ "changeAtRiskPasswordsFasterDesc": { "message": "Update your settings so you can quickly autofill your passwords and generate new ones" }, + "reviewAtRiskLogins": { + "message": "Review at-risk logins" + }, + "reviewAtRiskPasswords": { + "message": "Review at-risk passwords" + }, + "reviewAtRiskLoginsSlideDesc": { + "message": "Your organization passwords are at-risk because they are weak, reused, and/or exposed.", + "description": "Description of the review at-risk login slide on the at-risk password page carousel" + }, + "reviewAtRiskLoginSlideImgAlt": { + "message": "Illustration of a list of logins that are at-risk" + }, + "generatePasswordSlideDesc": { + "message": "Quickly generate a strong, unique password with the Bitwarden autofill menu on the at-risk site.", + "description": "Description of the generate password slide on the at-risk password page carousel" + }, + "generatePasswordSlideImgAlt": { + "message": "Illustration of the Bitwarden autofill menu displaying a generated password" + }, + "updateInBitwarden": { + "message": "Update in Bitwarden" + }, + "updateInBitwardenSlideDesc": { + "message": "Bitwarden will then prompt you to update the password in the password manager.", + "description": "Description of the update in Bitwarden slide on the at-risk password page carousel" + }, + "updateInBitwardenSlideImgAlt": { + "message": "Illustration of a Bitwarden’s notification prompting the user to update the login" + }, "turnOnAutofill": { "message": "Turn on autofill" }, @@ -4181,6 +4275,20 @@ } } }, + "copyFieldValue": { + "message": "Copy $FIELD$, $VALUE$", + "description": "Title for a button that copies a field value to the clipboard.", + "placeholders": { + "field": { + "content": "$1", + "example": "Username" + }, + "value": { + "content": "$2", + "example": "Foo" + } + } + }, "noValuesToCopy": { "message": "No values to copy" }, diff --git a/apps/browser/src/_locales/ru/messages.json b/apps/browser/src/_locales/ru/messages.json index f1fadb1af0e..71dab1574e7 100644 --- a/apps/browser/src/_locales/ru/messages.json +++ b/apps/browser/src/_locales/ru/messages.json @@ -80,6 +80,15 @@ "masterPassHint": { "message": "Подсказка к мастер-паролю (необяз.)" }, + "passwordStrengthScore": { + "message": "Оценка надежности пароля $SCORE$", + "placeholders": { + "score": { + "content": "$1", + "example": "4" + } + } + }, "joinOrganization": { "message": "Присоединиться к организации" }, @@ -876,6 +885,21 @@ "logInToBitwarden": { "message": "Войти в Bitwarden" }, + "enterTheCodeSentToYourEmail": { + "message": "Введите код, отправленный на ваш email" + }, + "enterTheCodeFromYourAuthenticatorApp": { + "message": "Введите код из приложения-аутентификатора" + }, + "pressYourYubiKeyToAuthenticate": { + "message": "Нажмите на YubiKey для аутентификации" + }, + "duoTwoFactorRequiredPageSubtitle": { + "message": "Duo two-step login is required for your account. Follow the steps below to finish logging in." + }, + "followTheStepsBelowToFinishLoggingIn": { + "message": "Следуйте указаниям ниже, чтобы завершить авторизацию." + }, "restartRegistration": { "message": "Перезапустить регистрацию" }, @@ -1365,12 +1389,22 @@ "rememberMe": { "message": "Запомнить меня" }, + "dontAskAgainOnThisDeviceFor30Days": { + "message": "Не спрашивать на этом устройстве в течение 30 дней" + }, "sendVerificationCodeEmailAgain": { "message": "Отправить код подтверждения еще раз" }, "useAnotherTwoStepMethod": { "message": "Использовать другой метод двухэтапной аутентификации" }, + "selectAnotherMethod": { + "message": "Выбрать другой способ", + "description": "Select another two-step login method" + }, + "useYourRecoveryCode": { + "message": "Использовать код восстановления" + }, "insertYubiKey": { "message": "Вставьте свой YubiKey в USB-порт компьютера и нажмите его кнопку." }, @@ -1383,9 +1417,18 @@ "webAuthnNewTabOpen": { "message": "Открыть новую вкладку" }, + "openInNewTab": { + "message": "Открыть в новой вкладке" + }, "webAuthnAuthenticate": { "message": "Аутентификация WebAutn" }, + "readSecurityKey": { + "message": "Считать ключ безопасности" + }, + "awaitingSecurityKeyInteraction": { + "message": "Ожидание взаимодействия с ключом безопасности..." + }, "loginUnavailable": { "message": "Вход недоступен" }, @@ -1398,6 +1441,9 @@ "twoStepOptions": { "message": "Настройки двухэтапной аутентификации" }, + "selectTwoStepLoginMethod": { + "message": "Выбрать другой метод двухэтапной аутентификации" + }, "recoveryCodeDesc": { "message": "Потеряли доступ ко всем вариантам двухэтапной аутентификации? Используйте код восстановления, чтобы отключить двухэтапную аутентификацию для вашей учетной записи." }, @@ -2097,6 +2143,15 @@ "vaultTimeoutAction1": { "message": "Тайм-аут действия" }, + "newCustomizationOptionsCalloutTitle": { + "message": "Новые возможности настроек" + }, + "newCustomizationOptionsCalloutContent": { + "message": "Настройте работу с хранилищем с помощью действий быстрого копирования, компактного режима и многого другого!" + }, + "newCustomizationOptionsCalloutLink": { + "message": "Посмотреть все настройки внешнего вида" + }, "lock": { "message": "Блокировка", "description": "Verb form: to make secure or inaccessible by" @@ -2391,8 +2446,17 @@ "atRiskPasswords": { "message": "Пароли, подверженные риску" }, - "atRiskPasswordsDescSingleOrg": { - "message": "$ORGANIZATION$ is requesting you change the $COUNT$ passwords because they are at risk.", + "atRiskPasswordDescSingleOrg": { + "message": "$ORGANIZATION$ запрашивает смену одного пароля, так как он находится под угрозой.", + "placeholders": { + "organization": { + "content": "$1", + "example": "Acme Corp" + } + } + }, + "atRiskPasswordsDescSingleOrgPlural": { + "message": "$ORGANIZATION$ запрашивает смену $COUNT$ паролей, так как они находятся под угрозой.", "placeholders": { "organization": { "content": "$1", @@ -2404,8 +2468,8 @@ } } }, - "atRiskPasswordsDescMultiOrg": { - "message": "Your organizations are requesting you change the $COUNT$ passwords because they are at risk.", + "atRiskPasswordsDescMultiOrgPlural": { + "message": "Ваша организация запрашивает смену $COUNT$ паролей, так как они находятся под угрозой.", "placeholders": { "count": { "content": "$1", @@ -2431,6 +2495,36 @@ "changeAtRiskPasswordsFasterDesc": { "message": "Update your settings so you can quickly autofill your passwords and generate new ones" }, + "reviewAtRiskLogins": { + "message": "Обзор логинов, находящихся под угрозой" + }, + "reviewAtRiskPasswords": { + "message": "Обзор паролей, находящихся под угрозой" + }, + "reviewAtRiskLoginsSlideDesc": { + "message": "Пароли вашей организации находятся под угрозой, потому что они слабые, повторно используются и/или раскрыты.", + "description": "Description of the review at-risk login slide on the at-risk password page carousel" + }, + "reviewAtRiskLoginSlideImgAlt": { + "message": "Иллюстрация списка логинов, которые находятся под угрозой" + }, + "generatePasswordSlideDesc": { + "message": "Быстро сгенерируйте надежный уникальный пароль с помощью меню автозаполнения Bitwarden на сайте, находящемся под угрозой.", + "description": "Description of the generate password slide on the at-risk password page carousel" + }, + "generatePasswordSlideImgAlt": { + "message": "Иллюстрация меню автозаполнения Bitwarden, отображающего сгенерированный пароль" + }, + "updateInBitwarden": { + "message": "Обновить в Bitwarden" + }, + "updateInBitwardenSlideDesc": { + "message": "После этого Bitwarden предложит вам обновить пароль в менеджере паролей.", + "description": "Description of the update in Bitwarden slide on the at-risk password page carousel" + }, + "updateInBitwardenSlideImgAlt": { + "message": "Иллюстрация уведомления Bitwarden, предлагающего пользователю обновить логин" + }, "turnOnAutofill": { "message": "Turn on autofill" }, @@ -4181,6 +4275,20 @@ } } }, + "copyFieldValue": { + "message": "Скопировать $FIELD$, $VALUE$", + "description": "Title for a button that copies a field value to the clipboard.", + "placeholders": { + "field": { + "content": "$1", + "example": "Username" + }, + "value": { + "content": "$2", + "example": "Foo" + } + } + }, "noValuesToCopy": { "message": "Нет значений для копирования" }, diff --git a/apps/browser/src/_locales/si/messages.json b/apps/browser/src/_locales/si/messages.json index dfab38fd25d..07d252dde4e 100644 --- a/apps/browser/src/_locales/si/messages.json +++ b/apps/browser/src/_locales/si/messages.json @@ -80,6 +80,15 @@ "masterPassHint": { "message": "ප්රධාන මුරපදය ඉඟියක් (විකල්ප)" }, + "passwordStrengthScore": { + "message": "Password strength score $SCORE$", + "placeholders": { + "score": { + "content": "$1", + "example": "4" + } + } + }, "joinOrganization": { "message": "Join organization" }, @@ -876,6 +885,21 @@ "logInToBitwarden": { "message": "Log in to Bitwarden" }, + "enterTheCodeSentToYourEmail": { + "message": "Enter the code sent to your email" + }, + "enterTheCodeFromYourAuthenticatorApp": { + "message": "Enter the code from your authenticator app" + }, + "pressYourYubiKeyToAuthenticate": { + "message": "Press your YubiKey to authenticate" + }, + "duoTwoFactorRequiredPageSubtitle": { + "message": "Duo two-step login is required for your account. Follow the steps below to finish logging in." + }, + "followTheStepsBelowToFinishLoggingIn": { + "message": "Follow the steps below to finish logging in." + }, "restartRegistration": { "message": "Restart registration" }, @@ -1365,12 +1389,22 @@ "rememberMe": { "message": "මාව මතක තබා ගන්න" }, + "dontAskAgainOnThisDeviceFor30Days": { + "message": "Don't ask again on this device for 30 days" + }, "sendVerificationCodeEmailAgain": { "message": "සත්යාපන කේතය නැවත විද්යුත් තැපෑල යවන්න" }, "useAnotherTwoStepMethod": { "message": "තවත් පියවර දෙකක පිවිසුම් ක්රමයක් භාවිතා කරන්න" }, + "selectAnotherMethod": { + "message": "Select another method", + "description": "Select another two-step login method" + }, + "useYourRecoveryCode": { + "message": "Use your recovery code" + }, "insertYubiKey": { "message": "ඔබේ පරිගණකයේ USB පෝට් එකට ඔබගේ YuBiKey ඇතුල් කරන්න, ඉන්පසු එහි බොත්තම ස්පර්ශ කරන්න." }, @@ -1383,9 +1417,18 @@ "webAuthnNewTabOpen": { "message": "නව ටැබය විවෘත කරන්න" }, + "openInNewTab": { + "message": "Open in new tab" + }, "webAuthnAuthenticate": { "message": "සත්‍යවත් වෙබ් සත්‍යවත් කරන්න" }, + "readSecurityKey": { + "message": "Read security key" + }, + "awaitingSecurityKeyInteraction": { + "message": "Awaiting security key interaction..." + }, "loginUnavailable": { "message": "ලොගින් වන්න ලබාගත නොහැක" }, @@ -1398,6 +1441,9 @@ "twoStepOptions": { "message": "ද්වි-පියවර ලොගින් වන්න විකල්ප" }, + "selectTwoStepLoginMethod": { + "message": "Select two-step login method" + }, "recoveryCodeDesc": { "message": "ඔබගේ ද්වි-සාධක සපයන්නන් සියලු ප්රවේශ අහිමි? ඔබගේ ගිණුමෙන් සියලුම ද්වි-සාධක සපයන්නන් අක්රීය කිරීමට ඔබගේ ප්රතිසාධන කේතය භාවිතා කරන්න." }, @@ -2097,6 +2143,15 @@ "vaultTimeoutAction1": { "message": "Timeout action" }, + "newCustomizationOptionsCalloutTitle": { + "message": "New customization options" + }, + "newCustomizationOptionsCalloutContent": { + "message": "Customize your vault experience with quick copy actions, compact mode, and more!" + }, + "newCustomizationOptionsCalloutLink": { + "message": "View all Appearance settings" + }, "lock": { "message": "අගුල", "description": "Verb form: to make secure or inaccessible by" @@ -2391,8 +2446,17 @@ "atRiskPasswords": { "message": "At-risk passwords" }, - "atRiskPasswordsDescSingleOrg": { - "message": "$ORGANIZATION$ is requesting you change the $COUNT$ passwords because they are at risk.", + "atRiskPasswordDescSingleOrg": { + "message": "$ORGANIZATION$ is requesting you change one password because it is at-risk.", + "placeholders": { + "organization": { + "content": "$1", + "example": "Acme Corp" + } + } + }, + "atRiskPasswordsDescSingleOrgPlural": { + "message": "$ORGANIZATION$ is requesting you change the $COUNT$ passwords because they are at-risk.", "placeholders": { "organization": { "content": "$1", @@ -2404,8 +2468,8 @@ } } }, - "atRiskPasswordsDescMultiOrg": { - "message": "Your organizations are requesting you change the $COUNT$ passwords because they are at risk.", + "atRiskPasswordsDescMultiOrgPlural": { + "message": "Your organizations are requesting you change the $COUNT$ passwords because they are at-risk.", "placeholders": { "count": { "content": "$1", @@ -2431,6 +2495,36 @@ "changeAtRiskPasswordsFasterDesc": { "message": "Update your settings so you can quickly autofill your passwords and generate new ones" }, + "reviewAtRiskLogins": { + "message": "Review at-risk logins" + }, + "reviewAtRiskPasswords": { + "message": "Review at-risk passwords" + }, + "reviewAtRiskLoginsSlideDesc": { + "message": "Your organization passwords are at-risk because they are weak, reused, and/or exposed.", + "description": "Description of the review at-risk login slide on the at-risk password page carousel" + }, + "reviewAtRiskLoginSlideImgAlt": { + "message": "Illustration of a list of logins that are at-risk" + }, + "generatePasswordSlideDesc": { + "message": "Quickly generate a strong, unique password with the Bitwarden autofill menu on the at-risk site.", + "description": "Description of the generate password slide on the at-risk password page carousel" + }, + "generatePasswordSlideImgAlt": { + "message": "Illustration of the Bitwarden autofill menu displaying a generated password" + }, + "updateInBitwarden": { + "message": "Update in Bitwarden" + }, + "updateInBitwardenSlideDesc": { + "message": "Bitwarden will then prompt you to update the password in the password manager.", + "description": "Description of the update in Bitwarden slide on the at-risk password page carousel" + }, + "updateInBitwardenSlideImgAlt": { + "message": "Illustration of a Bitwarden’s notification prompting the user to update the login" + }, "turnOnAutofill": { "message": "Turn on autofill" }, @@ -4181,6 +4275,20 @@ } } }, + "copyFieldValue": { + "message": "Copy $FIELD$, $VALUE$", + "description": "Title for a button that copies a field value to the clipboard.", + "placeholders": { + "field": { + "content": "$1", + "example": "Username" + }, + "value": { + "content": "$2", + "example": "Foo" + } + } + }, "noValuesToCopy": { "message": "No values to copy" }, diff --git a/apps/browser/src/_locales/sk/messages.json b/apps/browser/src/_locales/sk/messages.json index 512f18b697c..efdf9b6177d 100644 --- a/apps/browser/src/_locales/sk/messages.json +++ b/apps/browser/src/_locales/sk/messages.json @@ -80,6 +80,15 @@ "masterPassHint": { "message": "Nápoveď k hlavnému heslu (voliteľné)" }, + "passwordStrengthScore": { + "message": "Sila hesla $SCORE$", + "placeholders": { + "score": { + "content": "$1", + "example": "4" + } + } + }, "joinOrganization": { "message": "Pripojte sa k organizácii" }, @@ -876,6 +885,21 @@ "logInToBitwarden": { "message": "Prihlásenie do Bitwardenu" }, + "enterTheCodeSentToYourEmail": { + "message": "Zadajte kód zaslaný na váš e-mail" + }, + "enterTheCodeFromYourAuthenticatorApp": { + "message": "Zadajte kód z overovacej aplikácie" + }, + "pressYourYubiKeyToAuthenticate": { + "message": "Stlačte YubiKey na overenie" + }, + "duoTwoFactorRequiredPageSubtitle": { + "message": "Pre váš účet sa vyžaduje dvojstupňové prihlásenie Duo. Na dokončenie prihlásenie nasledujte pokyny." + }, + "followTheStepsBelowToFinishLoggingIn": { + "message": "Na dokončenie prihlásenia postupujte podľa pokynov." + }, "restartRegistration": { "message": "Zopakovať registráciu" }, @@ -1365,12 +1389,22 @@ "rememberMe": { "message": "Zapamätať si ma" }, + "dontAskAgainOnThisDeviceFor30Days": { + "message": "Nepýtať sa znova na tomto zariadení 30 dní" + }, "sendVerificationCodeEmailAgain": { "message": "Znovu zaslať overovací kód emailom" }, "useAnotherTwoStepMethod": { "message": "Použiť inú dvojstupňovú metódu prihlásenia" }, + "selectAnotherMethod": { + "message": "Vyberte iný spôsob", + "description": "Select another two-step login method" + }, + "useYourRecoveryCode": { + "message": "Použiť obnovovací kód" + }, "insertYubiKey": { "message": "Vložte váš YubiKey do USB portu počítača a stlačte jeho tlačidlo." }, @@ -1383,9 +1417,18 @@ "webAuthnNewTabOpen": { "message": "Otvoriť v novej karte" }, + "openInNewTab": { + "message": "Otvoriť v novej karte" + }, "webAuthnAuthenticate": { "message": "Overiť cez WebAuthn" }, + "readSecurityKey": { + "message": "Prečítať bezpečnostný kľúč" + }, + "awaitingSecurityKeyInteraction": { + "message": "Čaká sa na interakciu s bezpečnostným kľúčom..." + }, "loginUnavailable": { "message": "Prihlásenie nie je dispozícii" }, @@ -1398,6 +1441,9 @@ "twoStepOptions": { "message": "Možnosti dvojstupňového prihlásenia" }, + "selectTwoStepLoginMethod": { + "message": "Vyberte metódu dvojstupňového prihlásenia" + }, "recoveryCodeDesc": { "message": "Stratili ste prístup ku všetkým vašim dvojstupňovým poskytovateľom? Použite váš záchranný kód pre vypnutie všetkých poskytovateľov vo vašom účte." }, @@ -2097,6 +2143,15 @@ "vaultTimeoutAction1": { "message": "Akcia pri vypršaní časového limitu" }, + "newCustomizationOptionsCalloutTitle": { + "message": "Nové možnosti prispôsobenia" + }, + "newCustomizationOptionsCalloutContent": { + "message": "Prispôsobte si trezor pomocou akcií rýchleho kopírovania, kompaktného režimu a ďalších možností!" + }, + "newCustomizationOptionsCalloutLink": { + "message": "Zobraziť všetky nastavenia vzhľadu" + }, "lock": { "message": "Uzamknúť", "description": "Verb form: to make secure or inaccessible by" @@ -2391,8 +2446,17 @@ "atRiskPasswords": { "message": "Rizikové heslá" }, - "atRiskPasswordsDescSingleOrg": { - "message": "$ORGANIZATION$ vás žiada o zmenu $COUNT$ hesiel, pretože sú ohrozené.", + "atRiskPasswordDescSingleOrg": { + "message": "$ORGANIZATION$ is requesting you change one password because it is at-risk.", + "placeholders": { + "organization": { + "content": "$1", + "example": "Acme Corp" + } + } + }, + "atRiskPasswordsDescSingleOrgPlural": { + "message": "$ORGANIZATION$ is requesting you change the $COUNT$ passwords because they are at-risk.", "placeholders": { "organization": { "content": "$1", @@ -2404,8 +2468,8 @@ } } }, - "atRiskPasswordsDescMultiOrg": { - "message": "Vaše organizácie vás žiadajú o zmenu $COUNT$ hesiel, pretože sú ohrozené.", + "atRiskPasswordsDescMultiOrgPlural": { + "message": "Your organizations are requesting you change the $COUNT$ passwords because they are at-risk.", "placeholders": { "count": { "content": "$1", @@ -2431,6 +2495,36 @@ "changeAtRiskPasswordsFasterDesc": { "message": "Aktualizujte nastavenia, aby ste mohli rýchlo vypĺňať svoje heslá a vygenerovať nové" }, + "reviewAtRiskLogins": { + "message": "Prehľad ohrozených prihlasovacích mien" + }, + "reviewAtRiskPasswords": { + "message": "Prehľad ohrozených hesiel" + }, + "reviewAtRiskLoginsSlideDesc": { + "message": "Heslá vašej organizácie sú v ohrození, pretože sú slabé, opakovane používané a/alebo uniknuté.", + "description": "Description of the review at-risk login slide on the at-risk password page carousel" + }, + "reviewAtRiskLoginSlideImgAlt": { + "message": "Príklady zoznamu prihlásení, ktoré sú ohrozené" + }, + "generatePasswordSlideDesc": { + "message": "Rýchlo generujte silné, jedinečné heslo pomocu ponuky automatického vypĺňania Bitwardenu na ohrozených stránkach.", + "description": "Description of the generate password slide on the at-risk password page carousel" + }, + "generatePasswordSlideImgAlt": { + "message": "Príklad ponuky automatického vypĺňania Bitwardenu zobrazujúca vygenerované heslo" + }, + "updateInBitwarden": { + "message": "Aktualizovať v Bitwardene" + }, + "updateInBitwardenSlideDesc": { + "message": "Bitwarden vás vyzve na aktualizáciu hesla v správcovi hesiel.", + "description": "Description of the update in Bitwarden slide on the at-risk password page carousel" + }, + "updateInBitwardenSlideImgAlt": { + "message": "Príklad upozornenia Bitwardenu na aktualizovanie prihlasovacích údajov" + }, "turnOnAutofill": { "message": "Zapnúť automatické vypĺňanie" }, @@ -4181,6 +4275,20 @@ } } }, + "copyFieldValue": { + "message": "Kopírovať $FIELD$, $VALUE$", + "description": "Title for a button that copies a field value to the clipboard.", + "placeholders": { + "field": { + "content": "$1", + "example": "Username" + }, + "value": { + "content": "$2", + "example": "Foo" + } + } + }, "noValuesToCopy": { "message": "Nie je čo kopírovať" }, diff --git a/apps/browser/src/_locales/sl/messages.json b/apps/browser/src/_locales/sl/messages.json index b1c20934758..2023ecbd5f1 100644 --- a/apps/browser/src/_locales/sl/messages.json +++ b/apps/browser/src/_locales/sl/messages.json @@ -80,6 +80,15 @@ "masterPassHint": { "message": "Namig za glavno geslo (neobvezno)" }, + "passwordStrengthScore": { + "message": "Password strength score $SCORE$", + "placeholders": { + "score": { + "content": "$1", + "example": "4" + } + } + }, "joinOrganization": { "message": "Join organization" }, @@ -876,6 +885,21 @@ "logInToBitwarden": { "message": "Log in to Bitwarden" }, + "enterTheCodeSentToYourEmail": { + "message": "Enter the code sent to your email" + }, + "enterTheCodeFromYourAuthenticatorApp": { + "message": "Enter the code from your authenticator app" + }, + "pressYourYubiKeyToAuthenticate": { + "message": "Press your YubiKey to authenticate" + }, + "duoTwoFactorRequiredPageSubtitle": { + "message": "Duo two-step login is required for your account. Follow the steps below to finish logging in." + }, + "followTheStepsBelowToFinishLoggingIn": { + "message": "Follow the steps below to finish logging in." + }, "restartRegistration": { "message": "Restart registration" }, @@ -1365,12 +1389,22 @@ "rememberMe": { "message": "Zapomni si me" }, + "dontAskAgainOnThisDeviceFor30Days": { + "message": "Don't ask again on this device for 30 days" + }, "sendVerificationCodeEmailAgain": { "message": "Ponovno pošlji verifikacijsko kodo na email" }, "useAnotherTwoStepMethod": { "message": "Uporabi drugi način prijave v dveh korakih" }, + "selectAnotherMethod": { + "message": "Select another method", + "description": "Select another two-step login method" + }, + "useYourRecoveryCode": { + "message": "Use your recovery code" + }, "insertYubiKey": { "message": "Priključi svoj YubiKey v USB priključek, nato pa pritisni na njegovo tipko." }, @@ -1383,9 +1417,18 @@ "webAuthnNewTabOpen": { "message": "Odpri nov zavihek" }, + "openInNewTab": { + "message": "Open in new tab" + }, "webAuthnAuthenticate": { "message": "Authenticate WebAuthn" }, + "readSecurityKey": { + "message": "Read security key" + }, + "awaitingSecurityKeyInteraction": { + "message": "Awaiting security key interaction..." + }, "loginUnavailable": { "message": "Prijava ni na voljo" }, @@ -1398,6 +1441,9 @@ "twoStepOptions": { "message": "Možnosti dvostopenjske prijave" }, + "selectTwoStepLoginMethod": { + "message": "Select two-step login method" + }, "recoveryCodeDesc": { "message": "Ste izgubili dostop do vseh ponudnikov dvostopenjske prijave? Uporabite svojo kodo za obnovitev in tako onemogočite dvostopenjsko prijavo v svoj račun." }, @@ -2097,6 +2143,15 @@ "vaultTimeoutAction1": { "message": "Timeout action" }, + "newCustomizationOptionsCalloutTitle": { + "message": "New customization options" + }, + "newCustomizationOptionsCalloutContent": { + "message": "Customize your vault experience with quick copy actions, compact mode, and more!" + }, + "newCustomizationOptionsCalloutLink": { + "message": "View all Appearance settings" + }, "lock": { "message": "Zaklepanje", "description": "Verb form: to make secure or inaccessible by" @@ -2391,8 +2446,17 @@ "atRiskPasswords": { "message": "At-risk passwords" }, - "atRiskPasswordsDescSingleOrg": { - "message": "$ORGANIZATION$ is requesting you change the $COUNT$ passwords because they are at risk.", + "atRiskPasswordDescSingleOrg": { + "message": "$ORGANIZATION$ is requesting you change one password because it is at-risk.", + "placeholders": { + "organization": { + "content": "$1", + "example": "Acme Corp" + } + } + }, + "atRiskPasswordsDescSingleOrgPlural": { + "message": "$ORGANIZATION$ is requesting you change the $COUNT$ passwords because they are at-risk.", "placeholders": { "organization": { "content": "$1", @@ -2404,8 +2468,8 @@ } } }, - "atRiskPasswordsDescMultiOrg": { - "message": "Your organizations are requesting you change the $COUNT$ passwords because they are at risk.", + "atRiskPasswordsDescMultiOrgPlural": { + "message": "Your organizations are requesting you change the $COUNT$ passwords because they are at-risk.", "placeholders": { "count": { "content": "$1", @@ -2431,6 +2495,36 @@ "changeAtRiskPasswordsFasterDesc": { "message": "Update your settings so you can quickly autofill your passwords and generate new ones" }, + "reviewAtRiskLogins": { + "message": "Review at-risk logins" + }, + "reviewAtRiskPasswords": { + "message": "Review at-risk passwords" + }, + "reviewAtRiskLoginsSlideDesc": { + "message": "Your organization passwords are at-risk because they are weak, reused, and/or exposed.", + "description": "Description of the review at-risk login slide on the at-risk password page carousel" + }, + "reviewAtRiskLoginSlideImgAlt": { + "message": "Illustration of a list of logins that are at-risk" + }, + "generatePasswordSlideDesc": { + "message": "Quickly generate a strong, unique password with the Bitwarden autofill menu on the at-risk site.", + "description": "Description of the generate password slide on the at-risk password page carousel" + }, + "generatePasswordSlideImgAlt": { + "message": "Illustration of the Bitwarden autofill menu displaying a generated password" + }, + "updateInBitwarden": { + "message": "Update in Bitwarden" + }, + "updateInBitwardenSlideDesc": { + "message": "Bitwarden will then prompt you to update the password in the password manager.", + "description": "Description of the update in Bitwarden slide on the at-risk password page carousel" + }, + "updateInBitwardenSlideImgAlt": { + "message": "Illustration of a Bitwarden’s notification prompting the user to update the login" + }, "turnOnAutofill": { "message": "Turn on autofill" }, @@ -4181,6 +4275,20 @@ } } }, + "copyFieldValue": { + "message": "Copy $FIELD$, $VALUE$", + "description": "Title for a button that copies a field value to the clipboard.", + "placeholders": { + "field": { + "content": "$1", + "example": "Username" + }, + "value": { + "content": "$2", + "example": "Foo" + } + } + }, "noValuesToCopy": { "message": "No values to copy" }, diff --git a/apps/browser/src/_locales/sr/messages.json b/apps/browser/src/_locales/sr/messages.json index d20e904d5b9..8d35a517bc8 100644 --- a/apps/browser/src/_locales/sr/messages.json +++ b/apps/browser/src/_locales/sr/messages.json @@ -80,6 +80,15 @@ "masterPassHint": { "message": "Савет Главне Лозинке (опционо)" }, + "passwordStrengthScore": { + "message": "Снага лозинкe $SCORE$", + "placeholders": { + "score": { + "content": "$1", + "example": "4" + } + } + }, "joinOrganization": { "message": "Придружи Организацију" }, @@ -177,7 +186,7 @@ "message": "Копирати белешке" }, "copy": { - "message": "Copy", + "message": "Копирај", "description": "Copy to clipboard" }, "fill": { @@ -876,6 +885,21 @@ "logInToBitwarden": { "message": "Пријавите се на Bitwarden" }, + "enterTheCodeSentToYourEmail": { + "message": "Унесите кôд послат на ваш имејл" + }, + "enterTheCodeFromYourAuthenticatorApp": { + "message": "Унесите кôд из апликације за аутентификацију" + }, + "pressYourYubiKeyToAuthenticate": { + "message": "Стисните Ваш YubiKey за аутентификацију" + }, + "duoTwoFactorRequiredPageSubtitle": { + "message": "За ваш налог је потребан два корака. Следите наведене кораке да бисте завршили пријављивање." + }, + "followTheStepsBelowToFinishLoggingIn": { + "message": "Следите наведене кораке да бисте завршили пријављивање." + }, "restartRegistration": { "message": "Поново покрените регистрацију" }, @@ -1030,7 +1054,7 @@ "message": "Кликните на ставке за ауто-попуњавање у приказу сефа" }, "clickToAutofill": { - "message": "Click items in autofill suggestion to fill" + "message": "Кликните на ставке у ауто-пуњење предлогу за попуњавање" }, "clearClipboard": { "message": "Обриши привремену меморију", @@ -1365,12 +1389,22 @@ "rememberMe": { "message": "Запамти ме" }, + "dontAskAgainOnThisDeviceFor30Days": { + "message": "Не питајте поново на овом уређају 30 дана" + }, "sendVerificationCodeEmailAgain": { "message": "Поново послати верификациони код на имејл" }, "useAnotherTwoStepMethod": { "message": "Користите другу методу пријављивања у два корака" }, + "selectAnotherMethod": { + "message": "Изаберите другу методу", + "description": "Select another two-step login method" + }, + "useYourRecoveryCode": { + "message": "Употребите шифру за опоравак" + }, "insertYubiKey": { "message": "Убаците свој YubiKey у УСБ порт рачунара, а затим додирните његово дугме." }, @@ -1383,9 +1417,18 @@ "webAuthnNewTabOpen": { "message": "Отвори нови језичак " }, + "openInNewTab": { + "message": "Отвори у новом језичку" + }, "webAuthnAuthenticate": { "message": "WebAutn аутентификација" }, + "readSecurityKey": { + "message": "Читај сигурносни кључ" + }, + "awaitingSecurityKeyInteraction": { + "message": "Чека се интеракција сигурносног кључа..." + }, "loginUnavailable": { "message": "Пријава недоступна" }, @@ -1398,6 +1441,9 @@ "twoStepOptions": { "message": "Опције дво-коракне пријаве" }, + "selectTwoStepLoginMethod": { + "message": "Одабрати методу пријављивања у два корака" + }, "recoveryCodeDesc": { "message": "Изгубили сте приступ свим својим двофакторским добављачима? Употребите код за опоравак да онемогућите све двофакторске добављаче из налога." }, @@ -2089,7 +2135,7 @@ "description": "This will be used as part of a larger sentence, broken up to include the generator icon. The full sentence will read 'Use the generator [GENERATOR_ICON] to create a strong unique password'" }, "vaultCustomization": { - "message": "Vault customization" + "message": "Прилагођавање сефа" }, "vaultTimeoutAction": { "message": "Акција на тајмаут сефа" @@ -2097,6 +2143,15 @@ "vaultTimeoutAction1": { "message": "Акција тајмаута" }, + "newCustomizationOptionsCalloutTitle": { + "message": "Нове опције прилагођавања" + }, + "newCustomizationOptionsCalloutContent": { + "message": "Прилагодите своје искуство сефа помоћу брзих акција копирања, компактног режима и још много тога!" + }, + "newCustomizationOptionsCalloutLink": { + "message": "Погледајте сва подешавања изглед" + }, "lock": { "message": "Закључај", "description": "Verb form: to make secure or inaccessible by" @@ -2356,7 +2411,7 @@ "message": "Блокирани домени" }, "learnMoreAboutBlockedDomains": { - "message": "Learn more about blocked domains" + "message": "Сазнајте више о блокираним доменима" }, "excludedDomains": { "message": "Изузети домени" @@ -2377,10 +2432,10 @@ "message": "Промените ово у подешавањима" }, "change": { - "message": "Change" + "message": "Промени" }, "changeButtonTitle": { - "message": "Change password - $ITEMNAME$", + "message": "Промена лозинке - $ITEMNAME$", "placeholders": { "itemname": { "content": "$1", @@ -2389,10 +2444,19 @@ } }, "atRiskPasswords": { - "message": "At-risk passwords" + "message": "Лозинке под ризиком" }, - "atRiskPasswordsDescSingleOrg": { - "message": "$ORGANIZATION$ is requesting you change the $COUNT$ passwords because they are at risk.", + "atRiskPasswordDescSingleOrg": { + "message": "$ORGANIZATION$ is requesting you change one password because it is at-risk.", + "placeholders": { + "organization": { + "content": "$1", + "example": "Acme Corp" + } + } + }, + "atRiskPasswordsDescSingleOrgPlural": { + "message": "$ORGANIZATION$ is requesting you change the $COUNT$ passwords because they are at-risk.", "placeholders": { "organization": { "content": "$1", @@ -2404,8 +2468,8 @@ } } }, - "atRiskPasswordsDescMultiOrg": { - "message": "Your organizations are requesting you change the $COUNT$ passwords because they are at risk.", + "atRiskPasswordsDescMultiOrgPlural": { + "message": "Your organizations are requesting you change the $COUNT$ passwords because they are at-risk.", "placeholders": { "count": { "content": "$1", @@ -2414,10 +2478,10 @@ } }, "reviewAndChangeAtRiskPassword": { - "message": "Review and change one at-risk password" + "message": "Прегледајте и промените једну лозинку за ризик" }, "reviewAndChangeAtRiskPasswordsPlural": { - "message": "Review and change $COUNT$ at-risk passwords", + "message": "Прегледајте и промените лозинке под ризиком: $COUNT$", "placeholders": { "count": { "content": "$1", @@ -2426,19 +2490,49 @@ } }, "changeAtRiskPasswordsFaster": { - "message": "Change at-risk passwords faster" + "message": "Брже промените лозинке за ризик" }, "changeAtRiskPasswordsFasterDesc": { - "message": "Update your settings so you can quickly autofill your passwords and generate new ones" + "message": "Ажурирајте поставке да бисте брзо поставили лозинке и генерисати нове" + }, + "reviewAtRiskLogins": { + "message": "Review at-risk logins" + }, + "reviewAtRiskPasswords": { + "message": "Review at-risk passwords" + }, + "reviewAtRiskLoginsSlideDesc": { + "message": "Your organization passwords are at-risk because they are weak, reused, and/or exposed.", + "description": "Description of the review at-risk login slide on the at-risk password page carousel" + }, + "reviewAtRiskLoginSlideImgAlt": { + "message": "Illustration of a list of logins that are at-risk" + }, + "generatePasswordSlideDesc": { + "message": "Quickly generate a strong, unique password with the Bitwarden autofill menu on the at-risk site.", + "description": "Description of the generate password slide on the at-risk password page carousel" + }, + "generatePasswordSlideImgAlt": { + "message": "Illustration of the Bitwarden autofill menu displaying a generated password" + }, + "updateInBitwarden": { + "message": "Update in Bitwarden" + }, + "updateInBitwardenSlideDesc": { + "message": "Bitwarden will then prompt you to update the password in the password manager.", + "description": "Description of the update in Bitwarden slide on the at-risk password page carousel" + }, + "updateInBitwardenSlideImgAlt": { + "message": "Illustration of a Bitwarden’s notification prompting the user to update the login" }, "turnOnAutofill": { - "message": "Turn on autofill" + "message": "Омогућите ауто-пуњење" }, "turnedOnAutofill": { - "message": "Turned on autofill" + "message": "Ауто-пуњење упаљено" }, "dismiss": { - "message": "Dismiss" + "message": "Одбаци" }, "websiteItemLabel": { "message": "Сајт $number$ (УРЛ)", @@ -3045,7 +3139,7 @@ } }, "forwaderInvalidOperation": { - "message": "$SERVICENAME$ refused your request. Please contact your service provider for assistance.", + "message": "$SERVICENAME$ одбио ваш захтев. Обратите се свом провајдеру сервиса за помоћ.", "description": "Displayed when the user is forbidden from using the API by the forwarding service.", "placeholders": { "servicename": { @@ -3055,7 +3149,7 @@ } }, "forwaderInvalidOperationWithMessage": { - "message": "$SERVICENAME$ refused your request: $ERRORMESSAGE$", + "message": "$SERVICENAME$ одбио ваш захтев: $ERRORMESSAGE$", "description": "Displayed when the user is forbidden from using the API by the forwarding service with an error message.", "placeholders": { "servicename": { @@ -4181,6 +4275,20 @@ } } }, + "copyFieldValue": { + "message": "Копирај $FIELD$, $VALUE$", + "description": "Title for a button that copies a field value to the clipboard.", + "placeholders": { + "field": { + "content": "$1", + "example": "Username" + }, + "value": { + "content": "$2", + "example": "Foo" + } + } + }, "noValuesToCopy": { "message": "Нема вредности за копирање" }, diff --git a/apps/browser/src/_locales/sv/messages.json b/apps/browser/src/_locales/sv/messages.json index 15e2160b9d2..d501572be76 100644 --- a/apps/browser/src/_locales/sv/messages.json +++ b/apps/browser/src/_locales/sv/messages.json @@ -80,6 +80,15 @@ "masterPassHint": { "message": "Huvudlösenordsledtråd (valfri)" }, + "passwordStrengthScore": { + "message": "Password strength score $SCORE$", + "placeholders": { + "score": { + "content": "$1", + "example": "4" + } + } + }, "joinOrganization": { "message": "Gå med i organisation" }, @@ -177,7 +186,7 @@ "message": "Kopiera anteckningar" }, "copy": { - "message": "Copy", + "message": "Kopiera", "description": "Copy to clipboard" }, "fill": { @@ -876,6 +885,21 @@ "logInToBitwarden": { "message": "Logga in på Bitwarden" }, + "enterTheCodeSentToYourEmail": { + "message": "Enter the code sent to your email" + }, + "enterTheCodeFromYourAuthenticatorApp": { + "message": "Enter the code from your authenticator app" + }, + "pressYourYubiKeyToAuthenticate": { + "message": "Press your YubiKey to authenticate" + }, + "duoTwoFactorRequiredPageSubtitle": { + "message": "Duo two-step login is required for your account. Follow the steps below to finish logging in." + }, + "followTheStepsBelowToFinishLoggingIn": { + "message": "Follow the steps below to finish logging in." + }, "restartRegistration": { "message": "Restart registration" }, @@ -1365,12 +1389,22 @@ "rememberMe": { "message": "Kom ihåg mig" }, + "dontAskAgainOnThisDeviceFor30Days": { + "message": "Don't ask again on this device for 30 days" + }, "sendVerificationCodeEmailAgain": { "message": "Skicka e-postmeddelandet med verifieringskoden igen" }, "useAnotherTwoStepMethod": { "message": "Använd en annan inloggningsmetod för tvåstegsverifiering" }, + "selectAnotherMethod": { + "message": "Select another method", + "description": "Select another two-step login method" + }, + "useYourRecoveryCode": { + "message": "Use your recovery code" + }, "insertYubiKey": { "message": "Sätt i din YubiKey i en av datorns USB-portar och sätt fingret på knappen." }, @@ -1383,9 +1417,18 @@ "webAuthnNewTabOpen": { "message": "Öppna ny flik" }, + "openInNewTab": { + "message": "Open in new tab" + }, "webAuthnAuthenticate": { "message": "Autentisera WebAuthn" }, + "readSecurityKey": { + "message": "Read security key" + }, + "awaitingSecurityKeyInteraction": { + "message": "Awaiting security key interaction..." + }, "loginUnavailable": { "message": "Inloggning ej tillgänglig" }, @@ -1398,6 +1441,9 @@ "twoStepOptions": { "message": "Alternativ för tvåstegsverifiering" }, + "selectTwoStepLoginMethod": { + "message": "Select two-step login method" + }, "recoveryCodeDesc": { "message": "Förlorat åtkomst till alla dina metoder för tvåstegsverifiering? Använd din återställningskod för att inaktivera tvåstegsverifiering på ditt konto." }, @@ -2097,6 +2143,15 @@ "vaultTimeoutAction1": { "message": "Timeout action" }, + "newCustomizationOptionsCalloutTitle": { + "message": "New customization options" + }, + "newCustomizationOptionsCalloutContent": { + "message": "Customize your vault experience with quick copy actions, compact mode, and more!" + }, + "newCustomizationOptionsCalloutLink": { + "message": "View all Appearance settings" + }, "lock": { "message": "Lås", "description": "Verb form: to make secure or inaccessible by" @@ -2391,8 +2446,17 @@ "atRiskPasswords": { "message": "At-risk passwords" }, - "atRiskPasswordsDescSingleOrg": { - "message": "$ORGANIZATION$ is requesting you change the $COUNT$ passwords because they are at risk.", + "atRiskPasswordDescSingleOrg": { + "message": "$ORGANIZATION$ is requesting you change one password because it is at-risk.", + "placeholders": { + "organization": { + "content": "$1", + "example": "Acme Corp" + } + } + }, + "atRiskPasswordsDescSingleOrgPlural": { + "message": "$ORGANIZATION$ is requesting you change the $COUNT$ passwords because they are at-risk.", "placeholders": { "organization": { "content": "$1", @@ -2404,8 +2468,8 @@ } } }, - "atRiskPasswordsDescMultiOrg": { - "message": "Your organizations are requesting you change the $COUNT$ passwords because they are at risk.", + "atRiskPasswordsDescMultiOrgPlural": { + "message": "Your organizations are requesting you change the $COUNT$ passwords because they are at-risk.", "placeholders": { "count": { "content": "$1", @@ -2431,6 +2495,36 @@ "changeAtRiskPasswordsFasterDesc": { "message": "Update your settings so you can quickly autofill your passwords and generate new ones" }, + "reviewAtRiskLogins": { + "message": "Review at-risk logins" + }, + "reviewAtRiskPasswords": { + "message": "Review at-risk passwords" + }, + "reviewAtRiskLoginsSlideDesc": { + "message": "Your organization passwords are at-risk because they are weak, reused, and/or exposed.", + "description": "Description of the review at-risk login slide on the at-risk password page carousel" + }, + "reviewAtRiskLoginSlideImgAlt": { + "message": "Illustration of a list of logins that are at-risk" + }, + "generatePasswordSlideDesc": { + "message": "Quickly generate a strong, unique password with the Bitwarden autofill menu on the at-risk site.", + "description": "Description of the generate password slide on the at-risk password page carousel" + }, + "generatePasswordSlideImgAlt": { + "message": "Illustration of the Bitwarden autofill menu displaying a generated password" + }, + "updateInBitwarden": { + "message": "Update in Bitwarden" + }, + "updateInBitwardenSlideDesc": { + "message": "Bitwarden will then prompt you to update the password in the password manager.", + "description": "Description of the update in Bitwarden slide on the at-risk password page carousel" + }, + "updateInBitwardenSlideImgAlt": { + "message": "Illustration of a Bitwarden’s notification prompting the user to update the login" + }, "turnOnAutofill": { "message": "Turn on autofill" }, @@ -4181,6 +4275,20 @@ } } }, + "copyFieldValue": { + "message": "Copy $FIELD$, $VALUE$", + "description": "Title for a button that copies a field value to the clipboard.", + "placeholders": { + "field": { + "content": "$1", + "example": "Username" + }, + "value": { + "content": "$2", + "example": "Foo" + } + } + }, "noValuesToCopy": { "message": "No values to copy" }, diff --git a/apps/browser/src/_locales/te/messages.json b/apps/browser/src/_locales/te/messages.json index 9fe497bc1c7..41ca7e5dcd2 100644 --- a/apps/browser/src/_locales/te/messages.json +++ b/apps/browser/src/_locales/te/messages.json @@ -80,6 +80,15 @@ "masterPassHint": { "message": "Master password hint (optional)" }, + "passwordStrengthScore": { + "message": "Password strength score $SCORE$", + "placeholders": { + "score": { + "content": "$1", + "example": "4" + } + } + }, "joinOrganization": { "message": "Join organization" }, @@ -876,6 +885,21 @@ "logInToBitwarden": { "message": "Log in to Bitwarden" }, + "enterTheCodeSentToYourEmail": { + "message": "Enter the code sent to your email" + }, + "enterTheCodeFromYourAuthenticatorApp": { + "message": "Enter the code from your authenticator app" + }, + "pressYourYubiKeyToAuthenticate": { + "message": "Press your YubiKey to authenticate" + }, + "duoTwoFactorRequiredPageSubtitle": { + "message": "Duo two-step login is required for your account. Follow the steps below to finish logging in." + }, + "followTheStepsBelowToFinishLoggingIn": { + "message": "Follow the steps below to finish logging in." + }, "restartRegistration": { "message": "Restart registration" }, @@ -1365,12 +1389,22 @@ "rememberMe": { "message": "Remember me" }, + "dontAskAgainOnThisDeviceFor30Days": { + "message": "Don't ask again on this device for 30 days" + }, "sendVerificationCodeEmailAgain": { "message": "Send verification code email again" }, "useAnotherTwoStepMethod": { "message": "Use another two-step login method" }, + "selectAnotherMethod": { + "message": "Select another method", + "description": "Select another two-step login method" + }, + "useYourRecoveryCode": { + "message": "Use your recovery code" + }, "insertYubiKey": { "message": "Insert your YubiKey into your computer's USB port, then touch its button." }, @@ -1383,9 +1417,18 @@ "webAuthnNewTabOpen": { "message": "Open new tab" }, + "openInNewTab": { + "message": "Open in new tab" + }, "webAuthnAuthenticate": { "message": "Authenticate WebAuthn" }, + "readSecurityKey": { + "message": "Read security key" + }, + "awaitingSecurityKeyInteraction": { + "message": "Awaiting security key interaction..." + }, "loginUnavailable": { "message": "Login unavailable" }, @@ -1398,6 +1441,9 @@ "twoStepOptions": { "message": "Two-step login options" }, + "selectTwoStepLoginMethod": { + "message": "Select two-step login method" + }, "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." }, @@ -2097,6 +2143,15 @@ "vaultTimeoutAction1": { "message": "Timeout action" }, + "newCustomizationOptionsCalloutTitle": { + "message": "New customization options" + }, + "newCustomizationOptionsCalloutContent": { + "message": "Customize your vault experience with quick copy actions, compact mode, and more!" + }, + "newCustomizationOptionsCalloutLink": { + "message": "View all Appearance settings" + }, "lock": { "message": "Lock", "description": "Verb form: to make secure or inaccessible by" @@ -2391,8 +2446,17 @@ "atRiskPasswords": { "message": "At-risk passwords" }, - "atRiskPasswordsDescSingleOrg": { - "message": "$ORGANIZATION$ is requesting you change the $COUNT$ passwords because they are at risk.", + "atRiskPasswordDescSingleOrg": { + "message": "$ORGANIZATION$ is requesting you change one password because it is at-risk.", + "placeholders": { + "organization": { + "content": "$1", + "example": "Acme Corp" + } + } + }, + "atRiskPasswordsDescSingleOrgPlural": { + "message": "$ORGANIZATION$ is requesting you change the $COUNT$ passwords because they are at-risk.", "placeholders": { "organization": { "content": "$1", @@ -2404,8 +2468,8 @@ } } }, - "atRiskPasswordsDescMultiOrg": { - "message": "Your organizations are requesting you change the $COUNT$ passwords because they are at risk.", + "atRiskPasswordsDescMultiOrgPlural": { + "message": "Your organizations are requesting you change the $COUNT$ passwords because they are at-risk.", "placeholders": { "count": { "content": "$1", @@ -2431,6 +2495,36 @@ "changeAtRiskPasswordsFasterDesc": { "message": "Update your settings so you can quickly autofill your passwords and generate new ones" }, + "reviewAtRiskLogins": { + "message": "Review at-risk logins" + }, + "reviewAtRiskPasswords": { + "message": "Review at-risk passwords" + }, + "reviewAtRiskLoginsSlideDesc": { + "message": "Your organization passwords are at-risk because they are weak, reused, and/or exposed.", + "description": "Description of the review at-risk login slide on the at-risk password page carousel" + }, + "reviewAtRiskLoginSlideImgAlt": { + "message": "Illustration of a list of logins that are at-risk" + }, + "generatePasswordSlideDesc": { + "message": "Quickly generate a strong, unique password with the Bitwarden autofill menu on the at-risk site.", + "description": "Description of the generate password slide on the at-risk password page carousel" + }, + "generatePasswordSlideImgAlt": { + "message": "Illustration of the Bitwarden autofill menu displaying a generated password" + }, + "updateInBitwarden": { + "message": "Update in Bitwarden" + }, + "updateInBitwardenSlideDesc": { + "message": "Bitwarden will then prompt you to update the password in the password manager.", + "description": "Description of the update in Bitwarden slide on the at-risk password page carousel" + }, + "updateInBitwardenSlideImgAlt": { + "message": "Illustration of a Bitwarden’s notification prompting the user to update the login" + }, "turnOnAutofill": { "message": "Turn on autofill" }, @@ -4181,6 +4275,20 @@ } } }, + "copyFieldValue": { + "message": "Copy $FIELD$, $VALUE$", + "description": "Title for a button that copies a field value to the clipboard.", + "placeholders": { + "field": { + "content": "$1", + "example": "Username" + }, + "value": { + "content": "$2", + "example": "Foo" + } + } + }, "noValuesToCopy": { "message": "No values to copy" }, diff --git a/apps/browser/src/_locales/th/messages.json b/apps/browser/src/_locales/th/messages.json index d37c7fc7a21..e2a9b099baf 100644 --- a/apps/browser/src/_locales/th/messages.json +++ b/apps/browser/src/_locales/th/messages.json @@ -80,6 +80,15 @@ "masterPassHint": { "message": "Master Password Hint (optional)" }, + "passwordStrengthScore": { + "message": "Password strength score $SCORE$", + "placeholders": { + "score": { + "content": "$1", + "example": "4" + } + } + }, "joinOrganization": { "message": "Join organization" }, @@ -876,6 +885,21 @@ "logInToBitwarden": { "message": "Log in to Bitwarden" }, + "enterTheCodeSentToYourEmail": { + "message": "Enter the code sent to your email" + }, + "enterTheCodeFromYourAuthenticatorApp": { + "message": "Enter the code from your authenticator app" + }, + "pressYourYubiKeyToAuthenticate": { + "message": "Press your YubiKey to authenticate" + }, + "duoTwoFactorRequiredPageSubtitle": { + "message": "Duo two-step login is required for your account. Follow the steps below to finish logging in." + }, + "followTheStepsBelowToFinishLoggingIn": { + "message": "Follow the steps below to finish logging in." + }, "restartRegistration": { "message": "Restart registration" }, @@ -1365,12 +1389,22 @@ "rememberMe": { "message": "Remember me" }, + "dontAskAgainOnThisDeviceFor30Days": { + "message": "Don't ask again on this device for 30 days" + }, "sendVerificationCodeEmailAgain": { "message": "ส่งโค้ดยืนยันไปยังอีเมลอีกครั้ง" }, "useAnotherTwoStepMethod": { "message": "Use another two-step login method" }, + "selectAnotherMethod": { + "message": "Select another method", + "description": "Select another two-step login method" + }, + "useYourRecoveryCode": { + "message": "Use your recovery code" + }, "insertYubiKey": { "message": "Insert your YubiKey into your computer's USB port, then touch its button." }, @@ -1383,9 +1417,18 @@ "webAuthnNewTabOpen": { "message": "Open new tab" }, + "openInNewTab": { + "message": "Open in new tab" + }, "webAuthnAuthenticate": { "message": "Authenticate WebAuthn" }, + "readSecurityKey": { + "message": "Read security key" + }, + "awaitingSecurityKeyInteraction": { + "message": "Awaiting security key interaction..." + }, "loginUnavailable": { "message": "Login Unavailable" }, @@ -1398,6 +1441,9 @@ "twoStepOptions": { "message": "Two-step Login Options" }, + "selectTwoStepLoginMethod": { + "message": "Select two-step login method" + }, "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." }, @@ -2097,6 +2143,15 @@ "vaultTimeoutAction1": { "message": "Timeout action" }, + "newCustomizationOptionsCalloutTitle": { + "message": "New customization options" + }, + "newCustomizationOptionsCalloutContent": { + "message": "Customize your vault experience with quick copy actions, compact mode, and more!" + }, + "newCustomizationOptionsCalloutLink": { + "message": "View all Appearance settings" + }, "lock": { "message": "ล็อก", "description": "Verb form: to make secure or inaccessible by" @@ -2391,8 +2446,17 @@ "atRiskPasswords": { "message": "At-risk passwords" }, - "atRiskPasswordsDescSingleOrg": { - "message": "$ORGANIZATION$ is requesting you change the $COUNT$ passwords because they are at risk.", + "atRiskPasswordDescSingleOrg": { + "message": "$ORGANIZATION$ is requesting you change one password because it is at-risk.", + "placeholders": { + "organization": { + "content": "$1", + "example": "Acme Corp" + } + } + }, + "atRiskPasswordsDescSingleOrgPlural": { + "message": "$ORGANIZATION$ is requesting you change the $COUNT$ passwords because they are at-risk.", "placeholders": { "organization": { "content": "$1", @@ -2404,8 +2468,8 @@ } } }, - "atRiskPasswordsDescMultiOrg": { - "message": "Your organizations are requesting you change the $COUNT$ passwords because they are at risk.", + "atRiskPasswordsDescMultiOrgPlural": { + "message": "Your organizations are requesting you change the $COUNT$ passwords because they are at-risk.", "placeholders": { "count": { "content": "$1", @@ -2431,6 +2495,36 @@ "changeAtRiskPasswordsFasterDesc": { "message": "Update your settings so you can quickly autofill your passwords and generate new ones" }, + "reviewAtRiskLogins": { + "message": "Review at-risk logins" + }, + "reviewAtRiskPasswords": { + "message": "Review at-risk passwords" + }, + "reviewAtRiskLoginsSlideDesc": { + "message": "Your organization passwords are at-risk because they are weak, reused, and/or exposed.", + "description": "Description of the review at-risk login slide on the at-risk password page carousel" + }, + "reviewAtRiskLoginSlideImgAlt": { + "message": "Illustration of a list of logins that are at-risk" + }, + "generatePasswordSlideDesc": { + "message": "Quickly generate a strong, unique password with the Bitwarden autofill menu on the at-risk site.", + "description": "Description of the generate password slide on the at-risk password page carousel" + }, + "generatePasswordSlideImgAlt": { + "message": "Illustration of the Bitwarden autofill menu displaying a generated password" + }, + "updateInBitwarden": { + "message": "Update in Bitwarden" + }, + "updateInBitwardenSlideDesc": { + "message": "Bitwarden will then prompt you to update the password in the password manager.", + "description": "Description of the update in Bitwarden slide on the at-risk password page carousel" + }, + "updateInBitwardenSlideImgAlt": { + "message": "Illustration of a Bitwarden’s notification prompting the user to update the login" + }, "turnOnAutofill": { "message": "Turn on autofill" }, @@ -4181,6 +4275,20 @@ } } }, + "copyFieldValue": { + "message": "Copy $FIELD$, $VALUE$", + "description": "Title for a button that copies a field value to the clipboard.", + "placeholders": { + "field": { + "content": "$1", + "example": "Username" + }, + "value": { + "content": "$2", + "example": "Foo" + } + } + }, "noValuesToCopy": { "message": "No values to copy" }, diff --git a/apps/browser/src/_locales/tr/messages.json b/apps/browser/src/_locales/tr/messages.json index acabe8a5688..6087b05bedb 100644 --- a/apps/browser/src/_locales/tr/messages.json +++ b/apps/browser/src/_locales/tr/messages.json @@ -80,6 +80,15 @@ "masterPassHint": { "message": "Ana parola ipucu (isteğe bağlı)" }, + "passwordStrengthScore": { + "message": "Password strength score $SCORE$", + "placeholders": { + "score": { + "content": "$1", + "example": "4" + } + } + }, "joinOrganization": { "message": "Kuruluşa katıl" }, @@ -876,6 +885,21 @@ "logInToBitwarden": { "message": "Bitwarden'a giriş yapın" }, + "enterTheCodeSentToYourEmail": { + "message": "E-posta adresinize gönderilen kodu girin" + }, + "enterTheCodeFromYourAuthenticatorApp": { + "message": "Kimlik doğrulama uygulamanızdaki kodu girin" + }, + "pressYourYubiKeyToAuthenticate": { + "message": "Press your YubiKey to authenticate" + }, + "duoTwoFactorRequiredPageSubtitle": { + "message": "Duo two-step login is required for your account. Follow the steps below to finish logging in." + }, + "followTheStepsBelowToFinishLoggingIn": { + "message": "Follow the steps below to finish logging in." + }, "restartRegistration": { "message": "Kaydı yeniden başlat" }, @@ -1365,12 +1389,22 @@ "rememberMe": { "message": "Beni hatırla" }, + "dontAskAgainOnThisDeviceFor30Days": { + "message": "Don't ask again on this device for 30 days" + }, "sendVerificationCodeEmailAgain": { "message": "Doğrulama kodunu yeniden gönder" }, "useAnotherTwoStepMethod": { "message": "Başka bir iki aşamalı giriş yöntemini kullan" }, + "selectAnotherMethod": { + "message": "Select another method", + "description": "Select another two-step login method" + }, + "useYourRecoveryCode": { + "message": "Use your recovery code" + }, "insertYubiKey": { "message": "YubiKey'i bilgisayarınızın USB portuna takın, ardından düğmesine dokunun." }, @@ -1383,9 +1417,18 @@ "webAuthnNewTabOpen": { "message": "Yeni sekme aç" }, + "openInNewTab": { + "message": "Yeni sekmede aç" + }, "webAuthnAuthenticate": { "message": "WebAutn ile doğrula" }, + "readSecurityKey": { + "message": "Read security key" + }, + "awaitingSecurityKeyInteraction": { + "message": "Awaiting security key interaction..." + }, "loginUnavailable": { "message": "Giriş yapılamıyor" }, @@ -1398,6 +1441,9 @@ "twoStepOptions": { "message": "İki aşamalı giriş seçenekleri" }, + "selectTwoStepLoginMethod": { + "message": "Select two-step login method" + }, "recoveryCodeDesc": { "message": "İki aşamalı doğrulama sağlayıcılarınıza ulaşamıyor musunuz? Kurtarma kodunuzu kullanarak hesabınızdaki tüm iki aşamalı giriş sağlayıcılarını devre dışı bırakabilirsiniz." }, @@ -2097,6 +2143,15 @@ "vaultTimeoutAction1": { "message": "Zaman aşımı eylemi" }, + "newCustomizationOptionsCalloutTitle": { + "message": "Yeni özelleştirme seçenekleri" + }, + "newCustomizationOptionsCalloutContent": { + "message": "Customize your vault experience with quick copy actions, compact mode, and more!" + }, + "newCustomizationOptionsCalloutLink": { + "message": "View all Appearance settings" + }, "lock": { "message": "Kilitle", "description": "Verb form: to make secure or inaccessible by" @@ -2391,8 +2446,17 @@ "atRiskPasswords": { "message": "Riskli parolalar" }, - "atRiskPasswordsDescSingleOrg": { - "message": "$ORGANIZATION$ is requesting you change the $COUNT$ passwords because they are at risk.", + "atRiskPasswordDescSingleOrg": { + "message": "$ORGANIZATION$ is requesting you change one password because it is at-risk.", + "placeholders": { + "organization": { + "content": "$1", + "example": "Acme Corp" + } + } + }, + "atRiskPasswordsDescSingleOrgPlural": { + "message": "$ORGANIZATION$ is requesting you change the $COUNT$ passwords because they are at-risk.", "placeholders": { "organization": { "content": "$1", @@ -2404,8 +2468,8 @@ } } }, - "atRiskPasswordsDescMultiOrg": { - "message": "Your organizations are requesting you change the $COUNT$ passwords because they are at risk.", + "atRiskPasswordsDescMultiOrgPlural": { + "message": "Your organizations are requesting you change the $COUNT$ passwords because they are at-risk.", "placeholders": { "count": { "content": "$1", @@ -2431,6 +2495,36 @@ "changeAtRiskPasswordsFasterDesc": { "message": "Update your settings so you can quickly autofill your passwords and generate new ones" }, + "reviewAtRiskLogins": { + "message": "Review at-risk logins" + }, + "reviewAtRiskPasswords": { + "message": "Review at-risk passwords" + }, + "reviewAtRiskLoginsSlideDesc": { + "message": "Your organization passwords are at-risk because they are weak, reused, and/or exposed.", + "description": "Description of the review at-risk login slide on the at-risk password page carousel" + }, + "reviewAtRiskLoginSlideImgAlt": { + "message": "Illustration of a list of logins that are at-risk" + }, + "generatePasswordSlideDesc": { + "message": "Quickly generate a strong, unique password with the Bitwarden autofill menu on the at-risk site.", + "description": "Description of the generate password slide on the at-risk password page carousel" + }, + "generatePasswordSlideImgAlt": { + "message": "Illustration of the Bitwarden autofill menu displaying a generated password" + }, + "updateInBitwarden": { + "message": "Update in Bitwarden" + }, + "updateInBitwardenSlideDesc": { + "message": "Bitwarden will then prompt you to update the password in the password manager.", + "description": "Description of the update in Bitwarden slide on the at-risk password page carousel" + }, + "updateInBitwardenSlideImgAlt": { + "message": "Illustration of a Bitwarden’s notification prompting the user to update the login" + }, "turnOnAutofill": { "message": "Otomatik doldurmayı etkinleştir" }, @@ -4181,6 +4275,20 @@ } } }, + "copyFieldValue": { + "message": "Kopyala: $FIELD$, $VALUE$", + "description": "Title for a button that copies a field value to the clipboard.", + "placeholders": { + "field": { + "content": "$1", + "example": "Username" + }, + "value": { + "content": "$2", + "example": "Foo" + } + } + }, "noValuesToCopy": { "message": "Kopyalanacak değer yok" }, diff --git a/apps/browser/src/_locales/uk/messages.json b/apps/browser/src/_locales/uk/messages.json index abe0a082e88..7568eff9ea4 100644 --- a/apps/browser/src/_locales/uk/messages.json +++ b/apps/browser/src/_locales/uk/messages.json @@ -80,6 +80,15 @@ "masterPassHint": { "message": "Підказка для головного пароля (необов'язково)" }, + "passwordStrengthScore": { + "message": "Password strength score $SCORE$", + "placeholders": { + "score": { + "content": "$1", + "example": "4" + } + } + }, "joinOrganization": { "message": "Приєднатися до організації" }, @@ -876,6 +885,21 @@ "logInToBitwarden": { "message": "Увійти в Bitwarden" }, + "enterTheCodeSentToYourEmail": { + "message": "Enter the code sent to your email" + }, + "enterTheCodeFromYourAuthenticatorApp": { + "message": "Enter the code from your authenticator app" + }, + "pressYourYubiKeyToAuthenticate": { + "message": "Press your YubiKey to authenticate" + }, + "duoTwoFactorRequiredPageSubtitle": { + "message": "Duo two-step login is required for your account. Follow the steps below to finish logging in." + }, + "followTheStepsBelowToFinishLoggingIn": { + "message": "Follow the steps below to finish logging in." + }, "restartRegistration": { "message": "Перезапустити реєстрацію" }, @@ -1365,12 +1389,22 @@ "rememberMe": { "message": "Запам'ятати мене" }, + "dontAskAgainOnThisDeviceFor30Days": { + "message": "Don't ask again on this device for 30 days" + }, "sendVerificationCodeEmailAgain": { "message": "Надіслати код підтвердження ще раз" }, "useAnotherTwoStepMethod": { "message": "Інший спосіб двоетапної перевірки" }, + "selectAnotherMethod": { + "message": "Select another method", + "description": "Select another two-step login method" + }, + "useYourRecoveryCode": { + "message": "Use your recovery code" + }, "insertYubiKey": { "message": "Вставте свій YubiKey в USB порт комп'ютера, потім торкніться цієї кнопки." }, @@ -1383,9 +1417,18 @@ "webAuthnNewTabOpen": { "message": "Відкрити нову вкладку" }, + "openInNewTab": { + "message": "Open in new tab" + }, "webAuthnAuthenticate": { "message": "Автентифікація WebAuthn" }, + "readSecurityKey": { + "message": "Read security key" + }, + "awaitingSecurityKeyInteraction": { + "message": "Awaiting security key interaction..." + }, "loginUnavailable": { "message": "Вхід недоступний" }, @@ -1398,6 +1441,9 @@ "twoStepOptions": { "message": "Налаштування двоетапної перевірки" }, + "selectTwoStepLoginMethod": { + "message": "Select two-step login method" + }, "recoveryCodeDesc": { "message": "Втратили доступ до всіх провайдерів двоетапної перевірки? Скористайтеся кодом відновлення, щоб вимкнути двоетапну перевірку для свого облікового запису." }, @@ -2097,6 +2143,15 @@ "vaultTimeoutAction1": { "message": "Дія після часу очікування" }, + "newCustomizationOptionsCalloutTitle": { + "message": "New customization options" + }, + "newCustomizationOptionsCalloutContent": { + "message": "Customize your vault experience with quick copy actions, compact mode, and more!" + }, + "newCustomizationOptionsCalloutLink": { + "message": "View all Appearance settings" + }, "lock": { "message": "Блокувати", "description": "Verb form: to make secure or inaccessible by" @@ -2391,8 +2446,17 @@ "atRiskPasswords": { "message": "Ризиковані паролі" }, - "atRiskPasswordsDescSingleOrg": { - "message": "$ORGANIZATION$ вимагає зміни $COUNT$ паролів, оскільки вони ризиковані.", + "atRiskPasswordDescSingleOrg": { + "message": "$ORGANIZATION$ is requesting you change one password because it is at-risk.", + "placeholders": { + "organization": { + "content": "$1", + "example": "Acme Corp" + } + } + }, + "atRiskPasswordsDescSingleOrgPlural": { + "message": "$ORGANIZATION$ is requesting you change the $COUNT$ passwords because they are at-risk.", "placeholders": { "organization": { "content": "$1", @@ -2404,8 +2468,8 @@ } } }, - "atRiskPasswordsDescMultiOrg": { - "message": "Ваші організації вимагають зміни $COUNT$ паролів, оскільки вони ризиковані.", + "atRiskPasswordsDescMultiOrgPlural": { + "message": "Your organizations are requesting you change the $COUNT$ passwords because they are at-risk.", "placeholders": { "count": { "content": "$1", @@ -2431,6 +2495,36 @@ "changeAtRiskPasswordsFasterDesc": { "message": "Оновіть налаштування, щоб швидше автоматично заповнювати й створювати паролі" }, + "reviewAtRiskLogins": { + "message": "Review at-risk logins" + }, + "reviewAtRiskPasswords": { + "message": "Review at-risk passwords" + }, + "reviewAtRiskLoginsSlideDesc": { + "message": "Your organization passwords are at-risk because they are weak, reused, and/or exposed.", + "description": "Description of the review at-risk login slide on the at-risk password page carousel" + }, + "reviewAtRiskLoginSlideImgAlt": { + "message": "Illustration of a list of logins that are at-risk" + }, + "generatePasswordSlideDesc": { + "message": "Quickly generate a strong, unique password with the Bitwarden autofill menu on the at-risk site.", + "description": "Description of the generate password slide on the at-risk password page carousel" + }, + "generatePasswordSlideImgAlt": { + "message": "Illustration of the Bitwarden autofill menu displaying a generated password" + }, + "updateInBitwarden": { + "message": "Update in Bitwarden" + }, + "updateInBitwardenSlideDesc": { + "message": "Bitwarden will then prompt you to update the password in the password manager.", + "description": "Description of the update in Bitwarden slide on the at-risk password page carousel" + }, + "updateInBitwardenSlideImgAlt": { + "message": "Illustration of a Bitwarden’s notification prompting the user to update the login" + }, "turnOnAutofill": { "message": "Увімкніть автозаповнення" }, @@ -4181,6 +4275,20 @@ } } }, + "copyFieldValue": { + "message": "Copy $FIELD$, $VALUE$", + "description": "Title for a button that copies a field value to the clipboard.", + "placeholders": { + "field": { + "content": "$1", + "example": "Username" + }, + "value": { + "content": "$2", + "example": "Foo" + } + } + }, "noValuesToCopy": { "message": "Немає значень для копіювання" }, diff --git a/apps/browser/src/_locales/vi/messages.json b/apps/browser/src/_locales/vi/messages.json index f4164e66ee2..8e7bc5545f2 100644 --- a/apps/browser/src/_locales/vi/messages.json +++ b/apps/browser/src/_locales/vi/messages.json @@ -80,6 +80,15 @@ "masterPassHint": { "message": "Gợi ý mật khẩu chính (tùy chọn)" }, + "passwordStrengthScore": { + "message": "Password strength score $SCORE$", + "placeholders": { + "score": { + "content": "$1", + "example": "4" + } + } + }, "joinOrganization": { "message": "Tham gia tổ chức" }, @@ -876,6 +885,21 @@ "logInToBitwarden": { "message": "Log in to Bitwarden" }, + "enterTheCodeSentToYourEmail": { + "message": "Enter the code sent to your email" + }, + "enterTheCodeFromYourAuthenticatorApp": { + "message": "Enter the code from your authenticator app" + }, + "pressYourYubiKeyToAuthenticate": { + "message": "Press your YubiKey to authenticate" + }, + "duoTwoFactorRequiredPageSubtitle": { + "message": "Duo two-step login is required for your account. Follow the steps below to finish logging in." + }, + "followTheStepsBelowToFinishLoggingIn": { + "message": "Follow the steps below to finish logging in." + }, "restartRegistration": { "message": "Tiến hành đăng ký lại" }, @@ -1365,12 +1389,22 @@ "rememberMe": { "message": "Ghi nhớ đăng nhập" }, + "dontAskAgainOnThisDeviceFor30Days": { + "message": "Don't ask again on this device for 30 days" + }, "sendVerificationCodeEmailAgain": { "message": "Gửi lại email chứa mã xác nhận" }, "useAnotherTwoStepMethod": { "message": "Sử dụng phương pháp đăng nhập 2 bước khác" }, + "selectAnotherMethod": { + "message": "Select another method", + "description": "Select another two-step login method" + }, + "useYourRecoveryCode": { + "message": "Use your recovery code" + }, "insertYubiKey": { "message": "Lắp YubiKey vào cổng USB máy tính của bạn, sau đó chạm vào nút trên nó." }, @@ -1383,9 +1417,18 @@ "webAuthnNewTabOpen": { "message": "Mở thẻ mới" }, + "openInNewTab": { + "message": "Open in new tab" + }, "webAuthnAuthenticate": { "message": "Xác thực WebAuthn" }, + "readSecurityKey": { + "message": "Read security key" + }, + "awaitingSecurityKeyInteraction": { + "message": "Awaiting security key interaction..." + }, "loginUnavailable": { "message": "Đăng nhập không có sẵn" }, @@ -1398,6 +1441,9 @@ "twoStepOptions": { "message": "Tùy chọn xác thực hai lớp" }, + "selectTwoStepLoginMethod": { + "message": "Select two-step login method" + }, "recoveryCodeDesc": { "message": "Bạn mất quyền truy cập vào tất cả các dịch vụ xác thực 2 lớp? Sử dụng mã phục hồi của bạn để vô hiệu hóa tất cả các dịch vụ xác thực hai lớp trong tài khoản của bạn." }, @@ -2097,6 +2143,15 @@ "vaultTimeoutAction1": { "message": "Timeout action" }, + "newCustomizationOptionsCalloutTitle": { + "message": "New customization options" + }, + "newCustomizationOptionsCalloutContent": { + "message": "Customize your vault experience with quick copy actions, compact mode, and more!" + }, + "newCustomizationOptionsCalloutLink": { + "message": "View all Appearance settings" + }, "lock": { "message": "Khóa", "description": "Verb form: to make secure or inaccessible by" @@ -2391,8 +2446,17 @@ "atRiskPasswords": { "message": "At-risk passwords" }, - "atRiskPasswordsDescSingleOrg": { - "message": "$ORGANIZATION$ is requesting you change the $COUNT$ passwords because they are at risk.", + "atRiskPasswordDescSingleOrg": { + "message": "$ORGANIZATION$ is requesting you change one password because it is at-risk.", + "placeholders": { + "organization": { + "content": "$1", + "example": "Acme Corp" + } + } + }, + "atRiskPasswordsDescSingleOrgPlural": { + "message": "$ORGANIZATION$ is requesting you change the $COUNT$ passwords because they are at-risk.", "placeholders": { "organization": { "content": "$1", @@ -2404,8 +2468,8 @@ } } }, - "atRiskPasswordsDescMultiOrg": { - "message": "Your organizations are requesting you change the $COUNT$ passwords because they are at risk.", + "atRiskPasswordsDescMultiOrgPlural": { + "message": "Your organizations are requesting you change the $COUNT$ passwords because they are at-risk.", "placeholders": { "count": { "content": "$1", @@ -2431,6 +2495,36 @@ "changeAtRiskPasswordsFasterDesc": { "message": "Update your settings so you can quickly autofill your passwords and generate new ones" }, + "reviewAtRiskLogins": { + "message": "Review at-risk logins" + }, + "reviewAtRiskPasswords": { + "message": "Review at-risk passwords" + }, + "reviewAtRiskLoginsSlideDesc": { + "message": "Your organization passwords are at-risk because they are weak, reused, and/or exposed.", + "description": "Description of the review at-risk login slide on the at-risk password page carousel" + }, + "reviewAtRiskLoginSlideImgAlt": { + "message": "Illustration of a list of logins that are at-risk" + }, + "generatePasswordSlideDesc": { + "message": "Quickly generate a strong, unique password with the Bitwarden autofill menu on the at-risk site.", + "description": "Description of the generate password slide on the at-risk password page carousel" + }, + "generatePasswordSlideImgAlt": { + "message": "Illustration of the Bitwarden autofill menu displaying a generated password" + }, + "updateInBitwarden": { + "message": "Update in Bitwarden" + }, + "updateInBitwardenSlideDesc": { + "message": "Bitwarden will then prompt you to update the password in the password manager.", + "description": "Description of the update in Bitwarden slide on the at-risk password page carousel" + }, + "updateInBitwardenSlideImgAlt": { + "message": "Illustration of a Bitwarden’s notification prompting the user to update the login" + }, "turnOnAutofill": { "message": "Turn on autofill" }, @@ -4181,6 +4275,20 @@ } } }, + "copyFieldValue": { + "message": "Copy $FIELD$, $VALUE$", + "description": "Title for a button that copies a field value to the clipboard.", + "placeholders": { + "field": { + "content": "$1", + "example": "Username" + }, + "value": { + "content": "$2", + "example": "Foo" + } + } + }, "noValuesToCopy": { "message": "Không có giá trị để sao chép" }, diff --git a/apps/browser/src/_locales/zh_CN/messages.json b/apps/browser/src/_locales/zh_CN/messages.json index 7b94c0b07b6..c7ad885de92 100644 --- a/apps/browser/src/_locales/zh_CN/messages.json +++ b/apps/browser/src/_locales/zh_CN/messages.json @@ -80,6 +80,15 @@ "masterPassHint": { "message": "主密码提示(可选)" }, + "passwordStrengthScore": { + "message": "密码强度评分 $SCORE$", + "placeholders": { + "score": { + "content": "$1", + "example": "4" + } + } + }, "joinOrganization": { "message": "加入组织" }, @@ -876,6 +885,21 @@ "logInToBitwarden": { "message": "登录到 Bitwarden" }, + "enterTheCodeSentToYourEmail": { + "message": "输入发送到您的电子邮箱的代码" + }, + "enterTheCodeFromYourAuthenticatorApp": { + "message": "输入来自您的验证器 App 的代码" + }, + "pressYourYubiKeyToAuthenticate": { + "message": "按下 YubiKey 以验证身份" + }, + "duoTwoFactorRequiredPageSubtitle": { + "message": "您的账户要求使用 Duo 两步登录。请按照以下步骤完成登录。" + }, + "followTheStepsBelowToFinishLoggingIn": { + "message": "按照以下步骤完成登录。" + }, "restartRegistration": { "message": "重启注册" }, @@ -907,7 +931,7 @@ "message": "文件夹已添加" }, "twoStepLoginConfirmation": { - "message": "两步登录要求您从其他设备(例如安全钥匙、验证器 App、短信、电话或者电子邮件)来验证您的登录,这能使您的账户更加安全。两步登录需要在 bitwarden.com 网页版密码库中设置。现在访问此网站吗?" + "message": "两步登录要求您从其他设备(例如安全密钥、验证器 App、短信、电话或者电子邮件)来验证您的登录,这能使您的账户更加安全。两步登录需要在 bitwarden.com 网页版密码库中设置。现在访问此网站吗?" }, "twoStepLoginConfirmationContent": { "message": "在 Bitwarden 网页 App 中设置两步登录,让您的账户更加安全。" @@ -1365,17 +1389,27 @@ "rememberMe": { "message": "记住我" }, + "dontAskAgainOnThisDeviceFor30Days": { + "message": "30 天内在此设备上不再询问" + }, "sendVerificationCodeEmailAgain": { "message": "再次发送验证码电子邮件" }, "useAnotherTwoStepMethod": { "message": "使用其他两步登录方式" }, + "selectAnotherMethod": { + "message": "选择其他方式", + "description": "Select another two-step login method" + }, + "useYourRecoveryCode": { + "message": "使用您的恢复代码" + }, "insertYubiKey": { "message": "将您的 YubiKey 插入计算机的 USB 端口,然后触摸其按钮。" }, "insertU2f": { - "message": "将您的安全钥匙插入计算机的 USB 端口。如果它有按钮,请触摸它。" + "message": "将您的安全密钥插入计算机的 USB 端口。如果它有按钮,请触摸它。" }, "webAuthnNewTab": { "message": "要开始 WebAuthn 2FA 验证,请点击下面的按钮打开一个新标签页,并按照新标签页中提供的说明操作。" @@ -1383,9 +1417,18 @@ "webAuthnNewTabOpen": { "message": "打开新标签页" }, + "openInNewTab": { + "message": "在新标签页中打开" + }, "webAuthnAuthenticate": { "message": "验证 WebAuthn" }, + "readSecurityKey": { + "message": "读取安全密钥" + }, + "awaitingSecurityKeyInteraction": { + "message": "等待安全密钥交互……" + }, "loginUnavailable": { "message": "登录不可用" }, @@ -1393,11 +1436,14 @@ "message": "此账户已设置两步登录,但此浏览器不支持任何已配置的两步登录提供程序。" }, "noTwoStepProviders2": { - "message": "请使用支持的网页浏览器(例如 Chrome)和/或添加其他支持更广泛的提供程序(例如验证器 App)。" + "message": "请使用受支持的网页浏览器(例如 Chrome),和/或添加其他跨网页浏览器支持更好的提供程序(例如验证器 App)。" }, "twoStepOptions": { "message": "两步登录选项" }, + "selectTwoStepLoginMethod": { + "message": "选择两步登录方式" + }, "recoveryCodeDesc": { "message": "无法访问您所有的双重身份提供程序吗?请使用您的恢复代码来关闭您账户中所有的双重身份提供程序。" }, @@ -1412,7 +1458,7 @@ "description": "'Bitwarden Authenticator' is a product name and should not be translated." }, "yubiKeyTitleV2": { - "message": "Yubico OTP 安全钥匙" + "message": "Yubico OTP 安全密钥" }, "yubiKeyDesc": { "message": "使用 YubiKey 来访问您的账户。支持 YubiKey 4、4 Nano、4C 以及 NEO 设备。" @@ -1422,14 +1468,14 @@ "description": "'Duo Security' and 'Duo Mobile' are product names and should not be translated." }, "duoOrganizationDesc": { - "message": "为您的组织使用 Duo Security 的 Duo 移动 App、短信、电话或 U2F 安全钥匙来进行验证。", + "message": "为您的组织使用 Duo Security 的 Duo 移动 App、短信、电话或 U2F 安全密钥来进行验证。", "description": "'Duo Security' and 'Duo Mobile' are product names and should not be translated." }, "webAuthnTitle": { "message": "FIDO2 WebAuthn" }, "webAuthnDesc": { - "message": "使用任何 WebAuthn 兼容的安全钥匙访问您的账户。" + "message": "使用任何 WebAuthn 兼容的安全密钥访问您的账户。" }, "emailTitle": { "message": "电子邮箱" @@ -1575,7 +1621,7 @@ "message": "为当前网站自动填充最后一次使用的身份信息" }, "commandGeneratePasswordDesc": { - "message": "生成一个新的随机密码并将其复制到剪贴板中。" + "message": "生成一个新的随机密码并将其复制到剪贴板" }, "commandLockVaultDesc": { "message": "锁定密码库" @@ -1890,11 +1936,11 @@ "message": "没有在已知的数据泄露中发现此密码,它暂时比较安全。" }, "baseDomain": { - "message": "基础域", + "message": "基础域名", "description": "Domain name. Ex. website.com" }, "baseDomainOptionRecommended": { - "message": "基础域(推荐)", + "message": "基础域名(推荐)", "description": "Domain name. Ex. website.com" }, "domainName": { @@ -2002,10 +2048,10 @@ "description": "ex. A weak password. Scale: Weak -> Good -> Strong" }, "weakMasterPassword": { - "message": "弱主密码" + "message": "脆弱的主密码" }, "weakMasterPasswordDesc": { - "message": "您选择的主密码较弱。您应该使用强密码(或密码短语)来正确保护您的 Bitwarden 账户。仍要使用此主密码吗?" + "message": "您选择的主密码较弱。您应该使用强密码(或密码短语)来正确保护您的 Bitwarden 账户。确定要使用这个主密码吗?" }, "pin": { "message": "PIN 码", @@ -2097,6 +2143,15 @@ "vaultTimeoutAction1": { "message": "超时动作" }, + "newCustomizationOptionsCalloutTitle": { + "message": "新的自定义选项" + }, + "newCustomizationOptionsCalloutContent": { + "message": "自定义您的密码库体验,包括快速复制操作、紧凑模式等!" + }, + "newCustomizationOptionsCalloutLink": { + "message": "查看所有外观设置" + }, "lock": { "message": "锁定", "description": "Verb form: to make secure or inaccessible by" @@ -2389,9 +2444,18 @@ } }, "atRiskPasswords": { - "message": "有风险的密码" + "message": "存在风险的密码" }, - "atRiskPasswordsDescSingleOrg": { + "atRiskPasswordDescSingleOrg": { + "message": "$ORGANIZATION$ 要求您更改 1 个密码,因为它存在风险。", + "placeholders": { + "organization": { + "content": "$1", + "example": "Acme Corp" + } + } + }, + "atRiskPasswordsDescSingleOrgPlural": { "message": "$ORGANIZATION$ 要求您更改 $COUNT$ 个密码,因为它们存在风险。", "placeholders": { "organization": { @@ -2404,7 +2468,7 @@ } } }, - "atRiskPasswordsDescMultiOrg": { + "atRiskPasswordsDescMultiOrgPlural": { "message": "您的组织要求您更改 $COUNT$ 个密码,因为它们存在风险。", "placeholders": { "count": { @@ -2414,10 +2478,10 @@ } }, "reviewAndChangeAtRiskPassword": { - "message": "审查并更改某个有风险的密码" + "message": "审查并更改 1 个存在风险的密码" }, "reviewAndChangeAtRiskPasswordsPlural": { - "message": "审查并更改 $COUNT$ 个有风险的密码", + "message": "审查并更改 $COUNT$ 个存在风险的密码", "placeholders": { "count": { "content": "$1", @@ -2431,6 +2495,36 @@ "changeAtRiskPasswordsFasterDesc": { "message": "更新您的设置,以便您可以快速自动填充密码并生成新的密码" }, + "reviewAtRiskLogins": { + "message": "审查存在风险的登录" + }, + "reviewAtRiskPasswords": { + "message": "审查存在风险的密码" + }, + "reviewAtRiskLoginsSlideDesc": { + "message": "您的组织密码存在风险,因为它们过于简单、被重复使用和/或已暴露。", + "description": "Description of the review at-risk login slide on the at-risk password page carousel" + }, + "reviewAtRiskLoginSlideImgAlt": { + "message": "存在风险的登录列表示意图" + }, + "generatePasswordSlideDesc": { + "message": "在存在风险的网站上,使用 Bitwarden 自动填充菜单快速生成强大且唯一的密码。", + "description": "Description of the generate password slide on the at-risk password page carousel" + }, + "generatePasswordSlideImgAlt": { + "message": "Bitwarden 自动填充菜单显示生成的密码示意图" + }, + "updateInBitwarden": { + "message": "在 Bitwarden 中更新" + }, + "updateInBitwardenSlideDesc": { + "message": "然后,Bitwarden 会提示您更新密码管理器中的密码。", + "description": "Description of the update in Bitwarden slide on the at-risk password page carousel" + }, + "updateInBitwardenSlideImgAlt": { + "message": "提示用户更新登录的 Bitwarden 通知示意图" + }, "turnOnAutofill": { "message": "开启自动填充" }, @@ -3693,7 +3787,7 @@ } }, "tryAgain": { - "message": "请重试" + "message": "重试" }, "verificationRequiredForActionSetPinToContinue": { "message": "此操作需要验证。设置一个 PIN 码以继续。" @@ -4005,7 +4099,7 @@ "message": "托管于" }, "useDeviceOrHardwareKey": { - "message": "使用您的设备或实体钥匙" + "message": "使用您的设备或硬件密钥" }, "justOnce": { "message": "仅此一次" @@ -4181,6 +4275,20 @@ } } }, + "copyFieldValue": { + "message": "复制 $FIELD$,$VALUE$", + "description": "Title for a button that copies a field value to the clipboard.", + "placeholders": { + "field": { + "content": "$1", + "example": "Username" + }, + "value": { + "content": "$2", + "example": "Foo" + } + } + }, "noValuesToCopy": { "message": "没有要复制的值" }, diff --git a/apps/browser/src/_locales/zh_TW/messages.json b/apps/browser/src/_locales/zh_TW/messages.json index 4f80f1c6412..37d5239622d 100644 --- a/apps/browser/src/_locales/zh_TW/messages.json +++ b/apps/browser/src/_locales/zh_TW/messages.json @@ -80,6 +80,15 @@ "masterPassHint": { "message": "主密碼提示(選用)" }, + "passwordStrengthScore": { + "message": "Password strength score $SCORE$", + "placeholders": { + "score": { + "content": "$1", + "example": "4" + } + } + }, "joinOrganization": { "message": "加入組織" }, @@ -876,6 +885,21 @@ "logInToBitwarden": { "message": "登入 Bitwarden" }, + "enterTheCodeSentToYourEmail": { + "message": "Enter the code sent to your email" + }, + "enterTheCodeFromYourAuthenticatorApp": { + "message": "Enter the code from your authenticator app" + }, + "pressYourYubiKeyToAuthenticate": { + "message": "Press your YubiKey to authenticate" + }, + "duoTwoFactorRequiredPageSubtitle": { + "message": "Duo two-step login is required for your account. Follow the steps below to finish logging in." + }, + "followTheStepsBelowToFinishLoggingIn": { + "message": "Follow the steps below to finish logging in." + }, "restartRegistration": { "message": "重新啟動註冊" }, @@ -1365,12 +1389,22 @@ "rememberMe": { "message": "記住我" }, + "dontAskAgainOnThisDeviceFor30Days": { + "message": "Don't ask again on this device for 30 days" + }, "sendVerificationCodeEmailAgain": { "message": "再次傳送​​包含驗證碼的電子郵件" }, "useAnotherTwoStepMethod": { "message": "使用另一種兩步驟登入方法" }, + "selectAnotherMethod": { + "message": "Select another method", + "description": "Select another two-step login method" + }, + "useYourRecoveryCode": { + "message": "Use your recovery code" + }, "insertYubiKey": { "message": "將您的 YubiKey 插入電腦的 USB 連接埠,然後按一下它的按鈕。" }, @@ -1383,9 +1417,18 @@ "webAuthnNewTabOpen": { "message": "開啟新分頁" }, + "openInNewTab": { + "message": "Open in new tab" + }, "webAuthnAuthenticate": { "message": "驗證 WebAuthn" }, + "readSecurityKey": { + "message": "Read security key" + }, + "awaitingSecurityKeyInteraction": { + "message": "Awaiting security key interaction..." + }, "loginUnavailable": { "message": "登入無法使用" }, @@ -1398,6 +1441,9 @@ "twoStepOptions": { "message": "兩步驟登入選項" }, + "selectTwoStepLoginMethod": { + "message": "Select two-step login method" + }, "recoveryCodeDesc": { "message": "無法使用任何雙因素提供程式嗎?請使用您的復原碼以停用您帳戶的所有雙因素提供程式。" }, @@ -2097,6 +2143,15 @@ "vaultTimeoutAction1": { "message": "逾時後動作" }, + "newCustomizationOptionsCalloutTitle": { + "message": "New customization options" + }, + "newCustomizationOptionsCalloutContent": { + "message": "Customize your vault experience with quick copy actions, compact mode, and more!" + }, + "newCustomizationOptionsCalloutLink": { + "message": "View all Appearance settings" + }, "lock": { "message": "鎖定", "description": "Verb form: to make secure or inaccessible by" @@ -2391,8 +2446,17 @@ "atRiskPasswords": { "message": "At-risk passwords" }, - "atRiskPasswordsDescSingleOrg": { - "message": "$ORGANIZATION$ is requesting you change the $COUNT$ passwords because they are at risk.", + "atRiskPasswordDescSingleOrg": { + "message": "$ORGANIZATION$ is requesting you change one password because it is at-risk.", + "placeholders": { + "organization": { + "content": "$1", + "example": "Acme Corp" + } + } + }, + "atRiskPasswordsDescSingleOrgPlural": { + "message": "$ORGANIZATION$ is requesting you change the $COUNT$ passwords because they are at-risk.", "placeholders": { "organization": { "content": "$1", @@ -2404,8 +2468,8 @@ } } }, - "atRiskPasswordsDescMultiOrg": { - "message": "Your organizations are requesting you change the $COUNT$ passwords because they are at risk.", + "atRiskPasswordsDescMultiOrgPlural": { + "message": "Your organizations are requesting you change the $COUNT$ passwords because they are at-risk.", "placeholders": { "count": { "content": "$1", @@ -2431,6 +2495,36 @@ "changeAtRiskPasswordsFasterDesc": { "message": "Update your settings so you can quickly autofill your passwords and generate new ones" }, + "reviewAtRiskLogins": { + "message": "Review at-risk logins" + }, + "reviewAtRiskPasswords": { + "message": "Review at-risk passwords" + }, + "reviewAtRiskLoginsSlideDesc": { + "message": "Your organization passwords are at-risk because they are weak, reused, and/or exposed.", + "description": "Description of the review at-risk login slide on the at-risk password page carousel" + }, + "reviewAtRiskLoginSlideImgAlt": { + "message": "Illustration of a list of logins that are at-risk" + }, + "generatePasswordSlideDesc": { + "message": "Quickly generate a strong, unique password with the Bitwarden autofill menu on the at-risk site.", + "description": "Description of the generate password slide on the at-risk password page carousel" + }, + "generatePasswordSlideImgAlt": { + "message": "Illustration of the Bitwarden autofill menu displaying a generated password" + }, + "updateInBitwarden": { + "message": "Update in Bitwarden" + }, + "updateInBitwardenSlideDesc": { + "message": "Bitwarden will then prompt you to update the password in the password manager.", + "description": "Description of the update in Bitwarden slide on the at-risk password page carousel" + }, + "updateInBitwardenSlideImgAlt": { + "message": "Illustration of a Bitwarden’s notification prompting the user to update the login" + }, "turnOnAutofill": { "message": "Turn on autofill" }, @@ -4181,6 +4275,20 @@ } } }, + "copyFieldValue": { + "message": "Copy $FIELD$, $VALUE$", + "description": "Title for a button that copies a field value to the clipboard.", + "placeholders": { + "field": { + "content": "$1", + "example": "Username" + }, + "value": { + "content": "$2", + "example": "Foo" + } + } + }, "noValuesToCopy": { "message": "沒有資料可以複製" }, diff --git a/apps/browser/src/auth/popup/account-switching/account-switcher.component.html b/apps/browser/src/auth/popup/account-switching/account-switcher.component.html index 0152cd1c7ff..de8ab4c7b08 100644 --- a/apps/browser/src/auth/popup/account-switching/account-switcher.component.html +++ b/apps/browser/src/auth/popup/account-switching/account-switcher.component.html @@ -15,7 +15,7 @@ -

{{ "availableAccounts" | i18n }}

+

{{ "availableAccounts" | i18n }}

diff --git a/apps/browser/src/auth/popup/account-switching/account-switcher.component.ts b/apps/browser/src/auth/popup/account-switching/account-switcher.component.ts index 25e1b2ae83f..78bee121afb 100644 --- a/apps/browser/src/auth/popup/account-switching/account-switcher.component.ts +++ b/apps/browser/src/auth/popup/account-switching/account-switcher.component.ts @@ -5,12 +5,14 @@ import { Subject, firstValueFrom, map, of, startWith, switchMap } from "rxjs"; import { JslibModule } from "@bitwarden/angular/jslib.module"; import { LockService } from "@bitwarden/auth/common"; -import { VaultTimeoutSettingsService } from "@bitwarden/common/abstractions/vault-timeout/vault-timeout-settings.service"; -import { VaultTimeoutService } from "@bitwarden/common/abstractions/vault-timeout/vault-timeout.service"; import { AccountService } from "@bitwarden/common/auth/abstractions/account.service"; import { AuthService } from "@bitwarden/common/auth/abstractions/auth.service"; import { AuthenticationStatus } from "@bitwarden/common/auth/enums/authentication-status"; -import { VaultTimeoutAction } from "@bitwarden/common/enums/vault-timeout-action.enum"; +import { + VaultTimeoutAction, + VaultTimeoutService, + VaultTimeoutSettingsService, +} from "@bitwarden/common/key-management/vault-timeout"; import { UserId } from "@bitwarden/common/types/guid"; import { AvatarModule, @@ -19,6 +21,7 @@ import { ItemModule, SectionComponent, SectionHeaderComponent, + TypographyModule, } from "@bitwarden/components"; import { enableAccountSwitching } from "../../../platform/flags"; @@ -46,6 +49,7 @@ import { AccountSwitcherService } from "./services/account-switcher.service"; AccountComponent, SectionComponent, SectionHeaderComponent, + TypographyModule, ], }) export class AccountSwitcherComponent implements OnInit, OnDestroy { diff --git a/apps/browser/src/auth/popup/account-switching/current-account.component.html b/apps/browser/src/auth/popup/account-switching/current-account.component.html index dacf4b34be5..f59a2b08fdd 100644 --- a/apps/browser/src/auth/popup/account-switching/current-account.component.html +++ b/apps/browser/src/auth/popup/account-switching/current-account.component.html @@ -5,8 +5,7 @@ class="tw-rounded-full hover:tw-outline hover:tw-outline-1 hover:tw-outline-offset-1" (click)="currentAccountClicked()" > - {{ "switchAccounts" | i18n }}: - {{ "activeAccount" | i18n }} {{ currentAccount.email }} + {{ "bitwardenAccount" | i18n }} {{ currentAccount.email }} { let activeAccountSubject: BehaviorSubject; let authStatusSubject: ReplaySubject>; + let envBSubject: BehaviorSubject; + const mockHostName = "mockHostName"; + const mockEnv: Partial = { + getHostname: () => mockHostName, + }; + const accountService = mock(); const avatarService = mock(); const messagingService = mock(); @@ -41,6 +50,9 @@ describe("AccountSwitcherService", () => { accountService.activeAccount$ = activeAccountSubject; authService.authStatuses$ = authStatusSubject; + envBSubject = new BehaviorSubject(mockEnv as Environment); + environmentService.getEnvironment$.mockReturnValue(envBSubject); + accountSwitcherService = new AccountSwitcherService( accountService, avatarService, @@ -79,11 +91,16 @@ describe("AccountSwitcherService", () => { expect(accounts).toHaveLength(3); expect(accounts[0].id).toBe("1"); expect(accounts[0].isActive).toBeTruthy(); + + expect(accounts[0].server).toBe(mockHostName); + expect(accounts[1].id).toBe("2"); expect(accounts[1].isActive).toBeFalsy(); + expect(accounts[1].server).toBe(mockHostName); expect(accounts[2].id).toBe("addAccount"); expect(accounts[2].isActive).toBeFalsy(); + expect(accounts[2].server).toBe(undefined); }); it.each([5, 6])( 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 535df3ec6bb..bfed7dc1408 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 @@ -66,11 +66,12 @@ export class AccountSwitcherService { const hasMaxAccounts = loggedInIds.length >= this.ACCOUNT_LIMIT; const options: AvailableAccount[] = await Promise.all( loggedInIds.map(async (id: UserId) => { + const userEnv = await firstValueFrom(this.environmentService.getEnvironment$(id)); return { name: accounts[id].name ?? accounts[id].email, email: accounts[id].email, id: id, - server: (await this.environmentService.getEnvironment(id))?.getHostname(), + server: userEnv?.getHostname(), status: accountStatuses[id], isActive: id === activeAccount?.id, avatarColor: await firstValueFrom( diff --git a/apps/browser/src/auth/popup/extension-anon-layout-wrapper/extension-anon-layout-wrapper.component.html b/apps/browser/src/auth/popup/extension-anon-layout-wrapper/extension-anon-layout-wrapper.component.html index 8893697da17..88a3b1c3076 100644 --- a/apps/browser/src/auth/popup/extension-anon-layout-wrapper/extension-anon-layout-wrapper.component.html +++ b/apps/browser/src/auth/popup/extension-anon-layout-wrapper/extension-anon-layout-wrapper.component.html @@ -5,7 +5,7 @@ [showBackButton]="showBackButton" [pageTitle]="''" > - + diff --git a/apps/browser/src/auth/popup/home.component.ts b/apps/browser/src/auth/popup/home.component.ts index dbdcf7d5aa8..0c4510204d1 100644 --- a/apps/browser/src/auth/popup/home.component.ts +++ b/apps/browser/src/auth/popup/home.component.ts @@ -81,8 +81,10 @@ export class HomeComponent implements OnInit, OnDestroy { tap(async (flag) => { // If the flag is turned ON, we must force a reload to ensure the correct UI is shown if (flag) { + const qParams = await firstValueFrom(this.route.queryParams); + const uniqueQueryParams = { - ...this.route.queryParams, + ...qParams, // adding a unique timestamp to the query params to force a reload t: new Date().getTime().toString(), }; diff --git a/apps/browser/src/auth/popup/settings/account-security.component.spec.ts b/apps/browser/src/auth/popup/settings/account-security.component.spec.ts index e68edd64e03..60b38570482 100644 --- a/apps/browser/src/auth/popup/settings/account-security.component.spec.ts +++ b/apps/browser/src/auth/popup/settings/account-security.component.spec.ts @@ -5,14 +5,17 @@ import { mock } from "jest-mock-extended"; import { firstValueFrom, of } from "rxjs"; import { PinServiceAbstraction } from "@bitwarden/auth/common"; -import { VaultTimeoutSettingsService } from "@bitwarden/common/abstractions/vault-timeout/vault-timeout-settings.service"; -import { VaultTimeoutService } from "@bitwarden/common/abstractions/vault-timeout/vault-timeout.service"; import { PolicyService } from "@bitwarden/common/admin-console/abstractions/policy/policy.service.abstraction"; import { PolicyType } from "@bitwarden/common/admin-console/enums"; import { Policy } from "@bitwarden/common/admin-console/models/domain/policy"; import { AccountService } from "@bitwarden/common/auth/abstractions/account.service"; import { UserVerificationService } from "@bitwarden/common/auth/abstractions/user-verification/user-verification.service.abstraction"; -import { VaultTimeoutAction } from "@bitwarden/common/enums/vault-timeout-action.enum"; +import { + VaultTimeoutSettingsService, + VaultTimeoutService, + VaultTimeoutStringType, + VaultTimeoutAction, +} from "@bitwarden/common/key-management/vault-timeout"; import { EnvironmentService } from "@bitwarden/common/platform/abstractions/environment.service"; import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; import { PlatformUtilsService } from "@bitwarden/common/platform/abstractions/platform-utils.service"; @@ -21,7 +24,6 @@ import { MessageSender } from "@bitwarden/common/platform/messaging"; import { Utils } from "@bitwarden/common/platform/misc/utils"; import { FakeAccountService, mockAccountServiceWith } from "@bitwarden/common/spec"; import { UserId } from "@bitwarden/common/types/guid"; -import { VaultTimeoutStringType } from "@bitwarden/common/types/vault-timeout.type"; import { DialogService, ToastService } from "@bitwarden/components"; import { BiometricStateService, BiometricsService, KeyService } from "@bitwarden/key-management"; diff --git a/apps/browser/src/auth/popup/settings/account-security.component.ts b/apps/browser/src/auth/popup/settings/account-security.component.ts index 4a64783c78c..871d1b3014d 100644 --- a/apps/browser/src/auth/popup/settings/account-security.component.ts +++ b/apps/browser/src/auth/popup/settings/account-security.component.ts @@ -25,24 +25,24 @@ import { import { JslibModule } from "@bitwarden/angular/jslib.module"; import { FingerprintDialogComponent, VaultTimeoutInputComponent } from "@bitwarden/auth/angular"; import { PinServiceAbstraction } from "@bitwarden/auth/common"; -import { VaultTimeoutSettingsService } from "@bitwarden/common/abstractions/vault-timeout/vault-timeout-settings.service"; -import { VaultTimeoutService } from "@bitwarden/common/abstractions/vault-timeout/vault-timeout.service"; import { PolicyService } from "@bitwarden/common/admin-console/abstractions/policy/policy.service.abstraction"; import { PolicyType } from "@bitwarden/common/admin-console/enums"; import { AccountService } from "@bitwarden/common/auth/abstractions/account.service"; import { UserVerificationService } from "@bitwarden/common/auth/abstractions/user-verification/user-verification.service.abstraction"; import { DeviceType } from "@bitwarden/common/enums"; -import { VaultTimeoutAction } from "@bitwarden/common/enums/vault-timeout-action.enum"; +import { + VaultTimeout, + VaultTimeoutAction, + VaultTimeoutOption, + VaultTimeoutService, + VaultTimeoutSettingsService, + VaultTimeoutStringType, +} from "@bitwarden/common/key-management/vault-timeout"; 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 { StateService } from "@bitwarden/common/platform/abstractions/state.service"; -import { - VaultTimeout, - VaultTimeoutOption, - VaultTimeoutStringType, -} from "@bitwarden/common/types/vault-timeout.type"; import { CardComponent, CheckboxModule, diff --git a/apps/browser/src/autofill/background/abstractions/notification.background.ts b/apps/browser/src/autofill/background/abstractions/notification.background.ts index 1b989283112..851f07576dd 100644 --- a/apps/browser/src/autofill/background/abstractions/notification.background.ts +++ b/apps/browser/src/autofill/background/abstractions/notification.background.ts @@ -100,6 +100,7 @@ type NotificationBackgroundExtensionMessageHandlers = { bgChangedPassword: ({ message, sender }: BackgroundOnMessageHandlerParams) => Promise; bgRemoveTabFromNotificationQueue: ({ sender }: BackgroundSenderParam) => void; bgSaveCipher: ({ message, sender }: BackgroundOnMessageHandlerParams) => void; + bgOpenVault: ({ message, sender }: BackgroundOnMessageHandlerParams) => Promise; bgNeverSave: ({ sender }: BackgroundSenderParam) => Promise; bgUnlockPopoutOpened: ({ message, sender }: BackgroundOnMessageHandlerParams) => Promise; bgReopenUnlockPopout: ({ sender }: BackgroundSenderParam) => Promise; diff --git a/apps/browser/src/autofill/background/notification.background.spec.ts b/apps/browser/src/autofill/background/notification.background.spec.ts index 40c4d07cadf..e02e3d8d951 100644 --- a/apps/browser/src/autofill/background/notification.background.spec.ts +++ b/apps/browser/src/autofill/background/notification.background.spec.ts @@ -812,7 +812,10 @@ describe("NotificationBackground", () => { newPassword: "newPassword", }); notificationBackground["notificationQueue"] = [queueMessage]; - const cipherView = mock(); + const cipherView = mock({ + id: "testId", + login: { username: "testUser" }, + }); getDecryptedCipherByIdSpy.mockResolvedValueOnce(cipherView); sendMockExtensionMessage(message, sender); @@ -828,9 +831,14 @@ describe("NotificationBackground", () => { "testId", ); expect(updateWithServerSpy).toHaveBeenCalled(); - expect(tabSendMessageSpy).toHaveBeenCalledWith(sender.tab, { - command: "saveCipherAttemptCompleted", - }); + expect(tabSendMessageDataSpy).toHaveBeenCalledWith( + sender.tab, + "saveCipherAttemptCompleted", + { + username: cipherView.login.username, + cipherId: cipherView.id, + }, + ); }); it("updates the cipher password if the queue message was locked and an existing cipher has the same username as the message", async () => { @@ -976,11 +984,16 @@ describe("NotificationBackground", () => { }); notificationBackground["notificationQueue"] = [queueMessage]; const cipherView = mock({ + id: "testId", login: { username: "test", password: "password" }, }); folderExistsSpy.mockResolvedValueOnce(false); convertAddLoginQueueMessageToCipherViewSpy.mockReturnValueOnce(cipherView); editItemSpy.mockResolvedValueOnce(undefined); + cipherEncryptSpy.mockResolvedValueOnce({ + ...cipherView, + id: "testId", + }); sendMockExtensionMessage(message, sender); await flushPromises(); @@ -991,9 +1004,14 @@ describe("NotificationBackground", () => { ); expect(cipherEncryptSpy).toHaveBeenCalledWith(cipherView, "testId"); expect(createWithServerSpy).toHaveBeenCalled(); - expect(tabSendMessageSpy).toHaveBeenCalledWith(sender.tab, { - command: "saveCipherAttemptCompleted", - }); + expect(tabSendMessageDataSpy).toHaveBeenCalledWith( + sender.tab, + "saveCipherAttemptCompleted", + { + username: cipherView.login.username, + cipherId: cipherView.id, + }, + ); expect(tabSendMessageSpy).toHaveBeenCalledWith(sender.tab, { command: "addedCipher" }); }); diff --git a/apps/browser/src/autofill/background/notification.background.ts b/apps/browser/src/autofill/background/notification.background.ts index 1a99425b7de..11037e7e261 100644 --- a/apps/browser/src/autofill/background/notification.background.ts +++ b/apps/browser/src/autofill/background/notification.background.ts @@ -87,6 +87,7 @@ export default class NotificationBackground { getWebVaultUrlForNotification: () => this.getWebVaultUrl(), notificationRefreshFlagValue: () => this.getNotificationFlag(), bgGetDecryptedCiphers: () => this.getNotificationCipherData(), + bgOpenVault: ({ message, sender }) => this.openVault(message, sender.tab), }; constructor( @@ -594,7 +595,10 @@ export default class NotificationBackground { const cipher = await this.cipherService.encrypt(newCipher, activeUserId); try { await this.cipherService.createWithServer(cipher); - await BrowserApi.tabSendMessage(tab, { command: "saveCipherAttemptCompleted" }); + await BrowserApi.tabSendMessageData(tab, "saveCipherAttemptCompleted", { + username: String(queueMessage?.username), + cipherId: String(cipher?.id), + }); await BrowserApi.tabSendMessage(tab, { command: "addedCipher" }); } catch (error) { await BrowserApi.tabSendMessageData(tab, "saveCipherAttemptCompleted", { @@ -630,15 +634,16 @@ export default class NotificationBackground { await BrowserApi.tabSendMessage(tab, { command: "editedCipher" }); return; } - const cipher = await this.cipherService.encrypt(cipherView, userId); try { - // We've only updated the password, no need to broadcast editedCipher message await this.cipherService.updateWithServer(cipher); - await BrowserApi.tabSendMessage(tab, { command: "saveCipherAttemptCompleted" }); + await BrowserApi.tabSendMessageData(tab, "saveCipherAttemptCompleted", { + username: String(cipherView?.login?.username), + cipherId: String(cipherView?.id), + }); } catch (error) { await BrowserApi.tabSendMessageData(tab, "saveCipherAttemptCompleted", { - error: String(error.message), + error: String(error?.message), }); } } @@ -663,6 +668,16 @@ export default class NotificationBackground { await this.openAddEditVaultItemPopout(senderTab, { cipherId: cipherView.id }); } + private async openVault( + message: NotificationBackgroundExtensionMessage, + senderTab: chrome.tabs.Tab, + ) { + if (!message.cipherId) { + await this.openAddEditVaultItemPopout(senderTab); + } + await this.openAddEditVaultItemPopout(senderTab, { cipherId: message.cipherId }); + } + private async folderExists(folderId: string, userId: UserId) { if (Utils.isNullOrWhitespace(folderId) || folderId === "null") { return false; diff --git a/apps/browser/src/autofill/content/components/lit-stories/notification/confirmation.lit-stories.ts b/apps/browser/src/autofill/content/components/lit-stories/notification/confirmation.lit-stories.ts index 94dbaace9aa..b3dee95efd0 100644 --- a/apps/browser/src/autofill/content/components/lit-stories/notification/confirmation.lit-stories.ts +++ b/apps/browser/src/autofill/content/components/lit-stories/notification/confirmation.lit-stories.ts @@ -7,7 +7,7 @@ import { NotificationConfirmationBody } from "../../notification/confirmation"; type Args = { buttonText: string; confirmationMessage: string; - handleClick: () => void; + handleOpenVault: () => void; theme: Theme; error: string; }; diff --git a/apps/browser/src/autofill/content/components/lit-stories/notification/footer.lit-stories.ts b/apps/browser/src/autofill/content/components/lit-stories/notification/footer.lit-stories.ts index b03aeeae311..5ad0a5a2aca 100644 --- a/apps/browser/src/autofill/content/components/lit-stories/notification/footer.lit-stories.ts +++ b/apps/browser/src/autofill/content/components/lit-stories/notification/footer.lit-stories.ts @@ -9,6 +9,7 @@ type Args = { notificationType: NotificationType; theme: Theme; handleSaveAction: (e: Event) => void; + i18n: { [key: string]: string }; }; export default { @@ -23,6 +24,11 @@ export default { args: { theme: ThemeTypes.Light, notificationType: "add", + i18n: { + saveAsNewLoginAction: "Save as New Login", + saveAction: "Save", + }, + handleSaveAction: () => alert("Save action triggered"), }, parameters: { design: { diff --git a/apps/browser/src/autofill/content/components/lit-stories/rows/button-row.lit-stories.ts b/apps/browser/src/autofill/content/components/lit-stories/rows/button-row.lit-stories.ts index ffef4751627..7f833f2a1f6 100644 --- a/apps/browser/src/autofill/content/components/lit-stories/rows/button-row.lit-stories.ts +++ b/apps/browser/src/autofill/content/components/lit-stories/rows/button-row.lit-stories.ts @@ -7,15 +7,18 @@ import { ButtonRow } from "../../rows/button-row"; type Args = { theme: Theme; buttonAction: (e: Event) => void; + buttonText: string; }; export default { title: "Components/Rows/Button Row", argTypes: { theme: { control: "select", options: [...Object.values(ThemeTypes)] }, + buttonText: { control: "text" }, }, args: { theme: ThemeTypes.Light, + buttonText: "Action", }, } as Meta; diff --git a/apps/browser/src/autofill/content/components/notification/confirmation-container.ts b/apps/browser/src/autofill/content/components/notification/confirmation-container.ts new file mode 100644 index 00000000000..8fdc5474486 --- /dev/null +++ b/apps/browser/src/autofill/content/components/notification/confirmation-container.ts @@ -0,0 +1,110 @@ +import { css } from "@emotion/css"; +import { html } from "lit"; + +import { Theme, ThemeTypes } from "@bitwarden/common/platform/enums"; + +import { + NotificationBarIframeInitData, + NotificationTypes, + NotificationType, +} from "../../../notification/abstractions/notification-bar"; +import { themes, spacing } from "../constants/styles"; + +import { NotificationConfirmationBody } from "./confirmation"; +import { + NotificationHeader, + componentClassPrefix as notificationHeaderClassPrefix, +} from "./header"; + +export function NotificationConfirmationContainer({ + error, + handleCloseNotification, + handleOpenVault, + i18n, + theme = ThemeTypes.Light, + type, + username, +}: NotificationBarIframeInitData & { + handleCloseNotification: (e: Event) => void; + handleOpenVault: (e: Event) => void; +} & { + error: string; + i18n: { [key: string]: string }; + type: NotificationType; + username: string; +}) { + const headerMessage = getHeaderMessage(i18n, type, error); + const confirmationMessage = getConfirmationMessage(i18n, username, type, error); + const buttonText = error ? i18n.newItem : i18n.view; + + return html` +
+ ${NotificationHeader({ + handleCloseNotification, + message: headerMessage, + theme, + })} + ${NotificationConfirmationBody({ + buttonText, + confirmationMessage, + error: error, + handleOpenVault, + theme, + })} +
+ `; +} + +const notificationContainerStyles = (theme: Theme) => css` + position: absolute; + right: 20px; + border: 1px solid ${themes[theme].secondary["300"]}; + border-radius: ${spacing["4"]}; + box-shadow: -2px 4px 6px 0px #0000001a; + background-color: ${themes[theme].background.alt}; + width: 400px; + overflow: hidden; + + [class*="${notificationHeaderClassPrefix}-"] { + border-radius: ${spacing["4"]} ${spacing["4"]} 0 0; + border-bottom: 0.5px solid ${themes[theme].secondary["300"]}; + } +`; + +function getConfirmationMessage( + i18n: { [key: string]: string }, + username: string, + type?: NotificationType, + error?: string, +) { + const loginSaveSuccessDetails = chrome.i18n.getMessage("loginSaveSuccessDetails", [username]); + const loginUpdatedSuccessDetails = chrome.i18n.getMessage("loginUpdatedSuccessDetails", [ + username, + ]); + + if (error) { + return i18n.saveFailureDetails; + } + return type === "add" ? loginSaveSuccessDetails : loginUpdatedSuccessDetails; +} + +function getHeaderMessage( + i18n: { [key: string]: string }, + type?: NotificationType, + error?: string, +) { + if (error) { + return i18n.saveFailure; + } + + switch (type) { + case NotificationTypes.Add: + return i18n.loginSaveSuccess; + case NotificationTypes.Change: + return i18n.loginUpdateSuccess; + case NotificationTypes.Unlock: + return ""; + default: + return undefined; + } +} diff --git a/apps/browser/src/autofill/content/components/notification/confirmation-message.ts b/apps/browser/src/autofill/content/components/notification/confirmation-message.ts index 745899481dd..d6f7ba3024d 100644 --- a/apps/browser/src/autofill/content/components/notification/confirmation-message.ts +++ b/apps/browser/src/autofill/content/components/notification/confirmation-message.ts @@ -35,7 +35,6 @@ const baseTextStyles = css` text-align: left; text-overflow: ellipsis; line-height: 24px; - white-space: nowrap; font-family: "DM Sans", sans-serif; font-size: 16px; `; diff --git a/apps/browser/src/autofill/content/components/notification/confirmation.ts b/apps/browser/src/autofill/content/components/notification/confirmation.ts index 0c389f75eb6..8c213a7663f 100644 --- a/apps/browser/src/autofill/content/components/notification/confirmation.ts +++ b/apps/browser/src/autofill/content/components/notification/confirmation.ts @@ -1,7 +1,7 @@ import createEmotion from "@emotion/css/create-instance"; import { html } from "lit"; -import { Theme, ThemeTypes } from "@bitwarden/common/platform/enums"; +import { Theme } from "@bitwarden/common/platform/enums"; import { themes } from "../constants/styles"; import { PartyHorn, Warning } from "../icons"; @@ -18,12 +18,14 @@ export function NotificationConfirmationBody({ buttonText, error, confirmationMessage, - theme = ThemeTypes.Light, + theme, + handleOpenVault, }: { error?: string; buttonText: string; confirmationMessage: string; theme: Theme; + handleOpenVault: (e: Event) => void; }) { const IconComponent = !error ? PartyHorn : Warning; return html` @@ -31,7 +33,7 @@ export function NotificationConfirmationBody({
${IconComponent({ theme })}
${confirmationMessage && buttonText ? NotificationConfirmationMessage({ - handleClick: () => {}, + handleClick: handleOpenVault, confirmationMessage, theme, buttonText, @@ -54,5 +56,4 @@ const notificationConfirmationBodyStyles = ({ theme }: { theme: Theme }) => css` justify-content: flex-start; background-color: ${themes[theme].background.alt}; padding: 12px; - white-space: nowrap; `; diff --git a/apps/browser/src/autofill/content/components/notification/container.ts b/apps/browser/src/autofill/content/components/notification/container.ts index 1cdde3ec3ed..f98ef795749 100644 --- a/apps/browser/src/autofill/content/components/notification/container.ts +++ b/apps/browser/src/autofill/content/components/notification/container.ts @@ -58,6 +58,7 @@ export function NotificationContainer({ handleSaveAction, theme, notificationType: type, + i18n, })}
`; diff --git a/apps/browser/src/autofill/content/components/notification/footer.ts b/apps/browser/src/autofill/content/components/notification/footer.ts index edc6d6f6e00..6de4a333dfe 100644 --- a/apps/browser/src/autofill/content/components/notification/footer.ts +++ b/apps/browser/src/autofill/content/components/notification/footer.ts @@ -15,14 +15,16 @@ export function NotificationFooter({ handleSaveAction, notificationType, theme, + i18n, }: { handleSaveAction: (e: Event) => void; + i18n: { [key: string]: string }; notificationType?: NotificationType; theme: Theme; }) { const isChangeNotification = notificationType === NotificationTypes.Change; - // @TODO localize - const saveNewItemText = "Save as new login"; + const saveNewItemText = i18n.saveAsNewLoginAction; + const buttonText = i18n.saveAction; return html`
@@ -32,7 +34,7 @@ export function NotificationFooter({ handleAction: handleSaveAction, theme, }) - : ButtonRow({ theme, buttonAction: handleSaveAction })} + : ButtonRow({ theme, buttonAction: handleSaveAction, buttonText })}
`; } diff --git a/apps/browser/src/autofill/content/components/notification/header.ts b/apps/browser/src/autofill/content/components/notification/header.ts index 85f6e48cd5d..50c2c629942 100644 --- a/apps/browser/src/autofill/content/components/notification/header.ts +++ b/apps/browser/src/autofill/content/components/notification/header.ts @@ -17,12 +17,12 @@ const { css } = createEmotion({ export function NotificationHeader({ message, - standalone, + standalone = false, theme = ThemeTypes.Light, handleCloseNotification, }: { message?: string; - standalone: boolean; + standalone?: boolean; theme: Theme; handleCloseNotification: (e: Event) => void; }) { @@ -49,7 +49,7 @@ const notificationHeaderStyles = ({ display: flex; align-items: center; justify-content: flex-start; - background-color: ${themes[theme].background.alt}; + background-color: ${themes[theme].background}; padding: 12px 16px 8px 16px; white-space: nowrap; diff --git a/apps/browser/src/autofill/content/components/rows/button-row.ts b/apps/browser/src/autofill/content/components/rows/button-row.ts index 942c8dd55fe..1feef016a81 100644 --- a/apps/browser/src/autofill/content/components/rows/button-row.ts +++ b/apps/browser/src/autofill/content/components/rows/button-row.ts @@ -11,16 +11,18 @@ import { DropdownMenu } from "../dropdown-menu"; export function ButtonRow({ theme, buttonAction, + buttonText, }: { theme: Theme; buttonAction: (e: Event) => void; + buttonText: string; }) { return html`
${[ ActionButton({ buttonAction: buttonAction, - buttonText: "Action Button", + buttonText, theme, }), DropdownContainer({ diff --git a/apps/browser/src/autofill/content/notification-bar.ts b/apps/browser/src/autofill/content/notification-bar.ts index 8c6251b7030..58480cd6d83 100644 --- a/apps/browser/src/autofill/content/notification-bar.ts +++ b/apps/browser/src/autofill/content/notification-bar.ts @@ -193,6 +193,8 @@ async function loadNotificationBar() { { command: "saveCipherAttemptCompleted", error: msg.data?.error, + username: msg.data?.username, + cipherId: msg.data?.cipherId, }, "*", ); diff --git a/apps/browser/src/autofill/notification/abstractions/notification-bar.ts b/apps/browser/src/autofill/notification/abstractions/notification-bar.ts index 53948a26a2e..cb14a86dffa 100644 --- a/apps/browser/src/autofill/notification/abstractions/notification-bar.ts +++ b/apps/browser/src/autofill/notification/abstractions/notification-bar.ts @@ -19,10 +19,11 @@ type NotificationBarIframeInitData = { }; type NotificationBarWindowMessage = { - [key: string]: any; command: string; error?: string; initData?: NotificationBarIframeInitData; + username?: string; + cipherId?: string; }; type NotificationBarWindowMessageHandlers = { diff --git a/apps/browser/src/autofill/notification/bar.ts b/apps/browser/src/autofill/notification/bar.ts index 5a8d7855bea..c3f29e1332f 100644 --- a/apps/browser/src/autofill/notification/bar.ts +++ b/apps/browser/src/autofill/notification/bar.ts @@ -7,6 +7,7 @@ import { ConsoleLogService } from "@bitwarden/common/platform/services/console-l import type { FolderView } from "@bitwarden/common/vault/models/view/folder.view"; import { AdjustNotificationBarMessageData } from "../background/abstractions/notification.background"; +import { NotificationConfirmationContainer } from "../content/components/notification/confirmation-container"; import { NotificationContainer } from "../content/components/notification/container"; import { buildSvgDomElement } from "../utils"; import { circleCheckIcon } from "../utils/svg-icons"; @@ -22,12 +23,17 @@ const logService = new ConsoleLogService(false); let notificationBarIframeInitData: NotificationBarIframeInitData = {}; let windowMessageOrigin: string; let useComponentBar = false; + const notificationBarWindowMessageHandlers: NotificationBarWindowMessageHandlers = { initNotificationBar: ({ message }) => initNotificationBar(message), - saveCipherAttemptCompleted: ({ message }) => handleSaveCipherAttemptCompletedMessage(message), + saveCipherAttemptCompleted: ({ message }) => + useComponentBar + ? handleSaveCipherConfirmation(message) + : handleSaveCipherAttemptCompletedMessage(message), }; globalThis.addEventListener("load", load); + function load() { setupWindowMessageListener(); sendPlatformMessage({ command: "notificationRefreshFlagValue" }, (flagValue) => { @@ -35,7 +41,6 @@ function load() { applyNotificationBarStyle(); }); } - function applyNotificationBarStyle() { if (!useComponentBar) { // eslint-disable-next-line @typescript-eslint/no-require-imports @@ -44,6 +49,35 @@ function applyNotificationBarStyle() { postMessageToParent({ command: "initNotificationBar" }); } +function getI18n() { + return { + appName: chrome.i18n.getMessage("appName"), + close: chrome.i18n.getMessage("close"), + folder: chrome.i18n.getMessage("folder"), + loginSaveSuccess: chrome.i18n.getMessage("loginSaveSuccess"), + loginSaveSuccessDetails: chrome.i18n.getMessage("loginSaveSuccessDetails"), + loginUpdateSuccess: chrome.i18n.getMessage("loginUpdateSuccess"), + loginUpdateSuccessDetails: chrome.i18n.getMessage("loginUpdatedSuccessDetails"), + newItem: chrome.i18n.getMessage("newItem"), + never: chrome.i18n.getMessage("never"), + notificationAddDesc: chrome.i18n.getMessage("notificationAddDesc"), + notificationAddSave: chrome.i18n.getMessage("notificationAddSave"), + notificationChangeDesc: chrome.i18n.getMessage("notificationChangeDesc"), + notificationChangeSave: chrome.i18n.getMessage("notificationChangeSave"), + notificationEdit: chrome.i18n.getMessage("edit"), + notificationUnlock: chrome.i18n.getMessage("notificationUnlock"), + notificationUnlockDesc: chrome.i18n.getMessage("notificationUnlockDesc"), + saveAction: chrome.i18n.getMessage("notificationAddSave"), + saveAsNewLoginAction: chrome.i18n.getMessage("saveAsNewLoginAction"), + saveFailure: chrome.i18n.getMessage("saveFailure"), + saveFailureDetails: chrome.i18n.getMessage("saveFailureDetails"), + saveLoginPrompt: chrome.i18n.getMessage("saveLoginPrompt"), + updateLoginAction: chrome.i18n.getMessage("updateLoginAction"), + updateLoginPrompt: chrome.i18n.getMessage("updateLoginPrompt"), + view: chrome.i18n.getMessage("view"), + }; +} + function initNotificationBar(message: NotificationBarWindowMessage) { const { initData } = message; if (!initData) { @@ -52,42 +86,13 @@ function initNotificationBar(message: NotificationBarWindowMessage) { notificationBarIframeInitData = initData; const { isVaultLocked, theme } = notificationBarIframeInitData; - - const i18n = { - appName: chrome.i18n.getMessage("appName"), - close: chrome.i18n.getMessage("close"), - never: chrome.i18n.getMessage("never"), - folder: chrome.i18n.getMessage("folder"), - notificationAddSave: chrome.i18n.getMessage("notificationAddSave"), - notificationAddDesc: chrome.i18n.getMessage("notificationAddDesc"), - notificationEdit: chrome.i18n.getMessage("edit"), - notificationChangeSave: chrome.i18n.getMessage("notificationChangeSave"), - notificationChangeDesc: chrome.i18n.getMessage("notificationChangeDesc"), - notificationUnlock: chrome.i18n.getMessage("notificationUnlock"), - notificationUnlockDesc: chrome.i18n.getMessage("notificationUnlockDesc"), - - // @TODO move values to message catalog - saveAction: "Save", - saveAsNewLoginAction: "Save as new login", - updateLoginAction: "Update login", - saveLoginPrompt: "Save login?", - updateLoginPrompt: "Update existing login?", - loginSaveSuccess: "Login saved", - loginSaveSuccessDetails: "Login saved to Bitwarden.", - loginUpdateSuccess: "Login saved", - loginUpdateSuccessDetails: "Login updated in Bitwarden.", - saveFailure: "Error saving", - saveFailureDetails: "Oh no! We couldn't save this. Try entering the details as a New item", - }; + const i18n = getI18n(); + const resolvedTheme = getResolvedTheme(theme); if (useComponentBar) { document.body.innerHTML = ""; // Current implementations utilize a require for scss files which creates the need to remove the node. document.head.querySelectorAll('link[rel="stylesheet"]').forEach((node) => node.remove()); - const themeType = getTheme(globalThis, theme); - - // There are other possible passed theme values, but for now, resolve to dark or light - const resolvedTheme: Theme = themeType === ThemeTypes.Dark ? ThemeTypes.Dark : ThemeTypes.Light; sendPlatformMessage({ command: "bgGetDecryptedCiphers" }, (cipherData) => { // @TODO use context to avoid prop drilling @@ -105,77 +110,71 @@ function initNotificationBar(message: NotificationBarWindowMessage) { document.body, ); }); - } + } else { + setNotificationBarTheme(); - setNotificationBarTheme(); + (document.getElementById("logo") as HTMLImageElement).src = isVaultLocked + ? chrome.runtime.getURL("images/icon38_locked.png") + : chrome.runtime.getURL("images/icon38.png"); - (document.getElementById("logo") as HTMLImageElement).src = isVaultLocked - ? chrome.runtime.getURL("images/icon38_locked.png") - : chrome.runtime.getURL("images/icon38.png"); + setupLogoLink(i18n); - setupLogoLink(i18n); + // i18n for "Add" template + const addTemplate = document.getElementById("template-add") as HTMLTemplateElement; - // i18n for "Add" template - const addTemplate = document.getElementById("template-add") as HTMLTemplateElement; + const neverButton = addTemplate.content.getElementById("never-save"); + neverButton.textContent = i18n.never; - const neverButton = addTemplate.content.getElementById("never-save"); - neverButton.textContent = i18n.never; + const selectFolder = addTemplate.content.getElementById("select-folder"); + selectFolder.hidden = isVaultLocked || removeIndividualVault(); + selectFolder.setAttribute("aria-label", i18n.folder); - const selectFolder = addTemplate.content.getElementById("select-folder"); - selectFolder.hidden = isVaultLocked || removeIndividualVault(); - selectFolder.setAttribute("aria-label", i18n.folder); + const addButton = addTemplate.content.getElementById("add-save"); + addButton.textContent = i18n.notificationAddSave; - const addButton = addTemplate.content.getElementById("add-save"); - addButton.textContent = i18n.notificationAddSave; + const addEditButton = addTemplate.content.getElementById("add-edit"); + // If Remove Individual Vault policy applies, "Add" opens the edit tab, so we hide the Edit button + addEditButton.hidden = removeIndividualVault(); + addEditButton.textContent = i18n.notificationEdit; - const addEditButton = addTemplate.content.getElementById("add-edit"); - // If Remove Individual Vault policy applies, "Add" opens the edit tab, so we hide the Edit button - addEditButton.hidden = removeIndividualVault(); - addEditButton.textContent = i18n.notificationEdit; + addTemplate.content.getElementById("add-text").textContent = i18n.notificationAddDesc; - addTemplate.content.getElementById("add-text").textContent = i18n.notificationAddDesc; + // i18n for "Change" (update password) template + const changeTemplate = document.getElementById("template-change") as HTMLTemplateElement; - // i18n for "Change" (update password) template - const changeTemplate = document.getElementById("template-change") as HTMLTemplateElement; + const changeButton = changeTemplate.content.getElementById("change-save"); + changeButton.textContent = i18n.notificationChangeSave; - const changeButton = changeTemplate.content.getElementById("change-save"); - changeButton.textContent = i18n.notificationChangeSave; + const changeEditButton = changeTemplate.content.getElementById("change-edit"); + changeEditButton.textContent = i18n.notificationEdit; - const changeEditButton = changeTemplate.content.getElementById("change-edit"); - changeEditButton.textContent = i18n.notificationEdit; + changeTemplate.content.getElementById("change-text").textContent = i18n.notificationChangeDesc; - changeTemplate.content.getElementById("change-text").textContent = i18n.notificationChangeDesc; + // i18n for "Unlock" (unlock extension) template + const unlockTemplate = document.getElementById("template-unlock") as HTMLTemplateElement; - // i18n for "Unlock" (unlock extension) template - const unlockTemplate = document.getElementById("template-unlock") as HTMLTemplateElement; + const unlockButton = unlockTemplate.content.getElementById("unlock-vault"); + unlockButton.textContent = i18n.notificationUnlock; - const unlockButton = unlockTemplate.content.getElementById("unlock-vault"); - unlockButton.textContent = i18n.notificationUnlock; + unlockTemplate.content.getElementById("unlock-text").textContent = i18n.notificationUnlockDesc; - unlockTemplate.content.getElementById("unlock-text").textContent = i18n.notificationUnlockDesc; + // i18n for body content + const closeButton = document.getElementById("close-button"); + closeButton.title = i18n.close; - // i18n for body content - const closeButton = document.getElementById("close-button"); - closeButton.title = i18n.close; + const notificationType = initData.type; + if (notificationType === "add") { + handleTypeAdd(); + } else if (notificationType === "change") { + handleTypeChange(); + } else if (notificationType === "unlock") { + handleTypeUnlock(); + } - const notificationType = initData.type; - if (notificationType === "add") { - handleTypeAdd(); - } else if (notificationType === "change") { - handleTypeChange(); - } else if (notificationType === "unlock") { - handleTypeUnlock(); - } + closeButton.addEventListener("click", handleCloseNotification); - closeButton.addEventListener("click", handleCloseNotification); - - globalThis.addEventListener("resize", adjustHeight); - adjustHeight(); - function handleCloseNotification(e: Event) { - e.preventDefault(); - sendPlatformMessage({ - command: "bgCloseNotificationBar", - }); + globalThis.addEventListener("resize", adjustHeight); + adjustHeight(); } function handleEditOrUpdateAction(e: Event) { const notificationType = initData.type; @@ -183,6 +182,12 @@ function initNotificationBar(message: NotificationBarWindowMessage) { notificationType === "add" ? sendSaveCipherMessage(true) : sendSaveCipherMessage(false); } } +function handleCloseNotification(e: Event) { + e.preventDefault(); + sendPlatformMessage({ + command: "bgCloseNotificationBar", + }); +} function handleSaveAction(e: Event) { e.preventDefault(); @@ -282,6 +287,37 @@ function handleSaveCipherAttemptCompletedMessage(message: NotificationBarWindowM ); } +function openViewVaultItemPopout(e: Event, cipherId: string) { + e.preventDefault(); + sendPlatformMessage({ + command: "bgOpenVault", + cipherId, + }); +} + +function handleSaveCipherConfirmation(message: NotificationBarWindowMessage) { + const { theme, type } = notificationBarIframeInitData; + const { error, username, cipherId } = message; + const i18n = getI18n(); + const resolvedTheme = getResolvedTheme(theme); + + globalThis.setTimeout(() => sendPlatformMessage({ command: "bgCloseNotificationBar" }), 5000); + + return render( + NotificationConfirmationContainer({ + ...notificationBarIframeInitData, + type: type as NotificationType, + theme: resolvedTheme, + handleCloseNotification, + i18n, + error, + username, + handleOpenVault: (e) => openViewVaultItemPopout(e, cipherId), + }), + document.body, + ); +} + function handleTypeUnlock() { setContent(document.getElementById("template-unlock") as HTMLTemplateElement); @@ -395,6 +431,14 @@ function getTheme(globalThis: any, theme: NotificationBarIframeInitData["theme"] return theme; } +function getResolvedTheme(theme: Theme) { + const themeType = getTheme(globalThis, theme); + + // There are other possible passed theme values, but for now, resolve to dark or light + const resolvedTheme: Theme = themeType === ThemeTypes.Dark ? ThemeTypes.Dark : ThemeTypes.Light; + return resolvedTheme; +} + function setNotificationBarTheme() { const theme = getTheme(globalThis, notificationBarIframeInitData.theme); diff --git a/apps/browser/src/autofill/types/index.ts b/apps/browser/src/autofill/types/index.ts index 58ac95e7edf..30ebf38fef5 100644 --- a/apps/browser/src/autofill/types/index.ts +++ b/apps/browser/src/autofill/types/index.ts @@ -1,6 +1,5 @@ -import { VaultTimeoutAction } from "@bitwarden/common/enums/vault-timeout-action.enum"; +import { VaultTimeout, VaultTimeoutAction } from "@bitwarden/common/key-management/vault-timeout"; import { Region } from "@bitwarden/common/platform/abstractions/environment.service"; -import { VaultTimeout } from "@bitwarden/common/types/vault-timeout.type"; import { CipherType } from "@bitwarden/common/vault/enums"; export type UserSettings = { diff --git a/apps/browser/src/background/commands.background.ts b/apps/browser/src/background/commands.background.ts index 5cf58b1653f..f09ebb6c8a1 100644 --- a/apps/browser/src/background/commands.background.ts +++ b/apps/browser/src/background/commands.background.ts @@ -1,9 +1,9 @@ // FIXME: Update this file to be type safe and remove this and next line // @ts-strict-ignore -import { VaultTimeoutService } from "@bitwarden/common/abstractions/vault-timeout/vault-timeout.service"; import { AuthService } from "@bitwarden/common/auth/abstractions/auth.service"; import { AuthenticationStatus } from "@bitwarden/common/auth/enums/authentication-status"; import { ExtensionCommand, ExtensionCommandType } from "@bitwarden/common/autofill/constants"; +import { VaultTimeoutService } from "@bitwarden/common/key-management/vault-timeout"; import { PlatformUtilsService } from "@bitwarden/common/platform/abstractions/platform-utils.service"; import { openUnlockPopout } from "../auth/popup/utils/auth-popout-window"; diff --git a/apps/browser/src/background/idle.background.ts b/apps/browser/src/background/idle.background.ts index 08d4b9fc00c..8dccc933375 100644 --- a/apps/browser/src/background/idle.background.ts +++ b/apps/browser/src/background/idle.background.ts @@ -2,12 +2,14 @@ // @ts-strict-ignore import { firstValueFrom } from "rxjs"; -import { VaultTimeoutSettingsService } from "@bitwarden/common/abstractions/vault-timeout/vault-timeout-settings.service"; -import { VaultTimeoutService } from "@bitwarden/common/abstractions/vault-timeout/vault-timeout.service"; import { AccountService } from "@bitwarden/common/auth/abstractions/account.service"; -import { VaultTimeoutAction } from "@bitwarden/common/enums/vault-timeout-action.enum"; +import { + VaultTimeoutAction, + VaultTimeoutService, + VaultTimeoutSettingsService, + VaultTimeoutStringType, +} from "@bitwarden/common/key-management/vault-timeout"; import { NotificationsService } from "@bitwarden/common/platform/notifications"; -import { VaultTimeoutStringType } from "@bitwarden/common/types/vault-timeout.type"; const IdleInterval = 60 * 5; // 5 minutes diff --git a/apps/browser/src/background/main.background.ts b/apps/browser/src/background/main.background.ts index bb9ec41cc7d..7251dea0580 100644 --- a/apps/browser/src/background/main.background.ts +++ b/apps/browser/src/background/main.background.ts @@ -1,5 +1,7 @@ // FIXME: Update this file to be type safe and remove this and next line // @ts-strict-ignore +import "core-js/proposals/explicit-resource-management"; + import { filter, firstValueFrom, map, merge, Subject, timeout } from "rxjs"; import { CollectionService, DefaultCollectionService } from "@bitwarden/admin-console/common"; @@ -19,7 +21,6 @@ import { AuditService as AuditServiceAbstraction } from "@bitwarden/common/abstr import { EventCollectionService as EventCollectionServiceAbstraction } from "@bitwarden/common/abstractions/event/event-collection.service"; import { EventUploadService as EventUploadServiceAbstraction } from "@bitwarden/common/abstractions/event/event-upload.service"; import { SearchService as SearchServiceAbstraction } from "@bitwarden/common/abstractions/search.service"; -import { VaultTimeoutSettingsService as VaultTimeoutSettingsServiceAbstraction } from "@bitwarden/common/abstractions/vault-timeout/vault-timeout-settings.service"; import { InternalOrganizationServiceAbstraction } from "@bitwarden/common/admin-console/abstractions/organization/organization.service.abstraction"; import { PolicyApiServiceAbstraction } from "@bitwarden/common/admin-console/abstractions/policy/policy-api.service.abstraction"; import { InternalPolicyService as InternalPolicyServiceAbstraction } from "@bitwarden/common/admin-console/abstractions/policy/policy.service.abstraction"; @@ -82,6 +83,11 @@ import { EncryptServiceImplementation } from "@bitwarden/common/key-management/c import { FallbackBulkEncryptService } from "@bitwarden/common/key-management/crypto/services/fallback-bulk-encrypt.service"; import { MultithreadEncryptServiceImplementation } from "@bitwarden/common/key-management/crypto/services/multithread-encrypt.service.implementation"; import { DefaultProcessReloadService } from "@bitwarden/common/key-management/services/default-process-reload.service"; +import { + DefaultVaultTimeoutSettingsService, + VaultTimeoutSettingsService, + VaultTimeoutStringType, +} from "@bitwarden/common/key-management/vault-timeout"; import { AppIdService as AppIdServiceAbstraction } from "@bitwarden/common/platform/abstractions/app-id.service"; import { ConfigApiServiceAbstraction } from "@bitwarden/common/platform/abstractions/config/config-api.service.abstraction"; import { ConfigService } from "@bitwarden/common/platform/abstractions/config/config.service"; @@ -169,7 +175,6 @@ import { AuditService } from "@bitwarden/common/services/audit.service"; import { EventCollectionService } from "@bitwarden/common/services/event/event-collection.service"; import { EventUploadService } from "@bitwarden/common/services/event/event-upload.service"; import { SearchService } from "@bitwarden/common/services/search.service"; -import { VaultTimeoutSettingsService } from "@bitwarden/common/services/vault-timeout/vault-timeout-settings.service"; import { PasswordStrengthService, PasswordStrengthServiceAbstraction, @@ -180,7 +185,6 @@ import { SendStateProvider } from "@bitwarden/common/tools/send/services/send-st import { SendService } from "@bitwarden/common/tools/send/services/send.service"; import { InternalSendService as InternalSendServiceAbstraction } from "@bitwarden/common/tools/send/services/send.service.abstraction"; import { UserId } from "@bitwarden/common/types/guid"; -import { VaultTimeoutStringType } from "@bitwarden/common/types/vault-timeout.type"; import { CipherService as CipherServiceAbstraction } from "@bitwarden/common/vault/abstractions/cipher.service"; import { CipherFileUploadService as CipherFileUploadServiceAbstraction } from "@bitwarden/common/vault/abstractions/file-upload/cipher-file-upload.service"; import { FolderApiServiceAbstraction } from "@bitwarden/common/vault/abstractions/folder/folder-api.service.abstraction"; @@ -252,6 +256,7 @@ import AutofillService from "../autofill/services/autofill.service"; import { InlineMenuFieldQualificationService } from "../autofill/services/inline-menu-field-qualification.service"; import { SafariApp } from "../browser/safariApp"; import { BackgroundBrowserBiometricsService } from "../key-management/biometrics/background-browser-biometrics.service"; +import VaultTimeoutService from "../key-management/vault-timeout/vault-timeout.service"; import { BrowserApi } from "../platform/browser/browser-api"; import { flagEnabled } from "../platform/flags"; import { UpdateBadge } from "../platform/listeners/update-badge"; @@ -277,7 +282,6 @@ import { BrowserStorageServiceProvider } from "../platform/storage/browser-stora import { OffscreenStorageService } from "../platform/storage/offscreen-storage.service"; import { SyncServiceListener } from "../platform/sync/sync-service.listener"; import { fromChromeRuntimeMessaging } from "../platform/utils/from-chrome-runtime-messaging"; -import VaultTimeoutService from "../services/vault-timeout/vault-timeout.service"; import { VaultFilterService } from "../vault/services/vault-filter.service"; import CommandsBackground from "./commands.background"; @@ -308,7 +312,7 @@ export default class MainBackground { userDecryptionOptionsService: InternalUserDecryptionOptionsServiceAbstraction; collectionService: CollectionService; vaultTimeoutService?: VaultTimeoutService; - vaultTimeoutSettingsService: VaultTimeoutSettingsServiceAbstraction; + vaultTimeoutSettingsService: VaultTimeoutSettingsService; passwordGenerationService: PasswordGenerationServiceAbstraction; syncService: SyncService; passwordStrengthService: PasswordStrengthServiceAbstraction; @@ -682,7 +686,7 @@ export default class MainBackground { this.organizationService = new DefaultOrganizationService(this.stateProvider); this.policyService = new PolicyService(this.stateProvider, this.organizationService); - this.vaultTimeoutSettingsService = new VaultTimeoutSettingsService( + this.vaultTimeoutSettingsService = new DefaultVaultTimeoutSettingsService( this.accountService, this.pinService, this.userDecryptionOptionsService, @@ -1290,7 +1294,7 @@ export default class MainBackground { } this.containerService.attachToGlobal(self); - await this.sdkLoadService.load(); + await this.sdkLoadService.loadAndInit(); // Only the "true" background should run migrations await this.stateService.init({ runMigrations: true }); diff --git a/apps/browser/src/billing/popup/settings/premium-v2.component.html b/apps/browser/src/billing/popup/settings/premium-v2.component.html index f578de8ae7a..4f87a0f6781 100644 --- a/apps/browser/src/billing/popup/settings/premium-v2.component.html +++ b/apps/browser/src/billing/popup/settings/premium-v2.component.html @@ -45,14 +45,14 @@ #refreshBtn type="button" (click)="refresh()" - [disabled]="$any(refreshBtn).loading" + [disabled]="$any(refreshBtn).loading()" [appApiAction]="refreshPromise" bitButton > - {{ "premiumRefresh" | i18n }} + {{ "premiumRefresh" | i18n }} diff --git a/apps/browser/src/images/at-risk-password-carousel/generate_password.dark.png b/apps/browser/src/images/at-risk-password-carousel/generate_password.dark.png new file mode 100644 index 00000000000..8d0fbbdec56 Binary files /dev/null and b/apps/browser/src/images/at-risk-password-carousel/generate_password.dark.png differ diff --git a/apps/browser/src/images/at-risk-password-carousel/generate_password.light.png b/apps/browser/src/images/at-risk-password-carousel/generate_password.light.png new file mode 100644 index 00000000000..4e46ce2adc3 Binary files /dev/null and b/apps/browser/src/images/at-risk-password-carousel/generate_password.light.png differ diff --git a/apps/browser/src/images/at-risk-password-carousel/review_at-risk_logins.dark.png b/apps/browser/src/images/at-risk-password-carousel/review_at-risk_logins.dark.png new file mode 100644 index 00000000000..47e1d40bd4e Binary files /dev/null and b/apps/browser/src/images/at-risk-password-carousel/review_at-risk_logins.dark.png differ diff --git a/apps/browser/src/images/at-risk-password-carousel/review_at-risk_logins.light.png b/apps/browser/src/images/at-risk-password-carousel/review_at-risk_logins.light.png new file mode 100644 index 00000000000..a248f04c978 Binary files /dev/null and b/apps/browser/src/images/at-risk-password-carousel/review_at-risk_logins.light.png differ diff --git a/apps/browser/src/images/at-risk-password-carousel/update_login.dark.png b/apps/browser/src/images/at-risk-password-carousel/update_login.dark.png new file mode 100644 index 00000000000..a04d3e369ba Binary files /dev/null and b/apps/browser/src/images/at-risk-password-carousel/update_login.dark.png differ diff --git a/apps/browser/src/images/at-risk-password-carousel/update_login.light.png b/apps/browser/src/images/at-risk-password-carousel/update_login.light.png new file mode 100644 index 00000000000..3bc176f8acd Binary files /dev/null and b/apps/browser/src/images/at-risk-password-carousel/update_login.light.png differ diff --git a/apps/browser/src/key-management/lock/services/extension-lock-component.service.spec.ts b/apps/browser/src/key-management/lock/services/extension-lock-component.service.spec.ts index faf5036d0f7..9afc723825c 100644 --- a/apps/browser/src/key-management/lock/services/extension-lock-component.service.spec.ts +++ b/apps/browser/src/key-management/lock/services/extension-lock-component.service.spec.ts @@ -6,7 +6,7 @@ import { PinServiceAbstraction, UserDecryptionOptionsServiceAbstraction, } from "@bitwarden/auth/common"; -import { VaultTimeoutSettingsService } from "@bitwarden/common/abstractions/vault-timeout/vault-timeout-settings.service"; +import { VaultTimeoutSettingsService } from "@bitwarden/common/key-management/vault-timeout"; import { PlatformUtilsService } from "@bitwarden/common/platform/abstractions/platform-utils.service"; import { UserId } from "@bitwarden/common/types/guid"; import { diff --git a/apps/browser/src/services/vault-timeout/foreground-vault-timeout.service.ts b/apps/browser/src/key-management/vault-timeout/foreground-vault-timeout.service.ts similarity index 90% rename from apps/browser/src/services/vault-timeout/foreground-vault-timeout.service.ts rename to apps/browser/src/key-management/vault-timeout/foreground-vault-timeout.service.ts index 0d49595d2eb..5003dfd5b29 100644 --- a/apps/browser/src/services/vault-timeout/foreground-vault-timeout.service.ts +++ b/apps/browser/src/key-management/vault-timeout/foreground-vault-timeout.service.ts @@ -1,6 +1,6 @@ // FIXME: Update this file to be type safe and remove this and next line // @ts-strict-ignore -import { VaultTimeoutService as BaseVaultTimeoutService } from "@bitwarden/common/abstractions/vault-timeout/vault-timeout.service"; +import { VaultTimeoutService as BaseVaultTimeoutService } from "@bitwarden/common/key-management/vault-timeout/abstractions/vault-timeout.service"; import { MessagingService } from "@bitwarden/common/platform/abstractions/messaging.service"; import { UserId } from "@bitwarden/common/types/guid"; diff --git a/apps/browser/src/services/vault-timeout/vault-timeout.service.ts b/apps/browser/src/key-management/vault-timeout/vault-timeout.service.ts similarity index 93% rename from apps/browser/src/services/vault-timeout/vault-timeout.service.ts rename to apps/browser/src/key-management/vault-timeout/vault-timeout.service.ts index e0b9db5422b..51f90fb98a6 100644 --- a/apps/browser/src/services/vault-timeout/vault-timeout.service.ts +++ b/apps/browser/src/key-management/vault-timeout/vault-timeout.service.ts @@ -1,4 +1,4 @@ -import { VaultTimeoutService as BaseVaultTimeoutService } from "@bitwarden/common/services/vault-timeout/vault-timeout.service"; +import { VaultTimeoutService as BaseVaultTimeoutService } from "@bitwarden/common/key-management/vault-timeout/services/vault-timeout.service"; import { SafariApp } from "../../browser/safariApp"; diff --git a/apps/browser/src/platform/services/sdk/browser-sdk-load.service.ts b/apps/browser/src/platform/services/sdk/browser-sdk-load.service.ts index ca41127407c..409ff0dea06 100644 --- a/apps/browser/src/platform/services/sdk/browser-sdk-load.service.ts +++ b/apps/browser/src/platform/services/sdk/browser-sdk-load.service.ts @@ -60,8 +60,10 @@ async function importModule(): Promise { return (globalThis as GlobalWithWasmInit).initSdk; } -export class BrowserSdkLoadService implements SdkLoadService { - constructor(readonly logService: LogService) {} +export class BrowserSdkLoadService extends SdkLoadService { + constructor(readonly logService: LogService) { + super(); + } async load(): Promise { const startTime = performance.now(); diff --git a/apps/browser/src/popup/app-routing.module.ts b/apps/browser/src/popup/app-routing.module.ts index eb09f719aaf..76894b23d0a 100644 --- a/apps/browser/src/popup/app-routing.module.ts +++ b/apps/browser/src/popup/app-routing.module.ts @@ -17,7 +17,6 @@ import { tdeDecryptionRequiredGuard, unauthGuardFn, } from "@bitwarden/angular/auth/guards"; -import { canAccessFeature } from "@bitwarden/angular/platform/guard/feature-flag.guard"; import { NewDeviceVerificationNoticeGuard } from "@bitwarden/angular/vault/guards"; import { AnonLayoutWrapperComponent, @@ -45,7 +44,6 @@ import { UserLockIcon, VaultIcon, } from "@bitwarden/auth/angular"; -import { FeatureFlag } from "@bitwarden/common/enums/feature-flag.enum"; import { LockComponent } from "@bitwarden/key-management-ui"; import { NewDeviceVerificationNoticePageOneComponent, @@ -245,11 +243,7 @@ const routes: Routes = [ { path: "device-verification", component: ExtensionAnonLayoutWrapperComponent, - canActivate: [ - canAccessFeature(FeatureFlag.NewDeviceVerification), - unauthGuardFn(), - activeAuthGuard(), - ], + canActivate: [unauthGuardFn(), activeAuthGuard()], children: [{ path: "", component: NewDeviceVerificationComponent }], data: { pageIcon: DeviceVerificationIcon, diff --git a/apps/browser/src/popup/polyfills.ts b/apps/browser/src/popup/polyfills.ts index f76b9e632fc..4bb2aa0bbee 100644 --- a/apps/browser/src/popup/polyfills.ts +++ b/apps/browser/src/popup/polyfills.ts @@ -1,2 +1,3 @@ import "core-js/stable"; +import "core-js/proposals/explicit-resource-management"; import "zone.js"; diff --git a/apps/browser/src/popup/services/init.service.ts b/apps/browser/src/popup/services/init.service.ts index 2ca25d690f1..fe6fba85a4b 100644 --- a/apps/browser/src/popup/services/init.service.ts +++ b/apps/browser/src/popup/services/init.service.ts @@ -32,7 +32,7 @@ export class InitService { init() { return async () => { - await this.sdkLoadService.load(); + await this.sdkLoadService.loadAndInit(); await this.stateService.init({ runMigrations: false }); // Browser background is responsible for migrations await this.i18nService.init(); this.twoFactorService.init(); diff --git a/apps/browser/src/popup/services/services.module.ts b/apps/browser/src/popup/services/services.module.ts index b7c3530b3bb..b7980d83aa6 100644 --- a/apps/browser/src/popup/services/services.module.ts +++ b/apps/browser/src/popup/services/services.module.ts @@ -40,7 +40,6 @@ import { } from "@bitwarden/auth/common"; import { ApiService } from "@bitwarden/common/abstractions/api.service"; import { EventCollectionService as EventCollectionServiceAbstraction } from "@bitwarden/common/abstractions/event/event-collection.service"; -import { VaultTimeoutService } from "@bitwarden/common/abstractions/vault-timeout/vault-timeout.service"; import { PolicyService } from "@bitwarden/common/admin-console/abstractions/policy/policy.service.abstraction"; import { DefaultOrganizationService } from "@bitwarden/common/admin-console/services/organization/default-organization.service"; import { @@ -66,6 +65,10 @@ import { import { BillingAccountProfileStateService } from "@bitwarden/common/billing/abstractions/account/billing-account-profile-state.service"; import { ClientType } from "@bitwarden/common/enums"; import { EncryptService } from "@bitwarden/common/key-management/crypto/abstractions/encrypt.service"; +import { + VaultTimeoutService, + VaultTimeoutStringType, +} from "@bitwarden/common/key-management/vault-timeout"; import { AnimationControlService, DefaultAnimationControlService, @@ -109,7 +112,6 @@ import { WindowStorageService } from "@bitwarden/common/platform/storage/window- import { SyncService } from "@bitwarden/common/platform/sync"; import { SendApiService } from "@bitwarden/common/tools/send/services/send-api.service.abstraction"; import { InternalSendService } from "@bitwarden/common/tools/send/services/send.service.abstraction"; -import { VaultTimeoutStringType } from "@bitwarden/common/types/vault-timeout.type"; import { CipherService } from "@bitwarden/common/vault/abstractions/cipher.service"; import { FolderApiServiceAbstraction } from "@bitwarden/common/vault/abstractions/folder/folder-api.service.abstraction"; import { @@ -144,6 +146,7 @@ import AutofillService from "../../autofill/services/autofill.service"; import { InlineMenuFieldQualificationService } from "../../autofill/services/inline-menu-field-qualification.service"; import { ForegroundBrowserBiometricsService } from "../../key-management/biometrics/foreground-browser-biometrics"; import { ExtensionLockComponentService } from "../../key-management/lock/services/extension-lock-component.service"; +import { ForegroundVaultTimeoutService } from "../../key-management/vault-timeout/foreground-vault-timeout.service"; import { BrowserApi } from "../../platform/browser/browser-api"; import { runInsideAngular } from "../../platform/browser/run-inside-angular.operator"; /* eslint-disable no-restricted-imports */ @@ -168,7 +171,6 @@ import { BrowserStorageServiceProvider } from "../../platform/storage/browser-st import { ForegroundMemoryStorageService } from "../../platform/storage/foreground-memory-storage.service"; import { ForegroundSyncService } from "../../platform/sync/foreground-sync.service"; import { fromChromeRuntimeMessaging } from "../../platform/utils/from-chrome-runtime-messaging"; -import { ForegroundVaultTimeoutService } from "../../services/vault-timeout/foreground-vault-timeout.service"; import { FilePopoutUtilsService } from "../../tools/popup/services/file-popout-utils.service"; import { Fido2UserVerificationService } from "../../vault/services/fido2-user-verification.service"; import { VaultBrowserStateService } from "../../vault/services/vault-browser-state.service"; diff --git a/apps/browser/src/vault/popup/components/at-risk-carousel-dialog/at-risk-carousel-dialog.component.html b/apps/browser/src/vault/popup/components/at-risk-carousel-dialog/at-risk-carousel-dialog.component.html new file mode 100644 index 00000000000..aee456a8f2b --- /dev/null +++ b/apps/browser/src/vault/popup/components/at-risk-carousel-dialog/at-risk-carousel-dialog.component.html @@ -0,0 +1,54 @@ + +
+ + + +

{{ "reviewAtRiskLogins" | i18n }}

+

+ {{ "reviewAtRiskLoginsSlideDesc" | i18n }} +

+
+ + +

{{ "generatePassword" | i18n }}

+

+ {{ "generatePasswordSlideDesc" | i18n }} +

+
+ + +

{{ "updateInBitwarden" | i18n }}

+

+ {{ "updateInBitwardenSlideDesc" | i18n }} +

+
+
+
+
+ +
+
diff --git a/apps/browser/src/vault/popup/components/at-risk-carousel-dialog/at-risk-carousel-dialog.component.ts b/apps/browser/src/vault/popup/components/at-risk-carousel-dialog/at-risk-carousel-dialog.component.ts new file mode 100644 index 00000000000..9af9f0aeda3 --- /dev/null +++ b/apps/browser/src/vault/popup/components/at-risk-carousel-dialog/at-risk-carousel-dialog.component.ts @@ -0,0 +1,46 @@ +import { DialogRef } from "@angular/cdk/dialog"; +import { Component, inject, signal } from "@angular/core"; + +import { ButtonModule, DialogModule, DialogService, TypographyModule } from "@bitwarden/components"; +import { I18nPipe } from "@bitwarden/ui-common"; +import { DarkImageSourceDirective, VaultCarouselModule } from "@bitwarden/vault"; + +export enum AtRiskCarouselDialogResult { + Dismissed = "dismissed", +} + +@Component({ + selector: "vault-at-risk-carousel-dialog", + templateUrl: "./at-risk-carousel-dialog.component.html", + imports: [ + DialogModule, + VaultCarouselModule, + TypographyModule, + ButtonModule, + DarkImageSourceDirective, + I18nPipe, + ], + standalone: true, +}) +export class AtRiskCarouselDialogComponent { + private dialogRef = inject(DialogRef); + + protected dismissBtnEnabled = signal(false); + + protected async dismiss() { + this.dialogRef.close(AtRiskCarouselDialogResult.Dismissed); + } + + protected onSlideChange(slideIndex: number) { + // Only enable the dismiss button on the last slide + if (slideIndex === 2) { + this.dismissBtnEnabled.set(true); + } + } + + static open(dialogService: DialogService) { + return dialogService.open(AtRiskCarouselDialogComponent, { + disableClose: true, + }); + } +} diff --git a/apps/browser/src/vault/popup/components/at-risk-passwords/at-risk-password-page.service.ts b/apps/browser/src/vault/popup/components/at-risk-passwords/at-risk-password-page.service.ts index f8cd4a60650..4f3c235dc3f 100644 --- a/apps/browser/src/vault/popup/components/at-risk-passwords/at-risk-password-page.service.ts +++ b/apps/browser/src/vault/popup/components/at-risk-passwords/at-risk-password-page.service.ts @@ -2,18 +2,27 @@ import { inject, Injectable } from "@angular/core"; import { map, Observable } from "rxjs"; import { - BANNERS_DISMISSED_DISK, + AT_RISK_PASSWORDS_PAGE_DISK, StateProvider, UserKeyDefinition, } from "@bitwarden/common/platform/state"; import { UserId } from "@bitwarden/common/types/guid"; -export const AT_RISK_PASSWORD_AUTOFILL_CALLOUT_DISMISSED_KEY = new UserKeyDefinition( - BANNERS_DISMISSED_DISK, - "atRiskPasswordAutofillBannerDismissed", +const AUTOFILL_CALLOUT_DISMISSED_KEY = new UserKeyDefinition( + AT_RISK_PASSWORDS_PAGE_DISK, + "autofillCalloutDismissed", { deserializer: (bannersDismissed) => bannersDismissed, - clearOn: [], // Do not clear dismissed banners + clearOn: [], // Do not clear dismissed callout + }, +); + +const GETTING_STARTED_CAROUSEL_DISMISSED_KEY = new UserKeyDefinition( + AT_RISK_PASSWORDS_PAGE_DISK, + "gettingStartedCarouselDismissed", + { + deserializer: (bannersDismissed) => bannersDismissed, + clearOn: [], // Do not clear dismissed carousel }, ); @@ -23,13 +32,23 @@ export class AtRiskPasswordPageService { isCalloutDismissed(userId: UserId): Observable { return this.stateProvider - .getUser(userId, AT_RISK_PASSWORD_AUTOFILL_CALLOUT_DISMISSED_KEY) + .getUser(userId, AUTOFILL_CALLOUT_DISMISSED_KEY) .state$.pipe(map((dismissed) => !!dismissed)); } async dismissCallout(userId: UserId): Promise { + await this.stateProvider.getUser(userId, AUTOFILL_CALLOUT_DISMISSED_KEY).update(() => true); + } + + isGettingStartedDismissed(userId: UserId): Observable { + return this.stateProvider + .getUser(userId, GETTING_STARTED_CAROUSEL_DISMISSED_KEY) + .state$.pipe(map((dismissed) => !!dismissed)); + } + + async dismissGettingStarted(userId: UserId): Promise { await this.stateProvider - .getUser(userId, AT_RISK_PASSWORD_AUTOFILL_CALLOUT_DISMISSED_KEY) + .getUser(userId, GETTING_STARTED_CAROUSEL_DISMISSED_KEY) .update(() => true); } } diff --git a/apps/browser/src/vault/popup/components/at-risk-passwords/at-risk-passwords.component.html b/apps/browser/src/vault/popup/components/at-risk-passwords/at-risk-passwords.component.html index 044848eec8c..cd93401c861 100644 --- a/apps/browser/src/vault/popup/components/at-risk-passwords/at-risk-passwords.component.html +++ b/apps/browser/src/vault/popup/components/at-risk-passwords/at-risk-passwords.component.html @@ -6,7 +6,7 @@ {{ "turnOnAutofill" | i18n }} diff --git a/apps/browser/src/vault/popup/components/at-risk-passwords/at-risk-passwords.component.spec.ts b/apps/browser/src/vault/popup/components/at-risk-passwords/at-risk-passwords.component.spec.ts index 39b9650538a..3bf786ad5b7 100644 --- a/apps/browser/src/vault/popup/components/at-risk-passwords/at-risk-passwords.component.spec.ts +++ b/apps/browser/src/vault/popup/components/at-risk-passwords/at-risk-passwords.component.spec.ts @@ -16,7 +16,7 @@ import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.servic import { PlatformUtilsService } from "@bitwarden/common/platform/abstractions/platform-utils.service"; import { CipherService } from "@bitwarden/common/vault/abstractions/cipher.service"; import { CipherView } from "@bitwarden/common/vault/models/view/cipher.view"; -import { ToastService } from "@bitwarden/components"; +import { DialogService, ToastService } from "@bitwarden/components"; import { ChangeLoginPasswordService, DefaultChangeLoginPasswordService, @@ -28,6 +28,7 @@ import { import { PopupHeaderComponent } from "../../../../platform/popup/layout/popup-header.component"; import { PopupPageComponent } from "../../../../platform/popup/layout/popup-page.component"; +import { AtRiskCarouselDialogResult } from "../at-risk-carousel-dialog/at-risk-carousel-dialog.component"; import { AtRiskPasswordPageService } from "./at-risk-password-page.service"; import { AtRiskPasswordsComponent } from "./at-risk-passwords.component"; @@ -73,6 +74,7 @@ describe("AtRiskPasswordsComponent", () => { const mockToastService = mock(); const mockAtRiskPasswordPageService = mock(); const mockChangeLoginPasswordService = mock(); + const mockDialogService = mock(); beforeEach(async () => { mockTasks$ = new BehaviorSubject([ @@ -109,6 +111,7 @@ describe("AtRiskPasswordsComponent", () => { calloutDismissed$ = new BehaviorSubject(false); setInlineMenuVisibility.mockClear(); mockToastService.showToast.mockClear(); + mockDialogService.open.mockClear(); mockAtRiskPasswordPageService.isCalloutDismissed.mockReturnValue(calloutDismissed$); await TestBed.configureTestingModule({ @@ -162,6 +165,7 @@ describe("AtRiskPasswordsComponent", () => { providers: [ AtRiskPasswordPageService, { provide: ChangeLoginPasswordService, useClass: DefaultChangeLoginPasswordService }, + DialogService, ], }, add: { @@ -169,6 +173,7 @@ describe("AtRiskPasswordsComponent", () => { providers: [ { provide: AtRiskPasswordPageService, useValue: mockAtRiskPasswordPageService }, { provide: ChangeLoginPasswordService, useValue: mockChangeLoginPasswordService }, + { provide: DialogService, useValue: mockDialogService }, ], }, }) @@ -193,8 +198,27 @@ describe("AtRiskPasswordsComponent", () => { describe("pageDescription$", () => { it("should use single org description when tasks belong to one org", async () => { - const description = await firstValueFrom(component["pageDescription$"]); - expect(description).toBe("atRiskPasswordsDescSingleOrg"); + // Single task + let description = await firstValueFrom(component["pageDescription$"]); + expect(description).toBe("atRiskPasswordDescSingleOrg"); + + // Multiple tasks + mockTasks$.next([ + { + id: "task", + organizationId: "org", + cipherId: "cipher", + type: SecurityTaskType.UpdateAtRiskCredential, + } as SecurityTask, + { + id: "task2", + organizationId: "org", + cipherId: "cipher2", + type: SecurityTaskType.UpdateAtRiskCredential, + } as SecurityTask, + ]); + description = await firstValueFrom(component["pageDescription$"]); + expect(description).toBe("atRiskPasswordsDescSingleOrgPlural"); }); it("should use multiple org description when tasks belong to multiple orgs", async () => { @@ -213,7 +237,7 @@ describe("AtRiskPasswordsComponent", () => { } as SecurityTask, ]); const description = await firstValueFrom(component["pageDescription$"]); - expect(description).toBe("atRiskPasswordsDescMultiOrg"); + expect(description).toBe("atRiskPasswordsDescMultiOrgPlural"); }); }); @@ -269,4 +293,31 @@ describe("AtRiskPasswordsComponent", () => { }); }); }); + + describe("getting started carousel", () => { + it("should open the carousel automatically if the user has not dismissed it", async () => { + mockAtRiskPasswordPageService.isGettingStartedDismissed.mockReturnValue(of(false)); + mockDialogService.open.mockReturnValue({ closed: of(undefined) } as any); + await component.ngOnInit(); + expect(mockDialogService.open).toHaveBeenCalled(); + }); + + it("should not open the carousel automatically if the user has already dismissed it", async () => { + mockDialogService.open.mockClear(); // Need to clear the mock since the component is already initialized once + mockAtRiskPasswordPageService.isGettingStartedDismissed.mockReturnValue(of(true)); + mockDialogService.open.mockReturnValue({ closed: of(undefined) } as any); + await component.ngOnInit(); + expect(mockDialogService.open).not.toHaveBeenCalled(); + }); + + it("should mark the carousel as dismissed when the user dismisses it", async () => { + mockAtRiskPasswordPageService.isGettingStartedDismissed.mockReturnValue(of(false)); + mockDialogService.open.mockReturnValue({ + closed: of(AtRiskCarouselDialogResult.Dismissed), + } as any); + await component.ngOnInit(); + expect(mockDialogService.open).toHaveBeenCalled(); + expect(mockAtRiskPasswordPageService.dismissGettingStarted).toHaveBeenCalled(); + }); + }); }); diff --git a/apps/browser/src/vault/popup/components/at-risk-passwords/at-risk-passwords.component.ts b/apps/browser/src/vault/popup/components/at-risk-passwords/at-risk-passwords.component.ts index 4753bc77ecb..dd3d53fed7d 100644 --- a/apps/browser/src/vault/popup/components/at-risk-passwords/at-risk-passwords.component.ts +++ b/apps/browser/src/vault/popup/components/at-risk-passwords/at-risk-passwords.component.ts @@ -1,5 +1,5 @@ import { CommonModule } from "@angular/common"; -import { Component, inject, signal } from "@angular/core"; +import { Component, inject, OnInit, signal } from "@angular/core"; import { Router } from "@angular/router"; import { combineLatest, firstValueFrom, map, of, shareReplay, startWith, switchMap } from "rxjs"; @@ -19,6 +19,8 @@ import { BadgeModule, ButtonModule, CalloutModule, + DialogModule, + DialogService, ItemModule, ToastService, TypographyModule, @@ -30,11 +32,16 @@ import { PasswordRepromptService, SecurityTaskType, TaskService, + VaultCarouselModule, } from "@bitwarden/vault"; import { PopOutComponent } from "../../../../platform/popup/components/pop-out.component"; import { PopupHeaderComponent } from "../../../../platform/popup/layout/popup-header.component"; import { PopupPageComponent } from "../../../../platform/popup/layout/popup-page.component"; +import { + AtRiskCarouselDialogComponent, + AtRiskCarouselDialogResult, +} from "../at-risk-carousel-dialog/at-risk-carousel-dialog.component"; import { AtRiskPasswordPageService } from "./at-risk-password-page.service"; @@ -50,6 +57,8 @@ import { AtRiskPasswordPageService } from "./at-risk-password-page.service"; CalloutModule, ButtonModule, BadgeModule, + DialogModule, + VaultCarouselModule, ], providers: [ AtRiskPasswordPageService, @@ -59,7 +68,7 @@ import { AtRiskPasswordPageService } from "./at-risk-password-page.service"; standalone: true, templateUrl: "./at-risk-passwords.component.html", }) -export class AtRiskPasswordsComponent { +export class AtRiskPasswordsComponent implements OnInit { private taskService = inject(TaskService); private organizationService = inject(OrganizationService); private cipherService = inject(CipherService); @@ -72,6 +81,7 @@ export class AtRiskPasswordsComponent { private atRiskPasswordPageService = inject(AtRiskPasswordPageService); private changeLoginPasswordService = inject(ChangeLoginPasswordService); private platformUtilsService = inject(PlatformUtilsService); + private dialogService = inject(DialogService); /** * The cipher that is currently being launched. Used to show a loading spinner on the badge button. @@ -105,14 +115,23 @@ export class AtRiskPasswordsComponent { startWith(true), ); - protected calloutDismissed$ = this.activeUserData$.pipe( + private calloutDismissed$ = this.activeUserData$.pipe( switchMap(({ userId }) => this.atRiskPasswordPageService.isCalloutDismissed(userId)), ); - - protected inlineAutofillSettingEnabled$ = this.autofillSettingsService.inlineMenuVisibility$.pipe( + private inlineAutofillSettingEnabled$ = this.autofillSettingsService.inlineMenuVisibility$.pipe( map((setting) => setting !== AutofillOverlayVisibility.Off), ); + protected showAutofillCallout$ = combineLatest([ + this.calloutDismissed$, + this.inlineAutofillSettingEnabled$, + ]).pipe( + map(([calloutDismissed, inlineAutofillSettingEnabled]) => { + return !calloutDismissed && !inlineAutofillSettingEnabled; + }), + startWith(false), + ); + protected atRiskItems$ = this.activeUserData$.pipe( map(({ tasks, ciphers }) => tasks @@ -133,14 +152,37 @@ export class AtRiskPasswordsComponent { const [orgId] = orgIds; return this.organizationService.organizations$(userId).pipe( getOrganizationById(orgId), - map((org) => this.i18nService.t("atRiskPasswordsDescSingleOrg", org?.name, tasks.length)), + map((org) => + this.i18nService.t( + tasks.length === 1 + ? "atRiskPasswordDescSingleOrg" + : "atRiskPasswordsDescSingleOrgPlural", + org?.name, + tasks.length, + ), + ), ); } - return of(this.i18nService.t("atRiskPasswordsDescMultiOrg", tasks.length)); + return of(this.i18nService.t("atRiskPasswordsDescMultiOrgPlural", tasks.length)); }), ); + async ngOnInit() { + const { userId } = await firstValueFrom(this.activeUserData$); + const gettingStartedDismissed = await firstValueFrom( + this.atRiskPasswordPageService.isGettingStartedDismissed(userId), + ); + if (!gettingStartedDismissed) { + const ref = AtRiskCarouselDialogComponent.open(this.dialogService); + + const result = await firstValueFrom(ref.closed); + if (result === AtRiskCarouselDialogResult.Dismissed) { + await this.atRiskPasswordPageService.dismissGettingStarted(userId); + } + } + } + async viewCipher(cipher: CipherView) { const repromptPassed = await this.passwordRepromptService.passwordRepromptCheck(cipher); if (!repromptPassed) { diff --git a/apps/browser/src/vault/popup/components/vault-v2/new-settings-callout/new-settings-callout.component.html b/apps/browser/src/vault/popup/components/vault-v2/new-settings-callout/new-settings-callout.component.html index 727a8e938af..a6abe8ed3ac 100644 --- a/apps/browser/src/vault/popup/components/vault-v2/new-settings-callout/new-settings-callout.component.html +++ b/apps/browser/src/vault/popup/components/vault-v2/new-settings-callout/new-settings-callout.component.html @@ -14,7 +14,13 @@ >
{{ "newCustomizationOptionsCalloutContent" | i18n }} - + {{ "newCustomizationOptionsCalloutLink" | i18n }}
diff --git a/apps/browser/src/vault/popup/components/vault-v2/new-settings-callout/new-settings-callout.component.ts b/apps/browser/src/vault/popup/components/vault-v2/new-settings-callout/new-settings-callout.component.ts index 71549906474..713dc21c424 100644 --- a/apps/browser/src/vault/popup/components/vault-v2/new-settings-callout/new-settings-callout.component.ts +++ b/apps/browser/src/vault/popup/components/vault-v2/new-settings-callout/new-settings-callout.component.ts @@ -9,8 +9,10 @@ import { AccountService } from "@bitwarden/common/auth/abstractions/account.serv import { getUserId } from "@bitwarden/common/auth/services/account.service"; import { LogService } from "@bitwarden/common/platform/abstractions/log.service"; import { UserId } from "@bitwarden/common/types/guid"; +import { VaultSettingsService } from "@bitwarden/common/vault/abstractions/vault-settings/vault-settings.service"; import { ButtonModule, PopoverModule } from "@bitwarden/components"; +import { VaultPopupCopyButtonsService } from "../../../services/vault-popup-copy-buttons.service"; import { VaultPageService } from "../vault-page.service"; @Component({ @@ -30,11 +32,18 @@ export class NewSettingsCalloutComponent implements OnInit, OnDestroy { private vaultPageService: VaultPageService, private router: Router, private logService: LogService, + private copyButtonService: VaultPopupCopyButtonsService, + private vaultSettingsService: VaultSettingsService, ) {} async ngOnInit() { this.activeUserId = await firstValueFrom(this.accountService.activeAccount$.pipe(getUserId)); + const showQuickCopyActions = await firstValueFrom(this.copyButtonService.showQuickCopyActions$); + const clickItemsToAutofillVaultView = await firstValueFrom( + this.vaultSettingsService.clickItemsToAutofillVaultView$, + ); + let profileCreatedDate: Date; try { @@ -50,7 +59,10 @@ export class NewSettingsCalloutComponent implements OnInit, OnDestroy { ); this.showNewCustomizationSettingsCallout = - !hasCalloutBeenDismissed && profileCreatedDate < new Date("2024-12-25"); + !showQuickCopyActions && + !clickItemsToAutofillVaultView && + !hasCalloutBeenDismissed && + profileCreatedDate < new Date("2024-12-25"); } async goToAppearance() { diff --git a/apps/browser/src/vault/popup/components/vault-v2/vault-page.service.ts b/apps/browser/src/vault/popup/components/vault-v2/vault-page.service.ts index 75354298c26..a7c52ed4c51 100644 --- a/apps/browser/src/vault/popup/components/vault-v2/vault-page.service.ts +++ b/apps/browser/src/vault/popup/components/vault-v2/vault-page.service.ts @@ -21,12 +21,6 @@ export const NEW_CUSTOMIZATION_OPTIONS_CALLOUT_DISMISSED_KEY = new UserKeyDefini export class VaultPageService { private stateProvider = inject(StateProvider); - async unDismissCallout(userId: UserId): Promise { - await this.stateProvider - .getUser(userId, NEW_CUSTOMIZATION_OPTIONS_CALLOUT_DISMISSED_KEY) - .update(() => false); - } - isCalloutDismissed(userId: UserId): Observable { return this.stateProvider .getUser(userId, NEW_CUSTOMIZATION_OPTIONS_CALLOUT_DISMISSED_KEY) diff --git a/apps/browser/store/locales/he/copy.resx b/apps/browser/store/locales/he/copy.resx index 37ca9b6d667..6edd86c4a68 100644 --- a/apps/browser/store/locales/he/copy.resx +++ b/apps/browser/store/locales/he/copy.resx @@ -152,8 +152,8 @@ Bitwarden באופן קבוע מבצעת ביקורות אבטחה מקיפות 2FA מתקדם אבטח את הכניסות שלך עם מאמת צד שלישי, קודים בדוא"ל, או אישורי FIDO2 WebAuthn כמו מפתח אבטחת חומרה או מפתח גישה. -Bitwarden סנד -שדר נתונים ישירות אל אחרים תוך כדי שמירה על אבטחת הצפנה מקצה-לקצה והגבלת חשיפה. +Bitwarden סֵנְד +שדר נתונים ישירות אל אחרים תוך שמירה על אבטחת הצפנה מקצה-לקצה והגבלת חשיפה. מחולל מובנה צור סיסמאות ארוכות, מורכבות, ושונות ושמות משתמש ייחודיים עבור כל אתר שאתה מבקר. שלב עם ספקי כינויי דוא"ל עבור פרטיות נוספת. diff --git a/apps/browser/store/locales/pl/copy.resx b/apps/browser/store/locales/pl/copy.resx index 5641c68c488..3d5c4f47864 100644 --- a/apps/browser/store/locales/pl/copy.resx +++ b/apps/browser/store/locales/pl/copy.resx @@ -121,7 +121,7 @@ Menedżer Haseł Bitwarden - W domu, w pracy, lub w ruchu, Bitwarden z łatwością zabezpiecza wszystkie Twoje hasła, passkeys i poufne informacje. + W domu, w pracy lub w ruchu Bitwarden z łatwością zabezpiecza wszystkie twoje hasła, klucze i poufne informacje. Uznany za najlepszego menedżera haseł przez PCMag, WIRED, The Verge, CNET, G2 i wielu innych! diff --git a/apps/browser/store/locales/zh_CN/copy.resx b/apps/browser/store/locales/zh_CN/copy.resx index 0f73ccd6619..c66c6fdb411 100644 --- a/apps/browser/store/locales/zh_CN/copy.resx +++ b/apps/browser/store/locales/zh_CN/copy.resx @@ -150,7 +150,7 @@ Bitwarden 定期与知名的安全公司进行全面的第三方安全审计。这些年度审计包括对 Bitwarden IP、服务器和 Web 应用程序的源代码评估和渗透测试。 高级 2FA -使用第三方验证器、电子邮件代码或 FIDO2 WebAuthn 凭据(例如硬件安全钥匙或通行密钥)保护您的登录。 +使用第三方验证器、电子邮件代码或 FIDO2 WebAuthn 凭据(例如硬件安全密钥或通行密钥)保护您的登录。 Bitwarden Send 直接传输数据给他人,同时保持端对端加密的安全性并防止暴露。 diff --git a/apps/cli/scripts/sign-cli.ps1 b/apps/cli/scripts/sign-cli.ps1 new file mode 100644 index 00000000000..65b763f19ad --- /dev/null +++ b/apps/cli/scripts/sign-cli.ps1 @@ -0,0 +1,44 @@ + + +function SignExe { + param ( + [Parameter(Mandatory=$true)] + [ValidateScript({![string]::IsNullOrEmpty($_)})] + [string]$vaultUrl, + + [Parameter(Mandatory=$false)] + [ValidateScript({![string]::IsNullOrEmpty($_)})] + [string]$clientId, + + [Parameter(Mandatory=$false)] + [ValidateScript({![string]::IsNullOrEmpty($_)})] + [string]$tenantId, + + [Parameter(Mandatory=$false)] + [ValidateScript({![string]::IsNullOrEmpty($_)})] + [string]$clientSecret, + + [Parameter(Mandatory=$false)] + [ValidateScript({![string]::IsNullOrEmpty($_)})] + [string]$certName, + + [Parameter(Mandatory=$false)] + [ValidateScript({Test-Path $_})] + [string] $exePath, + + # [Parameter(Mandatory=$false)] + # [string] $hashAlgorithm, # -fd option + + # [Parameter(Mandatory=$false)] + # [string] $site, # -du option + + [Parameter(Mandatory=$false)] + [string] $timestampService = "http://timestamp.digicert.com" + ) + + echo "Signing $exePath ..." + azuresigntool sign -kvu $vaultUrl -kvi $clientId -kvt $tenantId -kvs $clientSecret -kvc $certName -tr $timestampService $exePath +} + + +SignExe -vaultUrl $env:SIGNING_VAULT_URL -clientId $env:SIGNING_CLIENT_ID -tenantId $env:SIGNING_TENANT_ID -clientSecret $env:SIGNING_CLIENT_SECRET -certName $env:SIGNING_CERT_NAME -exePath $env:EXE_PATH diff --git a/apps/cli/src/auth/commands/lock.command.ts b/apps/cli/src/auth/commands/lock.command.ts index 809d3c6a881..f3b8018f40e 100644 --- a/apps/cli/src/auth/commands/lock.command.ts +++ b/apps/cli/src/auth/commands/lock.command.ts @@ -1,6 +1,6 @@ // FIXME: Update this file to be type safe and remove this and next line // @ts-strict-ignore -import { VaultTimeoutService } from "@bitwarden/common/abstractions/vault-timeout/vault-timeout.service"; +import { VaultTimeoutService } from "@bitwarden/common/key-management/vault-timeout"; import { Response } from "../../models/response"; import { MessageResponse } from "../../models/response/message.response"; diff --git a/apps/cli/src/bw.ts b/apps/cli/src/bw.ts index 5e9d3dfbc94..fcf0ef3dc8d 100644 --- a/apps/cli/src/bw.ts +++ b/apps/cli/src/bw.ts @@ -1,3 +1,5 @@ +import "core-js/proposals/explicit-resource-management"; + import { program } from "commander"; import { OssServeConfigurator } from "./oss-serve-configurator"; diff --git a/apps/cli/src/platform/services/cli-sdk-load.service.ts b/apps/cli/src/platform/services/cli-sdk-load.service.ts index ee3b48e34d7..638e64a8214 100644 --- a/apps/cli/src/platform/services/cli-sdk-load.service.ts +++ b/apps/cli/src/platform/services/cli-sdk-load.service.ts @@ -1,7 +1,7 @@ import { SdkLoadService } from "@bitwarden/common/platform/abstractions/sdk/sdk-load.service"; import * as sdk from "@bitwarden/sdk-internal"; -export class CliSdkLoadService implements SdkLoadService { +export class CliSdkLoadService extends SdkLoadService { async load(): Promise { const module = await import("@bitwarden/sdk-internal/bitwarden_wasm_internal_bg.wasm"); (sdk as any).init(module); diff --git a/apps/cli/src/platform/services/node-api.service.ts b/apps/cli/src/platform/services/node-api.service.ts index f4d1d30e8b1..8c7629fb3d9 100644 --- a/apps/cli/src/platform/services/node-api.service.ts +++ b/apps/cli/src/platform/services/node-api.service.ts @@ -4,8 +4,8 @@ import * as FormData from "form-data"; import { HttpsProxyAgent } from "https-proxy-agent"; import * as fe from "node-fetch"; -import { VaultTimeoutSettingsService } from "@bitwarden/common/abstractions/vault-timeout/vault-timeout-settings.service"; import { TokenService } from "@bitwarden/common/auth/abstractions/token.service"; +import { VaultTimeoutSettingsService } from "@bitwarden/common/key-management/vault-timeout"; import { AppIdService } from "@bitwarden/common/platform/abstractions/app-id.service"; import { EnvironmentService } from "@bitwarden/common/platform/abstractions/environment.service"; import { LogService } from "@bitwarden/common/platform/abstractions/log.service"; diff --git a/apps/cli/src/service-container/service-container.ts b/apps/cli/src/service-container/service-container.ts index 98926f7ae65..67237e46f33 100644 --- a/apps/cli/src/service-container/service-container.ts +++ b/apps/cli/src/service-container/service-container.ts @@ -64,6 +64,13 @@ import { DefaultBillingAccountProfileStateService } from "@bitwarden/common/bill import { ClientType } from "@bitwarden/common/enums"; import { EncryptServiceImplementation } from "@bitwarden/common/key-management/crypto/services/encrypt.service.implementation"; import { FallbackBulkEncryptService } from "@bitwarden/common/key-management/crypto/services/fallback-bulk-encrypt.service"; +import { + DefaultVaultTimeoutService, + DefaultVaultTimeoutSettingsService, + VaultTimeoutService, + VaultTimeoutSettingsService, + VaultTimeoutStringType, +} from "@bitwarden/common/key-management/vault-timeout"; import { ConfigApiServiceAbstraction } from "@bitwarden/common/platform/abstractions/config/config-api.service.abstraction"; import { ConfigService } from "@bitwarden/common/platform/abstractions/config/config.service"; import { @@ -122,8 +129,6 @@ import { AuditService } from "@bitwarden/common/services/audit.service"; import { EventCollectionService } from "@bitwarden/common/services/event/event-collection.service"; import { EventUploadService } from "@bitwarden/common/services/event/event-upload.service"; 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 { PasswordStrengthService, PasswordStrengthServiceAbstraction, @@ -132,7 +137,6 @@ import { SendApiService } from "@bitwarden/common/tools/send/services/send-api.s import { SendStateProvider } from "@bitwarden/common/tools/send/services/send-state.provider"; import { SendService } from "@bitwarden/common/tools/send/services/send.service"; import { UserId } from "@bitwarden/common/types/guid"; -import { VaultTimeoutStringType } from "@bitwarden/common/types/vault-timeout.type"; import { InternalFolderService } from "@bitwarden/common/vault/abstractions/folder/folder.service.abstraction"; import { CipherAuthorizationService, @@ -464,7 +468,7 @@ export class ServiceContainer { this.organizationService = new DefaultOrganizationService(this.stateProvider); this.policyService = new PolicyService(this.stateProvider, this.organizationService); - this.vaultTimeoutSettingsService = new VaultTimeoutSettingsService( + this.vaultTimeoutSettingsService = new DefaultVaultTimeoutSettingsService( this.accountService, this.pinService, this.userDecryptionOptionsService, @@ -712,7 +716,7 @@ export class ServiceContainer { const biometricService = new CliBiometricsService(); - this.vaultTimeoutService = new VaultTimeoutService( + this.vaultTimeoutService = new DefaultVaultTimeoutService( this.accountService, this.masterPasswordService, this.cipherService, @@ -867,7 +871,7 @@ export class ServiceContainer { return; } - await this.sdkLoadService.load(); + await this.sdkLoadService.loadAndInit(); await this.storageService.init(); await this.stateService.init(); this.containerService.attachToGlobal(global); diff --git a/apps/desktop/desktop_native/Cargo.lock b/apps/desktop/desktop_native/Cargo.lock index 948e03cd49b..58cc4552f1e 100644 --- a/apps/desktop/desktop_native/Cargo.lock +++ b/apps/desktop/desktop_native/Cargo.lock @@ -439,7 +439,7 @@ checksum = "8f68f53c83ab957f72c32642f3868eec03eb974d1fb82e453128456482613d36" [[package]] name = "bitwarden-russh" version = "0.1.0" -source = "git+https://github.com/bitwarden/bitwarden-russh.git?rev=23b50e3bbe6d56ef19ab0e98e8bb1462cb6d77ae#23b50e3bbe6d56ef19ab0e98e8bb1462cb6d77ae" +source = "git+https://github.com/bitwarden/bitwarden-russh.git?rev=3d48f140fd506412d186203238993163a8c4e536#3d48f140fd506412d186203238993163a8c4e536" dependencies = [ "anyhow", "byteorder", @@ -942,6 +942,7 @@ dependencies = [ "base64", "bitwarden-russh", "byteorder", + "bytes", "cbc", "core-foundation", "desktop_objc", diff --git a/apps/desktop/desktop_native/core/Cargo.toml b/apps/desktop/desktop_native/core/Cargo.toml index c821662f112..8a0bcd0e0a7 100644 --- a/apps/desktop/desktop_native/core/Cargo.toml +++ b/apps/desktop/desktop_native/core/Cargo.toml @@ -21,7 +21,7 @@ manual_test = [] aes = "=0.8.4" anyhow = { workspace = true } arboard = { version = "=3.4.1", default-features = false, features = [ - "wayland-data-control", + "wayland-data-control", ] } argon2 = { version = "=0.5.3", features = ["zeroize"] } base64 = "=0.22.1" @@ -39,12 +39,12 @@ scopeguard = "=1.2.0" sha2 = "=0.10.8" ssh-encoding = "=0.2.0" ssh-key = { version = "=0.6.7", default-features = false, features = [ - "encryption", - "ed25519", - "rsa", - "getrandom", + "encryption", + "ed25519", + "rsa", + "getrandom", ] } -bitwarden-russh = { git = "https://github.com/bitwarden/bitwarden-russh.git", rev = "23b50e3bbe6d56ef19ab0e98e8bb1462cb6d77ae" } +bitwarden-russh = { git = "https://github.com/bitwarden/bitwarden-russh.git", rev = "3d48f140fd506412d186203238993163a8c4e536" } tokio = { workspace = true, features = ["io-util", "sync", "macros", "net"] } tokio-stream = { workspace = true, features = ["net"] } tokio-util = { workspace = true, features = ["codec"] } @@ -53,21 +53,22 @@ typenum = "=1.17.0" pkcs8 = { version = "=0.10.2", features = ["alloc", "encryption", "pem"] } rsa = "=0.9.6" ed25519 = { version = "=2.2.3", features = ["pkcs8"] } -sysinfo = { version = "=0.33.1", features = ["windows"] } +bytes = "1.9.0" +sysinfo = { version = "0.33.1", features = ["windows"] } [target.'cfg(windows)'.dependencies] widestring = { version = "=1.1.0", optional = true } windows = { version = "=0.58.0", features = [ - "Foundation", - "Security_Credentials_UI", - "Security_Cryptography", - "Storage_Streams", - "Win32_Foundation", - "Win32_Security_Credentials", - "Win32_System_WinRT", - "Win32_UI_Input_KeyboardAndMouse", - "Win32_UI_WindowsAndMessaging", - "Win32_System_Pipes", + "Foundation", + "Security_Credentials_UI", + "Security_Cryptography", + "Storage_Streams", + "Win32_Foundation", + "Win32_Security_Credentials", + "Win32_System_WinRT", + "Win32_UI_Input_KeyboardAndMouse", + "Win32_UI_WindowsAndMessaging", + "Win32_System_Pipes", ], optional = true } [target.'cfg(windows)'.dev-dependencies] diff --git a/apps/desktop/desktop_native/core/src/ssh_agent/mod.rs b/apps/desktop/desktop_native/core/src/ssh_agent/mod.rs index 4e304ccea78..3fe327948f8 100644 --- a/apps/desktop/desktop_native/core/src/ssh_agent/mod.rs +++ b/apps/desktop/desktop_native/core/src/ssh_agent/mod.rs @@ -18,6 +18,8 @@ mod peercred_unix_listener_stream; pub mod importer; pub mod peerinfo; +mod request_parser; + #[derive(Clone)] pub struct BitwardenDesktopAgent { keystore: ssh_agent::KeyStore, @@ -35,19 +37,37 @@ pub struct SshAgentUIRequest { pub cipher_id: Option, pub process_name: String, pub is_list: bool, + pub namespace: Option, + pub is_forwarding: bool, } impl ssh_agent::Agent for BitwardenDesktopAgent { - async fn confirm(&self, ssh_key: Key, info: &peerinfo::models::PeerInfo) -> bool { + async fn confirm(&self, ssh_key: Key, data: &[u8], info: &peerinfo::models::PeerInfo) -> bool { if !self.is_running() { println!("[BitwardenDesktopAgent] Agent is not running, but tried to call confirm"); return false; } let request_id = self.get_request_id().await; + let request_data = match request_parser::parse_request(data) { + Ok(data) => data, + Err(e) => { + println!("[SSH Agent] Error while parsing request: {}", e); + return false; + } + }; + let namespace = match request_data { + request_parser::SshAgentSignRequest::SshSigRequest(ref req) => { + Some(req.namespace.clone()) + } + _ => None, + }; + println!( - "[SSH Agent] Confirming request from application: {}", - info.process_name() + "[SSH Agent] Confirming request from application: {}, is_forwarding: {}, namespace: {}", + info.process_name(), + info.is_forwarding(), + namespace.clone().unwrap_or_default(), ); let mut rx_channel = self.get_ui_response_rx.lock().await.resubscribe(); @@ -57,6 +77,8 @@ impl ssh_agent::Agent for BitwardenDesktopAgent { cipher_id: Some(ssh_key.cipher_uuid.clone()), process_name: info.process_name().to_string(), is_list: false, + namespace, + is_forwarding: info.is_forwarding(), }) .await .expect("Should send request to ui"); @@ -81,6 +103,8 @@ impl ssh_agent::Agent for BitwardenDesktopAgent { cipher_id: None, process_name: info.process_name().to_string(), is_list: true, + namespace: None, + is_forwarding: info.is_forwarding(), }; self.show_ui_request_tx .send(message) @@ -93,6 +117,17 @@ impl ssh_agent::Agent for BitwardenDesktopAgent { } false } + + async fn set_is_forwarding( + &self, + is_forwarding: bool, + connection_info: &peerinfo::models::PeerInfo, + ) { + // is_forwarding can only be added but never removed from a connection + if is_forwarding { + connection_info.set_forwarding(is_forwarding); + } + } } impl BitwardenDesktopAgent { diff --git a/apps/desktop/desktop_native/core/src/ssh_agent/peercred_unix_listener_stream.rs b/apps/desktop/desktop_native/core/src/ssh_agent/peercred_unix_listener_stream.rs index da9d8a54318..77eec5e35c7 100644 --- a/apps/desktop/desktop_native/core/src/ssh_agent/peercred_unix_listener_stream.rs +++ b/apps/desktop/desktop_native/core/src/ssh_agent/peercred_unix_listener_stream.rs @@ -34,9 +34,7 @@ impl Stream for PeercredUnixListenerStream { return Poll::Ready(Some(Ok((stream, PeerInfo::unknown())))); } }, - Err(_) => { - return Poll::Ready(Some(Ok((stream, PeerInfo::unknown())))); - } + Err(_) => return Poll::Ready(Some(Ok((stream, PeerInfo::unknown())))), }; let peer_info = peerinfo::gather::get_peer_info(pid as u32); match peer_info { diff --git a/apps/desktop/desktop_native/core/src/ssh_agent/peerinfo/models.rs b/apps/desktop/desktop_native/core/src/ssh_agent/peerinfo/models.rs index 9c2ee363e8f..35a5a508263 100644 --- a/apps/desktop/desktop_native/core/src/ssh_agent/peerinfo/models.rs +++ b/apps/desktop/desktop_native/core/src/ssh_agent/peerinfo/models.rs @@ -1,3 +1,5 @@ +use std::sync::{atomic::AtomicBool, Arc}; + /** * Peerinfo represents the information of a peer process connecting over a socket. * This can be later extended to include more information (icon, app name) for the corresponding application. @@ -7,6 +9,7 @@ pub struct PeerInfo { uid: u32, pid: u32, process_name: String, + is_forwarding: Arc, } impl PeerInfo { @@ -15,6 +18,16 @@ impl PeerInfo { uid, pid, process_name, + is_forwarding: Arc::new(AtomicBool::new(false)), + } + } + + pub fn unknown() -> Self { + Self { + uid: 0, + pid: 0, + process_name: "Unknown application".to_string(), + is_forwarding: Arc::new(AtomicBool::new(false)), } } @@ -30,7 +43,13 @@ impl PeerInfo { &self.process_name } - pub fn unknown() -> Self { - Self::new(0, 0, "Unknown application".to_string()) + pub fn is_forwarding(&self) -> bool { + self.is_forwarding + .load(std::sync::atomic::Ordering::Relaxed) + } + + pub fn set_forwarding(&self, value: bool) { + self.is_forwarding + .store(value, std::sync::atomic::Ordering::Relaxed); } } diff --git a/apps/desktop/desktop_native/core/src/ssh_agent/request_parser.rs b/apps/desktop/desktop_native/core/src/ssh_agent/request_parser.rs new file mode 100644 index 00000000000..e93aa19869e --- /dev/null +++ b/apps/desktop/desktop_native/core/src/ssh_agent/request_parser.rs @@ -0,0 +1,41 @@ +use bytes::{Buf, Bytes}; + +#[derive(Debug)] +pub(crate) struct SshSigRequest { + pub namespace: String, +} + +#[derive(Debug)] +pub(crate) struct SignRequest {} + +#[derive(Debug)] +pub(crate) enum SshAgentSignRequest { + SshSigRequest(SshSigRequest), + SignRequest(SignRequest), +} + +pub(crate) fn parse_request(data: &[u8]) -> Result { + let mut data = Bytes::copy_from_slice(data); + let magic_header = "SSHSIG"; + let header = data.split_to(magic_header.len()); + + // sshsig; based on https://github.com/openssh/openssh-portable/blob/master/PROTOCOL.sshsig + if header == magic_header.as_bytes() { + let _version = data.get_u32(); + + // read until null byte + let namespace = data + .into_iter() + .take_while(|&x| x != 0) + .collect::>(); + let namespace = + String::from_utf8(namespace).map_err(|_| anyhow::anyhow!("Invalid namespace"))?; + + Ok(SshAgentSignRequest::SshSigRequest(SshSigRequest { + namespace, + })) + } else { + // regular sign request + Ok(SshAgentSignRequest::SignRequest(SignRequest {})) + } +} diff --git a/apps/desktop/desktop_native/napi/index.d.ts b/apps/desktop/desktop_native/napi/index.d.ts index 997e951c89e..c40b7aed487 100644 --- a/apps/desktop/desktop_native/napi/index.d.ts +++ b/apps/desktop/desktop_native/napi/index.d.ts @@ -67,7 +67,14 @@ export declare namespace sshagent { status: SshKeyImportStatus sshKey?: SshKey } - export function serve(callback: (err: Error | null, arg0: string | undefined | null, arg1: boolean, arg2: string) => any): Promise + export interface SshUiRequest { + cipherId?: string + isList: boolean + processName: string + isForwarding: boolean + namespace?: string + } + export function serve(callback: (err: Error | null, arg: SshUiRequest) => any): Promise export function stop(agentState: SshAgentState): void export function isRunning(agentState: SshAgentState): boolean export function setKeys(agentState: SshAgentState, newKeys: Array): void diff --git a/apps/desktop/desktop_native/napi/src/lib.rs b/apps/desktop/desktop_native/napi/src/lib.rs index 35566e16813..7d20bd50699 100644 --- a/apps/desktop/desktop_native/napi/src/lib.rs +++ b/apps/desktop/desktop_native/napi/src/lib.rs @@ -243,9 +243,18 @@ pub mod sshagent { } } + #[napi(object)] + pub struct SshUIRequest { + pub cipher_id: Option, + pub is_list: bool, + pub process_name: String, + pub is_forwarding: bool, + pub namespace: Option, + } + #[napi] pub async fn serve( - callback: ThreadsafeFunction<(Option, bool, String), CalleeHandled>, + callback: ThreadsafeFunction, ) -> napi::Result { let (auth_request_tx, mut auth_request_rx) = tokio::sync::mpsc::channel::(32); @@ -262,11 +271,13 @@ pub mod sshagent { let auth_response_tx_arc = cloned_response_tx_arc; let callback = cloned_callback; let promise_result: Result, napi::Error> = callback - .call_async(Ok(( - request.cipher_id, - request.is_list, - request.process_name, - ))) + .call_async(Ok(SshUIRequest { + cipher_id: request.cipher_id, + is_list: request.is_list, + process_name: request.process_name, + is_forwarding: request.is_forwarding, + namespace: request.namespace, + })) .await; match promise_result { Ok(promise_result) => match promise_result.await { diff --git a/apps/desktop/src/app/accounts/settings.component.spec.ts b/apps/desktop/src/app/accounts/settings.component.spec.ts index 3caad4d5af8..342d4717511 100644 --- a/apps/desktop/src/app/accounts/settings.component.spec.ts +++ b/apps/desktop/src/app/accounts/settings.component.spec.ts @@ -6,7 +6,6 @@ import { firstValueFrom, of } from "rxjs"; import { I18nPipe } from "@bitwarden/angular/platform/pipes/i18n.pipe"; import { PinServiceAbstraction } from "@bitwarden/auth/common"; -import { VaultTimeoutSettingsService } from "@bitwarden/common/abstractions/vault-timeout/vault-timeout-settings.service"; import { PolicyService } from "@bitwarden/common/admin-console/abstractions/policy/policy.service.abstraction"; import { PolicyType } from "@bitwarden/common/admin-console/enums"; import { Policy } from "@bitwarden/common/admin-console/models/domain/policy"; @@ -15,7 +14,11 @@ import { UserVerificationService } from "@bitwarden/common/auth/abstractions/use import { AutofillSettingsServiceAbstraction } from "@bitwarden/common/autofill/services/autofill-settings.service"; import { DomainSettingsService } from "@bitwarden/common/autofill/services/domain-settings.service"; import { DeviceType } from "@bitwarden/common/enums"; -import { VaultTimeoutAction } from "@bitwarden/common/enums/vault-timeout-action.enum"; +import { + VaultTimeoutSettingsService, + VaultTimeoutStringType, + VaultTimeoutAction, +} from "@bitwarden/common/key-management/vault-timeout"; 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"; @@ -27,7 +30,6 @@ import { Utils } from "@bitwarden/common/platform/misc/utils"; import { ThemeStateService } from "@bitwarden/common/platform/theming/theme-state.service"; import { FakeAccountService, mockAccountServiceWith } from "@bitwarden/common/spec"; import { UserId } from "@bitwarden/common/types/guid"; -import { VaultTimeoutStringType } from "@bitwarden/common/types/vault-timeout.type"; import { DialogService } from "@bitwarden/components"; import { BiometricStateService, BiometricsStatus, KeyService } from "@bitwarden/key-management"; diff --git a/apps/desktop/src/app/accounts/settings.component.ts b/apps/desktop/src/app/accounts/settings.component.ts index 136036de68e..51d1f4cfa4f 100644 --- a/apps/desktop/src/app/accounts/settings.component.ts +++ b/apps/desktop/src/app/accounts/settings.component.ts @@ -15,7 +15,6 @@ import { } from "rxjs/operators"; import { PinServiceAbstraction } from "@bitwarden/auth/common"; -import { VaultTimeoutSettingsService } from "@bitwarden/common/abstractions/vault-timeout/vault-timeout-settings.service"; import { PolicyService } from "@bitwarden/common/admin-console/abstractions/policy/policy.service.abstraction"; import { PolicyType } from "@bitwarden/common/admin-console/enums"; import { AccountService } from "@bitwarden/common/auth/abstractions/account.service"; @@ -24,7 +23,13 @@ import { AutofillSettingsServiceAbstraction } from "@bitwarden/common/autofill/s import { DomainSettingsService } from "@bitwarden/common/autofill/services/domain-settings.service"; import { DeviceType } from "@bitwarden/common/enums"; import { FeatureFlag } from "@bitwarden/common/enums/feature-flag.enum"; -import { VaultTimeoutAction } from "@bitwarden/common/enums/vault-timeout-action.enum"; +import { + VaultTimeout, + VaultTimeoutAction, + VaultTimeoutOption, + VaultTimeoutSettingsService, + VaultTimeoutStringType, +} from "@bitwarden/common/key-management/vault-timeout"; 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"; @@ -35,11 +40,6 @@ import { ThemeType } from "@bitwarden/common/platform/enums/theme-type.enum"; import { Utils } from "@bitwarden/common/platform/misc/utils"; import { ThemeStateService } from "@bitwarden/common/platform/theming/theme-state.service"; import { UserId } from "@bitwarden/common/types/guid"; -import { - VaultTimeout, - VaultTimeoutOption, - VaultTimeoutStringType, -} from "@bitwarden/common/types/vault-timeout.type"; import { DialogService } from "@bitwarden/components"; import { KeyService, BiometricStateService, BiometricsStatus } from "@bitwarden/key-management"; diff --git a/apps/desktop/src/app/app-routing.module.ts b/apps/desktop/src/app/app-routing.module.ts index b9dccf70322..1ebb1f8de39 100644 --- a/apps/desktop/src/app/app-routing.module.ts +++ b/apps/desktop/src/app/app-routing.module.ts @@ -15,7 +15,6 @@ import { tdeDecryptionRequiredGuard, unauthGuardFn, } from "@bitwarden/angular/auth/guards"; -import { canAccessFeature } from "@bitwarden/angular/platform/guard/feature-flag.guard"; import { NewDeviceVerificationNoticeGuard } from "@bitwarden/angular/vault/guards"; import { AnonLayoutWrapperComponent, @@ -43,7 +42,6 @@ import { NewDeviceVerificationComponent, DeviceVerificationIcon, } from "@bitwarden/auth/angular"; -import { FeatureFlag } from "@bitwarden/common/enums/feature-flag.enum"; import { LockComponent } from "@bitwarden/key-management-ui"; import { NewDeviceVerificationNoticePageOneComponent, @@ -123,11 +121,7 @@ const routes: Routes = [ { path: "device-verification", component: AnonLayoutWrapperComponent, - canActivate: [ - canAccessFeature(FeatureFlag.NewDeviceVerification), - unauthGuardFn(), - activeAuthGuard(), - ], + canActivate: [unauthGuardFn(), activeAuthGuard()], children: [{ path: "", component: NewDeviceVerificationComponent }], data: { pageIcon: DeviceVerificationIcon, diff --git a/apps/desktop/src/app/app.component.ts b/apps/desktop/src/app/app.component.ts index f19f508d4ba..ea18617daf0 100644 --- a/apps/desktop/src/app/app.component.ts +++ b/apps/desktop/src/app/app.component.ts @@ -20,8 +20,6 @@ import { FingerprintDialogComponent, LoginApprovalComponent } from "@bitwarden/a import { DESKTOP_SSO_CALLBACK, LogoutReason } from "@bitwarden/auth/common"; import { EventUploadService } from "@bitwarden/common/abstractions/event/event-upload.service"; import { SearchService } from "@bitwarden/common/abstractions/search.service"; -import { VaultTimeoutSettingsService } from "@bitwarden/common/abstractions/vault-timeout/vault-timeout-settings.service"; -import { VaultTimeoutService } from "@bitwarden/common/abstractions/vault-timeout/vault-timeout.service"; import { OrganizationService } from "@bitwarden/common/admin-console/abstractions/organization/organization.service.abstraction"; import { InternalPolicyService } from "@bitwarden/common/admin-console/abstractions/policy/policy.service.abstraction"; import { AccountService } from "@bitwarden/common/auth/abstractions/account.service"; @@ -33,8 +31,14 @@ import { AuthenticationStatus } from "@bitwarden/common/auth/enums/authenticatio import { ForceSetPasswordReason } from "@bitwarden/common/auth/models/domain/force-set-password-reason"; import { getUserId } from "@bitwarden/common/auth/services/account.service"; import { FeatureFlag } from "@bitwarden/common/enums/feature-flag.enum"; -import { VaultTimeoutAction } from "@bitwarden/common/enums/vault-timeout-action.enum"; import { ProcessReloadServiceAbstraction } from "@bitwarden/common/key-management/abstractions/process-reload.service"; +import { + VaultTimeout, + VaultTimeoutAction, + VaultTimeoutService, + VaultTimeoutSettingsService, + VaultTimeoutStringType, +} from "@bitwarden/common/key-management/vault-timeout"; 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"; @@ -48,7 +52,6 @@ import { NotificationsService } from "@bitwarden/common/platform/notifications"; import { StateEventRunnerService } from "@bitwarden/common/platform/state"; import { SyncService } from "@bitwarden/common/platform/sync"; import { UserId } from "@bitwarden/common/types/guid"; -import { VaultTimeout, VaultTimeoutStringType } from "@bitwarden/common/types/vault-timeout.type"; import { CipherService } from "@bitwarden/common/vault/abstractions/cipher.service"; import { InternalFolderService } from "@bitwarden/common/vault/abstractions/folder/folder.service.abstraction"; import { CipherType } from "@bitwarden/common/vault/enums"; diff --git a/apps/desktop/src/app/layout/account-switcher.component.ts b/apps/desktop/src/app/layout/account-switcher.component.ts index db8c2a85bde..d8ffa5ae546 100644 --- a/apps/desktop/src/app/layout/account-switcher.component.ts +++ b/apps/desktop/src/app/layout/account-switcher.component.ts @@ -110,7 +110,9 @@ export class AccountSwitcherComponent implements OnInit { name: active.name, email: active.email, avatarColor: await firstValueFrom(this.avatarService.avatarColor$), - server: (await this.environmentService.getEnvironment())?.getHostname(), + server: ( + await firstValueFrom(this.environmentService.getEnvironment$(active.id)) + )?.getHostname(), }; }), ); @@ -221,7 +223,9 @@ export class AccountSwitcherComponent implements OnInit { email: baseAccounts[userId].email, authenticationStatus: await this.authService.getAuthStatus(userId), avatarColor: await firstValueFrom(this.avatarService.getUserAvatarColor$(userId as UserId)), - server: (await this.environmentService.getEnvironment(userId))?.getHostname(), + server: ( + await firstValueFrom(this.environmentService.getEnvironment$(userId as UserId)) + )?.getHostname(), }; } diff --git a/apps/desktop/src/app/main.ts b/apps/desktop/src/app/main.ts index ba964177dbc..16d03aefbdd 100644 --- a/apps/desktop/src/app/main.ts +++ b/apps/desktop/src/app/main.ts @@ -1,3 +1,5 @@ +import "core-js/proposals/explicit-resource-management"; + import { enableProdMode } from "@angular/core"; import { platformBrowserDynamic } from "@angular/platform-browser-dynamic"; diff --git a/apps/desktop/src/app/services/init.service.ts b/apps/desktop/src/app/services/init.service.ts index 6a58f36cfb9..3c831ae11dd 100644 --- a/apps/desktop/src/app/services/init.service.ts +++ b/apps/desktop/src/app/services/init.service.ts @@ -8,6 +8,7 @@ import { EventUploadService as EventUploadServiceAbstraction } from "@bitwarden/ import { AccountService } from "@bitwarden/common/auth/abstractions/account.service"; import { TwoFactorService as TwoFactorServiceAbstraction } from "@bitwarden/common/auth/abstractions/two-factor.service"; import { EncryptService } from "@bitwarden/common/key-management/crypto/abstractions/encrypt.service"; +import { DefaultVaultTimeoutService } from "@bitwarden/common/key-management/vault-timeout"; import { I18nService as I18nServiceAbstraction } from "@bitwarden/common/platform/abstractions/i18n.service"; import { PlatformUtilsService as PlatformUtilsServiceAbstraction } from "@bitwarden/common/platform/abstractions/platform-utils.service"; import { SdkLoadService } from "@bitwarden/common/platform/abstractions/sdk/sdk-load.service"; @@ -17,7 +18,6 @@ import { ContainerService } from "@bitwarden/common/platform/services/container. import { UserAutoUnlockKeyService } from "@bitwarden/common/platform/services/user-auto-unlock-key.service"; import { SyncService as SyncServiceAbstraction } from "@bitwarden/common/platform/sync"; import { EventUploadService } from "@bitwarden/common/services/event/event-upload.service"; -import { VaultTimeoutService } from "@bitwarden/common/services/vault-timeout/vault-timeout.service"; import { UserId } from "@bitwarden/common/types/guid"; import { KeyService as KeyServiceAbstraction } from "@bitwarden/key-management"; @@ -32,7 +32,7 @@ export class InitService { constructor( @Inject(WINDOW) private win: Window, private syncService: SyncServiceAbstraction, - private vaultTimeoutService: VaultTimeoutService, + private vaultTimeoutService: DefaultVaultTimeoutService, private i18nService: I18nServiceAbstraction, private eventUploadService: EventUploadServiceAbstraction, private twoFactorService: TwoFactorServiceAbstraction, @@ -54,7 +54,7 @@ export class InitService { init() { return async () => { - await this.sdkLoadService.load(); + await this.sdkLoadService.loadAndInit(); await this.sshAgentService.init(); this.nativeMessagingService.init(); await this.stateService.init({ runMigrations: false }); // Desktop will run them in main process diff --git a/apps/desktop/src/app/services/services.module.ts b/apps/desktop/src/app/services/services.module.ts index 83a2c6bad5c..23a207c8cb4 100644 --- a/apps/desktop/src/app/services/services.module.ts +++ b/apps/desktop/src/app/services/services.module.ts @@ -36,7 +36,6 @@ import { SsoUrlService, } from "@bitwarden/auth/common"; import { ApiService } from "@bitwarden/common/abstractions/api.service"; -import { VaultTimeoutSettingsService } from "@bitwarden/common/abstractions/vault-timeout/vault-timeout-settings.service"; import { OrganizationApiServiceAbstraction } from "@bitwarden/common/admin-console/abstractions/organization/organization-api.service.abstraction"; import { PolicyService as PolicyServiceAbstraction } from "@bitwarden/common/admin-console/abstractions/policy/policy.service.abstraction"; import { @@ -54,6 +53,10 @@ import { ClientType } from "@bitwarden/common/enums"; import { ProcessReloadServiceAbstraction } from "@bitwarden/common/key-management/abstractions/process-reload.service"; import { EncryptService } from "@bitwarden/common/key-management/crypto/abstractions/encrypt.service"; import { DefaultProcessReloadService } from "@bitwarden/common/key-management/services/default-process-reload.service"; +import { + VaultTimeoutSettingsService, + VaultTimeoutStringType, +} from "@bitwarden/common/key-management/vault-timeout"; import { ConfigService } from "@bitwarden/common/platform/abstractions/config/config.service"; import { CryptoFunctionService as CryptoFunctionServiceAbstraction } from "@bitwarden/common/platform/abstractions/crypto-function.service"; import { EnvironmentService } from "@bitwarden/common/platform/abstractions/environment.service"; @@ -89,7 +92,6 @@ import { GlobalStateProvider, StateProvider } from "@bitwarden/common/platform/s import { MemoryStorageService as MemoryStorageServiceForStateProviders } from "@bitwarden/common/platform/state/storage/memory-storage.service"; import { SyncService } from "@bitwarden/common/platform/sync"; import { ThemeStateService } from "@bitwarden/common/platform/theming/theme-state.service"; -import { VaultTimeoutStringType } from "@bitwarden/common/types/vault-timeout.type"; import { CipherService as CipherServiceAbstraction } from "@bitwarden/common/vault/abstractions/cipher.service"; import { DialogService, ToastService } from "@bitwarden/components"; import { PasswordGenerationServiceAbstraction } from "@bitwarden/generator-legacy"; diff --git a/apps/desktop/src/auth/login/login-v1.component.ts b/apps/desktop/src/auth/login/login-v1.component.ts index 5d1a1d818d5..ff8688353be 100644 --- a/apps/desktop/src/auth/login/login-v1.component.ts +++ b/apps/desktop/src/auth/login/login-v1.component.ts @@ -3,7 +3,7 @@ import { Component, NgZone, OnDestroy, OnInit, ViewChild, ViewContainerRef } from "@angular/core"; import { FormBuilder } from "@angular/forms"; import { ActivatedRoute, Router } from "@angular/router"; -import { Subject, takeUntil, tap } from "rxjs"; +import { Subject, firstValueFrom, takeUntil, tap } from "rxjs"; import { LoginComponentV1 as BaseLoginComponent } from "@bitwarden/angular/auth/components/login-v1.component"; import { FormValidationErrorsService } from "@bitwarden/angular/platform/abstractions/form-validation-errors.service"; @@ -143,10 +143,11 @@ export class LoginComponentV1 extends BaseLoginComponent implements OnInit, OnDe .getFeatureFlag$(FeatureFlag.UnauthenticatedExtensionUIRefresh) .pipe( tap(async (flag) => { - // If the flag is turned ON, we must force a reload to ensure the correct UI is shown if (flag) { + const qParams = await firstValueFrom(this.route.queryParams); + const uniqueQueryParams = { - ...this.route.queryParams, + ...qParams, // adding a unique timestamp to the query params to force a reload t: new Date().getTime().toString(), }; @@ -156,7 +157,7 @@ export class LoginComponentV1 extends BaseLoginComponent implements OnInit, OnDe }); } }), - takeUntil(this.destroy$), + takeUntil(this.componentDestroyed$), ) .subscribe(); } diff --git a/apps/desktop/src/key-management/biometrics/biometrics.service.spec.ts b/apps/desktop/src/key-management/biometrics/biometrics.service.spec.ts deleted file mode 100644 index 9e5755dd579..00000000000 --- a/apps/desktop/src/key-management/biometrics/biometrics.service.spec.ts +++ /dev/null @@ -1,187 +0,0 @@ -import { mock, MockProxy } from "jest-mock-extended"; - -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 { UserId } from "@bitwarden/common/types/guid"; -import { - BiometricsService, - BiometricsStatus, - BiometricStateService, -} from "@bitwarden/key-management"; - -import { WindowMain } from "../../main/window.main"; - -import { MainBiometricsService } from "./main-biometrics.service"; -import OsBiometricsServiceLinux from "./os-biometrics-linux.service"; -import OsBiometricsServiceMac from "./os-biometrics-mac.service"; -import OsBiometricsServiceWindows from "./os-biometrics-windows.service"; -import { OsBiometricService } from "./os-biometrics.service"; - -jest.mock("@bitwarden/desktop-napi", () => { - return { - biometrics: jest.fn(), - passwords: jest.fn(), - }; -}); - -describe("biometrics tests", function () { - const i18nService = mock(); - const windowMain = mock(); - const logService = mock(); - const messagingService = mock(); - const biometricStateService = mock(); - - it("Should call the platformspecific methods", async () => { - const sut = new MainBiometricsService( - i18nService, - windowMain, - logService, - messagingService, - process.platform, - biometricStateService, - ); - - const mockService = mock(); - (sut as any).osBiometricsService = mockService; - - await sut.authenticateBiometric(); - expect(mockService.authenticateBiometric).toBeCalled(); - }); - - describe("Should create a platform specific service", function () { - it("Should create a biometrics service specific for Windows", () => { - const sut = new MainBiometricsService( - i18nService, - windowMain, - logService, - messagingService, - "win32", - biometricStateService, - ); - - const internalService = (sut as any).osBiometricsService; - expect(internalService).not.toBeNull(); - expect(internalService).toBeInstanceOf(OsBiometricsServiceWindows); - }); - - it("Should create a biometrics service specific for MacOs", () => { - const sut = new MainBiometricsService( - i18nService, - windowMain, - logService, - messagingService, - "darwin", - biometricStateService, - ); - const internalService = (sut as any).osBiometricsService; - expect(internalService).not.toBeNull(); - expect(internalService).toBeInstanceOf(OsBiometricsServiceMac); - }); - - it("Should create a biometrics service specific for Linux", () => { - const sut = new MainBiometricsService( - i18nService, - windowMain, - logService, - messagingService, - "linux", - biometricStateService, - ); - - const internalService = (sut as any).osBiometricsService; - expect(internalService).not.toBeNull(); - expect(internalService).toBeInstanceOf(OsBiometricsServiceLinux); - }); - }); - - describe("can auth biometric", () => { - let sut: BiometricsService; - let innerService: MockProxy; - - beforeEach(() => { - sut = new MainBiometricsService( - i18nService, - windowMain, - logService, - messagingService, - process.platform, - biometricStateService, - ); - - innerService = mock(); - (sut as any).osBiometricsService = innerService; - }); - - it("should return the correct biometric status for system status", async () => { - const testCases = [ - // happy path - [true, false, false, BiometricsStatus.Available], - [false, true, true, BiometricsStatus.HardwareUnavailable], - [true, true, true, BiometricsStatus.AutoSetupNeeded], - [true, true, false, BiometricsStatus.ManualSetupNeeded], - - // should not happen - [false, false, true, BiometricsStatus.HardwareUnavailable], - [true, false, true, BiometricsStatus.Available], - [false, true, false, BiometricsStatus.HardwareUnavailable], - [false, false, false, BiometricsStatus.HardwareUnavailable], - ]; - - for (const [supportsBiometric, needsSetup, canAutoSetup, expected] of testCases) { - innerService.osSupportsBiometric.mockResolvedValue(supportsBiometric as boolean); - innerService.osBiometricsNeedsSetup.mockResolvedValue(needsSetup as boolean); - innerService.osBiometricsCanAutoSetup.mockResolvedValue(canAutoSetup as boolean); - - const actual = await sut.getBiometricsStatus(); - expect(actual).toBe(expected); - } - }); - - it("should return the correct biometric status for user status", async () => { - const testCases = [ - // system status, biometric unlock enabled, require password on start, has key half, result - [BiometricsStatus.Available, false, false, false, BiometricsStatus.NotEnabledLocally], - [BiometricsStatus.Available, false, true, false, BiometricsStatus.NotEnabledLocally], - [BiometricsStatus.Available, false, false, true, BiometricsStatus.NotEnabledLocally], - [BiometricsStatus.Available, false, true, true, BiometricsStatus.NotEnabledLocally], - - [ - BiometricsStatus.PlatformUnsupported, - true, - true, - true, - BiometricsStatus.PlatformUnsupported, - ], - [BiometricsStatus.ManualSetupNeeded, true, true, true, BiometricsStatus.ManualSetupNeeded], - [BiometricsStatus.AutoSetupNeeded, true, true, true, BiometricsStatus.AutoSetupNeeded], - - [BiometricsStatus.Available, true, false, true, BiometricsStatus.Available], - [BiometricsStatus.Available, true, true, false, BiometricsStatus.UnlockNeeded], - [BiometricsStatus.Available, true, false, true, BiometricsStatus.Available], - ]; - - for (const [ - systemStatus, - unlockEnabled, - requirePasswordOnStart, - hasKeyHalf, - expected, - ] of testCases) { - sut.getBiometricsStatus = jest.fn().mockResolvedValue(systemStatus as BiometricsStatus); - biometricStateService.getBiometricUnlockEnabled.mockResolvedValue(unlockEnabled as boolean); - biometricStateService.getRequirePasswordOnStart.mockResolvedValue( - requirePasswordOnStart as boolean, - ); - (sut as any).clientKeyHalves = new Map(); - const userId = "test" as UserId; - if (hasKeyHalf) { - (sut as any).clientKeyHalves.set(userId, "test"); - } - - const actual = await sut.getBiometricsStatusForUser(userId); - expect(actual).toBe(expected); - } - }); - }); -}); diff --git a/apps/desktop/src/key-management/biometrics/desktop.biometrics.service.ts b/apps/desktop/src/key-management/biometrics/desktop.biometrics.service.ts index 0c0efea78f9..6415443bfbc 100644 --- a/apps/desktop/src/key-management/biometrics/desktop.biometrics.service.ts +++ b/apps/desktop/src/key-management/biometrics/desktop.biometrics.service.ts @@ -11,5 +11,5 @@ export abstract class DesktopBiometricsService extends BiometricsService { abstract setupBiometrics(): Promise; - abstract setClientKeyHalfForUser(userId: UserId, value: string): Promise; + abstract setClientKeyHalfForUser(userId: UserId, value: string | null): Promise; } diff --git a/apps/desktop/src/key-management/biometrics/main-biometrics-ipc.listener.ts b/apps/desktop/src/key-management/biometrics/main-biometrics-ipc.listener.ts index 1605f650e12..fe40aad54d9 100644 --- a/apps/desktop/src/key-management/biometrics/main-biometrics-ipc.listener.ts +++ b/apps/desktop/src/key-management/biometrics/main-biometrics-ipc.listener.ts @@ -44,9 +44,6 @@ export class MainBiometricsIPCListener { message.userId as UserId, ); case BiometricAction.SetClientKeyHalf: - if (message.key == null) { - return; - } return await this.biometricService.setClientKeyHalfForUser( message.userId as UserId, message.key, diff --git a/apps/desktop/src/key-management/biometrics/main-biometrics.service.spec.ts b/apps/desktop/src/key-management/biometrics/main-biometrics.service.spec.ts new file mode 100644 index 00000000000..88dd8c60ed5 --- /dev/null +++ b/apps/desktop/src/key-management/biometrics/main-biometrics.service.spec.ts @@ -0,0 +1,426 @@ +import { mock, MockProxy } from "jest-mock-extended"; + +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 { EncryptionType } from "@bitwarden/common/platform/enums"; +import { Utils } from "@bitwarden/common/platform/misc/utils"; +import { UserId } from "@bitwarden/common/types/guid"; +import { + BiometricsService, + BiometricsStatus, + BiometricStateService, +} from "@bitwarden/key-management"; + +import { WindowMain } from "../../main/window.main"; + +import { MainBiometricsService } from "./main-biometrics.service"; +import OsBiometricsServiceLinux from "./os-biometrics-linux.service"; +import OsBiometricsServiceMac from "./os-biometrics-mac.service"; +import OsBiometricsServiceWindows from "./os-biometrics-windows.service"; +import { OsBiometricService } from "./os-biometrics.service"; + +jest.mock("@bitwarden/desktop-napi", () => { + return { + biometrics: jest.fn(), + passwords: jest.fn(), + }; +}); + +describe("MainBiometricsService", function () { + const i18nService = mock(); + const windowMain = mock(); + const logService = mock(); + const messagingService = mock(); + const biometricStateService = mock(); + + it("Should call the platformspecific methods", async () => { + const sut = new MainBiometricsService( + i18nService, + windowMain, + logService, + messagingService, + process.platform, + biometricStateService, + ); + + const mockService = mock(); + (sut as any).osBiometricsService = mockService; + + await sut.authenticateBiometric(); + expect(mockService.authenticateBiometric).toBeCalled(); + }); + + describe("Should create a platform specific service", function () { + it("Should create a biometrics service specific for Windows", () => { + const sut = new MainBiometricsService( + i18nService, + windowMain, + logService, + messagingService, + "win32", + biometricStateService, + ); + + const internalService = (sut as any).osBiometricsService; + expect(internalService).not.toBeNull(); + expect(internalService).toBeInstanceOf(OsBiometricsServiceWindows); + }); + + it("Should create a biometrics service specific for MacOs", () => { + const sut = new MainBiometricsService( + i18nService, + windowMain, + logService, + messagingService, + "darwin", + biometricStateService, + ); + const internalService = (sut as any).osBiometricsService; + expect(internalService).not.toBeNull(); + expect(internalService).toBeInstanceOf(OsBiometricsServiceMac); + }); + + it("Should create a biometrics service specific for Linux", () => { + const sut = new MainBiometricsService( + i18nService, + windowMain, + logService, + messagingService, + "linux", + biometricStateService, + ); + + const internalService = (sut as any).osBiometricsService; + expect(internalService).not.toBeNull(); + expect(internalService).toBeInstanceOf(OsBiometricsServiceLinux); + }); + }); + + describe("can auth biometric", () => { + let sut: BiometricsService; + let innerService: MockProxy; + + beforeEach(() => { + sut = new MainBiometricsService( + i18nService, + windowMain, + logService, + messagingService, + process.platform, + biometricStateService, + ); + + innerService = mock(); + (sut as any).osBiometricsService = innerService; + }); + + it("should return the correct biometric status for system status", async () => { + const testCases = [ + // happy path + [true, false, false, BiometricsStatus.Available], + [false, true, true, BiometricsStatus.HardwareUnavailable], + [true, true, true, BiometricsStatus.AutoSetupNeeded], + [true, true, false, BiometricsStatus.ManualSetupNeeded], + + // should not happen + [false, false, true, BiometricsStatus.HardwareUnavailable], + [true, false, true, BiometricsStatus.Available], + [false, true, false, BiometricsStatus.HardwareUnavailable], + [false, false, false, BiometricsStatus.HardwareUnavailable], + ]; + + for (const [supportsBiometric, needsSetup, canAutoSetup, expected] of testCases) { + innerService.osSupportsBiometric.mockResolvedValue(supportsBiometric as boolean); + innerService.osBiometricsNeedsSetup.mockResolvedValue(needsSetup as boolean); + innerService.osBiometricsCanAutoSetup.mockResolvedValue(canAutoSetup as boolean); + + const actual = await sut.getBiometricsStatus(); + expect(actual).toBe(expected); + } + }); + + it("should return the correct biometric status for user status", async () => { + const testCases = [ + // system status, biometric unlock enabled, require password on start, has key half, result + [BiometricsStatus.Available, false, false, false, BiometricsStatus.NotEnabledLocally], + [BiometricsStatus.Available, false, true, false, BiometricsStatus.NotEnabledLocally], + [BiometricsStatus.Available, false, false, true, BiometricsStatus.NotEnabledLocally], + [BiometricsStatus.Available, false, true, true, BiometricsStatus.NotEnabledLocally], + + [ + BiometricsStatus.PlatformUnsupported, + true, + true, + true, + BiometricsStatus.PlatformUnsupported, + ], + [BiometricsStatus.ManualSetupNeeded, true, true, true, BiometricsStatus.ManualSetupNeeded], + [BiometricsStatus.AutoSetupNeeded, true, true, true, BiometricsStatus.AutoSetupNeeded], + + [BiometricsStatus.Available, true, false, true, BiometricsStatus.Available], + [BiometricsStatus.Available, true, true, false, BiometricsStatus.UnlockNeeded], + [BiometricsStatus.Available, true, false, true, BiometricsStatus.Available], + ]; + + for (const [ + systemStatus, + unlockEnabled, + requirePasswordOnStart, + hasKeyHalf, + expected, + ] of testCases) { + sut.getBiometricsStatus = jest.fn().mockResolvedValue(systemStatus as BiometricsStatus); + biometricStateService.getBiometricUnlockEnabled.mockResolvedValue(unlockEnabled as boolean); + biometricStateService.getRequirePasswordOnStart.mockResolvedValue( + requirePasswordOnStart as boolean, + ); + (sut as any).clientKeyHalves = new Map(); + const userId = "test" as UserId; + if (hasKeyHalf) { + (sut as any).clientKeyHalves.set(userId, "test"); + } + + const actual = await sut.getBiometricsStatusForUser(userId); + expect(actual).toBe(expected); + } + }); + }); + + describe("setupBiometrics", () => { + it("should call the platform specific setup method", async () => { + const sut = new MainBiometricsService( + i18nService, + windowMain, + logService, + messagingService, + process.platform, + biometricStateService, + ); + const osBiometricsService = mock(); + (sut as any).osBiometricsService = osBiometricsService; + + await sut.setupBiometrics(); + + expect(osBiometricsService.osBiometricsSetup).toHaveBeenCalled(); + }); + }); + + describe("setClientKeyHalfForUser", () => { + let sut: MainBiometricsService; + + beforeEach(() => { + sut = new MainBiometricsService( + i18nService, + windowMain, + logService, + messagingService, + process.platform, + biometricStateService, + ); + }); + + it("should set the client key half for the user", async () => { + const userId = "test" as UserId; + const keyHalf = "testKeyHalf"; + + await sut.setClientKeyHalfForUser(userId, keyHalf); + + expect((sut as any).clientKeyHalves.has(userId)).toBe(true); + expect((sut as any).clientKeyHalves.get(userId)).toBe(keyHalf); + }); + + it("should reset the client key half for the user", async () => { + const userId = "test" as UserId; + + await sut.setClientKeyHalfForUser(userId, null); + + expect((sut as any).clientKeyHalves.has(userId)).toBe(true); + expect((sut as any).clientKeyHalves.get(userId)).toBe(null); + }); + }); + + describe("authenticateWithBiometrics", () => { + it("should call the platform specific authenticate method", async () => { + const sut = new MainBiometricsService( + i18nService, + windowMain, + logService, + messagingService, + process.platform, + biometricStateService, + ); + const osBiometricsService = mock(); + (sut as any).osBiometricsService = osBiometricsService; + + await sut.authenticateWithBiometrics(); + + expect(osBiometricsService.authenticateBiometric).toHaveBeenCalled(); + }); + }); + + describe("unlockWithBiometricsForUser", () => { + let sut: MainBiometricsService; + let osBiometricsService: MockProxy; + + beforeEach(() => { + sut = new MainBiometricsService( + i18nService, + windowMain, + logService, + messagingService, + process.platform, + biometricStateService, + ); + osBiometricsService = mock(); + (sut as any).osBiometricsService = osBiometricsService; + }); + + it("should return null if no biometric key is returned ", async () => { + const userId = "test" as UserId; + (sut as any).clientKeyHalves.set(userId, "testKeyHalf"); + + const userKey = await sut.unlockWithBiometricsForUser(userId); + + expect(userKey).toBeNull(); + expect(osBiometricsService.getBiometricKey).toHaveBeenCalledWith( + "Bitwarden_biometric", + `${userId}_user_biometric`, + "testKeyHalf", + ); + }); + + it("should return the biometric key if a valid key is returned", async () => { + const userId = "test" as UserId; + (sut as any).clientKeyHalves.set(userId, "testKeyHalf"); + const biometricKey = Utils.fromBufferToB64(new Uint8Array(64)); + osBiometricsService.getBiometricKey.mockResolvedValue(biometricKey); + + const userKey = await sut.unlockWithBiometricsForUser(userId); + + expect(userKey).not.toBeNull(); + expect(userKey!.keyB64).toBe(biometricKey); + expect(userKey!.encType).toBe(EncryptionType.AesCbc256_HmacSha256_B64); + expect(osBiometricsService.getBiometricKey).toHaveBeenCalledWith( + "Bitwarden_biometric", + `${userId}_user_biometric`, + "testKeyHalf", + ); + }); + }); + + describe("setBiometricProtectedUnlockKeyForUser", () => { + let sut: MainBiometricsService; + let osBiometricsService: MockProxy; + + beforeEach(() => { + sut = new MainBiometricsService( + i18nService, + windowMain, + logService, + messagingService, + process.platform, + biometricStateService, + ); + osBiometricsService = mock(); + (sut as any).osBiometricsService = osBiometricsService; + }); + + it("should throw an error if no client key half is provided", async () => { + const userId = "test" as UserId; + const unlockKey = "testUnlockKey"; + + await expect(sut.setBiometricProtectedUnlockKeyForUser(userId, unlockKey)).rejects.toThrow( + "No client key half provided for user", + ); + }); + + it("should call the platform specific setBiometricKey method", async () => { + const userId = "test" as UserId; + const unlockKey = "testUnlockKey"; + + (sut as any).clientKeyHalves.set(userId, "testKeyHalf"); + + await sut.setBiometricProtectedUnlockKeyForUser(userId, unlockKey); + + expect(osBiometricsService.setBiometricKey).toHaveBeenCalledWith( + "Bitwarden_biometric", + `${userId}_user_biometric`, + unlockKey, + "testKeyHalf", + ); + }); + }); + + describe("deleteBiometricUnlockKeyForUser", () => { + it("should call the platform specific deleteBiometricKey method", async () => { + const sut = new MainBiometricsService( + i18nService, + windowMain, + logService, + messagingService, + process.platform, + biometricStateService, + ); + const osBiometricsService = mock(); + (sut as any).osBiometricsService = osBiometricsService; + + const userId = "test" as UserId; + + await sut.deleteBiometricUnlockKeyForUser(userId); + + expect(osBiometricsService.deleteBiometricKey).toHaveBeenCalledWith( + "Bitwarden_biometric", + `${userId}_user_biometric`, + ); + }); + }); + + describe("setShouldAutopromptNow", () => { + let sut: MainBiometricsService; + + beforeEach(() => { + sut = new MainBiometricsService( + i18nService, + windowMain, + logService, + messagingService, + process.platform, + biometricStateService, + ); + }); + + it("should set shouldAutopromptNow to false", async () => { + await sut.setShouldAutopromptNow(false); + + const shouldAutoPrompt = await sut.getShouldAutopromptNow(); + + expect(shouldAutoPrompt).toBe(false); + }); + + it("should set shouldAutopromptNow to true", async () => { + await sut.setShouldAutopromptNow(true); + + const shouldAutoPrompt = await sut.getShouldAutopromptNow(); + + expect(shouldAutoPrompt).toBe(true); + }); + }); + + describe("getShouldAutopromptNow", () => { + it("defaults shouldAutoPrompt is true", async () => { + const sut = new MainBiometricsService( + i18nService, + windowMain, + logService, + messagingService, + process.platform, + biometricStateService, + ); + + const shouldAutoPrompt = await sut.getShouldAutopromptNow(); + + expect(shouldAutoPrompt).toBe(true); + }); + }); +}); diff --git a/apps/desktop/src/key-management/biometrics/main-biometrics.service.ts b/apps/desktop/src/key-management/biometrics/main-biometrics.service.ts index 013e69f118c..dd2e15a2fe8 100644 --- a/apps/desktop/src/key-management/biometrics/main-biometrics.service.ts +++ b/apps/desktop/src/key-management/biometrics/main-biometrics.service.ts @@ -13,7 +13,7 @@ import { OsBiometricService } from "./os-biometrics.service"; export class MainBiometricsService extends DesktopBiometricsService { private osBiometricsService: OsBiometricService; - private clientKeyHalves = new Map(); + private clientKeyHalves = new Map(); private shouldAutoPrompt = true; constructor( @@ -104,7 +104,7 @@ export class MainBiometricsService extends DesktopBiometricsService { return await this.osBiometricsService.osBiometricsSetup(); } - async setClientKeyHalfForUser(userId: UserId, value: string): Promise { + async setClientKeyHalfForUser(userId: UserId, value: string | null): Promise { this.clientKeyHalves.set(userId, value); } @@ -116,7 +116,7 @@ export class MainBiometricsService extends DesktopBiometricsService { const biometricKey = await this.osBiometricsService.getBiometricKey( "Bitwarden_biometric", `${userId}_user_biometric`, - this.clientKeyHalves.get(userId), + this.clientKeyHalves.get(userId) ?? undefined, ); if (biometricKey == null) { return null; @@ -136,7 +136,7 @@ export class MainBiometricsService extends DesktopBiometricsService { service, storageKey, value, - this.clientKeyHalves.get(userId), + this.clientKeyHalves.get(userId) ?? undefined, ); } diff --git a/apps/desktop/src/key-management/biometrics/renderer-biometrics.service.ts b/apps/desktop/src/key-management/biometrics/renderer-biometrics.service.ts index a08e68b53f2..2a0b1282778 100644 --- a/apps/desktop/src/key-management/biometrics/renderer-biometrics.service.ts +++ b/apps/desktop/src/key-management/biometrics/renderer-biometrics.service.ts @@ -40,7 +40,7 @@ export class RendererBiometricsService extends DesktopBiometricsService { return await ipc.keyManagement.biometric.setupBiometrics(); } - async setClientKeyHalfForUser(userId: UserId, value: string): Promise { + async setClientKeyHalfForUser(userId: UserId, value: string | null): Promise { return await ipc.keyManagement.biometric.setClientKeyHalf(userId, value); } diff --git a/apps/desktop/src/key-management/lock/services/desktop-lock-component.service.spec.ts b/apps/desktop/src/key-management/lock/services/desktop-lock-component.service.spec.ts index 56f28bde0ef..6bfbc803e87 100644 --- a/apps/desktop/src/key-management/lock/services/desktop-lock-component.service.spec.ts +++ b/apps/desktop/src/key-management/lock/services/desktop-lock-component.service.spec.ts @@ -6,8 +6,8 @@ import { PinServiceAbstraction, UserDecryptionOptionsServiceAbstraction, } from "@bitwarden/auth/common"; -import { VaultTimeoutSettingsService } from "@bitwarden/common/abstractions/vault-timeout/vault-timeout-settings.service"; import { DeviceType } from "@bitwarden/common/enums"; +import { VaultTimeoutSettingsService } from "@bitwarden/common/key-management/vault-timeout"; import { PlatformUtilsService } from "@bitwarden/common/platform/abstractions/platform-utils.service"; import { UserId } from "@bitwarden/common/types/guid"; import { KeyService, BiometricsService, BiometricsStatus } from "@bitwarden/key-management"; diff --git a/apps/desktop/src/key-management/preload.ts b/apps/desktop/src/key-management/preload.ts index b73542ca725..c955571697b 100644 --- a/apps/desktop/src/key-management/preload.ts +++ b/apps/desktop/src/key-management/preload.ts @@ -39,7 +39,7 @@ const biometric = { ipcRenderer.invoke("biometric", { action: BiometricAction.Setup, } satisfies BiometricMessage), - setClientKeyHalf: (userId: string, value: string): Promise => + setClientKeyHalf: (userId: string, value: string | null): Promise => ipcRenderer.invoke("biometric", { action: BiometricAction.SetClientKeyHalf, userId: userId, diff --git a/apps/desktop/src/locales/af/messages.json b/apps/desktop/src/locales/af/messages.json index be14f15b4f7..fce872cb0ab 100644 --- a/apps/desktop/src/locales/af/messages.json +++ b/apps/desktop/src/locales/af/messages.json @@ -652,6 +652,15 @@ "logInToBitwarden": { "message": "Log in to Bitwarden" }, + "enterTheCodeSentToYourEmail": { + "message": "Enter the code sent to your email" + }, + "enterTheCodeFromYourAuthenticatorApp": { + "message": "Enter the code from your authenticator app" + }, + "pressYourYubiKeyToAuthenticate": { + "message": "Press your YubiKey to authenticate" + }, "logInWithPasskey": { "message": "Log in with passkey" }, @@ -704,6 +713,15 @@ "masterPassHintLabel": { "message": "Master password hint" }, + "passwordStrengthScore": { + "message": "Password strength score $SCORE$", + "placeholders": { + "score": { + "content": "$1", + "example": "4" + } + } + }, "joinOrganization": { "message": "Join organization" }, @@ -816,6 +834,9 @@ "webauthnCancelOrTimeout": { "message": "The authentication was cancelled or took too long. Please try again." }, + "openInNewTab": { + "message": "Open in new tab" + }, "invalidVerificationCode": { "message": "Ongeldige bevestigingskode" }, @@ -846,12 +867,22 @@ "rememberMe": { "message": "Onthou my" }, + "dontAskAgainOnThisDeviceFor30Days": { + "message": "Don't ask again on this device for 30 days" + }, "sendVerificationCodeEmailAgain": { "message": "Stuur weer e-pos met bevestigingskode" }, "useAnotherTwoStepMethod": { "message": "Gebruik ’n ander tweestapaantekenmetode" }, + "selectAnotherMethod": { + "message": "Select another method", + "description": "Select another two-step login method" + }, + "useYourRecoveryCode": { + "message": "Use your recovery code" + }, "insertYubiKey": { "message": "Plaas u YubiKey in u rekenaar se USB-poort en druk dan op sy knop." }, @@ -918,6 +949,9 @@ "twoStepOptions": { "message": "Opsies vir tweestapaantekening" }, + "selectTwoStepLoginMethod": { + "message": "Select two-step login method" + }, "selfHostedEnvironment": { "message": "Selfgehuisveste omgewing" }, @@ -2247,6 +2281,12 @@ "webAuthnAuthenticate": { "message": "Waarmerk WebAuthn" }, + "readSecurityKey": { + "message": "Read security key" + }, + "awaitingSecurityKeyInteraction": { + "message": "Awaiting security key interaction..." + }, "hideEmail": { "message": "Versteek my e-posadres vir ontvangers." }, @@ -3206,6 +3246,12 @@ "duoRequiredByOrgForAccount": { "message": "Duo two-step login is required for your account." }, + "duoTwoFactorRequiredPageSubtitle": { + "message": "Duo two-step login is required for your account. Follow the steps below to finish logging in." + }, + "followTheStepsBelowToFinishLoggingIn": { + "message": "Follow the steps below to finish logging in." + }, "launchDuo": { "message": "Launch Duo in Browser" }, @@ -3463,9 +3509,27 @@ "sshkeyApprovalTitle": { "message": "Confirm SSH key usage" }, + "agentForwardingWarningTitle": { + "message": "Warning: Agent Forwarding" + }, + "agentForwardingWarningText": { + "message": "This request comes from a remote device that you are logged into" + }, "sshkeyApprovalMessageInfix": { "message": "is requesting access to" }, + "sshkeyApprovalMessageSuffix": { + "message": "in order to" + }, + "sshActionLogin": { + "message": "authenticate to a server" + }, + "sshActionSign": { + "message": "sign a message" + }, + "sshActionGitSign": { + "message": "sign a git commit" + }, "unknownApplication": { "message": "An application" }, diff --git a/apps/desktop/src/locales/ar/messages.json b/apps/desktop/src/locales/ar/messages.json index c0834bed1e6..efef6558df9 100644 --- a/apps/desktop/src/locales/ar/messages.json +++ b/apps/desktop/src/locales/ar/messages.json @@ -652,6 +652,15 @@ "logInToBitwarden": { "message": "تسجيل الدخول إلى Bitwarden" }, + "enterTheCodeSentToYourEmail": { + "message": "Enter the code sent to your email" + }, + "enterTheCodeFromYourAuthenticatorApp": { + "message": "Enter the code from your authenticator app" + }, + "pressYourYubiKeyToAuthenticate": { + "message": "Press your YubiKey to authenticate" + }, "logInWithPasskey": { "message": "تسجيل الدخول باستخدام مفتاح المرور" }, @@ -704,6 +713,15 @@ "masterPassHintLabel": { "message": "تلميح كلمة المرور الرئيسية" }, + "passwordStrengthScore": { + "message": "Password strength score $SCORE$", + "placeholders": { + "score": { + "content": "$1", + "example": "4" + } + } + }, "joinOrganization": { "message": "الانضمام إلى المؤسسة" }, @@ -816,6 +834,9 @@ "webauthnCancelOrTimeout": { "message": "تم إلغاء المصادقة أو استغرقت وقتا طويلا. الرجاء المحاولة مرة أخرى." }, + "openInNewTab": { + "message": "Open in new tab" + }, "invalidVerificationCode": { "message": "رمز التحقق غير صالح" }, @@ -846,12 +867,22 @@ "rememberMe": { "message": "تذكرني" }, + "dontAskAgainOnThisDeviceFor30Days": { + "message": "Don't ask again on this device for 30 days" + }, "sendVerificationCodeEmailAgain": { "message": "إرسال رمز التحقق إلى البريد الإلكتروني مرة أخرى" }, "useAnotherTwoStepMethod": { "message": "استخدام طريقة أخرى لتسجيل الدخول بخطوتين" }, + "selectAnotherMethod": { + "message": "Select another method", + "description": "Select another two-step login method" + }, + "useYourRecoveryCode": { + "message": "Use your recovery code" + }, "insertYubiKey": { "message": "أدخل YubiKey الخاص بك في منفذ USB في كمبيوترك، ثم لمس الزر." }, @@ -918,6 +949,9 @@ "twoStepOptions": { "message": "خيارات تسجيل الدخول بخطوتين" }, + "selectTwoStepLoginMethod": { + "message": "Select two-step login method" + }, "selfHostedEnvironment": { "message": "البيئة المستضافة ذاتيا" }, @@ -2247,6 +2281,12 @@ "webAuthnAuthenticate": { "message": "مصادقة WebAuthn" }, + "readSecurityKey": { + "message": "Read security key" + }, + "awaitingSecurityKeyInteraction": { + "message": "Awaiting security key interaction..." + }, "hideEmail": { "message": "إخفاء عنوان البريد الإلكتروني الخاص بي من المستلمين." }, @@ -3206,6 +3246,12 @@ "duoRequiredByOrgForAccount": { "message": "تسجيل الدخول لـ Duo من خطوتين مطلوب لحسابك." }, + "duoTwoFactorRequiredPageSubtitle": { + "message": "Duo two-step login is required for your account. Follow the steps below to finish logging in." + }, + "followTheStepsBelowToFinishLoggingIn": { + "message": "Follow the steps below to finish logging in." + }, "launchDuo": { "message": "تشغيل دوو في المتصفح" }, @@ -3463,9 +3509,27 @@ "sshkeyApprovalTitle": { "message": "تأكيد استخدام مفتاح SSH" }, + "agentForwardingWarningTitle": { + "message": "Warning: Agent Forwarding" + }, + "agentForwardingWarningText": { + "message": "This request comes from a remote device that you are logged into" + }, "sshkeyApprovalMessageInfix": { "message": "يطلب الوصول إلى" }, + "sshkeyApprovalMessageSuffix": { + "message": "in order to" + }, + "sshActionLogin": { + "message": "authenticate to a server" + }, + "sshActionSign": { + "message": "sign a message" + }, + "sshActionGitSign": { + "message": "sign a git commit" + }, "unknownApplication": { "message": "تطبيق" }, diff --git a/apps/desktop/src/locales/az/messages.json b/apps/desktop/src/locales/az/messages.json index 50bfcf8f476..e7006cdd004 100644 --- a/apps/desktop/src/locales/az/messages.json +++ b/apps/desktop/src/locales/az/messages.json @@ -652,6 +652,15 @@ "logInToBitwarden": { "message": "Bitwarden-ə giriş edin" }, + "enterTheCodeSentToYourEmail": { + "message": "E-poçtunuza göndərilən kodu daxil edin" + }, + "enterTheCodeFromYourAuthenticatorApp": { + "message": "Kimlik doğrulayıcı tətbiqinizdəki kodu daxil edin" + }, + "pressYourYubiKeyToAuthenticate": { + "message": "Kimliyi doğrulamaq üçün YubiKey-inizə basın" + }, "logInWithPasskey": { "message": "Keçid açarı ilə giriş et" }, @@ -704,6 +713,15 @@ "masterPassHintLabel": { "message": "Ana parol ipucusu" }, + "passwordStrengthScore": { + "message": "Parolun güc xalı: $SCORE$", + "placeholders": { + "score": { + "content": "$1", + "example": "4" + } + } + }, "joinOrganization": { "message": "Təşkilata qoşul" }, @@ -816,6 +834,9 @@ "webauthnCancelOrTimeout": { "message": "Kimlik doğrulama ləğv edildi və ya çox uzun çəkdi. Lütfən yenidən sınayın." }, + "openInNewTab": { + "message": "Yeni vərəqdə aç" + }, "invalidVerificationCode": { "message": "Yararsız doğrulama kodu" }, @@ -846,12 +867,22 @@ "rememberMe": { "message": "Məni xatırla" }, + "dontAskAgainOnThisDeviceFor30Days": { + "message": "Bu cihazda 30 gün ərzində soruşulmasın" + }, "sendVerificationCodeEmailAgain": { "message": "Doğrulama kodu olan e-poçtu yenidən göndər" }, "useAnotherTwoStepMethod": { "message": "Başqa bir iki mərhələli giriş metodu istifadə edin" }, + "selectAnotherMethod": { + "message": "Başqa üsul seçin", + "description": "Select another two-step login method" + }, + "useYourRecoveryCode": { + "message": "Geri qaytarma kodunuzu istifadə edin" + }, "insertYubiKey": { "message": "\"YubiKey\"i kompüterinizin USB portuna taxın, daha sonra düyməsinə toxunun." }, @@ -918,6 +949,9 @@ "twoStepOptions": { "message": "İki mərhələli giriş seçimləri" }, + "selectTwoStepLoginMethod": { + "message": "İki addımlı giriş üsulunu seçin" + }, "selfHostedEnvironment": { "message": "Self-hosted mühit" }, @@ -2247,6 +2281,12 @@ "webAuthnAuthenticate": { "message": "WebAuthn kimlik doğrulama" }, + "readSecurityKey": { + "message": "Güvənlik açarını oxu" + }, + "awaitingSecurityKeyInteraction": { + "message": "Güvənlik açarı ilə əlaqə gözlənilir..." + }, "hideEmail": { "message": "E-poçt ünvanımı alıcılardan gizlət." }, @@ -3206,6 +3246,12 @@ "duoRequiredByOrgForAccount": { "message": "Hesabınız üçün Duo iki addımlı giriş tələb olunur." }, + "duoTwoFactorRequiredPageSubtitle": { + "message": "Hesabınız üçün Duo iki addımlı giriş tələb olunur. Giriş prosesini tamamlamaq üçün aşağıdakı addımları izləyin." + }, + "followTheStepsBelowToFinishLoggingIn": { + "message": "Giriş prosesini tamamlamaq üçün aşağıdakı addımları izləyin." + }, "launchDuo": { "message": "Duo-nu brauzerdə başlat" }, @@ -3463,9 +3509,27 @@ "sshkeyApprovalTitle": { "message": "SSH açar istifadəsini təsdiqlə" }, + "agentForwardingWarningTitle": { + "message": "Xəbərdarlıq: Nümayəndə yönləndirilir" + }, + "agentForwardingWarningText": { + "message": "Bu tələb, giriş etdiyiniz remote bir cihazdan gəlir" + }, "sshkeyApprovalMessageInfix": { "message": "bura müraciət tələb edir:" }, + "sshkeyApprovalMessageSuffix": { + "message": "in order to" + }, + "sshActionLogin": { + "message": "authenticate to a server" + }, + "sshActionSign": { + "message": "sign a message" + }, + "sshActionGitSign": { + "message": "sign a git commit" + }, "unknownApplication": { "message": "Bir tətbiq" }, diff --git a/apps/desktop/src/locales/be/messages.json b/apps/desktop/src/locales/be/messages.json index 05a680898f9..1e92720969e 100644 --- a/apps/desktop/src/locales/be/messages.json +++ b/apps/desktop/src/locales/be/messages.json @@ -652,6 +652,15 @@ "logInToBitwarden": { "message": "Log in to Bitwarden" }, + "enterTheCodeSentToYourEmail": { + "message": "Enter the code sent to your email" + }, + "enterTheCodeFromYourAuthenticatorApp": { + "message": "Enter the code from your authenticator app" + }, + "pressYourYubiKeyToAuthenticate": { + "message": "Press your YubiKey to authenticate" + }, "logInWithPasskey": { "message": "Log in with passkey" }, @@ -704,6 +713,15 @@ "masterPassHintLabel": { "message": "Master password hint" }, + "passwordStrengthScore": { + "message": "Password strength score $SCORE$", + "placeholders": { + "score": { + "content": "$1", + "example": "4" + } + } + }, "joinOrganization": { "message": "Join organization" }, @@ -816,6 +834,9 @@ "webauthnCancelOrTimeout": { "message": "The authentication was cancelled or took too long. Please try again." }, + "openInNewTab": { + "message": "Open in new tab" + }, "invalidVerificationCode": { "message": "Памылковы праверачны код" }, @@ -846,12 +867,22 @@ "rememberMe": { "message": "Запомніць мяне" }, + "dontAskAgainOnThisDeviceFor30Days": { + "message": "Don't ask again on this device for 30 days" + }, "sendVerificationCodeEmailAgain": { "message": "Адправіць праверачны код яшчэ раз" }, "useAnotherTwoStepMethod": { "message": "Выкарыстоўваць іншы метад двухэтапнага ўваходу" }, + "selectAnotherMethod": { + "message": "Select another method", + "description": "Select another two-step login method" + }, + "useYourRecoveryCode": { + "message": "Use your recovery code" + }, "insertYubiKey": { "message": "Устаўце свой YubiKey у порт USB камп'ютара, а потым націсніце на кнопку." }, @@ -918,6 +949,9 @@ "twoStepOptions": { "message": "Параметры двухэтапнага ўваходу" }, + "selectTwoStepLoginMethod": { + "message": "Select two-step login method" + }, "selfHostedEnvironment": { "message": "Асяроддзе ўласнага хостынгу" }, @@ -2247,6 +2281,12 @@ "webAuthnAuthenticate": { "message": "Аўтэнтыфікацыя WebAuthn" }, + "readSecurityKey": { + "message": "Read security key" + }, + "awaitingSecurityKeyInteraction": { + "message": "Awaiting security key interaction..." + }, "hideEmail": { "message": "Схаваць маю электронную пошту ад атрымальнікаў." }, @@ -3206,6 +3246,12 @@ "duoRequiredByOrgForAccount": { "message": "Duo two-step login is required for your account." }, + "duoTwoFactorRequiredPageSubtitle": { + "message": "Duo two-step login is required for your account. Follow the steps below to finish logging in." + }, + "followTheStepsBelowToFinishLoggingIn": { + "message": "Follow the steps below to finish logging in." + }, "launchDuo": { "message": "Launch Duo in Browser" }, @@ -3463,9 +3509,27 @@ "sshkeyApprovalTitle": { "message": "Confirm SSH key usage" }, + "agentForwardingWarningTitle": { + "message": "Warning: Agent Forwarding" + }, + "agentForwardingWarningText": { + "message": "This request comes from a remote device that you are logged into" + }, "sshkeyApprovalMessageInfix": { "message": "is requesting access to" }, + "sshkeyApprovalMessageSuffix": { + "message": "in order to" + }, + "sshActionLogin": { + "message": "authenticate to a server" + }, + "sshActionSign": { + "message": "sign a message" + }, + "sshActionGitSign": { + "message": "sign a git commit" + }, "unknownApplication": { "message": "An application" }, diff --git a/apps/desktop/src/locales/bg/messages.json b/apps/desktop/src/locales/bg/messages.json index cdada0bd00d..6686254fcbf 100644 --- a/apps/desktop/src/locales/bg/messages.json +++ b/apps/desktop/src/locales/bg/messages.json @@ -652,6 +652,15 @@ "logInToBitwarden": { "message": "Впишете се в Битуорден" }, + "enterTheCodeSentToYourEmail": { + "message": "Въведете кода изпратен на е-пощата Ви" + }, + "enterTheCodeFromYourAuthenticatorApp": { + "message": "Въведете кода от Вашето приложение за удостоверяване" + }, + "pressYourYubiKeyToAuthenticate": { + "message": "Натиснете бутона на своя YubiKey за удостоверяване" + }, "logInWithPasskey": { "message": "Вписване със секретен ключ" }, @@ -704,6 +713,15 @@ "masterPassHintLabel": { "message": "Подсказка за главната парола" }, + "passwordStrengthScore": { + "message": "Оценка на сложността на паролата: $SCORE$", + "placeholders": { + "score": { + "content": "$1", + "example": "4" + } + } + }, "joinOrganization": { "message": "Присъединяване към организацията" }, @@ -816,6 +834,9 @@ "webauthnCancelOrTimeout": { "message": "Удостоверяването беше отменено или отне твърде много време. Моля, опитайте отново." }, + "openInNewTab": { + "message": "Отваряне в нов раздел" + }, "invalidVerificationCode": { "message": "Грешен код за потвърждаване" }, @@ -846,12 +867,22 @@ "rememberMe": { "message": "Запомняне" }, + "dontAskAgainOnThisDeviceFor30Days": { + "message": "Не ме питайте отново на това устройство за 30 дни" + }, "sendVerificationCodeEmailAgain": { "message": "Повторно изпращане на писмото за потвърждение" }, "useAnotherTwoStepMethod": { "message": "Използвайте друг начин на двустепенно удостоверяване" }, + "selectAnotherMethod": { + "message": "Изберете друг метод", + "description": "Select another two-step login method" + }, + "useYourRecoveryCode": { + "message": "Използване на код за възстановяване" + }, "insertYubiKey": { "message": "Поставете устройството на YubiKey в USB порт на компютъра и натиснете бутона на устройството." }, @@ -918,6 +949,9 @@ "twoStepOptions": { "message": "Настройки на двустепенното удостоверяване" }, + "selectTwoStepLoginMethod": { + "message": "Изберете начин за двустепенно удостоверяване" + }, "selfHostedEnvironment": { "message": "Собствена среда" }, @@ -2247,6 +2281,12 @@ "webAuthnAuthenticate": { "message": "Идентификация WebAuthn" }, + "readSecurityKey": { + "message": "Прочитане на ключа за сигурност" + }, + "awaitingSecurityKeyInteraction": { + "message": "Изчакване на действие с ключ за сигурност…" + }, "hideEmail": { "message": "Скриване на е-пощата ми от получателите." }, @@ -3206,6 +3246,12 @@ "duoRequiredByOrgForAccount": { "message": "Вашата регистрация изисква двустепенно удостоверяване чрез Duo." }, + "duoTwoFactorRequiredPageSubtitle": { + "message": "Вашият акаунт изисква вписване чрез двустепенно удостоверяване с Duo. Следвайте стъпките по-долу, за да завършите вписването." + }, + "followTheStepsBelowToFinishLoggingIn": { + "message": "Следвайте стъпките по-долу, за да завършите вписването." + }, "launchDuo": { "message": "Стартирайте Duo в браузъра" }, @@ -3463,9 +3509,27 @@ "sshkeyApprovalTitle": { "message": "Потвърждаване на употребата на SSH ключа" }, + "agentForwardingWarningTitle": { + "message": "Внимание: Пренасочване на агента" + }, + "agentForwardingWarningText": { + "message": "Тази заявка идва от отдалечено устройство, в което сте вписан(а)" + }, "sshkeyApprovalMessageInfix": { "message": "иска достъп до" }, + "sshkeyApprovalMessageSuffix": { + "message": "за да" + }, + "sshActionLogin": { + "message": "се удостоверите в сървър" + }, + "sshActionSign": { + "message": "подпишете съобщение" + }, + "sshActionGitSign": { + "message": "подпишете подаване в git" + }, "unknownApplication": { "message": "Приложение" }, diff --git a/apps/desktop/src/locales/bn/messages.json b/apps/desktop/src/locales/bn/messages.json index 5b34f668c4f..256ecb3b660 100644 --- a/apps/desktop/src/locales/bn/messages.json +++ b/apps/desktop/src/locales/bn/messages.json @@ -652,6 +652,15 @@ "logInToBitwarden": { "message": "Log in to Bitwarden" }, + "enterTheCodeSentToYourEmail": { + "message": "Enter the code sent to your email" + }, + "enterTheCodeFromYourAuthenticatorApp": { + "message": "Enter the code from your authenticator app" + }, + "pressYourYubiKeyToAuthenticate": { + "message": "Press your YubiKey to authenticate" + }, "logInWithPasskey": { "message": "Log in with passkey" }, @@ -704,6 +713,15 @@ "masterPassHintLabel": { "message": "Master password hint" }, + "passwordStrengthScore": { + "message": "Password strength score $SCORE$", + "placeholders": { + "score": { + "content": "$1", + "example": "4" + } + } + }, "joinOrganization": { "message": "Join organization" }, @@ -816,6 +834,9 @@ "webauthnCancelOrTimeout": { "message": "The authentication was cancelled or took too long. Please try again." }, + "openInNewTab": { + "message": "Open in new tab" + }, "invalidVerificationCode": { "message": "Invalid verification code" }, @@ -846,12 +867,22 @@ "rememberMe": { "message": "আমাকে মনে রাখবেন" }, + "dontAskAgainOnThisDeviceFor30Days": { + "message": "Don't ask again on this device for 30 days" + }, "sendVerificationCodeEmailAgain": { "message": "আবার যাচাইকরণ কোড ইমেইলে প্রেরণ করুন" }, "useAnotherTwoStepMethod": { "message": "অন্য দ্বি-পদক্ষেপ প্রবেশ পদ্ধতি ব্যবহার করুন" }, + "selectAnotherMethod": { + "message": "Select another method", + "description": "Select another two-step login method" + }, + "useYourRecoveryCode": { + "message": "Use your recovery code" + }, "insertYubiKey": { "message": "আপনার কম্পিউটারের ইউএসবি পোর্টে আপনার YubiKey ঢোকান, তারপরে তার বোতামটি স্পর্শ করুন।" }, @@ -918,6 +949,9 @@ "twoStepOptions": { "message": "দ্বি-পদক্ষেপ লগইন বিকল্প" }, + "selectTwoStepLoginMethod": { + "message": "Select two-step login method" + }, "selfHostedEnvironment": { "message": "স্ব-হোস্টকৃত পরিবেশ" }, @@ -2247,6 +2281,12 @@ "webAuthnAuthenticate": { "message": "Authenticate WebAuthn" }, + "readSecurityKey": { + "message": "Read security key" + }, + "awaitingSecurityKeyInteraction": { + "message": "Awaiting security key interaction..." + }, "hideEmail": { "message": "Hide my email address from recipients." }, @@ -3206,6 +3246,12 @@ "duoRequiredByOrgForAccount": { "message": "Duo two-step login is required for your account." }, + "duoTwoFactorRequiredPageSubtitle": { + "message": "Duo two-step login is required for your account. Follow the steps below to finish logging in." + }, + "followTheStepsBelowToFinishLoggingIn": { + "message": "Follow the steps below to finish logging in." + }, "launchDuo": { "message": "Launch Duo in Browser" }, @@ -3463,9 +3509,27 @@ "sshkeyApprovalTitle": { "message": "Confirm SSH key usage" }, + "agentForwardingWarningTitle": { + "message": "Warning: Agent Forwarding" + }, + "agentForwardingWarningText": { + "message": "This request comes from a remote device that you are logged into" + }, "sshkeyApprovalMessageInfix": { "message": "is requesting access to" }, + "sshkeyApprovalMessageSuffix": { + "message": "in order to" + }, + "sshActionLogin": { + "message": "authenticate to a server" + }, + "sshActionSign": { + "message": "sign a message" + }, + "sshActionGitSign": { + "message": "sign a git commit" + }, "unknownApplication": { "message": "An application" }, diff --git a/apps/desktop/src/locales/bs/messages.json b/apps/desktop/src/locales/bs/messages.json index c28cc71c4bf..4600638ec00 100644 --- a/apps/desktop/src/locales/bs/messages.json +++ b/apps/desktop/src/locales/bs/messages.json @@ -652,6 +652,15 @@ "logInToBitwarden": { "message": "Log in to Bitwarden" }, + "enterTheCodeSentToYourEmail": { + "message": "Enter the code sent to your email" + }, + "enterTheCodeFromYourAuthenticatorApp": { + "message": "Enter the code from your authenticator app" + }, + "pressYourYubiKeyToAuthenticate": { + "message": "Press your YubiKey to authenticate" + }, "logInWithPasskey": { "message": "Log in with passkey" }, @@ -704,6 +713,15 @@ "masterPassHintLabel": { "message": "Master password hint" }, + "passwordStrengthScore": { + "message": "Password strength score $SCORE$", + "placeholders": { + "score": { + "content": "$1", + "example": "4" + } + } + }, "joinOrganization": { "message": "Join organization" }, @@ -816,6 +834,9 @@ "webauthnCancelOrTimeout": { "message": "The authentication was cancelled or took too long. Please try again." }, + "openInNewTab": { + "message": "Open in new tab" + }, "invalidVerificationCode": { "message": "Neispravan verifikacijski kod" }, @@ -846,12 +867,22 @@ "rememberMe": { "message": "Zapamti me" }, + "dontAskAgainOnThisDeviceFor30Days": { + "message": "Don't ask again on this device for 30 days" + }, "sendVerificationCodeEmailAgain": { "message": "Ponovo pošaljite E-Mail sa verifikacionim kodom" }, "useAnotherTwoStepMethod": { "message": "Koristite drugi način prijavljivanja u dva koraka" }, + "selectAnotherMethod": { + "message": "Select another method", + "description": "Select another two-step login method" + }, + "useYourRecoveryCode": { + "message": "Use your recovery code" + }, "insertYubiKey": { "message": "Ubaci svoj YubiKey u USB slot računara, a zatim dodirni njegovu tipku." }, @@ -918,6 +949,9 @@ "twoStepOptions": { "message": "Opcije prijave u dva koraka" }, + "selectTwoStepLoginMethod": { + "message": "Select two-step login method" + }, "selfHostedEnvironment": { "message": "Vlastito hosting okruženje" }, @@ -2247,6 +2281,12 @@ "webAuthnAuthenticate": { "message": "Authenticate WebAuthn" }, + "readSecurityKey": { + "message": "Read security key" + }, + "awaitingSecurityKeyInteraction": { + "message": "Awaiting security key interaction..." + }, "hideEmail": { "message": "Hide my email address from recipients." }, @@ -3206,6 +3246,12 @@ "duoRequiredByOrgForAccount": { "message": "Duo two-step login is required for your account." }, + "duoTwoFactorRequiredPageSubtitle": { + "message": "Duo two-step login is required for your account. Follow the steps below to finish logging in." + }, + "followTheStepsBelowToFinishLoggingIn": { + "message": "Follow the steps below to finish logging in." + }, "launchDuo": { "message": "Launch Duo in Browser" }, @@ -3463,9 +3509,27 @@ "sshkeyApprovalTitle": { "message": "Confirm SSH key usage" }, + "agentForwardingWarningTitle": { + "message": "Warning: Agent Forwarding" + }, + "agentForwardingWarningText": { + "message": "This request comes from a remote device that you are logged into" + }, "sshkeyApprovalMessageInfix": { "message": "is requesting access to" }, + "sshkeyApprovalMessageSuffix": { + "message": "in order to" + }, + "sshActionLogin": { + "message": "authenticate to a server" + }, + "sshActionSign": { + "message": "sign a message" + }, + "sshActionGitSign": { + "message": "sign a git commit" + }, "unknownApplication": { "message": "An application" }, diff --git a/apps/desktop/src/locales/ca/messages.json b/apps/desktop/src/locales/ca/messages.json index d732c4912c7..c9f2b6a6bdc 100644 --- a/apps/desktop/src/locales/ca/messages.json +++ b/apps/desktop/src/locales/ca/messages.json @@ -652,6 +652,15 @@ "logInToBitwarden": { "message": "Inicia sessió a Bitwarden" }, + "enterTheCodeSentToYourEmail": { + "message": "Enter the code sent to your email" + }, + "enterTheCodeFromYourAuthenticatorApp": { + "message": "Enter the code from your authenticator app" + }, + "pressYourYubiKeyToAuthenticate": { + "message": "Press your YubiKey to authenticate" + }, "logInWithPasskey": { "message": "Inicieu sessió amb la clau de pas" }, @@ -704,6 +713,15 @@ "masterPassHintLabel": { "message": "Pista de la contrasenya mestra" }, + "passwordStrengthScore": { + "message": "Password strength score $SCORE$", + "placeholders": { + "score": { + "content": "$1", + "example": "4" + } + } + }, "joinOrganization": { "message": "Uniu-vos a l'organització" }, @@ -816,6 +834,9 @@ "webauthnCancelOrTimeout": { "message": "L'autenticació s'ha cancel·lat o ha tardat massa. Torna-ho a provar." }, + "openInNewTab": { + "message": "Open in new tab" + }, "invalidVerificationCode": { "message": "Codi de verificació no vàlid" }, @@ -846,12 +867,22 @@ "rememberMe": { "message": "Recorda'm" }, + "dontAskAgainOnThisDeviceFor30Days": { + "message": "Don't ask again on this device for 30 days" + }, "sendVerificationCodeEmailAgain": { "message": "Envia el codi de verificació altra vegada" }, "useAnotherTwoStepMethod": { "message": "Utilitzeu un altre mètode d'inici de sessió en dues passes" }, + "selectAnotherMethod": { + "message": "Select another method", + "description": "Select another two-step login method" + }, + "useYourRecoveryCode": { + "message": "Use your recovery code" + }, "insertYubiKey": { "message": "Introduïu la vostra YubiKey al port USB de l'ordinador i, a continuació, premeu el seu botó." }, @@ -918,6 +949,9 @@ "twoStepOptions": { "message": "Opcions d'inici de sessió en dues passes" }, + "selectTwoStepLoginMethod": { + "message": "Select two-step login method" + }, "selfHostedEnvironment": { "message": "Entorn d'allotjament propi" }, @@ -2247,6 +2281,12 @@ "webAuthnAuthenticate": { "message": "Autenticar WebAuthn" }, + "readSecurityKey": { + "message": "Read security key" + }, + "awaitingSecurityKeyInteraction": { + "message": "Awaiting security key interaction..." + }, "hideEmail": { "message": "Amagueu la meua adreça de correu electrònic als destinataris." }, @@ -3206,6 +3246,12 @@ "duoRequiredByOrgForAccount": { "message": "Es requereix l'inici de sessió en dos passos de DUO al vostre compte." }, + "duoTwoFactorRequiredPageSubtitle": { + "message": "Duo two-step login is required for your account. Follow the steps below to finish logging in." + }, + "followTheStepsBelowToFinishLoggingIn": { + "message": "Follow the steps below to finish logging in." + }, "launchDuo": { "message": "Inicia Duo al navegador" }, @@ -3463,9 +3509,27 @@ "sshkeyApprovalTitle": { "message": "Confirm SSH key usage" }, + "agentForwardingWarningTitle": { + "message": "Warning: Agent Forwarding" + }, + "agentForwardingWarningText": { + "message": "This request comes from a remote device that you are logged into" + }, "sshkeyApprovalMessageInfix": { "message": "is requesting access to" }, + "sshkeyApprovalMessageSuffix": { + "message": "in order to" + }, + "sshActionLogin": { + "message": "authenticate to a server" + }, + "sshActionSign": { + "message": "sign a message" + }, + "sshActionGitSign": { + "message": "sign a git commit" + }, "unknownApplication": { "message": "Una aplicació" }, diff --git a/apps/desktop/src/locales/cs/messages.json b/apps/desktop/src/locales/cs/messages.json index 6f996578f07..46363e26f70 100644 --- a/apps/desktop/src/locales/cs/messages.json +++ b/apps/desktop/src/locales/cs/messages.json @@ -652,6 +652,15 @@ "logInToBitwarden": { "message": "Přihlásit se do Bitwardenu" }, + "enterTheCodeSentToYourEmail": { + "message": "Zadejte kód odeslaný na Váš e-mail" + }, + "enterTheCodeFromYourAuthenticatorApp": { + "message": "Zadejte kód z Vaší ověřovací aplikace" + }, + "pressYourYubiKeyToAuthenticate": { + "message": "Stiskněte svůj YubiKey pro ověření" + }, "logInWithPasskey": { "message": "Přihlásit se pomocí přístupového klíče" }, @@ -704,6 +713,15 @@ "masterPassHintLabel": { "message": "Nápověda k hlavnímu heslu" }, + "passwordStrengthScore": { + "message": "Skóre síly hesla: $SCORE$", + "placeholders": { + "score": { + "content": "$1", + "example": "4" + } + } + }, "joinOrganization": { "message": "Přidat se k organizaci" }, @@ -816,6 +834,9 @@ "webauthnCancelOrTimeout": { "message": "Ověření bylo zrušeno nebo trvalo příliš dlouho. Zkuste to znovu." }, + "openInNewTab": { + "message": "Otevřít v nové kartě" + }, "invalidVerificationCode": { "message": "Neplatný ověřovací kód" }, @@ -846,12 +867,22 @@ "rememberMe": { "message": "Zapamatovat mě" }, + "dontAskAgainOnThisDeviceFor30Days": { + "message": "Neptat se na tomto zařízení 30 dnů" + }, "sendVerificationCodeEmailAgain": { "message": "Znovu zaslat ověřovací kód na e-mail" }, "useAnotherTwoStepMethod": { "message": "Použít jinou metodu dvoufázového přihlášení" }, + "selectAnotherMethod": { + "message": "Vybrat jinou metodu", + "description": "Select another two-step login method" + }, + "useYourRecoveryCode": { + "message": "Použít obnovovací kód" + }, "insertYubiKey": { "message": "Vložte YubiKey do USB portu Vašeho počítače a stiskněte jeho tlačítko." }, @@ -918,6 +949,9 @@ "twoStepOptions": { "message": "Volby dvoufázového přihlášení" }, + "selectTwoStepLoginMethod": { + "message": "Vyberte metodu dvoufázového přihlášení" + }, "selfHostedEnvironment": { "message": "Vlastní hostované prostředí" }, @@ -2247,6 +2281,12 @@ "webAuthnAuthenticate": { "message": "Ověřit WebAuthn" }, + "readSecurityKey": { + "message": "Přečíst bezpečnostní klíč" + }, + "awaitingSecurityKeyInteraction": { + "message": "Čeká se na interakci s bezpečnostním klíčem..." + }, "hideEmail": { "message": "Skrýt moji e-mailovou adresu před příjemci." }, @@ -3206,6 +3246,12 @@ "duoRequiredByOrgForAccount": { "message": "Pro Váš účet je vyžadováno dvoufázové přihlášení DUO." }, + "duoTwoFactorRequiredPageSubtitle": { + "message": "Pro Váš účet je nutné dvoufázové přihlášení. Pro dokončení přihlášení postupujte podle následujících kroků." + }, + "followTheStepsBelowToFinishLoggingIn": { + "message": "Postupujte podle kroků níže pro dokončení přihlášení." + }, "launchDuo": { "message": "Spustit DUO v prohlížeči" }, @@ -3463,9 +3509,27 @@ "sshkeyApprovalTitle": { "message": "Potvrdit použití SSH klíče" }, + "agentForwardingWarningTitle": { + "message": "Varování: Agent přesměrování" + }, + "agentForwardingWarningText": { + "message": "Tento požadavek pochází ze vzdáleného zařízení, ke kterému jste přihlášeni" + }, "sshkeyApprovalMessageInfix": { "message": "žádá o přístup k" }, + "sshkeyApprovalMessageSuffix": { + "message": "za účelem" + }, + "sshActionLogin": { + "message": "ověření na serveru" + }, + "sshActionSign": { + "message": "podepsání zprávy" + }, + "sshActionGitSign": { + "message": "podepsání commitu na gitu" + }, "unknownApplication": { "message": "Aplikace" }, diff --git a/apps/desktop/src/locales/cy/messages.json b/apps/desktop/src/locales/cy/messages.json index 91e8f451569..f904deefe8f 100644 --- a/apps/desktop/src/locales/cy/messages.json +++ b/apps/desktop/src/locales/cy/messages.json @@ -652,6 +652,15 @@ "logInToBitwarden": { "message": "Log in to Bitwarden" }, + "enterTheCodeSentToYourEmail": { + "message": "Enter the code sent to your email" + }, + "enterTheCodeFromYourAuthenticatorApp": { + "message": "Enter the code from your authenticator app" + }, + "pressYourYubiKeyToAuthenticate": { + "message": "Press your YubiKey to authenticate" + }, "logInWithPasskey": { "message": "Log in with passkey" }, @@ -704,6 +713,15 @@ "masterPassHintLabel": { "message": "Master password hint" }, + "passwordStrengthScore": { + "message": "Password strength score $SCORE$", + "placeholders": { + "score": { + "content": "$1", + "example": "4" + } + } + }, "joinOrganization": { "message": "Join organization" }, @@ -816,6 +834,9 @@ "webauthnCancelOrTimeout": { "message": "The authentication was cancelled or took too long. Please try again." }, + "openInNewTab": { + "message": "Open in new tab" + }, "invalidVerificationCode": { "message": "Invalid verification code" }, @@ -846,12 +867,22 @@ "rememberMe": { "message": "Remember me" }, + "dontAskAgainOnThisDeviceFor30Days": { + "message": "Don't ask again on this device for 30 days" + }, "sendVerificationCodeEmailAgain": { "message": "Send verification code email again" }, "useAnotherTwoStepMethod": { "message": "Use another two-step login method" }, + "selectAnotherMethod": { + "message": "Select another method", + "description": "Select another two-step login method" + }, + "useYourRecoveryCode": { + "message": "Use your recovery code" + }, "insertYubiKey": { "message": "Insert your YubiKey into your computer's USB port, then touch its button." }, @@ -918,6 +949,9 @@ "twoStepOptions": { "message": "Two-step login options" }, + "selectTwoStepLoginMethod": { + "message": "Select two-step login method" + }, "selfHostedEnvironment": { "message": "Self-hosted environment" }, @@ -2247,6 +2281,12 @@ "webAuthnAuthenticate": { "message": "Authenticate WebAuthn" }, + "readSecurityKey": { + "message": "Read security key" + }, + "awaitingSecurityKeyInteraction": { + "message": "Awaiting security key interaction..." + }, "hideEmail": { "message": "Hide my email address from recipients." }, @@ -3206,6 +3246,12 @@ "duoRequiredByOrgForAccount": { "message": "Duo two-step login is required for your account." }, + "duoTwoFactorRequiredPageSubtitle": { + "message": "Duo two-step login is required for your account. Follow the steps below to finish logging in." + }, + "followTheStepsBelowToFinishLoggingIn": { + "message": "Follow the steps below to finish logging in." + }, "launchDuo": { "message": "Launch Duo in Browser" }, @@ -3463,9 +3509,27 @@ "sshkeyApprovalTitle": { "message": "Confirm SSH key usage" }, + "agentForwardingWarningTitle": { + "message": "Warning: Agent Forwarding" + }, + "agentForwardingWarningText": { + "message": "This request comes from a remote device that you are logged into" + }, "sshkeyApprovalMessageInfix": { "message": "is requesting access to" }, + "sshkeyApprovalMessageSuffix": { + "message": "in order to" + }, + "sshActionLogin": { + "message": "authenticate to a server" + }, + "sshActionSign": { + "message": "sign a message" + }, + "sshActionGitSign": { + "message": "sign a git commit" + }, "unknownApplication": { "message": "An application" }, diff --git a/apps/desktop/src/locales/da/messages.json b/apps/desktop/src/locales/da/messages.json index 93818506a61..87ff2169d22 100644 --- a/apps/desktop/src/locales/da/messages.json +++ b/apps/desktop/src/locales/da/messages.json @@ -652,6 +652,15 @@ "logInToBitwarden": { "message": "Log ind på Bitwarden" }, + "enterTheCodeSentToYourEmail": { + "message": "Enter the code sent to your email" + }, + "enterTheCodeFromYourAuthenticatorApp": { + "message": "Enter the code from your authenticator app" + }, + "pressYourYubiKeyToAuthenticate": { + "message": "Press your YubiKey to authenticate" + }, "logInWithPasskey": { "message": "Log ind med adgangsnøgle" }, @@ -704,6 +713,15 @@ "masterPassHintLabel": { "message": "Hovedadgangskodetip" }, + "passwordStrengthScore": { + "message": "Password strength score $SCORE$", + "placeholders": { + "score": { + "content": "$1", + "example": "4" + } + } + }, "joinOrganization": { "message": "Bliv medlem af organisation" }, @@ -816,6 +834,9 @@ "webauthnCancelOrTimeout": { "message": "Godkendelsen blev afbrudt eller tog for lang tid. Forsøg igen." }, + "openInNewTab": { + "message": "Open in new tab" + }, "invalidVerificationCode": { "message": "Ugyldig bekræftelseskode" }, @@ -846,12 +867,22 @@ "rememberMe": { "message": "Husk mig" }, + "dontAskAgainOnThisDeviceFor30Days": { + "message": "Don't ask again on this device for 30 days" + }, "sendVerificationCodeEmailAgain": { "message": "Send bekræftelseskodee-mail igen" }, "useAnotherTwoStepMethod": { "message": "Brug en anden totrins-loginmetode" }, + "selectAnotherMethod": { + "message": "Select another method", + "description": "Select another two-step login method" + }, + "useYourRecoveryCode": { + "message": "Use your recovery code" + }, "insertYubiKey": { "message": "Indsæt din YubiKey i din computers USB-port og tryk derefter på dens knap." }, @@ -918,6 +949,9 @@ "twoStepOptions": { "message": "Totrins-login indstillinger" }, + "selectTwoStepLoginMethod": { + "message": "Select two-step login method" + }, "selfHostedEnvironment": { "message": "Selv-hostet miljø" }, @@ -2247,6 +2281,12 @@ "webAuthnAuthenticate": { "message": "Godkend WebAuthn" }, + "readSecurityKey": { + "message": "Read security key" + }, + "awaitingSecurityKeyInteraction": { + "message": "Awaiting security key interaction..." + }, "hideEmail": { "message": "Skjul min e-mailadresse for modtagere." }, @@ -3206,6 +3246,12 @@ "duoRequiredByOrgForAccount": { "message": "Duo totrinsindlogning kræves for kontoen." }, + "duoTwoFactorRequiredPageSubtitle": { + "message": "Duo two-step login is required for your account. Follow the steps below to finish logging in." + }, + "followTheStepsBelowToFinishLoggingIn": { + "message": "Follow the steps below to finish logging in." + }, "launchDuo": { "message": "Start Duo i webbrowser" }, @@ -3463,9 +3509,27 @@ "sshkeyApprovalTitle": { "message": "Bekræft brug af SSH-nøgle" }, + "agentForwardingWarningTitle": { + "message": "Warning: Agent Forwarding" + }, + "agentForwardingWarningText": { + "message": "This request comes from a remote device that you are logged into" + }, "sshkeyApprovalMessageInfix": { "message": "anmoder om adgang til" }, + "sshkeyApprovalMessageSuffix": { + "message": "in order to" + }, + "sshActionLogin": { + "message": "authenticate to a server" + }, + "sshActionSign": { + "message": "sign a message" + }, + "sshActionGitSign": { + "message": "sign a git commit" + }, "unknownApplication": { "message": "En applikation" }, diff --git a/apps/desktop/src/locales/de/messages.json b/apps/desktop/src/locales/de/messages.json index 527a3014637..0faf41ed21f 100644 --- a/apps/desktop/src/locales/de/messages.json +++ b/apps/desktop/src/locales/de/messages.json @@ -652,6 +652,15 @@ "logInToBitwarden": { "message": "Bei Bitwarden anmelden" }, + "enterTheCodeSentToYourEmail": { + "message": "Gib den an deine E-Mail-Adresse gesendeten Code ein" + }, + "enterTheCodeFromYourAuthenticatorApp": { + "message": "Gib den Code aus deiner Authenticator-App ein" + }, + "pressYourYubiKeyToAuthenticate": { + "message": "Drücke zum Authentifizieren auf deinen YubiKey" + }, "logInWithPasskey": { "message": "Mit Passkey anmelden" }, @@ -704,6 +713,15 @@ "masterPassHintLabel": { "message": "Master-Passwort-Hinweis" }, + "passwordStrengthScore": { + "message": "Bewertung der Passwortstärke $SCORE$", + "placeholders": { + "score": { + "content": "$1", + "example": "4" + } + } + }, "joinOrganization": { "message": "Organisation beitreten" }, @@ -816,6 +834,9 @@ "webauthnCancelOrTimeout": { "message": "Die Authentifizierung wurde abgebrochen oder hat zu lange gedauert. Bitte versuche es erneut." }, + "openInNewTab": { + "message": "In neuem Tab öffnen" + }, "invalidVerificationCode": { "message": "Ungültiger Verifizierungscode" }, @@ -846,12 +867,22 @@ "rememberMe": { "message": "Angemeldet bleiben" }, + "dontAskAgainOnThisDeviceFor30Days": { + "message": "Für 30 Tage auf diesem Gerät nicht mehr fragen" + }, "sendVerificationCodeEmailAgain": { "message": "E-Mail mit Bestätigungscode erneut versenden" }, "useAnotherTwoStepMethod": { "message": "Eine andere Zwei-Faktor-Anmeldemethode verwenden" }, + "selectAnotherMethod": { + "message": "Wähle eine andere Methode", + "description": "Select another two-step login method" + }, + "useYourRecoveryCode": { + "message": "Verwende deinen Wiederherstellungscode" + }, "insertYubiKey": { "message": "Stecke deinen YubiKey in einen USB-Anschluss deines Computers, dann berühre den Button." }, @@ -918,6 +949,9 @@ "twoStepOptions": { "message": "Optionen für Zwei-Faktor-Authentifizierung" }, + "selectTwoStepLoginMethod": { + "message": "Zwei-Faktor-Authentifizierungsmethode auswählen" + }, "selfHostedEnvironment": { "message": "Selbst gehostete Umgebung" }, @@ -1776,7 +1810,7 @@ "message": "Passwort oder PIN beim Start der App verlangen" }, "requirePasswordWithoutPinOnStart": { - "message": "Benötigt ein Passwort beim Starten der App" + "message": "Ein Passwort beim Starten der App verlangen" }, "recommendedForSecurity": { "message": "Aus Sicherheitsgründen empfohlen." @@ -2247,6 +2281,12 @@ "webAuthnAuthenticate": { "message": "WebAuthn authentifizieren" }, + "readSecurityKey": { + "message": "Sicherheitsschlüssel auslesen" + }, + "awaitingSecurityKeyInteraction": { + "message": "Warte auf Sicherheitsschlüssel-Interaktion..." + }, "hideEmail": { "message": "Meine E-Mail-Adresse vor den Empfängern ausblenden." }, @@ -3206,6 +3246,12 @@ "duoRequiredByOrgForAccount": { "message": "Für dein Konto ist die DUO Zwei-Faktor-Authentifizierung erforderlich." }, + "duoTwoFactorRequiredPageSubtitle": { + "message": "Die Duo-Zwei-Faktor-Authentifizierung ist für dein Konto erforderlich. Folge den Schritten unten, um die Anmeldung abzuschließen." + }, + "followTheStepsBelowToFinishLoggingIn": { + "message": "Folge den Schritten unten, um die Anmeldung abzuschließen." + }, "launchDuo": { "message": "Duo im Browser starten" }, @@ -3463,9 +3509,27 @@ "sshkeyApprovalTitle": { "message": "Verwendung des SSH-Schlüssels bestätigen" }, + "agentForwardingWarningTitle": { + "message": "Warning: Agent Forwarding" + }, + "agentForwardingWarningText": { + "message": "This request comes from a remote device that you are logged into" + }, "sshkeyApprovalMessageInfix": { "message": "fragt den Zugriff an für" }, + "sshkeyApprovalMessageSuffix": { + "message": "in order to" + }, + "sshActionLogin": { + "message": "authenticate to a server" + }, + "sshActionSign": { + "message": "sign a message" + }, + "sshActionGitSign": { + "message": "sign a git commit" + }, "unknownApplication": { "message": "Eine Anwendung" }, diff --git a/apps/desktop/src/locales/el/messages.json b/apps/desktop/src/locales/el/messages.json index ace7a5ac3bf..d643aabd46f 100644 --- a/apps/desktop/src/locales/el/messages.json +++ b/apps/desktop/src/locales/el/messages.json @@ -652,6 +652,15 @@ "logInToBitwarden": { "message": "Σύνδεση στο Bitwarden" }, + "enterTheCodeSentToYourEmail": { + "message": "Enter the code sent to your email" + }, + "enterTheCodeFromYourAuthenticatorApp": { + "message": "Enter the code from your authenticator app" + }, + "pressYourYubiKeyToAuthenticate": { + "message": "Press your YubiKey to authenticate" + }, "logInWithPasskey": { "message": "Σύνδεση με κλειδί πρόσβασης" }, @@ -704,6 +713,15 @@ "masterPassHintLabel": { "message": "Υπόδειξη κύριου κωδικού πρόσβασης" }, + "passwordStrengthScore": { + "message": "Password strength score $SCORE$", + "placeholders": { + "score": { + "content": "$1", + "example": "4" + } + } + }, "joinOrganization": { "message": "Συμμετοχή σε οργανισμό" }, @@ -816,6 +834,9 @@ "webauthnCancelOrTimeout": { "message": "Η αυθεντικοποίηση ακυρώθηκε ή διήρκησε πολύ ώρα. Παρακαλώ προσπαθήστε ξανά." }, + "openInNewTab": { + "message": "Open in new tab" + }, "invalidVerificationCode": { "message": "Μη έγκυρος κωδικός επαλήθευσης" }, @@ -846,12 +867,22 @@ "rememberMe": { "message": "Να με θυμάσαι" }, + "dontAskAgainOnThisDeviceFor30Days": { + "message": "Don't ask again on this device for 30 days" + }, "sendVerificationCodeEmailAgain": { "message": "Επανάληψη αποστολής κωδικού επαλήθευσης μέσω ηλ. ταχυδρομείου" }, "useAnotherTwoStepMethod": { "message": "Χρήση άλλης μεθόδου σύνδεσης δύο βημάτων" }, + "selectAnotherMethod": { + "message": "Select another method", + "description": "Select another two-step login method" + }, + "useYourRecoveryCode": { + "message": "Use your recovery code" + }, "insertYubiKey": { "message": "Τοποθετήστε το YubiKey στη θύρα USB του υπολογιστή σας και έπειτα αγγίξτε το κουμπί του." }, @@ -918,6 +949,9 @@ "twoStepOptions": { "message": "Επιλογές σύνδεσης δύο βημάτων" }, + "selectTwoStepLoginMethod": { + "message": "Select two-step login method" + }, "selfHostedEnvironment": { "message": "Αυτο-φιλοξενούμενο περιβάλλον" }, @@ -2247,6 +2281,12 @@ "webAuthnAuthenticate": { "message": "Ταυτοποίηση WebAutn" }, + "readSecurityKey": { + "message": "Read security key" + }, + "awaitingSecurityKeyInteraction": { + "message": "Awaiting security key interaction..." + }, "hideEmail": { "message": "Απόκρυψη της διεύθυνσης email μου από τους παραλήπτες." }, @@ -3206,6 +3246,12 @@ "duoRequiredByOrgForAccount": { "message": "Η σύνδεση δύο βημάτων Duo απαιτείται για τον λογαριασμό σας." }, + "duoTwoFactorRequiredPageSubtitle": { + "message": "Duo two-step login is required for your account. Follow the steps below to finish logging in." + }, + "followTheStepsBelowToFinishLoggingIn": { + "message": "Follow the steps below to finish logging in." + }, "launchDuo": { "message": "Εκκίνηση Duo στον περιηγητή" }, @@ -3463,9 +3509,27 @@ "sshkeyApprovalTitle": { "message": "Επιβεβαίωση χρήσης κλειδιού SSH" }, + "agentForwardingWarningTitle": { + "message": "Warning: Agent Forwarding" + }, + "agentForwardingWarningText": { + "message": "This request comes from a remote device that you are logged into" + }, "sshkeyApprovalMessageInfix": { "message": "ζητά πρόσβαση σε" }, + "sshkeyApprovalMessageSuffix": { + "message": "in order to" + }, + "sshActionLogin": { + "message": "authenticate to a server" + }, + "sshActionSign": { + "message": "sign a message" + }, + "sshActionGitSign": { + "message": "sign a git commit" + }, "unknownApplication": { "message": "Μια εφαρμογή" }, diff --git a/apps/desktop/src/locales/en/messages.json b/apps/desktop/src/locales/en/messages.json index ed55c5fb070..726b5c4b316 100644 --- a/apps/desktop/src/locales/en/messages.json +++ b/apps/desktop/src/locales/en/messages.json @@ -3509,9 +3509,27 @@ "sshkeyApprovalTitle": { "message": "Confirm SSH key usage" }, + "agentForwardingWarningTitle": { + "message": "Warning: Agent Forwarding" + }, + "agentForwardingWarningText": { + "message": "This request comes from a remote device that you are logged into" + }, "sshkeyApprovalMessageInfix": { "message": "is requesting access to" }, + "sshkeyApprovalMessageSuffix": { + "message": "in order to" + }, + "sshActionLogin": { + "message": "authenticate to a server" + }, + "sshActionSign": { + "message": "sign a message" + }, + "sshActionGitSign": { + "message": "sign a git commit" + }, "unknownApplication": { "message": "An application" }, diff --git a/apps/desktop/src/locales/en_GB/messages.json b/apps/desktop/src/locales/en_GB/messages.json index 46140d7408d..6546edc5411 100644 --- a/apps/desktop/src/locales/en_GB/messages.json +++ b/apps/desktop/src/locales/en_GB/messages.json @@ -652,6 +652,15 @@ "logInToBitwarden": { "message": "Log in to Bitwarden" }, + "enterTheCodeSentToYourEmail": { + "message": "Enter the code sent to your email" + }, + "enterTheCodeFromYourAuthenticatorApp": { + "message": "Enter the code from your authenticator app" + }, + "pressYourYubiKeyToAuthenticate": { + "message": "Press your YubiKey to authenticate" + }, "logInWithPasskey": { "message": "Log in with passkey" }, @@ -704,6 +713,15 @@ "masterPassHintLabel": { "message": "Master password hint" }, + "passwordStrengthScore": { + "message": "Password strength score $SCORE$", + "placeholders": { + "score": { + "content": "$1", + "example": "4" + } + } + }, "joinOrganization": { "message": "Join organisation" }, @@ -816,6 +834,9 @@ "webauthnCancelOrTimeout": { "message": "The authentication was cancelled or took too long. Please try again." }, + "openInNewTab": { + "message": "Open in new tab" + }, "invalidVerificationCode": { "message": "Invalid verification code" }, @@ -846,12 +867,22 @@ "rememberMe": { "message": "Remember me" }, + "dontAskAgainOnThisDeviceFor30Days": { + "message": "Don't ask again on this device for 30 days" + }, "sendVerificationCodeEmailAgain": { "message": "Send verification code email again" }, "useAnotherTwoStepMethod": { "message": "Use another two-step login method" }, + "selectAnotherMethod": { + "message": "Select another method", + "description": "Select another two-step login method" + }, + "useYourRecoveryCode": { + "message": "Use your recovery code" + }, "insertYubiKey": { "message": "Insert your YubiKey into your computer's USB port, then touch its button." }, @@ -918,6 +949,9 @@ "twoStepOptions": { "message": "Two-step login options" }, + "selectTwoStepLoginMethod": { + "message": "Select two-step login method" + }, "selfHostedEnvironment": { "message": "Self-hosted environment" }, @@ -2247,6 +2281,12 @@ "webAuthnAuthenticate": { "message": "Authenticate WebAuthn" }, + "readSecurityKey": { + "message": "Read security key" + }, + "awaitingSecurityKeyInteraction": { + "message": "Awaiting security key interaction..." + }, "hideEmail": { "message": "Hide my email address from recipients." }, @@ -3206,6 +3246,12 @@ "duoRequiredByOrgForAccount": { "message": "Duo two-step login is required for your account." }, + "duoTwoFactorRequiredPageSubtitle": { + "message": "Duo two-step login is required for your account. Follow the steps below to finish logging in." + }, + "followTheStepsBelowToFinishLoggingIn": { + "message": "Follow the steps below to finish logging in." + }, "launchDuo": { "message": "Launch Duo in Browser" }, @@ -3463,9 +3509,27 @@ "sshkeyApprovalTitle": { "message": "Confirm SSH key usage" }, + "agentForwardingWarningTitle": { + "message": "Warning: Agent Forwarding" + }, + "agentForwardingWarningText": { + "message": "This request comes from a remote device that you are logged into" + }, "sshkeyApprovalMessageInfix": { "message": "is requesting access to" }, + "sshkeyApprovalMessageSuffix": { + "message": "in order to" + }, + "sshActionLogin": { + "message": "authenticate to a server" + }, + "sshActionSign": { + "message": "sign a message" + }, + "sshActionGitSign": { + "message": "sign a git commit" + }, "unknownApplication": { "message": "An application" }, diff --git a/apps/desktop/src/locales/en_IN/messages.json b/apps/desktop/src/locales/en_IN/messages.json index 451e9f3fb45..e8945cd520f 100644 --- a/apps/desktop/src/locales/en_IN/messages.json +++ b/apps/desktop/src/locales/en_IN/messages.json @@ -652,6 +652,15 @@ "logInToBitwarden": { "message": "Log in to Bitwarden" }, + "enterTheCodeSentToYourEmail": { + "message": "Enter the code sent to your email" + }, + "enterTheCodeFromYourAuthenticatorApp": { + "message": "Enter the code from your authenticator app" + }, + "pressYourYubiKeyToAuthenticate": { + "message": "Press your YubiKey to authenticate" + }, "logInWithPasskey": { "message": "Log in with passkey" }, @@ -704,6 +713,15 @@ "masterPassHintLabel": { "message": "Master password hint" }, + "passwordStrengthScore": { + "message": "Password strength score $SCORE$", + "placeholders": { + "score": { + "content": "$1", + "example": "4" + } + } + }, "joinOrganization": { "message": "Join organisation" }, @@ -816,6 +834,9 @@ "webauthnCancelOrTimeout": { "message": "The authentication was cancelled or took too long. Please try again." }, + "openInNewTab": { + "message": "Open in new tab" + }, "invalidVerificationCode": { "message": "Invalid verification code" }, @@ -846,12 +867,22 @@ "rememberMe": { "message": "Remember me" }, + "dontAskAgainOnThisDeviceFor30Days": { + "message": "Don't ask again on this device for 30 days" + }, "sendVerificationCodeEmailAgain": { "message": "Send verification code email again" }, "useAnotherTwoStepMethod": { "message": "Use another two-step login method" }, + "selectAnotherMethod": { + "message": "Select another method", + "description": "Select another two-step login method" + }, + "useYourRecoveryCode": { + "message": "Use your recovery code" + }, "insertYubiKey": { "message": "Insert your YubiKey into your computer's USB port, then touch its button." }, @@ -918,6 +949,9 @@ "twoStepOptions": { "message": "Two-step login options" }, + "selectTwoStepLoginMethod": { + "message": "Select two-step login method" + }, "selfHostedEnvironment": { "message": "Self-hosted environment" }, @@ -2247,6 +2281,12 @@ "webAuthnAuthenticate": { "message": "Authenticate WebAuthn" }, + "readSecurityKey": { + "message": "Read security key" + }, + "awaitingSecurityKeyInteraction": { + "message": "Awaiting security key interaction..." + }, "hideEmail": { "message": "Hide my email address from recepients." }, @@ -3206,6 +3246,12 @@ "duoRequiredByOrgForAccount": { "message": "Duo two-step login is required for your account." }, + "duoTwoFactorRequiredPageSubtitle": { + "message": "Duo two-step login is required for your account. Follow the steps below to finish logging in." + }, + "followTheStepsBelowToFinishLoggingIn": { + "message": "Follow the steps below to finish logging in." + }, "launchDuo": { "message": "Launch Duo in Browser" }, @@ -3463,9 +3509,27 @@ "sshkeyApprovalTitle": { "message": "Confirm SSH key usage" }, + "agentForwardingWarningTitle": { + "message": "Warning: Agent Forwarding" + }, + "agentForwardingWarningText": { + "message": "This request comes from a remote device that you are logged into" + }, "sshkeyApprovalMessageInfix": { "message": "is requesting access to" }, + "sshkeyApprovalMessageSuffix": { + "message": "in order to" + }, + "sshActionLogin": { + "message": "authenticate to a server" + }, + "sshActionSign": { + "message": "sign a message" + }, + "sshActionGitSign": { + "message": "sign a git commit" + }, "unknownApplication": { "message": "An application" }, diff --git a/apps/desktop/src/locales/eo/messages.json b/apps/desktop/src/locales/eo/messages.json index 8861198efba..1ce0e698967 100644 --- a/apps/desktop/src/locales/eo/messages.json +++ b/apps/desktop/src/locales/eo/messages.json @@ -652,6 +652,15 @@ "logInToBitwarden": { "message": "Log in to Bitwarden" }, + "enterTheCodeSentToYourEmail": { + "message": "Enter the code sent to your email" + }, + "enterTheCodeFromYourAuthenticatorApp": { + "message": "Enter the code from your authenticator app" + }, + "pressYourYubiKeyToAuthenticate": { + "message": "Press your YubiKey to authenticate" + }, "logInWithPasskey": { "message": "Log in with passkey" }, @@ -704,6 +713,15 @@ "masterPassHintLabel": { "message": "Master password hint" }, + "passwordStrengthScore": { + "message": "Password strength score $SCORE$", + "placeholders": { + "score": { + "content": "$1", + "example": "4" + } + } + }, "joinOrganization": { "message": "Join organization" }, @@ -816,6 +834,9 @@ "webauthnCancelOrTimeout": { "message": "The authentication was cancelled or took too long. Please try again." }, + "openInNewTab": { + "message": "Open in new tab" + }, "invalidVerificationCode": { "message": "Invalid verification code" }, @@ -846,12 +867,22 @@ "rememberMe": { "message": "Remember me" }, + "dontAskAgainOnThisDeviceFor30Days": { + "message": "Don't ask again on this device for 30 days" + }, "sendVerificationCodeEmailAgain": { "message": "Send verification code email again" }, "useAnotherTwoStepMethod": { "message": "Use another two-step login method" }, + "selectAnotherMethod": { + "message": "Select another method", + "description": "Select another two-step login method" + }, + "useYourRecoveryCode": { + "message": "Use your recovery code" + }, "insertYubiKey": { "message": "Insert your YubiKey into your computer's USB port, then touch its button." }, @@ -918,6 +949,9 @@ "twoStepOptions": { "message": "Two-step login options" }, + "selectTwoStepLoginMethod": { + "message": "Select two-step login method" + }, "selfHostedEnvironment": { "message": "Self-hosted environment" }, @@ -2247,6 +2281,12 @@ "webAuthnAuthenticate": { "message": "Authenticate WebAuthn" }, + "readSecurityKey": { + "message": "Read security key" + }, + "awaitingSecurityKeyInteraction": { + "message": "Awaiting security key interaction..." + }, "hideEmail": { "message": "Hide my email address from recipients." }, @@ -3206,6 +3246,12 @@ "duoRequiredByOrgForAccount": { "message": "Duo two-step login is required for your account." }, + "duoTwoFactorRequiredPageSubtitle": { + "message": "Duo two-step login is required for your account. Follow the steps below to finish logging in." + }, + "followTheStepsBelowToFinishLoggingIn": { + "message": "Follow the steps below to finish logging in." + }, "launchDuo": { "message": "Launch Duo in Browser" }, @@ -3463,9 +3509,27 @@ "sshkeyApprovalTitle": { "message": "Confirm SSH key usage" }, + "agentForwardingWarningTitle": { + "message": "Warning: Agent Forwarding" + }, + "agentForwardingWarningText": { + "message": "This request comes from a remote device that you are logged into" + }, "sshkeyApprovalMessageInfix": { "message": "is requesting access to" }, + "sshkeyApprovalMessageSuffix": { + "message": "in order to" + }, + "sshActionLogin": { + "message": "authenticate to a server" + }, + "sshActionSign": { + "message": "sign a message" + }, + "sshActionGitSign": { + "message": "sign a git commit" + }, "unknownApplication": { "message": "An application" }, diff --git a/apps/desktop/src/locales/es/messages.json b/apps/desktop/src/locales/es/messages.json index 493c2594791..9f232b521dc 100644 --- a/apps/desktop/src/locales/es/messages.json +++ b/apps/desktop/src/locales/es/messages.json @@ -652,6 +652,15 @@ "logInToBitwarden": { "message": "Log in to Bitwarden" }, + "enterTheCodeSentToYourEmail": { + "message": "Enter the code sent to your email" + }, + "enterTheCodeFromYourAuthenticatorApp": { + "message": "Enter the code from your authenticator app" + }, + "pressYourYubiKeyToAuthenticate": { + "message": "Press your YubiKey to authenticate" + }, "logInWithPasskey": { "message": "Log in with passkey" }, @@ -704,6 +713,15 @@ "masterPassHintLabel": { "message": "Pista de la contraseña maestra" }, + "passwordStrengthScore": { + "message": "Password strength score $SCORE$", + "placeholders": { + "score": { + "content": "$1", + "example": "4" + } + } + }, "joinOrganization": { "message": "Unirse a organización" }, @@ -816,6 +834,9 @@ "webauthnCancelOrTimeout": { "message": "La autenticación fue cancelada o tardó demasiado. Por favor, inténtalo de nuevo." }, + "openInNewTab": { + "message": "Open in new tab" + }, "invalidVerificationCode": { "message": "Código de verificación incorrecto" }, @@ -846,12 +867,22 @@ "rememberMe": { "message": "Recordarme" }, + "dontAskAgainOnThisDeviceFor30Days": { + "message": "Don't ask again on this device for 30 days" + }, "sendVerificationCodeEmailAgain": { "message": "Reenviar código de verificación por correo electrónico" }, "useAnotherTwoStepMethod": { "message": "Utilizar otro método de autenticación en dos pasos" }, + "selectAnotherMethod": { + "message": "Select another method", + "description": "Select another two-step login method" + }, + "useYourRecoveryCode": { + "message": "Use your recovery code" + }, "insertYubiKey": { "message": "Inserta tu YubiKey en el puerto USB de tu equipo y posteriormente pulsa su botón." }, @@ -918,6 +949,9 @@ "twoStepOptions": { "message": "Opciones de la autenticación en dos pasos" }, + "selectTwoStepLoginMethod": { + "message": "Select two-step login method" + }, "selfHostedEnvironment": { "message": "Entorno de alojamiento propio" }, @@ -2247,6 +2281,12 @@ "webAuthnAuthenticate": { "message": "Autenticar WebAuthn" }, + "readSecurityKey": { + "message": "Read security key" + }, + "awaitingSecurityKeyInteraction": { + "message": "Awaiting security key interaction..." + }, "hideEmail": { "message": "Ocultar mi dirección de correo electrónico a los destinatarios." }, @@ -3206,6 +3246,12 @@ "duoRequiredByOrgForAccount": { "message": "Se requiere el inicio de sesión en dos pasos de Duo para tu cuenta." }, + "duoTwoFactorRequiredPageSubtitle": { + "message": "Duo two-step login is required for your account. Follow the steps below to finish logging in." + }, + "followTheStepsBelowToFinishLoggingIn": { + "message": "Follow the steps below to finish logging in." + }, "launchDuo": { "message": "Inicia Duo en el navegador" }, @@ -3463,9 +3509,27 @@ "sshkeyApprovalTitle": { "message": "Confirm SSH key usage" }, + "agentForwardingWarningTitle": { + "message": "Warning: Agent Forwarding" + }, + "agentForwardingWarningText": { + "message": "This request comes from a remote device that you are logged into" + }, "sshkeyApprovalMessageInfix": { "message": "is requesting access to" }, + "sshkeyApprovalMessageSuffix": { + "message": "in order to" + }, + "sshActionLogin": { + "message": "authenticate to a server" + }, + "sshActionSign": { + "message": "sign a message" + }, + "sshActionGitSign": { + "message": "sign a git commit" + }, "unknownApplication": { "message": "An application" }, diff --git a/apps/desktop/src/locales/et/messages.json b/apps/desktop/src/locales/et/messages.json index 3d4edad99d1..76be013c4ef 100644 --- a/apps/desktop/src/locales/et/messages.json +++ b/apps/desktop/src/locales/et/messages.json @@ -652,6 +652,15 @@ "logInToBitwarden": { "message": "Log in to Bitwarden" }, + "enterTheCodeSentToYourEmail": { + "message": "Enter the code sent to your email" + }, + "enterTheCodeFromYourAuthenticatorApp": { + "message": "Enter the code from your authenticator app" + }, + "pressYourYubiKeyToAuthenticate": { + "message": "Press your YubiKey to authenticate" + }, "logInWithPasskey": { "message": "Log in with passkey" }, @@ -704,6 +713,15 @@ "masterPassHintLabel": { "message": "Ülemparooli vihje" }, + "passwordStrengthScore": { + "message": "Password strength score $SCORE$", + "placeholders": { + "score": { + "content": "$1", + "example": "4" + } + } + }, "joinOrganization": { "message": "Liitu organisatsiooniga" }, @@ -816,6 +834,9 @@ "webauthnCancelOrTimeout": { "message": "Autentimine tühistati või kestis liiga kaua aega. Palun proovi uuesti." }, + "openInNewTab": { + "message": "Open in new tab" + }, "invalidVerificationCode": { "message": "Vale kinnituskood" }, @@ -846,12 +867,22 @@ "rememberMe": { "message": "Jäta mind meelde" }, + "dontAskAgainOnThisDeviceFor30Days": { + "message": "Don't ask again on this device for 30 days" + }, "sendVerificationCodeEmailAgain": { "message": "Saada kinnituskood uuesti e-postile" }, "useAnotherTwoStepMethod": { "message": "Kasuta teist kaheastmelist sisselogimise meetodit" }, + "selectAnotherMethod": { + "message": "Select another method", + "description": "Select another two-step login method" + }, + "useYourRecoveryCode": { + "message": "Use your recovery code" + }, "insertYubiKey": { "message": "Sisesta oma YubiKey arvuti USB porti ja kliki sellele nupule." }, @@ -918,6 +949,9 @@ "twoStepOptions": { "message": "Kaheastmelise sisselogimise valikud" }, + "selectTwoStepLoginMethod": { + "message": "Select two-step login method" + }, "selfHostedEnvironment": { "message": "Self-hosted Environment" }, @@ -2247,6 +2281,12 @@ "webAuthnAuthenticate": { "message": "WebAuthn kinnitamine" }, + "readSecurityKey": { + "message": "Read security key" + }, + "awaitingSecurityKeyInteraction": { + "message": "Awaiting security key interaction..." + }, "hideEmail": { "message": "Ära näita saajatele minu e-posti aadressi." }, @@ -3206,6 +3246,12 @@ "duoRequiredByOrgForAccount": { "message": "Duo kahe-astmeline sisselogimine on sinu kontol nõutud." }, + "duoTwoFactorRequiredPageSubtitle": { + "message": "Duo two-step login is required for your account. Follow the steps below to finish logging in." + }, + "followTheStepsBelowToFinishLoggingIn": { + "message": "Follow the steps below to finish logging in." + }, "launchDuo": { "message": "Käivita Duo brauseris" }, @@ -3463,9 +3509,27 @@ "sshkeyApprovalTitle": { "message": "Confirm SSH key usage" }, + "agentForwardingWarningTitle": { + "message": "Warning: Agent Forwarding" + }, + "agentForwardingWarningText": { + "message": "This request comes from a remote device that you are logged into" + }, "sshkeyApprovalMessageInfix": { "message": "is requesting access to" }, + "sshkeyApprovalMessageSuffix": { + "message": "in order to" + }, + "sshActionLogin": { + "message": "authenticate to a server" + }, + "sshActionSign": { + "message": "sign a message" + }, + "sshActionGitSign": { + "message": "sign a git commit" + }, "unknownApplication": { "message": "An application" }, diff --git a/apps/desktop/src/locales/eu/messages.json b/apps/desktop/src/locales/eu/messages.json index 114bf241513..3261db98090 100644 --- a/apps/desktop/src/locales/eu/messages.json +++ b/apps/desktop/src/locales/eu/messages.json @@ -652,6 +652,15 @@ "logInToBitwarden": { "message": "Log in to Bitwarden" }, + "enterTheCodeSentToYourEmail": { + "message": "Enter the code sent to your email" + }, + "enterTheCodeFromYourAuthenticatorApp": { + "message": "Enter the code from your authenticator app" + }, + "pressYourYubiKeyToAuthenticate": { + "message": "Press your YubiKey to authenticate" + }, "logInWithPasskey": { "message": "Log in with passkey" }, @@ -704,6 +713,15 @@ "masterPassHintLabel": { "message": "Master password hint" }, + "passwordStrengthScore": { + "message": "Password strength score $SCORE$", + "placeholders": { + "score": { + "content": "$1", + "example": "4" + } + } + }, "joinOrganization": { "message": "Join organization" }, @@ -816,6 +834,9 @@ "webauthnCancelOrTimeout": { "message": "The authentication was cancelled or took too long. Please try again." }, + "openInNewTab": { + "message": "Open in new tab" + }, "invalidVerificationCode": { "message": "Egiaztatze-kodea ez da baliozkoa" }, @@ -846,12 +867,22 @@ "rememberMe": { "message": "Gogora nazazu" }, + "dontAskAgainOnThisDeviceFor30Days": { + "message": "Don't ask again on this device for 30 days" + }, "sendVerificationCodeEmailAgain": { "message": "Berbidali email bidezko egiaztatze-kodea" }, "useAnotherTwoStepMethod": { "message": "Erabili bi urratseko saio hasierarako beste modu bat" }, + "selectAnotherMethod": { + "message": "Select another method", + "description": "Select another two-step login method" + }, + "useYourRecoveryCode": { + "message": "Use your recovery code" + }, "insertYubiKey": { "message": "Sartu zure YubiKey-a ordenagailuko USB atakan, ondoren, sakatu bere botoia." }, @@ -918,6 +949,9 @@ "twoStepOptions": { "message": "Bi urratseko saio hasieraren aukerak" }, + "selectTwoStepLoginMethod": { + "message": "Select two-step login method" + }, "selfHostedEnvironment": { "message": "Ostatze ingurune propioa" }, @@ -2247,6 +2281,12 @@ "webAuthnAuthenticate": { "message": "WebAuthn autentifikatu" }, + "readSecurityKey": { + "message": "Read security key" + }, + "awaitingSecurityKeyInteraction": { + "message": "Awaiting security key interaction..." + }, "hideEmail": { "message": "Ezkutatu nire emaila hartzaileei." }, @@ -3206,6 +3246,12 @@ "duoRequiredByOrgForAccount": { "message": "Duo two-step login is required for your account." }, + "duoTwoFactorRequiredPageSubtitle": { + "message": "Duo two-step login is required for your account. Follow the steps below to finish logging in." + }, + "followTheStepsBelowToFinishLoggingIn": { + "message": "Follow the steps below to finish logging in." + }, "launchDuo": { "message": "Launch Duo in Browser" }, @@ -3463,9 +3509,27 @@ "sshkeyApprovalTitle": { "message": "Confirm SSH key usage" }, + "agentForwardingWarningTitle": { + "message": "Warning: Agent Forwarding" + }, + "agentForwardingWarningText": { + "message": "This request comes from a remote device that you are logged into" + }, "sshkeyApprovalMessageInfix": { "message": "is requesting access to" }, + "sshkeyApprovalMessageSuffix": { + "message": "in order to" + }, + "sshActionLogin": { + "message": "authenticate to a server" + }, + "sshActionSign": { + "message": "sign a message" + }, + "sshActionGitSign": { + "message": "sign a git commit" + }, "unknownApplication": { "message": "An application" }, diff --git a/apps/desktop/src/locales/fa/messages.json b/apps/desktop/src/locales/fa/messages.json index 65b152bfa5d..fe6e5ba3337 100644 --- a/apps/desktop/src/locales/fa/messages.json +++ b/apps/desktop/src/locales/fa/messages.json @@ -652,6 +652,15 @@ "logInToBitwarden": { "message": "Log in to Bitwarden" }, + "enterTheCodeSentToYourEmail": { + "message": "Enter the code sent to your email" + }, + "enterTheCodeFromYourAuthenticatorApp": { + "message": "Enter the code from your authenticator app" + }, + "pressYourYubiKeyToAuthenticate": { + "message": "Press your YubiKey to authenticate" + }, "logInWithPasskey": { "message": "Log in with passkey" }, @@ -704,6 +713,15 @@ "masterPassHintLabel": { "message": "Master password hint" }, + "passwordStrengthScore": { + "message": "Password strength score $SCORE$", + "placeholders": { + "score": { + "content": "$1", + "example": "4" + } + } + }, "joinOrganization": { "message": "Join organization" }, @@ -816,6 +834,9 @@ "webauthnCancelOrTimeout": { "message": "The authentication was cancelled or took too long. Please try again." }, + "openInNewTab": { + "message": "Open in new tab" + }, "invalidVerificationCode": { "message": "کد تأیید نامعتبر است" }, @@ -846,12 +867,22 @@ "rememberMe": { "message": "مرا به خاطر بسپار" }, + "dontAskAgainOnThisDeviceFor30Days": { + "message": "Don't ask again on this device for 30 days" + }, "sendVerificationCodeEmailAgain": { "message": "ارسال دوباره ایمیل کد تأیید" }, "useAnotherTwoStepMethod": { "message": "استفاده از روش ورود دو مرحله‌ای دیگر" }, + "selectAnotherMethod": { + "message": "Select another method", + "description": "Select another two-step login method" + }, + "useYourRecoveryCode": { + "message": "Use your recovery code" + }, "insertYubiKey": { "message": "YubiKey خود را وارد پورت USB رایانه کنید، بعد دکمه آن را بفشارید." }, @@ -918,6 +949,9 @@ "twoStepOptions": { "message": "گزینه‌های ورود دو مرحله‌ای" }, + "selectTwoStepLoginMethod": { + "message": "Select two-step login method" + }, "selfHostedEnvironment": { "message": "محیط خود میزبان" }, @@ -2247,6 +2281,12 @@ "webAuthnAuthenticate": { "message": "تأیید اعتبار در WebAuthn" }, + "readSecurityKey": { + "message": "Read security key" + }, + "awaitingSecurityKeyInteraction": { + "message": "Awaiting security key interaction..." + }, "hideEmail": { "message": "نشانی ایمیلم را از گیرندگان مخفی کن." }, @@ -3206,6 +3246,12 @@ "duoRequiredByOrgForAccount": { "message": "Duo two-step login is required for your account." }, + "duoTwoFactorRequiredPageSubtitle": { + "message": "Duo two-step login is required for your account. Follow the steps below to finish logging in." + }, + "followTheStepsBelowToFinishLoggingIn": { + "message": "Follow the steps below to finish logging in." + }, "launchDuo": { "message": "Launch Duo in Browser" }, @@ -3463,9 +3509,27 @@ "sshkeyApprovalTitle": { "message": "Confirm SSH key usage" }, + "agentForwardingWarningTitle": { + "message": "Warning: Agent Forwarding" + }, + "agentForwardingWarningText": { + "message": "This request comes from a remote device that you are logged into" + }, "sshkeyApprovalMessageInfix": { "message": "is requesting access to" }, + "sshkeyApprovalMessageSuffix": { + "message": "in order to" + }, + "sshActionLogin": { + "message": "authenticate to a server" + }, + "sshActionSign": { + "message": "sign a message" + }, + "sshActionGitSign": { + "message": "sign a git commit" + }, "unknownApplication": { "message": "An application" }, diff --git a/apps/desktop/src/locales/fi/messages.json b/apps/desktop/src/locales/fi/messages.json index 139bd5a1d78..2e77d0fbc1b 100644 --- a/apps/desktop/src/locales/fi/messages.json +++ b/apps/desktop/src/locales/fi/messages.json @@ -652,6 +652,15 @@ "logInToBitwarden": { "message": "Kirjaudu Bitwardeniin" }, + "enterTheCodeSentToYourEmail": { + "message": "Syötä sähköpostitse vastaanottamasi koodi" + }, + "enterTheCodeFromYourAuthenticatorApp": { + "message": "Syötä todennussovelluksesi näyttämä koodi" + }, + "pressYourYubiKeyToAuthenticate": { + "message": "Tunnistaudu painamalla YubiKeytäsi" + }, "logInWithPasskey": { "message": "Kirjaudu pääsyavaimella" }, @@ -704,6 +713,15 @@ "masterPassHintLabel": { "message": "Pääsalasanan vihje" }, + "passwordStrengthScore": { + "message": "Password strength score $SCORE$", + "placeholders": { + "score": { + "content": "$1", + "example": "4" + } + } + }, "joinOrganization": { "message": "Liity organisaatioon" }, @@ -816,6 +834,9 @@ "webauthnCancelOrTimeout": { "message": "Tunnistautuminen peruttiin tai se kesti liian kauan. Yritä uudelleen." }, + "openInNewTab": { + "message": "Avaa uudessa välilehdessä" + }, "invalidVerificationCode": { "message": "Virheellinen todennuskoodi" }, @@ -846,12 +867,22 @@ "rememberMe": { "message": "Muista minut" }, + "dontAskAgainOnThisDeviceFor30Days": { + "message": "Don't ask again on this device for 30 days" + }, "sendVerificationCodeEmailAgain": { "message": "Lähetä todennuskoodi sähköpostitse uudelleen" }, "useAnotherTwoStepMethod": { "message": "Käytä vaihtoehtoista todennustapaa" }, + "selectAnotherMethod": { + "message": "Select another method", + "description": "Select another two-step login method" + }, + "useYourRecoveryCode": { + "message": "Use your recovery code" + }, "insertYubiKey": { "message": "Kytke YubiKey-todennuslaitteesi tietokoneen USB-porttiin ja paina sen painiketta." }, @@ -918,6 +949,9 @@ "twoStepOptions": { "message": "Kaksivaiheisen kirjautumisen asetukset" }, + "selectTwoStepLoginMethod": { + "message": "Select two-step login method" + }, "selfHostedEnvironment": { "message": "Itse ylläpidetty palvelinympäristö" }, @@ -2247,6 +2281,12 @@ "webAuthnAuthenticate": { "message": "WebAuthn-todennus" }, + "readSecurityKey": { + "message": "Read security key" + }, + "awaitingSecurityKeyInteraction": { + "message": "Awaiting security key interaction..." + }, "hideEmail": { "message": "Piilota sähköpostiosoitteeni vastaanottajilta." }, @@ -3206,6 +3246,12 @@ "duoRequiredByOrgForAccount": { "message": "Tilillesi kirjautuminen vaatii Duo-vahvistuksen." }, + "duoTwoFactorRequiredPageSubtitle": { + "message": "Duo two-step login is required for your account. Follow the steps below to finish logging in." + }, + "followTheStepsBelowToFinishLoggingIn": { + "message": "Follow the steps below to finish logging in." + }, "launchDuo": { "message": "Avaa Duo verkkoselaimessa" }, @@ -3463,9 +3509,27 @@ "sshkeyApprovalTitle": { "message": "Vahvista SSH-avainkäyttö" }, + "agentForwardingWarningTitle": { + "message": "Warning: Agent Forwarding" + }, + "agentForwardingWarningText": { + "message": "This request comes from a remote device that you are logged into" + }, "sshkeyApprovalMessageInfix": { "message": "pyytää pääsyä" }, + "sshkeyApprovalMessageSuffix": { + "message": "in order to" + }, + "sshActionLogin": { + "message": "authenticate to a server" + }, + "sshActionSign": { + "message": "sign a message" + }, + "sshActionGitSign": { + "message": "sign a git commit" + }, "unknownApplication": { "message": "Sovellus" }, diff --git a/apps/desktop/src/locales/fil/messages.json b/apps/desktop/src/locales/fil/messages.json index 9842b419522..81d4566966e 100644 --- a/apps/desktop/src/locales/fil/messages.json +++ b/apps/desktop/src/locales/fil/messages.json @@ -652,6 +652,15 @@ "logInToBitwarden": { "message": "Log in to Bitwarden" }, + "enterTheCodeSentToYourEmail": { + "message": "Enter the code sent to your email" + }, + "enterTheCodeFromYourAuthenticatorApp": { + "message": "Enter the code from your authenticator app" + }, + "pressYourYubiKeyToAuthenticate": { + "message": "Press your YubiKey to authenticate" + }, "logInWithPasskey": { "message": "Log in with passkey" }, @@ -704,6 +713,15 @@ "masterPassHintLabel": { "message": "Master password hint" }, + "passwordStrengthScore": { + "message": "Password strength score $SCORE$", + "placeholders": { + "score": { + "content": "$1", + "example": "4" + } + } + }, "joinOrganization": { "message": "Join organization" }, @@ -816,6 +834,9 @@ "webauthnCancelOrTimeout": { "message": "The authentication was cancelled or took too long. Please try again." }, + "openInNewTab": { + "message": "Open in new tab" + }, "invalidVerificationCode": { "message": "Maling verification code" }, @@ -846,12 +867,22 @@ "rememberMe": { "message": "Tandaan mo ako" }, + "dontAskAgainOnThisDeviceFor30Days": { + "message": "Don't ask again on this device for 30 days" + }, "sendVerificationCodeEmailAgain": { "message": "Ipadala muli ang email ng verification code" }, "useAnotherTwoStepMethod": { "message": "Gamitin ang isa pang two-step na paraan ng pag-login" }, + "selectAnotherMethod": { + "message": "Select another method", + "description": "Select another two-step login method" + }, + "useYourRecoveryCode": { + "message": "Use your recovery code" + }, "insertYubiKey": { "message": "Ipasok ang iyong YubiKey sa USB port ng iyong computer, pagkatapos ay hawakan ang pindutan nito." }, @@ -918,6 +949,9 @@ "twoStepOptions": { "message": "Mga pagpipilian para sa two-step login" }, + "selectTwoStepLoginMethod": { + "message": "Select two-step login method" + }, "selfHostedEnvironment": { "message": "Kapaligirang self-hosted" }, @@ -2247,6 +2281,12 @@ "webAuthnAuthenticate": { "message": "I-authenticate ang WebAuthn" }, + "readSecurityKey": { + "message": "Read security key" + }, + "awaitingSecurityKeyInteraction": { + "message": "Awaiting security key interaction..." + }, "hideEmail": { "message": "Itago ang aking email address mula sa mga tatanggap." }, @@ -3206,6 +3246,12 @@ "duoRequiredByOrgForAccount": { "message": "Duo two-step login is required for your account." }, + "duoTwoFactorRequiredPageSubtitle": { + "message": "Duo two-step login is required for your account. Follow the steps below to finish logging in." + }, + "followTheStepsBelowToFinishLoggingIn": { + "message": "Follow the steps below to finish logging in." + }, "launchDuo": { "message": "Launch Duo in Browser" }, @@ -3463,9 +3509,27 @@ "sshkeyApprovalTitle": { "message": "Confirm SSH key usage" }, + "agentForwardingWarningTitle": { + "message": "Warning: Agent Forwarding" + }, + "agentForwardingWarningText": { + "message": "This request comes from a remote device that you are logged into" + }, "sshkeyApprovalMessageInfix": { "message": "is requesting access to" }, + "sshkeyApprovalMessageSuffix": { + "message": "in order to" + }, + "sshActionLogin": { + "message": "authenticate to a server" + }, + "sshActionSign": { + "message": "sign a message" + }, + "sshActionGitSign": { + "message": "sign a git commit" + }, "unknownApplication": { "message": "An application" }, diff --git a/apps/desktop/src/locales/fr/messages.json b/apps/desktop/src/locales/fr/messages.json index f308c3fbd69..2c7a6623279 100644 --- a/apps/desktop/src/locales/fr/messages.json +++ b/apps/desktop/src/locales/fr/messages.json @@ -652,6 +652,15 @@ "logInToBitwarden": { "message": "Se connecter à Bitwarden" }, + "enterTheCodeSentToYourEmail": { + "message": "Enter the code sent to your email" + }, + "enterTheCodeFromYourAuthenticatorApp": { + "message": "Enter the code from your authenticator app" + }, + "pressYourYubiKeyToAuthenticate": { + "message": "Press your YubiKey to authenticate" + }, "logInWithPasskey": { "message": "Se connecter avec une clé d'accès" }, @@ -704,6 +713,15 @@ "masterPassHintLabel": { "message": "Indice du mot de passe principal" }, + "passwordStrengthScore": { + "message": "Password strength score $SCORE$", + "placeholders": { + "score": { + "content": "$1", + "example": "4" + } + } + }, "joinOrganization": { "message": "Rejoindre l'organisation" }, @@ -816,6 +834,9 @@ "webauthnCancelOrTimeout": { "message": "L'authentification a été annulée ou a pris trop de temps. Veuillez réessayer." }, + "openInNewTab": { + "message": "Open in new tab" + }, "invalidVerificationCode": { "message": "Code de vérification invalide" }, @@ -846,12 +867,22 @@ "rememberMe": { "message": "Rester connecté" }, + "dontAskAgainOnThisDeviceFor30Days": { + "message": "Don't ask again on this device for 30 days" + }, "sendVerificationCodeEmailAgain": { "message": "Envoyer à nouveau le courriel de code de vérification" }, "useAnotherTwoStepMethod": { "message": "Utiliser une autre méthode de connexion en deux étapes" }, + "selectAnotherMethod": { + "message": "Select another method", + "description": "Select another two-step login method" + }, + "useYourRecoveryCode": { + "message": "Use your recovery code" + }, "insertYubiKey": { "message": "Insérez votre YubiKey dans le port USB de votre ordinateur puis appuyez sur son bouton." }, @@ -918,6 +949,9 @@ "twoStepOptions": { "message": "Options d'authentification à deux facteurs" }, + "selectTwoStepLoginMethod": { + "message": "Select two-step login method" + }, "selfHostedEnvironment": { "message": "Environnement auto-hébergé" }, @@ -2247,6 +2281,12 @@ "webAuthnAuthenticate": { "message": "Authentifier WebAuthn" }, + "readSecurityKey": { + "message": "Read security key" + }, + "awaitingSecurityKeyInteraction": { + "message": "Awaiting security key interaction..." + }, "hideEmail": { "message": "Masquer mon adresse électronique aux destinataires." }, @@ -3206,6 +3246,12 @@ "duoRequiredByOrgForAccount": { "message": "L'authentification à double facteur Duo est requise pour votre compte." }, + "duoTwoFactorRequiredPageSubtitle": { + "message": "Duo two-step login is required for your account. Follow the steps below to finish logging in." + }, + "followTheStepsBelowToFinishLoggingIn": { + "message": "Follow the steps below to finish logging in." + }, "launchDuo": { "message": "Lancer Duo dans le navigateur" }, @@ -3463,9 +3509,27 @@ "sshkeyApprovalTitle": { "message": "Confirmer l'utilisation de la clé SSH" }, + "agentForwardingWarningTitle": { + "message": "Warning: Agent Forwarding" + }, + "agentForwardingWarningText": { + "message": "This request comes from a remote device that you are logged into" + }, "sshkeyApprovalMessageInfix": { "message": "demande l'accès à" }, + "sshkeyApprovalMessageSuffix": { + "message": "in order to" + }, + "sshActionLogin": { + "message": "authenticate to a server" + }, + "sshActionSign": { + "message": "sign a message" + }, + "sshActionGitSign": { + "message": "sign a git commit" + }, "unknownApplication": { "message": "Une application" }, diff --git a/apps/desktop/src/locales/gl/messages.json b/apps/desktop/src/locales/gl/messages.json index 1aa61a9b381..b7693c0d0b5 100644 --- a/apps/desktop/src/locales/gl/messages.json +++ b/apps/desktop/src/locales/gl/messages.json @@ -652,6 +652,15 @@ "logInToBitwarden": { "message": "Log in to Bitwarden" }, + "enterTheCodeSentToYourEmail": { + "message": "Enter the code sent to your email" + }, + "enterTheCodeFromYourAuthenticatorApp": { + "message": "Enter the code from your authenticator app" + }, + "pressYourYubiKeyToAuthenticate": { + "message": "Press your YubiKey to authenticate" + }, "logInWithPasskey": { "message": "Log in with passkey" }, @@ -704,6 +713,15 @@ "masterPassHintLabel": { "message": "Master password hint" }, + "passwordStrengthScore": { + "message": "Password strength score $SCORE$", + "placeholders": { + "score": { + "content": "$1", + "example": "4" + } + } + }, "joinOrganization": { "message": "Join organization" }, @@ -816,6 +834,9 @@ "webauthnCancelOrTimeout": { "message": "The authentication was cancelled or took too long. Please try again." }, + "openInNewTab": { + "message": "Open in new tab" + }, "invalidVerificationCode": { "message": "Invalid verification code" }, @@ -846,12 +867,22 @@ "rememberMe": { "message": "Remember me" }, + "dontAskAgainOnThisDeviceFor30Days": { + "message": "Don't ask again on this device for 30 days" + }, "sendVerificationCodeEmailAgain": { "message": "Send verification code email again" }, "useAnotherTwoStepMethod": { "message": "Use another two-step login method" }, + "selectAnotherMethod": { + "message": "Select another method", + "description": "Select another two-step login method" + }, + "useYourRecoveryCode": { + "message": "Use your recovery code" + }, "insertYubiKey": { "message": "Insert your YubiKey into your computer's USB port, then touch its button." }, @@ -918,6 +949,9 @@ "twoStepOptions": { "message": "Two-step login options" }, + "selectTwoStepLoginMethod": { + "message": "Select two-step login method" + }, "selfHostedEnvironment": { "message": "Self-hosted environment" }, @@ -2247,6 +2281,12 @@ "webAuthnAuthenticate": { "message": "Authenticate WebAuthn" }, + "readSecurityKey": { + "message": "Read security key" + }, + "awaitingSecurityKeyInteraction": { + "message": "Awaiting security key interaction..." + }, "hideEmail": { "message": "Hide my email address from recipients." }, @@ -3206,6 +3246,12 @@ "duoRequiredByOrgForAccount": { "message": "Duo two-step login is required for your account." }, + "duoTwoFactorRequiredPageSubtitle": { + "message": "Duo two-step login is required for your account. Follow the steps below to finish logging in." + }, + "followTheStepsBelowToFinishLoggingIn": { + "message": "Follow the steps below to finish logging in." + }, "launchDuo": { "message": "Launch Duo in Browser" }, @@ -3463,9 +3509,27 @@ "sshkeyApprovalTitle": { "message": "Confirm SSH key usage" }, + "agentForwardingWarningTitle": { + "message": "Warning: Agent Forwarding" + }, + "agentForwardingWarningText": { + "message": "This request comes from a remote device that you are logged into" + }, "sshkeyApprovalMessageInfix": { "message": "is requesting access to" }, + "sshkeyApprovalMessageSuffix": { + "message": "in order to" + }, + "sshActionLogin": { + "message": "authenticate to a server" + }, + "sshActionSign": { + "message": "sign a message" + }, + "sshActionGitSign": { + "message": "sign a git commit" + }, "unknownApplication": { "message": "An application" }, diff --git a/apps/desktop/src/locales/he/messages.json b/apps/desktop/src/locales/he/messages.json index f28b18b5173..05706fd424a 100644 --- a/apps/desktop/src/locales/he/messages.json +++ b/apps/desktop/src/locales/he/messages.json @@ -650,7 +650,16 @@ "message": "התחבר" }, "logInToBitwarden": { - "message": "כניסה אל Bitwarden" + "message": "היכנס אל Bitwarden" + }, + "enterTheCodeSentToYourEmail": { + "message": "הזן את הקוד שנשלח לדוא\"ל שלך" + }, + "enterTheCodeFromYourAuthenticatorApp": { + "message": "הזן את הקוד מיישום המאמת שלך" + }, + "pressYourYubiKeyToAuthenticate": { + "message": "לחץ על ה־YubiKey שלך כדי לאמת" }, "logInWithPasskey": { "message": "כניסה עם מפתח גישה" @@ -659,7 +668,7 @@ "message": "כניסה עם מכשיר" }, "useSingleSignOn": { - "message": "השתמש בהזדהות חד פעמית" + "message": "השתמש בכניסה יחידה" }, "submit": { "message": "שלח" @@ -704,6 +713,15 @@ "masterPassHintLabel": { "message": "רמז לסיסמה הראשית" }, + "passwordStrengthScore": { + "message": "ציון חוזק סיסמה $SCORE$", + "placeholders": { + "score": { + "content": "$1", + "example": "4" + } + } + }, "joinOrganization": { "message": "הצטרף לארגון" }, @@ -816,6 +834,9 @@ "webauthnCancelOrTimeout": { "message": "האימות בוטל או לקח זמן רב מדי. נא לנסות שוב." }, + "openInNewTab": { + "message": "פתח בכרטיסייה חדשה" + }, "invalidVerificationCode": { "message": "קוד אימות שגוי" }, @@ -846,12 +867,22 @@ "rememberMe": { "message": "זכור אותי" }, + "dontAskAgainOnThisDeviceFor30Days": { + "message": "אל תשאל אותי שוב במכשיר זה למשך 30 יום" + }, "sendVerificationCodeEmailAgain": { "message": "שלח שוב קוד אימות לאימייל" }, "useAnotherTwoStepMethod": { "message": "השתמש בשיטה אחרת עבור כניסה דו שלבית" }, + "selectAnotherMethod": { + "message": "בחר שיטה אחרת", + "description": "Select another two-step login method" + }, + "useYourRecoveryCode": { + "message": "השתמש בקוד השחזור שלך" + }, "insertYubiKey": { "message": "הכנס את ה-YubiKey אל כניסת ה-USB במחשבך, ואז גע בכפתור שלו." }, @@ -918,6 +949,9 @@ "twoStepOptions": { "message": "אפשרויות כניסה דו שלבית" }, + "selectTwoStepLoginMethod": { + "message": "בחר שיטת כניסה דו-שלבית" + }, "selfHostedEnvironment": { "message": "סביבה על שרתים מקומיים" }, @@ -2085,7 +2119,7 @@ "message": "מדיניות ארגון חסמה ייבוא פריטים אל תוך הכספת האישית שלך." }, "allSends": { - "message": "כל הסנדים", + "message": "כל הסֵנְדים", "description": "'Sends' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendTypeFile": { @@ -2095,11 +2129,11 @@ "message": "טקסט" }, "searchSends": { - "message": "חפש סנדים", + "message": "חפש סֵנְדים", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "editSend": { - "message": "ערוך סנד", + "message": "ערוך סֵנְד", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "myVault": { @@ -2112,14 +2146,14 @@ "message": "תאריך מחיקה" }, "deletionDateDesc": { - "message": "הסנד יימחק לצמיתות בתאריך ובשעה שצוינו.", + "message": "הסֵנְד יימחק לצמיתות בתאריך ובשעה שצוינו.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "expirationDate": { "message": "תאריך תפוגה" }, "expirationDateDesc": { - "message": "אם מוגדר, גישה לסנד זה תפוג בתאריך ובשעה שצוינו.", + "message": "אם מוגדר, גישה לסֵנְד זה תפוג בתאריך ובשעה שצוינו.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "maxAccessCount": { @@ -2127,57 +2161,57 @@ "description": "This text will be displayed after a Send has been accessed the maximum amount of times." }, "maxAccessCountDesc": { - "message": "אם מוגדר, משתמשים לא יוכלו עוד לגשת לסנד זה ברגע שמספר הגישות המרבי הושג.", + "message": "אם מוגדר, משתמשים לא יוכלו עוד לגשת לסֵנְד זה ברגע שמספר הגישות המרבי הושג.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "currentAccessCount": { "message": "מספר גישות נוכחי" }, "disableSend": { - "message": "השבת את סנד זה כך שאף אחד לא יוכל לגשת אליו.", + "message": "השבת את סֵנְד זה כך שאף אחד לא יוכל לגשת אליו.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendPasswordDesc": { - "message": "דרוש סיסמה באופן אופציונלי כדי שמשתמשים יוכלו לגשת אל סנד זה.", + "message": "דרוש סיסמה באופן אופציונלי כדי שמשתמשים יוכלו לגשת אל סֵנְד זה.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendNotesDesc": { - "message": "הערות פרטיות לגבי סנד זה.", + "message": "הערות פרטיות לגבי סֵנְד זה.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendLink": { - "message": "קישור סנד", + "message": "קישור סֵנְד", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendLinkLabel": { - "message": "קישור סנד", + "message": "קישור סֵנְד", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "textHiddenByDefault": { - "message": "כשניגשים לסנד, הסתר את הטקסט כברירת מחדל", + "message": "בעת גישה לסֵנְד, הסתר את הטקסט כברירת מחדל", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "createdSend": { - "message": "סנד נוסף", + "message": "סֵנְד נוסף", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "editedSend": { - "message": "סנד נשמר", + "message": "סֵנְד נשמר", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "deletedSend": { - "message": "סנד נמחק", + "message": "סֵנְד נמחק", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "newPassword": { "message": "סיסמה חדשה" }, "whatTypeOfSend": { - "message": "איזה סוג של סנד זה?", + "message": "איזה סוג של סֵנְד זה?", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "createSend": { - "message": "סנד חדש", + "message": "סֵנְד חדש", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendTextDesc": { @@ -2202,22 +2236,22 @@ "message": "מותאם אישית" }, "deleteSendConfirmation": { - "message": "האם אתה בטוח שברצונך למחוק סנד זה?", + "message": "האם אתה בטוח שברצונך למחוק סֵנְד זה?", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "copySendLinkToClipboard": { - "message": "העתק קישור סנד ללוח", + "message": "העתק קישור סֵנְד ללוח", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "copySendLinkOnSave": { - "message": "העתק את הקישור לשיתוף סנד זה ללוח ההעתקה שלי עם השמירה." + "message": "העתק את הקישור לשיתוף סֵנְד זה ללוח ההעתקה שלי עם השמירה." }, "sendDisabled": { - "message": "סנד הוסר", + "message": "סֵנְד הוסר", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendDisabledWarning": { - "message": "בשל מדיניות ארגונית, אתה יכול למחוק רק סנד קיים.", + "message": "בשל מדיניות ארגונית, אתה יכול למחוק רק סֵנְד קיים.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "copyLink": { @@ -2247,11 +2281,17 @@ "webAuthnAuthenticate": { "message": "אמת WebAuthn" }, + "readSecurityKey": { + "message": "קרא מפתח אבטחה" + }, + "awaitingSecurityKeyInteraction": { + "message": "ממתין לאינטראקציה עם מפתח אבטחה..." + }, "hideEmail": { "message": "הסתר את כתובת הדוא\"ל שלי מנמענים." }, "sendOptionsPolicyInEffect": { - "message": "מדיניות ארגון אחת או יותר משפיעה על אפשרויות הסנד שלך." + "message": "מדיניות ארגון אחת או יותר משפיעה על אפשרויות הסֵנְד שלך." }, "emailVerificationRequired": { "message": "נדרש אימות דוא\"ל" @@ -2272,7 +2312,7 @@ "message": "פעולה זו מוגנת. כדי להמשיך, הזן מחדש את הסיסמה הראשית שלך כדי לאמת את זהותך." }, "updatedMasterPassword": { - "message": "הסיסמה הראשית עודכנה" + "message": "סיסמה ראשית עודכנה" }, "updateMasterPassword": { "message": "עדכון סיסמה ראשית" @@ -2395,7 +2435,7 @@ "message": "הסיסמה הראשית הוסרה" }, "convertOrganizationEncryptionDesc": { - "message": "$ORGANIZATION$ משתמשת ב־SSO עם שרת מפתחות באירוח עצמי. סיסמה ראשית לא דרושה יותר כדי להיכנס עבור חברים של ארגון זה.", + "message": "$ORGANIZATION$ משתמש/ת ב־SSO עם שרת מפתחות באירוח עצמי. סיסמה ראשית לא דרושה יותר כדי להיכנס עבור חברים של ארגון זה.", "placeholders": { "organization": { "content": "$1", @@ -2722,7 +2762,7 @@ "description": "Part of a URL." }, "apiAccessToken": { - "message": "אסימון גישה ל־API" + "message": "אסימון גישת API" }, "apiKey": { "message": "מפתח API" @@ -3206,6 +3246,12 @@ "duoRequiredByOrgForAccount": { "message": "נדרשת כניסה דו־שלבית של Duo עבור החשבון שלך." }, + "duoTwoFactorRequiredPageSubtitle": { + "message": "נדרשת כניסה דו-שלבית של Duo עבור החשבון שלך. עקוב אחר השלבים למטה כדי לסיים להיכנס." + }, + "followTheStepsBelowToFinishLoggingIn": { + "message": "עקוב אחר השלבים למטה כדי לסיים להיכנס." + }, "launchDuo": { "message": "פתח את Duo בדפדפן" }, @@ -3284,7 +3330,7 @@ "message": "נתוני כספת יוצאו" }, "multifactorAuthenticationCancelled": { - "message": "אימות רב-שלבי בוטל" + "message": "אימות רב-גורמי בוטל" }, "noLastPassDataFound": { "message": "לא נמצאו נתוני LastPass" @@ -3302,7 +3348,7 @@ "message": "PIN שגוי" }, "multifactorAuthenticationFailed": { - "message": "אימות רב-שלבי נכשל" + "message": "אימות רב-גורמי נכשל" }, "includeSharedFolders": { "message": "כלול תיקיות משותפות" @@ -3314,7 +3360,7 @@ "message": "מייבא את החשבון שלך..." }, "lastPassMFARequired": { - "message": "נדרש אימות רב-שלבי של LastPass" + "message": "נדרש אימות רב-גורמי של LastPass" }, "lastPassMFADesc": { "message": "הזן את קוד הגישה החד פעמי שלך מיישום האימות שלך" @@ -3422,10 +3468,10 @@ "message": "נתונים" }, "fileSends": { - "message": "סנדים של קובץ" + "message": "סֵנְדים של קובץ" }, "textSends": { - "message": "סנדים של טקסט" + "message": "סֵנְדים של טקסט" }, "ssoError": { "message": "לא נמצאו יציאות פנויות עבור כניסת ה־sso." @@ -3463,9 +3509,27 @@ "sshkeyApprovalTitle": { "message": "אשר שימוש במפתח SSH" }, + "agentForwardingWarningTitle": { + "message": "אזהרה: העברת סוכן" + }, + "agentForwardingWarningText": { + "message": "הבקשה הזאת באה ממכשיר מרוחק שאתה מחובר אליו" + }, "sshkeyApprovalMessageInfix": { "message": "מבקש גישה אל" }, + "sshkeyApprovalMessageSuffix": { + "message": "על מנת" + }, + "sshActionLogin": { + "message": "בצע אימות לשרת" + }, + "sshActionSign": { + "message": "חתימה על הודעה" + }, + "sshActionGitSign": { + "message": "חתימה על התחייבות Git" + }, "unknownApplication": { "message": "יישום" }, @@ -3497,7 +3561,7 @@ "message": "Bitwarden ישלח קוד לדוא\"ל החשבון שלך כדי לאמת כניסות ממכשירים חדשים החל מפברואר 2025." }, "newDeviceVerificationNoticeContentPage2": { - "message": "אתה יכול להגדיר כניסה דו-שלבית כדרך חלופית להגן על החשבון שלך או לשנות את הדוא\"ל שלך לאחד שתוכל לגשת אליו." + "message": "אתה יכול להגדיר כניסה דו-שלבית כדרך חלופית להגן על החשבון שלך או לשנות את הדוא\"ל שלך לאחד שאתה יכול לגשת אליו." }, "remindMeLater": { "message": "הזכר לי מאוחר יותר" diff --git a/apps/desktop/src/locales/hi/messages.json b/apps/desktop/src/locales/hi/messages.json index 3265b5f530f..1f5405f8405 100644 --- a/apps/desktop/src/locales/hi/messages.json +++ b/apps/desktop/src/locales/hi/messages.json @@ -652,6 +652,15 @@ "logInToBitwarden": { "message": "Log in to Bitwarden" }, + "enterTheCodeSentToYourEmail": { + "message": "Enter the code sent to your email" + }, + "enterTheCodeFromYourAuthenticatorApp": { + "message": "Enter the code from your authenticator app" + }, + "pressYourYubiKeyToAuthenticate": { + "message": "Press your YubiKey to authenticate" + }, "logInWithPasskey": { "message": "Log in with passkey" }, @@ -704,6 +713,15 @@ "masterPassHintLabel": { "message": "Master password hint" }, + "passwordStrengthScore": { + "message": "Password strength score $SCORE$", + "placeholders": { + "score": { + "content": "$1", + "example": "4" + } + } + }, "joinOrganization": { "message": "Join organization" }, @@ -816,6 +834,9 @@ "webauthnCancelOrTimeout": { "message": "The authentication was cancelled or took too long. Please try again." }, + "openInNewTab": { + "message": "Open in new tab" + }, "invalidVerificationCode": { "message": "Invalid verification code" }, @@ -846,12 +867,22 @@ "rememberMe": { "message": "Remember me" }, + "dontAskAgainOnThisDeviceFor30Days": { + "message": "Don't ask again on this device for 30 days" + }, "sendVerificationCodeEmailAgain": { "message": "Send verification code email again" }, "useAnotherTwoStepMethod": { "message": "Use another two-step login method" }, + "selectAnotherMethod": { + "message": "Select another method", + "description": "Select another two-step login method" + }, + "useYourRecoveryCode": { + "message": "Use your recovery code" + }, "insertYubiKey": { "message": "Insert your YubiKey into your computer's USB port, then touch its button." }, @@ -918,6 +949,9 @@ "twoStepOptions": { "message": "Two-step login options" }, + "selectTwoStepLoginMethod": { + "message": "Select two-step login method" + }, "selfHostedEnvironment": { "message": "Self-hosted environment" }, @@ -2247,6 +2281,12 @@ "webAuthnAuthenticate": { "message": "Authenticate WebAuthn" }, + "readSecurityKey": { + "message": "Read security key" + }, + "awaitingSecurityKeyInteraction": { + "message": "Awaiting security key interaction..." + }, "hideEmail": { "message": "Hide my email address from recipients." }, @@ -3206,6 +3246,12 @@ "duoRequiredByOrgForAccount": { "message": "Duo two-step login is required for your account." }, + "duoTwoFactorRequiredPageSubtitle": { + "message": "Duo two-step login is required for your account. Follow the steps below to finish logging in." + }, + "followTheStepsBelowToFinishLoggingIn": { + "message": "Follow the steps below to finish logging in." + }, "launchDuo": { "message": "Launch Duo in Browser" }, @@ -3463,9 +3509,27 @@ "sshkeyApprovalTitle": { "message": "Confirm SSH key usage" }, + "agentForwardingWarningTitle": { + "message": "Warning: Agent Forwarding" + }, + "agentForwardingWarningText": { + "message": "This request comes from a remote device that you are logged into" + }, "sshkeyApprovalMessageInfix": { "message": "is requesting access to" }, + "sshkeyApprovalMessageSuffix": { + "message": "in order to" + }, + "sshActionLogin": { + "message": "authenticate to a server" + }, + "sshActionSign": { + "message": "sign a message" + }, + "sshActionGitSign": { + "message": "sign a git commit" + }, "unknownApplication": { "message": "An application" }, diff --git a/apps/desktop/src/locales/hr/messages.json b/apps/desktop/src/locales/hr/messages.json index 18da306d929..ed82423d813 100644 --- a/apps/desktop/src/locales/hr/messages.json +++ b/apps/desktop/src/locales/hr/messages.json @@ -652,6 +652,15 @@ "logInToBitwarden": { "message": "Prijavi se u Bitwarden" }, + "enterTheCodeSentToYourEmail": { + "message": "Enter the code sent to your email" + }, + "enterTheCodeFromYourAuthenticatorApp": { + "message": "Enter the code from your authenticator app" + }, + "pressYourYubiKeyToAuthenticate": { + "message": "Press your YubiKey to authenticate" + }, "logInWithPasskey": { "message": "Prijava pristupnim ključem" }, @@ -704,6 +713,15 @@ "masterPassHintLabel": { "message": "Podsjetnik glavne lozinke" }, + "passwordStrengthScore": { + "message": "Password strength score $SCORE$", + "placeholders": { + "score": { + "content": "$1", + "example": "4" + } + } + }, "joinOrganization": { "message": "Pridruži se organizaciji" }, @@ -816,6 +834,9 @@ "webauthnCancelOrTimeout": { "message": "Autentifikacija je otkazana ili je trajala predugo. Molimo pokušaj ponovno." }, + "openInNewTab": { + "message": "Open in new tab" + }, "invalidVerificationCode": { "message": "Nevažeći kôd za provjeru" }, @@ -846,12 +867,22 @@ "rememberMe": { "message": "Zapamti me" }, + "dontAskAgainOnThisDeviceFor30Days": { + "message": "Don't ask again on this device for 30 days" + }, "sendVerificationCodeEmailAgain": { "message": "Ponovno slanje kontrolnog koda e-poštom" }, "useAnotherTwoStepMethod": { "message": "Koristiti drugi način prijave dvostrukom autentifikacijom" }, + "selectAnotherMethod": { + "message": "Select another method", + "description": "Select another two-step login method" + }, + "useYourRecoveryCode": { + "message": "Use your recovery code" + }, "insertYubiKey": { "message": "Umetni svoj YubiKey u USB priključak računala, a zatim dodirni njegovu tipku." }, @@ -918,6 +949,9 @@ "twoStepOptions": { "message": "Mogućnosti prijave dvostrukom autentifikacijom" }, + "selectTwoStepLoginMethod": { + "message": "Select two-step login method" + }, "selfHostedEnvironment": { "message": "Vlastito hosting okruženje" }, @@ -2247,6 +2281,12 @@ "webAuthnAuthenticate": { "message": "Ovjeri WebAuthn" }, + "readSecurityKey": { + "message": "Read security key" + }, + "awaitingSecurityKeyInteraction": { + "message": "Awaiting security key interaction..." + }, "hideEmail": { "message": "Sakrij moju adresu e-pošte od primatelja." }, @@ -3206,6 +3246,12 @@ "duoRequiredByOrgForAccount": { "message": "Za tvoj račun je potrebna Duo dvostruka autentifikacija." }, + "duoTwoFactorRequiredPageSubtitle": { + "message": "Duo two-step login is required for your account. Follow the steps below to finish logging in." + }, + "followTheStepsBelowToFinishLoggingIn": { + "message": "Follow the steps below to finish logging in." + }, "launchDuo": { "message": "Pokreni Duo u pregledniku" }, @@ -3463,9 +3509,27 @@ "sshkeyApprovalTitle": { "message": "Potvrdi korištenje SSH ključa" }, + "agentForwardingWarningTitle": { + "message": "Warning: Agent Forwarding" + }, + "agentForwardingWarningText": { + "message": "This request comes from a remote device that you are logged into" + }, "sshkeyApprovalMessageInfix": { "message": "traži pristup za" }, + "sshkeyApprovalMessageSuffix": { + "message": "in order to" + }, + "sshActionLogin": { + "message": "authenticate to a server" + }, + "sshActionSign": { + "message": "sign a message" + }, + "sshActionGitSign": { + "message": "sign a git commit" + }, "unknownApplication": { "message": "Aplikacija" }, diff --git a/apps/desktop/src/locales/hu/messages.json b/apps/desktop/src/locales/hu/messages.json index d57fe343cc6..a974b10ee49 100644 --- a/apps/desktop/src/locales/hu/messages.json +++ b/apps/desktop/src/locales/hu/messages.json @@ -652,6 +652,15 @@ "logInToBitwarden": { "message": "Bejelentkezés a Bitwardenbe" }, + "enterTheCodeSentToYourEmail": { + "message": "Adjuk meg az email címre elküldött kódot." + }, + "enterTheCodeFromYourAuthenticatorApp": { + "message": "Adjuk meg a hitelesítő alkalmazása által generált kódot." + }, + "pressYourYubiKeyToAuthenticate": { + "message": "Nyomjuk meg a YubiKey-t a hitelesítéshez." + }, "logInWithPasskey": { "message": "Bejelentkezés hozzáférési kulccsal" }, @@ -704,6 +713,15 @@ "masterPassHintLabel": { "message": "Mesterjelszó emlékeztető" }, + "passwordStrengthScore": { + "message": "A jelszó erősségi pontszáma $SCORE$", + "placeholders": { + "score": { + "content": "$1", + "example": "4" + } + } + }, "joinOrganization": { "message": "Csatlakozás szervezethez" }, @@ -816,6 +834,9 @@ "webauthnCancelOrTimeout": { "message": "A hitelesítés megszakításra került vagy túl sokáig tartott. Próbáljuk újra." }, + "openInNewTab": { + "message": "Megnyitás új fülön" + }, "invalidVerificationCode": { "message": "Érvénytelen ellenőrző kód" }, @@ -846,12 +867,22 @@ "rememberMe": { "message": "Adatok megjegyzése" }, + "dontAskAgainOnThisDeviceFor30Days": { + "message": "Ne kérdezzen újra ezen az eszközön 30 napig" + }, "sendVerificationCodeEmailAgain": { "message": "Megerősítő kód ismételt elküldése emailben" }, "useAnotherTwoStepMethod": { "message": "Másik kétlépcsős bejelentkezési mód használata" }, + "selectAnotherMethod": { + "message": "Másik módszer választás", + "description": "Select another two-step login method" + }, + "useYourRecoveryCode": { + "message": "Helyreállító kód használata" + }, "insertYubiKey": { "message": "A YubiKey beillesztése a számítógép USB portjába és a rajta levő gomb megnyomása." }, @@ -918,6 +949,9 @@ "twoStepOptions": { "message": "Kétlépcsős bejelentkezés opciók" }, + "selectTwoStepLoginMethod": { + "message": "Kétlépcsős bejelentkezési mód használata" + }, "selfHostedEnvironment": { "message": "Saját üzemeltetésű környezet" }, @@ -2247,6 +2281,12 @@ "webAuthnAuthenticate": { "message": "WebAutn hitelesítés" }, + "readSecurityKey": { + "message": "Biztonsági kulcs olvasása" + }, + "awaitingSecurityKeyInteraction": { + "message": "Várakozás a biztonsági kulcs interakciójára..." + }, "hideEmail": { "message": "Saját email cím elrejtése a címzettek elől." }, @@ -3206,6 +3246,12 @@ "duoRequiredByOrgForAccount": { "message": "A fiókhoz kétlépcsős DUO bejelentkezés szükséges." }, + "duoTwoFactorRequiredPageSubtitle": { + "message": "Duo kétlépcsős bejelentkezés szükséges a fiókhoz. Kövessük az alábbi lépéseket a bejelentkezés befejezéséhez." + }, + "followTheStepsBelowToFinishLoggingIn": { + "message": "Kövessük az alábbi lépéseket a bejelentkezés befejezéséhez." + }, "launchDuo": { "message": "A Duo elindítása a böngészőben" }, @@ -3463,9 +3509,27 @@ "sshkeyApprovalTitle": { "message": "SSH kulcs használat megerősítése" }, + "agentForwardingWarningTitle": { + "message": "Figyelmeztetés: Böngésző továbbítás" + }, + "agentForwardingWarningText": { + "message": "Ez a kérelem egy távoli eszközről érkezik, amelyre bejelentkeztünk" + }, "sshkeyApprovalMessageInfix": { "message": "hozzáférést kér:" }, + "sshkeyApprovalMessageSuffix": { + "message": "azért, hogy" + }, + "sshActionLogin": { + "message": "hitelesítsük magunkat a szerveren" + }, + "sshActionSign": { + "message": "aláírjunk egy üzenetet" + }, + "sshActionGitSign": { + "message": "aléírjunk egy git commit elemet" + }, "unknownApplication": { "message": "Egy alkalmazás" }, diff --git a/apps/desktop/src/locales/id/messages.json b/apps/desktop/src/locales/id/messages.json index d40053aec28..017d3357ccd 100644 --- a/apps/desktop/src/locales/id/messages.json +++ b/apps/desktop/src/locales/id/messages.json @@ -652,6 +652,15 @@ "logInToBitwarden": { "message": "Log in to Bitwarden" }, + "enterTheCodeSentToYourEmail": { + "message": "Enter the code sent to your email" + }, + "enterTheCodeFromYourAuthenticatorApp": { + "message": "Enter the code from your authenticator app" + }, + "pressYourYubiKeyToAuthenticate": { + "message": "Press your YubiKey to authenticate" + }, "logInWithPasskey": { "message": "Log in with passkey" }, @@ -704,6 +713,15 @@ "masterPassHintLabel": { "message": "Master password hint" }, + "passwordStrengthScore": { + "message": "Password strength score $SCORE$", + "placeholders": { + "score": { + "content": "$1", + "example": "4" + } + } + }, "joinOrganization": { "message": "Join organization" }, @@ -816,6 +834,9 @@ "webauthnCancelOrTimeout": { "message": "The authentication was cancelled or took too long. Please try again." }, + "openInNewTab": { + "message": "Open in new tab" + }, "invalidVerificationCode": { "message": "Kode verifikasi tidak valid" }, @@ -846,12 +867,22 @@ "rememberMe": { "message": "Ingat saya" }, + "dontAskAgainOnThisDeviceFor30Days": { + "message": "Don't ask again on this device for 30 days" + }, "sendVerificationCodeEmailAgain": { "message": "Kirim ulang email kode verifikasi" }, "useAnotherTwoStepMethod": { "message": "Gunakan metode masuk dua langkah lainnya" }, + "selectAnotherMethod": { + "message": "Select another method", + "description": "Select another two-step login method" + }, + "useYourRecoveryCode": { + "message": "Use your recovery code" + }, "insertYubiKey": { "message": "Masukkan YubiKey Anda ke port USB komputer Anda, lalu sentuh tombol nya." }, @@ -918,6 +949,9 @@ "twoStepOptions": { "message": "Pilihan Info Masuk Dua Langkah" }, + "selectTwoStepLoginMethod": { + "message": "Select two-step login method" + }, "selfHostedEnvironment": { "message": "Lingkungan Hos-mandiri" }, @@ -2247,6 +2281,12 @@ "webAuthnAuthenticate": { "message": "Autentikasi dengan WebAuthn" }, + "readSecurityKey": { + "message": "Read security key" + }, + "awaitingSecurityKeyInteraction": { + "message": "Awaiting security key interaction..." + }, "hideEmail": { "message": "Sembunyikan alamat surel saya dari penerima." }, @@ -3206,6 +3246,12 @@ "duoRequiredByOrgForAccount": { "message": "Duo two-step login is required for your account." }, + "duoTwoFactorRequiredPageSubtitle": { + "message": "Duo two-step login is required for your account. Follow the steps below to finish logging in." + }, + "followTheStepsBelowToFinishLoggingIn": { + "message": "Follow the steps below to finish logging in." + }, "launchDuo": { "message": "Launch Duo in Browser" }, @@ -3463,9 +3509,27 @@ "sshkeyApprovalTitle": { "message": "Confirm SSH key usage" }, + "agentForwardingWarningTitle": { + "message": "Warning: Agent Forwarding" + }, + "agentForwardingWarningText": { + "message": "This request comes from a remote device that you are logged into" + }, "sshkeyApprovalMessageInfix": { "message": "is requesting access to" }, + "sshkeyApprovalMessageSuffix": { + "message": "in order to" + }, + "sshActionLogin": { + "message": "authenticate to a server" + }, + "sshActionSign": { + "message": "sign a message" + }, + "sshActionGitSign": { + "message": "sign a git commit" + }, "unknownApplication": { "message": "An application" }, diff --git a/apps/desktop/src/locales/it/messages.json b/apps/desktop/src/locales/it/messages.json index ee324d47c89..3cecef39f7a 100644 --- a/apps/desktop/src/locales/it/messages.json +++ b/apps/desktop/src/locales/it/messages.json @@ -652,6 +652,15 @@ "logInToBitwarden": { "message": "Accedi a Bitwarden" }, + "enterTheCodeSentToYourEmail": { + "message": "Inserisci il codice inviato alla tua e-mail" + }, + "enterTheCodeFromYourAuthenticatorApp": { + "message": "Inserisci il codice dalla tua app di autenticazione" + }, + "pressYourYubiKeyToAuthenticate": { + "message": "Premi la tua chiave Yubi per autenticare" + }, "logInWithPasskey": { "message": "Accedi con passkey" }, @@ -704,6 +713,15 @@ "masterPassHintLabel": { "message": "Suggerimento per la password principale" }, + "passwordStrengthScore": { + "message": "Valutazione complessità parola d'accesso $SCORE$", + "placeholders": { + "score": { + "content": "$1", + "example": "4" + } + } + }, "joinOrganization": { "message": "Unisciti all'organizzazione" }, @@ -816,6 +834,9 @@ "webauthnCancelOrTimeout": { "message": "L'autenticazione è stata annullata o ha richiesto troppo tempo. Per favore riprova." }, + "openInNewTab": { + "message": "Apri in una nuova scheda" + }, "invalidVerificationCode": { "message": "Codice di verifica non valido" }, @@ -846,12 +867,22 @@ "rememberMe": { "message": "Ricordami" }, + "dontAskAgainOnThisDeviceFor30Days": { + "message": "Non chiedere più su questo dispositivo per 30 giorni" + }, "sendVerificationCodeEmailAgain": { "message": "Invia email con codice di verifica di nuovo" }, "useAnotherTwoStepMethod": { "message": "Usa un altro metodo di verifica in due passaggi" }, + "selectAnotherMethod": { + "message": "Seleziona un altro metodo", + "description": "Select another two-step login method" + }, + "useYourRecoveryCode": { + "message": "Usa il tuo codice di recupero" + }, "insertYubiKey": { "message": "Inserisci la tua YubiKey nella porta USB del computer e premi il suo pulsante." }, @@ -918,6 +949,9 @@ "twoStepOptions": { "message": "Opzioni di verifica in due passaggi" }, + "selectTwoStepLoginMethod": { + "message": "Seleziona metodo di accesso in due passaggi" + }, "selfHostedEnvironment": { "message": "Ambiente self-hosted" }, @@ -2247,6 +2281,12 @@ "webAuthnAuthenticate": { "message": "Autenticazione WebAuthn" }, + "readSecurityKey": { + "message": "Leggi chiave di sicurezza" + }, + "awaitingSecurityKeyInteraction": { + "message": "In attesa di interazione con la chiave di sicurezza..." + }, "hideEmail": { "message": "Nascondi il mio indirizzo email dai destinatari." }, @@ -3206,6 +3246,12 @@ "duoRequiredByOrgForAccount": { "message": "Per il tuo account è richiesta la verifica in due passaggi Duo." }, + "duoTwoFactorRequiredPageSubtitle": { + "message": "Il login Duo in due passaggi è richiesto per il tuo account. Segui i passaggi qui sotto per completare l'accesso." + }, + "followTheStepsBelowToFinishLoggingIn": { + "message": "Segui i passaggi qui sotto per completare l'accesso." + }, "launchDuo": { "message": "Avvia Duo nel browser" }, @@ -3463,9 +3509,27 @@ "sshkeyApprovalTitle": { "message": "Conferma l'uso della chiave SSH" }, + "agentForwardingWarningTitle": { + "message": "Attenzione: inoltro agente" + }, + "agentForwardingWarningText": { + "message": "Questa richiesta proviene da un dispositivo remoto al quale si è connessi" + }, "sshkeyApprovalMessageInfix": { "message": "richiede l'accesso a" }, + "sshkeyApprovalMessageSuffix": { + "message": "al fine di" + }, + "sshActionLogin": { + "message": "autenticazione su un server" + }, + "sshActionSign": { + "message": "firmare un messaggio" + }, + "sshActionGitSign": { + "message": "firmare un commit git" + }, "unknownApplication": { "message": "Un'applicazione" }, diff --git a/apps/desktop/src/locales/ja/messages.json b/apps/desktop/src/locales/ja/messages.json index 241b72f95a8..098c683faae 100644 --- a/apps/desktop/src/locales/ja/messages.json +++ b/apps/desktop/src/locales/ja/messages.json @@ -652,6 +652,15 @@ "logInToBitwarden": { "message": "Bitwarden にログイン" }, + "enterTheCodeSentToYourEmail": { + "message": "Enter the code sent to your email" + }, + "enterTheCodeFromYourAuthenticatorApp": { + "message": "Enter the code from your authenticator app" + }, + "pressYourYubiKeyToAuthenticate": { + "message": "Press your YubiKey to authenticate" + }, "logInWithPasskey": { "message": "パスキーでログイン" }, @@ -704,6 +713,15 @@ "masterPassHintLabel": { "message": "マスターパスワードのヒント" }, + "passwordStrengthScore": { + "message": "Password strength score $SCORE$", + "placeholders": { + "score": { + "content": "$1", + "example": "4" + } + } + }, "joinOrganization": { "message": "組織に参加" }, @@ -816,6 +834,9 @@ "webauthnCancelOrTimeout": { "message": "認証がキャンセルされたか、時間がかかりすぎました。もう一度やり直してください。" }, + "openInNewTab": { + "message": "Open in new tab" + }, "invalidVerificationCode": { "message": "認証コードが間違っています" }, @@ -846,12 +867,22 @@ "rememberMe": { "message": "情報を保存する" }, + "dontAskAgainOnThisDeviceFor30Days": { + "message": "Don't ask again on this device for 30 days" + }, "sendVerificationCodeEmailAgain": { "message": "確認コードをメールで再送" }, "useAnotherTwoStepMethod": { "message": "他の2段階認証方法を使用" }, + "selectAnotherMethod": { + "message": "Select another method", + "description": "Select another two-step login method" + }, + "useYourRecoveryCode": { + "message": "Use your recovery code" + }, "insertYubiKey": { "message": "YubiKey を USB ポートに挿入し、ボタンをタッチしてください。" }, @@ -918,6 +949,9 @@ "twoStepOptions": { "message": "2段階認証オプション" }, + "selectTwoStepLoginMethod": { + "message": "Select two-step login method" + }, "selfHostedEnvironment": { "message": "セルフホスティング環境" }, @@ -2247,6 +2281,12 @@ "webAuthnAuthenticate": { "message": "WebAuthn の認証" }, + "readSecurityKey": { + "message": "Read security key" + }, + "awaitingSecurityKeyInteraction": { + "message": "Awaiting security key interaction..." + }, "hideEmail": { "message": "メールアドレスを受信者に表示しない" }, @@ -3206,6 +3246,12 @@ "duoRequiredByOrgForAccount": { "message": "アカウントには Duo 二段階認証が必要です。" }, + "duoTwoFactorRequiredPageSubtitle": { + "message": "Duo two-step login is required for your account. Follow the steps below to finish logging in." + }, + "followTheStepsBelowToFinishLoggingIn": { + "message": "Follow the steps below to finish logging in." + }, "launchDuo": { "message": "ブラウザで Duo を起動" }, @@ -3463,9 +3509,27 @@ "sshkeyApprovalTitle": { "message": "SSH 鍵の使用を確認します" }, + "agentForwardingWarningTitle": { + "message": "Warning: Agent Forwarding" + }, + "agentForwardingWarningText": { + "message": "This request comes from a remote device that you are logged into" + }, "sshkeyApprovalMessageInfix": { "message": "がアクセスを要求しています: " }, + "sshkeyApprovalMessageSuffix": { + "message": "in order to" + }, + "sshActionLogin": { + "message": "authenticate to a server" + }, + "sshActionSign": { + "message": "sign a message" + }, + "sshActionGitSign": { + "message": "sign a git commit" + }, "unknownApplication": { "message": "アプリ" }, diff --git a/apps/desktop/src/locales/ka/messages.json b/apps/desktop/src/locales/ka/messages.json index 762cd87cd01..101679fb6e5 100644 --- a/apps/desktop/src/locales/ka/messages.json +++ b/apps/desktop/src/locales/ka/messages.json @@ -652,6 +652,15 @@ "logInToBitwarden": { "message": "Log in to Bitwarden" }, + "enterTheCodeSentToYourEmail": { + "message": "Enter the code sent to your email" + }, + "enterTheCodeFromYourAuthenticatorApp": { + "message": "Enter the code from your authenticator app" + }, + "pressYourYubiKeyToAuthenticate": { + "message": "Press your YubiKey to authenticate" + }, "logInWithPasskey": { "message": "Log in with passkey" }, @@ -704,6 +713,15 @@ "masterPassHintLabel": { "message": "Master password hint" }, + "passwordStrengthScore": { + "message": "Password strength score $SCORE$", + "placeholders": { + "score": { + "content": "$1", + "example": "4" + } + } + }, "joinOrganization": { "message": "Join organization" }, @@ -816,6 +834,9 @@ "webauthnCancelOrTimeout": { "message": "The authentication was cancelled or took too long. Please try again." }, + "openInNewTab": { + "message": "Open in new tab" + }, "invalidVerificationCode": { "message": "არასწორი გადამოწმების კოდი" }, @@ -846,12 +867,22 @@ "rememberMe": { "message": "დამიმახსოვრე" }, + "dontAskAgainOnThisDeviceFor30Days": { + "message": "Don't ask again on this device for 30 days" + }, "sendVerificationCodeEmailAgain": { "message": "Send verification code email again" }, "useAnotherTwoStepMethod": { "message": "Use another two-step login method" }, + "selectAnotherMethod": { + "message": "Select another method", + "description": "Select another two-step login method" + }, + "useYourRecoveryCode": { + "message": "Use your recovery code" + }, "insertYubiKey": { "message": "Insert your YubiKey into your computer's USB port, then touch its button." }, @@ -918,6 +949,9 @@ "twoStepOptions": { "message": "Two-step login options" }, + "selectTwoStepLoginMethod": { + "message": "Select two-step login method" + }, "selfHostedEnvironment": { "message": "Self-hosted environment" }, @@ -2247,6 +2281,12 @@ "webAuthnAuthenticate": { "message": "Authenticate WebAuthn" }, + "readSecurityKey": { + "message": "Read security key" + }, + "awaitingSecurityKeyInteraction": { + "message": "Awaiting security key interaction..." + }, "hideEmail": { "message": "Hide my email address from recipients." }, @@ -3206,6 +3246,12 @@ "duoRequiredByOrgForAccount": { "message": "Duo two-step login is required for your account." }, + "duoTwoFactorRequiredPageSubtitle": { + "message": "Duo two-step login is required for your account. Follow the steps below to finish logging in." + }, + "followTheStepsBelowToFinishLoggingIn": { + "message": "Follow the steps below to finish logging in." + }, "launchDuo": { "message": "Launch Duo in Browser" }, @@ -3463,9 +3509,27 @@ "sshkeyApprovalTitle": { "message": "Confirm SSH key usage" }, + "agentForwardingWarningTitle": { + "message": "Warning: Agent Forwarding" + }, + "agentForwardingWarningText": { + "message": "This request comes from a remote device that you are logged into" + }, "sshkeyApprovalMessageInfix": { "message": "is requesting access to" }, + "sshkeyApprovalMessageSuffix": { + "message": "in order to" + }, + "sshActionLogin": { + "message": "authenticate to a server" + }, + "sshActionSign": { + "message": "sign a message" + }, + "sshActionGitSign": { + "message": "sign a git commit" + }, "unknownApplication": { "message": "An application" }, diff --git a/apps/desktop/src/locales/km/messages.json b/apps/desktop/src/locales/km/messages.json index 1aa61a9b381..b7693c0d0b5 100644 --- a/apps/desktop/src/locales/km/messages.json +++ b/apps/desktop/src/locales/km/messages.json @@ -652,6 +652,15 @@ "logInToBitwarden": { "message": "Log in to Bitwarden" }, + "enterTheCodeSentToYourEmail": { + "message": "Enter the code sent to your email" + }, + "enterTheCodeFromYourAuthenticatorApp": { + "message": "Enter the code from your authenticator app" + }, + "pressYourYubiKeyToAuthenticate": { + "message": "Press your YubiKey to authenticate" + }, "logInWithPasskey": { "message": "Log in with passkey" }, @@ -704,6 +713,15 @@ "masterPassHintLabel": { "message": "Master password hint" }, + "passwordStrengthScore": { + "message": "Password strength score $SCORE$", + "placeholders": { + "score": { + "content": "$1", + "example": "4" + } + } + }, "joinOrganization": { "message": "Join organization" }, @@ -816,6 +834,9 @@ "webauthnCancelOrTimeout": { "message": "The authentication was cancelled or took too long. Please try again." }, + "openInNewTab": { + "message": "Open in new tab" + }, "invalidVerificationCode": { "message": "Invalid verification code" }, @@ -846,12 +867,22 @@ "rememberMe": { "message": "Remember me" }, + "dontAskAgainOnThisDeviceFor30Days": { + "message": "Don't ask again on this device for 30 days" + }, "sendVerificationCodeEmailAgain": { "message": "Send verification code email again" }, "useAnotherTwoStepMethod": { "message": "Use another two-step login method" }, + "selectAnotherMethod": { + "message": "Select another method", + "description": "Select another two-step login method" + }, + "useYourRecoveryCode": { + "message": "Use your recovery code" + }, "insertYubiKey": { "message": "Insert your YubiKey into your computer's USB port, then touch its button." }, @@ -918,6 +949,9 @@ "twoStepOptions": { "message": "Two-step login options" }, + "selectTwoStepLoginMethod": { + "message": "Select two-step login method" + }, "selfHostedEnvironment": { "message": "Self-hosted environment" }, @@ -2247,6 +2281,12 @@ "webAuthnAuthenticate": { "message": "Authenticate WebAuthn" }, + "readSecurityKey": { + "message": "Read security key" + }, + "awaitingSecurityKeyInteraction": { + "message": "Awaiting security key interaction..." + }, "hideEmail": { "message": "Hide my email address from recipients." }, @@ -3206,6 +3246,12 @@ "duoRequiredByOrgForAccount": { "message": "Duo two-step login is required for your account." }, + "duoTwoFactorRequiredPageSubtitle": { + "message": "Duo two-step login is required for your account. Follow the steps below to finish logging in." + }, + "followTheStepsBelowToFinishLoggingIn": { + "message": "Follow the steps below to finish logging in." + }, "launchDuo": { "message": "Launch Duo in Browser" }, @@ -3463,9 +3509,27 @@ "sshkeyApprovalTitle": { "message": "Confirm SSH key usage" }, + "agentForwardingWarningTitle": { + "message": "Warning: Agent Forwarding" + }, + "agentForwardingWarningText": { + "message": "This request comes from a remote device that you are logged into" + }, "sshkeyApprovalMessageInfix": { "message": "is requesting access to" }, + "sshkeyApprovalMessageSuffix": { + "message": "in order to" + }, + "sshActionLogin": { + "message": "authenticate to a server" + }, + "sshActionSign": { + "message": "sign a message" + }, + "sshActionGitSign": { + "message": "sign a git commit" + }, "unknownApplication": { "message": "An application" }, diff --git a/apps/desktop/src/locales/kn/messages.json b/apps/desktop/src/locales/kn/messages.json index 69af0ab913f..5c1ac058bdc 100644 --- a/apps/desktop/src/locales/kn/messages.json +++ b/apps/desktop/src/locales/kn/messages.json @@ -652,6 +652,15 @@ "logInToBitwarden": { "message": "Log in to Bitwarden" }, + "enterTheCodeSentToYourEmail": { + "message": "Enter the code sent to your email" + }, + "enterTheCodeFromYourAuthenticatorApp": { + "message": "Enter the code from your authenticator app" + }, + "pressYourYubiKeyToAuthenticate": { + "message": "Press your YubiKey to authenticate" + }, "logInWithPasskey": { "message": "Log in with passkey" }, @@ -704,6 +713,15 @@ "masterPassHintLabel": { "message": "Master password hint" }, + "passwordStrengthScore": { + "message": "Password strength score $SCORE$", + "placeholders": { + "score": { + "content": "$1", + "example": "4" + } + } + }, "joinOrganization": { "message": "Join organization" }, @@ -816,6 +834,9 @@ "webauthnCancelOrTimeout": { "message": "The authentication was cancelled or took too long. Please try again." }, + "openInNewTab": { + "message": "Open in new tab" + }, "invalidVerificationCode": { "message": "Invalid verification code" }, @@ -846,12 +867,22 @@ "rememberMe": { "message": "ನನ್ನನ್ನು ನೆನಪಿನಲ್ಲಿ ಇಡು" }, + "dontAskAgainOnThisDeviceFor30Days": { + "message": "Don't ask again on this device for 30 days" + }, "sendVerificationCodeEmailAgain": { "message": "ಪರಿಶೀಲನೆ ಕೋಡ್ ಇಮೇಲ್ ಅನ್ನು ಮತ್ತೆ ಕಳುಹಿಸಿ" }, "useAnotherTwoStepMethod": { "message": "ಮತ್ತೊಂದು ಎರಡು-ಹಂತದ ಲಾಗಿನ್ ವಿಧಾನವನ್ನು ಬಳಸಿ" }, + "selectAnotherMethod": { + "message": "Select another method", + "description": "Select another two-step login method" + }, + "useYourRecoveryCode": { + "message": "Use your recovery code" + }, "insertYubiKey": { "message": "ನಿಮ್ಮ ಯುಬಿಕಿಯನ್ನು ನಿಮ್ಮ ಕಂಪ್ಯೂಟರ್‌ನ ಯುಎಸ್‌ಬಿ ಪೋರ್ಟ್ಗೆ ಸೇರಿಸಿ, ನಂತರ ಅದರ ಗುಂಡಿಯನ್ನು ಸ್ಪರ್ಶಿಸಿ." }, @@ -918,6 +949,9 @@ "twoStepOptions": { "message": "ಎರಡು ಹಂತದ ಲಾಗಿನ್ ಆಯ್ಕೆಗಳು" }, + "selectTwoStepLoginMethod": { + "message": "Select two-step login method" + }, "selfHostedEnvironment": { "message": "ಸ್ವಯಂ ಆತಿಥೇಯ ಪರಿಸರ" }, @@ -2247,6 +2281,12 @@ "webAuthnAuthenticate": { "message": "WebAuthn ಅನ್ನು ಪ್ರಮಾಣಿಕರಿಸು" }, + "readSecurityKey": { + "message": "Read security key" + }, + "awaitingSecurityKeyInteraction": { + "message": "Awaiting security key interaction..." + }, "hideEmail": { "message": "ಸ್ವೀಕರಿಸುವವರಿಂದ ನನ್ನ ಇಮೇಲ್ ವಿಳಾಸವನ್ನು ಮರೆಮಾಡಿ." }, @@ -3206,6 +3246,12 @@ "duoRequiredByOrgForAccount": { "message": "Duo two-step login is required for your account." }, + "duoTwoFactorRequiredPageSubtitle": { + "message": "Duo two-step login is required for your account. Follow the steps below to finish logging in." + }, + "followTheStepsBelowToFinishLoggingIn": { + "message": "Follow the steps below to finish logging in." + }, "launchDuo": { "message": "Launch Duo in Browser" }, @@ -3463,9 +3509,27 @@ "sshkeyApprovalTitle": { "message": "Confirm SSH key usage" }, + "agentForwardingWarningTitle": { + "message": "Warning: Agent Forwarding" + }, + "agentForwardingWarningText": { + "message": "This request comes from a remote device that you are logged into" + }, "sshkeyApprovalMessageInfix": { "message": "is requesting access to" }, + "sshkeyApprovalMessageSuffix": { + "message": "in order to" + }, + "sshActionLogin": { + "message": "authenticate to a server" + }, + "sshActionSign": { + "message": "sign a message" + }, + "sshActionGitSign": { + "message": "sign a git commit" + }, "unknownApplication": { "message": "An application" }, diff --git a/apps/desktop/src/locales/ko/messages.json b/apps/desktop/src/locales/ko/messages.json index ef9d69efacf..3a574ed1cde 100644 --- a/apps/desktop/src/locales/ko/messages.json +++ b/apps/desktop/src/locales/ko/messages.json @@ -652,6 +652,15 @@ "logInToBitwarden": { "message": "Bitwarden 로그인" }, + "enterTheCodeSentToYourEmail": { + "message": "Enter the code sent to your email" + }, + "enterTheCodeFromYourAuthenticatorApp": { + "message": "Enter the code from your authenticator app" + }, + "pressYourYubiKeyToAuthenticate": { + "message": "Press your YubiKey to authenticate" + }, "logInWithPasskey": { "message": "패스키로 로그인" }, @@ -704,6 +713,15 @@ "masterPassHintLabel": { "message": "Master password hint" }, + "passwordStrengthScore": { + "message": "Password strength score $SCORE$", + "placeholders": { + "score": { + "content": "$1", + "example": "4" + } + } + }, "joinOrganization": { "message": "Join organization" }, @@ -816,6 +834,9 @@ "webauthnCancelOrTimeout": { "message": "The authentication was cancelled or took too long. Please try again." }, + "openInNewTab": { + "message": "Open in new tab" + }, "invalidVerificationCode": { "message": "유효하지 않은 확인 코드" }, @@ -846,12 +867,22 @@ "rememberMe": { "message": "기억하기" }, + "dontAskAgainOnThisDeviceFor30Days": { + "message": "Don't ask again on this device for 30 days" + }, "sendVerificationCodeEmailAgain": { "message": "인증 코드 이메일 다시 보내기" }, "useAnotherTwoStepMethod": { "message": "다른 2단계 인증 사용" }, + "selectAnotherMethod": { + "message": "Select another method", + "description": "Select another two-step login method" + }, + "useYourRecoveryCode": { + "message": "Use your recovery code" + }, "insertYubiKey": { "message": "YubiKey를 컴퓨터의 USB 포트에 삽입하고 버튼을 누르세요." }, @@ -918,6 +949,9 @@ "twoStepOptions": { "message": "2단계 인증 옵션" }, + "selectTwoStepLoginMethod": { + "message": "Select two-step login method" + }, "selfHostedEnvironment": { "message": "자체 호스팅 환경" }, @@ -2247,6 +2281,12 @@ "webAuthnAuthenticate": { "message": "WebAuthn 인증" }, + "readSecurityKey": { + "message": "Read security key" + }, + "awaitingSecurityKeyInteraction": { + "message": "Awaiting security key interaction..." + }, "hideEmail": { "message": "받는 사람으로부터 나의 이메일 주소 숨기기" }, @@ -3206,6 +3246,12 @@ "duoRequiredByOrgForAccount": { "message": "Duo two-step login is required for your account." }, + "duoTwoFactorRequiredPageSubtitle": { + "message": "Duo two-step login is required for your account. Follow the steps below to finish logging in." + }, + "followTheStepsBelowToFinishLoggingIn": { + "message": "Follow the steps below to finish logging in." + }, "launchDuo": { "message": "Launch Duo in Browser" }, @@ -3463,9 +3509,27 @@ "sshkeyApprovalTitle": { "message": "Confirm SSH key usage" }, + "agentForwardingWarningTitle": { + "message": "Warning: Agent Forwarding" + }, + "agentForwardingWarningText": { + "message": "This request comes from a remote device that you are logged into" + }, "sshkeyApprovalMessageInfix": { "message": "is requesting access to" }, + "sshkeyApprovalMessageSuffix": { + "message": "in order to" + }, + "sshActionLogin": { + "message": "authenticate to a server" + }, + "sshActionSign": { + "message": "sign a message" + }, + "sshActionGitSign": { + "message": "sign a git commit" + }, "unknownApplication": { "message": "An application" }, diff --git a/apps/desktop/src/locales/lt/messages.json b/apps/desktop/src/locales/lt/messages.json index 2b124880774..3f1fcbcb514 100644 --- a/apps/desktop/src/locales/lt/messages.json +++ b/apps/desktop/src/locales/lt/messages.json @@ -652,6 +652,15 @@ "logInToBitwarden": { "message": "Log in to Bitwarden" }, + "enterTheCodeSentToYourEmail": { + "message": "Enter the code sent to your email" + }, + "enterTheCodeFromYourAuthenticatorApp": { + "message": "Enter the code from your authenticator app" + }, + "pressYourYubiKeyToAuthenticate": { + "message": "Press your YubiKey to authenticate" + }, "logInWithPasskey": { "message": "Log in with passkey" }, @@ -704,6 +713,15 @@ "masterPassHintLabel": { "message": "Master password hint" }, + "passwordStrengthScore": { + "message": "Password strength score $SCORE$", + "placeholders": { + "score": { + "content": "$1", + "example": "4" + } + } + }, "joinOrganization": { "message": "Join organization" }, @@ -816,6 +834,9 @@ "webauthnCancelOrTimeout": { "message": "The authentication was cancelled or took too long. Please try again." }, + "openInNewTab": { + "message": "Open in new tab" + }, "invalidVerificationCode": { "message": "Neteisingas patvirtinimo kodas" }, @@ -846,12 +867,22 @@ "rememberMe": { "message": "Prisiminti mane" }, + "dontAskAgainOnThisDeviceFor30Days": { + "message": "Don't ask again on this device for 30 days" + }, "sendVerificationCodeEmailAgain": { "message": "Pakartotinai atsiųsti patvirtinimo kodą el. paštu" }, "useAnotherTwoStepMethod": { "message": "Naudoti kitą dviejų žingsnių prisijungimo metodą" }, + "selectAnotherMethod": { + "message": "Select another method", + "description": "Select another two-step login method" + }, + "useYourRecoveryCode": { + "message": "Use your recovery code" + }, "insertYubiKey": { "message": "Įkiškite YubiKey į savo kompiuterio USB prievadą, tada palieskite jo mygtuką." }, @@ -918,6 +949,9 @@ "twoStepOptions": { "message": "Dviejų žingsnių prisijungimo parinktys" }, + "selectTwoStepLoginMethod": { + "message": "Select two-step login method" + }, "selfHostedEnvironment": { "message": "Savarankiškai sukurta aplinka" }, @@ -2247,6 +2281,12 @@ "webAuthnAuthenticate": { "message": "Autentifikuoti WebAuthn" }, + "readSecurityKey": { + "message": "Read security key" + }, + "awaitingSecurityKeyInteraction": { + "message": "Awaiting security key interaction..." + }, "hideEmail": { "message": "Slėpti mano el. pašto adresą nuo gavėjų." }, @@ -3206,6 +3246,12 @@ "duoRequiredByOrgForAccount": { "message": "Duo two-step login is required for your account." }, + "duoTwoFactorRequiredPageSubtitle": { + "message": "Duo two-step login is required for your account. Follow the steps below to finish logging in." + }, + "followTheStepsBelowToFinishLoggingIn": { + "message": "Follow the steps below to finish logging in." + }, "launchDuo": { "message": "Launch Duo in Browser" }, @@ -3463,9 +3509,27 @@ "sshkeyApprovalTitle": { "message": "Confirm SSH key usage" }, + "agentForwardingWarningTitle": { + "message": "Warning: Agent Forwarding" + }, + "agentForwardingWarningText": { + "message": "This request comes from a remote device that you are logged into" + }, "sshkeyApprovalMessageInfix": { "message": "is requesting access to" }, + "sshkeyApprovalMessageSuffix": { + "message": "in order to" + }, + "sshActionLogin": { + "message": "authenticate to a server" + }, + "sshActionSign": { + "message": "sign a message" + }, + "sshActionGitSign": { + "message": "sign a git commit" + }, "unknownApplication": { "message": "An application" }, diff --git a/apps/desktop/src/locales/lv/messages.json b/apps/desktop/src/locales/lv/messages.json index b51f0e523bb..839c1e49024 100644 --- a/apps/desktop/src/locales/lv/messages.json +++ b/apps/desktop/src/locales/lv/messages.json @@ -652,6 +652,15 @@ "logInToBitwarden": { "message": "Pieteikties Bitwarden" }, + "enterTheCodeSentToYourEmail": { + "message": "Jāievada e-pastā nosūtītais kods" + }, + "enterTheCodeFromYourAuthenticatorApp": { + "message": "Jāievada kods no savas autentificētājlietotnes" + }, + "pressYourYubiKeyToAuthenticate": { + "message": "Jāpiespiež sava YubiKey ierīce, lai autentificētu" + }, "logInWithPasskey": { "message": "Pieteikties ar piekļuves atslēgu" }, @@ -704,6 +713,15 @@ "masterPassHintLabel": { "message": "Galvenās paroles norāde" }, + "passwordStrengthScore": { + "message": "Paroles stipruma novērtējums $SCORE$", + "placeholders": { + "score": { + "content": "$1", + "example": "4" + } + } + }, "joinOrganization": { "message": "Pievienoties apvienībai" }, @@ -816,6 +834,9 @@ "webauthnCancelOrTimeout": { "message": "Autentifikācija tika atcelta vai tā aizņēma pārāk daudz laika. Lūgums mēģināt vēlreiz." }, + "openInNewTab": { + "message": "Atvērt jaunā cilnē" + }, "invalidVerificationCode": { "message": "Nederīgs apstiprinājuma kods" }, @@ -846,12 +867,22 @@ "rememberMe": { "message": "Atcerēties mani" }, + "dontAskAgainOnThisDeviceFor30Days": { + "message": "Šajā ierīcē 30 dienas vairs nevaicāt" + }, "sendVerificationCodeEmailAgain": { "message": "Sūtīt apstiprinājuma koda e-pastu vēlreiz" }, "useAnotherTwoStepMethod": { "message": "Izmantot citu divpakāpju pieteikšanās veidu" }, + "selectAnotherMethod": { + "message": "Atlasīt citu veidu", + "description": "Select another two-step login method" + }, + "useYourRecoveryCode": { + "message": "Izmantot savu atkopes kodu" + }, "insertYubiKey": { "message": "Ievieto savu YubiKey datora USB ligzdā un pieskaries tā pogai!" }, @@ -918,6 +949,9 @@ "twoStepOptions": { "message": "Divpakāpju pieteikšanās iespējas" }, + "selectTwoStepLoginMethod": { + "message": "Atlasīt divpakāpju pieteikšanās veidu" + }, "selfHostedEnvironment": { "message": "Pašuzturēta vide" }, @@ -2247,6 +2281,12 @@ "webAuthnAuthenticate": { "message": "Autentificēt WebAuthn" }, + "readSecurityKey": { + "message": "Nolasīt drošības atslēgu" + }, + "awaitingSecurityKeyInteraction": { + "message": "Gaida mijiedarbību ar drošības atslēgu..." + }, "hideEmail": { "message": "Slēpt e-pasta adresi no saņēmējiem." }, @@ -3206,6 +3246,12 @@ "duoRequiredByOrgForAccount": { "message": "Kontam ir nepieciešama Duo divpakāpju pieteikšanās." }, + "duoTwoFactorRequiredPageSubtitle": { + "message": "Ir nepieciešama Duo divpakāpju pieteikšanās, lai pieteiktos savā kontā. Jāseko zemāk esošajām norādēm, lai pabeigtu pieteikšanos." + }, + "followTheStepsBelowToFinishLoggingIn": { + "message": "Jāseko zemāk esošajām norādēm, lai pabeigtu pieteikšanos." + }, "launchDuo": { "message": "Palaist Duo pārlūkā" }, @@ -3463,9 +3509,27 @@ "sshkeyApprovalTitle": { "message": "Apstiprināt SSH atslēgas lietojumu" }, + "agentForwardingWarningTitle": { + "message": "Brīdinājums: aģenta pārsūtīšana" + }, + "agentForwardingWarningText": { + "message": "Šis pieprasījums nāk no attālas ierīces, kurā esi pieteicies" + }, "sshkeyApprovalMessageInfix": { "message": "pieprasa piekļuvi" }, + "sshkeyApprovalMessageSuffix": { + "message": ", lai varētu" + }, + "sshActionLogin": { + "message": "autentificēt serverī" + }, + "sshActionSign": { + "message": "parakstīt ziņojumu" + }, + "sshActionGitSign": { + "message": "parakstīt git iesūtījumu" + }, "unknownApplication": { "message": "Lietotne" }, diff --git a/apps/desktop/src/locales/me/messages.json b/apps/desktop/src/locales/me/messages.json index 590d5a1b8ab..e88915f4054 100644 --- a/apps/desktop/src/locales/me/messages.json +++ b/apps/desktop/src/locales/me/messages.json @@ -652,6 +652,15 @@ "logInToBitwarden": { "message": "Log in to Bitwarden" }, + "enterTheCodeSentToYourEmail": { + "message": "Enter the code sent to your email" + }, + "enterTheCodeFromYourAuthenticatorApp": { + "message": "Enter the code from your authenticator app" + }, + "pressYourYubiKeyToAuthenticate": { + "message": "Press your YubiKey to authenticate" + }, "logInWithPasskey": { "message": "Log in with passkey" }, @@ -704,6 +713,15 @@ "masterPassHintLabel": { "message": "Master password hint" }, + "passwordStrengthScore": { + "message": "Password strength score $SCORE$", + "placeholders": { + "score": { + "content": "$1", + "example": "4" + } + } + }, "joinOrganization": { "message": "Join organization" }, @@ -816,6 +834,9 @@ "webauthnCancelOrTimeout": { "message": "The authentication was cancelled or took too long. Please try again." }, + "openInNewTab": { + "message": "Open in new tab" + }, "invalidVerificationCode": { "message": "Invalid verification code" }, @@ -846,12 +867,22 @@ "rememberMe": { "message": "Zapamti me" }, + "dontAskAgainOnThisDeviceFor30Days": { + "message": "Don't ask again on this device for 30 days" + }, "sendVerificationCodeEmailAgain": { "message": "Pošalji ponovo verifikacioni kod na email" }, "useAnotherTwoStepMethod": { "message": "Koristi drugi metod prijave u dva koraka" }, + "selectAnotherMethod": { + "message": "Select another method", + "description": "Select another two-step login method" + }, + "useYourRecoveryCode": { + "message": "Use your recovery code" + }, "insertYubiKey": { "message": "Priključi svoj YubiKey u USB port na kompjuteru i onda takni njegovo dugme." }, @@ -918,6 +949,9 @@ "twoStepOptions": { "message": "Opcije prijave u dva koraka" }, + "selectTwoStepLoginMethod": { + "message": "Select two-step login method" + }, "selfHostedEnvironment": { "message": "Okruženje lokalne instalacije (SELF HOST)" }, @@ -2247,6 +2281,12 @@ "webAuthnAuthenticate": { "message": "Authenticate WebAuthn" }, + "readSecurityKey": { + "message": "Read security key" + }, + "awaitingSecurityKeyInteraction": { + "message": "Awaiting security key interaction..." + }, "hideEmail": { "message": "Hide my email address from recipients." }, @@ -3206,6 +3246,12 @@ "duoRequiredByOrgForAccount": { "message": "Duo two-step login is required for your account." }, + "duoTwoFactorRequiredPageSubtitle": { + "message": "Duo two-step login is required for your account. Follow the steps below to finish logging in." + }, + "followTheStepsBelowToFinishLoggingIn": { + "message": "Follow the steps below to finish logging in." + }, "launchDuo": { "message": "Launch Duo in Browser" }, @@ -3463,9 +3509,27 @@ "sshkeyApprovalTitle": { "message": "Confirm SSH key usage" }, + "agentForwardingWarningTitle": { + "message": "Warning: Agent Forwarding" + }, + "agentForwardingWarningText": { + "message": "This request comes from a remote device that you are logged into" + }, "sshkeyApprovalMessageInfix": { "message": "is requesting access to" }, + "sshkeyApprovalMessageSuffix": { + "message": "in order to" + }, + "sshActionLogin": { + "message": "authenticate to a server" + }, + "sshActionSign": { + "message": "sign a message" + }, + "sshActionGitSign": { + "message": "sign a git commit" + }, "unknownApplication": { "message": "An application" }, diff --git a/apps/desktop/src/locales/ml/messages.json b/apps/desktop/src/locales/ml/messages.json index ef2c81ea238..654a8dcb1e2 100644 --- a/apps/desktop/src/locales/ml/messages.json +++ b/apps/desktop/src/locales/ml/messages.json @@ -652,6 +652,15 @@ "logInToBitwarden": { "message": "Log in to Bitwarden" }, + "enterTheCodeSentToYourEmail": { + "message": "Enter the code sent to your email" + }, + "enterTheCodeFromYourAuthenticatorApp": { + "message": "Enter the code from your authenticator app" + }, + "pressYourYubiKeyToAuthenticate": { + "message": "Press your YubiKey to authenticate" + }, "logInWithPasskey": { "message": "Log in with passkey" }, @@ -704,6 +713,15 @@ "masterPassHintLabel": { "message": "Master password hint" }, + "passwordStrengthScore": { + "message": "Password strength score $SCORE$", + "placeholders": { + "score": { + "content": "$1", + "example": "4" + } + } + }, "joinOrganization": { "message": "Join organization" }, @@ -816,6 +834,9 @@ "webauthnCancelOrTimeout": { "message": "The authentication was cancelled or took too long. Please try again." }, + "openInNewTab": { + "message": "Open in new tab" + }, "invalidVerificationCode": { "message": "Invalid verification code" }, @@ -846,12 +867,22 @@ "rememberMe": { "message": "എന്നെ ഓർക്കണം" }, + "dontAskAgainOnThisDeviceFor30Days": { + "message": "Don't ask again on this device for 30 days" + }, "sendVerificationCodeEmailAgain": { "message": "സ്ഥിരീകരണ കോഡ് ഇമെയിൽ വഴി വീണ്ടും അയയ്ക്കുക" }, "useAnotherTwoStepMethod": { "message": "മറ്റൊരു രണ്ട് ഘട്ട പ്രവേശന രീതി ഉപയോഗിക്കുക" }, + "selectAnotherMethod": { + "message": "Select another method", + "description": "Select another two-step login method" + }, + "useYourRecoveryCode": { + "message": "Use your recovery code" + }, "insertYubiKey": { "message": "നിങ്ങളുടെ കമ്പ്യൂട്ടറിന്റെ യു‌എസ്‌ബി പോർട്ടിലേക്ക് YubiKey ഇടുക, തുടർന്ന് അതിന്റെ ബട്ടൺ അമർത്തുക." }, @@ -918,6 +949,9 @@ "twoStepOptions": { "message": "രണ്ട്-ഘട്ട പ്രവേശനം ഓപ്ഷനുകൾ" }, + "selectTwoStepLoginMethod": { + "message": "Select two-step login method" + }, "selfHostedEnvironment": { "message": "സ്വയം ഹോസ്റ്റുചെയ്‌ത എൻവിയോണ്മെന്റ്" }, @@ -2247,6 +2281,12 @@ "webAuthnAuthenticate": { "message": "Authenticate WebAuthn" }, + "readSecurityKey": { + "message": "Read security key" + }, + "awaitingSecurityKeyInteraction": { + "message": "Awaiting security key interaction..." + }, "hideEmail": { "message": "Hide my email address from recipients." }, @@ -3206,6 +3246,12 @@ "duoRequiredByOrgForAccount": { "message": "Duo two-step login is required for your account." }, + "duoTwoFactorRequiredPageSubtitle": { + "message": "Duo two-step login is required for your account. Follow the steps below to finish logging in." + }, + "followTheStepsBelowToFinishLoggingIn": { + "message": "Follow the steps below to finish logging in." + }, "launchDuo": { "message": "Launch Duo in Browser" }, @@ -3463,9 +3509,27 @@ "sshkeyApprovalTitle": { "message": "Confirm SSH key usage" }, + "agentForwardingWarningTitle": { + "message": "Warning: Agent Forwarding" + }, + "agentForwardingWarningText": { + "message": "This request comes from a remote device that you are logged into" + }, "sshkeyApprovalMessageInfix": { "message": "is requesting access to" }, + "sshkeyApprovalMessageSuffix": { + "message": "in order to" + }, + "sshActionLogin": { + "message": "authenticate to a server" + }, + "sshActionSign": { + "message": "sign a message" + }, + "sshActionGitSign": { + "message": "sign a git commit" + }, "unknownApplication": { "message": "An application" }, diff --git a/apps/desktop/src/locales/mr/messages.json b/apps/desktop/src/locales/mr/messages.json index 1aa61a9b381..b7693c0d0b5 100644 --- a/apps/desktop/src/locales/mr/messages.json +++ b/apps/desktop/src/locales/mr/messages.json @@ -652,6 +652,15 @@ "logInToBitwarden": { "message": "Log in to Bitwarden" }, + "enterTheCodeSentToYourEmail": { + "message": "Enter the code sent to your email" + }, + "enterTheCodeFromYourAuthenticatorApp": { + "message": "Enter the code from your authenticator app" + }, + "pressYourYubiKeyToAuthenticate": { + "message": "Press your YubiKey to authenticate" + }, "logInWithPasskey": { "message": "Log in with passkey" }, @@ -704,6 +713,15 @@ "masterPassHintLabel": { "message": "Master password hint" }, + "passwordStrengthScore": { + "message": "Password strength score $SCORE$", + "placeholders": { + "score": { + "content": "$1", + "example": "4" + } + } + }, "joinOrganization": { "message": "Join organization" }, @@ -816,6 +834,9 @@ "webauthnCancelOrTimeout": { "message": "The authentication was cancelled or took too long. Please try again." }, + "openInNewTab": { + "message": "Open in new tab" + }, "invalidVerificationCode": { "message": "Invalid verification code" }, @@ -846,12 +867,22 @@ "rememberMe": { "message": "Remember me" }, + "dontAskAgainOnThisDeviceFor30Days": { + "message": "Don't ask again on this device for 30 days" + }, "sendVerificationCodeEmailAgain": { "message": "Send verification code email again" }, "useAnotherTwoStepMethod": { "message": "Use another two-step login method" }, + "selectAnotherMethod": { + "message": "Select another method", + "description": "Select another two-step login method" + }, + "useYourRecoveryCode": { + "message": "Use your recovery code" + }, "insertYubiKey": { "message": "Insert your YubiKey into your computer's USB port, then touch its button." }, @@ -918,6 +949,9 @@ "twoStepOptions": { "message": "Two-step login options" }, + "selectTwoStepLoginMethod": { + "message": "Select two-step login method" + }, "selfHostedEnvironment": { "message": "Self-hosted environment" }, @@ -2247,6 +2281,12 @@ "webAuthnAuthenticate": { "message": "Authenticate WebAuthn" }, + "readSecurityKey": { + "message": "Read security key" + }, + "awaitingSecurityKeyInteraction": { + "message": "Awaiting security key interaction..." + }, "hideEmail": { "message": "Hide my email address from recipients." }, @@ -3206,6 +3246,12 @@ "duoRequiredByOrgForAccount": { "message": "Duo two-step login is required for your account." }, + "duoTwoFactorRequiredPageSubtitle": { + "message": "Duo two-step login is required for your account. Follow the steps below to finish logging in." + }, + "followTheStepsBelowToFinishLoggingIn": { + "message": "Follow the steps below to finish logging in." + }, "launchDuo": { "message": "Launch Duo in Browser" }, @@ -3463,9 +3509,27 @@ "sshkeyApprovalTitle": { "message": "Confirm SSH key usage" }, + "agentForwardingWarningTitle": { + "message": "Warning: Agent Forwarding" + }, + "agentForwardingWarningText": { + "message": "This request comes from a remote device that you are logged into" + }, "sshkeyApprovalMessageInfix": { "message": "is requesting access to" }, + "sshkeyApprovalMessageSuffix": { + "message": "in order to" + }, + "sshActionLogin": { + "message": "authenticate to a server" + }, + "sshActionSign": { + "message": "sign a message" + }, + "sshActionGitSign": { + "message": "sign a git commit" + }, "unknownApplication": { "message": "An application" }, diff --git a/apps/desktop/src/locales/my/messages.json b/apps/desktop/src/locales/my/messages.json index a86ab9e5009..26bd06f68bb 100644 --- a/apps/desktop/src/locales/my/messages.json +++ b/apps/desktop/src/locales/my/messages.json @@ -652,6 +652,15 @@ "logInToBitwarden": { "message": "Log in to Bitwarden" }, + "enterTheCodeSentToYourEmail": { + "message": "Enter the code sent to your email" + }, + "enterTheCodeFromYourAuthenticatorApp": { + "message": "Enter the code from your authenticator app" + }, + "pressYourYubiKeyToAuthenticate": { + "message": "Press your YubiKey to authenticate" + }, "logInWithPasskey": { "message": "Log in with passkey" }, @@ -704,6 +713,15 @@ "masterPassHintLabel": { "message": "Master password hint" }, + "passwordStrengthScore": { + "message": "Password strength score $SCORE$", + "placeholders": { + "score": { + "content": "$1", + "example": "4" + } + } + }, "joinOrganization": { "message": "Join organization" }, @@ -816,6 +834,9 @@ "webauthnCancelOrTimeout": { "message": "The authentication was cancelled or took too long. Please try again." }, + "openInNewTab": { + "message": "Open in new tab" + }, "invalidVerificationCode": { "message": "Invalid verification code" }, @@ -846,12 +867,22 @@ "rememberMe": { "message": "Remember me" }, + "dontAskAgainOnThisDeviceFor30Days": { + "message": "Don't ask again on this device for 30 days" + }, "sendVerificationCodeEmailAgain": { "message": "Send verification code email again" }, "useAnotherTwoStepMethod": { "message": "Use another two-step login method" }, + "selectAnotherMethod": { + "message": "Select another method", + "description": "Select another two-step login method" + }, + "useYourRecoveryCode": { + "message": "Use your recovery code" + }, "insertYubiKey": { "message": "Insert your YubiKey into your computer's USB port, then touch its button." }, @@ -918,6 +949,9 @@ "twoStepOptions": { "message": "Two-step login options" }, + "selectTwoStepLoginMethod": { + "message": "Select two-step login method" + }, "selfHostedEnvironment": { "message": "Self-hosted environment" }, @@ -2247,6 +2281,12 @@ "webAuthnAuthenticate": { "message": "Authenticate WebAuthn" }, + "readSecurityKey": { + "message": "Read security key" + }, + "awaitingSecurityKeyInteraction": { + "message": "Awaiting security key interaction..." + }, "hideEmail": { "message": "Hide my email address from recipients." }, @@ -3206,6 +3246,12 @@ "duoRequiredByOrgForAccount": { "message": "Duo two-step login is required for your account." }, + "duoTwoFactorRequiredPageSubtitle": { + "message": "Duo two-step login is required for your account. Follow the steps below to finish logging in." + }, + "followTheStepsBelowToFinishLoggingIn": { + "message": "Follow the steps below to finish logging in." + }, "launchDuo": { "message": "Launch Duo in Browser" }, @@ -3463,9 +3509,27 @@ "sshkeyApprovalTitle": { "message": "Confirm SSH key usage" }, + "agentForwardingWarningTitle": { + "message": "Warning: Agent Forwarding" + }, + "agentForwardingWarningText": { + "message": "This request comes from a remote device that you are logged into" + }, "sshkeyApprovalMessageInfix": { "message": "is requesting access to" }, + "sshkeyApprovalMessageSuffix": { + "message": "in order to" + }, + "sshActionLogin": { + "message": "authenticate to a server" + }, + "sshActionSign": { + "message": "sign a message" + }, + "sshActionGitSign": { + "message": "sign a git commit" + }, "unknownApplication": { "message": "An application" }, diff --git a/apps/desktop/src/locales/nb/messages.json b/apps/desktop/src/locales/nb/messages.json index c4ab8794dcf..e85c4699d9d 100644 --- a/apps/desktop/src/locales/nb/messages.json +++ b/apps/desktop/src/locales/nb/messages.json @@ -652,6 +652,15 @@ "logInToBitwarden": { "message": "Logg inn på Bitwarden" }, + "enterTheCodeSentToYourEmail": { + "message": "Enter the code sent to your email" + }, + "enterTheCodeFromYourAuthenticatorApp": { + "message": "Enter the code from your authenticator app" + }, + "pressYourYubiKeyToAuthenticate": { + "message": "Press your YubiKey to authenticate" + }, "logInWithPasskey": { "message": "Logg inn med passnøkkel" }, @@ -704,6 +713,15 @@ "masterPassHintLabel": { "message": "Hint til hovedpassord" }, + "passwordStrengthScore": { + "message": "Password strength score $SCORE$", + "placeholders": { + "score": { + "content": "$1", + "example": "4" + } + } + }, "joinOrganization": { "message": "Bli med i organisasjon" }, @@ -816,6 +834,9 @@ "webauthnCancelOrTimeout": { "message": "Autentiseringen ble avbrutt eller tok for lang tid. Prøv igjen." }, + "openInNewTab": { + "message": "Open in new tab" + }, "invalidVerificationCode": { "message": "Ugyldig verifiseringskode" }, @@ -846,12 +867,22 @@ "rememberMe": { "message": "Husk på meg" }, + "dontAskAgainOnThisDeviceFor30Days": { + "message": "Don't ask again on this device for 30 days" + }, "sendVerificationCodeEmailAgain": { "message": "Send E-posten med verifiseringskoden på nytt" }, "useAnotherTwoStepMethod": { "message": "Bruk en annen 2-trinnsinnloggingsmetode" }, + "selectAnotherMethod": { + "message": "Select another method", + "description": "Select another two-step login method" + }, + "useYourRecoveryCode": { + "message": "Use your recovery code" + }, "insertYubiKey": { "message": "Sett inn din YubiKey i din datamaskins USB-uttak, og så trykk på dens knapp." }, @@ -918,6 +949,9 @@ "twoStepOptions": { "message": "Totrinns innloggingsalternativer" }, + "selectTwoStepLoginMethod": { + "message": "Select two-step login method" + }, "selfHostedEnvironment": { "message": "Selvbetjent miljø" }, @@ -2247,6 +2281,12 @@ "webAuthnAuthenticate": { "message": "Autentiser WebAuthn" }, + "readSecurityKey": { + "message": "Read security key" + }, + "awaitingSecurityKeyInteraction": { + "message": "Awaiting security key interaction..." + }, "hideEmail": { "message": "Skjul min e-postadresse fra mottakere." }, @@ -3206,6 +3246,12 @@ "duoRequiredByOrgForAccount": { "message": "Duo two-step login is required for your account." }, + "duoTwoFactorRequiredPageSubtitle": { + "message": "Duo two-step login is required for your account. Follow the steps below to finish logging in." + }, + "followTheStepsBelowToFinishLoggingIn": { + "message": "Follow the steps below to finish logging in." + }, "launchDuo": { "message": "Launch Duo in Browser" }, @@ -3463,9 +3509,27 @@ "sshkeyApprovalTitle": { "message": "Confirm SSH key usage" }, + "agentForwardingWarningTitle": { + "message": "Warning: Agent Forwarding" + }, + "agentForwardingWarningText": { + "message": "This request comes from a remote device that you are logged into" + }, "sshkeyApprovalMessageInfix": { "message": "is requesting access to" }, + "sshkeyApprovalMessageSuffix": { + "message": "in order to" + }, + "sshActionLogin": { + "message": "authenticate to a server" + }, + "sshActionSign": { + "message": "sign a message" + }, + "sshActionGitSign": { + "message": "sign a git commit" + }, "unknownApplication": { "message": "Et program" }, diff --git a/apps/desktop/src/locales/ne/messages.json b/apps/desktop/src/locales/ne/messages.json index 90e4967f7a3..88614d22267 100644 --- a/apps/desktop/src/locales/ne/messages.json +++ b/apps/desktop/src/locales/ne/messages.json @@ -652,6 +652,15 @@ "logInToBitwarden": { "message": "Log in to Bitwarden" }, + "enterTheCodeSentToYourEmail": { + "message": "Enter the code sent to your email" + }, + "enterTheCodeFromYourAuthenticatorApp": { + "message": "Enter the code from your authenticator app" + }, + "pressYourYubiKeyToAuthenticate": { + "message": "Press your YubiKey to authenticate" + }, "logInWithPasskey": { "message": "Log in with passkey" }, @@ -704,6 +713,15 @@ "masterPassHintLabel": { "message": "Master password hint" }, + "passwordStrengthScore": { + "message": "Password strength score $SCORE$", + "placeholders": { + "score": { + "content": "$1", + "example": "4" + } + } + }, "joinOrganization": { "message": "Join organization" }, @@ -816,6 +834,9 @@ "webauthnCancelOrTimeout": { "message": "The authentication was cancelled or took too long. Please try again." }, + "openInNewTab": { + "message": "Open in new tab" + }, "invalidVerificationCode": { "message": "Invalid verification code" }, @@ -846,12 +867,22 @@ "rememberMe": { "message": "Remember me" }, + "dontAskAgainOnThisDeviceFor30Days": { + "message": "Don't ask again on this device for 30 days" + }, "sendVerificationCodeEmailAgain": { "message": "Send verification code email again" }, "useAnotherTwoStepMethod": { "message": "Use another two-step login method" }, + "selectAnotherMethod": { + "message": "Select another method", + "description": "Select another two-step login method" + }, + "useYourRecoveryCode": { + "message": "Use your recovery code" + }, "insertYubiKey": { "message": "Insert your YubiKey into your computer's USB port, then touch its button." }, @@ -918,6 +949,9 @@ "twoStepOptions": { "message": "Two-step login options" }, + "selectTwoStepLoginMethod": { + "message": "Select two-step login method" + }, "selfHostedEnvironment": { "message": "Self-hosted environment" }, @@ -2247,6 +2281,12 @@ "webAuthnAuthenticate": { "message": "Authenticate WebAuthn" }, + "readSecurityKey": { + "message": "Read security key" + }, + "awaitingSecurityKeyInteraction": { + "message": "Awaiting security key interaction..." + }, "hideEmail": { "message": "Hide my email address from recipients." }, @@ -3206,6 +3246,12 @@ "duoRequiredByOrgForAccount": { "message": "Duo two-step login is required for your account." }, + "duoTwoFactorRequiredPageSubtitle": { + "message": "Duo two-step login is required for your account. Follow the steps below to finish logging in." + }, + "followTheStepsBelowToFinishLoggingIn": { + "message": "Follow the steps below to finish logging in." + }, "launchDuo": { "message": "Launch Duo in Browser" }, @@ -3463,9 +3509,27 @@ "sshkeyApprovalTitle": { "message": "Confirm SSH key usage" }, + "agentForwardingWarningTitle": { + "message": "Warning: Agent Forwarding" + }, + "agentForwardingWarningText": { + "message": "This request comes from a remote device that you are logged into" + }, "sshkeyApprovalMessageInfix": { "message": "is requesting access to" }, + "sshkeyApprovalMessageSuffix": { + "message": "in order to" + }, + "sshActionLogin": { + "message": "authenticate to a server" + }, + "sshActionSign": { + "message": "sign a message" + }, + "sshActionGitSign": { + "message": "sign a git commit" + }, "unknownApplication": { "message": "An application" }, diff --git a/apps/desktop/src/locales/nl/messages.json b/apps/desktop/src/locales/nl/messages.json index 5093a5d0d8b..a3c208d24b3 100644 --- a/apps/desktop/src/locales/nl/messages.json +++ b/apps/desktop/src/locales/nl/messages.json @@ -652,6 +652,15 @@ "logInToBitwarden": { "message": "Inloggen op Bitwarden" }, + "enterTheCodeSentToYourEmail": { + "message": "Voer de code in die naar je e-mailadres is verstuurd" + }, + "enterTheCodeFromYourAuthenticatorApp": { + "message": "Voer de code uit je authenticatie-app in" + }, + "pressYourYubiKeyToAuthenticate": { + "message": "Druk op je YubiKey om te verifiëren" + }, "logInWithPasskey": { "message": "Inloggen met passkey" }, @@ -704,6 +713,15 @@ "masterPassHintLabel": { "message": "Hoofdwachtwoordhint" }, + "passwordStrengthScore": { + "message": "Score wachtwoordsterkte $SCORE$", + "placeholders": { + "score": { + "content": "$1", + "example": "4" + } + } + }, "joinOrganization": { "message": "Join organisatie" }, @@ -816,6 +834,9 @@ "webauthnCancelOrTimeout": { "message": "De authenticatie werd geannuleerd of duurde te lang. Probeer het opnieuw." }, + "openInNewTab": { + "message": "Openen in nieuwe tab" + }, "invalidVerificationCode": { "message": "Ongeldige verificatiecode" }, @@ -846,12 +867,22 @@ "rememberMe": { "message": "Mijn gegevens onthouden" }, + "dontAskAgainOnThisDeviceFor30Days": { + "message": "30 dagen niet meer vragen op dit apparaat" + }, "sendVerificationCodeEmailAgain": { "message": "E-mail met verificatiecode opnieuw versturen" }, "useAnotherTwoStepMethod": { "message": "Gebruik een andere methode voor tweestapsaanmelding" }, + "selectAnotherMethod": { + "message": "Kies een andere methode", + "description": "Select another two-step login method" + }, + "useYourRecoveryCode": { + "message": "Gebruik je herstelcode" + }, "insertYubiKey": { "message": "Plaats je YubiKey in de USB-poort van je computer en druk op de knop." }, @@ -918,6 +949,9 @@ "twoStepOptions": { "message": "Opties voor tweestapsaanmelding" }, + "selectTwoStepLoginMethod": { + "message": "Kies methode voor tweestapsaanmelding" + }, "selfHostedEnvironment": { "message": "Zelfgehoste omgeving" }, @@ -2247,6 +2281,12 @@ "webAuthnAuthenticate": { "message": "Verifieer WebAuthn" }, + "readSecurityKey": { + "message": "Beveiligingssleutel lezen" + }, + "awaitingSecurityKeyInteraction": { + "message": "Wacht op interactie met beveiligingssleutel..." + }, "hideEmail": { "message": "Verberg mijn e-mailadres voor ontvangers." }, @@ -3206,6 +3246,12 @@ "duoRequiredByOrgForAccount": { "message": "Jouw account vereist Duo-tweestapsaanmelding." }, + "duoTwoFactorRequiredPageSubtitle": { + "message": "Jouw account vereist Duo-tweestapsaanmelding. Volg de onderstaande stappen om het inloggen te voltooien." + }, + "followTheStepsBelowToFinishLoggingIn": { + "message": "Volg de onderstaande stappen om in te loggen." + }, "launchDuo": { "message": "Start Duo in browser" }, @@ -3463,9 +3509,27 @@ "sshkeyApprovalTitle": { "message": "Gebruik SSH-sleutel bevestigen" }, + "agentForwardingWarningTitle": { + "message": "Waarschuwing: Agent doorsturen" + }, + "agentForwardingWarningText": { + "message": "Dit verzoek komt van een extern apparaat waarop je bent ingelogd" + }, "sshkeyApprovalMessageInfix": { "message": "vraagt toegang tot" }, + "sshkeyApprovalMessageSuffix": { + "message": "om te" + }, + "sshActionLogin": { + "message": "autenticeer naar een server" + }, + "sshActionSign": { + "message": "een bericht te ondertekenen" + }, + "sshActionGitSign": { + "message": "een git-commit te ondertekenen" + }, "unknownApplication": { "message": "Een applicatie" }, diff --git a/apps/desktop/src/locales/nn/messages.json b/apps/desktop/src/locales/nn/messages.json index ac06feb9a12..a961d2c8364 100644 --- a/apps/desktop/src/locales/nn/messages.json +++ b/apps/desktop/src/locales/nn/messages.json @@ -652,6 +652,15 @@ "logInToBitwarden": { "message": "Log in to Bitwarden" }, + "enterTheCodeSentToYourEmail": { + "message": "Enter the code sent to your email" + }, + "enterTheCodeFromYourAuthenticatorApp": { + "message": "Enter the code from your authenticator app" + }, + "pressYourYubiKeyToAuthenticate": { + "message": "Press your YubiKey to authenticate" + }, "logInWithPasskey": { "message": "Log in with passkey" }, @@ -704,6 +713,15 @@ "masterPassHintLabel": { "message": "Master password hint" }, + "passwordStrengthScore": { + "message": "Password strength score $SCORE$", + "placeholders": { + "score": { + "content": "$1", + "example": "4" + } + } + }, "joinOrganization": { "message": "Join organization" }, @@ -816,6 +834,9 @@ "webauthnCancelOrTimeout": { "message": "The authentication was cancelled or took too long. Please try again." }, + "openInNewTab": { + "message": "Open in new tab" + }, "invalidVerificationCode": { "message": "Ugyldig stadfestingskode" }, @@ -846,12 +867,22 @@ "rememberMe": { "message": "Husk meg" }, + "dontAskAgainOnThisDeviceFor30Days": { + "message": "Don't ask again on this device for 30 days" + }, "sendVerificationCodeEmailAgain": { "message": "Send e-post om stadfestingskode på nytt" }, "useAnotherTwoStepMethod": { "message": "Use another two-step login method" }, + "selectAnotherMethod": { + "message": "Select another method", + "description": "Select another two-step login method" + }, + "useYourRecoveryCode": { + "message": "Use your recovery code" + }, "insertYubiKey": { "message": "Insert your YubiKey into your computer's USB port, then touch its button." }, @@ -918,6 +949,9 @@ "twoStepOptions": { "message": "Two-step login options" }, + "selectTwoStepLoginMethod": { + "message": "Select two-step login method" + }, "selfHostedEnvironment": { "message": "Self-hosted environment" }, @@ -2247,6 +2281,12 @@ "webAuthnAuthenticate": { "message": "Authenticate WebAuthn" }, + "readSecurityKey": { + "message": "Read security key" + }, + "awaitingSecurityKeyInteraction": { + "message": "Awaiting security key interaction..." + }, "hideEmail": { "message": "Hide my email address from recipients." }, @@ -3206,6 +3246,12 @@ "duoRequiredByOrgForAccount": { "message": "Duo two-step login is required for your account." }, + "duoTwoFactorRequiredPageSubtitle": { + "message": "Duo two-step login is required for your account. Follow the steps below to finish logging in." + }, + "followTheStepsBelowToFinishLoggingIn": { + "message": "Follow the steps below to finish logging in." + }, "launchDuo": { "message": "Launch Duo in Browser" }, @@ -3463,9 +3509,27 @@ "sshkeyApprovalTitle": { "message": "Confirm SSH key usage" }, + "agentForwardingWarningTitle": { + "message": "Warning: Agent Forwarding" + }, + "agentForwardingWarningText": { + "message": "This request comes from a remote device that you are logged into" + }, "sshkeyApprovalMessageInfix": { "message": "is requesting access to" }, + "sshkeyApprovalMessageSuffix": { + "message": "in order to" + }, + "sshActionLogin": { + "message": "authenticate to a server" + }, + "sshActionSign": { + "message": "sign a message" + }, + "sshActionGitSign": { + "message": "sign a git commit" + }, "unknownApplication": { "message": "An application" }, diff --git a/apps/desktop/src/locales/or/messages.json b/apps/desktop/src/locales/or/messages.json index c18b4939e19..a175531b182 100644 --- a/apps/desktop/src/locales/or/messages.json +++ b/apps/desktop/src/locales/or/messages.json @@ -652,6 +652,15 @@ "logInToBitwarden": { "message": "Log in to Bitwarden" }, + "enterTheCodeSentToYourEmail": { + "message": "Enter the code sent to your email" + }, + "enterTheCodeFromYourAuthenticatorApp": { + "message": "Enter the code from your authenticator app" + }, + "pressYourYubiKeyToAuthenticate": { + "message": "Press your YubiKey to authenticate" + }, "logInWithPasskey": { "message": "Log in with passkey" }, @@ -704,6 +713,15 @@ "masterPassHintLabel": { "message": "Master password hint" }, + "passwordStrengthScore": { + "message": "Password strength score $SCORE$", + "placeholders": { + "score": { + "content": "$1", + "example": "4" + } + } + }, "joinOrganization": { "message": "Join organization" }, @@ -816,6 +834,9 @@ "webauthnCancelOrTimeout": { "message": "The authentication was cancelled or took too long. Please try again." }, + "openInNewTab": { + "message": "Open in new tab" + }, "invalidVerificationCode": { "message": "Invalid verification code" }, @@ -846,12 +867,22 @@ "rememberMe": { "message": "Remember me" }, + "dontAskAgainOnThisDeviceFor30Days": { + "message": "Don't ask again on this device for 30 days" + }, "sendVerificationCodeEmailAgain": { "message": "Send verification code email again" }, "useAnotherTwoStepMethod": { "message": "Use another two-step login method" }, + "selectAnotherMethod": { + "message": "Select another method", + "description": "Select another two-step login method" + }, + "useYourRecoveryCode": { + "message": "Use your recovery code" + }, "insertYubiKey": { "message": "Insert your YubiKey into your computer's USB port, then touch its button." }, @@ -918,6 +949,9 @@ "twoStepOptions": { "message": "Two-step login options" }, + "selectTwoStepLoginMethod": { + "message": "Select two-step login method" + }, "selfHostedEnvironment": { "message": "Self-hosted environment" }, @@ -2247,6 +2281,12 @@ "webAuthnAuthenticate": { "message": "Authenticate WebAuthn" }, + "readSecurityKey": { + "message": "Read security key" + }, + "awaitingSecurityKeyInteraction": { + "message": "Awaiting security key interaction..." + }, "hideEmail": { "message": "Hide my email address from recipients." }, @@ -3206,6 +3246,12 @@ "duoRequiredByOrgForAccount": { "message": "Duo two-step login is required for your account." }, + "duoTwoFactorRequiredPageSubtitle": { + "message": "Duo two-step login is required for your account. Follow the steps below to finish logging in." + }, + "followTheStepsBelowToFinishLoggingIn": { + "message": "Follow the steps below to finish logging in." + }, "launchDuo": { "message": "Launch Duo in Browser" }, @@ -3463,9 +3509,27 @@ "sshkeyApprovalTitle": { "message": "Confirm SSH key usage" }, + "agentForwardingWarningTitle": { + "message": "Warning: Agent Forwarding" + }, + "agentForwardingWarningText": { + "message": "This request comes from a remote device that you are logged into" + }, "sshkeyApprovalMessageInfix": { "message": "is requesting access to" }, + "sshkeyApprovalMessageSuffix": { + "message": "in order to" + }, + "sshActionLogin": { + "message": "authenticate to a server" + }, + "sshActionSign": { + "message": "sign a message" + }, + "sshActionGitSign": { + "message": "sign a git commit" + }, "unknownApplication": { "message": "An application" }, diff --git a/apps/desktop/src/locales/pl/messages.json b/apps/desktop/src/locales/pl/messages.json index 417592e6f88..257f9e7fc1a 100644 --- a/apps/desktop/src/locales/pl/messages.json +++ b/apps/desktop/src/locales/pl/messages.json @@ -652,6 +652,15 @@ "logInToBitwarden": { "message": "Zaloguj do Bitwarden" }, + "enterTheCodeSentToYourEmail": { + "message": "Wpisz kod wysłany na Twój adres e-mail" + }, + "enterTheCodeFromYourAuthenticatorApp": { + "message": "Wpisz kod z aplikacji uwierzytelniającej" + }, + "pressYourYubiKeyToAuthenticate": { + "message": "Naciśnij YubiKey aby uwierzytelnić" + }, "logInWithPasskey": { "message": "Zaloguj się używając klucza dostępu" }, @@ -704,6 +713,15 @@ "masterPassHintLabel": { "message": "Podpowiedź do hasła głównego" }, + "passwordStrengthScore": { + "message": "Siła hasła: $SCORE$", + "placeholders": { + "score": { + "content": "$1", + "example": "4" + } + } + }, "joinOrganization": { "message": "Dołącz do organizacji" }, @@ -816,6 +834,9 @@ "webauthnCancelOrTimeout": { "message": "Uwierzytelnianie zostało anulowane lub trwało zbyt długo. Spróbuj ponownie." }, + "openInNewTab": { + "message": "Otwórz w nowej karcie" + }, "invalidVerificationCode": { "message": "Kod weryfikacyjny jest nieprawidłowy" }, @@ -846,12 +867,22 @@ "rememberMe": { "message": "Zapamiętaj mnie" }, + "dontAskAgainOnThisDeviceFor30Days": { + "message": "Nie pytaj ponownie na tym urządzeniu przez 30 dni" + }, "sendVerificationCodeEmailAgain": { "message": "Wyślij ponownie wiadomość z kodem weryfikacyjnym" }, "useAnotherTwoStepMethod": { "message": "Użyj innej metody logowania dwustopniowego" }, + "selectAnotherMethod": { + "message": "Wybierz inną metodę", + "description": "Select another two-step login method" + }, + "useYourRecoveryCode": { + "message": "Użyj kodu odzyskiwania" + }, "insertYubiKey": { "message": "Włóż klucz YubiKey do portu USB komputera, a następnie dotknij jego przycisku." }, @@ -918,6 +949,9 @@ "twoStepOptions": { "message": "Opcje logowania dwustopniowego" }, + "selectTwoStepLoginMethod": { + "message": "Wybierz metodę logowania dwustopniowego" + }, "selfHostedEnvironment": { "message": "Samodzielnie hostowane środowisko" }, @@ -1776,7 +1810,7 @@ "message": "Wymagaj hasła lub PIN przy starcie aplikacji" }, "requirePasswordWithoutPinOnStart": { - "message": "Require password on app start" + "message": "Wymagaj hasła przy starcie aplikacji" }, "recommendedForSecurity": { "message": "Zalecane dla bezpieczeństwa." @@ -2247,6 +2281,12 @@ "webAuthnAuthenticate": { "message": "Uwierzytelnianie WebAuthn" }, + "readSecurityKey": { + "message": "Odczytaj klucz bezpieczeństwa" + }, + "awaitingSecurityKeyInteraction": { + "message": "Oczekiwanie na interakcję z kluczem bezpieczeństwa..." + }, "hideEmail": { "message": "Ukryj mój adres e-mail przed odbiorcami." }, @@ -2644,7 +2684,7 @@ } }, "forwaderInvalidOperation": { - "message": "$SERVICENAME$ refused your request. Please contact your service provider for assistance.", + "message": "$SERVICENAME$ odrzucił Twoje żądanie. Skontaktuj się z dostawcą usług w celu uzyskania pomocy.", "description": "Displayed when the user is forbidden from using the API by the forwarding service.", "placeholders": { "servicename": { @@ -2654,7 +2694,7 @@ } }, "forwaderInvalidOperationWithMessage": { - "message": "$SERVICENAME$ refused your request: $ERRORMESSAGE$", + "message": "$SERVICENAME$ odrzucił Twoje żądanie: $ERRORMESSAGE$", "description": "Displayed when the user is forbidden from using the API by the forwarding service with an error message.", "placeholders": { "servicename": { @@ -3206,6 +3246,12 @@ "duoRequiredByOrgForAccount": { "message": "Dwustopniowe logowanie Duo jest wymagane dla Twojego konta." }, + "duoTwoFactorRequiredPageSubtitle": { + "message": "Logowanie dwustopniowe Duo jest wymagane dla twojego konta. Wykonaj poniższe kroki, by dokończyć logowanie" + }, + "followTheStepsBelowToFinishLoggingIn": { + "message": "Wykonaj poniższe kroki, by dokończyć logowanie" + }, "launchDuo": { "message": "Uruchom Duo w przeglądarce" }, @@ -3463,9 +3509,27 @@ "sshkeyApprovalTitle": { "message": "Potwierdź użycie klucza SSH" }, + "agentForwardingWarningTitle": { + "message": "Warning: Agent Forwarding" + }, + "agentForwardingWarningText": { + "message": "This request comes from a remote device that you are logged into" + }, "sshkeyApprovalMessageInfix": { "message": "wnioskuje o dostęp do" }, + "sshkeyApprovalMessageSuffix": { + "message": "in order to" + }, + "sshActionLogin": { + "message": "authenticate to a server" + }, + "sshActionSign": { + "message": "sign a message" + }, + "sshActionGitSign": { + "message": "sign a git commit" + }, "unknownApplication": { "message": "Aplikacja" }, diff --git a/apps/desktop/src/locales/pt_BR/messages.json b/apps/desktop/src/locales/pt_BR/messages.json index 693970ff708..88ef71fb92f 100644 --- a/apps/desktop/src/locales/pt_BR/messages.json +++ b/apps/desktop/src/locales/pt_BR/messages.json @@ -652,6 +652,15 @@ "logInToBitwarden": { "message": "Inicie a sessão no Bitwarden" }, + "enterTheCodeSentToYourEmail": { + "message": "Enter the code sent to your email" + }, + "enterTheCodeFromYourAuthenticatorApp": { + "message": "Enter the code from your authenticator app" + }, + "pressYourYubiKeyToAuthenticate": { + "message": "Press your YubiKey to authenticate" + }, "logInWithPasskey": { "message": "Iniciar sessão com a chave de acesso" }, @@ -704,6 +713,15 @@ "masterPassHintLabel": { "message": "Dica da senha mestra" }, + "passwordStrengthScore": { + "message": "Password strength score $SCORE$", + "placeholders": { + "score": { + "content": "$1", + "example": "4" + } + } + }, "joinOrganization": { "message": "Juntar-se à organização" }, @@ -816,6 +834,9 @@ "webauthnCancelOrTimeout": { "message": "A autenticação foi cancelada ou demorou muito. Por favor tente novamente." }, + "openInNewTab": { + "message": "Open in new tab" + }, "invalidVerificationCode": { "message": "Código de verificação inválido" }, @@ -846,12 +867,22 @@ "rememberMe": { "message": "Lembrar de mim" }, + "dontAskAgainOnThisDeviceFor30Days": { + "message": "Don't ask again on this device for 30 days" + }, "sendVerificationCodeEmailAgain": { "message": "Enviar código de verificação para o e-mail novamente" }, "useAnotherTwoStepMethod": { "message": "Utilizar outro método de verificação em duas etapas" }, + "selectAnotherMethod": { + "message": "Select another method", + "description": "Select another two-step login method" + }, + "useYourRecoveryCode": { + "message": "Use your recovery code" + }, "insertYubiKey": { "message": "Introduza a sua YubiKey na porta USB do seu computador, e depois toque no botão da mesma." }, @@ -918,6 +949,9 @@ "twoStepOptions": { "message": "Opções de Login em Duas Etapas" }, + "selectTwoStepLoginMethod": { + "message": "Select two-step login method" + }, "selfHostedEnvironment": { "message": "Ambiente auto-hospedado" }, @@ -2247,6 +2281,12 @@ "webAuthnAuthenticate": { "message": "Autenticar WebAuthn" }, + "readSecurityKey": { + "message": "Read security key" + }, + "awaitingSecurityKeyInteraction": { + "message": "Awaiting security key interaction..." + }, "hideEmail": { "message": "Ocultar meu endereço de e-mail dos destinatários." }, @@ -3206,6 +3246,12 @@ "duoRequiredByOrgForAccount": { "message": "A autenticação em duas etapas do Duo é necessária para sua conta." }, + "duoTwoFactorRequiredPageSubtitle": { + "message": "Duo two-step login is required for your account. Follow the steps below to finish logging in." + }, + "followTheStepsBelowToFinishLoggingIn": { + "message": "Follow the steps below to finish logging in." + }, "launchDuo": { "message": "Iniciar o Duo no navegador" }, @@ -3463,9 +3509,27 @@ "sshkeyApprovalTitle": { "message": "Confirmar uso da chave SSH" }, + "agentForwardingWarningTitle": { + "message": "Warning: Agent Forwarding" + }, + "agentForwardingWarningText": { + "message": "This request comes from a remote device that you are logged into" + }, "sshkeyApprovalMessageInfix": { "message": "está solicitando acesso para" }, + "sshkeyApprovalMessageSuffix": { + "message": "in order to" + }, + "sshActionLogin": { + "message": "authenticate to a server" + }, + "sshActionSign": { + "message": "sign a message" + }, + "sshActionGitSign": { + "message": "sign a git commit" + }, "unknownApplication": { "message": "Uma aplicação" }, diff --git a/apps/desktop/src/locales/pt_PT/messages.json b/apps/desktop/src/locales/pt_PT/messages.json index 914a1d8e78f..eef942718ae 100644 --- a/apps/desktop/src/locales/pt_PT/messages.json +++ b/apps/desktop/src/locales/pt_PT/messages.json @@ -652,6 +652,15 @@ "logInToBitwarden": { "message": "Iniciar sessão no Bitwarden" }, + "enterTheCodeSentToYourEmail": { + "message": "Introduza o código enviado para o seu e-mail" + }, + "enterTheCodeFromYourAuthenticatorApp": { + "message": "Introduza o código da sua app de autenticação" + }, + "pressYourYubiKeyToAuthenticate": { + "message": "Prima a sua YubiKey para se autenticar" + }, "logInWithPasskey": { "message": "Iniciar sessão com a chave de acesso" }, @@ -704,6 +713,15 @@ "masterPassHintLabel": { "message": "Dica da palavra-passe mestra" }, + "passwordStrengthScore": { + "message": "Pontuação da força da palavra-passe: $SCORE$", + "placeholders": { + "score": { + "content": "$1", + "example": "4" + } + } + }, "joinOrganization": { "message": "Aderir à organização" }, @@ -816,6 +834,9 @@ "webauthnCancelOrTimeout": { "message": "A autenticação foi cancelada ou demorou demasiado tempo. Por favor, tente novamente." }, + "openInNewTab": { + "message": "Abrir num novo separador" + }, "invalidVerificationCode": { "message": "Código de verificação inválido" }, @@ -846,12 +867,22 @@ "rememberMe": { "message": "Memorizar" }, + "dontAskAgainOnThisDeviceFor30Days": { + "message": "Não voltar a perguntar neste dispositivo durante 30 dias" + }, "sendVerificationCodeEmailAgain": { "message": "Enviar e-mail com o código de verificação novamente" }, "useAnotherTwoStepMethod": { "message": "Utilizar outro método de verificação de dois passos" }, + "selectAnotherMethod": { + "message": "Selecionar outro método", + "description": "Select another two-step login method" + }, + "useYourRecoveryCode": { + "message": "Utilize o seu código de recuperação" + }, "insertYubiKey": { "message": "Introduza a sua YubiKey na porta USB do seu computador, depois toque no botão da mesma." }, @@ -918,6 +949,9 @@ "twoStepOptions": { "message": "Opções de verificação de dois passos" }, + "selectTwoStepLoginMethod": { + "message": "Selecionar método de verificação de dois passos" + }, "selfHostedEnvironment": { "message": "Ambiente auto-hospedado" }, @@ -1764,19 +1798,19 @@ "message": "desbloquear o cofre" }, "autoPromptWindowsHello": { - "message": "Pedir o Windows Hello ao iniciar a aplicação" + "message": "Pedir o Windows Hello ao iniciar a app" }, "autoPromptPolkit": { "message": "Pedir a autenticação do sistema no arranque" }, "autoPromptTouchId": { - "message": "Pedir o Touch ID ao iniciar a aplicação" + "message": "Pedir o Touch ID ao iniciar a app" }, "requirePasswordOnStart": { - "message": "Exigir palavra-passe ou PIN ao iniciar a aplicação" + "message": "Exigir palavra-passe ou PIN ao iniciar a app" }, "requirePasswordWithoutPinOnStart": { - "message": "Require password on app start" + "message": "Exigir palavra-passe ao iniciar a app" }, "recommendedForSecurity": { "message": "Recomendado por segurança." @@ -2247,6 +2281,12 @@ "webAuthnAuthenticate": { "message": "Autenticar o WebAuthn" }, + "readSecurityKey": { + "message": "Ler chave de segurança" + }, + "awaitingSecurityKeyInteraction": { + "message": "A aguardar interação da chave de segurança..." + }, "hideEmail": { "message": "Ocultar o meu endereço de e-mail dos destinatários." }, @@ -3206,6 +3246,12 @@ "duoRequiredByOrgForAccount": { "message": "A verificação de dois passos Duo é necessária para a sua conta." }, + "duoTwoFactorRequiredPageSubtitle": { + "message": "A verificação de dois passos do Duo é necessária para a sua conta. Siga os passos abaixo para concluir o início de sessão." + }, + "followTheStepsBelowToFinishLoggingIn": { + "message": "Siga os passos abaixo para concluir o início de sessão." + }, "launchDuo": { "message": "Iniciar o Duo no navegador" }, @@ -3463,9 +3509,27 @@ "sshkeyApprovalTitle": { "message": "Confirmar a utilização da chave SSH" }, + "agentForwardingWarningTitle": { + "message": "Aviso: Reencaminhamento de agentes" + }, + "agentForwardingWarningText": { + "message": "Este pedido provém de um dispositivo remoto no qual tem sessão iniciada" + }, "sshkeyApprovalMessageInfix": { "message": "está a pedir acesso a" }, + "sshkeyApprovalMessageSuffix": { + "message": "para" + }, + "sshActionLogin": { + "message": "se autenticar num servidor" + }, + "sshActionSign": { + "message": "assinar uma mensagem" + }, + "sshActionGitSign": { + "message": "assinar um commit no git" + }, "unknownApplication": { "message": "Uma aplicação" }, diff --git a/apps/desktop/src/locales/ro/messages.json b/apps/desktop/src/locales/ro/messages.json index 807de4a101c..051ef71c8d3 100644 --- a/apps/desktop/src/locales/ro/messages.json +++ b/apps/desktop/src/locales/ro/messages.json @@ -652,6 +652,15 @@ "logInToBitwarden": { "message": "Log in to Bitwarden" }, + "enterTheCodeSentToYourEmail": { + "message": "Enter the code sent to your email" + }, + "enterTheCodeFromYourAuthenticatorApp": { + "message": "Enter the code from your authenticator app" + }, + "pressYourYubiKeyToAuthenticate": { + "message": "Press your YubiKey to authenticate" + }, "logInWithPasskey": { "message": "Log in with passkey" }, @@ -704,6 +713,15 @@ "masterPassHintLabel": { "message": "Master password hint" }, + "passwordStrengthScore": { + "message": "Password strength score $SCORE$", + "placeholders": { + "score": { + "content": "$1", + "example": "4" + } + } + }, "joinOrganization": { "message": "Join organization" }, @@ -816,6 +834,9 @@ "webauthnCancelOrTimeout": { "message": "The authentication was cancelled or took too long. Please try again." }, + "openInNewTab": { + "message": "Open in new tab" + }, "invalidVerificationCode": { "message": "Cod de verificare nevalid" }, @@ -846,12 +867,22 @@ "rememberMe": { "message": "Memorare autentificare" }, + "dontAskAgainOnThisDeviceFor30Days": { + "message": "Don't ask again on this device for 30 days" + }, "sendVerificationCodeEmailAgain": { "message": "Retrimitere e-mail cu codul de verificare" }, "useAnotherTwoStepMethod": { "message": "Utilizare de metodă diferită de autentificare în două etape" }, + "selectAnotherMethod": { + "message": "Select another method", + "description": "Select another two-step login method" + }, + "useYourRecoveryCode": { + "message": "Use your recovery code" + }, "insertYubiKey": { "message": "Introduceți YubiKey în portul USB al calculatorului apoi atingeți butonul acestuia." }, @@ -918,6 +949,9 @@ "twoStepOptions": { "message": "Opțiuni de autentificare în două etape" }, + "selectTwoStepLoginMethod": { + "message": "Select two-step login method" + }, "selfHostedEnvironment": { "message": "Mediul găzduit local" }, @@ -2247,6 +2281,12 @@ "webAuthnAuthenticate": { "message": "Autentificare WebAuthn" }, + "readSecurityKey": { + "message": "Read security key" + }, + "awaitingSecurityKeyInteraction": { + "message": "Awaiting security key interaction..." + }, "hideEmail": { "message": "Ascundeți adresa mea de e-mail de la destinatari." }, @@ -3206,6 +3246,12 @@ "duoRequiredByOrgForAccount": { "message": "Duo two-step login is required for your account." }, + "duoTwoFactorRequiredPageSubtitle": { + "message": "Duo two-step login is required for your account. Follow the steps below to finish logging in." + }, + "followTheStepsBelowToFinishLoggingIn": { + "message": "Follow the steps below to finish logging in." + }, "launchDuo": { "message": "Launch Duo in Browser" }, @@ -3463,9 +3509,27 @@ "sshkeyApprovalTitle": { "message": "Confirm SSH key usage" }, + "agentForwardingWarningTitle": { + "message": "Warning: Agent Forwarding" + }, + "agentForwardingWarningText": { + "message": "This request comes from a remote device that you are logged into" + }, "sshkeyApprovalMessageInfix": { "message": "is requesting access to" }, + "sshkeyApprovalMessageSuffix": { + "message": "in order to" + }, + "sshActionLogin": { + "message": "authenticate to a server" + }, + "sshActionSign": { + "message": "sign a message" + }, + "sshActionGitSign": { + "message": "sign a git commit" + }, "unknownApplication": { "message": "An application" }, diff --git a/apps/desktop/src/locales/ru/messages.json b/apps/desktop/src/locales/ru/messages.json index 9fb24b00c7c..6e89d4b530b 100644 --- a/apps/desktop/src/locales/ru/messages.json +++ b/apps/desktop/src/locales/ru/messages.json @@ -652,6 +652,15 @@ "logInToBitwarden": { "message": "Войти в Bitwarden" }, + "enterTheCodeSentToYourEmail": { + "message": "Введите код, отправленный на ваш email" + }, + "enterTheCodeFromYourAuthenticatorApp": { + "message": "Введите код из приложения-аутентификатора" + }, + "pressYourYubiKeyToAuthenticate": { + "message": "Нажмите на YubiKey для аутентификации" + }, "logInWithPasskey": { "message": "Войти с passkey" }, @@ -704,6 +713,15 @@ "masterPassHintLabel": { "message": "Подсказка к мастер-паролю" }, + "passwordStrengthScore": { + "message": "Оценка надежности пароля $SCORE$", + "placeholders": { + "score": { + "content": "$1", + "example": "4" + } + } + }, "joinOrganization": { "message": "Присоединиться к организации" }, @@ -816,6 +834,9 @@ "webauthnCancelOrTimeout": { "message": "Аутентификация была отменена или заняла слишком много времени. Пожалуйста, попробуйте еще раз." }, + "openInNewTab": { + "message": "Открыть в новой вкладке" + }, "invalidVerificationCode": { "message": "Неверный код подтверждения" }, @@ -846,12 +867,22 @@ "rememberMe": { "message": "Запомнить меня" }, + "dontAskAgainOnThisDeviceFor30Days": { + "message": "Не спрашивать на этом устройстве в течение 30 дней" + }, "sendVerificationCodeEmailAgain": { "message": "Отправить код подтверждения еще раз" }, "useAnotherTwoStepMethod": { "message": "Использовать другой метод двухэтапной аутентификации" }, + "selectAnotherMethod": { + "message": "Выбрать другой способ", + "description": "Select another two-step login method" + }, + "useYourRecoveryCode": { + "message": "Использовать код восстановления" + }, "insertYubiKey": { "message": "Вставьте свой YubiKey в USB-порт компьютера и нажмите его кнопку." }, @@ -918,6 +949,9 @@ "twoStepOptions": { "message": "Настройки двухэтапной аутентификации" }, + "selectTwoStepLoginMethod": { + "message": "Выбрать другой метод двухэтапной аутентификации" + }, "selfHostedEnvironment": { "message": "Окружение пользовательского хостинга" }, @@ -2247,6 +2281,12 @@ "webAuthnAuthenticate": { "message": "Аутентификация WebAutn" }, + "readSecurityKey": { + "message": "Считать ключ безопасности" + }, + "awaitingSecurityKeyInteraction": { + "message": "Ожидание взаимодействия с ключом безопасности..." + }, "hideEmail": { "message": "Скрыть мой адрес email от получателей." }, @@ -3206,6 +3246,12 @@ "duoRequiredByOrgForAccount": { "message": "Для вашего аккаунта требуется двухэтапная аутентификация Duo." }, + "duoTwoFactorRequiredPageSubtitle": { + "message": "Duo two-step login is required for your account. Follow the steps below to finish logging in." + }, + "followTheStepsBelowToFinishLoggingIn": { + "message": "Следуйте указаниям ниже, чтобы завершить авторизацию." + }, "launchDuo": { "message": "Запустить Duo в браузере" }, @@ -3463,9 +3509,27 @@ "sshkeyApprovalTitle": { "message": "Подтвердить использование ключа SSH" }, + "agentForwardingWarningTitle": { + "message": "Предупреждение: Переадресация агента" + }, + "agentForwardingWarningText": { + "message": "Этот запрос поступает с удаленного устройства, на которое вы вошли" + }, "sshkeyApprovalMessageInfix": { "message": "запрашивает доступ к" }, + "sshkeyApprovalMessageSuffix": { + "message": "чтобы" + }, + "sshActionLogin": { + "message": "авторизоваться на сервере" + }, + "sshActionSign": { + "message": "sign a message" + }, + "sshActionGitSign": { + "message": "sign a git commit" + }, "unknownApplication": { "message": "Приложение" }, diff --git a/apps/desktop/src/locales/si/messages.json b/apps/desktop/src/locales/si/messages.json index 3e77077ddee..cfddc088795 100644 --- a/apps/desktop/src/locales/si/messages.json +++ b/apps/desktop/src/locales/si/messages.json @@ -652,6 +652,15 @@ "logInToBitwarden": { "message": "Log in to Bitwarden" }, + "enterTheCodeSentToYourEmail": { + "message": "Enter the code sent to your email" + }, + "enterTheCodeFromYourAuthenticatorApp": { + "message": "Enter the code from your authenticator app" + }, + "pressYourYubiKeyToAuthenticate": { + "message": "Press your YubiKey to authenticate" + }, "logInWithPasskey": { "message": "Log in with passkey" }, @@ -704,6 +713,15 @@ "masterPassHintLabel": { "message": "Master password hint" }, + "passwordStrengthScore": { + "message": "Password strength score $SCORE$", + "placeholders": { + "score": { + "content": "$1", + "example": "4" + } + } + }, "joinOrganization": { "message": "Join organization" }, @@ -816,6 +834,9 @@ "webauthnCancelOrTimeout": { "message": "The authentication was cancelled or took too long. Please try again." }, + "openInNewTab": { + "message": "Open in new tab" + }, "invalidVerificationCode": { "message": "Invalid verification code" }, @@ -846,12 +867,22 @@ "rememberMe": { "message": "Remember me" }, + "dontAskAgainOnThisDeviceFor30Days": { + "message": "Don't ask again on this device for 30 days" + }, "sendVerificationCodeEmailAgain": { "message": "Send verification code email again" }, "useAnotherTwoStepMethod": { "message": "Use another two-step login method" }, + "selectAnotherMethod": { + "message": "Select another method", + "description": "Select another two-step login method" + }, + "useYourRecoveryCode": { + "message": "Use your recovery code" + }, "insertYubiKey": { "message": "Insert your YubiKey into your computer's USB port, then touch its button." }, @@ -918,6 +949,9 @@ "twoStepOptions": { "message": "Two-step login options" }, + "selectTwoStepLoginMethod": { + "message": "Select two-step login method" + }, "selfHostedEnvironment": { "message": "Self-hosted environment" }, @@ -2247,6 +2281,12 @@ "webAuthnAuthenticate": { "message": "Authenticate WebAuthn" }, + "readSecurityKey": { + "message": "Read security key" + }, + "awaitingSecurityKeyInteraction": { + "message": "Awaiting security key interaction..." + }, "hideEmail": { "message": "Hide my email address from recipients." }, @@ -3206,6 +3246,12 @@ "duoRequiredByOrgForAccount": { "message": "Duo two-step login is required for your account." }, + "duoTwoFactorRequiredPageSubtitle": { + "message": "Duo two-step login is required for your account. Follow the steps below to finish logging in." + }, + "followTheStepsBelowToFinishLoggingIn": { + "message": "Follow the steps below to finish logging in." + }, "launchDuo": { "message": "Launch Duo in Browser" }, @@ -3463,9 +3509,27 @@ "sshkeyApprovalTitle": { "message": "Confirm SSH key usage" }, + "agentForwardingWarningTitle": { + "message": "Warning: Agent Forwarding" + }, + "agentForwardingWarningText": { + "message": "This request comes from a remote device that you are logged into" + }, "sshkeyApprovalMessageInfix": { "message": "is requesting access to" }, + "sshkeyApprovalMessageSuffix": { + "message": "in order to" + }, + "sshActionLogin": { + "message": "authenticate to a server" + }, + "sshActionSign": { + "message": "sign a message" + }, + "sshActionGitSign": { + "message": "sign a git commit" + }, "unknownApplication": { "message": "An application" }, diff --git a/apps/desktop/src/locales/sk/messages.json b/apps/desktop/src/locales/sk/messages.json index 65a718b1a23..2ec3f3cb0cb 100644 --- a/apps/desktop/src/locales/sk/messages.json +++ b/apps/desktop/src/locales/sk/messages.json @@ -652,6 +652,15 @@ "logInToBitwarden": { "message": "Prihlásenie do Bitwardenu" }, + "enterTheCodeSentToYourEmail": { + "message": "Zadajte kód zaslaný na váš e-mail" + }, + "enterTheCodeFromYourAuthenticatorApp": { + "message": "Zadajte kód z overovacej aplikácie" + }, + "pressYourYubiKeyToAuthenticate": { + "message": "Stlačte YubiKey na overenie" + }, "logInWithPasskey": { "message": "Prihlásiť sa s prístupovým kľúčom" }, @@ -704,6 +713,15 @@ "masterPassHintLabel": { "message": "Nápoveď k hlavnému heslu" }, + "passwordStrengthScore": { + "message": "Sila hesla $SCORE$", + "placeholders": { + "score": { + "content": "$1", + "example": "4" + } + } + }, "joinOrganization": { "message": "Pripojte sa k organizácii" }, @@ -816,6 +834,9 @@ "webauthnCancelOrTimeout": { "message": "Overenie bolo zrušené alebo trvalo príliš dlho. Skúste to znova." }, + "openInNewTab": { + "message": "Otvoriť v novej karte" + }, "invalidVerificationCode": { "message": "Neplatný verifikačný kód" }, @@ -846,12 +867,22 @@ "rememberMe": { "message": "Zapamätaj si ma" }, + "dontAskAgainOnThisDeviceFor30Days": { + "message": "Nepýtať sa znova na tomto zariadení 30 dní" + }, "sendVerificationCodeEmailAgain": { "message": "Znovu zaslať overovací kód e-mailom" }, "useAnotherTwoStepMethod": { "message": "Použiť inú dvojstupňovú metódu prihlásenia" }, + "selectAnotherMethod": { + "message": "Vyberte iný spôsob", + "description": "Select another two-step login method" + }, + "useYourRecoveryCode": { + "message": "Použiť obnovovací kód" + }, "insertYubiKey": { "message": "Vložte váš YubiKey do USB portu počítača a stlačte jeho tlačidlo." }, @@ -918,6 +949,9 @@ "twoStepOptions": { "message": "Možnosti dvojstupňového prihlásenia" }, + "selectTwoStepLoginMethod": { + "message": "Vyberte metódu dvojstupňového prihlásenia" + }, "selfHostedEnvironment": { "message": "Prevádzkované vo vlastnom prostredí" }, @@ -2247,6 +2281,12 @@ "webAuthnAuthenticate": { "message": "Overiť cez WebAuthn" }, + "readSecurityKey": { + "message": "Prečítať bezpečnostný kľúč" + }, + "awaitingSecurityKeyInteraction": { + "message": "Čaká sa na interakciu s bezpečnostným kľúčom..." + }, "hideEmail": { "message": "Skryť moju e-mailovú adresu pred príjemcami." }, @@ -3206,6 +3246,12 @@ "duoRequiredByOrgForAccount": { "message": "Pre váš účet je potrebné dvojstupňové prihlásenie Duo." }, + "duoTwoFactorRequiredPageSubtitle": { + "message": "Pre váš účet sa vyžaduje dvojstupňové prihlásenie Duo. Na dokončenie prihlásenia postupujte podľa pokynov." + }, + "followTheStepsBelowToFinishLoggingIn": { + "message": "Na dokončenie prihlásenia postupujte podľa pokynov." + }, "launchDuo": { "message": "Spustiť Duo v prehliadači" }, @@ -3463,9 +3509,27 @@ "sshkeyApprovalTitle": { "message": "Potvrdiť použitie kľúča SSH" }, + "agentForwardingWarningTitle": { + "message": "Upozornenie: Presmerovanie agenta" + }, + "agentForwardingWarningText": { + "message": "Táto požiadavka prichádza zo vzdialeného zariadenia, do ktorého ste prihlásení" + }, "sshkeyApprovalMessageInfix": { "message": "žiada o prístup k" }, + "sshkeyApprovalMessageSuffix": { + "message": "in order to" + }, + "sshActionLogin": { + "message": "authenticate to a server" + }, + "sshActionSign": { + "message": "podpísať správu" + }, + "sshActionGitSign": { + "message": "podpísať git commit" + }, "unknownApplication": { "message": "Aplikácia" }, diff --git a/apps/desktop/src/locales/sl/messages.json b/apps/desktop/src/locales/sl/messages.json index e74cf0392fc..6207b0bca0c 100644 --- a/apps/desktop/src/locales/sl/messages.json +++ b/apps/desktop/src/locales/sl/messages.json @@ -652,6 +652,15 @@ "logInToBitwarden": { "message": "Log in to Bitwarden" }, + "enterTheCodeSentToYourEmail": { + "message": "Enter the code sent to your email" + }, + "enterTheCodeFromYourAuthenticatorApp": { + "message": "Enter the code from your authenticator app" + }, + "pressYourYubiKeyToAuthenticate": { + "message": "Press your YubiKey to authenticate" + }, "logInWithPasskey": { "message": "Log in with passkey" }, @@ -704,6 +713,15 @@ "masterPassHintLabel": { "message": "Master password hint" }, + "passwordStrengthScore": { + "message": "Password strength score $SCORE$", + "placeholders": { + "score": { + "content": "$1", + "example": "4" + } + } + }, "joinOrganization": { "message": "Join organization" }, @@ -816,6 +834,9 @@ "webauthnCancelOrTimeout": { "message": "The authentication was cancelled or took too long. Please try again." }, + "openInNewTab": { + "message": "Open in new tab" + }, "invalidVerificationCode": { "message": "Neveljavna verifikacijska koda" }, @@ -846,12 +867,22 @@ "rememberMe": { "message": "Zapomni si me" }, + "dontAskAgainOnThisDeviceFor30Days": { + "message": "Don't ask again on this device for 30 days" + }, "sendVerificationCodeEmailAgain": { "message": "Ponovno pošlji verifikacijsko kodo" }, "useAnotherTwoStepMethod": { "message": "Use another two-step login method" }, + "selectAnotherMethod": { + "message": "Select another method", + "description": "Select another two-step login method" + }, + "useYourRecoveryCode": { + "message": "Use your recovery code" + }, "insertYubiKey": { "message": "Insert your YubiKey into your computer's USB port, then touch its button." }, @@ -918,6 +949,9 @@ "twoStepOptions": { "message": "Two-step login options" }, + "selectTwoStepLoginMethod": { + "message": "Select two-step login method" + }, "selfHostedEnvironment": { "message": "Okolje z lastnim gostovanjem" }, @@ -2247,6 +2281,12 @@ "webAuthnAuthenticate": { "message": "Authenticate WebAuthn" }, + "readSecurityKey": { + "message": "Read security key" + }, + "awaitingSecurityKeyInteraction": { + "message": "Awaiting security key interaction..." + }, "hideEmail": { "message": "Hide my email address from recipients." }, @@ -3206,6 +3246,12 @@ "duoRequiredByOrgForAccount": { "message": "Duo two-step login is required for your account." }, + "duoTwoFactorRequiredPageSubtitle": { + "message": "Duo two-step login is required for your account. Follow the steps below to finish logging in." + }, + "followTheStepsBelowToFinishLoggingIn": { + "message": "Follow the steps below to finish logging in." + }, "launchDuo": { "message": "Launch Duo in Browser" }, @@ -3463,9 +3509,27 @@ "sshkeyApprovalTitle": { "message": "Confirm SSH key usage" }, + "agentForwardingWarningTitle": { + "message": "Warning: Agent Forwarding" + }, + "agentForwardingWarningText": { + "message": "This request comes from a remote device that you are logged into" + }, "sshkeyApprovalMessageInfix": { "message": "is requesting access to" }, + "sshkeyApprovalMessageSuffix": { + "message": "in order to" + }, + "sshActionLogin": { + "message": "authenticate to a server" + }, + "sshActionSign": { + "message": "sign a message" + }, + "sshActionGitSign": { + "message": "sign a git commit" + }, "unknownApplication": { "message": "An application" }, diff --git a/apps/desktop/src/locales/sr/messages.json b/apps/desktop/src/locales/sr/messages.json index b7a66174e9d..82347a322b7 100644 --- a/apps/desktop/src/locales/sr/messages.json +++ b/apps/desktop/src/locales/sr/messages.json @@ -652,6 +652,15 @@ "logInToBitwarden": { "message": "Пријавите се на Bitwarden" }, + "enterTheCodeSentToYourEmail": { + "message": "Унесите кôд послат на ваш имејл" + }, + "enterTheCodeFromYourAuthenticatorApp": { + "message": "Унесите кôд из апликације за аутентификацију" + }, + "pressYourYubiKeyToAuthenticate": { + "message": "Стисните Ваш YubiKey за аутентификацију" + }, "logInWithPasskey": { "message": "Пријавите се са приступним кључем" }, @@ -704,6 +713,15 @@ "masterPassHintLabel": { "message": "Савет главне лозинке" }, + "passwordStrengthScore": { + "message": "Снага лозинкe $SCORE$", + "placeholders": { + "score": { + "content": "$1", + "example": "4" + } + } + }, "joinOrganization": { "message": "Придружи Организацију" }, @@ -816,6 +834,9 @@ "webauthnCancelOrTimeout": { "message": "Аутентификација је отказана или је трајала предуго. Молим вас, покушајте поново." }, + "openInNewTab": { + "message": "Отвори у новом језичку" + }, "invalidVerificationCode": { "message": "Неисправан верификациони код" }, @@ -846,12 +867,22 @@ "rememberMe": { "message": "Запамти ме" }, + "dontAskAgainOnThisDeviceFor30Days": { + "message": "Не питајте поново на овом уређају 30 дана" + }, "sendVerificationCodeEmailAgain": { "message": "Поново послати верификациони код на имејл" }, "useAnotherTwoStepMethod": { "message": "Користите другу методу пријављивања у два корака" }, + "selectAnotherMethod": { + "message": "Изаберите другу методу", + "description": "Select another two-step login method" + }, + "useYourRecoveryCode": { + "message": "Употребите шифру за опоравак" + }, "insertYubiKey": { "message": "Убаците свој YubiKey у УСБ порт рачунара, а затим додирните његово дугме." }, @@ -918,6 +949,9 @@ "twoStepOptions": { "message": "Опције дво-коракне пријаве" }, + "selectTwoStepLoginMethod": { + "message": "Одабрати методу пријављивања у два корака" + }, "selfHostedEnvironment": { "message": "Самостално окружење" }, @@ -1776,7 +1810,7 @@ "message": "Захтевај лозинку или ПИН при покретању" }, "requirePasswordWithoutPinOnStart": { - "message": "Require password on app start" + "message": "Захтевај лозинку при покретању" }, "recommendedForSecurity": { "message": "Препоручује се за сигурност." @@ -2247,6 +2281,12 @@ "webAuthnAuthenticate": { "message": "WebAutn аутентификација" }, + "readSecurityKey": { + "message": "Читај сигурносни кључ" + }, + "awaitingSecurityKeyInteraction": { + "message": "Чека се интеракција сигурносног кључа..." + }, "hideEmail": { "message": "Сакриј моју е-адресу од примаоца." }, @@ -2554,7 +2594,7 @@ "message": "Користите подешено catch-all пријемно сандуче вашег домена." }, "useThisEmail": { - "message": "Use this email" + "message": "Користи овај имејл" }, "random": { "message": "Случајно" @@ -2644,7 +2684,7 @@ } }, "forwaderInvalidOperation": { - "message": "$SERVICENAME$ refused your request. Please contact your service provider for assistance.", + "message": "$SERVICENAME$ одбио ваш захтев. Обратите се свом провајдеру сервиса за помоћ.", "description": "Displayed when the user is forbidden from using the API by the forwarding service.", "placeholders": { "servicename": { @@ -2654,7 +2694,7 @@ } }, "forwaderInvalidOperationWithMessage": { - "message": "$SERVICENAME$ refused your request: $ERRORMESSAGE$", + "message": "$SERVICENAME$ одбио ваш захтев: $ERRORMESSAGE$", "description": "Displayed when the user is forbidden from using the API by the forwarding service with an error message.", "placeholders": { "servicename": { @@ -2773,7 +2813,7 @@ "message": "Пријава је покренута" }, "logInRequestSent": { - "message": "Request sent" + "message": "Захтев је послат" }, "notificationSentDevice": { "message": "Обавештење је послато на ваш уређај." @@ -2782,13 +2822,13 @@ "message": "Обавештење је послато на ваш уређај" }, "notificationSentDevicePart1": { - "message": "Unlock Bitwarden on your device or on the " + "message": "Откључај Bitwarden на твом уређају или на " }, "notificationSentDeviceAnchor": { - "message": "web app" + "message": "веб апликација" }, "notificationSentDevicePart2": { - "message": "Make sure the Fingerprint phrase matches the one below before approving." + "message": "Потврдите да се фраза отиска поклапа са овом испод пре одобравања." }, "needAnotherOptionV1": { "message": "Треба Вам друга опција?" @@ -2819,10 +2859,10 @@ "description": "'Character count' describes a feature that displays a number next to each character of the password." }, "areYouTryingToAccessYourAccount": { - "message": "Are you trying to access your account?" + "message": "Да ли покушавате да приступите вашем налогу?" }, "accessAttemptBy": { - "message": "Access attempt by $EMAIL$", + "message": "Покушај приступа са $EMAIL$", "placeholders": { "email": { "content": "$1", @@ -2840,10 +2880,10 @@ "message": "Време" }, "confirmAccess": { - "message": "Confirm access" + "message": "Потврдите приступ" }, "denyAccess": { - "message": "Deny access" + "message": "Одбити приступ" }, "logInConfirmedForEmailOnDevice": { "message": "Пријава потврђена за $EMAIL$ на $DEVICE$", @@ -2880,7 +2920,7 @@ "message": "Овај захтев више не важи." }, "confirmAccessAttempt": { - "message": "Confirm access attempt for $EMAIL$", + "message": "Потврдити приступ за $EMAIL$", "placeholders": { "email": { "content": "$1", @@ -2892,7 +2932,7 @@ "message": "Захтев пријаве" }, "accountAccessRequested": { - "message": "Account access requested" + "message": "Приступ рачуна је затражен" }, "creatingAccountOn": { "message": "Креирај налог на" @@ -3206,6 +3246,12 @@ "duoRequiredByOrgForAccount": { "message": "Duo пријава у два корака је потребна за ваш налог." }, + "duoTwoFactorRequiredPageSubtitle": { + "message": "За ваш налог је потребан два корака. Следите наведене кораке да бисте завршили пријављивање." + }, + "followTheStepsBelowToFinishLoggingIn": { + "message": "Следите наведене кораке да бисте завршили пријављивање." + }, "launchDuo": { "message": "Покренути Duo у претраживачу" }, @@ -3463,9 +3509,27 @@ "sshkeyApprovalTitle": { "message": "Потврдите употребу SSH кључа" }, + "agentForwardingWarningTitle": { + "message": "Warning: Agent Forwarding" + }, + "agentForwardingWarningText": { + "message": "This request comes from a remote device that you are logged into" + }, "sshkeyApprovalMessageInfix": { "message": "тражи приступ" }, + "sshkeyApprovalMessageSuffix": { + "message": "in order to" + }, + "sshActionLogin": { + "message": "authenticate to a server" + }, + "sshActionSign": { + "message": "sign a message" + }, + "sshActionGitSign": { + "message": "sign a git commit" + }, "unknownApplication": { "message": "Апликација" }, @@ -3524,16 +3588,16 @@ "message": "Променити имејл налога" }, "allowScreenshots": { - "message": "Allow screen capture" + "message": "Дозволи снимање екрана" }, "allowScreenshotsDesc": { - "message": "Allow the Bitwarden desktop application to be captured in screenshots and viewed in remote desktop sessions. Disabling this will prevent access on some external displays." + "message": "Дозволите да Bitwarden апликација прихвата скриншот и преглед у удаљених радних површина. Онемогућавање то ће спречити приступ неким спољним дисплејима." }, "confirmWindowStillVisibleTitle": { - "message": "Confirm window still visible" + "message": "Потврдите да је прозор и даље видљив" }, "confirmWindowStillVisibleContent": { - "message": "Please confirm that the window is still visible." + "message": "Потврдите да је прозор и даље видљив." }, "updateBrowserOrDisableFingerprintDialogTitle": { "message": "Неопходна надоградња додатка" diff --git a/apps/desktop/src/locales/sv/messages.json b/apps/desktop/src/locales/sv/messages.json index 0f7a9000481..69906b4b945 100644 --- a/apps/desktop/src/locales/sv/messages.json +++ b/apps/desktop/src/locales/sv/messages.json @@ -652,6 +652,15 @@ "logInToBitwarden": { "message": "Logga in på Bitwarden" }, + "enterTheCodeSentToYourEmail": { + "message": "Enter the code sent to your email" + }, + "enterTheCodeFromYourAuthenticatorApp": { + "message": "Enter the code from your authenticator app" + }, + "pressYourYubiKeyToAuthenticate": { + "message": "Press your YubiKey to authenticate" + }, "logInWithPasskey": { "message": "Logga in med nyckel" }, @@ -704,6 +713,15 @@ "masterPassHintLabel": { "message": "Huvudlösenordsledtråd" }, + "passwordStrengthScore": { + "message": "Password strength score $SCORE$", + "placeholders": { + "score": { + "content": "$1", + "example": "4" + } + } + }, "joinOrganization": { "message": "Join organization" }, @@ -816,6 +834,9 @@ "webauthnCancelOrTimeout": { "message": "The authentication was cancelled or took too long. Please try again." }, + "openInNewTab": { + "message": "Open in new tab" + }, "invalidVerificationCode": { "message": "Ogiltig verifieringskod" }, @@ -846,12 +867,22 @@ "rememberMe": { "message": "Kom ihåg mig" }, + "dontAskAgainOnThisDeviceFor30Days": { + "message": "Don't ask again on this device for 30 days" + }, "sendVerificationCodeEmailAgain": { "message": "Skicka e-postmeddelandet med verifieringskoden igen" }, "useAnotherTwoStepMethod": { "message": "Använd en annan metod för tvåstegsverifiering" }, + "selectAnotherMethod": { + "message": "Select another method", + "description": "Select another two-step login method" + }, + "useYourRecoveryCode": { + "message": "Use your recovery code" + }, "insertYubiKey": { "message": "Anslut din YubiKey till datorns USB-port och tryck sedan på dess knapp." }, @@ -918,6 +949,9 @@ "twoStepOptions": { "message": "Alternativ för tvåstegsverifiering" }, + "selectTwoStepLoginMethod": { + "message": "Select two-step login method" + }, "selfHostedEnvironment": { "message": "Egen-hostad miljö" }, @@ -2247,6 +2281,12 @@ "webAuthnAuthenticate": { "message": "Autentisera WebAuthn" }, + "readSecurityKey": { + "message": "Read security key" + }, + "awaitingSecurityKeyInteraction": { + "message": "Awaiting security key interaction..." + }, "hideEmail": { "message": "Dölj min e-postadress för mottagare." }, @@ -3206,6 +3246,12 @@ "duoRequiredByOrgForAccount": { "message": "Duo tvåstegsverifiering krävs för ditt konto." }, + "duoTwoFactorRequiredPageSubtitle": { + "message": "Duo two-step login is required for your account. Follow the steps below to finish logging in." + }, + "followTheStepsBelowToFinishLoggingIn": { + "message": "Follow the steps below to finish logging in." + }, "launchDuo": { "message": "Starta Duo i webbläsaren" }, @@ -3463,9 +3509,27 @@ "sshkeyApprovalTitle": { "message": "Confirm SSH key usage" }, + "agentForwardingWarningTitle": { + "message": "Warning: Agent Forwarding" + }, + "agentForwardingWarningText": { + "message": "This request comes from a remote device that you are logged into" + }, "sshkeyApprovalMessageInfix": { "message": "begär tillgång till" }, + "sshkeyApprovalMessageSuffix": { + "message": "in order to" + }, + "sshActionLogin": { + "message": "authenticate to a server" + }, + "sshActionSign": { + "message": "sign a message" + }, + "sshActionGitSign": { + "message": "sign a git commit" + }, "unknownApplication": { "message": "En applikation" }, diff --git a/apps/desktop/src/locales/te/messages.json b/apps/desktop/src/locales/te/messages.json index 1aa61a9b381..b7693c0d0b5 100644 --- a/apps/desktop/src/locales/te/messages.json +++ b/apps/desktop/src/locales/te/messages.json @@ -652,6 +652,15 @@ "logInToBitwarden": { "message": "Log in to Bitwarden" }, + "enterTheCodeSentToYourEmail": { + "message": "Enter the code sent to your email" + }, + "enterTheCodeFromYourAuthenticatorApp": { + "message": "Enter the code from your authenticator app" + }, + "pressYourYubiKeyToAuthenticate": { + "message": "Press your YubiKey to authenticate" + }, "logInWithPasskey": { "message": "Log in with passkey" }, @@ -704,6 +713,15 @@ "masterPassHintLabel": { "message": "Master password hint" }, + "passwordStrengthScore": { + "message": "Password strength score $SCORE$", + "placeholders": { + "score": { + "content": "$1", + "example": "4" + } + } + }, "joinOrganization": { "message": "Join organization" }, @@ -816,6 +834,9 @@ "webauthnCancelOrTimeout": { "message": "The authentication was cancelled or took too long. Please try again." }, + "openInNewTab": { + "message": "Open in new tab" + }, "invalidVerificationCode": { "message": "Invalid verification code" }, @@ -846,12 +867,22 @@ "rememberMe": { "message": "Remember me" }, + "dontAskAgainOnThisDeviceFor30Days": { + "message": "Don't ask again on this device for 30 days" + }, "sendVerificationCodeEmailAgain": { "message": "Send verification code email again" }, "useAnotherTwoStepMethod": { "message": "Use another two-step login method" }, + "selectAnotherMethod": { + "message": "Select another method", + "description": "Select another two-step login method" + }, + "useYourRecoveryCode": { + "message": "Use your recovery code" + }, "insertYubiKey": { "message": "Insert your YubiKey into your computer's USB port, then touch its button." }, @@ -918,6 +949,9 @@ "twoStepOptions": { "message": "Two-step login options" }, + "selectTwoStepLoginMethod": { + "message": "Select two-step login method" + }, "selfHostedEnvironment": { "message": "Self-hosted environment" }, @@ -2247,6 +2281,12 @@ "webAuthnAuthenticate": { "message": "Authenticate WebAuthn" }, + "readSecurityKey": { + "message": "Read security key" + }, + "awaitingSecurityKeyInteraction": { + "message": "Awaiting security key interaction..." + }, "hideEmail": { "message": "Hide my email address from recipients." }, @@ -3206,6 +3246,12 @@ "duoRequiredByOrgForAccount": { "message": "Duo two-step login is required for your account." }, + "duoTwoFactorRequiredPageSubtitle": { + "message": "Duo two-step login is required for your account. Follow the steps below to finish logging in." + }, + "followTheStepsBelowToFinishLoggingIn": { + "message": "Follow the steps below to finish logging in." + }, "launchDuo": { "message": "Launch Duo in Browser" }, @@ -3463,9 +3509,27 @@ "sshkeyApprovalTitle": { "message": "Confirm SSH key usage" }, + "agentForwardingWarningTitle": { + "message": "Warning: Agent Forwarding" + }, + "agentForwardingWarningText": { + "message": "This request comes from a remote device that you are logged into" + }, "sshkeyApprovalMessageInfix": { "message": "is requesting access to" }, + "sshkeyApprovalMessageSuffix": { + "message": "in order to" + }, + "sshActionLogin": { + "message": "authenticate to a server" + }, + "sshActionSign": { + "message": "sign a message" + }, + "sshActionGitSign": { + "message": "sign a git commit" + }, "unknownApplication": { "message": "An application" }, diff --git a/apps/desktop/src/locales/th/messages.json b/apps/desktop/src/locales/th/messages.json index ad1592f3247..a3d94412a04 100644 --- a/apps/desktop/src/locales/th/messages.json +++ b/apps/desktop/src/locales/th/messages.json @@ -652,6 +652,15 @@ "logInToBitwarden": { "message": "Log in to Bitwarden" }, + "enterTheCodeSentToYourEmail": { + "message": "Enter the code sent to your email" + }, + "enterTheCodeFromYourAuthenticatorApp": { + "message": "Enter the code from your authenticator app" + }, + "pressYourYubiKeyToAuthenticate": { + "message": "Press your YubiKey to authenticate" + }, "logInWithPasskey": { "message": "Log in with passkey" }, @@ -704,6 +713,15 @@ "masterPassHintLabel": { "message": "Master password hint" }, + "passwordStrengthScore": { + "message": "Password strength score $SCORE$", + "placeholders": { + "score": { + "content": "$1", + "example": "4" + } + } + }, "joinOrganization": { "message": "Join organization" }, @@ -816,6 +834,9 @@ "webauthnCancelOrTimeout": { "message": "The authentication was cancelled or took too long. Please try again." }, + "openInNewTab": { + "message": "Open in new tab" + }, "invalidVerificationCode": { "message": "รหัสการตรวจสอบสิทธิ์ไม่ถูกต้อง" }, @@ -846,12 +867,22 @@ "rememberMe": { "message": "จดจำการเข้าระบบของฉัน" }, + "dontAskAgainOnThisDeviceFor30Days": { + "message": "Don't ask again on this device for 30 days" + }, "sendVerificationCodeEmailAgain": { "message": "ส่งอีเมล์ยืนยันรหัสอีกครั้ง" }, "useAnotherTwoStepMethod": { "message": "ใช้วิธีลงชื่อเข้าใช้แบบสองขั้นตอนวิธีอื่น" }, + "selectAnotherMethod": { + "message": "Select another method", + "description": "Select another two-step login method" + }, + "useYourRecoveryCode": { + "message": "Use your recovery code" + }, "insertYubiKey": { "message": "เสียบ YubiKey ของคุณเข้ากับพอร์ต USB ของคอมพิวเตอร์ จากนั้นแตะปุ่ม" }, @@ -918,6 +949,9 @@ "twoStepOptions": { "message": "ตัวเลือกการเข้าสู่ระบบแบบสองขั้นตอน" }, + "selectTwoStepLoginMethod": { + "message": "Select two-step login method" + }, "selfHostedEnvironment": { "message": "Self-hosted Environment" }, @@ -2247,6 +2281,12 @@ "webAuthnAuthenticate": { "message": "Authenticate WebAuthn" }, + "readSecurityKey": { + "message": "Read security key" + }, + "awaitingSecurityKeyInteraction": { + "message": "Awaiting security key interaction..." + }, "hideEmail": { "message": "Hide my email address from recipients." }, @@ -3206,6 +3246,12 @@ "duoRequiredByOrgForAccount": { "message": "Duo two-step login is required for your account." }, + "duoTwoFactorRequiredPageSubtitle": { + "message": "Duo two-step login is required for your account. Follow the steps below to finish logging in." + }, + "followTheStepsBelowToFinishLoggingIn": { + "message": "Follow the steps below to finish logging in." + }, "launchDuo": { "message": "Launch Duo in Browser" }, @@ -3463,9 +3509,27 @@ "sshkeyApprovalTitle": { "message": "Confirm SSH key usage" }, + "agentForwardingWarningTitle": { + "message": "Warning: Agent Forwarding" + }, + "agentForwardingWarningText": { + "message": "This request comes from a remote device that you are logged into" + }, "sshkeyApprovalMessageInfix": { "message": "is requesting access to" }, + "sshkeyApprovalMessageSuffix": { + "message": "in order to" + }, + "sshActionLogin": { + "message": "authenticate to a server" + }, + "sshActionSign": { + "message": "sign a message" + }, + "sshActionGitSign": { + "message": "sign a git commit" + }, "unknownApplication": { "message": "An application" }, diff --git a/apps/desktop/src/locales/tr/messages.json b/apps/desktop/src/locales/tr/messages.json index 354bbfa823b..ec166bd1281 100644 --- a/apps/desktop/src/locales/tr/messages.json +++ b/apps/desktop/src/locales/tr/messages.json @@ -652,6 +652,15 @@ "logInToBitwarden": { "message": "Bitwarden'a giriş yapın" }, + "enterTheCodeSentToYourEmail": { + "message": "E-posta adresinize gönderilen kodu girin" + }, + "enterTheCodeFromYourAuthenticatorApp": { + "message": "Kimlik doğrulama uygulamanızdaki kodu girin" + }, + "pressYourYubiKeyToAuthenticate": { + "message": "Press your YubiKey to authenticate" + }, "logInWithPasskey": { "message": "Geçiş anahtarıyla giriş yap" }, @@ -704,6 +713,15 @@ "masterPassHintLabel": { "message": "Ana parola ipucu" }, + "passwordStrengthScore": { + "message": "Password strength score $SCORE$", + "placeholders": { + "score": { + "content": "$1", + "example": "4" + } + } + }, "joinOrganization": { "message": "Kuruluşa katıl" }, @@ -816,6 +834,9 @@ "webauthnCancelOrTimeout": { "message": "Kimlik doğrulama iptal edildi ve çok uzun sürdü. Lütfen yeniden deneyin." }, + "openInNewTab": { + "message": "Yeni sekmede aç" + }, "invalidVerificationCode": { "message": "Geçersiz doğrulama kodu" }, @@ -846,12 +867,22 @@ "rememberMe": { "message": "Beni hatırla" }, + "dontAskAgainOnThisDeviceFor30Days": { + "message": "Don't ask again on this device for 30 days" + }, "sendVerificationCodeEmailAgain": { "message": "Doğrulama kodunu yeniden e-postala" }, "useAnotherTwoStepMethod": { "message": "Başka bir iki aşamalı giriş yöntemini kullan" }, + "selectAnotherMethod": { + "message": "Select another method", + "description": "Select another two-step login method" + }, + "useYourRecoveryCode": { + "message": "Use your recovery code" + }, "insertYubiKey": { "message": "YubiKey'i bilgisayarınızın USB portuna takın, ardından düğmesine dokunun." }, @@ -918,6 +949,9 @@ "twoStepOptions": { "message": "İki aşamalı giriş seçenekleri" }, + "selectTwoStepLoginMethod": { + "message": "Select two-step login method" + }, "selfHostedEnvironment": { "message": "Şirket içinde barındırılan ortam" }, @@ -2247,6 +2281,12 @@ "webAuthnAuthenticate": { "message": "WebAuthn ile doğrula" }, + "readSecurityKey": { + "message": "Read security key" + }, + "awaitingSecurityKeyInteraction": { + "message": "Awaiting security key interaction..." + }, "hideEmail": { "message": "E-posta adresimi alıcılardan gizle." }, @@ -3206,6 +3246,12 @@ "duoRequiredByOrgForAccount": { "message": "Hesabınız için Duo iki adımlı giriş gereklidir." }, + "duoTwoFactorRequiredPageSubtitle": { + "message": "Duo two-step login is required for your account. Follow the steps below to finish logging in." + }, + "followTheStepsBelowToFinishLoggingIn": { + "message": "Follow the steps below to finish logging in." + }, "launchDuo": { "message": "Duo'yu tarayıcıda aç" }, @@ -3463,9 +3509,27 @@ "sshkeyApprovalTitle": { "message": "Confirm SSH key usage" }, + "agentForwardingWarningTitle": { + "message": "Warning: Agent Forwarding" + }, + "agentForwardingWarningText": { + "message": "This request comes from a remote device that you are logged into" + }, "sshkeyApprovalMessageInfix": { "message": "is requesting access to" }, + "sshkeyApprovalMessageSuffix": { + "message": "in order to" + }, + "sshActionLogin": { + "message": "authenticate to a server" + }, + "sshActionSign": { + "message": "sign a message" + }, + "sshActionGitSign": { + "message": "sign a git commit" + }, "unknownApplication": { "message": "An application" }, diff --git a/apps/desktop/src/locales/uk/messages.json b/apps/desktop/src/locales/uk/messages.json index e07c875914d..f1872e4a8ee 100644 --- a/apps/desktop/src/locales/uk/messages.json +++ b/apps/desktop/src/locales/uk/messages.json @@ -652,6 +652,15 @@ "logInToBitwarden": { "message": "Увійти в Bitwarden" }, + "enterTheCodeSentToYourEmail": { + "message": "Enter the code sent to your email" + }, + "enterTheCodeFromYourAuthenticatorApp": { + "message": "Enter the code from your authenticator app" + }, + "pressYourYubiKeyToAuthenticate": { + "message": "Press your YubiKey to authenticate" + }, "logInWithPasskey": { "message": "Увійти з ключем доступу" }, @@ -704,6 +713,15 @@ "masterPassHintLabel": { "message": "Підказка для головного пароля" }, + "passwordStrengthScore": { + "message": "Password strength score $SCORE$", + "placeholders": { + "score": { + "content": "$1", + "example": "4" + } + } + }, "joinOrganization": { "message": "Приєднатися до організації" }, @@ -816,6 +834,9 @@ "webauthnCancelOrTimeout": { "message": "Автентифікацію було скасовано або вона тривала надто довго. Повторіть спробу." }, + "openInNewTab": { + "message": "Open in new tab" + }, "invalidVerificationCode": { "message": "Недійсний код підтвердження" }, @@ -846,12 +867,22 @@ "rememberMe": { "message": "Запам'ятати мене" }, + "dontAskAgainOnThisDeviceFor30Days": { + "message": "Don't ask again on this device for 30 days" + }, "sendVerificationCodeEmailAgain": { "message": "Надіслати код підтвердження ще раз" }, "useAnotherTwoStepMethod": { "message": "Інший спосіб двоетапної перевірки" }, + "selectAnotherMethod": { + "message": "Select another method", + "description": "Select another two-step login method" + }, + "useYourRecoveryCode": { + "message": "Use your recovery code" + }, "insertYubiKey": { "message": "Вставте свій YubiKey в USB порт комп'ютера, потім торкніться цієї кнопки." }, @@ -918,6 +949,9 @@ "twoStepOptions": { "message": "Налаштування двоетапної перевірки" }, + "selectTwoStepLoginMethod": { + "message": "Select two-step login method" + }, "selfHostedEnvironment": { "message": "Середовище власного хостингу" }, @@ -2247,6 +2281,12 @@ "webAuthnAuthenticate": { "message": "Автентифікація WebAuthn" }, + "readSecurityKey": { + "message": "Read security key" + }, + "awaitingSecurityKeyInteraction": { + "message": "Awaiting security key interaction..." + }, "hideEmail": { "message": "Приховувати мою адресу електронної пошти від отримувачів." }, @@ -3206,6 +3246,12 @@ "duoRequiredByOrgForAccount": { "message": "Для вашого облікового запису необхідна двоетапна перевірка з Duo." }, + "duoTwoFactorRequiredPageSubtitle": { + "message": "Duo two-step login is required for your account. Follow the steps below to finish logging in." + }, + "followTheStepsBelowToFinishLoggingIn": { + "message": "Follow the steps below to finish logging in." + }, "launchDuo": { "message": "Запустити Duo в браузері" }, @@ -3463,9 +3509,27 @@ "sshkeyApprovalTitle": { "message": "Підтвердження використання ключа SSH" }, + "agentForwardingWarningTitle": { + "message": "Warning: Agent Forwarding" + }, + "agentForwardingWarningText": { + "message": "This request comes from a remote device that you are logged into" + }, "sshkeyApprovalMessageInfix": { "message": "запитує доступ до" }, + "sshkeyApprovalMessageSuffix": { + "message": "in order to" + }, + "sshActionLogin": { + "message": "authenticate to a server" + }, + "sshActionSign": { + "message": "sign a message" + }, + "sshActionGitSign": { + "message": "sign a git commit" + }, "unknownApplication": { "message": "Програма" }, diff --git a/apps/desktop/src/locales/vi/messages.json b/apps/desktop/src/locales/vi/messages.json index 96e12ee40da..6d34d65726a 100644 --- a/apps/desktop/src/locales/vi/messages.json +++ b/apps/desktop/src/locales/vi/messages.json @@ -652,6 +652,15 @@ "logInToBitwarden": { "message": "Log in to Bitwarden" }, + "enterTheCodeSentToYourEmail": { + "message": "Enter the code sent to your email" + }, + "enterTheCodeFromYourAuthenticatorApp": { + "message": "Enter the code from your authenticator app" + }, + "pressYourYubiKeyToAuthenticate": { + "message": "Press your YubiKey to authenticate" + }, "logInWithPasskey": { "message": "Log in with passkey" }, @@ -704,6 +713,15 @@ "masterPassHintLabel": { "message": "Gợi ý mật khẩu chính" }, + "passwordStrengthScore": { + "message": "Password strength score $SCORE$", + "placeholders": { + "score": { + "content": "$1", + "example": "4" + } + } + }, "joinOrganization": { "message": "Tham gia tổ chức" }, @@ -816,6 +834,9 @@ "webauthnCancelOrTimeout": { "message": "Quá trình xác thực đã bị hủy hoặc mất quá nhiều thời gian. Vui lòng thử lại." }, + "openInNewTab": { + "message": "Open in new tab" + }, "invalidVerificationCode": { "message": "Mã xác minh không đúng" }, @@ -846,12 +867,22 @@ "rememberMe": { "message": "Ghi nhớ đăng nhập" }, + "dontAskAgainOnThisDeviceFor30Days": { + "message": "Don't ask again on this device for 30 days" + }, "sendVerificationCodeEmailAgain": { "message": "Gửi lại email chứa mã xác minh" }, "useAnotherTwoStepMethod": { "message": "Sử dụng phương pháp xác minh hai lớp khác" }, + "selectAnotherMethod": { + "message": "Select another method", + "description": "Select another two-step login method" + }, + "useYourRecoveryCode": { + "message": "Use your recovery code" + }, "insertYubiKey": { "message": "Cắm YubiKey vào cổng USB trên máy tính bạn và bấm nút trên Yubikey." }, @@ -918,6 +949,9 @@ "twoStepOptions": { "message": "Tùy chọn xác minh hai bước" }, + "selectTwoStepLoginMethod": { + "message": "Select two-step login method" + }, "selfHostedEnvironment": { "message": "Môi trường tự lưu trữ" }, @@ -2247,6 +2281,12 @@ "webAuthnAuthenticate": { "message": "Xác thực WebAuthn" }, + "readSecurityKey": { + "message": "Read security key" + }, + "awaitingSecurityKeyInteraction": { + "message": "Awaiting security key interaction..." + }, "hideEmail": { "message": "Ẩn địa chỉ email của tôi khỏi người nhận." }, @@ -3206,6 +3246,12 @@ "duoRequiredByOrgForAccount": { "message": "Tài khoản của bạn yêu cầu xác minh hai bước với Duo." }, + "duoTwoFactorRequiredPageSubtitle": { + "message": "Duo two-step login is required for your account. Follow the steps below to finish logging in." + }, + "followTheStepsBelowToFinishLoggingIn": { + "message": "Follow the steps below to finish logging in." + }, "launchDuo": { "message": "Khởi chạy Duo trong trình duyệt" }, @@ -3463,9 +3509,27 @@ "sshkeyApprovalTitle": { "message": "Confirm SSH key usage" }, + "agentForwardingWarningTitle": { + "message": "Warning: Agent Forwarding" + }, + "agentForwardingWarningText": { + "message": "This request comes from a remote device that you are logged into" + }, "sshkeyApprovalMessageInfix": { "message": "is requesting access to" }, + "sshkeyApprovalMessageSuffix": { + "message": "in order to" + }, + "sshActionLogin": { + "message": "authenticate to a server" + }, + "sshActionSign": { + "message": "sign a message" + }, + "sshActionGitSign": { + "message": "sign a git commit" + }, "unknownApplication": { "message": "An application" }, diff --git a/apps/desktop/src/locales/zh_CN/messages.json b/apps/desktop/src/locales/zh_CN/messages.json index fd1697e06b4..76a7dae11d3 100644 --- a/apps/desktop/src/locales/zh_CN/messages.json +++ b/apps/desktop/src/locales/zh_CN/messages.json @@ -652,6 +652,15 @@ "logInToBitwarden": { "message": "登录到 Bitwarden" }, + "enterTheCodeSentToYourEmail": { + "message": "输入发送到您的电子邮箱的代码" + }, + "enterTheCodeFromYourAuthenticatorApp": { + "message": "输入来自您的验证器 App 的代码" + }, + "pressYourYubiKeyToAuthenticate": { + "message": "按下 YubiKey 以验证身份" + }, "logInWithPasskey": { "message": "使用通行密钥登录" }, @@ -704,6 +713,15 @@ "masterPassHintLabel": { "message": "主密码提示" }, + "passwordStrengthScore": { + "message": "密码强度评分 $SCORE$", + "placeholders": { + "score": { + "content": "$1", + "example": "4" + } + } + }, "joinOrganization": { "message": "加入组织" }, @@ -816,6 +834,9 @@ "webauthnCancelOrTimeout": { "message": "身份验证被取消或耗时过长。请重试。" }, + "openInNewTab": { + "message": "在新标签页中打开" + }, "invalidVerificationCode": { "message": "无效的验证码" }, @@ -846,17 +867,27 @@ "rememberMe": { "message": "记住我" }, + "dontAskAgainOnThisDeviceFor30Days": { + "message": "30 天内在此设备上不再询问" + }, "sendVerificationCodeEmailAgain": { "message": "再次发送验证码电子邮件" }, "useAnotherTwoStepMethod": { "message": "使用其他两步登录方式" }, + "selectAnotherMethod": { + "message": "选择其他方式", + "description": "Select another two-step login method" + }, + "useYourRecoveryCode": { + "message": "使用您的恢复代码" + }, "insertYubiKey": { "message": "将您的 YubiKey 插入计算机的 USB 端口,然后触摸其按钮。" }, "insertU2f": { - "message": "将您的安全钥匙插入计算机的 USB 端口。如果它有按钮,请触摸它。" + "message": "将您的安全密钥插入计算机的 USB 端口。如果它有按钮,请触摸它。" }, "recoveryCodeDesc": { "message": "无法访问您所有的双重身份提供程序吗?请使用您的恢复代码来关闭您账户中所有的双重身份提供程序。" @@ -872,7 +903,7 @@ "description": "'Bitwarden Authenticator' is a product name and should not be translated." }, "yubiKeyTitleV2": { - "message": "Yubico OTP 安全钥匙" + "message": "Yubico OTP 安全密钥" }, "yubiKeyDesc": { "message": "使用 YubiKey 来访问您的账户。支持 YubiKey 4、4 Nano、4C 以及 NEO 设备。" @@ -882,7 +913,7 @@ "description": "'Duo Security' and 'Duo Mobile' are product names and should not be translated." }, "duoOrganizationDesc": { - "message": "为您的组织使用 Duo Security 的 Duo 移动 App、短信、电话或 U2F 安全钥匙来进行验证。", + "message": "为您的组织使用 Duo Security 的 Duo 移动 App、短信、电话或 U2F 安全密钥来进行验证。", "description": "'Duo Security' and 'Duo Mobile' are product names and should not be translated." }, "verifyIdentity": { @@ -898,7 +929,7 @@ "message": "FIDO2 WebAuthn" }, "webAuthnDesc": { - "message": "使用任何 WebAuthn 兼容的安全钥匙访问您的帐户。" + "message": "使用任何 WebAuthn 兼容的安全密钥访问您的帐户。" }, "emailTitle": { "message": "电子邮箱" @@ -913,11 +944,14 @@ "message": "此账户已设置两步登录,但此设备不支持任何已配置的两步登录提供程序。" }, "noTwoStepProviders2": { - "message": "请添加能更好支持跨设备使用的其他提供程序(例如验证器 App)。" + "message": "请添加其他跨设备支持更好的提供程序(例如验证器 App)。" }, "twoStepOptions": { "message": "两步登录选项" }, + "selectTwoStepLoginMethod": { + "message": "选择两步登录方式" + }, "selfHostedEnvironment": { "message": "自托管环境" }, @@ -1127,7 +1161,7 @@ "message": "无效的主密码" }, "twoStepLoginConfirmation": { - "message": "两步登录要求您从其他设备(例如安全钥匙、验证器 App、短信、电话或者电子邮件)来验证您的登录,这能使您的账户更加安全。两步登录需要在 bitwarden.com 网页版密码库中设置。现在访问此网站吗?" + "message": "两步登录要求您从其他设备(例如安全密钥、验证器 App、短信、电话或者电子邮件)来验证您的登录,这能使您的账户更加安全。两步登录需要在 bitwarden.com 网页版密码库中设置。现在访问此网站吗?" }, "twoStepLogin": { "message": "两步登录" @@ -1542,7 +1576,7 @@ "message": "没有在已知的数据泄露中发现此密码,它暂时比较安全。" }, "baseDomain": { - "message": "基础域", + "message": "基础域名", "description": "Domain name. Ex. website.com" }, "domainName": { @@ -1721,7 +1755,7 @@ "message": "脆弱的主密码" }, "weakMasterPasswordDesc": { - "message": "您选择的主密码较弱。您应该使用强密码(或密码短语)来正确保护您的 Bitwarden 账户。仍要使用此主密码吗?" + "message": "您选择的主密码较弱。您应该使用强密码(或密码短语)来正确保护您的 Bitwarden 账户。确定要使用这个主密码吗?" }, "pin": { "message": "PIN 码", @@ -2158,7 +2192,7 @@ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "createdSend": { - "message": "Send 已创建", + "message": "Send 已添加", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "editedSend": { @@ -2177,7 +2211,7 @@ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "createSend": { - "message": "创建 Send", + "message": "新增 Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendTextDesc": { @@ -2247,6 +2281,12 @@ "webAuthnAuthenticate": { "message": "验证 WebAuthn" }, + "readSecurityKey": { + "message": "读取安全密钥" + }, + "awaitingSecurityKeyInteraction": { + "message": "等待安全密钥交互……" + }, "hideEmail": { "message": "对接收者隐藏我的电子邮箱地址。" }, @@ -2287,7 +2327,7 @@ "message": "您的组织禁用了信任设备加密。要访问您的密码库,请设置一个主密码。" }, "tryAgain": { - "message": "请重试" + "message": "重试" }, "verificationRequiredForActionSetPinToContinue": { "message": "此操作需要验证。设置一个 PIN 码以继续。" @@ -3206,6 +3246,12 @@ "duoRequiredByOrgForAccount": { "message": "您的账户要求使用 Duo 两步登录。" }, + "duoTwoFactorRequiredPageSubtitle": { + "message": "您的账户要求使用 Duo 两步登录。请按照以下步骤完成登录。" + }, + "followTheStepsBelowToFinishLoggingIn": { + "message": "按照以下步骤完成登录。" + }, "launchDuo": { "message": "在浏览器中启动 Duo" }, @@ -3463,9 +3509,27 @@ "sshkeyApprovalTitle": { "message": "确认 SSH 密钥的使用" }, + "agentForwardingWarningTitle": { + "message": "警告:代理转发" + }, + "agentForwardingWarningText": { + "message": "此请求来自您登录的某台远程设备" + }, "sshkeyApprovalMessageInfix": { "message": "正在请求访问" }, + "sshkeyApprovalMessageSuffix": { + "message": "为了" + }, + "sshActionLogin": { + "message": "向服务器验证身份" + }, + "sshActionSign": { + "message": "签署一条消息" + }, + "sshActionGitSign": { + "message": "签名一个 Git 提交" + }, "unknownApplication": { "message": "某个应用程序" }, diff --git a/apps/desktop/src/locales/zh_TW/messages.json b/apps/desktop/src/locales/zh_TW/messages.json index 9f64b0fd8cf..9cf606563b8 100644 --- a/apps/desktop/src/locales/zh_TW/messages.json +++ b/apps/desktop/src/locales/zh_TW/messages.json @@ -652,6 +652,15 @@ "logInToBitwarden": { "message": "登入 Bitwarden" }, + "enterTheCodeSentToYourEmail": { + "message": "Enter the code sent to your email" + }, + "enterTheCodeFromYourAuthenticatorApp": { + "message": "Enter the code from your authenticator app" + }, + "pressYourYubiKeyToAuthenticate": { + "message": "Press your YubiKey to authenticate" + }, "logInWithPasskey": { "message": "以通行密鑰 (passkey) 登入" }, @@ -704,6 +713,15 @@ "masterPassHintLabel": { "message": "主密碼提示" }, + "passwordStrengthScore": { + "message": "Password strength score $SCORE$", + "placeholders": { + "score": { + "content": "$1", + "example": "4" + } + } + }, "joinOrganization": { "message": "加入組織" }, @@ -816,6 +834,9 @@ "webauthnCancelOrTimeout": { "message": "驗證已被取消或時間過長。請再試一次。" }, + "openInNewTab": { + "message": "Open in new tab" + }, "invalidVerificationCode": { "message": "無效的驗證碼" }, @@ -846,12 +867,22 @@ "rememberMe": { "message": "記住我" }, + "dontAskAgainOnThisDeviceFor30Days": { + "message": "Don't ask again on this device for 30 days" + }, "sendVerificationCodeEmailAgain": { "message": "再次傳送​​包含驗證碼的電子郵件" }, "useAnotherTwoStepMethod": { "message": "使用另一種兩步驟登入方式" }, + "selectAnotherMethod": { + "message": "Select another method", + "description": "Select another two-step login method" + }, + "useYourRecoveryCode": { + "message": "Use your recovery code" + }, "insertYubiKey": { "message": "將您的 YubiKey 插入電腦的 USB 連接埠,然後按一下它的按鈕。" }, @@ -918,6 +949,9 @@ "twoStepOptions": { "message": "兩步驟登入選項" }, + "selectTwoStepLoginMethod": { + "message": "Select two-step login method" + }, "selfHostedEnvironment": { "message": "自我裝載環境" }, @@ -2247,6 +2281,12 @@ "webAuthnAuthenticate": { "message": "驗證 WebAuthn" }, + "readSecurityKey": { + "message": "Read security key" + }, + "awaitingSecurityKeyInteraction": { + "message": "Awaiting security key interaction..." + }, "hideEmail": { "message": "對收件人隱藏我的電子郵件位址。" }, @@ -3206,6 +3246,12 @@ "duoRequiredByOrgForAccount": { "message": "您的帳號要求使用 Duo 兩步驟驗證登入。" }, + "duoTwoFactorRequiredPageSubtitle": { + "message": "Duo two-step login is required for your account. Follow the steps below to finish logging in." + }, + "followTheStepsBelowToFinishLoggingIn": { + "message": "Follow the steps below to finish logging in." + }, "launchDuo": { "message": "使用瀏覽器啟動 Duo" }, @@ -3463,9 +3509,27 @@ "sshkeyApprovalTitle": { "message": "確認 SSH 密鑰使用" }, + "agentForwardingWarningTitle": { + "message": "Warning: Agent Forwarding" + }, + "agentForwardingWarningText": { + "message": "This request comes from a remote device that you are logged into" + }, "sshkeyApprovalMessageInfix": { "message": "正在請求存取權限到" }, + "sshkeyApprovalMessageSuffix": { + "message": "in order to" + }, + "sshActionLogin": { + "message": "authenticate to a server" + }, + "sshActionSign": { + "message": "sign a message" + }, + "sshActionGitSign": { + "message": "sign a git commit" + }, "unknownApplication": { "message": "應用程式" }, diff --git a/apps/desktop/src/main.ts b/apps/desktop/src/main.ts index c6e074ead91..7e417e8e5a8 100644 --- a/apps/desktop/src/main.ts +++ b/apps/desktop/src/main.ts @@ -1,5 +1,7 @@ // FIXME: Update this file to be type safe and remove this and next line // @ts-strict-ignore +import "core-js/proposals/explicit-resource-management"; + import * as path from "path"; import { app } from "electron"; diff --git a/apps/desktop/src/platform/components/approve-ssh-request.html b/apps/desktop/src/platform/components/approve-ssh-request.html index eac451a1fbe..952e3344e9c 100644 --- a/apps/desktop/src/platform/components/approve-ssh-request.html +++ b/apps/desktop/src/platform/components/approve-ssh-request.html @@ -2,8 +2,17 @@
{{ "sshkeyApprovalTitle" | i18n }}
+ + {{ 'agentForwardingWarningText' | i18n }} + + {{params.applicationName}} {{ "sshkeyApprovalMessageInfix" | i18n }} - {{params.cipherName}}. + {{params.cipherName}} + {{ "sshkeyApprovalMessageSuffix" | i18n }} {{ params.action | i18n }}
-
+
+ > + {{ "remove" | i18n }} + + > + {{ "delete" | i18n }} +
diff --git a/apps/web/src/app/admin-console/organizations/policies/policies.component.html b/apps/web/src/app/admin-console/organizations/policies/policies.component.html index 8f1e925034f..24021bb765f 100644 --- a/apps/web/src/app/admin-console/organizations/policies/policies.component.html +++ b/apps/web/src/app/admin-console/organizations/policies/policies.component.html @@ -12,7 +12,7 @@ - + {{ "on" | i18n diff --git a/apps/web/src/app/app.component.ts b/apps/web/src/app/app.component.ts index fe92cdcd3af..078884d9413 100644 --- a/apps/web/src/app/app.component.ts +++ b/apps/web/src/app/app.component.ts @@ -10,7 +10,6 @@ import { CollectionService } from "@bitwarden/admin-console/common"; import { ApiService } from "@bitwarden/common/abstractions/api.service"; import { EventUploadService } from "@bitwarden/common/abstractions/event/event-upload.service"; import { SearchService } from "@bitwarden/common/abstractions/search.service"; -import { VaultTimeoutService } from "@bitwarden/common/abstractions/vault-timeout/vault-timeout.service"; import { InternalOrganizationServiceAbstraction } from "@bitwarden/common/admin-console/abstractions/organization/organization.service.abstraction"; import { InternalPolicyService } from "@bitwarden/common/admin-console/abstractions/policy/policy.service.abstraction"; import { AccountService } from "@bitwarden/common/auth/abstractions/account.service"; @@ -19,6 +18,7 @@ import { KeyConnectorService } from "@bitwarden/common/auth/abstractions/key-con import { AuthenticationStatus } from "@bitwarden/common/auth/enums/authentication-status"; import { getUserId } from "@bitwarden/common/auth/services/account.service"; import { ProcessReloadServiceAbstraction } from "@bitwarden/common/key-management/abstractions/process-reload.service"; +import { VaultTimeoutService } from "@bitwarden/common/key-management/vault-timeout"; import { AppIdService } from "@bitwarden/common/platform/abstractions/app-id.service"; import { BroadcasterService } from "@bitwarden/common/platform/abstractions/broadcaster.service"; import { ConfigService } from "@bitwarden/common/platform/abstractions/config/config.service"; diff --git a/apps/web/src/app/auth/settings/two-factor/two-factor-setup-webauthn.component.html b/apps/web/src/app/auth/settings/two-factor/two-factor-setup-webauthn.component.html index 8e7a789d9d0..4d505161631 100644 --- a/apps/web/src/app/auth/settings/two-factor/two-factor-setup-webauthn.component.html +++ b/apps/web/src/app/auth/settings/two-factor/two-factor-setup-webauthn.component.html @@ -63,16 +63,16 @@ type="button" [bitAction]="readKey" buttonType="secondary" - [disabled]="$any(readKeyBtn).loading || webAuthnListening || !keyIdAvailable" + [disabled]="$any(readKeyBtn).loading() || webAuthnListening || !keyIdAvailable" class="tw-mr-2" #readKeyBtn > {{ "readKey" | i18n }} - + - + {{ "twoFactorU2fWaiting" | i18n }}... diff --git a/apps/web/src/app/billing/accounts/trial-initiation/trial-billing-step.component.html b/apps/web/src/app/billing/accounts/trial-initiation/trial-billing-step.component.html index b3b8668e90b..212df558d94 100644 --- a/apps/web/src/app/billing/accounts/trial-initiation/trial-billing-step.component.html +++ b/apps/web/src/app/billing/accounts/trial-initiation/trial-billing-step.component.html @@ -1,6 +1,6 @@ diff --git a/apps/web/src/app/billing/individual/user-subscription.component.html b/apps/web/src/app/billing/individual/user-subscription.component.html index 1c1382cd816..e801237467a 100644 --- a/apps/web/src/app/billing/individual/user-subscription.component.html +++ b/apps/web/src/app/billing/individual/user-subscription.component.html @@ -27,7 +27,7 @@ #reinstateBtn (click)="reinstate()" [appApiAction]="reinstatePromise" - [disabled]="$any(reinstateBtn).loading" + [disabled]="$any(reinstateBtn).loading()" > {{ "reinstateSubscription" | i18n }} @@ -109,7 +109,7 @@ class="tw-ml-auto" (click)="cancelSubscription()" [appApiAction]="cancelPromise" - [disabled]="$any(cancelBtn).loading" + [disabled]="$any(cancelBtn).loading()" *ngIf="subscription && !subscription.cancelled && !subscriptionMarkedForCancel" > {{ "cancelSubscription" | i18n }} diff --git a/apps/web/src/app/billing/organizations/change-plan-dialog.component.html b/apps/web/src/app/billing/organizations/change-plan-dialog.component.html index ca1b9245c0b..64a694cdef0 100644 --- a/apps/web/src/app/billing/organizations/change-plan-dialog.component.html +++ b/apps/web/src/app/billing/organizations/change-plan-dialog.component.html @@ -55,7 +55,7 @@ class="tw-grid tw-grid-flow-col tw-gap-4 tw-mb-4" [class]="'tw-grid-cols-' + selectableProducts.length" > -
-
+

{{ paymentSource?.description }} - + {{ "changePaymentMethod" | i18n }} @@ -382,8 +381,8 @@

-
- +
+

{{ "passwordManager" | i18n }}

@@ -550,7 +549,7 @@

- +

{{ "passwordManager" | i18n }}

@@ -706,8 +705,8 @@
-
- +
+

{{ "secretsManager" | i18n }} @@ -826,7 +825,7 @@

- +

{{ "secretsManager" | i18n }} @@ -930,9 +929,9 @@

- +

-
- +
+

@@ -963,8 +962,8 @@

-
- +
+

diff --git a/apps/web/src/app/billing/organizations/organization-plans.component.html b/apps/web/src/app/billing/organizations/organization-plans.component.html index 263ef12ebea..3b765927c3c 100644 --- a/apps/web/src/app/billing/organizations/organization-plans.component.html +++ b/apps/web/src/app/billing/organizations/organization-plans.component.html @@ -216,7 +216,7 @@ formControlName="additionalSeats" placeholder="{{ 'userSeatsDesc' | i18n }}" /> - {{ "userSeatsAdditionalDesc" | i18n diff --git a/apps/web/src/app/billing/organizations/organization-subscription-cloud.component.html b/apps/web/src/app/billing/organizations/organization-subscription-cloud.component.html index 1d8a7846d9d..062b3c05eb8 100644 --- a/apps/web/src/app/billing/organizations/organization-subscription-cloud.component.html +++ b/apps/web/src/app/billing/organizations/organization-subscription-cloud.component.html @@ -1,7 +1,7 @@ - + {{ "loading" | i18n }} diff --git a/apps/web/src/app/core/core.module.ts b/apps/web/src/app/core/core.module.ts index 56f79661b97..c835e504b5a 100644 --- a/apps/web/src/app/core/core.module.ts +++ b/apps/web/src/app/core/core.module.ts @@ -55,6 +55,10 @@ import { SsoLoginServiceAbstraction } from "@bitwarden/common/auth/abstractions/ import { ClientType } from "@bitwarden/common/enums"; import { ProcessReloadServiceAbstraction } from "@bitwarden/common/key-management/abstractions/process-reload.service"; import { EncryptService } from "@bitwarden/common/key-management/crypto/abstractions/encrypt.service"; +import { + VaultTimeout, + VaultTimeoutStringType, +} from "@bitwarden/common/key-management/vault-timeout"; import { AppIdService } from "@bitwarden/common/platform/abstractions/app-id.service"; import { ConfigService } from "@bitwarden/common/platform/abstractions/config/config.service"; import { CryptoFunctionService } from "@bitwarden/common/platform/abstractions/crypto-function.service"; @@ -94,7 +98,6 @@ import { DefaultThemeStateService, ThemeStateService, } from "@bitwarden/common/platform/theming/theme-state.service"; -import { VaultTimeout, VaultTimeoutStringType } from "@bitwarden/common/types/vault-timeout.type"; import { PasswordGenerationServiceAbstraction } from "@bitwarden/generator-legacy"; import { KdfConfigService, diff --git a/apps/web/src/app/core/init.service.ts b/apps/web/src/app/core/init.service.ts index 3623d9b0d2f..1990ce1e1ce 100644 --- a/apps/web/src/app/core/init.service.ts +++ b/apps/web/src/app/core/init.service.ts @@ -8,6 +8,7 @@ import { EventUploadService as EventUploadServiceAbstraction } from "@bitwarden/ import { AccountService } from "@bitwarden/common/auth/abstractions/account.service"; import { TwoFactorService as TwoFactorServiceAbstraction } from "@bitwarden/common/auth/abstractions/two-factor.service"; import { EncryptService } from "@bitwarden/common/key-management/crypto/abstractions/encrypt.service"; +import { DefaultVaultTimeoutService } from "@bitwarden/common/key-management/vault-timeout"; import { I18nService as I18nServiceAbstraction } from "@bitwarden/common/platform/abstractions/i18n.service"; import { SdkLoadService } from "@bitwarden/common/platform/abstractions/sdk/sdk-load.service"; import { StateService as StateServiceAbstraction } from "@bitwarden/common/platform/abstractions/state.service"; @@ -15,7 +16,6 @@ import { NotificationsService } from "@bitwarden/common/platform/notifications"; import { ContainerService } from "@bitwarden/common/platform/services/container.service"; import { UserAutoUnlockKeyService } from "@bitwarden/common/platform/services/user-auto-unlock-key.service"; import { EventUploadService } from "@bitwarden/common/services/event/event-upload.service"; -import { VaultTimeoutService } from "@bitwarden/common/services/vault-timeout/vault-timeout.service"; import { KeyService as KeyServiceAbstraction } from "@bitwarden/key-management"; import { VersionService } from "../platform/version.service"; @@ -25,7 +25,7 @@ export class InitService { constructor( @Inject(WINDOW) private win: Window, private notificationsService: NotificationsService, - private vaultTimeoutService: VaultTimeoutService, + private vaultTimeoutService: DefaultVaultTimeoutService, private i18nService: I18nServiceAbstraction, private eventUploadService: EventUploadServiceAbstraction, private twoFactorService: TwoFactorServiceAbstraction, @@ -42,7 +42,7 @@ export class InitService { init() { return async () => { - await this.sdkLoadService.load(); + await this.sdkLoadService.loadAndInit(); await this.stateService.init(); const activeAccount = await firstValueFrom(this.accountService.activeAccount$); diff --git a/apps/web/src/app/layouts/header/web-header.component.ts b/apps/web/src/app/layouts/header/web-header.component.ts index 2f0c9d4772b..e17d059160f 100644 --- a/apps/web/src/app/layouts/header/web-header.component.ts +++ b/apps/web/src/app/layouts/header/web-header.component.ts @@ -5,9 +5,11 @@ import { ActivatedRoute } from "@angular/router"; import { map, Observable } from "rxjs"; import { User } from "@bitwarden/angular/pipes/user-name.pipe"; -import { VaultTimeoutSettingsService } from "@bitwarden/common/abstractions/vault-timeout/vault-timeout-settings.service"; import { AccountService } from "@bitwarden/common/auth/abstractions/account.service"; -import { VaultTimeoutAction } from "@bitwarden/common/enums/vault-timeout-action.enum"; +import { + VaultTimeoutAction, + VaultTimeoutSettingsService, +} from "@bitwarden/common/key-management/vault-timeout"; import { MessagingService } from "@bitwarden/common/platform/abstractions/messaging.service"; import { PlatformUtilsService } from "@bitwarden/common/platform/abstractions/platform-utils.service"; import { UserId } from "@bitwarden/common/types/guid"; diff --git a/apps/web/src/app/layouts/header/web-header.stories.ts b/apps/web/src/app/layouts/header/web-header.stories.ts index 80e98ba7a57..571e78aab59 100644 --- a/apps/web/src/app/layouts/header/web-header.stories.ts +++ b/apps/web/src/app/layouts/header/web-header.stories.ts @@ -11,9 +11,11 @@ import { import { BehaviorSubject, combineLatest, map, of } from "rxjs"; import { JslibModule } from "@bitwarden/angular/jslib.module"; -import { VaultTimeoutSettingsService } from "@bitwarden/common/abstractions/vault-timeout/vault-timeout-settings.service"; import { AccountService } from "@bitwarden/common/auth/abstractions/account.service"; -import { VaultTimeoutAction } from "@bitwarden/common/enums/vault-timeout-action.enum"; +import { + VaultTimeoutAction, + VaultTimeoutSettingsService, +} from "@bitwarden/common/key-management/vault-timeout"; 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"; diff --git a/apps/web/src/app/oss-routing.module.ts b/apps/web/src/app/oss-routing.module.ts index 81057426500..091c5440d70 100644 --- a/apps/web/src/app/oss-routing.module.ts +++ b/apps/web/src/app/oss-routing.module.ts @@ -11,7 +11,6 @@ import { unauthGuardFn, activeAuthGuard, } from "@bitwarden/angular/auth/guards"; -import { canAccessFeature } from "@bitwarden/angular/platform/guard/feature-flag.guard"; import { NewDeviceVerificationNoticeGuard } from "@bitwarden/angular/vault/guards"; import { AnonLayoutWrapperComponent, @@ -42,7 +41,6 @@ import { NewDeviceVerificationComponent, DeviceVerificationIcon, } from "@bitwarden/auth/angular"; -import { FeatureFlag } from "@bitwarden/common/enums/feature-flag.enum"; import { LockComponent } from "@bitwarden/key-management-ui"; import { NewDeviceVerificationNoticePageOneComponent, @@ -611,11 +609,7 @@ const routes: Routes = [ }, { path: "device-verification", - canActivate: [ - canAccessFeature(FeatureFlag.NewDeviceVerification), - unauthGuardFn(), - activeAuthGuard(), - ], + canActivate: [unauthGuardFn(), activeAuthGuard()], children: [ { path: "", diff --git a/apps/web/src/app/platform/web-sdk-load.service.ts b/apps/web/src/app/platform/web-sdk-load.service.ts index cae3399b81e..8be3d20b0a7 100644 --- a/apps/web/src/app/platform/web-sdk-load.service.ts +++ b/apps/web/src/app/platform/web-sdk-load.service.ts @@ -18,7 +18,7 @@ const supported = (() => { return false; })(); -export class WebSdkLoadService implements SdkLoadService { +export class WebSdkLoadService extends SdkLoadService { async load(): Promise { let module: any; if (supported) { diff --git a/apps/web/src/app/settings/preferences.component.ts b/apps/web/src/app/settings/preferences.component.ts index 09dc7a3287b..2b3dba3f4bf 100644 --- a/apps/web/src/app/settings/preferences.component.ts +++ b/apps/web/src/app/settings/preferences.component.ts @@ -4,22 +4,22 @@ import { Component, OnDestroy, OnInit } from "@angular/core"; import { FormBuilder } from "@angular/forms"; import { concatMap, filter, firstValueFrom, map, Observable, Subject, takeUntil, tap } from "rxjs"; -import { VaultTimeoutSettingsService } from "@bitwarden/common/abstractions/vault-timeout/vault-timeout-settings.service"; import { PolicyService } from "@bitwarden/common/admin-console/abstractions/policy/policy.service.abstraction"; import { PolicyType } from "@bitwarden/common/admin-console/enums"; import { AccountService } from "@bitwarden/common/auth/abstractions/account.service"; import { DomainSettingsService } from "@bitwarden/common/autofill/services/domain-settings.service"; -import { VaultTimeoutAction } from "@bitwarden/common/enums/vault-timeout-action.enum"; +import { + VaultTimeout, + VaultTimeoutAction, + VaultTimeoutOption, + VaultTimeoutSettingsService, + VaultTimeoutStringType, +} from "@bitwarden/common/key-management/vault-timeout"; import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; import { PlatformUtilsService } from "@bitwarden/common/platform/abstractions/platform-utils.service"; import { ThemeType } from "@bitwarden/common/platform/enums"; import { Utils } from "@bitwarden/common/platform/misc/utils"; import { ThemeStateService } from "@bitwarden/common/platform/theming/theme-state.service"; -import { - VaultTimeout, - VaultTimeoutOption, - VaultTimeoutStringType, -} from "@bitwarden/common/types/vault-timeout.type"; import { DialogService } from "@bitwarden/components"; @Component({ diff --git a/apps/web/src/app/tools/reports/pages/inactive-two-factor-report.component.html b/apps/web/src/app/tools/reports/pages/inactive-two-factor-report.component.html index 52bbb1c5e6d..e667a65235b 100644 --- a/apps/web/src/app/tools/reports/pages/inactive-two-factor-report.component.html +++ b/apps/web/src/app/tools/reports/pages/inactive-two-factor-report.component.html @@ -47,14 +47,19 @@ - {{ r.name }} + + {{ r.name }} + + + {{ r.name }} + x.id === c.id); } } diff --git a/apps/web/src/app/tools/reports/pages/organizations/inactive-two-factor-report.component.ts b/apps/web/src/app/tools/reports/pages/organizations/inactive-two-factor-report.component.ts index 8a2fc333c64..9b53d583b99 100644 --- a/apps/web/src/app/tools/reports/pages/organizations/inactive-two-factor-report.component.ts +++ b/apps/web/src/app/tools/reports/pages/organizations/inactive-two-factor-report.component.ts @@ -13,6 +13,7 @@ import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.servic import { LogService } from "@bitwarden/common/platform/abstractions/log.service"; import { CipherService } from "@bitwarden/common/vault/abstractions/cipher.service"; import { SyncService } from "@bitwarden/common/vault/abstractions/sync/sync.service.abstraction"; +import { Cipher } from "@bitwarden/common/vault/models/domain/cipher"; import { CipherView } from "@bitwarden/common/vault/models/view/cipher.view"; import { DialogService } from "@bitwarden/components"; import { CipherFormConfigService, PasswordRepromptService } from "@bitwarden/vault"; @@ -41,6 +42,9 @@ export class InactiveTwoFactorReportComponent extends BaseInactiveTwoFactorReportComponent implements OnInit { + // Contains a list of ciphers, the user running the report, can manage + private manageableCiphers: Cipher[]; + constructor( cipherService: CipherService, dialogService: DialogService, @@ -80,6 +84,7 @@ export class InactiveTwoFactorReportComponent .organizations$(userId) .pipe(getOrganizationById(params.organizationId)), ); + this.manageableCiphers = await this.cipherService.getAll(userId); await super.ngOnInit(); }); } @@ -87,4 +92,11 @@ export class InactiveTwoFactorReportComponent getAllCiphers(): Promise { return this.cipherService.getAllFromApiForOrganization(this.organization.id); } + + protected canManageCipher(c: CipherView): boolean { + if (c.collectionIds.length === 0) { + return true; + } + return this.manageableCiphers.some((x) => x.id === c.id); + } } diff --git a/apps/web/src/app/tools/reports/pages/organizations/reused-passwords-report.component.ts b/apps/web/src/app/tools/reports/pages/organizations/reused-passwords-report.component.ts index 1e2f5225d59..bcd573fb09d 100644 --- a/apps/web/src/app/tools/reports/pages/organizations/reused-passwords-report.component.ts +++ b/apps/web/src/app/tools/reports/pages/organizations/reused-passwords-report.component.ts @@ -89,6 +89,9 @@ export class ReusedPasswordsReportComponent } canManageCipher(c: CipherView): boolean { + if (c.collectionIds.length === 0) { + return true; + } return this.manageableCiphers.some((x) => x.id === c.id); } } diff --git a/apps/web/src/app/tools/reports/pages/organizations/unsecured-websites-report.component.ts b/apps/web/src/app/tools/reports/pages/organizations/unsecured-websites-report.component.ts index 156f3331d32..e653a6b9a05 100644 --- a/apps/web/src/app/tools/reports/pages/organizations/unsecured-websites-report.component.ts +++ b/apps/web/src/app/tools/reports/pages/organizations/unsecured-websites-report.component.ts @@ -13,6 +13,7 @@ import { AccountService } from "@bitwarden/common/auth/abstractions/account.serv import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; import { CipherService } from "@bitwarden/common/vault/abstractions/cipher.service"; import { SyncService } from "@bitwarden/common/vault/abstractions/sync/sync.service.abstraction"; +import { Cipher } from "@bitwarden/common/vault/models/domain/cipher"; import { CipherView } from "@bitwarden/common/vault/models/view/cipher.view"; import { DialogService } from "@bitwarden/components"; import { CipherFormConfigService, PasswordRepromptService } from "@bitwarden/vault"; @@ -41,6 +42,9 @@ export class UnsecuredWebsitesReportComponent extends BaseUnsecuredWebsitesReportComponent implements OnInit { + // Contains a list of ciphers, the user running the report, can manage + private manageableCiphers: Cipher[]; + constructor( cipherService: CipherService, dialogService: DialogService, @@ -80,6 +84,7 @@ export class UnsecuredWebsitesReportComponent .organizations$(userId) .pipe(getOrganizationById(params.organizationId)), ); + this.manageableCiphers = await this.cipherService.getAll(userId); await super.ngOnInit(); }); } @@ -87,4 +92,11 @@ export class UnsecuredWebsitesReportComponent getAllCiphers(): Promise { return this.cipherService.getAllFromApiForOrganization(this.organization.id); } + + protected canManageCipher(c: CipherView): boolean { + if (c.collectionIds.length === 0) { + return true; + } + return this.manageableCiphers.some((x) => x.id === c.id); + } } diff --git a/apps/web/src/app/tools/reports/pages/organizations/weak-passwords-report.component.ts b/apps/web/src/app/tools/reports/pages/organizations/weak-passwords-report.component.ts index 82abc8561fb..41018d69c22 100644 --- a/apps/web/src/app/tools/reports/pages/organizations/weak-passwords-report.component.ts +++ b/apps/web/src/app/tools/reports/pages/organizations/weak-passwords-report.component.ts @@ -93,6 +93,9 @@ export class WeakPasswordsReportComponent } canManageCipher(c: CipherView): boolean { + if (c.collectionIds.length === 0) { + return true; + } return this.manageableCiphers.some((x) => x.id === c.id); } } diff --git a/apps/web/src/app/tools/reports/pages/unsecured-websites-report.component.html b/apps/web/src/app/tools/reports/pages/unsecured-websites-report.component.html index 9293915363e..6632413a79e 100644 --- a/apps/web/src/app/tools/reports/pages/unsecured-websites-report.component.html +++ b/apps/web/src/app/tools/reports/pages/unsecured-websites-report.component.html @@ -47,15 +47,19 @@ - - {{ r.name }} - + + {{ r.name }} + + + {{ r.name }} + { - const containsUnsecured = this.cipherContainsUnsecured(c); - if (containsUnsecured === false) { - return false; - } - - const canView = this.canView(c, allCollections); - return canView; + return this.cipherContainsUnsecured(c); }); this.filterCiphersByOrg(unsecuredCiphers); @@ -74,7 +67,12 @@ export class UnsecuredWebsitesReportComponent extends CipherReportComponent impl * @param cipher Current cipher with unsecured uri */ private cipherContainsUnsecured(cipher: CipherView): boolean { - if (cipher.type !== CipherType.Login || !cipher.login.hasUris || cipher.isDeleted) { + if ( + cipher.type !== CipherType.Login || + !cipher.login.hasUris || + cipher.isDeleted || + (!this.organization && !cipher.edit) + ) { return false; } @@ -85,19 +83,13 @@ export class UnsecuredWebsitesReportComponent extends CipherReportComponent impl } /** - * If the user does not have readonly set or it's false they have the ability to edit - * @param cipher Current cipher with unsecured uri - * @param allCollections The collections for the user + * Provides a way to determine if someone with permissions to run an organizational report is also able to view/edit ciphers within the results + * Default to true for indivduals running reports on their own vault. + * @param c CipherView + * @returns boolean */ - private canView(cipher: CipherView, allCollections: Collection[]): boolean { - if (!cipher.organizationId) { - return true; - } - - return ( - allCollections.filter( - (item) => cipher.collectionIds.indexOf(item.id) > -1 && !(item.readOnly ?? false), - ).length > 0 - ); + protected canManageCipher(c: CipherView): boolean { + // this will only ever be false from the org view; + return true; } } diff --git a/apps/web/src/locales/af/messages.json b/apps/web/src/locales/af/messages.json index 5c058d2ad6e..89bd6740eba 100644 --- a/apps/web/src/locales/af/messages.json +++ b/apps/web/src/locales/af/messages.json @@ -5,6 +5,9 @@ "criticalApplications": { "message": "Critical applications" }, + "noCriticalAppsAtRisk": { + "message": "No critical applications at risk" + }, "accessIntelligence": { "message": "Access Intelligence" }, @@ -1161,6 +1164,15 @@ "logInToBitwarden": { "message": "Log in to Bitwarden" }, + "enterTheCodeSentToYourEmail": { + "message": "Enter the code sent to your email" + }, + "enterTheCodeFromYourAuthenticatorApp": { + "message": "Enter the code from your authenticator app" + }, + "pressYourYubiKeyToAuthenticate": { + "message": "Press your YubiKey to authenticate" + }, "authenticationTimeout": { "message": "Authentication timeout" }, @@ -1443,12 +1455,22 @@ "rememberMe": { "message": "Onthou my" }, + "dontAskAgainOnThisDeviceFor30Days": { + "message": "Don't ask again on this device for 30 days" + }, "sendVerificationCodeEmailAgain": { "message": "Stuur weer e-pos met bevestigingskode" }, "useAnotherTwoStepMethod": { "message": "Gebruik ’n ander tweestapaantekenmetode" }, + "selectAnotherMethod": { + "message": "Select another method", + "description": "Select another two-step login method" + }, + "useYourRecoveryCode": { + "message": "Use your recovery code" + }, "insertYubiKey": { "message": "Plaas u YubiKey in u rekenaar se USB-poort en druk dan op sy knop." }, @@ -1467,6 +1489,9 @@ "twoStepOptions": { "message": "Opsies vir tweestapaantekening" }, + "selectTwoStepLoginMethod": { + "message": "Select two-step login method" + }, "recoveryCodeDesc": { "message": "Het u toegang tot al u tweestapaanbieders verloor? Gebruik dan u terugstelkode om alle tweestapaanbieders op u rekening te deaktiveer." }, @@ -1509,6 +1534,9 @@ "webAuthnMigrated": { "message": "(Gemigreer van FIDO)" }, + "openInNewTab": { + "message": "Open in new tab" + }, "emailTitle": { "message": "E-pos" }, @@ -4081,6 +4109,12 @@ "updateBrowserDesc": { "message": "U gebruik ’n onondersteunde webblaaier. Die webkluis werk dalk nie soos normaal nie." }, + "youHaveAPendingLoginRequest": { + "message": "You have a pending login request from another device." + }, + "reviewLoginRequest": { + "message": "Review login request" + }, "freeTrialEndPromptCount": { "message": "Your free trial ends in $COUNT$ days.", "placeholders": { @@ -4758,6 +4792,15 @@ "masterPassPolicyDesc": { "message": "Stel minimum vereistes vir hoofwagwoordsterkte." }, + "passwordStrengthScore": { + "message": "Password strength score $SCORE$", + "placeholders": { + "score": { + "content": "$1", + "example": "4" + } + } + }, "twoStepLoginPolicyTitle": { "message": "Require two-step login" }, @@ -5653,6 +5696,12 @@ "webAuthnAuthenticate": { "message": "Waarmerk WebAuthn" }, + "readSecurityKey": { + "message": "Read security key" + }, + "awaitingSecurityKeyInteraction": { + "message": "Awaiting security key interaction..." + }, "webAuthnNotSupported": { "message": "WebAuthn word nie in hierdie blaaier ondersteun nie." }, @@ -7199,6 +7248,12 @@ "duoRequiredByOrgForAccount": { "message": "Duo two-step login is required for your account." }, + "duoTwoFactorRequiredPageSubtitle": { + "message": "Duo two-step login is required for your account. Follow the steps below to finish logging in." + }, + "followTheStepsBelowToFinishLoggingIn": { + "message": "Follow the steps below to finish logging in." + }, "launchDuo": { "message": "Launch Duo" }, @@ -10437,5 +10492,23 @@ }, "removeUnlockWithPinPolicyDesc": { "message": "Do not allow members to unlock their account with a PIN." + }, + "limitedEventLogs": { + "message": "$PRODUCT_TYPE$ plans do not have access to real event logs", + "placeholders": { + "product_type": { + "content": "$1", + "example": "Teams" + } + } + }, + "upgradeForFullEvents": { + "message": "Get full access to organization event logs by upgrading to a Teams or Enterprise plan." + }, + "upgradeEventLogTitle": { + "message": "Upgrade for real event log data" + }, + "upgradeEventLogMessage": { + "message": "These events are examples only and do not reflect real events within your Bitwarden organization." } } diff --git a/apps/web/src/locales/ar/messages.json b/apps/web/src/locales/ar/messages.json index c42d23205d9..aae3889400e 100644 --- a/apps/web/src/locales/ar/messages.json +++ b/apps/web/src/locales/ar/messages.json @@ -5,6 +5,9 @@ "criticalApplications": { "message": "Critical applications" }, + "noCriticalAppsAtRisk": { + "message": "No critical applications at risk" + }, "accessIntelligence": { "message": "Access Intelligence" }, @@ -1161,6 +1164,15 @@ "logInToBitwarden": { "message": "تسجيل الدخول إلى بيتواردن" }, + "enterTheCodeSentToYourEmail": { + "message": "Enter the code sent to your email" + }, + "enterTheCodeFromYourAuthenticatorApp": { + "message": "Enter the code from your authenticator app" + }, + "pressYourYubiKeyToAuthenticate": { + "message": "Press your YubiKey to authenticate" + }, "authenticationTimeout": { "message": "مهلة المصادقة" }, @@ -1443,12 +1455,22 @@ "rememberMe": { "message": "تذكرني" }, + "dontAskAgainOnThisDeviceFor30Days": { + "message": "Don't ask again on this device for 30 days" + }, "sendVerificationCodeEmailAgain": { "message": "إرسال رمز التحقق إلى البريد الإلكتروني مرة أخرى" }, "useAnotherTwoStepMethod": { "message": "استخدام طريقة أخرى لتسجيل الدخول بخطوتين" }, + "selectAnotherMethod": { + "message": "Select another method", + "description": "Select another two-step login method" + }, + "useYourRecoveryCode": { + "message": "Use your recovery code" + }, "insertYubiKey": { "message": "Insert your YubiKey into your computer's USB port, then touch its button." }, @@ -1467,6 +1489,9 @@ "twoStepOptions": { "message": "خيارات تسجيل الدخول بخطوتين" }, + "selectTwoStepLoginMethod": { + "message": "Select two-step login method" + }, "recoveryCodeDesc": { "message": "Lost access to all of your two-step login providers? Use your recovery code to turn off all two-step login providers from your account." }, @@ -1509,6 +1534,9 @@ "webAuthnMigrated": { "message": "(Migrated from FIDO)" }, + "openInNewTab": { + "message": "Open in new tab" + }, "emailTitle": { "message": "البريد الإلكتروني" }, @@ -4081,6 +4109,12 @@ "updateBrowserDesc": { "message": "You are using an unsupported web browser. The web vault may not function properly." }, + "youHaveAPendingLoginRequest": { + "message": "You have a pending login request from another device." + }, + "reviewLoginRequest": { + "message": "Review login request" + }, "freeTrialEndPromptCount": { "message": "Your free trial ends in $COUNT$ days.", "placeholders": { @@ -4758,6 +4792,15 @@ "masterPassPolicyDesc": { "message": "Set requirements for master password strength." }, + "passwordStrengthScore": { + "message": "Password strength score $SCORE$", + "placeholders": { + "score": { + "content": "$1", + "example": "4" + } + } + }, "twoStepLoginPolicyTitle": { "message": "Require two-step login" }, @@ -5653,6 +5696,12 @@ "webAuthnAuthenticate": { "message": "Authenticate WebAuthn" }, + "readSecurityKey": { + "message": "Read security key" + }, + "awaitingSecurityKeyInteraction": { + "message": "Awaiting security key interaction..." + }, "webAuthnNotSupported": { "message": "WebAuthn is not supported in this browser." }, @@ -7199,6 +7248,12 @@ "duoRequiredByOrgForAccount": { "message": "Duo two-step login is required for your account." }, + "duoTwoFactorRequiredPageSubtitle": { + "message": "Duo two-step login is required for your account. Follow the steps below to finish logging in." + }, + "followTheStepsBelowToFinishLoggingIn": { + "message": "Follow the steps below to finish logging in." + }, "launchDuo": { "message": "Launch Duo" }, @@ -10437,5 +10492,23 @@ }, "removeUnlockWithPinPolicyDesc": { "message": "Do not allow members to unlock their account with a PIN." + }, + "limitedEventLogs": { + "message": "$PRODUCT_TYPE$ plans do not have access to real event logs", + "placeholders": { + "product_type": { + "content": "$1", + "example": "Teams" + } + } + }, + "upgradeForFullEvents": { + "message": "Get full access to organization event logs by upgrading to a Teams or Enterprise plan." + }, + "upgradeEventLogTitle": { + "message": "Upgrade for real event log data" + }, + "upgradeEventLogMessage": { + "message": "These events are examples only and do not reflect real events within your Bitwarden organization." } } diff --git a/apps/web/src/locales/az/messages.json b/apps/web/src/locales/az/messages.json index f586d92a136..b2a68c104a4 100644 --- a/apps/web/src/locales/az/messages.json +++ b/apps/web/src/locales/az/messages.json @@ -5,6 +5,9 @@ "criticalApplications": { "message": "Kritik tətbiqlər" }, + "noCriticalAppsAtRisk": { + "message": "Risk altında heç bir kritik tətbiq yoxdur" + }, "accessIntelligence": { "message": "Müraciət Kəşfiyyatı" }, @@ -1161,6 +1164,15 @@ "logInToBitwarden": { "message": "Bitwarden-ə giriş edin" }, + "enterTheCodeSentToYourEmail": { + "message": "E-poçtunuza göndərilən kodu daxil edin" + }, + "enterTheCodeFromYourAuthenticatorApp": { + "message": "Kimlik doğrulayıcı tətbiqinizdəki kodu daxil edin" + }, + "pressYourYubiKeyToAuthenticate": { + "message": "Kimliyi doğrulamaq üçün YubiKey-inizə basın" + }, "authenticationTimeout": { "message": "Kimlik doğrulama vaxtı bitdi" }, @@ -1443,12 +1455,22 @@ "rememberMe": { "message": "Məni xatırla" }, + "dontAskAgainOnThisDeviceFor30Days": { + "message": "Bu cihazda 30 gün ərzində soruşulmasın" + }, "sendVerificationCodeEmailAgain": { "message": "Doğrulama kodu olan e-poçtu yenidən göndər" }, "useAnotherTwoStepMethod": { "message": "Başqa bir iki addımlı giriş üsulu istifadə edin" }, + "selectAnotherMethod": { + "message": "Başqa üsul seçin", + "description": "Select another two-step login method" + }, + "useYourRecoveryCode": { + "message": "Geri qaytarma kodunuzu istifadə edin" + }, "insertYubiKey": { "message": "\"YubiKey\"i kompüterinizin USB portuna taxın, daha sonra düyməsinə toxunun." }, @@ -1467,6 +1489,9 @@ "twoStepOptions": { "message": "İki addımlı giriş seçimləri" }, + "selectTwoStepLoginMethod": { + "message": "İki addımlı giriş üsulunu seçin" + }, "recoveryCodeDesc": { "message": "İki addımlı giriş provayderlərinə müraciəti itirmisiniz? Hesabınızdakı bütün iki addımlı giriş provayderlərini söndürmək üçün geri qaytarma kodunuzu istifadə edin." }, @@ -1509,6 +1534,9 @@ "webAuthnMigrated": { "message": "(FIDO-dan köçürüldü)" }, + "openInNewTab": { + "message": "Yeni vərəqdə aç" + }, "emailTitle": { "message": "E-poçt" }, @@ -4081,6 +4109,12 @@ "updateBrowserDesc": { "message": "Dəstəklənməyən bir veb brauzer istifadə edirsiniz. Veb seyf düzgün işləməyə bilər." }, + "youHaveAPendingLoginRequest": { + "message": "Başqa bir cihazdan gözləyən bir giriş tələbiniz var." + }, + "reviewLoginRequest": { + "message": "Giriş tələbini incələ" + }, "freeTrialEndPromptCount": { "message": "Ödənişsiz sınaq müddətiniz $COUNT$ günə bitir.", "placeholders": { @@ -4758,6 +4792,15 @@ "masterPassPolicyDesc": { "message": "Ana parol gücü üçün tələbləri ayarla." }, + "passwordStrengthScore": { + "message": "Parolun güc xalı: $SCORE$", + "placeholders": { + "score": { + "content": "$1", + "example": "4" + } + } + }, "twoStepLoginPolicyTitle": { "message": "İki addımlı girişi tələb et" }, @@ -5653,6 +5696,12 @@ "webAuthnAuthenticate": { "message": "WebAuthn kimlik doğrulama" }, + "readSecurityKey": { + "message": "Güvənlik açarını oxu" + }, + "awaitingSecurityKeyInteraction": { + "message": "Güvənlik açarı ilə əlaqə gözlənilir..." + }, "webAuthnNotSupported": { "message": "WebAuthn bu brauzerdə dəstəklənmir." }, @@ -7199,6 +7248,12 @@ "duoRequiredByOrgForAccount": { "message": "Hesabınız üçün DUO iki addımlı giriş tələb olunur." }, + "duoTwoFactorRequiredPageSubtitle": { + "message": "Hesabınız üçün Duo iki addımlı giriş tələb olunur. Giriş prosesini tamamlamaq üçün aşağıdakı addımları izləyin." + }, + "followTheStepsBelowToFinishLoggingIn": { + "message": "Giriş prosesini tamamlamaq üçün aşağıdakı addımları izləyin." + }, "launchDuo": { "message": "DUO-nu başlat" }, @@ -10437,5 +10492,23 @@ }, "removeUnlockWithPinPolicyDesc": { "message": "Üzvlərin öz hesablarının kilidini PIN ilə açmasına icazə verilməsin." + }, + "limitedEventLogs": { + "message": "$PRODUCT_TYPE$ planında real event log-larına müraciət yoxdur", + "placeholders": { + "product_type": { + "content": "$1", + "example": "Teams" + } + } + }, + "upgradeForFullEvents": { + "message": "Teams və ya Enterprise planına yüksəldərək təşkilatın event log-larına tam müraciət əldə edin." + }, + "upgradeEventLogTitle": { + "message": "Real event log dataları üçün yüksəlt" + }, + "upgradeEventLogMessage": { + "message": "Bu event-lər sadəcə nümunədir və Bitwarden təşkilatınızdakı real event-ləri əks etdirmir." } } diff --git a/apps/web/src/locales/be/messages.json b/apps/web/src/locales/be/messages.json index 84b9ce7a599..4cffb7879ca 100644 --- a/apps/web/src/locales/be/messages.json +++ b/apps/web/src/locales/be/messages.json @@ -5,6 +5,9 @@ "criticalApplications": { "message": "Крытычныя праграмы" }, + "noCriticalAppsAtRisk": { + "message": "No critical applications at risk" + }, "accessIntelligence": { "message": "Кіраванне доступам" }, @@ -1161,6 +1164,15 @@ "logInToBitwarden": { "message": "Log in to Bitwarden" }, + "enterTheCodeSentToYourEmail": { + "message": "Enter the code sent to your email" + }, + "enterTheCodeFromYourAuthenticatorApp": { + "message": "Enter the code from your authenticator app" + }, + "pressYourYubiKeyToAuthenticate": { + "message": "Press your YubiKey to authenticate" + }, "authenticationTimeout": { "message": "Authentication timeout" }, @@ -1443,12 +1455,22 @@ "rememberMe": { "message": "Запомніць мяне" }, + "dontAskAgainOnThisDeviceFor30Days": { + "message": "Don't ask again on this device for 30 days" + }, "sendVerificationCodeEmailAgain": { "message": "Адправіць праверачны код яшчэ раз" }, "useAnotherTwoStepMethod": { "message": "Выкарыстоўваць іншы метад двухэтапнага ўваходу" }, + "selectAnotherMethod": { + "message": "Select another method", + "description": "Select another two-step login method" + }, + "useYourRecoveryCode": { + "message": "Use your recovery code" + }, "insertYubiKey": { "message": "Устаўце свой YubiKey у порт USB камп'ютара, а потым націсніце на кнопку." }, @@ -1467,6 +1489,9 @@ "twoStepOptions": { "message": "Параметры двухэтапнага ўваходу" }, + "selectTwoStepLoginMethod": { + "message": "Select two-step login method" + }, "recoveryCodeDesc": { "message": "Згубілі доступ да ўсіх варыянтаў доступу пастаўшчыкоў двухэтапнай аўтэнтыфікацыі? Скарыстайцеся кодам аднаўлення, каб адключыць праверку пастаўшчыкоў двухэтапнай аўтэнтыфікацыі для вашага ўліковага запісу." }, @@ -1509,6 +1534,9 @@ "webAuthnMigrated": { "message": "(Перанесена з FIDO)" }, + "openInNewTab": { + "message": "Open in new tab" + }, "emailTitle": { "message": "Электронная пошта" }, @@ -4081,6 +4109,12 @@ "updateBrowserDesc": { "message": "Ваш браўзер не падтрымліваецца. Вэб-сховішча можа працаваць няправільна." }, + "youHaveAPendingLoginRequest": { + "message": "You have a pending login request from another device." + }, + "reviewLoginRequest": { + "message": "Review login request" + }, "freeTrialEndPromptCount": { "message": "Your free trial ends in $COUNT$ days.", "placeholders": { @@ -4758,6 +4792,15 @@ "masterPassPolicyDesc": { "message": "Прызначце мінімальныя патрабаванні да надзейнасці асноўнага пароля." }, + "passwordStrengthScore": { + "message": "Password strength score $SCORE$", + "placeholders": { + "score": { + "content": "$1", + "example": "4" + } + } + }, "twoStepLoginPolicyTitle": { "message": "Патрабуецца двухэтапны ўваход" }, @@ -5653,6 +5696,12 @@ "webAuthnAuthenticate": { "message": "Аўтэнтыфікатар WebAuthn" }, + "readSecurityKey": { + "message": "Read security key" + }, + "awaitingSecurityKeyInteraction": { + "message": "Awaiting security key interaction..." + }, "webAuthnNotSupported": { "message": "WebAuthn не падтрымліваецца ў гэтым браўзеры." }, @@ -7199,6 +7248,12 @@ "duoRequiredByOrgForAccount": { "message": "Duo two-step login is required for your account." }, + "duoTwoFactorRequiredPageSubtitle": { + "message": "Duo two-step login is required for your account. Follow the steps below to finish logging in." + }, + "followTheStepsBelowToFinishLoggingIn": { + "message": "Follow the steps below to finish logging in." + }, "launchDuo": { "message": "Launch Duo" }, @@ -10437,5 +10492,23 @@ }, "removeUnlockWithPinPolicyDesc": { "message": "Do not allow members to unlock their account with a PIN." + }, + "limitedEventLogs": { + "message": "$PRODUCT_TYPE$ plans do not have access to real event logs", + "placeholders": { + "product_type": { + "content": "$1", + "example": "Teams" + } + } + }, + "upgradeForFullEvents": { + "message": "Get full access to organization event logs by upgrading to a Teams or Enterprise plan." + }, + "upgradeEventLogTitle": { + "message": "Upgrade for real event log data" + }, + "upgradeEventLogMessage": { + "message": "These events are examples only and do not reflect real events within your Bitwarden organization." } } diff --git a/apps/web/src/locales/bg/messages.json b/apps/web/src/locales/bg/messages.json index 059652e0daa..f51788bc724 100644 --- a/apps/web/src/locales/bg/messages.json +++ b/apps/web/src/locales/bg/messages.json @@ -5,6 +5,9 @@ "criticalApplications": { "message": "Важни приложения" }, + "noCriticalAppsAtRisk": { + "message": "Няма важни приложения в риск" + }, "accessIntelligence": { "message": "Access Intelligence" }, @@ -1161,6 +1164,15 @@ "logInToBitwarden": { "message": "Впишете се в Битуорден" }, + "enterTheCodeSentToYourEmail": { + "message": "Въведете кода изпратен на е-пощата Ви" + }, + "enterTheCodeFromYourAuthenticatorApp": { + "message": "Въведете кода от Вашето приложение за удостоверяване" + }, + "pressYourYubiKeyToAuthenticate": { + "message": "Натиснете бутона на своя YubiKey за удостоверяване" + }, "authenticationTimeout": { "message": "Време на давност за удостоверяването" }, @@ -1443,12 +1455,22 @@ "rememberMe": { "message": "Запомняне" }, + "dontAskAgainOnThisDeviceFor30Days": { + "message": "Не ме питайте отново на това устройство за 30 дни" + }, "sendVerificationCodeEmailAgain": { "message": "Повторно изпращане на писмото за потвърждение" }, "useAnotherTwoStepMethod": { "message": "Използвайте друг начин на двустепенно удостоверяване" }, + "selectAnotherMethod": { + "message": "Изберете друг метод", + "description": "Select another two-step login method" + }, + "useYourRecoveryCode": { + "message": "Използване на код за възстановяване" + }, "insertYubiKey": { "message": "Поставете устройството на YubiKey в USB порт на компютъра и натиснете бутона на устройството." }, @@ -1467,6 +1489,9 @@ "twoStepOptions": { "message": "Настройки на двустепенното удостоверяване" }, + "selectTwoStepLoginMethod": { + "message": "Изберете начин за двустепенно удостоверяване" + }, "recoveryCodeDesc": { "message": "Ако сте загубили достъп до двустепенното удостоверяване, може да използвате код за възстановяване, за да изключите двустепенното удостоверяване в абонамента си." }, @@ -1509,6 +1534,9 @@ "webAuthnMigrated": { "message": "(Мигрирано от FIDO)" }, + "openInNewTab": { + "message": "Отваряне в нов раздел" + }, "emailTitle": { "message": "Електронна поща" }, @@ -4081,6 +4109,12 @@ "updateBrowserDesc": { "message": "Ползвате неподдържан браузър. Трезорът по уеб може да не сработи правилно." }, + "youHaveAPendingLoginRequest": { + "message": "Имате чакаща заявка за вписване от друго устройство." + }, + "reviewLoginRequest": { + "message": "Преглед на заявката за вписване" + }, "freeTrialEndPromptCount": { "message": "Вашият безплатен пробен период приключва след $COUNT$ дни.", "placeholders": { @@ -4758,6 +4792,15 @@ "masterPassPolicyDesc": { "message": "Задаване на минимална сила на главната парола." }, + "passwordStrengthScore": { + "message": "Оценка на сложността на паролата: $SCORE$", + "placeholders": { + "score": { + "content": "$1", + "example": "4" + } + } + }, "twoStepLoginPolicyTitle": { "message": "Изискване на двустепенно удостоверяване" }, @@ -5653,6 +5696,12 @@ "webAuthnAuthenticate": { "message": "Идентификация WebAuthn" }, + "readSecurityKey": { + "message": "Прочитане на ключа за сигурност" + }, + "awaitingSecurityKeyInteraction": { + "message": "Изчакване на действие с ключ за сигурност…" + }, "webAuthnNotSupported": { "message": "Този браузър не поддържа WebAuthn." }, @@ -7199,6 +7248,12 @@ "duoRequiredByOrgForAccount": { "message": "Вашата регистрация изисква двустепенно удостоверяване чрез DUO." }, + "duoTwoFactorRequiredPageSubtitle": { + "message": "Вашият акаунт изисква вписване чрез двустепенно удостоверяване с Duo. Следвайте стъпките по-долу, за да завършите вписването." + }, + "followTheStepsBelowToFinishLoggingIn": { + "message": "Следвайте стъпките по-долу, за да завършите вписването." + }, "launchDuo": { "message": "Стартиране на DUO" }, @@ -10437,5 +10492,23 @@ }, "removeUnlockWithPinPolicyDesc": { "message": "Забраняване на членовете да отключват акаунтите си с ПИН." + }, + "limitedEventLogs": { + "message": "Плановете от тип „$PRODUCT_TYPE$“ нямат достъп до истинските журнали на събитията", + "placeholders": { + "product_type": { + "content": "$1", + "example": "Teams" + } + } + }, + "upgradeForFullEvents": { + "message": "Получете пълен достъп до журналите на събитията за организациите като надградите до Екипния план или този за Големи организации." + }, + "upgradeEventLogTitle": { + "message": "Надградете за достъп до истинските журнали на събитията" + }, + "upgradeEventLogMessage": { + "message": "Тези събития са само за пример и не отразяват истинските събития във Вашата организация." } } diff --git a/apps/web/src/locales/bn/messages.json b/apps/web/src/locales/bn/messages.json index afc52f85e8e..853bf4fe67d 100644 --- a/apps/web/src/locales/bn/messages.json +++ b/apps/web/src/locales/bn/messages.json @@ -5,6 +5,9 @@ "criticalApplications": { "message": "Critical applications" }, + "noCriticalAppsAtRisk": { + "message": "No critical applications at risk" + }, "accessIntelligence": { "message": "Access Intelligence" }, @@ -1161,6 +1164,15 @@ "logInToBitwarden": { "message": "Log in to Bitwarden" }, + "enterTheCodeSentToYourEmail": { + "message": "Enter the code sent to your email" + }, + "enterTheCodeFromYourAuthenticatorApp": { + "message": "Enter the code from your authenticator app" + }, + "pressYourYubiKeyToAuthenticate": { + "message": "Press your YubiKey to authenticate" + }, "authenticationTimeout": { "message": "Authentication timeout" }, @@ -1443,12 +1455,22 @@ "rememberMe": { "message": "আমাকে মনে রাখবেন" }, + "dontAskAgainOnThisDeviceFor30Days": { + "message": "Don't ask again on this device for 30 days" + }, "sendVerificationCodeEmailAgain": { "message": "আবার যাচাইকরণ কোড ইমেইলে প্রেরণ করুন" }, "useAnotherTwoStepMethod": { "message": "অন্য দ্বি-পদক্ষেপ প্রবেশ পদ্ধতি ব্যবহার করুন" }, + "selectAnotherMethod": { + "message": "Select another method", + "description": "Select another two-step login method" + }, + "useYourRecoveryCode": { + "message": "Use your recovery code" + }, "insertYubiKey": { "message": "আপনার কম্পিউটারের ইউএসবি পোর্টে আপনার YubiKey ঢোকান, তারপরে তার বোতামটি স্পর্শ করুন।" }, @@ -1467,6 +1489,9 @@ "twoStepOptions": { "message": "দ্বি-পদক্ষেপ লগইন বিকল্প" }, + "selectTwoStepLoginMethod": { + "message": "Select two-step login method" + }, "recoveryCodeDesc": { "message": "আপনার সমস্ত দ্বি-গুণক সরবরাহকারীদের অ্যাক্সেস হারিয়েছেন? আপনার অ্যাকাউন্ট থেকে সমস্ত দ্বি-গুণক সরবরাহকারীদের অক্ষম করতে আপনার পুনরুদ্ধার কোডটি ব্যবহার করুন।" }, @@ -1509,6 +1534,9 @@ "webAuthnMigrated": { "message": "(Migrated from FIDO)" }, + "openInNewTab": { + "message": "Open in new tab" + }, "emailTitle": { "message": "Email" }, @@ -4081,6 +4109,12 @@ "updateBrowserDesc": { "message": "You are using an unsupported web browser. The web vault may not function properly." }, + "youHaveAPendingLoginRequest": { + "message": "You have a pending login request from another device." + }, + "reviewLoginRequest": { + "message": "Review login request" + }, "freeTrialEndPromptCount": { "message": "Your free trial ends in $COUNT$ days.", "placeholders": { @@ -4758,6 +4792,15 @@ "masterPassPolicyDesc": { "message": "Set requirements for master password strength." }, + "passwordStrengthScore": { + "message": "Password strength score $SCORE$", + "placeholders": { + "score": { + "content": "$1", + "example": "4" + } + } + }, "twoStepLoginPolicyTitle": { "message": "Require two-step login" }, @@ -5653,6 +5696,12 @@ "webAuthnAuthenticate": { "message": "Authenticate WebAuthn" }, + "readSecurityKey": { + "message": "Read security key" + }, + "awaitingSecurityKeyInteraction": { + "message": "Awaiting security key interaction..." + }, "webAuthnNotSupported": { "message": "WebAuthn is not supported in this browser." }, @@ -7199,6 +7248,12 @@ "duoRequiredByOrgForAccount": { "message": "Duo two-step login is required for your account." }, + "duoTwoFactorRequiredPageSubtitle": { + "message": "Duo two-step login is required for your account. Follow the steps below to finish logging in." + }, + "followTheStepsBelowToFinishLoggingIn": { + "message": "Follow the steps below to finish logging in." + }, "launchDuo": { "message": "Launch Duo" }, @@ -10437,5 +10492,23 @@ }, "removeUnlockWithPinPolicyDesc": { "message": "Do not allow members to unlock their account with a PIN." + }, + "limitedEventLogs": { + "message": "$PRODUCT_TYPE$ plans do not have access to real event logs", + "placeholders": { + "product_type": { + "content": "$1", + "example": "Teams" + } + } + }, + "upgradeForFullEvents": { + "message": "Get full access to organization event logs by upgrading to a Teams or Enterprise plan." + }, + "upgradeEventLogTitle": { + "message": "Upgrade for real event log data" + }, + "upgradeEventLogMessage": { + "message": "These events are examples only and do not reflect real events within your Bitwarden organization." } } diff --git a/apps/web/src/locales/bs/messages.json b/apps/web/src/locales/bs/messages.json index 22943f0be44..83b7892bb93 100644 --- a/apps/web/src/locales/bs/messages.json +++ b/apps/web/src/locales/bs/messages.json @@ -5,6 +5,9 @@ "criticalApplications": { "message": "Critical applications" }, + "noCriticalAppsAtRisk": { + "message": "No critical applications at risk" + }, "accessIntelligence": { "message": "Access Intelligence" }, @@ -1161,6 +1164,15 @@ "logInToBitwarden": { "message": "Log in to Bitwarden" }, + "enterTheCodeSentToYourEmail": { + "message": "Enter the code sent to your email" + }, + "enterTheCodeFromYourAuthenticatorApp": { + "message": "Enter the code from your authenticator app" + }, + "pressYourYubiKeyToAuthenticate": { + "message": "Press your YubiKey to authenticate" + }, "authenticationTimeout": { "message": "Authentication timeout" }, @@ -1443,12 +1455,22 @@ "rememberMe": { "message": "Zapamti me" }, + "dontAskAgainOnThisDeviceFor30Days": { + "message": "Don't ask again on this device for 30 days" + }, "sendVerificationCodeEmailAgain": { "message": "Ponovno slanje kontrolnog koda imejlom" }, "useAnotherTwoStepMethod": { "message": "Koristiti drugi način prijave u dva koraka" }, + "selectAnotherMethod": { + "message": "Select another method", + "description": "Select another two-step login method" + }, + "useYourRecoveryCode": { + "message": "Use your recovery code" + }, "insertYubiKey": { "message": "Povežite Vaš YubiKey preko USB porta na vašem računaru, pa pritisnite dugme na njemu." }, @@ -1467,6 +1489,9 @@ "twoStepOptions": { "message": "Mogućnosti prijave u dva koraka" }, + "selectTwoStepLoginMethod": { + "message": "Select two-step login method" + }, "recoveryCodeDesc": { "message": "Izgubljen je pristup uređaju za dvostruku autentifikaciju? Koristite svoj kôd za oporavak za onemogućavanje svih pružatelja usluga dvostruke autentifikacije na tvojem računu." }, @@ -1509,6 +1534,9 @@ "webAuthnMigrated": { "message": "(Migrated from FIDO)" }, + "openInNewTab": { + "message": "Open in new tab" + }, "emailTitle": { "message": "Email" }, @@ -4081,6 +4109,12 @@ "updateBrowserDesc": { "message": "You are using an unsupported web browser. The web vault may not function properly." }, + "youHaveAPendingLoginRequest": { + "message": "You have a pending login request from another device." + }, + "reviewLoginRequest": { + "message": "Review login request" + }, "freeTrialEndPromptCount": { "message": "Your free trial ends in $COUNT$ days.", "placeholders": { @@ -4758,6 +4792,15 @@ "masterPassPolicyDesc": { "message": "Set requirements for master password strength." }, + "passwordStrengthScore": { + "message": "Password strength score $SCORE$", + "placeholders": { + "score": { + "content": "$1", + "example": "4" + } + } + }, "twoStepLoginPolicyTitle": { "message": "Require two-step login" }, @@ -5653,6 +5696,12 @@ "webAuthnAuthenticate": { "message": "Authenticate WebAuthn" }, + "readSecurityKey": { + "message": "Read security key" + }, + "awaitingSecurityKeyInteraction": { + "message": "Awaiting security key interaction..." + }, "webAuthnNotSupported": { "message": "WebAuthn is not supported in this browser." }, @@ -7199,6 +7248,12 @@ "duoRequiredByOrgForAccount": { "message": "Duo two-step login is required for your account." }, + "duoTwoFactorRequiredPageSubtitle": { + "message": "Duo two-step login is required for your account. Follow the steps below to finish logging in." + }, + "followTheStepsBelowToFinishLoggingIn": { + "message": "Follow the steps below to finish logging in." + }, "launchDuo": { "message": "Launch Duo" }, @@ -10437,5 +10492,23 @@ }, "removeUnlockWithPinPolicyDesc": { "message": "Do not allow members to unlock their account with a PIN." + }, + "limitedEventLogs": { + "message": "$PRODUCT_TYPE$ plans do not have access to real event logs", + "placeholders": { + "product_type": { + "content": "$1", + "example": "Teams" + } + } + }, + "upgradeForFullEvents": { + "message": "Get full access to organization event logs by upgrading to a Teams or Enterprise plan." + }, + "upgradeEventLogTitle": { + "message": "Upgrade for real event log data" + }, + "upgradeEventLogMessage": { + "message": "These events are examples only and do not reflect real events within your Bitwarden organization." } } diff --git a/apps/web/src/locales/ca/messages.json b/apps/web/src/locales/ca/messages.json index ccf66c932ed..b1e2d60f263 100644 --- a/apps/web/src/locales/ca/messages.json +++ b/apps/web/src/locales/ca/messages.json @@ -5,6 +5,9 @@ "criticalApplications": { "message": "Aplicacions crítiques" }, + "noCriticalAppsAtRisk": { + "message": "No critical applications at risk" + }, "accessIntelligence": { "message": "Intel·ligència d'accés" }, @@ -1161,6 +1164,15 @@ "logInToBitwarden": { "message": "Inicia sessió a Bitwarden" }, + "enterTheCodeSentToYourEmail": { + "message": "Enter the code sent to your email" + }, + "enterTheCodeFromYourAuthenticatorApp": { + "message": "Enter the code from your authenticator app" + }, + "pressYourYubiKeyToAuthenticate": { + "message": "Press your YubiKey to authenticate" + }, "authenticationTimeout": { "message": "Temps d'espera d'autenticació" }, @@ -1443,12 +1455,22 @@ "rememberMe": { "message": "Recorda'm" }, + "dontAskAgainOnThisDeviceFor30Days": { + "message": "Don't ask again on this device for 30 days" + }, "sendVerificationCodeEmailAgain": { "message": "Envia el codi de verificació altra vegada" }, "useAnotherTwoStepMethod": { "message": "Utilitzeu un altre mètode d'inici de sessió en dues passes" }, + "selectAnotherMethod": { + "message": "Select another method", + "description": "Select another two-step login method" + }, + "useYourRecoveryCode": { + "message": "Use your recovery code" + }, "insertYubiKey": { "message": "Introduïu el vostre YubiKey al port USB de l'ordinador i, a continuació, premeu el seu botó." }, @@ -1467,6 +1489,9 @@ "twoStepOptions": { "message": "Opcions d'inici de sessió en dos passos" }, + "selectTwoStepLoginMethod": { + "message": "Select two-step login method" + }, "recoveryCodeDesc": { "message": "Heu perdut l'accés a tots els vostres proveïdors de dos factors? Utilitzeu el vostre codi de recuperació per desactivar tots els proveïdors de dos factors del vostre compte." }, @@ -1509,6 +1534,9 @@ "webAuthnMigrated": { "message": "(Migrat de FIDO)" }, + "openInNewTab": { + "message": "Open in new tab" + }, "emailTitle": { "message": "Correu electrònic" }, @@ -4081,6 +4109,12 @@ "updateBrowserDesc": { "message": "Esteu utilitzant un navegador web no compatible. La caixa forta web pot no funcionar correctament." }, + "youHaveAPendingLoginRequest": { + "message": "You have a pending login request from another device." + }, + "reviewLoginRequest": { + "message": "Review login request" + }, "freeTrialEndPromptCount": { "message": "Your free trial ends in $COUNT$ days.", "placeholders": { @@ -4758,6 +4792,15 @@ "masterPassPolicyDesc": { "message": "Estableix els requisits mínims per al nivell de seguretat de la contrasenya principal." }, + "passwordStrengthScore": { + "message": "Password strength score $SCORE$", + "placeholders": { + "score": { + "content": "$1", + "example": "4" + } + } + }, "twoStepLoginPolicyTitle": { "message": "Cal iniciar sessió en dos passos" }, @@ -5653,6 +5696,12 @@ "webAuthnAuthenticate": { "message": "Autenticar WebAuthn" }, + "readSecurityKey": { + "message": "Read security key" + }, + "awaitingSecurityKeyInteraction": { + "message": "Awaiting security key interaction..." + }, "webAuthnNotSupported": { "message": "WebAuthn no és compatible amb aquest navegador." }, @@ -7199,6 +7248,12 @@ "duoRequiredByOrgForAccount": { "message": "Es requereix l'inici de sessió en dos passos de DUO al vostre compte." }, + "duoTwoFactorRequiredPageSubtitle": { + "message": "Duo two-step login is required for your account. Follow the steps below to finish logging in." + }, + "followTheStepsBelowToFinishLoggingIn": { + "message": "Follow the steps below to finish logging in." + }, "launchDuo": { "message": "Inicia DUO" }, @@ -10437,5 +10492,23 @@ }, "removeUnlockWithPinPolicyDesc": { "message": "Do not allow members to unlock their account with a PIN." + }, + "limitedEventLogs": { + "message": "$PRODUCT_TYPE$ plans do not have access to real event logs", + "placeholders": { + "product_type": { + "content": "$1", + "example": "Teams" + } + } + }, + "upgradeForFullEvents": { + "message": "Get full access to organization event logs by upgrading to a Teams or Enterprise plan." + }, + "upgradeEventLogTitle": { + "message": "Upgrade for real event log data" + }, + "upgradeEventLogMessage": { + "message": "These events are examples only and do not reflect real events within your Bitwarden organization." } } diff --git a/apps/web/src/locales/cs/messages.json b/apps/web/src/locales/cs/messages.json index e805e9e4d21..b24b86bdb49 100644 --- a/apps/web/src/locales/cs/messages.json +++ b/apps/web/src/locales/cs/messages.json @@ -5,6 +5,9 @@ "criticalApplications": { "message": "Kritické aplikace" }, + "noCriticalAppsAtRisk": { + "message": "Žádné ohrožené kritické aplikace" + }, "accessIntelligence": { "message": "Přístup k inteligenci" }, @@ -1161,6 +1164,15 @@ "logInToBitwarden": { "message": "Přihlásit se do Bitwardenu" }, + "enterTheCodeSentToYourEmail": { + "message": "Zadejte kód odeslaný na Váš e-mail" + }, + "enterTheCodeFromYourAuthenticatorApp": { + "message": "Zadejte kód z Vaší ověřovací aplikace" + }, + "pressYourYubiKeyToAuthenticate": { + "message": "Stiskněte svůj YubiKey pro ověření" + }, "authenticationTimeout": { "message": "Časový limit ověření" }, @@ -1443,12 +1455,22 @@ "rememberMe": { "message": "Zapamatovat mě" }, + "dontAskAgainOnThisDeviceFor30Days": { + "message": "Neptat se na tomto zařízení 30 dnů" + }, "sendVerificationCodeEmailAgain": { "message": "Znovu zaslat ověřovací kód na e-mail" }, "useAnotherTwoStepMethod": { "message": "Použít jinou metodu dvoufázového přihlášení" }, + "selectAnotherMethod": { + "message": "Vybrat jinou metodu", + "description": "Select another two-step login method" + }, + "useYourRecoveryCode": { + "message": "Použít obnovovací kód" + }, "insertYubiKey": { "message": "Vložte YubiKey do USB portu Vašeho počítače a stiskněte jeho tlačítko." }, @@ -1467,6 +1489,9 @@ "twoStepOptions": { "message": "Volby dvoufázového přihlášení" }, + "selectTwoStepLoginMethod": { + "message": "Vyberte metodu dvoufázového přihlášení" + }, "recoveryCodeDesc": { "message": "Ztratili jste přístup ke všem nastaveným poskytovatelům dvoufázového přihlášení? Použijte obnovovací kód pro vypnutí dvoufázového přihlášení." }, @@ -1509,6 +1534,9 @@ "webAuthnMigrated": { "message": "(Migrováno z FIDO)" }, + "openInNewTab": { + "message": "Otevřít v nové kartě" + }, "emailTitle": { "message": "E-mail" }, @@ -4081,6 +4109,12 @@ "updateBrowserDesc": { "message": "Používáte nepodporovaný webový prohlížeč. Webový trezor nemusí pracovat správně." }, + "youHaveAPendingLoginRequest": { + "message": "Máte čekající žádost o přihlášení z jiného zařízení." + }, + "reviewLoginRequest": { + "message": "Podívat se na žádost o přihlášení" + }, "freeTrialEndPromptCount": { "message": "Vaše zkušební doba končí za $COUNT$ dnů.", "placeholders": { @@ -4758,6 +4792,15 @@ "masterPassPolicyDesc": { "message": "Nastavte minimální požadavky pro sílu hlavního hesla." }, + "passwordStrengthScore": { + "message": "Skóre síly hesla: $SCORE$", + "placeholders": { + "score": { + "content": "$1", + "example": "4" + } + } + }, "twoStepLoginPolicyTitle": { "message": "Požadovat dvoufázové přihlášení" }, @@ -5653,6 +5696,12 @@ "webAuthnAuthenticate": { "message": "Ověřit WebAuthn" }, + "readSecurityKey": { + "message": "Přečíst bezpečnostní klíč" + }, + "awaitingSecurityKeyInteraction": { + "message": "Čeká se na interakci s bezpečnostním klíčem..." + }, "webAuthnNotSupported": { "message": "WebAuthn není v tomto prohlížeči podporován." }, @@ -7199,6 +7248,12 @@ "duoRequiredByOrgForAccount": { "message": "Pro Váš účet je vyžadováno dvoufázové přihlášení Duo." }, + "duoTwoFactorRequiredPageSubtitle": { + "message": "Pro Váš účet je nutné dvoufázové přihlášení. Pro dokončení přihlášení postupujte podle následujících kroků." + }, + "followTheStepsBelowToFinishLoggingIn": { + "message": "Postupujte podle kroků níže pro dokončení přihlášení." + }, "launchDuo": { "message": "Spustit Duo" }, @@ -10437,5 +10492,23 @@ }, "removeUnlockWithPinPolicyDesc": { "message": "Nepovolí členům odemknout svůj účet pomocí PIN." + }, + "limitedEventLogs": { + "message": "Plány $PRODUCT_TYPE$ nemají přístup k protokolům reálných událostí", + "placeholders": { + "product_type": { + "content": "$1", + "example": "Teams" + } + } + }, + "upgradeForFullEvents": { + "message": "Získejte plný přístup k protokolům událostí organizace aktualizací do týmů nebo plánu Enterprise." + }, + "upgradeEventLogTitle": { + "message": "Aktualizovat pro reálná data protokolu událostí" + }, + "upgradeEventLogMessage": { + "message": "Tyto události jsou jen příklady a neodrážejí skutečné události v rámci Vaší organizace Bitwarden." } } diff --git a/apps/web/src/locales/cy/messages.json b/apps/web/src/locales/cy/messages.json index 0aa20a9e625..ff08a6fbe7f 100644 --- a/apps/web/src/locales/cy/messages.json +++ b/apps/web/src/locales/cy/messages.json @@ -5,6 +5,9 @@ "criticalApplications": { "message": "Critical applications" }, + "noCriticalAppsAtRisk": { + "message": "No critical applications at risk" + }, "accessIntelligence": { "message": "Access Intelligence" }, @@ -1161,6 +1164,15 @@ "logInToBitwarden": { "message": "Log in to Bitwarden" }, + "enterTheCodeSentToYourEmail": { + "message": "Enter the code sent to your email" + }, + "enterTheCodeFromYourAuthenticatorApp": { + "message": "Enter the code from your authenticator app" + }, + "pressYourYubiKeyToAuthenticate": { + "message": "Press your YubiKey to authenticate" + }, "authenticationTimeout": { "message": "Authentication timeout" }, @@ -1443,12 +1455,22 @@ "rememberMe": { "message": "Remember me" }, + "dontAskAgainOnThisDeviceFor30Days": { + "message": "Don't ask again on this device for 30 days" + }, "sendVerificationCodeEmailAgain": { "message": "Send verification code email again" }, "useAnotherTwoStepMethod": { "message": "Use another two-step login method" }, + "selectAnotherMethod": { + "message": "Select another method", + "description": "Select another two-step login method" + }, + "useYourRecoveryCode": { + "message": "Use your recovery code" + }, "insertYubiKey": { "message": "Insert your YubiKey into your computer's USB port, then touch its button." }, @@ -1467,6 +1489,9 @@ "twoStepOptions": { "message": "Two-step login options" }, + "selectTwoStepLoginMethod": { + "message": "Select two-step login method" + }, "recoveryCodeDesc": { "message": "Lost access to all of your two-step login providers? Use your recovery code to turn off all two-step login providers from your account." }, @@ -1509,6 +1534,9 @@ "webAuthnMigrated": { "message": "(Migrated from FIDO)" }, + "openInNewTab": { + "message": "Open in new tab" + }, "emailTitle": { "message": "Email" }, @@ -4081,6 +4109,12 @@ "updateBrowserDesc": { "message": "You are using an unsupported web browser. The web vault may not function properly." }, + "youHaveAPendingLoginRequest": { + "message": "You have a pending login request from another device." + }, + "reviewLoginRequest": { + "message": "Review login request" + }, "freeTrialEndPromptCount": { "message": "Your free trial ends in $COUNT$ days.", "placeholders": { @@ -4758,6 +4792,15 @@ "masterPassPolicyDesc": { "message": "Set requirements for master password strength." }, + "passwordStrengthScore": { + "message": "Password strength score $SCORE$", + "placeholders": { + "score": { + "content": "$1", + "example": "4" + } + } + }, "twoStepLoginPolicyTitle": { "message": "Require two-step login" }, @@ -5653,6 +5696,12 @@ "webAuthnAuthenticate": { "message": "Authenticate WebAuthn" }, + "readSecurityKey": { + "message": "Read security key" + }, + "awaitingSecurityKeyInteraction": { + "message": "Awaiting security key interaction..." + }, "webAuthnNotSupported": { "message": "WebAuthn is not supported in this browser." }, @@ -7199,6 +7248,12 @@ "duoRequiredByOrgForAccount": { "message": "Duo two-step login is required for your account." }, + "duoTwoFactorRequiredPageSubtitle": { + "message": "Duo two-step login is required for your account. Follow the steps below to finish logging in." + }, + "followTheStepsBelowToFinishLoggingIn": { + "message": "Follow the steps below to finish logging in." + }, "launchDuo": { "message": "Launch Duo" }, @@ -10437,5 +10492,23 @@ }, "removeUnlockWithPinPolicyDesc": { "message": "Do not allow members to unlock their account with a PIN." + }, + "limitedEventLogs": { + "message": "$PRODUCT_TYPE$ plans do not have access to real event logs", + "placeholders": { + "product_type": { + "content": "$1", + "example": "Teams" + } + } + }, + "upgradeForFullEvents": { + "message": "Get full access to organization event logs by upgrading to a Teams or Enterprise plan." + }, + "upgradeEventLogTitle": { + "message": "Upgrade for real event log data" + }, + "upgradeEventLogMessage": { + "message": "These events are examples only and do not reflect real events within your Bitwarden organization." } } diff --git a/apps/web/src/locales/da/messages.json b/apps/web/src/locales/da/messages.json index 0d7b28211ce..530a9ce0b03 100644 --- a/apps/web/src/locales/da/messages.json +++ b/apps/web/src/locales/da/messages.json @@ -5,6 +5,9 @@ "criticalApplications": { "message": "Kritiske apps" }, + "noCriticalAppsAtRisk": { + "message": "No critical applications at risk" + }, "accessIntelligence": { "message": "Adgangsefterretning" }, @@ -1161,6 +1164,15 @@ "logInToBitwarden": { "message": "Log ind på Bitwarden" }, + "enterTheCodeSentToYourEmail": { + "message": "Enter the code sent to your email" + }, + "enterTheCodeFromYourAuthenticatorApp": { + "message": "Enter the code from your authenticator app" + }, + "pressYourYubiKeyToAuthenticate": { + "message": "Press your YubiKey to authenticate" + }, "authenticationTimeout": { "message": "Godkendelsestimeout" }, @@ -1443,12 +1455,22 @@ "rememberMe": { "message": "Husk mig" }, + "dontAskAgainOnThisDeviceFor30Days": { + "message": "Don't ask again on this device for 30 days" + }, "sendVerificationCodeEmailAgain": { "message": "Send bekræftelseskode-email igen" }, "useAnotherTwoStepMethod": { "message": "Brug en anden totrins-login metode" }, + "selectAnotherMethod": { + "message": "Select another method", + "description": "Select another two-step login method" + }, + "useYourRecoveryCode": { + "message": "Use your recovery code" + }, "insertYubiKey": { "message": "Indsæt din YubiKey i computerens USB-port og tryk på dens knap." }, @@ -1467,6 +1489,9 @@ "twoStepOptions": { "message": "Totrins-login indstillinger" }, + "selectTwoStepLoginMethod": { + "message": "Select two-step login method" + }, "recoveryCodeDesc": { "message": "Mistet adgang til alle totrinsudbyderene? Brug din genoprettelseskode til at deaktivere dem alle på kontoen." }, @@ -1509,6 +1534,9 @@ "webAuthnMigrated": { "message": "(Migreret fra FIDO)" }, + "openInNewTab": { + "message": "Open in new tab" + }, "emailTitle": { "message": "E-mail" }, @@ -4081,6 +4109,12 @@ "updateBrowserDesc": { "message": "Du bruger en ikke-understøttet webbrowser. Web-boksen fungerer muligvis ikke korrekt." }, + "youHaveAPendingLoginRequest": { + "message": "You have a pending login request from another device." + }, + "reviewLoginRequest": { + "message": "Review login request" + }, "freeTrialEndPromptCount": { "message": "Den gratis prøveperiode slutter om $COUNT$ dage.", "placeholders": { @@ -4758,6 +4792,15 @@ "masterPassPolicyDesc": { "message": "Angiv krav til styrken af hovedadgangskode." }, + "passwordStrengthScore": { + "message": "Password strength score $SCORE$", + "placeholders": { + "score": { + "content": "$1", + "example": "4" + } + } + }, "twoStepLoginPolicyTitle": { "message": "Kræv totrins-login" }, @@ -5653,6 +5696,12 @@ "webAuthnAuthenticate": { "message": "Godkend WebAuthn" }, + "readSecurityKey": { + "message": "Read security key" + }, + "awaitingSecurityKeyInteraction": { + "message": "Awaiting security key interaction..." + }, "webAuthnNotSupported": { "message": "Denne browser understøtter ikke WebAuthn." }, @@ -7199,6 +7248,12 @@ "duoRequiredByOrgForAccount": { "message": "Duo totrinsindlogning kræves for kontoen." }, + "duoTwoFactorRequiredPageSubtitle": { + "message": "Duo two-step login is required for your account. Follow the steps below to finish logging in." + }, + "followTheStepsBelowToFinishLoggingIn": { + "message": "Follow the steps below to finish logging in." + }, "launchDuo": { "message": "Start Duo" }, @@ -10437,5 +10492,23 @@ }, "removeUnlockWithPinPolicyDesc": { "message": "Do not allow members to unlock their account with a PIN." + }, + "limitedEventLogs": { + "message": "$PRODUCT_TYPE$ plans do not have access to real event logs", + "placeholders": { + "product_type": { + "content": "$1", + "example": "Teams" + } + } + }, + "upgradeForFullEvents": { + "message": "Get full access to organization event logs by upgrading to a Teams or Enterprise plan." + }, + "upgradeEventLogTitle": { + "message": "Upgrade for real event log data" + }, + "upgradeEventLogMessage": { + "message": "These events are examples only and do not reflect real events within your Bitwarden organization." } } diff --git a/apps/web/src/locales/de/messages.json b/apps/web/src/locales/de/messages.json index 9fef604190b..a27de099a74 100644 --- a/apps/web/src/locales/de/messages.json +++ b/apps/web/src/locales/de/messages.json @@ -5,6 +5,9 @@ "criticalApplications": { "message": "Kritische Anwendungen" }, + "noCriticalAppsAtRisk": { + "message": "No critical applications at risk" + }, "accessIntelligence": { "message": "Zugriff auf Informationen" }, @@ -1161,6 +1164,15 @@ "logInToBitwarden": { "message": "Bei Bitwarden anmelden" }, + "enterTheCodeSentToYourEmail": { + "message": "Gib den an deine E-Mail-Adresse gesendeten Code ein" + }, + "enterTheCodeFromYourAuthenticatorApp": { + "message": "Gib den Code aus deiner Authenticator-App ein" + }, + "pressYourYubiKeyToAuthenticate": { + "message": "Drücke zum Authentifizieren auf deinen YubiKey" + }, "authenticationTimeout": { "message": "Authentifizierungs-Timeout" }, @@ -1443,12 +1455,22 @@ "rememberMe": { "message": "Angemeldet bleiben" }, + "dontAskAgainOnThisDeviceFor30Days": { + "message": "Für 30 Tage auf diesem Gerät nicht mehr fragen" + }, "sendVerificationCodeEmailAgain": { "message": "E-Mail mit Bestätigungscode erneut versenden" }, "useAnotherTwoStepMethod": { "message": "Verwenden sie eine andere Zwei-Faktor-Anmelde-Methode" }, + "selectAnotherMethod": { + "message": "Wähle eine andere Methode", + "description": "Select another two-step login method" + }, + "useYourRecoveryCode": { + "message": "Verwende deinen Wiederherstellungscode" + }, "insertYubiKey": { "message": "Stecken Sie Ihren YubiKey in einen USB-Port Ihres Computers und berühren Sie dessen Knopf." }, @@ -1467,6 +1489,9 @@ "twoStepOptions": { "message": "Optionen für Zwei-Faktor-Authentifizierung" }, + "selectTwoStepLoginMethod": { + "message": "Zwei-Faktor-Authentifizierungsmethode auswählen" + }, "recoveryCodeDesc": { "message": "Zugang zu allen Zwei-Faktor-Anbietern verloren? Benutze deinen Wiederherstellungscode, um alle Zwei-Faktor-Anbieter in deinem Konto zu deaktivieren." }, @@ -1509,6 +1534,9 @@ "webAuthnMigrated": { "message": "(Von FIDO migriert)" }, + "openInNewTab": { + "message": "In neuem Tab öffnen" + }, "emailTitle": { "message": "E-Mail" }, @@ -4081,6 +4109,12 @@ "updateBrowserDesc": { "message": "Du verwendest einen nicht unterstützten Webbrowser. Der Web-Tresor funktioniert möglicherweise nicht richtig." }, + "youHaveAPendingLoginRequest": { + "message": "Du hast eine ausstehende Anmeldeanfrage von einem anderen Gerät." + }, + "reviewLoginRequest": { + "message": "Anmeldeanfrage überprüfen" + }, "freeTrialEndPromptCount": { "message": "Deine kostenlose Testversion endet in $COUNT$ Tagen.", "placeholders": { @@ -4758,6 +4792,15 @@ "masterPassPolicyDesc": { "message": "Mindestanforderungen für die Stärke des Master-Passworts festlegen." }, + "passwordStrengthScore": { + "message": "Bewertung der Passwortstärke $SCORE$", + "placeholders": { + "score": { + "content": "$1", + "example": "4" + } + } + }, "twoStepLoginPolicyTitle": { "message": "Zwei-Faktor-Authentifizierung verlangen" }, @@ -5653,6 +5696,12 @@ "webAuthnAuthenticate": { "message": "WebAuthn authentifizieren" }, + "readSecurityKey": { + "message": "Sicherheitsschlüssel auslesen" + }, + "awaitingSecurityKeyInteraction": { + "message": "Warte auf Sicherheitsschlüssel-Interaktion..." + }, "webAuthnNotSupported": { "message": "WebAuthn wird in diesem Browser nicht unterstützt." }, @@ -7199,6 +7248,12 @@ "duoRequiredByOrgForAccount": { "message": "Für dein Konto ist die DUO Zwei-Faktor-Authentifizierung erforderlich." }, + "duoTwoFactorRequiredPageSubtitle": { + "message": "Die Duo-Zwei-Faktor-Authentifizierung ist für dein Konto erforderlich. Folge den Schritten unten, um die Anmeldung abzuschließen." + }, + "followTheStepsBelowToFinishLoggingIn": { + "message": "Folge den Schritten unten, um die Anmeldung abzuschließen." + }, "launchDuo": { "message": "DUO starten" }, @@ -10433,9 +10488,27 @@ "message": "Die zugewiesenen Plätze überschreiten die verfügbaren Plätze." }, "removeUnlockWithPinPolicyTitle": { - "message": "Remove Unlock with PIN" + "message": "Entsperren mit PIN entfernen" }, "removeUnlockWithPinPolicyDesc": { - "message": "Do not allow members to unlock their account with a PIN." + "message": "Mitgliedern nicht erlauben, ihr Konto mit einer PIN zu entsperren." + }, + "limitedEventLogs": { + "message": "$PRODUCT_TYPE$ plans do not have access to real event logs", + "placeholders": { + "product_type": { + "content": "$1", + "example": "Teams" + } + } + }, + "upgradeForFullEvents": { + "message": "Get full access to organization event logs by upgrading to a Teams or Enterprise plan." + }, + "upgradeEventLogTitle": { + "message": "Upgrade for real event log data" + }, + "upgradeEventLogMessage": { + "message": "These events are examples only and do not reflect real events within your Bitwarden organization." } } diff --git a/apps/web/src/locales/el/messages.json b/apps/web/src/locales/el/messages.json index 6fc22e74103..0cdb9b68bf1 100644 --- a/apps/web/src/locales/el/messages.json +++ b/apps/web/src/locales/el/messages.json @@ -5,6 +5,9 @@ "criticalApplications": { "message": "Κρίσιμες εφαρμογές" }, + "noCriticalAppsAtRisk": { + "message": "No critical applications at risk" + }, "accessIntelligence": { "message": "Πληροφορίες Πρόσβασης" }, @@ -474,7 +477,7 @@ "message": "Nest a folder by adding the parent folder's name followed by a “/”. Example: Social/Forums" }, "deleteFolderPermanently": { - "message": "Are you sure you want to permanently delete this folder?" + "message": "Είστε σίγουροι ότι θέλετε να διαγράψετε μόνιμα αυτόν το φάκελο;" }, "baseDomain": { "message": "Βασικός τομέας", @@ -1161,6 +1164,15 @@ "logInToBitwarden": { "message": "Log in to Bitwarden" }, + "enterTheCodeSentToYourEmail": { + "message": "Enter the code sent to your email" + }, + "enterTheCodeFromYourAuthenticatorApp": { + "message": "Enter the code from your authenticator app" + }, + "pressYourYubiKeyToAuthenticate": { + "message": "Press your YubiKey to authenticate" + }, "authenticationTimeout": { "message": "Authentication timeout" }, @@ -1443,12 +1455,22 @@ "rememberMe": { "message": "Να με θυμάσαι" }, + "dontAskAgainOnThisDeviceFor30Days": { + "message": "Don't ask again on this device for 30 days" + }, "sendVerificationCodeEmailAgain": { "message": "Αποστολή email κωδικού επαλήθευσης ξανά" }, "useAnotherTwoStepMethod": { "message": "Χρήση άλλης μεθόδου δύο παραγόντων" }, + "selectAnotherMethod": { + "message": "Select another method", + "description": "Select another two-step login method" + }, + "useYourRecoveryCode": { + "message": "Use your recovery code" + }, "insertYubiKey": { "message": "Τοποθετήστε το YubiKey στη θύρα USB του υπολογιστή σας και έπειτα πατήστε το κουμπί του." }, @@ -1467,6 +1489,9 @@ "twoStepOptions": { "message": "Επιλογές σύνδεσης δύο παραγόντων" }, + "selectTwoStepLoginMethod": { + "message": "Select two-step login method" + }, "recoveryCodeDesc": { "message": "Έχετε χάσει την πρόσβαση σε όλους τους παρόχους δύο παραγόντων; Χρησιμοποιήστε τον κωδικό ανάκτησης για να απενεργοποιήσετε όλους τους παρόχους δύο παραγόντων από το λογαριασμό σας." }, @@ -1509,6 +1534,9 @@ "webAuthnMigrated": { "message": "(Μετεγκατάσταση από το FIDO)" }, + "openInNewTab": { + "message": "Open in new tab" + }, "emailTitle": { "message": "Email" }, @@ -4081,6 +4109,12 @@ "updateBrowserDesc": { "message": "Χρησιμοποιείτε ένα μη υποστηριζόμενο browser. Το web vault ενδέχεται να μην λειτουργεί σωστά." }, + "youHaveAPendingLoginRequest": { + "message": "You have a pending login request from another device." + }, + "reviewLoginRequest": { + "message": "Review login request" + }, "freeTrialEndPromptCount": { "message": "Your free trial ends in $COUNT$ days.", "placeholders": { @@ -4758,6 +4792,15 @@ "masterPassPolicyDesc": { "message": "Ορίστε ελάχιστες απαιτήσεις, για ισχύ του κύριου κωδικού." }, + "passwordStrengthScore": { + "message": "Password strength score $SCORE$", + "placeholders": { + "score": { + "content": "$1", + "example": "4" + } + } + }, "twoStepLoginPolicyTitle": { "message": "Απαίτηση για σύνδεση δύο βημάτων" }, @@ -5653,6 +5696,12 @@ "webAuthnAuthenticate": { "message": "Ταυτοποίηση WebAutn" }, + "readSecurityKey": { + "message": "Read security key" + }, + "awaitingSecurityKeyInteraction": { + "message": "Awaiting security key interaction..." + }, "webAuthnNotSupported": { "message": "Το WebAuthn δεν υποστηρίζεται σε αυτό το πρόγραμμα περιήγησης." }, @@ -7199,6 +7248,12 @@ "duoRequiredByOrgForAccount": { "message": "Duo two-step login is required for your account." }, + "duoTwoFactorRequiredPageSubtitle": { + "message": "Duo two-step login is required for your account. Follow the steps below to finish logging in." + }, + "followTheStepsBelowToFinishLoggingIn": { + "message": "Follow the steps below to finish logging in." + }, "launchDuo": { "message": "Εκκίνηση Duo" }, @@ -10437,5 +10492,23 @@ }, "removeUnlockWithPinPolicyDesc": { "message": "Do not allow members to unlock their account with a PIN." + }, + "limitedEventLogs": { + "message": "$PRODUCT_TYPE$ plans do not have access to real event logs", + "placeholders": { + "product_type": { + "content": "$1", + "example": "Teams" + } + } + }, + "upgradeForFullEvents": { + "message": "Get full access to organization event logs by upgrading to a Teams or Enterprise plan." + }, + "upgradeEventLogTitle": { + "message": "Upgrade for real event log data" + }, + "upgradeEventLogMessage": { + "message": "These events are examples only and do not reflect real events within your Bitwarden organization." } } diff --git a/apps/web/src/locales/en/messages.json b/apps/web/src/locales/en/messages.json index 3d50e842a81..22a67cbff28 100644 --- a/apps/web/src/locales/en/messages.json +++ b/apps/web/src/locales/en/messages.json @@ -5,6 +5,9 @@ "criticalApplications": { "message": "Critical applications" }, + "noCriticalAppsAtRisk":{ + "message": "No critical applications at risk" + }, "accessIntelligence": { "message": "Access Intelligence" }, @@ -1488,7 +1491,7 @@ }, "useYourRecoveryCode": { "message": "Use your recovery code" - }, + }, "insertYubiKey": { "message": "Insert your YubiKey into your computer's USB port, then touch its button." }, @@ -2270,6 +2273,9 @@ "revokeAccess": { "message": "Revoke access" }, + "revoke": { + "message": "Revoke" + }, "twoStepLoginProviderEnabled": { "message": "This two-step login provider is active on your account." }, diff --git a/apps/web/src/locales/en_GB/messages.json b/apps/web/src/locales/en_GB/messages.json index ee68658c048..7179a886761 100644 --- a/apps/web/src/locales/en_GB/messages.json +++ b/apps/web/src/locales/en_GB/messages.json @@ -5,6 +5,9 @@ "criticalApplications": { "message": "Critical applications" }, + "noCriticalAppsAtRisk": { + "message": "No critical applications at risk" + }, "accessIntelligence": { "message": "Access Intelligence" }, @@ -1161,6 +1164,15 @@ "logInToBitwarden": { "message": "Log in to Bitwarden" }, + "enterTheCodeSentToYourEmail": { + "message": "Enter the code sent to your email" + }, + "enterTheCodeFromYourAuthenticatorApp": { + "message": "Enter the code from your authenticator app" + }, + "pressYourYubiKeyToAuthenticate": { + "message": "Press your YubiKey to authenticate" + }, "authenticationTimeout": { "message": "Authentication timeout" }, @@ -1443,12 +1455,22 @@ "rememberMe": { "message": "Remember me" }, + "dontAskAgainOnThisDeviceFor30Days": { + "message": "Don't ask again on this device for 30 days" + }, "sendVerificationCodeEmailAgain": { "message": "Send verification code email again" }, "useAnotherTwoStepMethod": { "message": "Use another two-step login method" }, + "selectAnotherMethod": { + "message": "Select another method", + "description": "Select another two-step login method" + }, + "useYourRecoveryCode": { + "message": "Use your recovery code" + }, "insertYubiKey": { "message": "Insert your YubiKey into your computer's USB port, then touch its button." }, @@ -1467,6 +1489,9 @@ "twoStepOptions": { "message": "Two-step login options" }, + "selectTwoStepLoginMethod": { + "message": "Select two-step login method" + }, "recoveryCodeDesc": { "message": "Lost access to all of your two-step login providers? Use your recovery code to turn off all two-step login providers from your account." }, @@ -1509,6 +1534,9 @@ "webAuthnMigrated": { "message": "(Migrated from FIDO)" }, + "openInNewTab": { + "message": "Open in new tab" + }, "emailTitle": { "message": "Email" }, @@ -4081,6 +4109,12 @@ "updateBrowserDesc": { "message": "You are using an unsupported web browser. The web vault may not function properly." }, + "youHaveAPendingLoginRequest": { + "message": "You have a pending login request from another device." + }, + "reviewLoginRequest": { + "message": "Review login request" + }, "freeTrialEndPromptCount": { "message": "Your free trial ends in $COUNT$ days.", "placeholders": { @@ -4758,6 +4792,15 @@ "masterPassPolicyDesc": { "message": "Set requirements for master password strength." }, + "passwordStrengthScore": { + "message": "Password strength score $SCORE$", + "placeholders": { + "score": { + "content": "$1", + "example": "4" + } + } + }, "twoStepLoginPolicyTitle": { "message": "Require two-step login" }, @@ -5653,6 +5696,12 @@ "webAuthnAuthenticate": { "message": "Authenticate WebAuthn" }, + "readSecurityKey": { + "message": "Read security key" + }, + "awaitingSecurityKeyInteraction": { + "message": "Awaiting security key interaction..." + }, "webAuthnNotSupported": { "message": "WebAuthn is not supported in this browser." }, @@ -7199,6 +7248,12 @@ "duoRequiredByOrgForAccount": { "message": "Duo two-step login is required for your account." }, + "duoTwoFactorRequiredPageSubtitle": { + "message": "Duo two-step login is required for your account. Follow the steps below to finish logging in." + }, + "followTheStepsBelowToFinishLoggingIn": { + "message": "Follow the steps below to finish logging in." + }, "launchDuo": { "message": "Launch Duo" }, @@ -10437,5 +10492,23 @@ }, "removeUnlockWithPinPolicyDesc": { "message": "Do not allow members to unlock their account with a PIN." + }, + "limitedEventLogs": { + "message": "$PRODUCT_TYPE$ plans do not have access to real event logs", + "placeholders": { + "product_type": { + "content": "$1", + "example": "Teams" + } + } + }, + "upgradeForFullEvents": { + "message": "Get full access to organisation event logs by upgrading to a Teams or Enterprise plan." + }, + "upgradeEventLogTitle": { + "message": "Upgrade for real event log data" + }, + "upgradeEventLogMessage": { + "message": "These events are examples only and do not reflect real events within your Bitwarden organisation." } } diff --git a/apps/web/src/locales/en_IN/messages.json b/apps/web/src/locales/en_IN/messages.json index 81585d785af..035cdd6143d 100644 --- a/apps/web/src/locales/en_IN/messages.json +++ b/apps/web/src/locales/en_IN/messages.json @@ -5,6 +5,9 @@ "criticalApplications": { "message": "Critical applications" }, + "noCriticalAppsAtRisk": { + "message": "No critical applications at risk" + }, "accessIntelligence": { "message": "Access Intelligence" }, @@ -1161,6 +1164,15 @@ "logInToBitwarden": { "message": "Log in to Bitwarden" }, + "enterTheCodeSentToYourEmail": { + "message": "Enter the code sent to your email" + }, + "enterTheCodeFromYourAuthenticatorApp": { + "message": "Enter the code from your authenticator app" + }, + "pressYourYubiKeyToAuthenticate": { + "message": "Press your YubiKey to authenticate" + }, "authenticationTimeout": { "message": "Authentication timeout" }, @@ -1443,12 +1455,22 @@ "rememberMe": { "message": "Remember me" }, + "dontAskAgainOnThisDeviceFor30Days": { + "message": "Don't ask again on this device for 30 days" + }, "sendVerificationCodeEmailAgain": { "message": "Send verification code email again" }, "useAnotherTwoStepMethod": { "message": "Use another two-step login method" }, + "selectAnotherMethod": { + "message": "Select another method", + "description": "Select another two-step login method" + }, + "useYourRecoveryCode": { + "message": "Use your recovery code" + }, "insertYubiKey": { "message": "Insert your YubiKey into your computer's USB port, then touch its button." }, @@ -1467,6 +1489,9 @@ "twoStepOptions": { "message": "Two-step login options" }, + "selectTwoStepLoginMethod": { + "message": "Select two-step login method" + }, "recoveryCodeDesc": { "message": "Lost access to all of your two-factor providers? Use your recovery code to disable all two-factor providers from your account." }, @@ -1509,6 +1534,9 @@ "webAuthnMigrated": { "message": "(Migrated from FIDO)" }, + "openInNewTab": { + "message": "Open in new tab" + }, "emailTitle": { "message": "Email" }, @@ -4081,6 +4109,12 @@ "updateBrowserDesc": { "message": "You are using an unsupported web browser. The web vault may not function properly." }, + "youHaveAPendingLoginRequest": { + "message": "You have a pending login request from another device." + }, + "reviewLoginRequest": { + "message": "Review login request" + }, "freeTrialEndPromptCount": { "message": "Your free trial ends in $COUNT$ days.", "placeholders": { @@ -4758,6 +4792,15 @@ "masterPassPolicyDesc": { "message": "Set minimum requirements for master password strength." }, + "passwordStrengthScore": { + "message": "Password strength score $SCORE$", + "placeholders": { + "score": { + "content": "$1", + "example": "4" + } + } + }, "twoStepLoginPolicyTitle": { "message": "Require two-step login" }, @@ -5653,6 +5696,12 @@ "webAuthnAuthenticate": { "message": "Authenticate WebAuthn" }, + "readSecurityKey": { + "message": "Read security key" + }, + "awaitingSecurityKeyInteraction": { + "message": "Awaiting security key interaction..." + }, "webAuthnNotSupported": { "message": "WebAuthn is not supported in this browser." }, @@ -7199,6 +7248,12 @@ "duoRequiredByOrgForAccount": { "message": "Duo two-step login is required for your account." }, + "duoTwoFactorRequiredPageSubtitle": { + "message": "Duo two-step login is required for your account. Follow the steps below to finish logging in." + }, + "followTheStepsBelowToFinishLoggingIn": { + "message": "Follow the steps below to finish logging in." + }, "launchDuo": { "message": "Launch Duo" }, @@ -10437,5 +10492,23 @@ }, "removeUnlockWithPinPolicyDesc": { "message": "Do not allow members to unlock their account with a PIN." + }, + "limitedEventLogs": { + "message": "$PRODUCT_TYPE$ plans do not have access to real event logs", + "placeholders": { + "product_type": { + "content": "$1", + "example": "Teams" + } + } + }, + "upgradeForFullEvents": { + "message": "Get full access to organisation event logs by upgrading to a Teams or Enterprise plan." + }, + "upgradeEventLogTitle": { + "message": "Upgrade for real event log data" + }, + "upgradeEventLogMessage": { + "message": "These events are examples only and do not reflect real events within your Bitwarden organisation." } } diff --git a/apps/web/src/locales/eo/messages.json b/apps/web/src/locales/eo/messages.json index 4cc9202b2cd..17d4bc9fe1e 100644 --- a/apps/web/src/locales/eo/messages.json +++ b/apps/web/src/locales/eo/messages.json @@ -5,6 +5,9 @@ "criticalApplications": { "message": "Critical applications" }, + "noCriticalAppsAtRisk": { + "message": "No critical applications at risk" + }, "accessIntelligence": { "message": "Access Intelligence" }, @@ -1161,6 +1164,15 @@ "logInToBitwarden": { "message": "Ensaluti en Bitwarden" }, + "enterTheCodeSentToYourEmail": { + "message": "Enter the code sent to your email" + }, + "enterTheCodeFromYourAuthenticatorApp": { + "message": "Enter the code from your authenticator app" + }, + "pressYourYubiKeyToAuthenticate": { + "message": "Press your YubiKey to authenticate" + }, "authenticationTimeout": { "message": "Authentication timeout" }, @@ -1443,12 +1455,22 @@ "rememberMe": { "message": "Memoru min" }, + "dontAskAgainOnThisDeviceFor30Days": { + "message": "Don't ask again on this device for 30 days" + }, "sendVerificationCodeEmailAgain": { "message": "Sendu retpoŝtan kontrol-kodon denove" }, "useAnotherTwoStepMethod": { "message": "Uzu alian metodon de identigo en du-ŝtupa saluto" }, + "selectAnotherMethod": { + "message": "Select another method", + "description": "Select another two-step login method" + }, + "useYourRecoveryCode": { + "message": "Use your recovery code" + }, "insertYubiKey": { "message": "Enmetu vian YubiKey en la USB-havenon de via komputilo, tiam tuŝu ĝian butonon." }, @@ -1467,6 +1489,9 @@ "twoStepOptions": { "message": "Elektebloj de la du-ŝtupa saluto" }, + "selectTwoStepLoginMethod": { + "message": "Select two-step login method" + }, "recoveryCodeDesc": { "message": "Ĉu vi perdis aliron al ĉiuj viaj du-faktoraj provizantoj? Uzu vian reakiran kodon por malŝalti ĉiujn du-faktorajn provizantojn de via konto." }, @@ -1509,6 +1534,9 @@ "webAuthnMigrated": { "message": "(Migrated from FIDO)" }, + "openInNewTab": { + "message": "Open in new tab" + }, "emailTitle": { "message": "Retpoŝto" }, @@ -4081,6 +4109,12 @@ "updateBrowserDesc": { "message": "Vi uzas nesubtenatan tTT-legilon. La ttt-volbo eble ne funkcias ĝuste." }, + "youHaveAPendingLoginRequest": { + "message": "You have a pending login request from another device." + }, + "reviewLoginRequest": { + "message": "Review login request" + }, "freeTrialEndPromptCount": { "message": "Your free trial ends in $COUNT$ days.", "placeholders": { @@ -4758,6 +4792,15 @@ "masterPassPolicyDesc": { "message": "Agordi minimumajn postulojn por majstra pasvorta forto." }, + "passwordStrengthScore": { + "message": "Password strength score $SCORE$", + "placeholders": { + "score": { + "content": "$1", + "example": "4" + } + } + }, "twoStepLoginPolicyTitle": { "message": "Devigu dufazan ensaluton" }, @@ -5653,6 +5696,12 @@ "webAuthnAuthenticate": { "message": "Authenticate WebAuthn" }, + "readSecurityKey": { + "message": "Read security key" + }, + "awaitingSecurityKeyInteraction": { + "message": "Awaiting security key interaction..." + }, "webAuthnNotSupported": { "message": "WebAuthn is not supported in this browser." }, @@ -7199,6 +7248,12 @@ "duoRequiredByOrgForAccount": { "message": "Duo two-step login is required for your account." }, + "duoTwoFactorRequiredPageSubtitle": { + "message": "Duo two-step login is required for your account. Follow the steps below to finish logging in." + }, + "followTheStepsBelowToFinishLoggingIn": { + "message": "Follow the steps below to finish logging in." + }, "launchDuo": { "message": "Launch Duo" }, @@ -10437,5 +10492,23 @@ }, "removeUnlockWithPinPolicyDesc": { "message": "Do not allow members to unlock their account with a PIN." + }, + "limitedEventLogs": { + "message": "$PRODUCT_TYPE$ plans do not have access to real event logs", + "placeholders": { + "product_type": { + "content": "$1", + "example": "Teams" + } + } + }, + "upgradeForFullEvents": { + "message": "Get full access to organization event logs by upgrading to a Teams or Enterprise plan." + }, + "upgradeEventLogTitle": { + "message": "Upgrade for real event log data" + }, + "upgradeEventLogMessage": { + "message": "These events are examples only and do not reflect real events within your Bitwarden organization." } } diff --git a/apps/web/src/locales/es/messages.json b/apps/web/src/locales/es/messages.json index 4a74b101c78..906092a2d4b 100644 --- a/apps/web/src/locales/es/messages.json +++ b/apps/web/src/locales/es/messages.json @@ -5,6 +5,9 @@ "criticalApplications": { "message": "Aplicaciones críticas" }, + "noCriticalAppsAtRisk": { + "message": "No critical applications at risk" + }, "accessIntelligence": { "message": "Inteligencia de Acceso" }, @@ -1161,6 +1164,15 @@ "logInToBitwarden": { "message": "Log in to Bitwarden" }, + "enterTheCodeSentToYourEmail": { + "message": "Enter the code sent to your email" + }, + "enterTheCodeFromYourAuthenticatorApp": { + "message": "Enter the code from your authenticator app" + }, + "pressYourYubiKeyToAuthenticate": { + "message": "Press your YubiKey to authenticate" + }, "authenticationTimeout": { "message": "Authentication timeout" }, @@ -1443,12 +1455,22 @@ "rememberMe": { "message": "Recordarme" }, + "dontAskAgainOnThisDeviceFor30Days": { + "message": "Don't ask again on this device for 30 days" + }, "sendVerificationCodeEmailAgain": { "message": "Reenviar código de verificación por correo electrónico" }, "useAnotherTwoStepMethod": { "message": "Utilizar otro método de autenticación en dos pasos" }, + "selectAnotherMethod": { + "message": "Select another method", + "description": "Select another two-step login method" + }, + "useYourRecoveryCode": { + "message": "Use your recovery code" + }, "insertYubiKey": { "message": "Inserta tu YubiKey en el puerto USB de tu equipo y posteriormente pulsa su botón." }, @@ -1467,6 +1489,9 @@ "twoStepOptions": { "message": "Opciones de la autenticación en dos pasos" }, + "selectTwoStepLoginMethod": { + "message": "Select two-step login method" + }, "recoveryCodeDesc": { "message": "¿Has perdido el acceso a todos tus métodos de autenticación en dos pasos? Utiliza tu código de recuperación para deshabilitar todos los métodos de autenticación en dos pasos de tu cuenta." }, @@ -1509,6 +1534,9 @@ "webAuthnMigrated": { "message": "(Migrado desde FIDO)" }, + "openInNewTab": { + "message": "Open in new tab" + }, "emailTitle": { "message": "Correo electrónico" }, @@ -4081,6 +4109,12 @@ "updateBrowserDesc": { "message": "Está utilizando un navegador web no compatible. Es posible que la caja fuerte web no funcione correctamente." }, + "youHaveAPendingLoginRequest": { + "message": "You have a pending login request from another device." + }, + "reviewLoginRequest": { + "message": "Review login request" + }, "freeTrialEndPromptCount": { "message": "Your free trial ends in $COUNT$ days.", "placeholders": { @@ -4758,6 +4792,15 @@ "masterPassPolicyDesc": { "message": "Establecer requisitos mínimos para la fortaleza de la contraseña maestra." }, + "passwordStrengthScore": { + "message": "Password strength score $SCORE$", + "placeholders": { + "score": { + "content": "$1", + "example": "4" + } + } + }, "twoStepLoginPolicyTitle": { "message": "Requiere inicio de sesión en dos pasos" }, @@ -5653,6 +5696,12 @@ "webAuthnAuthenticate": { "message": "Autenticar WebAuthn" }, + "readSecurityKey": { + "message": "Read security key" + }, + "awaitingSecurityKeyInteraction": { + "message": "Awaiting security key interaction..." + }, "webAuthnNotSupported": { "message": "WebAuthn no es compatible con este navegador." }, @@ -7199,6 +7248,12 @@ "duoRequiredByOrgForAccount": { "message": "Duo two-step login is required for your account." }, + "duoTwoFactorRequiredPageSubtitle": { + "message": "Duo two-step login is required for your account. Follow the steps below to finish logging in." + }, + "followTheStepsBelowToFinishLoggingIn": { + "message": "Follow the steps below to finish logging in." + }, "launchDuo": { "message": "Iniciar Duo" }, @@ -10437,5 +10492,23 @@ }, "removeUnlockWithPinPolicyDesc": { "message": "Do not allow members to unlock their account with a PIN." + }, + "limitedEventLogs": { + "message": "$PRODUCT_TYPE$ plans do not have access to real event logs", + "placeholders": { + "product_type": { + "content": "$1", + "example": "Teams" + } + } + }, + "upgradeForFullEvents": { + "message": "Get full access to organization event logs by upgrading to a Teams or Enterprise plan." + }, + "upgradeEventLogTitle": { + "message": "Upgrade for real event log data" + }, + "upgradeEventLogMessage": { + "message": "These events are examples only and do not reflect real events within your Bitwarden organization." } } diff --git a/apps/web/src/locales/et/messages.json b/apps/web/src/locales/et/messages.json index 9a8d3d18281..47c3eeadfea 100644 --- a/apps/web/src/locales/et/messages.json +++ b/apps/web/src/locales/et/messages.json @@ -5,6 +5,9 @@ "criticalApplications": { "message": "Critical applications" }, + "noCriticalAppsAtRisk": { + "message": "No critical applications at risk" + }, "accessIntelligence": { "message": "Access Intelligence" }, @@ -1161,6 +1164,15 @@ "logInToBitwarden": { "message": "Log in to Bitwarden" }, + "enterTheCodeSentToYourEmail": { + "message": "Enter the code sent to your email" + }, + "enterTheCodeFromYourAuthenticatorApp": { + "message": "Enter the code from your authenticator app" + }, + "pressYourYubiKeyToAuthenticate": { + "message": "Press your YubiKey to authenticate" + }, "authenticationTimeout": { "message": "Authentication timeout" }, @@ -1443,12 +1455,22 @@ "rememberMe": { "message": "Jäta mind meelde" }, + "dontAskAgainOnThisDeviceFor30Days": { + "message": "Don't ask again on this device for 30 days" + }, "sendVerificationCodeEmailAgain": { "message": "Saada e-postile uus kinnituskood" }, "useAnotherTwoStepMethod": { "message": "Kasuta teist kaheastmelist sisselogimise meetodit" }, + "selectAnotherMethod": { + "message": "Select another method", + "description": "Select another two-step login method" + }, + "useYourRecoveryCode": { + "message": "Use your recovery code" + }, "insertYubiKey": { "message": "Sisesta oma YubiKey arvuti USB porti ja kliki sellele nupule." }, @@ -1467,6 +1489,9 @@ "twoStepOptions": { "message": "Kaheastmelise sisselogimise valikud" }, + "selectTwoStepLoginMethod": { + "message": "Select two-step login method" + }, "recoveryCodeDesc": { "message": "Sul ei ole ligipääsu ühelegi kaheastmelise kinnitamise teenusele? Kasuta taastamise koodi, et kaheastmeline kinnitamine oma kontol välja lülitada." }, @@ -1509,6 +1534,9 @@ "webAuthnMigrated": { "message": "(pärineb FIDO'lt)" }, + "openInNewTab": { + "message": "Open in new tab" + }, "emailTitle": { "message": "E-post" }, @@ -4081,6 +4109,12 @@ "updateBrowserDesc": { "message": "Kasutad brauserit, mida ei toetata. Veebihoidla ei pruugi hästi töötada." }, + "youHaveAPendingLoginRequest": { + "message": "You have a pending login request from another device." + }, + "reviewLoginRequest": { + "message": "Review login request" + }, "freeTrialEndPromptCount": { "message": "Your free trial ends in $COUNT$ days.", "placeholders": { @@ -4758,6 +4792,15 @@ "masterPassPolicyDesc": { "message": "Määra minimaalsed ülemparooli tugevuse tingimused." }, + "passwordStrengthScore": { + "message": "Password strength score $SCORE$", + "placeholders": { + "score": { + "content": "$1", + "example": "4" + } + } + }, "twoStepLoginPolicyTitle": { "message": "Nõua kahe-astmelist sisselogimist" }, @@ -5653,6 +5696,12 @@ "webAuthnAuthenticate": { "message": "WebAuthn kinnitamine" }, + "readSecurityKey": { + "message": "Read security key" + }, + "awaitingSecurityKeyInteraction": { + "message": "Awaiting security key interaction..." + }, "webAuthnNotSupported": { "message": "Sinu brauser ei toeta WebAuthn'i." }, @@ -7199,6 +7248,12 @@ "duoRequiredByOrgForAccount": { "message": "Duo two-step login is required for your account." }, + "duoTwoFactorRequiredPageSubtitle": { + "message": "Duo two-step login is required for your account. Follow the steps below to finish logging in." + }, + "followTheStepsBelowToFinishLoggingIn": { + "message": "Follow the steps below to finish logging in." + }, "launchDuo": { "message": "Launch Duo" }, @@ -10437,5 +10492,23 @@ }, "removeUnlockWithPinPolicyDesc": { "message": "Do not allow members to unlock their account with a PIN." + }, + "limitedEventLogs": { + "message": "$PRODUCT_TYPE$ plans do not have access to real event logs", + "placeholders": { + "product_type": { + "content": "$1", + "example": "Teams" + } + } + }, + "upgradeForFullEvents": { + "message": "Get full access to organization event logs by upgrading to a Teams or Enterprise plan." + }, + "upgradeEventLogTitle": { + "message": "Upgrade for real event log data" + }, + "upgradeEventLogMessage": { + "message": "These events are examples only and do not reflect real events within your Bitwarden organization." } } diff --git a/apps/web/src/locales/eu/messages.json b/apps/web/src/locales/eu/messages.json index 2efe0c0f629..97d636833ed 100644 --- a/apps/web/src/locales/eu/messages.json +++ b/apps/web/src/locales/eu/messages.json @@ -5,6 +5,9 @@ "criticalApplications": { "message": "Critical applications" }, + "noCriticalAppsAtRisk": { + "message": "No critical applications at risk" + }, "accessIntelligence": { "message": "Access Intelligence" }, @@ -1161,6 +1164,15 @@ "logInToBitwarden": { "message": "Log in to Bitwarden" }, + "enterTheCodeSentToYourEmail": { + "message": "Enter the code sent to your email" + }, + "enterTheCodeFromYourAuthenticatorApp": { + "message": "Enter the code from your authenticator app" + }, + "pressYourYubiKeyToAuthenticate": { + "message": "Press your YubiKey to authenticate" + }, "authenticationTimeout": { "message": "Authentication timeout" }, @@ -1443,12 +1455,22 @@ "rememberMe": { "message": "Gogora nazazu" }, + "dontAskAgainOnThisDeviceFor30Days": { + "message": "Don't ask again on this device for 30 days" + }, "sendVerificationCodeEmailAgain": { "message": "Berbidali email bidezko egiaztatze-kodea" }, "useAnotherTwoStepMethod": { "message": "Erabili bi urratseko saio hasierarako beste modu bat" }, + "selectAnotherMethod": { + "message": "Select another method", + "description": "Select another two-step login method" + }, + "useYourRecoveryCode": { + "message": "Use your recovery code" + }, "insertYubiKey": { "message": "Sartu zure YubiKey-a ordenagailuko USB atakan, ondoren, sakatu bere botoia." }, @@ -1467,6 +1489,9 @@ "twoStepOptions": { "message": "Bi urratseko saio hasieraren aukerak" }, + "selectTwoStepLoginMethod": { + "message": "Select two-step login method" + }, "recoveryCodeDesc": { "message": "Bi urratseko egiaztatzeko modu guztietarako sarbidea galdu duzu? Erabili zure berreskuratze-kodea zure kontuko bi urratseko egiaztatze hornitzaile guztiak desaktibatzeko." }, @@ -1509,6 +1534,9 @@ "webAuthnMigrated": { "message": "(FIDO-tik migratua)" }, + "openInNewTab": { + "message": "Open in new tab" + }, "emailTitle": { "message": "Emaila" }, @@ -4081,6 +4109,12 @@ "updateBrowserDesc": { "message": "Euskarririk gabeko web nabigatzailea erabiltzen ari zara. Baliteke webguneko kutxa gotorrak behar bezala ez funtzionatzea." }, + "youHaveAPendingLoginRequest": { + "message": "You have a pending login request from another device." + }, + "reviewLoginRequest": { + "message": "Review login request" + }, "freeTrialEndPromptCount": { "message": "Your free trial ends in $COUNT$ days.", "placeholders": { @@ -4758,6 +4792,15 @@ "masterPassPolicyDesc": { "message": "Ezarri pasahitz nagusiaren gutxieneko baldintzak." }, + "passwordStrengthScore": { + "message": "Password strength score $SCORE$", + "placeholders": { + "score": { + "content": "$1", + "example": "4" + } + } + }, "twoStepLoginPolicyTitle": { "message": "Bi urratseko saio hasiera beharrezkoa da" }, @@ -5653,6 +5696,12 @@ "webAuthnAuthenticate": { "message": "WebAuthn autentifikatu" }, + "readSecurityKey": { + "message": "Read security key" + }, + "awaitingSecurityKeyInteraction": { + "message": "Awaiting security key interaction..." + }, "webAuthnNotSupported": { "message": "WebAuthn ez da bateragarria nabigatzaile honetan." }, @@ -7199,6 +7248,12 @@ "duoRequiredByOrgForAccount": { "message": "Duo two-step login is required for your account." }, + "duoTwoFactorRequiredPageSubtitle": { + "message": "Duo two-step login is required for your account. Follow the steps below to finish logging in." + }, + "followTheStepsBelowToFinishLoggingIn": { + "message": "Follow the steps below to finish logging in." + }, "launchDuo": { "message": "Launch Duo" }, @@ -10437,5 +10492,23 @@ }, "removeUnlockWithPinPolicyDesc": { "message": "Do not allow members to unlock their account with a PIN." + }, + "limitedEventLogs": { + "message": "$PRODUCT_TYPE$ plans do not have access to real event logs", + "placeholders": { + "product_type": { + "content": "$1", + "example": "Teams" + } + } + }, + "upgradeForFullEvents": { + "message": "Get full access to organization event logs by upgrading to a Teams or Enterprise plan." + }, + "upgradeEventLogTitle": { + "message": "Upgrade for real event log data" + }, + "upgradeEventLogMessage": { + "message": "These events are examples only and do not reflect real events within your Bitwarden organization." } } diff --git a/apps/web/src/locales/fa/messages.json b/apps/web/src/locales/fa/messages.json index 3aa355fccb0..083caa4b594 100644 --- a/apps/web/src/locales/fa/messages.json +++ b/apps/web/src/locales/fa/messages.json @@ -5,6 +5,9 @@ "criticalApplications": { "message": "Critical applications" }, + "noCriticalAppsAtRisk": { + "message": "No critical applications at risk" + }, "accessIntelligence": { "message": "Access Intelligence" }, @@ -1161,6 +1164,15 @@ "logInToBitwarden": { "message": "Log in to Bitwarden" }, + "enterTheCodeSentToYourEmail": { + "message": "Enter the code sent to your email" + }, + "enterTheCodeFromYourAuthenticatorApp": { + "message": "Enter the code from your authenticator app" + }, + "pressYourYubiKeyToAuthenticate": { + "message": "Press your YubiKey to authenticate" + }, "authenticationTimeout": { "message": "Authentication timeout" }, @@ -1443,12 +1455,22 @@ "rememberMe": { "message": "مرا به خاطر بسپار" }, + "dontAskAgainOnThisDeviceFor30Days": { + "message": "Don't ask again on this device for 30 days" + }, "sendVerificationCodeEmailAgain": { "message": "ارسال دوباره ایمیل کد تأیید" }, "useAnotherTwoStepMethod": { "message": "استفاده از روش ورود دو مرحله‌ای دیگر" }, + "selectAnotherMethod": { + "message": "Select another method", + "description": "Select another two-step login method" + }, + "useYourRecoveryCode": { + "message": "Use your recovery code" + }, "insertYubiKey": { "message": "YubiKey خود را وارد پورت USB رایانه کنید، بعد دکمه آن را بفشارید." }, @@ -1467,6 +1489,9 @@ "twoStepOptions": { "message": "گزینه‌های ورود دو مرحله‌ای" }, + "selectTwoStepLoginMethod": { + "message": "Select two-step login method" + }, "recoveryCodeDesc": { "message": "دسترسی به تمامی ارائه‌دهندگان دو مرحله‌ای را از دست داده‌اید؟ از کد بازیابی خود برای غیرفعال‌سازی ارائه‌دهندگان دو مرحله‌ای از حسابتان استفاده کنید." }, @@ -1509,6 +1534,9 @@ "webAuthnMigrated": { "message": "(مهاجرت از FIDO)" }, + "openInNewTab": { + "message": "Open in new tab" + }, "emailTitle": { "message": "ایمیل" }, @@ -4081,6 +4109,12 @@ "updateBrowserDesc": { "message": "شما از یک مرورگر وب پشتیبانی نشده استفاده می‌کنید. گاوصندوق وب ممکن است به درستی کار نکند." }, + "youHaveAPendingLoginRequest": { + "message": "You have a pending login request from another device." + }, + "reviewLoginRequest": { + "message": "Review login request" + }, "freeTrialEndPromptCount": { "message": "Your free trial ends in $COUNT$ days.", "placeholders": { @@ -4758,6 +4792,15 @@ "masterPassPolicyDesc": { "message": "الزامات را برای قدرت کلمه عبور اصلی تنظیم کنید." }, + "passwordStrengthScore": { + "message": "Password strength score $SCORE$", + "placeholders": { + "score": { + "content": "$1", + "example": "4" + } + } + }, "twoStepLoginPolicyTitle": { "message": "فعال کردن ورود دو مرحله ای الزامیست" }, @@ -5653,6 +5696,12 @@ "webAuthnAuthenticate": { "message": "تأیید اعتبار در WebAuthn" }, + "readSecurityKey": { + "message": "Read security key" + }, + "awaitingSecurityKeyInteraction": { + "message": "Awaiting security key interaction..." + }, "webAuthnNotSupported": { "message": "WebAuthn در این مرورگر پشتیبانی نمی‌شود." }, @@ -7199,6 +7248,12 @@ "duoRequiredByOrgForAccount": { "message": "Duo two-step login is required for your account." }, + "duoTwoFactorRequiredPageSubtitle": { + "message": "Duo two-step login is required for your account. Follow the steps below to finish logging in." + }, + "followTheStepsBelowToFinishLoggingIn": { + "message": "Follow the steps below to finish logging in." + }, "launchDuo": { "message": "Launch Duo" }, @@ -10437,5 +10492,23 @@ }, "removeUnlockWithPinPolicyDesc": { "message": "Do not allow members to unlock their account with a PIN." + }, + "limitedEventLogs": { + "message": "$PRODUCT_TYPE$ plans do not have access to real event logs", + "placeholders": { + "product_type": { + "content": "$1", + "example": "Teams" + } + } + }, + "upgradeForFullEvents": { + "message": "Get full access to organization event logs by upgrading to a Teams or Enterprise plan." + }, + "upgradeEventLogTitle": { + "message": "Upgrade for real event log data" + }, + "upgradeEventLogMessage": { + "message": "These events are examples only and do not reflect real events within your Bitwarden organization." } } diff --git a/apps/web/src/locales/fi/messages.json b/apps/web/src/locales/fi/messages.json index 7ed6320a08e..55aa712c6dc 100644 --- a/apps/web/src/locales/fi/messages.json +++ b/apps/web/src/locales/fi/messages.json @@ -5,6 +5,9 @@ "criticalApplications": { "message": "Kriittiset sovellukset" }, + "noCriticalAppsAtRisk": { + "message": "No critical applications at risk" + }, "accessIntelligence": { "message": "Access Intelligence" }, @@ -1161,6 +1164,15 @@ "logInToBitwarden": { "message": "Kirjaudu Bitwardeniin" }, + "enterTheCodeSentToYourEmail": { + "message": "Enter the code sent to your email" + }, + "enterTheCodeFromYourAuthenticatorApp": { + "message": "Enter the code from your authenticator app" + }, + "pressYourYubiKeyToAuthenticate": { + "message": "Tunnistaudu painamalla YubiKeytäsi" + }, "authenticationTimeout": { "message": "Todennuksen aikakatkaisu" }, @@ -1443,12 +1455,22 @@ "rememberMe": { "message": "Muista minut" }, + "dontAskAgainOnThisDeviceFor30Days": { + "message": "Don't ask again on this device for 30 days" + }, "sendVerificationCodeEmailAgain": { "message": "Lähetä todennuskoodi sähköpostitse uudelleen" }, "useAnotherTwoStepMethod": { "message": "Käytä vaihtoehtoista todennustapaa" }, + "selectAnotherMethod": { + "message": "Select another method", + "description": "Select another two-step login method" + }, + "useYourRecoveryCode": { + "message": "Use your recovery code" + }, "insertYubiKey": { "message": "Kytke YubiKey-todennuslaitteesi tietokoneen USB-porttiin ja paina sen painiketta." }, @@ -1467,6 +1489,9 @@ "twoStepOptions": { "message": "Kaksivaiheisen kirjautumisen asetukset" }, + "selectTwoStepLoginMethod": { + "message": "Select two-step login method" + }, "recoveryCodeDesc": { "message": "Etkö voi käyttää kaksivaiheisen kirjautumisen todentajiasi? Poista kaikki määritetyt todentajat käytöstä palautuskoodillasi." }, @@ -1509,6 +1534,9 @@ "webAuthnMigrated": { "message": "(siirretty FIDO:sta)" }, + "openInNewTab": { + "message": "Open in new tab" + }, "emailTitle": { "message": "Sähköposti" }, @@ -4081,6 +4109,12 @@ "updateBrowserDesc": { "message": "Käytät selainta, jota ei tueta. Verkkoholvi ei välttämättä toimi oikein." }, + "youHaveAPendingLoginRequest": { + "message": "You have a pending login request from another device." + }, + "reviewLoginRequest": { + "message": "Review login request" + }, "freeTrialEndPromptCount": { "message": "Ilmainen kokeilujakso päättyy $COUNT$ päivän kuluttua.", "placeholders": { @@ -4758,6 +4792,15 @@ "masterPassPolicyDesc": { "message": "Aseta pääsalasanan vahvuusvaatimukset." }, + "passwordStrengthScore": { + "message": "Password strength score $SCORE$", + "placeholders": { + "score": { + "content": "$1", + "example": "4" + } + } + }, "twoStepLoginPolicyTitle": { "message": "Vaadi kaksivaiheinen kirjautuminen" }, @@ -5653,6 +5696,12 @@ "webAuthnAuthenticate": { "message": "WebAuthn-todennus" }, + "readSecurityKey": { + "message": "Read security key" + }, + "awaitingSecurityKeyInteraction": { + "message": "Awaiting security key interaction..." + }, "webAuthnNotSupported": { "message": "WebAuthn-todennusta ei tueta tässä selaimessa." }, @@ -7199,6 +7248,12 @@ "duoRequiredByOrgForAccount": { "message": "Tilillesi kirjautuminen vaatii Duo-vahvistuksen." }, + "duoTwoFactorRequiredPageSubtitle": { + "message": "Duo two-step login is required for your account. Follow the steps below to finish logging in." + }, + "followTheStepsBelowToFinishLoggingIn": { + "message": "Follow the steps below to finish logging in." + }, "launchDuo": { "message": "Avaa Duo" }, @@ -10437,5 +10492,23 @@ }, "removeUnlockWithPinPolicyDesc": { "message": "Do not allow members to unlock their account with a PIN." + }, + "limitedEventLogs": { + "message": "$PRODUCT_TYPE$ plans do not have access to real event logs", + "placeholders": { + "product_type": { + "content": "$1", + "example": "Teams" + } + } + }, + "upgradeForFullEvents": { + "message": "Get full access to organization event logs by upgrading to a Teams or Enterprise plan." + }, + "upgradeEventLogTitle": { + "message": "Upgrade for real event log data" + }, + "upgradeEventLogMessage": { + "message": "These events are examples only and do not reflect real events within your Bitwarden organization." } } diff --git a/apps/web/src/locales/fil/messages.json b/apps/web/src/locales/fil/messages.json index b9de65f5eb2..0f1fc9c2b7e 100644 --- a/apps/web/src/locales/fil/messages.json +++ b/apps/web/src/locales/fil/messages.json @@ -5,6 +5,9 @@ "criticalApplications": { "message": "Critical applications" }, + "noCriticalAppsAtRisk": { + "message": "No critical applications at risk" + }, "accessIntelligence": { "message": "Access Intelligence" }, @@ -1161,6 +1164,15 @@ "logInToBitwarden": { "message": "Log in to Bitwarden" }, + "enterTheCodeSentToYourEmail": { + "message": "Enter the code sent to your email" + }, + "enterTheCodeFromYourAuthenticatorApp": { + "message": "Enter the code from your authenticator app" + }, + "pressYourYubiKeyToAuthenticate": { + "message": "Press your YubiKey to authenticate" + }, "authenticationTimeout": { "message": "Authentication timeout" }, @@ -1443,12 +1455,22 @@ "rememberMe": { "message": "Tandaan ako" }, + "dontAskAgainOnThisDeviceFor30Days": { + "message": "Don't ask again on this device for 30 days" + }, "sendVerificationCodeEmailAgain": { "message": "Ipadala ulit ang email na naglalaman ng code pamberipika" }, "useAnotherTwoStepMethod": { "message": "Gumamit ng ibang paraan sa dalawang-hakbang na pag-log in" }, + "selectAnotherMethod": { + "message": "Select another method", + "description": "Select another two-step login method" + }, + "useYourRecoveryCode": { + "message": "Use your recovery code" + }, "insertYubiKey": { "message": "Ipasok ang YubiKey mo sa USB port ng iyong computer, tapos pindutin ang buton nito." }, @@ -1467,6 +1489,9 @@ "twoStepOptions": { "message": "Mga opsyon para sa dalawang-hakbang na pag-log in" }, + "selectTwoStepLoginMethod": { + "message": "Select two-step login method" + }, "recoveryCodeDesc": { "message": "Nawalan ng access sa lahat ng provider mo ng dalawang-hakbang na pag-log in? Gamitin ang code pang-recover mo para patayin ang lahat ng mga provider ng dalawang-hakbang na pag-log in sa account mo." }, @@ -1509,6 +1534,9 @@ "webAuthnMigrated": { "message": "(Inilipat mula sa FIDO)" }, + "openInNewTab": { + "message": "Open in new tab" + }, "emailTitle": { "message": "Email" }, @@ -4081,6 +4109,12 @@ "updateBrowserDesc": { "message": "Gumagamit ka ng isang hindi suportado na web browser. Ang web vault ay maaaring hindi gumana nang maayos." }, + "youHaveAPendingLoginRequest": { + "message": "You have a pending login request from another device." + }, + "reviewLoginRequest": { + "message": "Review login request" + }, "freeTrialEndPromptCount": { "message": "Your free trial ends in $COUNT$ days.", "placeholders": { @@ -4758,6 +4792,15 @@ "masterPassPolicyDesc": { "message": "Magtakda ng mga kinakailangan para sa lakas ng master password." }, + "passwordStrengthScore": { + "message": "Password strength score $SCORE$", + "placeholders": { + "score": { + "content": "$1", + "example": "4" + } + } + }, "twoStepLoginPolicyTitle": { "message": "Kailangan ng dalawang-hakbang na pag-login" }, @@ -5653,6 +5696,12 @@ "webAuthnAuthenticate": { "message": "I-authenticate ang WebAuthn" }, + "readSecurityKey": { + "message": "Read security key" + }, + "awaitingSecurityKeyInteraction": { + "message": "Awaiting security key interaction..." + }, "webAuthnNotSupported": { "message": "Hindi suportado ang WebAuthn sa browser na ito." }, @@ -7199,6 +7248,12 @@ "duoRequiredByOrgForAccount": { "message": "Duo two-step login is required for your account." }, + "duoTwoFactorRequiredPageSubtitle": { + "message": "Duo two-step login is required for your account. Follow the steps below to finish logging in." + }, + "followTheStepsBelowToFinishLoggingIn": { + "message": "Follow the steps below to finish logging in." + }, "launchDuo": { "message": "Launch Duo" }, @@ -10437,5 +10492,23 @@ }, "removeUnlockWithPinPolicyDesc": { "message": "Do not allow members to unlock their account with a PIN." + }, + "limitedEventLogs": { + "message": "$PRODUCT_TYPE$ plans do not have access to real event logs", + "placeholders": { + "product_type": { + "content": "$1", + "example": "Teams" + } + } + }, + "upgradeForFullEvents": { + "message": "Get full access to organization event logs by upgrading to a Teams or Enterprise plan." + }, + "upgradeEventLogTitle": { + "message": "Upgrade for real event log data" + }, + "upgradeEventLogMessage": { + "message": "These events are examples only and do not reflect real events within your Bitwarden organization." } } diff --git a/apps/web/src/locales/fr/messages.json b/apps/web/src/locales/fr/messages.json index 087e71ab674..c4acc33f79a 100644 --- a/apps/web/src/locales/fr/messages.json +++ b/apps/web/src/locales/fr/messages.json @@ -5,6 +5,9 @@ "criticalApplications": { "message": "Applications critiques" }, + "noCriticalAppsAtRisk": { + "message": "Aucune application critique à risques" + }, "accessIntelligence": { "message": "Accéder à Intelligence" }, @@ -1161,6 +1164,15 @@ "logInToBitwarden": { "message": "Se connecter à Bitwarden" }, + "enterTheCodeSentToYourEmail": { + "message": "Entrez le code envoyé à votre adresse courriel" + }, + "enterTheCodeFromYourAuthenticatorApp": { + "message": "Entrez le code de votre application d'authentification" + }, + "pressYourYubiKeyToAuthenticate": { + "message": "Appuyez sur votre YubiKey pour vous authentifier" + }, "authenticationTimeout": { "message": "Délai d'authentification dépassé" }, @@ -1443,12 +1455,22 @@ "rememberMe": { "message": "Se souvenir de moi" }, + "dontAskAgainOnThisDeviceFor30Days": { + "message": "Ne plus demander sur cet appareil pendant 30 jours" + }, "sendVerificationCodeEmailAgain": { "message": "Envoyer à nouveau le courriel de code de vérification" }, "useAnotherTwoStepMethod": { "message": "Utiliser une autre méthode d'authentification à deux facteurs" }, + "selectAnotherMethod": { + "message": "Sélectionnez une autre méthode", + "description": "Select another two-step login method" + }, + "useYourRecoveryCode": { + "message": "Utilisez votre code de récupération" + }, "insertYubiKey": { "message": "Insérez votre YubiKey dans le port USB de votre ordinateur puis appuyez sur son bouton." }, @@ -1459,7 +1481,7 @@ "message": "Identifiant non disponible" }, "noTwoStepProviders": { - "message": "Ce compte dispose d'une authentification à deux facteurs de configurée, cependant, aucun des fournisseurs à deux facteurs configurés n'est pris en charge par ce navigateur web." + "message": "Ce compte dispose d'une configuration d'authentification à deux facteurs, cependant, aucun des fournisseurs d'authentification à deux facteurs configurés n'est pris en charge par ce navigateur web." }, "noTwoStepProviders2": { "message": "Merci d'utiliser un navigateur web compatible (comme Chrome) et/ou d'ajouter des services additionnels d'identification en deux étapes qui sont mieux supportés par les navigateurs web (comme par exemple une application d'authentification)." @@ -1467,6 +1489,9 @@ "twoStepOptions": { "message": "Options d'authentification à deux facteurs" }, + "selectTwoStepLoginMethod": { + "message": "Sélectionnez la méthode d'authentification à deux facteurs" + }, "recoveryCodeDesc": { "message": "Vous avez perdu l'accès à tous vos fournisseurs d'authentification à deux facteurs ? Utilisez votre code de récupération pour désactiver tous les fournisseurs d'authentification à deux facteurs de votre compte." }, @@ -1509,6 +1534,9 @@ "webAuthnMigrated": { "message": "(Migré depuis FIDO)" }, + "openInNewTab": { + "message": "Ouvrir dans un nouvel onglet" + }, "emailTitle": { "message": "Courriel" }, @@ -1732,7 +1760,7 @@ "message": "Inclure un Chiffre" }, "generatorPolicyInEffect": { - "message": "Les exigences de la politique de sécurité de l'entreprise ont été appliquées aux options de votre générateur.", + "message": "Les exigences de la politique de sécurité Entreprise ont été appliquées aux options de votre générateur.", "description": "Indicates that a policy limits the credential generator screen." }, "passwordHistory": { @@ -3099,7 +3127,7 @@ "message": "Pour les entreprises et autres équipes." }, "planNameTeamsStarter": { - "message": "Teams Starter" + "message": "Équipes Essentiel" }, "planNameEnterprise": { "message": "Entreprise" @@ -4081,6 +4109,12 @@ "updateBrowserDesc": { "message": "Vous utilisez un navigateur non supporté. Le coffre web pourrait ne pas fonctionner correctement." }, + "youHaveAPendingLoginRequest": { + "message": "Vous avez une demande de connexion en attente depuis un autre appareil." + }, + "reviewLoginRequest": { + "message": "Examiner la demande de connexion" + }, "freeTrialEndPromptCount": { "message": "Votre essai gratuit se termine dans $COUNT$ jours.", "placeholders": { @@ -4176,7 +4210,7 @@ "message": "Si vous ne pouvez pas accéder à votre compte par les méthodes normales d'authentification à deux facteurs, vous pouvez utiliser votre code de récupération d'authentification à deux facteurs pour désactiver tous les fournisseurs à deux facteurs sur votre compte." }, "logInBelowUsingYourSingleUseRecoveryCode": { - "message": "Connectez-vous ci-dessous en utilisant votre code de récupération à usage unique. Cela désactivera tous les fournisseurs en deux étapes de votre compte." + "message": "Connectez-vous ci-dessous en utilisant votre code de récupération à usage unique. Cela désactivera tous les fournisseurs d'authentification à deux facteurs de votre compte." }, "recoverAccountTwoStep": { "message": "Récupérer l'authentification à deux facteurs" @@ -4758,6 +4792,15 @@ "masterPassPolicyDesc": { "message": "Définir les exigences de robustesse du mot de passe principal." }, + "passwordStrengthScore": { + "message": "Score de force du mot de passe $SCORE$", + "placeholders": { + "score": { + "content": "$1", + "example": "4" + } + } + }, "twoStepLoginPolicyTitle": { "message": "Exiger une authentification à deux facteurs" }, @@ -4942,7 +4985,7 @@ "message": "Pour vous connecter avec votre fournisseur de SSO, entrez l'identifiant SSO de votre organisation pour commencer. Vous devrez peut-être entrer cet identifiant SSO lorsque vous vous connecterez à partir d'un nouvel appareil." }, "enterpriseSingleSignOn": { - "message": "Portail de connexion unique d'entreprise (Single Sign-On)" + "message": "Portail de connexion unique Entreprise" }, "ssoHandOff": { "message": "Vous pouvez maintenant fermer cet onglet et continuer dans l'extension." @@ -4960,7 +5003,7 @@ "message": "Toutes les fonctionnalités pour les équipes, plus :" }, "includeAllTeamsStarterFeatures": { - "message": "Toutes les fonctionnalités de Teams Starter, plus :" + "message": "Toutes les fonctionnalités d'Équipes Essentiel, plus :" }, "chooseMonthlyOrAnnualBilling": { "message": "Choisissez la facturation mensuelle ou annuelle" @@ -5024,13 +5067,13 @@ "message": "Authentification par Connexion Unique (Single Sign-On)" }, "requireSsoPolicyDesc": { - "message": "Exiger que les utilisateurs se connectent avec la méthode du portail de connexion unique d'entreprise." + "message": "Exiger que les membres se connectent avec la méthode du portail de connexion unique Entreprise." }, "prerequisite": { "message": "Prérequis" }, "requireSsoPolicyReq": { - "message": "La politique d'entreprise \"Organisation Unique\" doit être activée avant d'activer cette politique." + "message": "La politique d'organisation unique Entreprise doit être activée avant d'activer cette politique." }, "requireSsoPolicyReqError": { "message": "La politique \"Organisation Unique\" n'est pas activée." @@ -5337,7 +5380,7 @@ "message": "Les propriétaires et les administrateurs de l'organisation sont exonérés de l'application de cette politique." }, "personalOwnershipSubmitError": { - "message": "En raison d'une politique d'entreprise, il vous est interdit d'enregistrer des éléments dans votre coffre personnel. Sélectionnez une organisation dans l'option Propriété et choisissez parmi les collections disponibles." + "message": "En raison d'une politique de sécurité Entreprise, il vous est interdit d'enregistrer des éléments dans votre coffre personnel. Sélectionnez une organisation dans l'option Propriété et choisissez parmi les collections disponibles." }, "disableSend": { "message": "Supprimer le Send" @@ -5354,7 +5397,7 @@ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendDisabledWarning": { - "message": "En raison d'une politique d'entreprise, vous ne pouvez que supprimer un Send existant.", + "message": "En raison d'une politique de sécurité Entreprise, vous ne pouvez que supprimer un Send existant.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendOptions": { @@ -5653,6 +5696,12 @@ "webAuthnAuthenticate": { "message": "Authentifier WebAuthn" }, + "readSecurityKey": { + "message": "Lire la clé de sécurité" + }, + "awaitingSecurityKeyInteraction": { + "message": "En attente de l'interaction de la clé de sécurité..." + }, "webAuthnNotSupported": { "message": "WebAuthn n'est pas pris en charge dans ce navigateur." }, @@ -5756,7 +5805,7 @@ "message": "Les comptes existants avec les mots de passe principaux exigeront que les membres s'inscrivent d'eux-mêmes avant que les administrateurs puissent récupérer leurs comptes. L'inscription automatique activera la récupération du compte pour les nouveaux membres." }, "accountRecoverySingleOrgRequirementDesc": { - "message": "La politique Entreprise d'organisation unique doit être activée avant d'activer cette politique." + "message": "La politique de sécurité d'organisation unique Entreprise doit être activée avant d'activer cette politique de sécurité." }, "resetPasswordPolicyAutoEnroll": { "message": "Inscription automatique" @@ -7199,6 +7248,12 @@ "duoRequiredByOrgForAccount": { "message": "L'authentification à double facteur DUO est requise pour votre compte." }, + "duoTwoFactorRequiredPageSubtitle": { + "message": "L'authentification à deux facteurs est requise pour votre compte. Suivez les étapes ci-dessous pour terminer la connexion." + }, + "followTheStepsBelowToFinishLoggingIn": { + "message": "Suivez les étapes ci-dessous pour terminer de vous connecter." + }, "launchDuo": { "message": "Lancer DUO" }, @@ -7970,7 +8025,7 @@ } }, "teamsStarterPlanInvLimitReachedManageBilling": { - "message": "Les abonnements Teams Starter peuvent compter jusqu'à $SEATCOUNT$ membres. Passez à une offre payante pour inviter plus de membres.", + "message": "Les abonnements Équipes Essentiel peuvent compter jusqu'à $SEATCOUNT$ membres. Mettez à niveau vers une offre payante pour inviter plus de membres.", "placeholders": { "seatcount": { "content": "$1", @@ -7979,7 +8034,7 @@ } }, "teamsStarterPlanInvLimitReachedNoManageBilling": { - "message": "Les abonnements Teams Starter peuvent compter jusqu'à $SEATCOUNT$ membres. Contacter le propriétaire de votre organisation pour améliorer votre abonnements et inviter plus de membres.", + "message": "Les abonnements Équipes Essentiel peuvent compter jusqu'à $SEATCOUNT$ membres. Contacter le propriétaire de votre organisation pour mettre à niveau votre abonnements et inviter plus de membres.", "placeholders": { "seatcount": { "content": "$1", @@ -10437,5 +10492,23 @@ }, "removeUnlockWithPinPolicyDesc": { "message": "Ne pas autoriser les membres à déverrouiller leur compte avec un NIP." + }, + "limitedEventLogs": { + "message": "Les plans $PRODUCT_TYPE$ n'ont pas accès aux journaux d'événements réels", + "placeholders": { + "product_type": { + "content": "$1", + "example": "Teams" + } + } + }, + "upgradeForFullEvents": { + "message": "Obtenez un accès complet aux journaux d'événements de l'organisation en mettant à niveau vers un plan Équipes ou Entreprise." + }, + "upgradeEventLogTitle": { + "message": "Mettez à niveau pour les données du journal des événements réels" + }, + "upgradeEventLogMessage": { + "message": "Ces événements sont des exemples et ne reflètent pas les événements réels au sein de votre organisation Bitwarden." } } diff --git a/apps/web/src/locales/gl/messages.json b/apps/web/src/locales/gl/messages.json index 1b3a777413c..d466c972baf 100644 --- a/apps/web/src/locales/gl/messages.json +++ b/apps/web/src/locales/gl/messages.json @@ -5,6 +5,9 @@ "criticalApplications": { "message": "Critical applications" }, + "noCriticalAppsAtRisk": { + "message": "No critical applications at risk" + }, "accessIntelligence": { "message": "Access Intelligence" }, @@ -1161,6 +1164,15 @@ "logInToBitwarden": { "message": "Log in to Bitwarden" }, + "enterTheCodeSentToYourEmail": { + "message": "Enter the code sent to your email" + }, + "enterTheCodeFromYourAuthenticatorApp": { + "message": "Enter the code from your authenticator app" + }, + "pressYourYubiKeyToAuthenticate": { + "message": "Press your YubiKey to authenticate" + }, "authenticationTimeout": { "message": "Authentication timeout" }, @@ -1443,12 +1455,22 @@ "rememberMe": { "message": "Remember me" }, + "dontAskAgainOnThisDeviceFor30Days": { + "message": "Don't ask again on this device for 30 days" + }, "sendVerificationCodeEmailAgain": { "message": "Send verification code email again" }, "useAnotherTwoStepMethod": { "message": "Use another two-step login method" }, + "selectAnotherMethod": { + "message": "Select another method", + "description": "Select another two-step login method" + }, + "useYourRecoveryCode": { + "message": "Use your recovery code" + }, "insertYubiKey": { "message": "Insert your YubiKey into your computer's USB port, then touch its button." }, @@ -1467,6 +1489,9 @@ "twoStepOptions": { "message": "Two-step login options" }, + "selectTwoStepLoginMethod": { + "message": "Select two-step login method" + }, "recoveryCodeDesc": { "message": "Lost access to all of your two-step login providers? Use your recovery code to turn off all two-step login providers from your account." }, @@ -1509,6 +1534,9 @@ "webAuthnMigrated": { "message": "(Migrated from FIDO)" }, + "openInNewTab": { + "message": "Open in new tab" + }, "emailTitle": { "message": "Email" }, @@ -4081,6 +4109,12 @@ "updateBrowserDesc": { "message": "You are using an unsupported web browser. The web vault may not function properly." }, + "youHaveAPendingLoginRequest": { + "message": "You have a pending login request from another device." + }, + "reviewLoginRequest": { + "message": "Review login request" + }, "freeTrialEndPromptCount": { "message": "Your free trial ends in $COUNT$ days.", "placeholders": { @@ -4758,6 +4792,15 @@ "masterPassPolicyDesc": { "message": "Set requirements for master password strength." }, + "passwordStrengthScore": { + "message": "Password strength score $SCORE$", + "placeholders": { + "score": { + "content": "$1", + "example": "4" + } + } + }, "twoStepLoginPolicyTitle": { "message": "Require two-step login" }, @@ -5653,6 +5696,12 @@ "webAuthnAuthenticate": { "message": "Authenticate WebAuthn" }, + "readSecurityKey": { + "message": "Read security key" + }, + "awaitingSecurityKeyInteraction": { + "message": "Awaiting security key interaction..." + }, "webAuthnNotSupported": { "message": "WebAuthn is not supported in this browser." }, @@ -7199,6 +7248,12 @@ "duoRequiredByOrgForAccount": { "message": "Duo two-step login is required for your account." }, + "duoTwoFactorRequiredPageSubtitle": { + "message": "Duo two-step login is required for your account. Follow the steps below to finish logging in." + }, + "followTheStepsBelowToFinishLoggingIn": { + "message": "Follow the steps below to finish logging in." + }, "launchDuo": { "message": "Launch Duo" }, @@ -10437,5 +10492,23 @@ }, "removeUnlockWithPinPolicyDesc": { "message": "Do not allow members to unlock their account with a PIN." + }, + "limitedEventLogs": { + "message": "$PRODUCT_TYPE$ plans do not have access to real event logs", + "placeholders": { + "product_type": { + "content": "$1", + "example": "Teams" + } + } + }, + "upgradeForFullEvents": { + "message": "Get full access to organization event logs by upgrading to a Teams or Enterprise plan." + }, + "upgradeEventLogTitle": { + "message": "Upgrade for real event log data" + }, + "upgradeEventLogMessage": { + "message": "These events are examples only and do not reflect real events within your Bitwarden organization." } } diff --git a/apps/web/src/locales/he/messages.json b/apps/web/src/locales/he/messages.json index 239df6791c0..2201e8b4968 100644 --- a/apps/web/src/locales/he/messages.json +++ b/apps/web/src/locales/he/messages.json @@ -5,6 +5,9 @@ "criticalApplications": { "message": "Critical applications" }, + "noCriticalAppsAtRisk": { + "message": "No critical applications at risk" + }, "accessIntelligence": { "message": "Access Intelligence" }, @@ -1161,6 +1164,15 @@ "logInToBitwarden": { "message": "Log in to Bitwarden" }, + "enterTheCodeSentToYourEmail": { + "message": "Enter the code sent to your email" + }, + "enterTheCodeFromYourAuthenticatorApp": { + "message": "Enter the code from your authenticator app" + }, + "pressYourYubiKeyToAuthenticate": { + "message": "Press your YubiKey to authenticate" + }, "authenticationTimeout": { "message": "Authentication timeout" }, @@ -1443,12 +1455,22 @@ "rememberMe": { "message": "זכור אותי" }, + "dontAskAgainOnThisDeviceFor30Days": { + "message": "Don't ask again on this device for 30 days" + }, "sendVerificationCodeEmailAgain": { "message": "שלח שוב קוד אימות לאימייל" }, "useAnotherTwoStepMethod": { "message": "השתמש בשיטה אחרת עבור כניסה דו שלבית" }, + "selectAnotherMethod": { + "message": "Select another method", + "description": "Select another two-step login method" + }, + "useYourRecoveryCode": { + "message": "Use your recovery code" + }, "insertYubiKey": { "message": "הכנס את ה-YubiKey אל כניסת ה-USB במחשבך, ואז גע בכפתור שלו." }, @@ -1467,6 +1489,9 @@ "twoStepOptions": { "message": "אפשרויות כניסה דו שלבית" }, + "selectTwoStepLoginMethod": { + "message": "Select two-step login method" + }, "recoveryCodeDesc": { "message": "איבדת גישה לכל ספקי האימות הדו-שלבי שלך? השתמש בקוד האימות כדי לבטל את הספקים הקיימים מתוך החשבון שלך." }, @@ -1509,6 +1534,9 @@ "webAuthnMigrated": { "message": "(Migrated from FIDO)" }, + "openInNewTab": { + "message": "Open in new tab" + }, "emailTitle": { "message": "אימייל" }, @@ -4081,6 +4109,12 @@ "updateBrowserDesc": { "message": "אתה משתמש בדפדפן אינטרנט שאיננו נתמך. כספת הרשת עלולה שלא לפעול כראוי." }, + "youHaveAPendingLoginRequest": { + "message": "You have a pending login request from another device." + }, + "reviewLoginRequest": { + "message": "Review login request" + }, "freeTrialEndPromptCount": { "message": "Your free trial ends in $COUNT$ days.", "placeholders": { @@ -4758,6 +4792,15 @@ "masterPassPolicyDesc": { "message": "קבע דרישות מינימום עבור חוזק הסיסמה הראשית." }, + "passwordStrengthScore": { + "message": "Password strength score $SCORE$", + "placeholders": { + "score": { + "content": "$1", + "example": "4" + } + } + }, "twoStepLoginPolicyTitle": { "message": "Require two-step login" }, @@ -5653,6 +5696,12 @@ "webAuthnAuthenticate": { "message": "Authenticate WebAuthn" }, + "readSecurityKey": { + "message": "Read security key" + }, + "awaitingSecurityKeyInteraction": { + "message": "Awaiting security key interaction..." + }, "webAuthnNotSupported": { "message": "WebAuthn is not supported in this browser." }, @@ -7199,6 +7248,12 @@ "duoRequiredByOrgForAccount": { "message": "Duo two-step login is required for your account." }, + "duoTwoFactorRequiredPageSubtitle": { + "message": "Duo two-step login is required for your account. Follow the steps below to finish logging in." + }, + "followTheStepsBelowToFinishLoggingIn": { + "message": "Follow the steps below to finish logging in." + }, "launchDuo": { "message": "Launch Duo" }, @@ -10437,5 +10492,23 @@ }, "removeUnlockWithPinPolicyDesc": { "message": "Do not allow members to unlock their account with a PIN." + }, + "limitedEventLogs": { + "message": "$PRODUCT_TYPE$ plans do not have access to real event logs", + "placeholders": { + "product_type": { + "content": "$1", + "example": "Teams" + } + } + }, + "upgradeForFullEvents": { + "message": "Get full access to organization event logs by upgrading to a Teams or Enterprise plan." + }, + "upgradeEventLogTitle": { + "message": "Upgrade for real event log data" + }, + "upgradeEventLogMessage": { + "message": "These events are examples only and do not reflect real events within your Bitwarden organization." } } diff --git a/apps/web/src/locales/hi/messages.json b/apps/web/src/locales/hi/messages.json index 5128575a717..57e7fb45f2d 100644 --- a/apps/web/src/locales/hi/messages.json +++ b/apps/web/src/locales/hi/messages.json @@ -5,6 +5,9 @@ "criticalApplications": { "message": "Critical applications" }, + "noCriticalAppsAtRisk": { + "message": "No critical applications at risk" + }, "accessIntelligence": { "message": "Access Intelligence" }, @@ -1161,6 +1164,15 @@ "logInToBitwarden": { "message": "Log in to Bitwarden" }, + "enterTheCodeSentToYourEmail": { + "message": "Enter the code sent to your email" + }, + "enterTheCodeFromYourAuthenticatorApp": { + "message": "Enter the code from your authenticator app" + }, + "pressYourYubiKeyToAuthenticate": { + "message": "Press your YubiKey to authenticate" + }, "authenticationTimeout": { "message": "Authentication timeout" }, @@ -1443,12 +1455,22 @@ "rememberMe": { "message": "मुझे याद रखें" }, + "dontAskAgainOnThisDeviceFor30Days": { + "message": "Don't ask again on this device for 30 days" + }, "sendVerificationCodeEmailAgain": { "message": "फिर से सत्यापन कोड ईमेल भेजें" }, "useAnotherTwoStepMethod": { "message": "Use another two-step login method" }, + "selectAnotherMethod": { + "message": "Select another method", + "description": "Select another two-step login method" + }, + "useYourRecoveryCode": { + "message": "Use your recovery code" + }, "insertYubiKey": { "message": "Insert your YubiKey into your computer's USB port, then touch its button." }, @@ -1467,6 +1489,9 @@ "twoStepOptions": { "message": "Two-step login options" }, + "selectTwoStepLoginMethod": { + "message": "Select two-step login method" + }, "recoveryCodeDesc": { "message": "Lost access to all of your two-step login providers? Use your recovery code to turn off all two-step login providers from your account." }, @@ -1509,6 +1534,9 @@ "webAuthnMigrated": { "message": "(Migrated from FIDO)" }, + "openInNewTab": { + "message": "Open in new tab" + }, "emailTitle": { "message": "Email" }, @@ -4081,6 +4109,12 @@ "updateBrowserDesc": { "message": "You are using an unsupported web browser. The web vault may not function properly." }, + "youHaveAPendingLoginRequest": { + "message": "You have a pending login request from another device." + }, + "reviewLoginRequest": { + "message": "Review login request" + }, "freeTrialEndPromptCount": { "message": "Your free trial ends in $COUNT$ days.", "placeholders": { @@ -4758,6 +4792,15 @@ "masterPassPolicyDesc": { "message": "Set requirements for master password strength." }, + "passwordStrengthScore": { + "message": "Password strength score $SCORE$", + "placeholders": { + "score": { + "content": "$1", + "example": "4" + } + } + }, "twoStepLoginPolicyTitle": { "message": "Require two-step login" }, @@ -5653,6 +5696,12 @@ "webAuthnAuthenticate": { "message": "Authenticate WebAuthn" }, + "readSecurityKey": { + "message": "Read security key" + }, + "awaitingSecurityKeyInteraction": { + "message": "Awaiting security key interaction..." + }, "webAuthnNotSupported": { "message": "WebAuthn is not supported in this browser." }, @@ -7199,6 +7248,12 @@ "duoRequiredByOrgForAccount": { "message": "Duo two-step login is required for your account." }, + "duoTwoFactorRequiredPageSubtitle": { + "message": "Duo two-step login is required for your account. Follow the steps below to finish logging in." + }, + "followTheStepsBelowToFinishLoggingIn": { + "message": "Follow the steps below to finish logging in." + }, "launchDuo": { "message": "Launch Duo" }, @@ -10437,5 +10492,23 @@ }, "removeUnlockWithPinPolicyDesc": { "message": "Do not allow members to unlock their account with a PIN." + }, + "limitedEventLogs": { + "message": "$PRODUCT_TYPE$ plans do not have access to real event logs", + "placeholders": { + "product_type": { + "content": "$1", + "example": "Teams" + } + } + }, + "upgradeForFullEvents": { + "message": "Get full access to organization event logs by upgrading to a Teams or Enterprise plan." + }, + "upgradeEventLogTitle": { + "message": "Upgrade for real event log data" + }, + "upgradeEventLogMessage": { + "message": "These events are examples only and do not reflect real events within your Bitwarden organization." } } diff --git a/apps/web/src/locales/hr/messages.json b/apps/web/src/locales/hr/messages.json index b400780719b..2663e056292 100644 --- a/apps/web/src/locales/hr/messages.json +++ b/apps/web/src/locales/hr/messages.json @@ -5,6 +5,9 @@ "criticalApplications": { "message": "Kritične aplikacije" }, + "noCriticalAppsAtRisk": { + "message": "No critical applications at risk" + }, "accessIntelligence": { "message": "Pristup inteligenciji" }, @@ -1161,6 +1164,15 @@ "logInToBitwarden": { "message": "Prijavi se u Bitwarden" }, + "enterTheCodeSentToYourEmail": { + "message": "Enter the code sent to your email" + }, + "enterTheCodeFromYourAuthenticatorApp": { + "message": "Enter the code from your authenticator app" + }, + "pressYourYubiKeyToAuthenticate": { + "message": "Press your YubiKey to authenticate" + }, "authenticationTimeout": { "message": "Istek vremena za autentifikaciju" }, @@ -1443,12 +1455,22 @@ "rememberMe": { "message": "Zapamti me" }, + "dontAskAgainOnThisDeviceFor30Days": { + "message": "Don't ask again on this device for 30 days" + }, "sendVerificationCodeEmailAgain": { "message": "Ponovno slanje kontrolnog koda e-poštom" }, "useAnotherTwoStepMethod": { "message": "Koristiti drugi način prijave dvostrukom autentifikacijom" }, + "selectAnotherMethod": { + "message": "Select another method", + "description": "Select another two-step login method" + }, + "useYourRecoveryCode": { + "message": "Use your recovery code" + }, "insertYubiKey": { "message": "Umetni svoj YubiKey u USB priključak računala, a zatim dodirni njegovu tipku." }, @@ -1467,6 +1489,9 @@ "twoStepOptions": { "message": "Mogućnosti prijave dvostrukom autentifikacijom" }, + "selectTwoStepLoginMethod": { + "message": "Select two-step login method" + }, "recoveryCodeDesc": { "message": "Izgubljen je pristup uređaju za prijavu dvostrukom autentifikacijom? Koristi svoj kôd za oporavak za onemogućavanje svih pružatelja usluga prijave dvostrukom autentifikacijom na svom računu." }, @@ -1509,6 +1534,9 @@ "webAuthnMigrated": { "message": "(migrirano s FIDO)" }, + "openInNewTab": { + "message": "Open in new tab" + }, "emailTitle": { "message": "E-pošta" }, @@ -4081,6 +4109,12 @@ "updateBrowserDesc": { "message": "Koristiš nepodržani preglednik. Web trezor možda neće ispravno raditi." }, + "youHaveAPendingLoginRequest": { + "message": "You have a pending login request from another device." + }, + "reviewLoginRequest": { + "message": "Review login request" + }, "freeTrialEndPromptCount": { "message": "Besplatno probno razdoblje završava za $COUNT$ dan/a.", "placeholders": { @@ -4758,6 +4792,15 @@ "masterPassPolicyDesc": { "message": "Postavi pravila sigurnosti koja mora zadovoljiti glavna lozinka." }, + "passwordStrengthScore": { + "message": "Password strength score $SCORE$", + "placeholders": { + "score": { + "content": "$1", + "example": "4" + } + } + }, "twoStepLoginPolicyTitle": { "message": "Zahtijevaj prijavu dvostrukom autentifikacijom" }, @@ -5653,6 +5696,12 @@ "webAuthnAuthenticate": { "message": "Ovjeri WebAuthn" }, + "readSecurityKey": { + "message": "Read security key" + }, + "awaitingSecurityKeyInteraction": { + "message": "Awaiting security key interaction..." + }, "webAuthnNotSupported": { "message": "WebAuthn nije podržan u ovom pregledniku." }, @@ -7199,6 +7248,12 @@ "duoRequiredByOrgForAccount": { "message": "Za tvoj račun je potrebna Duo dvostruka autentifikacija." }, + "duoTwoFactorRequiredPageSubtitle": { + "message": "Duo two-step login is required for your account. Follow the steps below to finish logging in." + }, + "followTheStepsBelowToFinishLoggingIn": { + "message": "Follow the steps below to finish logging in." + }, "launchDuo": { "message": "Pokreni Duo" }, @@ -10437,5 +10492,23 @@ }, "removeUnlockWithPinPolicyDesc": { "message": "Do not allow members to unlock their account with a PIN." + }, + "limitedEventLogs": { + "message": "$PRODUCT_TYPE$ plans do not have access to real event logs", + "placeholders": { + "product_type": { + "content": "$1", + "example": "Teams" + } + } + }, + "upgradeForFullEvents": { + "message": "Get full access to organization event logs by upgrading to a Teams or Enterprise plan." + }, + "upgradeEventLogTitle": { + "message": "Upgrade for real event log data" + }, + "upgradeEventLogMessage": { + "message": "These events are examples only and do not reflect real events within your Bitwarden organization." } } diff --git a/apps/web/src/locales/hu/messages.json b/apps/web/src/locales/hu/messages.json index 4e698bbbe74..c414a82c017 100644 --- a/apps/web/src/locales/hu/messages.json +++ b/apps/web/src/locales/hu/messages.json @@ -5,6 +5,9 @@ "criticalApplications": { "message": "Kritikus alkalmazások" }, + "noCriticalAppsAtRisk": { + "message": "Nincsenek veszélyben levő kritikus alkalmazások." + }, "accessIntelligence": { "message": "Elérés intelligencia" }, @@ -1161,6 +1164,15 @@ "logInToBitwarden": { "message": "Bejelentkezés a Bitwardenbe" }, + "enterTheCodeSentToYourEmail": { + "message": "Adjuk meg az email címre elküldött kódot." + }, + "enterTheCodeFromYourAuthenticatorApp": { + "message": "Adjuk meg a hitelesítő alkalmazása által generált kódot." + }, + "pressYourYubiKeyToAuthenticate": { + "message": "Nyomjuk meg a YubiKey-t a hitelesítéshez." + }, "authenticationTimeout": { "message": "Hitelesítési időkifutás" }, @@ -1443,12 +1455,22 @@ "rememberMe": { "message": "Adatok megjegyzése" }, + "dontAskAgainOnThisDeviceFor30Days": { + "message": "Ne kérdezzen újra ezen az eszközön 30 napig" + }, "sendVerificationCodeEmailAgain": { "message": "Megerősítő kód ismételt elküldése emailben" }, "useAnotherTwoStepMethod": { "message": "Másik kétlépcsős bejelentkezés használata" }, + "selectAnotherMethod": { + "message": "Másik módszer választás", + "description": "Select another two-step login method" + }, + "useYourRecoveryCode": { + "message": "Helyreállító kód használata" + }, "insertYubiKey": { "message": "A YubiKey beillesztése a számítógép USB portjába és a rajta levő gomb megnyomása." }, @@ -1467,6 +1489,9 @@ "twoStepOptions": { "message": "Kétlépcsős bejelentkezés opciók" }, + "selectTwoStepLoginMethod": { + "message": "Kétlépcsős bejelentkezési mód használata" + }, "recoveryCodeDesc": { "message": "Elveszett a hozzáférés az összes kétlépcsős szolgáltatóhoz? A visszaállítókód használatával letilthatók fiókból a kétlépcsős szolgáltatók." }, @@ -1509,6 +1534,9 @@ "webAuthnMigrated": { "message": "(FIDO-ból áthelyezve)" }, + "openInNewTab": { + "message": "Megnyitás új fülön" + }, "emailTitle": { "message": "Email cím" }, @@ -4081,6 +4109,12 @@ "updateBrowserDesc": { "message": "Nem támogatott böngészőt használunk. Előfordulhat, hogy a webes széf nem működik megfelelően." }, + "youHaveAPendingLoginRequest": { + "message": "Függőben lévő bejelentkezési kérelem van egy másik eszközről." + }, + "reviewLoginRequest": { + "message": "Bejelentkezési kérés áttekintése" + }, "freeTrialEndPromptCount": { "message": "Az ingyenes próbaidőszak $COUNT$ nap múlva ér véget.", "placeholders": { @@ -4758,6 +4792,15 @@ "masterPassPolicyDesc": { "message": "A minimális követelmények beállítása a mesterjelszó hosszához." }, + "passwordStrengthScore": { + "message": "A jelszó erősségi pontszáma $SCORE$", + "placeholders": { + "score": { + "content": "$1", + "example": "4" + } + } + }, "twoStepLoginPolicyTitle": { "message": "Kétlépéses bejelentkezés szükséges" }, @@ -5653,6 +5696,12 @@ "webAuthnAuthenticate": { "message": "WebAutn hitelesítés" }, + "readSecurityKey": { + "message": "Biztonsági kulcs olvasása" + }, + "awaitingSecurityKeyInteraction": { + "message": "Várakozás a biztonsági kulcs interakciójára..." + }, "webAuthnNotSupported": { "message": "Ezen a böngészőn a WebAuthn nem támogatott." }, @@ -7199,6 +7248,12 @@ "duoRequiredByOrgForAccount": { "message": "A fiókhoz kétlépcsős Duo bejelentkezés szükséges." }, + "duoTwoFactorRequiredPageSubtitle": { + "message": "Duo kétlépcsős bejelentkezés szükséges a fiókhoz. Kövessük az alábbi lépéseket a bejelentkezés befejezéséhez." + }, + "followTheStepsBelowToFinishLoggingIn": { + "message": "Kövessük az alábbi lépéseket a bejelentkezés befejezéséhez." + }, "launchDuo": { "message": "Duo indítása" }, @@ -10437,5 +10492,23 @@ }, "removeUnlockWithPinPolicyDesc": { "message": "Nem engedjük meg a tagoknak, hogy PIN kóddal oldják fel fiókjuk zárolását." + }, + "limitedEventLogs": { + "message": "A $PRODUCT_TYPE$ csomagok nem férnek hozzá a valós eseménynaplókhoz.", + "placeholders": { + "product_type": { + "content": "$1", + "example": "Teams" + } + } + }, + "upgradeForFullEvents": { + "message": "Teljes hozzáférést kaphatunk a szervezeti eseménynaplókhoz, ha Teams vagy Enterprise csomagra térünk át." + }, + "upgradeEventLogTitle": { + "message": "Áttérés valós eseménynapló adatokhoz" + }, + "upgradeEventLogMessage": { + "message": "Ezek az események csak példák és nem tükröznek valós eseményeket a Bitwarden szervezetén belül." } } diff --git a/apps/web/src/locales/id/messages.json b/apps/web/src/locales/id/messages.json index 055968f85c6..c839b0f295a 100644 --- a/apps/web/src/locales/id/messages.json +++ b/apps/web/src/locales/id/messages.json @@ -5,6 +5,9 @@ "criticalApplications": { "message": "Critical applications" }, + "noCriticalAppsAtRisk": { + "message": "No critical applications at risk" + }, "accessIntelligence": { "message": "Access Intelligence" }, @@ -1161,6 +1164,15 @@ "logInToBitwarden": { "message": "Log in to Bitwarden" }, + "enterTheCodeSentToYourEmail": { + "message": "Enter the code sent to your email" + }, + "enterTheCodeFromYourAuthenticatorApp": { + "message": "Enter the code from your authenticator app" + }, + "pressYourYubiKeyToAuthenticate": { + "message": "Press your YubiKey to authenticate" + }, "authenticationTimeout": { "message": "Authentication timeout" }, @@ -1443,12 +1455,22 @@ "rememberMe": { "message": "Ingat saya" }, + "dontAskAgainOnThisDeviceFor30Days": { + "message": "Don't ask again on this device for 30 days" + }, "sendVerificationCodeEmailAgain": { "message": "Kirim ulang email kode verifikasi" }, "useAnotherTwoStepMethod": { "message": "Gunakan metode login dua-langkah lainnya" }, + "selectAnotherMethod": { + "message": "Select another method", + "description": "Select another two-step login method" + }, + "useYourRecoveryCode": { + "message": "Use your recovery code" + }, "insertYubiKey": { "message": "Masukkan YubiKey Anda ke port USB komputer Anda, lalu sentuh tombol nya." }, @@ -1467,6 +1489,9 @@ "twoStepOptions": { "message": "Opsi login dua-langkah" }, + "selectTwoStepLoginMethod": { + "message": "Select two-step login method" + }, "recoveryCodeDesc": { "message": "Kehilangan akses ke semua penyedia dua faktor Anda? Gunakan kode pemulihan untuk menonaktifkan semua penyedia dua faktor dari akun Anda." }, @@ -1509,6 +1534,9 @@ "webAuthnMigrated": { "message": "(Dipindahkan dari FIDO)" }, + "openInNewTab": { + "message": "Open in new tab" + }, "emailTitle": { "message": "Surel" }, @@ -4081,6 +4109,12 @@ "updateBrowserDesc": { "message": "Anda menggunakan browser web yang tidak didukung. Kubah web mungkin tidak berfungsi dengan baik." }, + "youHaveAPendingLoginRequest": { + "message": "You have a pending login request from another device." + }, + "reviewLoginRequest": { + "message": "Review login request" + }, "freeTrialEndPromptCount": { "message": "Your free trial ends in $COUNT$ days.", "placeholders": { @@ -4758,6 +4792,15 @@ "masterPassPolicyDesc": { "message": "Tetapkan persyaratan minimum untuk kekuatan kata sandi utama." }, + "passwordStrengthScore": { + "message": "Password strength score $SCORE$", + "placeholders": { + "score": { + "content": "$1", + "example": "4" + } + } + }, "twoStepLoginPolicyTitle": { "message": "Diperlukan login dua-langkah" }, @@ -5653,6 +5696,12 @@ "webAuthnAuthenticate": { "message": "Autentikasi dengan WebAuthn" }, + "readSecurityKey": { + "message": "Read security key" + }, + "awaitingSecurityKeyInteraction": { + "message": "Awaiting security key interaction..." + }, "webAuthnNotSupported": { "message": "WebAuthn tidak didukung oleh browser ini." }, @@ -7199,6 +7248,12 @@ "duoRequiredByOrgForAccount": { "message": "Duo two-step login is required for your account." }, + "duoTwoFactorRequiredPageSubtitle": { + "message": "Duo two-step login is required for your account. Follow the steps below to finish logging in." + }, + "followTheStepsBelowToFinishLoggingIn": { + "message": "Follow the steps below to finish logging in." + }, "launchDuo": { "message": "Launch Duo" }, @@ -10437,5 +10492,23 @@ }, "removeUnlockWithPinPolicyDesc": { "message": "Do not allow members to unlock their account with a PIN." + }, + "limitedEventLogs": { + "message": "$PRODUCT_TYPE$ plans do not have access to real event logs", + "placeholders": { + "product_type": { + "content": "$1", + "example": "Teams" + } + } + }, + "upgradeForFullEvents": { + "message": "Get full access to organization event logs by upgrading to a Teams or Enterprise plan." + }, + "upgradeEventLogTitle": { + "message": "Upgrade for real event log data" + }, + "upgradeEventLogMessage": { + "message": "These events are examples only and do not reflect real events within your Bitwarden organization." } } diff --git a/apps/web/src/locales/it/messages.json b/apps/web/src/locales/it/messages.json index 7ed38e87270..f8d45738fde 100644 --- a/apps/web/src/locales/it/messages.json +++ b/apps/web/src/locales/it/messages.json @@ -5,6 +5,9 @@ "criticalApplications": { "message": "Critical applications" }, + "noCriticalAppsAtRisk": { + "message": "Nessuna applicazione critica a rischio" + }, "accessIntelligence": { "message": "Access Intelligence" }, @@ -1161,6 +1164,15 @@ "logInToBitwarden": { "message": "Log in to Bitwarden" }, + "enterTheCodeSentToYourEmail": { + "message": "Enter the code sent to your email" + }, + "enterTheCodeFromYourAuthenticatorApp": { + "message": "Enter the code from your authenticator app" + }, + "pressYourYubiKeyToAuthenticate": { + "message": "Press your YubiKey to authenticate" + }, "authenticationTimeout": { "message": "Authentication timeout" }, @@ -1443,12 +1455,22 @@ "rememberMe": { "message": "Ricordami" }, + "dontAskAgainOnThisDeviceFor30Days": { + "message": "Don't ask again on this device for 30 days" + }, "sendVerificationCodeEmailAgain": { "message": "Invia di nuovo l'email con codice di verifica" }, "useAnotherTwoStepMethod": { "message": "Usa un altro metodo di verifica in due passaggi" }, + "selectAnotherMethod": { + "message": "Select another method", + "description": "Select another two-step login method" + }, + "useYourRecoveryCode": { + "message": "Use your recovery code" + }, "insertYubiKey": { "message": "Inserisci la tua YubiKey nella porta USB del computer e premi il suo pulsante." }, @@ -1467,6 +1489,9 @@ "twoStepOptions": { "message": "Opzioni verifica in due passaggi" }, + "selectTwoStepLoginMethod": { + "message": "Select two-step login method" + }, "recoveryCodeDesc": { "message": "Hai perso l'accesso a tutti i tuoi metodi di verifica in due passaggi? Usa il tuo codice di recupero per disattivarli tutti dal tuo account." }, @@ -1509,6 +1534,9 @@ "webAuthnMigrated": { "message": "(Trasferito da FIDO)" }, + "openInNewTab": { + "message": "Open in new tab" + }, "emailTitle": { "message": "Email" }, @@ -4081,6 +4109,12 @@ "updateBrowserDesc": { "message": "Stai utilizzando un browser non supportato. La cassaforte web potrebbe non funzionare correttamente." }, + "youHaveAPendingLoginRequest": { + "message": "Hai una richiesta di accesso in sospeso da un altro dispositivo." + }, + "reviewLoginRequest": { + "message": "Rivedi richiesta di accesso" + }, "freeTrialEndPromptCount": { "message": "Your free trial ends in $COUNT$ days.", "placeholders": { @@ -4758,6 +4792,15 @@ "masterPassPolicyDesc": { "message": "Imposta requisiti minimi di complessità della password principale." }, + "passwordStrengthScore": { + "message": "Valutazione complessità parola d'accesso $SCORE$", + "placeholders": { + "score": { + "content": "$1", + "example": "4" + } + } + }, "twoStepLoginPolicyTitle": { "message": "Verifica in due passaggi obbligatoria" }, @@ -5653,6 +5696,12 @@ "webAuthnAuthenticate": { "message": "Autenticazione WebAuthn" }, + "readSecurityKey": { + "message": "Read security key" + }, + "awaitingSecurityKeyInteraction": { + "message": "Awaiting security key interaction..." + }, "webAuthnNotSupported": { "message": "WebAuthn non è supportato da questo browser." }, @@ -7199,6 +7248,12 @@ "duoRequiredByOrgForAccount": { "message": "Per il tuo account è richiesta la verifica in due passaggi DUO." }, + "duoTwoFactorRequiredPageSubtitle": { + "message": "Duo two-step login is required for your account. Follow the steps below to finish logging in." + }, + "followTheStepsBelowToFinishLoggingIn": { + "message": "Follow the steps below to finish logging in." + }, "launchDuo": { "message": "Avvia DUO" }, @@ -10437,5 +10492,23 @@ }, "removeUnlockWithPinPolicyDesc": { "message": "Non consentire ai membri di sbloccare il proprio account con un PIN." + }, + "limitedEventLogs": { + "message": "I piani $PRODUCT_TYPE$ non hanno accesso ai registri degli eventi reali", + "placeholders": { + "product_type": { + "content": "$1", + "example": "Teams" + } + } + }, + "upgradeForFullEvents": { + "message": "Ottieni pieno accesso ai registri degli eventi dell'organizzazione aggiornando a un piano Teams o Enterprise." + }, + "upgradeEventLogTitle": { + "message": "Aggiorna per i dati del registro eventi reali" + }, + "upgradeEventLogMessage": { + "message": "Questi eventi sono solo esempi e non riflettono eventi reali all'interno della tua organizzazione Bitwarden." } } diff --git a/apps/web/src/locales/ja/messages.json b/apps/web/src/locales/ja/messages.json index 060d55724b0..cbc34ccee17 100644 --- a/apps/web/src/locales/ja/messages.json +++ b/apps/web/src/locales/ja/messages.json @@ -5,6 +5,9 @@ "criticalApplications": { "message": "きわめて重要なアプリ" }, + "noCriticalAppsAtRisk": { + "message": "No critical applications at risk" + }, "accessIntelligence": { "message": "アクセス インテリジェンス" }, @@ -1161,6 +1164,15 @@ "logInToBitwarden": { "message": "Bitwarden にログイン" }, + "enterTheCodeSentToYourEmail": { + "message": "Enter the code sent to your email" + }, + "enterTheCodeFromYourAuthenticatorApp": { + "message": "Enter the code from your authenticator app" + }, + "pressYourYubiKeyToAuthenticate": { + "message": "Press your YubiKey to authenticate" + }, "authenticationTimeout": { "message": "認証のタイムアウト" }, @@ -1443,12 +1455,22 @@ "rememberMe": { "message": "情報を保存する" }, + "dontAskAgainOnThisDeviceFor30Days": { + "message": "Don't ask again on this device for 30 days" + }, "sendVerificationCodeEmailAgain": { "message": "確認コードをメールで再送" }, "useAnotherTwoStepMethod": { "message": "他の2段階認証方法を使用" }, + "selectAnotherMethod": { + "message": "Select another method", + "description": "Select another two-step login method" + }, + "useYourRecoveryCode": { + "message": "Use your recovery code" + }, "insertYubiKey": { "message": "YubiKey を USB ポートに挿入し、ボタンをタッチしてください。" }, @@ -1467,6 +1489,9 @@ "twoStepOptions": { "message": "2段階認証オプション" }, + "selectTwoStepLoginMethod": { + "message": "Select two-step login method" + }, "recoveryCodeDesc": { "message": "すべての2段階認証プロパイダにアクセスできなくなったときは、リカバリーコードを使用するとアカウントの2段階認証を無効化できます。" }, @@ -1509,6 +1534,9 @@ "webAuthnMigrated": { "message": "(FIDOから移行)" }, + "openInNewTab": { + "message": "Open in new tab" + }, "emailTitle": { "message": "メールアドレス" }, @@ -4081,6 +4109,12 @@ "updateBrowserDesc": { "message": "サポートされていないブラウザを使用しています。ウェブ保管庫が正しく動作しないかもしれません。" }, + "youHaveAPendingLoginRequest": { + "message": "You have a pending login request from another device." + }, + "reviewLoginRequest": { + "message": "Review login request" + }, "freeTrialEndPromptCount": { "message": "無料体験はあと $COUNT$ 日で終了します。", "placeholders": { @@ -4758,6 +4792,15 @@ "masterPassPolicyDesc": { "message": "マスターパスワードの強度に最低要件を設定する。" }, + "passwordStrengthScore": { + "message": "Password strength score $SCORE$", + "placeholders": { + "score": { + "content": "$1", + "example": "4" + } + } + }, "twoStepLoginPolicyTitle": { "message": "2段階認証が必要です" }, @@ -5653,6 +5696,12 @@ "webAuthnAuthenticate": { "message": "WebAuthn の認証" }, + "readSecurityKey": { + "message": "Read security key" + }, + "awaitingSecurityKeyInteraction": { + "message": "Awaiting security key interaction..." + }, "webAuthnNotSupported": { "message": "WebAuthn はこのブラウザではサポートされていません。" }, @@ -7199,6 +7248,12 @@ "duoRequiredByOrgForAccount": { "message": "アカウントには DUO 二段階認証が必要です。" }, + "duoTwoFactorRequiredPageSubtitle": { + "message": "Duo two-step login is required for your account. Follow the steps below to finish logging in." + }, + "followTheStepsBelowToFinishLoggingIn": { + "message": "Follow the steps below to finish logging in." + }, "launchDuo": { "message": "DUO を起動" }, @@ -10437,5 +10492,23 @@ }, "removeUnlockWithPinPolicyDesc": { "message": "Do not allow members to unlock their account with a PIN." + }, + "limitedEventLogs": { + "message": "$PRODUCT_TYPE$ plans do not have access to real event logs", + "placeholders": { + "product_type": { + "content": "$1", + "example": "Teams" + } + } + }, + "upgradeForFullEvents": { + "message": "Get full access to organization event logs by upgrading to a Teams or Enterprise plan." + }, + "upgradeEventLogTitle": { + "message": "Upgrade for real event log data" + }, + "upgradeEventLogMessage": { + "message": "These events are examples only and do not reflect real events within your Bitwarden organization." } } diff --git a/apps/web/src/locales/ka/messages.json b/apps/web/src/locales/ka/messages.json index a7a1a5c3113..121adac3ad4 100644 --- a/apps/web/src/locales/ka/messages.json +++ b/apps/web/src/locales/ka/messages.json @@ -5,6 +5,9 @@ "criticalApplications": { "message": "Critical applications" }, + "noCriticalAppsAtRisk": { + "message": "No critical applications at risk" + }, "accessIntelligence": { "message": "Access Intelligence" }, @@ -1161,6 +1164,15 @@ "logInToBitwarden": { "message": "Log in to Bitwarden" }, + "enterTheCodeSentToYourEmail": { + "message": "Enter the code sent to your email" + }, + "enterTheCodeFromYourAuthenticatorApp": { + "message": "Enter the code from your authenticator app" + }, + "pressYourYubiKeyToAuthenticate": { + "message": "Press your YubiKey to authenticate" + }, "authenticationTimeout": { "message": "Authentication timeout" }, @@ -1443,12 +1455,22 @@ "rememberMe": { "message": "დამიმახსოვრე" }, + "dontAskAgainOnThisDeviceFor30Days": { + "message": "Don't ask again on this device for 30 days" + }, "sendVerificationCodeEmailAgain": { "message": "გამოგზავნა ერთჯერადი კოდის ელ-ფოსტაზე განმეორებით" }, "useAnotherTwoStepMethod": { "message": "გამოყენება სხვა ორსაფეხურიანი შესვლის მეთოდით" }, + "selectAnotherMethod": { + "message": "Select another method", + "description": "Select another two-step login method" + }, + "useYourRecoveryCode": { + "message": "Use your recovery code" + }, "insertYubiKey": { "message": "შეარჭეთ თქვენი YubiKey თქვენს კომპიუტერის USB პორტში, შემდგომ დაადეთ მის ღილაკს." }, @@ -1467,6 +1489,9 @@ "twoStepOptions": { "message": "ორსაფეხურიანი ავტორიზაციის პარამეტრები" }, + "selectTwoStepLoginMethod": { + "message": "Select two-step login method" + }, "recoveryCodeDesc": { "message": "დაკარგეთ წვდომა ყველა შენს ორსაფეხურიან პროვაიდერებთან? გამოიყენეთ თქვენი აღდგენის კოდი რომ გათიშოთ ყველა ორსაფეხურიანი ავტორიზაციის პროვაიდერები შენი ანგარიშიდან." }, @@ -1509,6 +1534,9 @@ "webAuthnMigrated": { "message": "(გადმომიგრირდა FIDO-დან)" }, + "openInNewTab": { + "message": "Open in new tab" + }, "emailTitle": { "message": "ელ-ფოსტა" }, @@ -4081,6 +4109,12 @@ "updateBrowserDesc": { "message": "You are using an unsupported web browser. The web vault may not function properly." }, + "youHaveAPendingLoginRequest": { + "message": "You have a pending login request from another device." + }, + "reviewLoginRequest": { + "message": "Review login request" + }, "freeTrialEndPromptCount": { "message": "Your free trial ends in $COUNT$ days.", "placeholders": { @@ -4758,6 +4792,15 @@ "masterPassPolicyDesc": { "message": "Set requirements for master password strength." }, + "passwordStrengthScore": { + "message": "Password strength score $SCORE$", + "placeholders": { + "score": { + "content": "$1", + "example": "4" + } + } + }, "twoStepLoginPolicyTitle": { "message": "Require two-step login" }, @@ -5653,6 +5696,12 @@ "webAuthnAuthenticate": { "message": "Authenticate WebAuthn" }, + "readSecurityKey": { + "message": "Read security key" + }, + "awaitingSecurityKeyInteraction": { + "message": "Awaiting security key interaction..." + }, "webAuthnNotSupported": { "message": "WebAuthn is not supported in this browser." }, @@ -7199,6 +7248,12 @@ "duoRequiredByOrgForAccount": { "message": "Duo two-step login is required for your account." }, + "duoTwoFactorRequiredPageSubtitle": { + "message": "Duo two-step login is required for your account. Follow the steps below to finish logging in." + }, + "followTheStepsBelowToFinishLoggingIn": { + "message": "Follow the steps below to finish logging in." + }, "launchDuo": { "message": "Launch Duo" }, @@ -10437,5 +10492,23 @@ }, "removeUnlockWithPinPolicyDesc": { "message": "Do not allow members to unlock their account with a PIN." + }, + "limitedEventLogs": { + "message": "$PRODUCT_TYPE$ plans do not have access to real event logs", + "placeholders": { + "product_type": { + "content": "$1", + "example": "Teams" + } + } + }, + "upgradeForFullEvents": { + "message": "Get full access to organization event logs by upgrading to a Teams or Enterprise plan." + }, + "upgradeEventLogTitle": { + "message": "Upgrade for real event log data" + }, + "upgradeEventLogMessage": { + "message": "These events are examples only and do not reflect real events within your Bitwarden organization." } } diff --git a/apps/web/src/locales/km/messages.json b/apps/web/src/locales/km/messages.json index 1c4e2e55201..aed10e3ad71 100644 --- a/apps/web/src/locales/km/messages.json +++ b/apps/web/src/locales/km/messages.json @@ -5,6 +5,9 @@ "criticalApplications": { "message": "Critical applications" }, + "noCriticalAppsAtRisk": { + "message": "No critical applications at risk" + }, "accessIntelligence": { "message": "Access Intelligence" }, @@ -1161,6 +1164,15 @@ "logInToBitwarden": { "message": "Log in to Bitwarden" }, + "enterTheCodeSentToYourEmail": { + "message": "Enter the code sent to your email" + }, + "enterTheCodeFromYourAuthenticatorApp": { + "message": "Enter the code from your authenticator app" + }, + "pressYourYubiKeyToAuthenticate": { + "message": "Press your YubiKey to authenticate" + }, "authenticationTimeout": { "message": "Authentication timeout" }, @@ -1443,12 +1455,22 @@ "rememberMe": { "message": "Remember me" }, + "dontAskAgainOnThisDeviceFor30Days": { + "message": "Don't ask again on this device for 30 days" + }, "sendVerificationCodeEmailAgain": { "message": "Send verification code email again" }, "useAnotherTwoStepMethod": { "message": "Use another two-step login method" }, + "selectAnotherMethod": { + "message": "Select another method", + "description": "Select another two-step login method" + }, + "useYourRecoveryCode": { + "message": "Use your recovery code" + }, "insertYubiKey": { "message": "Insert your YubiKey into your computer's USB port, then touch its button." }, @@ -1467,6 +1489,9 @@ "twoStepOptions": { "message": "Two-step login options" }, + "selectTwoStepLoginMethod": { + "message": "Select two-step login method" + }, "recoveryCodeDesc": { "message": "Lost access to all of your two-step login providers? Use your recovery code to turn off all two-step login providers from your account." }, @@ -1509,6 +1534,9 @@ "webAuthnMigrated": { "message": "(Migrated from FIDO)" }, + "openInNewTab": { + "message": "Open in new tab" + }, "emailTitle": { "message": "Email" }, @@ -4081,6 +4109,12 @@ "updateBrowserDesc": { "message": "You are using an unsupported web browser. The web vault may not function properly." }, + "youHaveAPendingLoginRequest": { + "message": "You have a pending login request from another device." + }, + "reviewLoginRequest": { + "message": "Review login request" + }, "freeTrialEndPromptCount": { "message": "Your free trial ends in $COUNT$ days.", "placeholders": { @@ -4758,6 +4792,15 @@ "masterPassPolicyDesc": { "message": "Set requirements for master password strength." }, + "passwordStrengthScore": { + "message": "Password strength score $SCORE$", + "placeholders": { + "score": { + "content": "$1", + "example": "4" + } + } + }, "twoStepLoginPolicyTitle": { "message": "Require two-step login" }, @@ -5653,6 +5696,12 @@ "webAuthnAuthenticate": { "message": "Authenticate WebAuthn" }, + "readSecurityKey": { + "message": "Read security key" + }, + "awaitingSecurityKeyInteraction": { + "message": "Awaiting security key interaction..." + }, "webAuthnNotSupported": { "message": "WebAuthn is not supported in this browser." }, @@ -7199,6 +7248,12 @@ "duoRequiredByOrgForAccount": { "message": "Duo two-step login is required for your account." }, + "duoTwoFactorRequiredPageSubtitle": { + "message": "Duo two-step login is required for your account. Follow the steps below to finish logging in." + }, + "followTheStepsBelowToFinishLoggingIn": { + "message": "Follow the steps below to finish logging in." + }, "launchDuo": { "message": "Launch Duo" }, @@ -10437,5 +10492,23 @@ }, "removeUnlockWithPinPolicyDesc": { "message": "Do not allow members to unlock their account with a PIN." + }, + "limitedEventLogs": { + "message": "$PRODUCT_TYPE$ plans do not have access to real event logs", + "placeholders": { + "product_type": { + "content": "$1", + "example": "Teams" + } + } + }, + "upgradeForFullEvents": { + "message": "Get full access to organization event logs by upgrading to a Teams or Enterprise plan." + }, + "upgradeEventLogTitle": { + "message": "Upgrade for real event log data" + }, + "upgradeEventLogMessage": { + "message": "These events are examples only and do not reflect real events within your Bitwarden organization." } } diff --git a/apps/web/src/locales/kn/messages.json b/apps/web/src/locales/kn/messages.json index 9abeaf5707f..9330589ce76 100644 --- a/apps/web/src/locales/kn/messages.json +++ b/apps/web/src/locales/kn/messages.json @@ -5,6 +5,9 @@ "criticalApplications": { "message": "Critical applications" }, + "noCriticalAppsAtRisk": { + "message": "No critical applications at risk" + }, "accessIntelligence": { "message": "Access Intelligence" }, @@ -1161,6 +1164,15 @@ "logInToBitwarden": { "message": "Log in to Bitwarden" }, + "enterTheCodeSentToYourEmail": { + "message": "Enter the code sent to your email" + }, + "enterTheCodeFromYourAuthenticatorApp": { + "message": "Enter the code from your authenticator app" + }, + "pressYourYubiKeyToAuthenticate": { + "message": "Press your YubiKey to authenticate" + }, "authenticationTimeout": { "message": "Authentication timeout" }, @@ -1443,12 +1455,22 @@ "rememberMe": { "message": "ನನ್ನನ್ನು ನೆನಪಿನಲ್ಲಿ ಇಡು" }, + "dontAskAgainOnThisDeviceFor30Days": { + "message": "Don't ask again on this device for 30 days" + }, "sendVerificationCodeEmailAgain": { "message": "ಪರಿಶೀಲನೆ ಕೋಡ್ ಇಮೇಲ್ ಅನ್ನು ಮತ್ತೆ ಕಳುಹಿಸಿ" }, "useAnotherTwoStepMethod": { "message": "ಮತ್ತೊಂದು ಎರಡು-ಹಂತದ ಲಾಗಿನ್ ವಿಧಾನವನ್ನು ಬಳಸಿ" }, + "selectAnotherMethod": { + "message": "Select another method", + "description": "Select another two-step login method" + }, + "useYourRecoveryCode": { + "message": "Use your recovery code" + }, "insertYubiKey": { "message": "ನಿಮ್ಮ ಯುಬಿಕಿಯನ್ನು ನಿಮ್ಮ ಕಂಪ್ಯೂಟರ್‌ನ ಯುಎಸ್‌ಬಿ ಪೋರ್ಟ್ಗೆ ಸೇರಿಸಿ, ನಂತರ ಅದರ ಗುಂಡಿಯನ್ನು ಸ್ಪರ್ಶಿಸಿ." }, @@ -1467,6 +1489,9 @@ "twoStepOptions": { "message": "ಎರಡು ಹಂತದ ಲಾಗಿನ್ ಆಯ್ಕೆಗಳು" }, + "selectTwoStepLoginMethod": { + "message": "Select two-step login method" + }, "recoveryCodeDesc": { "message": "ನಿಮ್ಮ ಎಲ್ಲಾ ಎರಡು ಅಂಶ ಪೂರೈಕೆದಾರರಿಗೆ ಪ್ರವೇಶವನ್ನು ಕಳೆದುಕೊಂಡಿದ್ದೀರಾ? ನಿಮ್ಮ ಖಾತೆಯಿಂದ ಎಲ್ಲಾ ಎರಡು ಅಂಶ ಪೂರೈಕೆದಾರರನ್ನು ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಲು ನಿಮ್ಮ ಮರುಪಡೆಯುವಿಕೆ ಕೋಡ್ ಬಳಸಿ." }, @@ -1509,6 +1534,9 @@ "webAuthnMigrated": { "message": "(FIDO ನಿಂದ ವಲಸೆ ಬಂದಿದೆ)" }, + "openInNewTab": { + "message": "Open in new tab" + }, "emailTitle": { "message": "ಇಮೇಲ್" }, @@ -4081,6 +4109,12 @@ "updateBrowserDesc": { "message": "ನೀವು ಬೆಂಬಲಿಸದ ವೆಬ್ ಬ್ರೌಸರ್ ಅನ್ನು ಬಳಸುತ್ತಿರುವಿರಿ. ವೆಬ್ ವಾಲ್ಟ್ ಸರಿಯಾಗಿ ಕಾರ್ಯನಿರ್ವಹಿಸದೆ ಇರಬಹುದು." }, + "youHaveAPendingLoginRequest": { + "message": "You have a pending login request from another device." + }, + "reviewLoginRequest": { + "message": "Review login request" + }, "freeTrialEndPromptCount": { "message": "Your free trial ends in $COUNT$ days.", "placeholders": { @@ -4758,6 +4792,15 @@ "masterPassPolicyDesc": { "message": "ಮಾಸ್ಟರ್ ಪಾಸ್‌ವರ್ಡ್ ಶಕ್ತಿಗಾಗಿ ಕನಿಷ್ಠ ಅವಶ್ಯಕತೆಗಳನ್ನು ಹೊಂದಿಸಿ." }, + "passwordStrengthScore": { + "message": "Password strength score $SCORE$", + "placeholders": { + "score": { + "content": "$1", + "example": "4" + } + } + }, "twoStepLoginPolicyTitle": { "message": "Require two-step login" }, @@ -5653,6 +5696,12 @@ "webAuthnAuthenticate": { "message": "WebAuthn ಅನ್ನು ಪ್ರಮಾಣಿಕರಿಸು" }, + "readSecurityKey": { + "message": "Read security key" + }, + "awaitingSecurityKeyInteraction": { + "message": "Awaiting security key interaction..." + }, "webAuthnNotSupported": { "message": "ಈ ಬ್ರೌಸರ್‌ನಲ್ಲಿ ವೆಬ್‌ಆಥ್ನ್ ಬೆಂಬಲಿಸುವುದಿಲ್ಲ." }, @@ -7199,6 +7248,12 @@ "duoRequiredByOrgForAccount": { "message": "Duo two-step login is required for your account." }, + "duoTwoFactorRequiredPageSubtitle": { + "message": "Duo two-step login is required for your account. Follow the steps below to finish logging in." + }, + "followTheStepsBelowToFinishLoggingIn": { + "message": "Follow the steps below to finish logging in." + }, "launchDuo": { "message": "Launch Duo" }, @@ -10437,5 +10492,23 @@ }, "removeUnlockWithPinPolicyDesc": { "message": "Do not allow members to unlock their account with a PIN." + }, + "limitedEventLogs": { + "message": "$PRODUCT_TYPE$ plans do not have access to real event logs", + "placeholders": { + "product_type": { + "content": "$1", + "example": "Teams" + } + } + }, + "upgradeForFullEvents": { + "message": "Get full access to organization event logs by upgrading to a Teams or Enterprise plan." + }, + "upgradeEventLogTitle": { + "message": "Upgrade for real event log data" + }, + "upgradeEventLogMessage": { + "message": "These events are examples only and do not reflect real events within your Bitwarden organization." } } diff --git a/apps/web/src/locales/ko/messages.json b/apps/web/src/locales/ko/messages.json index 4cc8c841075..3aa0eac1a64 100644 --- a/apps/web/src/locales/ko/messages.json +++ b/apps/web/src/locales/ko/messages.json @@ -5,6 +5,9 @@ "criticalApplications": { "message": "Critical applications" }, + "noCriticalAppsAtRisk": { + "message": "No critical applications at risk" + }, "accessIntelligence": { "message": "Access Intelligence" }, @@ -1161,6 +1164,15 @@ "logInToBitwarden": { "message": "Log in to Bitwarden" }, + "enterTheCodeSentToYourEmail": { + "message": "Enter the code sent to your email" + }, + "enterTheCodeFromYourAuthenticatorApp": { + "message": "Enter the code from your authenticator app" + }, + "pressYourYubiKeyToAuthenticate": { + "message": "Press your YubiKey to authenticate" + }, "authenticationTimeout": { "message": "Authentication timeout" }, @@ -1443,12 +1455,22 @@ "rememberMe": { "message": "기억하기" }, + "dontAskAgainOnThisDeviceFor30Days": { + "message": "Don't ask again on this device for 30 days" + }, "sendVerificationCodeEmailAgain": { "message": "인증 코드 이메일 다시 보내기" }, "useAnotherTwoStepMethod": { "message": "다른 2단계 로그인 방법 사용" }, + "selectAnotherMethod": { + "message": "Select another method", + "description": "Select another two-step login method" + }, + "useYourRecoveryCode": { + "message": "Use your recovery code" + }, "insertYubiKey": { "message": "YubiKey를 컴퓨터의 USB 포트에 삽입하고 버튼을 누르세요." }, @@ -1467,6 +1489,9 @@ "twoStepOptions": { "message": "2단계 인증 옵션" }, + "selectTwoStepLoginMethod": { + "message": "Select two-step login method" + }, "recoveryCodeDesc": { "message": "모든 2단계 인증을 사용할 수 없는 상황인가요? 복구 코드를 사용하여 계정의 모든 2단계 인증을 비활성화할 수 있습니다." }, @@ -1509,6 +1534,9 @@ "webAuthnMigrated": { "message": "(FIDO에서 이전됨)" }, + "openInNewTab": { + "message": "Open in new tab" + }, "emailTitle": { "message": "이메일" }, @@ -4081,6 +4109,12 @@ "updateBrowserDesc": { "message": "지원하지 않는 웹 브라우저를 사용하고 있습니다. 웹 보관함 기능이 제대로 동작하지 않을 수 있습니다." }, + "youHaveAPendingLoginRequest": { + "message": "You have a pending login request from another device." + }, + "reviewLoginRequest": { + "message": "Review login request" + }, "freeTrialEndPromptCount": { "message": "Your free trial ends in $COUNT$ days.", "placeholders": { @@ -4758,6 +4792,15 @@ "masterPassPolicyDesc": { "message": "마스터 비밀번호 강도에 대한 최소 요구 사항을 설정해주세요." }, + "passwordStrengthScore": { + "message": "Password strength score $SCORE$", + "placeholders": { + "score": { + "content": "$1", + "example": "4" + } + } + }, "twoStepLoginPolicyTitle": { "message": "Require two-step login" }, @@ -5653,6 +5696,12 @@ "webAuthnAuthenticate": { "message": "WebAuthn 인증" }, + "readSecurityKey": { + "message": "Read security key" + }, + "awaitingSecurityKeyInteraction": { + "message": "Awaiting security key interaction..." + }, "webAuthnNotSupported": { "message": "이 브라우저에서는 WebAuthn이 지원되지 않습니다." }, @@ -7199,6 +7248,12 @@ "duoRequiredByOrgForAccount": { "message": "Duo two-step login is required for your account." }, + "duoTwoFactorRequiredPageSubtitle": { + "message": "Duo two-step login is required for your account. Follow the steps below to finish logging in." + }, + "followTheStepsBelowToFinishLoggingIn": { + "message": "Follow the steps below to finish logging in." + }, "launchDuo": { "message": "Launch Duo" }, @@ -10437,5 +10492,23 @@ }, "removeUnlockWithPinPolicyDesc": { "message": "Do not allow members to unlock their account with a PIN." + }, + "limitedEventLogs": { + "message": "$PRODUCT_TYPE$ plans do not have access to real event logs", + "placeholders": { + "product_type": { + "content": "$1", + "example": "Teams" + } + } + }, + "upgradeForFullEvents": { + "message": "Get full access to organization event logs by upgrading to a Teams or Enterprise plan." + }, + "upgradeEventLogTitle": { + "message": "Upgrade for real event log data" + }, + "upgradeEventLogMessage": { + "message": "These events are examples only and do not reflect real events within your Bitwarden organization." } } diff --git a/apps/web/src/locales/lv/messages.json b/apps/web/src/locales/lv/messages.json index 5d8afb53a09..2dceab3f691 100644 --- a/apps/web/src/locales/lv/messages.json +++ b/apps/web/src/locales/lv/messages.json @@ -5,6 +5,9 @@ "criticalApplications": { "message": "Kritiskās lietotnes" }, + "noCriticalAppsAtRisk": { + "message": "Nav riskam pakļautu būtisku lietotņu" + }, "accessIntelligence": { "message": "Piekļuves inteliģence" }, @@ -1161,6 +1164,15 @@ "logInToBitwarden": { "message": "Pieteikties Bitwarden" }, + "enterTheCodeSentToYourEmail": { + "message": "Jāievada e-pastā nosūtītais kods" + }, + "enterTheCodeFromYourAuthenticatorApp": { + "message": "Jāievada kods no savas autentificētājlietotnes" + }, + "pressYourYubiKeyToAuthenticate": { + "message": "Jāpiespiež sava YubiKey ierīce, lai autentificētu" + }, "authenticationTimeout": { "message": "Autentificēšanās noildze" }, @@ -1443,12 +1455,22 @@ "rememberMe": { "message": "Atcerēties mani" }, + "dontAskAgainOnThisDeviceFor30Days": { + "message": "Šajā ierīcē 30 dienas vairs nevaicāt" + }, "sendVerificationCodeEmailAgain": { "message": "Atkārtoti nosūtīt apstiprinājuma kodu" }, "useAnotherTwoStepMethod": { "message": "Izmantot citu divpakāpju pieteikšanās veidu" }, + "selectAnotherMethod": { + "message": "Atlasīt citu veidu", + "description": "Select another two-step login method" + }, + "useYourRecoveryCode": { + "message": "Izmantot savu atkopes kodu" + }, "insertYubiKey": { "message": "Ievietojiet YubiKey datora USB portā un pēc tam pieskarieties tā pogai." }, @@ -1467,6 +1489,9 @@ "twoStepOptions": { "message": "Divpakāpju pieteikšanās iespējas" }, + "selectTwoStepLoginMethod": { + "message": "Atlasīt divpakāpju pieteikšanās veidu" + }, "recoveryCodeDesc": { "message": "Zaudēta piekļuve visiem divpakāpju pieteikšanās nodrošinātājiem? Jāizmanto atkopšanas kods, lai izslēgtu visus sava konta divpakāpju pieteikšanās nodrošinātājus." }, @@ -1509,6 +1534,9 @@ "webAuthnMigrated": { "message": "(Pārgājis no FIDO)" }, + "openInNewTab": { + "message": "Atvērt jaunā cilnē" + }, "emailTitle": { "message": "E-pasts" }, @@ -4081,6 +4109,12 @@ "updateBrowserDesc": { "message": "Tiek izmantots neatbalstīts tīmekļa pārlūks. Tīmekļa glabātava var nedarboties pareizi." }, + "youHaveAPendingLoginRequest": { + "message": "Ir neizskatīts pieteikšanās pieprasījums no citas ierīces." + }, + "reviewLoginRequest": { + "message": "Izskatīt pieteikšanās pieprasījumu" + }, "freeTrialEndPromptCount": { "message": "Bezmaksas izmēģinājums beigsies pēc $COUNT$ dienām.", "placeholders": { @@ -4758,6 +4792,15 @@ "masterPassPolicyDesc": { "message": "Uzstādīt galvenās paroles stipruma mazākās izpildāmās prasības." }, + "passwordStrengthScore": { + "message": "Paroles stipruma novērtējums $SCORE$", + "placeholders": { + "score": { + "content": "$1", + "example": "4" + } + } + }, "twoStepLoginPolicyTitle": { "message": "Pieprasīt divpakāpju pieteikšanos" }, @@ -5653,6 +5696,12 @@ "webAuthnAuthenticate": { "message": "Autentificēt WebAuthn" }, + "readSecurityKey": { + "message": "Nolasīt drošības atslēgu" + }, + "awaitingSecurityKeyInteraction": { + "message": "Gaida mijiedarbību ar drošības atslēgu..." + }, "webAuthnNotSupported": { "message": "WebAuthn šajā pārlūkā netiek atbalstīts." }, @@ -7199,6 +7248,12 @@ "duoRequiredByOrgForAccount": { "message": "Kontam ir nepieciešama DUO divpakāpju pieteikšanās." }, + "duoTwoFactorRequiredPageSubtitle": { + "message": "Ir nepieciešama Duo divpakāpju pieteikšanās, lai pieteiktos savā kontā. Jāseko zemāk esošajām norādēm, lai pabeigtu pieteikšanos." + }, + "followTheStepsBelowToFinishLoggingIn": { + "message": "Jāseko zemāk esošajām norādēm, lai pabeigtu pieteikšanos." + }, "launchDuo": { "message": "Palaist DUO" }, @@ -10437,5 +10492,23 @@ }, "removeUnlockWithPinPolicyDesc": { "message": "Neļaut dalībniekiem atslēgt savu kontu ar PIN." + }, + "limitedEventLogs": { + "message": "$PRODUCT_TYPE$ plāniem nav piekļuve īstajiem notikumu žurnāliem", + "placeholders": { + "product_type": { + "content": "$1", + "example": "Teams" + } + } + }, + "upgradeForFullEvents": { + "message": "Pilna piekļuve apvienības notikumu žurnāliem ir iegūstama, ja izmanto Komandu vai Uzņēmējdarbības plānu." + }, + "upgradeEventLogTitle": { + "message": "Uzlabot, lai piekļūtu īstajiem notikumu žurnāla datiem" + }, + "upgradeEventLogMessage": { + "message": "Šie notikumu ir tikai piemēri, un tie neatspoguļo īstus notikumus Bitwarden apvienībā." } } diff --git a/apps/web/src/locales/ml/messages.json b/apps/web/src/locales/ml/messages.json index b3c686a0f46..3b5edb91838 100644 --- a/apps/web/src/locales/ml/messages.json +++ b/apps/web/src/locales/ml/messages.json @@ -5,6 +5,9 @@ "criticalApplications": { "message": "Critical applications" }, + "noCriticalAppsAtRisk": { + "message": "No critical applications at risk" + }, "accessIntelligence": { "message": "Access Intelligence" }, @@ -1161,6 +1164,15 @@ "logInToBitwarden": { "message": "Log in to Bitwarden" }, + "enterTheCodeSentToYourEmail": { + "message": "Enter the code sent to your email" + }, + "enterTheCodeFromYourAuthenticatorApp": { + "message": "Enter the code from your authenticator app" + }, + "pressYourYubiKeyToAuthenticate": { + "message": "Press your YubiKey to authenticate" + }, "authenticationTimeout": { "message": "Authentication timeout" }, @@ -1443,12 +1455,22 @@ "rememberMe": { "message": "എന്നെ ഓർക്കണം" }, + "dontAskAgainOnThisDeviceFor30Days": { + "message": "Don't ask again on this device for 30 days" + }, "sendVerificationCodeEmailAgain": { "message": "സ്ഥിരീകരണ കോഡ് ഇമെയിൽ വഴി വീണ്ടും അയയ്ക്കുക" }, "useAnotherTwoStepMethod": { "message": "മറ്റൊരു രണ്ട് ഘട്ട പ്രവേശന രീതി ഉപയോഗിക്കുക" }, + "selectAnotherMethod": { + "message": "Select another method", + "description": "Select another two-step login method" + }, + "useYourRecoveryCode": { + "message": "Use your recovery code" + }, "insertYubiKey": { "message": "നിങ്ങളുടെ കമ്പ്യൂട്ടറിന്റെ യു‌എസ്‌ബി പോർട്ടിലേക്ക് YubiKey ഇടുക, തുടർന്ന് അതിന്റെ ബട്ടൺ അമർത്തുക." }, @@ -1467,6 +1489,9 @@ "twoStepOptions": { "message": "രണ്ട്-ഘട്ട പ്രവേശനം ഓപ്ഷനുകൾ" }, + "selectTwoStepLoginMethod": { + "message": "Select two-step login method" + }, "recoveryCodeDesc": { "message": "നിങ്ങളുടെ രണ്ട്-ഘടക ദാതാക്കളിലേക്കുള്ള ആക്‌സസ്സ് നഷ്‌ടപ്പെട്ടോ? നിങ്ങളുടെ അക്കൗണ്ടിൽ നിന്ന് രണ്ട്-ഘടക ദാതാക്കളെ പ്രവർത്തനരഹിതമാക്കാൻ നിങ്ങളുടെ റിക്കവറി കോഡ് ഉപയോഗിക്കുക." }, @@ -1509,6 +1534,9 @@ "webAuthnMigrated": { "message": "(Migrated from FIDO)" }, + "openInNewTab": { + "message": "Open in new tab" + }, "emailTitle": { "message": "ഇമെയിൽ" }, @@ -4081,6 +4109,12 @@ "updateBrowserDesc": { "message": "You are using an unsupported web browser. The web vault may not function properly." }, + "youHaveAPendingLoginRequest": { + "message": "You have a pending login request from another device." + }, + "reviewLoginRequest": { + "message": "Review login request" + }, "freeTrialEndPromptCount": { "message": "Your free trial ends in $COUNT$ days.", "placeholders": { @@ -4758,6 +4792,15 @@ "masterPassPolicyDesc": { "message": "Set minimum requirements for master password strength." }, + "passwordStrengthScore": { + "message": "Password strength score $SCORE$", + "placeholders": { + "score": { + "content": "$1", + "example": "4" + } + } + }, "twoStepLoginPolicyTitle": { "message": "Require two-step login" }, @@ -5653,6 +5696,12 @@ "webAuthnAuthenticate": { "message": "Authenticate WebAuthn" }, + "readSecurityKey": { + "message": "Read security key" + }, + "awaitingSecurityKeyInteraction": { + "message": "Awaiting security key interaction..." + }, "webAuthnNotSupported": { "message": "WebAuthn is not supported in this browser." }, @@ -7199,6 +7248,12 @@ "duoRequiredByOrgForAccount": { "message": "Duo two-step login is required for your account." }, + "duoTwoFactorRequiredPageSubtitle": { + "message": "Duo two-step login is required for your account. Follow the steps below to finish logging in." + }, + "followTheStepsBelowToFinishLoggingIn": { + "message": "Follow the steps below to finish logging in." + }, "launchDuo": { "message": "Launch Duo" }, @@ -10437,5 +10492,23 @@ }, "removeUnlockWithPinPolicyDesc": { "message": "Do not allow members to unlock their account with a PIN." + }, + "limitedEventLogs": { + "message": "$PRODUCT_TYPE$ plans do not have access to real event logs", + "placeholders": { + "product_type": { + "content": "$1", + "example": "Teams" + } + } + }, + "upgradeForFullEvents": { + "message": "Get full access to organization event logs by upgrading to a Teams or Enterprise plan." + }, + "upgradeEventLogTitle": { + "message": "Upgrade for real event log data" + }, + "upgradeEventLogMessage": { + "message": "These events are examples only and do not reflect real events within your Bitwarden organization." } } diff --git a/apps/web/src/locales/mr/messages.json b/apps/web/src/locales/mr/messages.json index 1c4e2e55201..aed10e3ad71 100644 --- a/apps/web/src/locales/mr/messages.json +++ b/apps/web/src/locales/mr/messages.json @@ -5,6 +5,9 @@ "criticalApplications": { "message": "Critical applications" }, + "noCriticalAppsAtRisk": { + "message": "No critical applications at risk" + }, "accessIntelligence": { "message": "Access Intelligence" }, @@ -1161,6 +1164,15 @@ "logInToBitwarden": { "message": "Log in to Bitwarden" }, + "enterTheCodeSentToYourEmail": { + "message": "Enter the code sent to your email" + }, + "enterTheCodeFromYourAuthenticatorApp": { + "message": "Enter the code from your authenticator app" + }, + "pressYourYubiKeyToAuthenticate": { + "message": "Press your YubiKey to authenticate" + }, "authenticationTimeout": { "message": "Authentication timeout" }, @@ -1443,12 +1455,22 @@ "rememberMe": { "message": "Remember me" }, + "dontAskAgainOnThisDeviceFor30Days": { + "message": "Don't ask again on this device for 30 days" + }, "sendVerificationCodeEmailAgain": { "message": "Send verification code email again" }, "useAnotherTwoStepMethod": { "message": "Use another two-step login method" }, + "selectAnotherMethod": { + "message": "Select another method", + "description": "Select another two-step login method" + }, + "useYourRecoveryCode": { + "message": "Use your recovery code" + }, "insertYubiKey": { "message": "Insert your YubiKey into your computer's USB port, then touch its button." }, @@ -1467,6 +1489,9 @@ "twoStepOptions": { "message": "Two-step login options" }, + "selectTwoStepLoginMethod": { + "message": "Select two-step login method" + }, "recoveryCodeDesc": { "message": "Lost access to all of your two-step login providers? Use your recovery code to turn off all two-step login providers from your account." }, @@ -1509,6 +1534,9 @@ "webAuthnMigrated": { "message": "(Migrated from FIDO)" }, + "openInNewTab": { + "message": "Open in new tab" + }, "emailTitle": { "message": "Email" }, @@ -4081,6 +4109,12 @@ "updateBrowserDesc": { "message": "You are using an unsupported web browser. The web vault may not function properly." }, + "youHaveAPendingLoginRequest": { + "message": "You have a pending login request from another device." + }, + "reviewLoginRequest": { + "message": "Review login request" + }, "freeTrialEndPromptCount": { "message": "Your free trial ends in $COUNT$ days.", "placeholders": { @@ -4758,6 +4792,15 @@ "masterPassPolicyDesc": { "message": "Set requirements for master password strength." }, + "passwordStrengthScore": { + "message": "Password strength score $SCORE$", + "placeholders": { + "score": { + "content": "$1", + "example": "4" + } + } + }, "twoStepLoginPolicyTitle": { "message": "Require two-step login" }, @@ -5653,6 +5696,12 @@ "webAuthnAuthenticate": { "message": "Authenticate WebAuthn" }, + "readSecurityKey": { + "message": "Read security key" + }, + "awaitingSecurityKeyInteraction": { + "message": "Awaiting security key interaction..." + }, "webAuthnNotSupported": { "message": "WebAuthn is not supported in this browser." }, @@ -7199,6 +7248,12 @@ "duoRequiredByOrgForAccount": { "message": "Duo two-step login is required for your account." }, + "duoTwoFactorRequiredPageSubtitle": { + "message": "Duo two-step login is required for your account. Follow the steps below to finish logging in." + }, + "followTheStepsBelowToFinishLoggingIn": { + "message": "Follow the steps below to finish logging in." + }, "launchDuo": { "message": "Launch Duo" }, @@ -10437,5 +10492,23 @@ }, "removeUnlockWithPinPolicyDesc": { "message": "Do not allow members to unlock their account with a PIN." + }, + "limitedEventLogs": { + "message": "$PRODUCT_TYPE$ plans do not have access to real event logs", + "placeholders": { + "product_type": { + "content": "$1", + "example": "Teams" + } + } + }, + "upgradeForFullEvents": { + "message": "Get full access to organization event logs by upgrading to a Teams or Enterprise plan." + }, + "upgradeEventLogTitle": { + "message": "Upgrade for real event log data" + }, + "upgradeEventLogMessage": { + "message": "These events are examples only and do not reflect real events within your Bitwarden organization." } } diff --git a/apps/web/src/locales/my/messages.json b/apps/web/src/locales/my/messages.json index 1c4e2e55201..aed10e3ad71 100644 --- a/apps/web/src/locales/my/messages.json +++ b/apps/web/src/locales/my/messages.json @@ -5,6 +5,9 @@ "criticalApplications": { "message": "Critical applications" }, + "noCriticalAppsAtRisk": { + "message": "No critical applications at risk" + }, "accessIntelligence": { "message": "Access Intelligence" }, @@ -1161,6 +1164,15 @@ "logInToBitwarden": { "message": "Log in to Bitwarden" }, + "enterTheCodeSentToYourEmail": { + "message": "Enter the code sent to your email" + }, + "enterTheCodeFromYourAuthenticatorApp": { + "message": "Enter the code from your authenticator app" + }, + "pressYourYubiKeyToAuthenticate": { + "message": "Press your YubiKey to authenticate" + }, "authenticationTimeout": { "message": "Authentication timeout" }, @@ -1443,12 +1455,22 @@ "rememberMe": { "message": "Remember me" }, + "dontAskAgainOnThisDeviceFor30Days": { + "message": "Don't ask again on this device for 30 days" + }, "sendVerificationCodeEmailAgain": { "message": "Send verification code email again" }, "useAnotherTwoStepMethod": { "message": "Use another two-step login method" }, + "selectAnotherMethod": { + "message": "Select another method", + "description": "Select another two-step login method" + }, + "useYourRecoveryCode": { + "message": "Use your recovery code" + }, "insertYubiKey": { "message": "Insert your YubiKey into your computer's USB port, then touch its button." }, @@ -1467,6 +1489,9 @@ "twoStepOptions": { "message": "Two-step login options" }, + "selectTwoStepLoginMethod": { + "message": "Select two-step login method" + }, "recoveryCodeDesc": { "message": "Lost access to all of your two-step login providers? Use your recovery code to turn off all two-step login providers from your account." }, @@ -1509,6 +1534,9 @@ "webAuthnMigrated": { "message": "(Migrated from FIDO)" }, + "openInNewTab": { + "message": "Open in new tab" + }, "emailTitle": { "message": "Email" }, @@ -4081,6 +4109,12 @@ "updateBrowserDesc": { "message": "You are using an unsupported web browser. The web vault may not function properly." }, + "youHaveAPendingLoginRequest": { + "message": "You have a pending login request from another device." + }, + "reviewLoginRequest": { + "message": "Review login request" + }, "freeTrialEndPromptCount": { "message": "Your free trial ends in $COUNT$ days.", "placeholders": { @@ -4758,6 +4792,15 @@ "masterPassPolicyDesc": { "message": "Set requirements for master password strength." }, + "passwordStrengthScore": { + "message": "Password strength score $SCORE$", + "placeholders": { + "score": { + "content": "$1", + "example": "4" + } + } + }, "twoStepLoginPolicyTitle": { "message": "Require two-step login" }, @@ -5653,6 +5696,12 @@ "webAuthnAuthenticate": { "message": "Authenticate WebAuthn" }, + "readSecurityKey": { + "message": "Read security key" + }, + "awaitingSecurityKeyInteraction": { + "message": "Awaiting security key interaction..." + }, "webAuthnNotSupported": { "message": "WebAuthn is not supported in this browser." }, @@ -7199,6 +7248,12 @@ "duoRequiredByOrgForAccount": { "message": "Duo two-step login is required for your account." }, + "duoTwoFactorRequiredPageSubtitle": { + "message": "Duo two-step login is required for your account. Follow the steps below to finish logging in." + }, + "followTheStepsBelowToFinishLoggingIn": { + "message": "Follow the steps below to finish logging in." + }, "launchDuo": { "message": "Launch Duo" }, @@ -10437,5 +10492,23 @@ }, "removeUnlockWithPinPolicyDesc": { "message": "Do not allow members to unlock their account with a PIN." + }, + "limitedEventLogs": { + "message": "$PRODUCT_TYPE$ plans do not have access to real event logs", + "placeholders": { + "product_type": { + "content": "$1", + "example": "Teams" + } + } + }, + "upgradeForFullEvents": { + "message": "Get full access to organization event logs by upgrading to a Teams or Enterprise plan." + }, + "upgradeEventLogTitle": { + "message": "Upgrade for real event log data" + }, + "upgradeEventLogMessage": { + "message": "These events are examples only and do not reflect real events within your Bitwarden organization." } } diff --git a/apps/web/src/locales/nb/messages.json b/apps/web/src/locales/nb/messages.json index 32f3a9485a8..a457deb1cb8 100644 --- a/apps/web/src/locales/nb/messages.json +++ b/apps/web/src/locales/nb/messages.json @@ -5,6 +5,9 @@ "criticalApplications": { "message": "Critical applications" }, + "noCriticalAppsAtRisk": { + "message": "No critical applications at risk" + }, "accessIntelligence": { "message": "Access Intelligence" }, @@ -1161,6 +1164,15 @@ "logInToBitwarden": { "message": "Logg inn på Bitwarden" }, + "enterTheCodeSentToYourEmail": { + "message": "Enter the code sent to your email" + }, + "enterTheCodeFromYourAuthenticatorApp": { + "message": "Enter the code from your authenticator app" + }, + "pressYourYubiKeyToAuthenticate": { + "message": "Press your YubiKey to authenticate" + }, "authenticationTimeout": { "message": "Authentication timeout" }, @@ -1443,12 +1455,22 @@ "rememberMe": { "message": "Husk på meg" }, + "dontAskAgainOnThisDeviceFor30Days": { + "message": "Don't ask again on this device for 30 days" + }, "sendVerificationCodeEmailAgain": { "message": "Send E-posten med verifiseringskoden på nytt" }, "useAnotherTwoStepMethod": { "message": "Bruk en annen 2-trinnsinnloggingsmetode" }, + "selectAnotherMethod": { + "message": "Select another method", + "description": "Select another two-step login method" + }, + "useYourRecoveryCode": { + "message": "Use your recovery code" + }, "insertYubiKey": { "message": "Sett inn din YubiKey i din datamaskins USB-uttak, og så trykk på dens knapp." }, @@ -1467,6 +1489,9 @@ "twoStepOptions": { "message": "2-trinnsinnloggingsalternativer" }, + "selectTwoStepLoginMethod": { + "message": "Select two-step login method" + }, "recoveryCodeDesc": { "message": "Har du mistet tilgang til alle dine 2-trinnsleverandører? Bruk din gjenopprettingskode til å fjerne alle 2-trinnsleverandører fra din konto." }, @@ -1509,6 +1534,9 @@ "webAuthnMigrated": { "message": "(Migrert fra FIDO)" }, + "openInNewTab": { + "message": "Open in new tab" + }, "emailTitle": { "message": "E-post" }, @@ -4081,6 +4109,12 @@ "updateBrowserDesc": { "message": "Du bruker en ustøttet nettleser. Netthvelvet vil kanskje ikke fungere ordentlig." }, + "youHaveAPendingLoginRequest": { + "message": "You have a pending login request from another device." + }, + "reviewLoginRequest": { + "message": "Review login request" + }, "freeTrialEndPromptCount": { "message": "Your free trial ends in $COUNT$ days.", "placeholders": { @@ -4758,6 +4792,15 @@ "masterPassPolicyDesc": { "message": "Sett minimumskrav til hovedpassordets styrke." }, + "passwordStrengthScore": { + "message": "Password strength score $SCORE$", + "placeholders": { + "score": { + "content": "$1", + "example": "4" + } + } + }, "twoStepLoginPolicyTitle": { "message": "Krev 2-trinnsinnlogging" }, @@ -5653,6 +5696,12 @@ "webAuthnAuthenticate": { "message": "Autentiser WebAuthn" }, + "readSecurityKey": { + "message": "Read security key" + }, + "awaitingSecurityKeyInteraction": { + "message": "Awaiting security key interaction..." + }, "webAuthnNotSupported": { "message": "WebAuthn støttes ikke i denne nettleseren." }, @@ -7199,6 +7248,12 @@ "duoRequiredByOrgForAccount": { "message": "Duo two-step login is required for your account." }, + "duoTwoFactorRequiredPageSubtitle": { + "message": "Duo two-step login is required for your account. Follow the steps below to finish logging in." + }, + "followTheStepsBelowToFinishLoggingIn": { + "message": "Follow the steps below to finish logging in." + }, "launchDuo": { "message": "Start Duo" }, @@ -10437,5 +10492,23 @@ }, "removeUnlockWithPinPolicyDesc": { "message": "Do not allow members to unlock their account with a PIN." + }, + "limitedEventLogs": { + "message": "$PRODUCT_TYPE$ plans do not have access to real event logs", + "placeholders": { + "product_type": { + "content": "$1", + "example": "Teams" + } + } + }, + "upgradeForFullEvents": { + "message": "Get full access to organization event logs by upgrading to a Teams or Enterprise plan." + }, + "upgradeEventLogTitle": { + "message": "Upgrade for real event log data" + }, + "upgradeEventLogMessage": { + "message": "These events are examples only and do not reflect real events within your Bitwarden organization." } } diff --git a/apps/web/src/locales/ne/messages.json b/apps/web/src/locales/ne/messages.json index 7070b26a7bc..484164fdfad 100644 --- a/apps/web/src/locales/ne/messages.json +++ b/apps/web/src/locales/ne/messages.json @@ -5,6 +5,9 @@ "criticalApplications": { "message": "Critical applications" }, + "noCriticalAppsAtRisk": { + "message": "No critical applications at risk" + }, "accessIntelligence": { "message": "Access Intelligence" }, @@ -1161,6 +1164,15 @@ "logInToBitwarden": { "message": "Log in to Bitwarden" }, + "enterTheCodeSentToYourEmail": { + "message": "Enter the code sent to your email" + }, + "enterTheCodeFromYourAuthenticatorApp": { + "message": "Enter the code from your authenticator app" + }, + "pressYourYubiKeyToAuthenticate": { + "message": "Press your YubiKey to authenticate" + }, "authenticationTimeout": { "message": "Authentication timeout" }, @@ -1443,12 +1455,22 @@ "rememberMe": { "message": "Remember me" }, + "dontAskAgainOnThisDeviceFor30Days": { + "message": "Don't ask again on this device for 30 days" + }, "sendVerificationCodeEmailAgain": { "message": "Send verification code email again" }, "useAnotherTwoStepMethod": { "message": "Use another two-step login method" }, + "selectAnotherMethod": { + "message": "Select another method", + "description": "Select another two-step login method" + }, + "useYourRecoveryCode": { + "message": "Use your recovery code" + }, "insertYubiKey": { "message": "Insert your YubiKey into your computer's USB port, then touch its button." }, @@ -1467,6 +1489,9 @@ "twoStepOptions": { "message": "Two-step login options" }, + "selectTwoStepLoginMethod": { + "message": "Select two-step login method" + }, "recoveryCodeDesc": { "message": "Lost access to all of your two-step login providers? Use your recovery code to turn off all two-step login providers from your account." }, @@ -1509,6 +1534,9 @@ "webAuthnMigrated": { "message": "(Migrated from FIDO)" }, + "openInNewTab": { + "message": "Open in new tab" + }, "emailTitle": { "message": "Email" }, @@ -4081,6 +4109,12 @@ "updateBrowserDesc": { "message": "You are using an unsupported web browser. The web vault may not function properly." }, + "youHaveAPendingLoginRequest": { + "message": "You have a pending login request from another device." + }, + "reviewLoginRequest": { + "message": "Review login request" + }, "freeTrialEndPromptCount": { "message": "Your free trial ends in $COUNT$ days.", "placeholders": { @@ -4758,6 +4792,15 @@ "masterPassPolicyDesc": { "message": "Set requirements for master password strength." }, + "passwordStrengthScore": { + "message": "Password strength score $SCORE$", + "placeholders": { + "score": { + "content": "$1", + "example": "4" + } + } + }, "twoStepLoginPolicyTitle": { "message": "Require two-step login" }, @@ -5653,6 +5696,12 @@ "webAuthnAuthenticate": { "message": "Authenticate WebAuthn" }, + "readSecurityKey": { + "message": "Read security key" + }, + "awaitingSecurityKeyInteraction": { + "message": "Awaiting security key interaction..." + }, "webAuthnNotSupported": { "message": "WebAuthn is not supported in this browser." }, @@ -7199,6 +7248,12 @@ "duoRequiredByOrgForAccount": { "message": "Duo two-step login is required for your account." }, + "duoTwoFactorRequiredPageSubtitle": { + "message": "Duo two-step login is required for your account. Follow the steps below to finish logging in." + }, + "followTheStepsBelowToFinishLoggingIn": { + "message": "Follow the steps below to finish logging in." + }, "launchDuo": { "message": "Launch Duo" }, @@ -10437,5 +10492,23 @@ }, "removeUnlockWithPinPolicyDesc": { "message": "Do not allow members to unlock their account with a PIN." + }, + "limitedEventLogs": { + "message": "$PRODUCT_TYPE$ plans do not have access to real event logs", + "placeholders": { + "product_type": { + "content": "$1", + "example": "Teams" + } + } + }, + "upgradeForFullEvents": { + "message": "Get full access to organization event logs by upgrading to a Teams or Enterprise plan." + }, + "upgradeEventLogTitle": { + "message": "Upgrade for real event log data" + }, + "upgradeEventLogMessage": { + "message": "These events are examples only and do not reflect real events within your Bitwarden organization." } } diff --git a/apps/web/src/locales/nl/messages.json b/apps/web/src/locales/nl/messages.json index df680d0359a..4f69a15d49e 100644 --- a/apps/web/src/locales/nl/messages.json +++ b/apps/web/src/locales/nl/messages.json @@ -5,6 +5,9 @@ "criticalApplications": { "message": "Belangrijke applicaties" }, + "noCriticalAppsAtRisk": { + "message": "Geen belangrijke applicaties lopen risico" + }, "accessIntelligence": { "message": "Toegangsintelligentie" }, @@ -1161,6 +1164,15 @@ "logInToBitwarden": { "message": "Inloggen op Bitwarden" }, + "enterTheCodeSentToYourEmail": { + "message": "Voer de code in die naar je e-mailadres is verstuurd" + }, + "enterTheCodeFromYourAuthenticatorApp": { + "message": "Voer de code uit je authenticatie-app in" + }, + "pressYourYubiKeyToAuthenticate": { + "message": "Druk op je YubiKey om te verifiëren" + }, "authenticationTimeout": { "message": "Authenticatie-timeout" }, @@ -1443,12 +1455,22 @@ "rememberMe": { "message": "Mijn gegevens onthouden" }, + "dontAskAgainOnThisDeviceFor30Days": { + "message": "30 dagen niet meer vragen op dit apparaat" + }, "sendVerificationCodeEmailAgain": { "message": "E-mail met verificatiecode opnieuw versturen" }, "useAnotherTwoStepMethod": { "message": "Gebruik een andere methode voor tweestapsaanmelding" }, + "selectAnotherMethod": { + "message": "Kies een andere methode", + "description": "Select another two-step login method" + }, + "useYourRecoveryCode": { + "message": "Gebruik je herstelcode" + }, "insertYubiKey": { "message": "Plaats je YubiKey in de USB-poort van je computer en druk op de knop." }, @@ -1467,6 +1489,9 @@ "twoStepOptions": { "message": "Opties voor tweestapsaanmelding" }, + "selectTwoStepLoginMethod": { + "message": "Kies methode voor tweestapsaanmelding" + }, "recoveryCodeDesc": { "message": "Ben je de toegang tot al je tweestapsaanbieders verloren? Gebruik dan je herstelcode om alle tweestapsaanbieders op je account uit te schakelen." }, @@ -1509,6 +1534,9 @@ "webAuthnMigrated": { "message": "(Gemigreerd van FIDO)" }, + "openInNewTab": { + "message": "Openen in nieuwe tab" + }, "emailTitle": { "message": "E-mailadres" }, @@ -4081,6 +4109,12 @@ "updateBrowserDesc": { "message": "Je maakt gebruik van webbrowser die we niet ondersteunen. De webkluis werkt mogelijk niet goed." }, + "youHaveAPendingLoginRequest": { + "message": "Je hebt inlogverzoek van een ander apparaat." + }, + "reviewLoginRequest": { + "message": "Inlogverzoek afhandelen" + }, "freeTrialEndPromptCount": { "message": "Je gratis proefperiode eindigt over $COUNT$ dagen.", "placeholders": { @@ -4758,6 +4792,15 @@ "masterPassPolicyDesc": { "message": "Minimale eisen voor de sterkte van het hoofdwachtwoord instellen." }, + "passwordStrengthScore": { + "message": "Score wachtwoordsterkte $SCORE$", + "placeholders": { + "score": { + "content": "$1", + "example": "4" + } + } + }, "twoStepLoginPolicyTitle": { "message": "Tweestapsaanmelding vereisen" }, @@ -5653,6 +5696,12 @@ "webAuthnAuthenticate": { "message": "Authenticeer WebAuthn" }, + "readSecurityKey": { + "message": "Beveiligingssleutel lezen" + }, + "awaitingSecurityKeyInteraction": { + "message": "Wacht op interactie met beveiligingssleutel..." + }, "webAuthnNotSupported": { "message": "WebAuthn wordt niet ondersteund in deze browser." }, @@ -7199,6 +7248,12 @@ "duoRequiredByOrgForAccount": { "message": "DUO tweestapsaanmelding is vereist voor jouw account." }, + "duoTwoFactorRequiredPageSubtitle": { + "message": "Jouw account vereist Duo-tweestapsaanmelding. Volg de onderstaande stappen om het inloggen te voltooien." + }, + "followTheStepsBelowToFinishLoggingIn": { + "message": "Volg de onderstaande stappen om in te loggen." + }, "launchDuo": { "message": "DUO starten" }, @@ -10437,5 +10492,23 @@ }, "removeUnlockWithPinPolicyDesc": { "message": "Leden niet toestaan hun account te ontgrendelen met een pincode." + }, + "limitedEventLogs": { + "message": "$PRODUCT_TYPE$-abonnementen hebben geen toegang tot echte event logs", + "placeholders": { + "product_type": { + "content": "$1", + "example": "Teams" + } + } + }, + "upgradeForFullEvents": { + "message": "Krijg volledige toegang tot event logs van de organisatie door te upgraden naar een Teams- of Enterprise-abonnement." + }, + "upgradeEventLogTitle": { + "message": "Upgrade voor echte event log gegevens" + }, + "upgradeEventLogMessage": { + "message": "Deze events zijn voorbeelden en weerspiegelen geen echte evenementen binnen je Bitwarden-organisatie." } } diff --git a/apps/web/src/locales/nn/messages.json b/apps/web/src/locales/nn/messages.json index c139fc606b8..1694768fd79 100644 --- a/apps/web/src/locales/nn/messages.json +++ b/apps/web/src/locales/nn/messages.json @@ -5,6 +5,9 @@ "criticalApplications": { "message": "Critical applications" }, + "noCriticalAppsAtRisk": { + "message": "No critical applications at risk" + }, "accessIntelligence": { "message": "Access Intelligence" }, @@ -1161,6 +1164,15 @@ "logInToBitwarden": { "message": "Log in to Bitwarden" }, + "enterTheCodeSentToYourEmail": { + "message": "Enter the code sent to your email" + }, + "enterTheCodeFromYourAuthenticatorApp": { + "message": "Enter the code from your authenticator app" + }, + "pressYourYubiKeyToAuthenticate": { + "message": "Press your YubiKey to authenticate" + }, "authenticationTimeout": { "message": "Authentication timeout" }, @@ -1443,12 +1455,22 @@ "rememberMe": { "message": "Hugsa meg" }, + "dontAskAgainOnThisDeviceFor30Days": { + "message": "Don't ask again on this device for 30 days" + }, "sendVerificationCodeEmailAgain": { "message": "Send verification code email again" }, "useAnotherTwoStepMethod": { "message": "Bruk ein annan tofaktormetode for pålogging" }, + "selectAnotherMethod": { + "message": "Select another method", + "description": "Select another two-step login method" + }, + "useYourRecoveryCode": { + "message": "Use your recovery code" + }, "insertYubiKey": { "message": "Insert your YubiKey into your computer's USB port, then touch its button." }, @@ -1467,6 +1489,9 @@ "twoStepOptions": { "message": "Two-step login options" }, + "selectTwoStepLoginMethod": { + "message": "Select two-step login method" + }, "recoveryCodeDesc": { "message": "Lost access to all of your two-step login providers? Use your recovery code to turn off all two-step login providers from your account." }, @@ -1509,6 +1534,9 @@ "webAuthnMigrated": { "message": "(Migrated from FIDO)" }, + "openInNewTab": { + "message": "Open in new tab" + }, "emailTitle": { "message": "Email" }, @@ -4081,6 +4109,12 @@ "updateBrowserDesc": { "message": "You are using an unsupported web browser. The web vault may not function properly." }, + "youHaveAPendingLoginRequest": { + "message": "You have a pending login request from another device." + }, + "reviewLoginRequest": { + "message": "Review login request" + }, "freeTrialEndPromptCount": { "message": "Your free trial ends in $COUNT$ days.", "placeholders": { @@ -4758,6 +4792,15 @@ "masterPassPolicyDesc": { "message": "Set requirements for master password strength." }, + "passwordStrengthScore": { + "message": "Password strength score $SCORE$", + "placeholders": { + "score": { + "content": "$1", + "example": "4" + } + } + }, "twoStepLoginPolicyTitle": { "message": "Require two-step login" }, @@ -5653,6 +5696,12 @@ "webAuthnAuthenticate": { "message": "Authenticate WebAuthn" }, + "readSecurityKey": { + "message": "Read security key" + }, + "awaitingSecurityKeyInteraction": { + "message": "Awaiting security key interaction..." + }, "webAuthnNotSupported": { "message": "WebAuthn is not supported in this browser." }, @@ -7199,6 +7248,12 @@ "duoRequiredByOrgForAccount": { "message": "Duo two-step login is required for your account." }, + "duoTwoFactorRequiredPageSubtitle": { + "message": "Duo two-step login is required for your account. Follow the steps below to finish logging in." + }, + "followTheStepsBelowToFinishLoggingIn": { + "message": "Follow the steps below to finish logging in." + }, "launchDuo": { "message": "Launch Duo" }, @@ -10437,5 +10492,23 @@ }, "removeUnlockWithPinPolicyDesc": { "message": "Do not allow members to unlock their account with a PIN." + }, + "limitedEventLogs": { + "message": "$PRODUCT_TYPE$ plans do not have access to real event logs", + "placeholders": { + "product_type": { + "content": "$1", + "example": "Teams" + } + } + }, + "upgradeForFullEvents": { + "message": "Get full access to organization event logs by upgrading to a Teams or Enterprise plan." + }, + "upgradeEventLogTitle": { + "message": "Upgrade for real event log data" + }, + "upgradeEventLogMessage": { + "message": "These events are examples only and do not reflect real events within your Bitwarden organization." } } diff --git a/apps/web/src/locales/or/messages.json b/apps/web/src/locales/or/messages.json index 1c4e2e55201..aed10e3ad71 100644 --- a/apps/web/src/locales/or/messages.json +++ b/apps/web/src/locales/or/messages.json @@ -5,6 +5,9 @@ "criticalApplications": { "message": "Critical applications" }, + "noCriticalAppsAtRisk": { + "message": "No critical applications at risk" + }, "accessIntelligence": { "message": "Access Intelligence" }, @@ -1161,6 +1164,15 @@ "logInToBitwarden": { "message": "Log in to Bitwarden" }, + "enterTheCodeSentToYourEmail": { + "message": "Enter the code sent to your email" + }, + "enterTheCodeFromYourAuthenticatorApp": { + "message": "Enter the code from your authenticator app" + }, + "pressYourYubiKeyToAuthenticate": { + "message": "Press your YubiKey to authenticate" + }, "authenticationTimeout": { "message": "Authentication timeout" }, @@ -1443,12 +1455,22 @@ "rememberMe": { "message": "Remember me" }, + "dontAskAgainOnThisDeviceFor30Days": { + "message": "Don't ask again on this device for 30 days" + }, "sendVerificationCodeEmailAgain": { "message": "Send verification code email again" }, "useAnotherTwoStepMethod": { "message": "Use another two-step login method" }, + "selectAnotherMethod": { + "message": "Select another method", + "description": "Select another two-step login method" + }, + "useYourRecoveryCode": { + "message": "Use your recovery code" + }, "insertYubiKey": { "message": "Insert your YubiKey into your computer's USB port, then touch its button." }, @@ -1467,6 +1489,9 @@ "twoStepOptions": { "message": "Two-step login options" }, + "selectTwoStepLoginMethod": { + "message": "Select two-step login method" + }, "recoveryCodeDesc": { "message": "Lost access to all of your two-step login providers? Use your recovery code to turn off all two-step login providers from your account." }, @@ -1509,6 +1534,9 @@ "webAuthnMigrated": { "message": "(Migrated from FIDO)" }, + "openInNewTab": { + "message": "Open in new tab" + }, "emailTitle": { "message": "Email" }, @@ -4081,6 +4109,12 @@ "updateBrowserDesc": { "message": "You are using an unsupported web browser. The web vault may not function properly." }, + "youHaveAPendingLoginRequest": { + "message": "You have a pending login request from another device." + }, + "reviewLoginRequest": { + "message": "Review login request" + }, "freeTrialEndPromptCount": { "message": "Your free trial ends in $COUNT$ days.", "placeholders": { @@ -4758,6 +4792,15 @@ "masterPassPolicyDesc": { "message": "Set requirements for master password strength." }, + "passwordStrengthScore": { + "message": "Password strength score $SCORE$", + "placeholders": { + "score": { + "content": "$1", + "example": "4" + } + } + }, "twoStepLoginPolicyTitle": { "message": "Require two-step login" }, @@ -5653,6 +5696,12 @@ "webAuthnAuthenticate": { "message": "Authenticate WebAuthn" }, + "readSecurityKey": { + "message": "Read security key" + }, + "awaitingSecurityKeyInteraction": { + "message": "Awaiting security key interaction..." + }, "webAuthnNotSupported": { "message": "WebAuthn is not supported in this browser." }, @@ -7199,6 +7248,12 @@ "duoRequiredByOrgForAccount": { "message": "Duo two-step login is required for your account." }, + "duoTwoFactorRequiredPageSubtitle": { + "message": "Duo two-step login is required for your account. Follow the steps below to finish logging in." + }, + "followTheStepsBelowToFinishLoggingIn": { + "message": "Follow the steps below to finish logging in." + }, "launchDuo": { "message": "Launch Duo" }, @@ -10437,5 +10492,23 @@ }, "removeUnlockWithPinPolicyDesc": { "message": "Do not allow members to unlock their account with a PIN." + }, + "limitedEventLogs": { + "message": "$PRODUCT_TYPE$ plans do not have access to real event logs", + "placeholders": { + "product_type": { + "content": "$1", + "example": "Teams" + } + } + }, + "upgradeForFullEvents": { + "message": "Get full access to organization event logs by upgrading to a Teams or Enterprise plan." + }, + "upgradeEventLogTitle": { + "message": "Upgrade for real event log data" + }, + "upgradeEventLogMessage": { + "message": "These events are examples only and do not reflect real events within your Bitwarden organization." } } diff --git a/apps/web/src/locales/pl/messages.json b/apps/web/src/locales/pl/messages.json index eb372bb81cf..3fdc4d1f281 100644 --- a/apps/web/src/locales/pl/messages.json +++ b/apps/web/src/locales/pl/messages.json @@ -5,6 +5,9 @@ "criticalApplications": { "message": "Krytyczne aplikacje" }, + "noCriticalAppsAtRisk": { + "message": "Brak zagrożonych aplikacji krytycznych" + }, "accessIntelligence": { "message": "Dostęp do informacji" }, @@ -1161,6 +1164,15 @@ "logInToBitwarden": { "message": "Zaloguj do Bitwarden" }, + "enterTheCodeSentToYourEmail": { + "message": "Wpisz kod wysłany na Twój adres e-mail" + }, + "enterTheCodeFromYourAuthenticatorApp": { + "message": "Wpisz kod z aplikacji uwierzytelniającej" + }, + "pressYourYubiKeyToAuthenticate": { + "message": "Naciśnij YubiKey aby uwierzytelnić" + }, "authenticationTimeout": { "message": "Limit czasu uwierzytelniania" }, @@ -1443,12 +1455,22 @@ "rememberMe": { "message": "Zapamiętaj mnie" }, + "dontAskAgainOnThisDeviceFor30Days": { + "message": "Nie pytaj ponownie na tym urządzeniu przez 30 dni" + }, "sendVerificationCodeEmailAgain": { "message": "Wyślij ponownie wiadomość z kodem weryfikacyjnym" }, "useAnotherTwoStepMethod": { "message": "Użyj innej metody logowania dwustopniowego" }, + "selectAnotherMethod": { + "message": "Wybierz inną metodę", + "description": "Select another two-step login method" + }, + "useYourRecoveryCode": { + "message": "Użyj kodu odzyskiwania" + }, "insertYubiKey": { "message": "Włóż klucz YubiKey do portu USB komputera, a następnie dotknij jego przycisku." }, @@ -1467,6 +1489,9 @@ "twoStepOptions": { "message": "Opcje logowania dwustopniowego" }, + "selectTwoStepLoginMethod": { + "message": "Wybierz metodę logowania dwustopniowego" + }, "recoveryCodeDesc": { "message": "Utraciłeś dostęp do wszystkich swoich mechanizmów dwustopniowego logowania? Użyj kodów odzyskiwania, aby wyłączyć dwustopniowe logowanie na Twoim koncie." }, @@ -1509,6 +1534,9 @@ "webAuthnMigrated": { "message": "(przeniesiony z FIDO)" }, + "openInNewTab": { + "message": "Otwórz w nowej karcie" + }, "emailTitle": { "message": "Adres e-mail" }, @@ -4081,6 +4109,12 @@ "updateBrowserDesc": { "message": "Używasz nieobsługiwanej przeglądarki. Sejf internetowy może działać niewłaściwie." }, + "youHaveAPendingLoginRequest": { + "message": "Masz oczekujące żądanie logowania z innego urządzenia." + }, + "reviewLoginRequest": { + "message": "Przejrzyj żądanie logowania" + }, "freeTrialEndPromptCount": { "message": "Twój okres próbny kończy się za $COUNT$ dni.", "placeholders": { @@ -4758,6 +4792,15 @@ "masterPassPolicyDesc": { "message": "Ustaw minimalne wymagania dla hasła głównego." }, + "passwordStrengthScore": { + "message": "Siła hasła: $SCORE$", + "placeholders": { + "score": { + "content": "$1", + "example": "4" + } + } + }, "twoStepLoginPolicyTitle": { "message": "Wymagaj logowania dwustopniowego" }, @@ -5653,6 +5696,12 @@ "webAuthnAuthenticate": { "message": "Uwierzytelnianie WebAuthn" }, + "readSecurityKey": { + "message": "Odczytaj klucz bezpieczeństwa" + }, + "awaitingSecurityKeyInteraction": { + "message": "Oczekiwanie na interakcję z kluczem bezpieczeństwa..." + }, "webAuthnNotSupported": { "message": "Ta przeglądarka nie obsługuje uwierzytelniania WebAuthn." }, @@ -7199,6 +7248,12 @@ "duoRequiredByOrgForAccount": { "message": "Dwustopniowe logowanie DUO jest wymagane dla Twojego konta." }, + "duoTwoFactorRequiredPageSubtitle": { + "message": "Logowanie dwustopniowe Duo jest wymagane dla twojego konta. Wykonaj poniższe kroki, by dokończyć logowanie" + }, + "followTheStepsBelowToFinishLoggingIn": { + "message": "Wykonaj poniższe kroki, by dokończyć logowanie" + }, "launchDuo": { "message": "Uruchom DUO" }, @@ -10437,5 +10492,23 @@ }, "removeUnlockWithPinPolicyDesc": { "message": "Nie zezwalaj członkom na odblokowanie ich konta za pomocą kodu PIN." + }, + "limitedEventLogs": { + "message": "Plany $PRODUCT_TYPE$ nie mają dostępu do dzienników rzeczywistych wydarzeń", + "placeholders": { + "product_type": { + "content": "$1", + "example": "Teams" + } + } + }, + "upgradeForFullEvents": { + "message": "Uzyskaj pełny dostęp do dzienników zdarzeń organizacji poprzez uaktualnienie do planu Teams lub Enterprise." + }, + "upgradeEventLogTitle": { + "message": "Uaktualnij dla rzeczywistych danych dziennika zdarzeń" + }, + "upgradeEventLogMessage": { + "message": "Te wydarzenia są tylko przykładami i nie odzwierciedlają rzeczywistych wydarzeń w Twojej organizacji Bitwarden." } } diff --git a/apps/web/src/locales/pt_BR/messages.json b/apps/web/src/locales/pt_BR/messages.json index d360195f3fd..2bc5ac479fa 100644 --- a/apps/web/src/locales/pt_BR/messages.json +++ b/apps/web/src/locales/pt_BR/messages.json @@ -5,6 +5,9 @@ "criticalApplications": { "message": "Aplicações críticas" }, + "noCriticalAppsAtRisk": { + "message": "No critical applications at risk" + }, "accessIntelligence": { "message": "Acessar a Inteligência" }, @@ -1161,6 +1164,15 @@ "logInToBitwarden": { "message": "Inicie a sessão no Bitwarden" }, + "enterTheCodeSentToYourEmail": { + "message": "Enter the code sent to your email" + }, + "enterTheCodeFromYourAuthenticatorApp": { + "message": "Enter the code from your authenticator app" + }, + "pressYourYubiKeyToAuthenticate": { + "message": "Press your YubiKey to authenticate" + }, "authenticationTimeout": { "message": "Tempo de autenticação esgotado" }, @@ -1443,12 +1455,22 @@ "rememberMe": { "message": "Lembrar de mim" }, + "dontAskAgainOnThisDeviceFor30Days": { + "message": "Don't ask again on this device for 30 days" + }, "sendVerificationCodeEmailAgain": { "message": "Enviar código de verificação para o e-mail novamente" }, "useAnotherTwoStepMethod": { "message": "Utilizar outro método de verificação em duas etapas" }, + "selectAnotherMethod": { + "message": "Select another method", + "description": "Select another two-step login method" + }, + "useYourRecoveryCode": { + "message": "Use your recovery code" + }, "insertYubiKey": { "message": "Insira a sua YubiKey na porta USB do seu computador, e depois toque no botão da mesma." }, @@ -1467,6 +1489,9 @@ "twoStepOptions": { "message": "Opções de login em duas etapas" }, + "selectTwoStepLoginMethod": { + "message": "Select two-step login method" + }, "recoveryCodeDesc": { "message": "Perdeu o acesso a todos os seus provedores de duas etapas? Utilize o seu código de recuperação para desativar todos os provedores de duas etapas da sua conta." }, @@ -1509,6 +1534,9 @@ "webAuthnMigrated": { "message": "(Migrado de FIDO)" }, + "openInNewTab": { + "message": "Open in new tab" + }, "emailTitle": { "message": "E-mail" }, @@ -4081,6 +4109,12 @@ "updateBrowserDesc": { "message": "Você está usando um navegador da Web não suportado. O cofre web pode não funcionar corretamente." }, + "youHaveAPendingLoginRequest": { + "message": "You have a pending login request from another device." + }, + "reviewLoginRequest": { + "message": "Review login request" + }, "freeTrialEndPromptCount": { "message": "Your free trial ends in $COUNT$ days.", "placeholders": { @@ -4758,6 +4792,15 @@ "masterPassPolicyDesc": { "message": "Defina os requisitos mínimos para a força da senha mestra." }, + "passwordStrengthScore": { + "message": "Password strength score $SCORE$", + "placeholders": { + "score": { + "content": "$1", + "example": "4" + } + } + }, "twoStepLoginPolicyTitle": { "message": "Exigir login em duas etapas" }, @@ -5653,6 +5696,12 @@ "webAuthnAuthenticate": { "message": "Autenticar WebAuthn" }, + "readSecurityKey": { + "message": "Read security key" + }, + "awaitingSecurityKeyInteraction": { + "message": "Awaiting security key interaction..." + }, "webAuthnNotSupported": { "message": "O WebAuthn não é suportado neste navegador." }, @@ -7199,6 +7248,12 @@ "duoRequiredByOrgForAccount": { "message": "A autenticação em duas etapas do Duo é necessária para sua conta." }, + "duoTwoFactorRequiredPageSubtitle": { + "message": "Duo two-step login is required for your account. Follow the steps below to finish logging in." + }, + "followTheStepsBelowToFinishLoggingIn": { + "message": "Follow the steps below to finish logging in." + }, "launchDuo": { "message": "Abrir o Duo" }, @@ -10437,5 +10492,23 @@ }, "removeUnlockWithPinPolicyDesc": { "message": "Do not allow members to unlock their account with a PIN." + }, + "limitedEventLogs": { + "message": "$PRODUCT_TYPE$ plans do not have access to real event logs", + "placeholders": { + "product_type": { + "content": "$1", + "example": "Teams" + } + } + }, + "upgradeForFullEvents": { + "message": "Get full access to organization event logs by upgrading to a Teams or Enterprise plan." + }, + "upgradeEventLogTitle": { + "message": "Upgrade for real event log data" + }, + "upgradeEventLogMessage": { + "message": "These events are examples only and do not reflect real events within your Bitwarden organization." } } diff --git a/apps/web/src/locales/pt_PT/messages.json b/apps/web/src/locales/pt_PT/messages.json index 69606c58924..543729c956c 100644 --- a/apps/web/src/locales/pt_PT/messages.json +++ b/apps/web/src/locales/pt_PT/messages.json @@ -5,6 +5,9 @@ "criticalApplications": { "message": "Aplicações críticas" }, + "noCriticalAppsAtRisk": { + "message": "Não há aplicações críticas em risco" + }, "accessIntelligence": { "message": "Aceder à informação" }, @@ -1161,6 +1164,15 @@ "logInToBitwarden": { "message": "Iniciar sessão no Bitwarden" }, + "enterTheCodeSentToYourEmail": { + "message": "Introduza o código enviado para o seu e-mail" + }, + "enterTheCodeFromYourAuthenticatorApp": { + "message": "Introduza o código da sua app de autenticação" + }, + "pressYourYubiKeyToAuthenticate": { + "message": "Prima a sua YubiKey para se autenticar" + }, "authenticationTimeout": { "message": "Tempo limite de autenticação" }, @@ -1443,12 +1455,22 @@ "rememberMe": { "message": "Memorizar" }, + "dontAskAgainOnThisDeviceFor30Days": { + "message": "Não voltar a perguntar neste dispositivo durante 30 dias" + }, "sendVerificationCodeEmailAgain": { "message": "Enviar e-mail com o código de verificação novamente" }, "useAnotherTwoStepMethod": { "message": "Utilizar outro método de verificação de dois passos" }, + "selectAnotherMethod": { + "message": "Selecionar outro método", + "description": "Select another two-step login method" + }, + "useYourRecoveryCode": { + "message": "Utilize o seu código de recuperação" + }, "insertYubiKey": { "message": "Introduza a sua YubiKey na porta USB do seu computador, depois toque no botão da mesma." }, @@ -1467,6 +1489,9 @@ "twoStepOptions": { "message": "Opções de verificação de dois passos" }, + "selectTwoStepLoginMethod": { + "message": "Selecionar método de verificação de dois passos" + }, "recoveryCodeDesc": { "message": "Perdeu o acesso a todos os seus fornecedores de verificação de dois passos? Utilize o seu código de recuperação para desativar todos os fornecedores de verificação de dois passos da sua conta." }, @@ -1509,6 +1534,9 @@ "webAuthnMigrated": { "message": "(Migrado do FIDO)" }, + "openInNewTab": { + "message": "Abrir num novo separador" + }, "emailTitle": { "message": "E-mail" }, @@ -4081,6 +4109,12 @@ "updateBrowserDesc": { "message": "Está a utilizar um navegador web não suportado. O cofre web pode não funcionar corretamente." }, + "youHaveAPendingLoginRequest": { + "message": "Tem um pedido de início de sessão pendente doutro dispositivo." + }, + "reviewLoginRequest": { + "message": "Rever pedido de início de sessão" + }, "freeTrialEndPromptCount": { "message": "O seu período experimental gratuito termina dentro de $COUNT$ dias.", "placeholders": { @@ -4758,6 +4792,15 @@ "masterPassPolicyDesc": { "message": "Definir requisitos para a força da palavra-passe mestra." }, + "passwordStrengthScore": { + "message": "Pontuação da força da palavra-passe: $SCORE$", + "placeholders": { + "score": { + "content": "$1", + "example": "4" + } + } + }, "twoStepLoginPolicyTitle": { "message": "Exigir verificação de dois passos" }, @@ -5653,6 +5696,12 @@ "webAuthnAuthenticate": { "message": "Autenticar o WebAuthn" }, + "readSecurityKey": { + "message": "Ler chave de segurança" + }, + "awaitingSecurityKeyInteraction": { + "message": "A aguardar interação da chave de segurança..." + }, "webAuthnNotSupported": { "message": "O WebAuthn não é suportado por este navegador." }, @@ -7199,6 +7248,12 @@ "duoRequiredByOrgForAccount": { "message": "A verificação de dois passos Duo é necessária para a sua conta." }, + "duoTwoFactorRequiredPageSubtitle": { + "message": "A verificação de dois passos do Duo é necessária para a sua conta. Siga os passos abaixo para concluir o início de sessão." + }, + "followTheStepsBelowToFinishLoggingIn": { + "message": "Siga os passos abaixo para concluir o início de sessão." + }, "launchDuo": { "message": "Iniciar o DUO" }, @@ -10433,9 +10488,27 @@ "message": "Os lugares atribuídos excedem os lugares disponíveis." }, "removeUnlockWithPinPolicyTitle": { - "message": "Remove Unlock with PIN" + "message": "Remover o desbloqueio com PIN" }, "removeUnlockWithPinPolicyDesc": { - "message": "Do not allow members to unlock their account with a PIN." + "message": "Não permitir que os membros desbloqueiem a sua conta com um PIN." + }, + "limitedEventLogs": { + "message": "Os planos $PRODUCT_TYPE$ não têm acesso a registos de eventos reais", + "placeholders": { + "product_type": { + "content": "$1", + "example": "Teams" + } + } + }, + "upgradeForFullEvents": { + "message": "Obtenha acesso total aos registos de eventos da organização ao atualizar para um plano Equipas ou Empresarial." + }, + "upgradeEventLogTitle": { + "message": "Atualizar para dados de registo de eventos reais" + }, + "upgradeEventLogMessage": { + "message": "Estes eventos são apenas exemplos e não refletem eventos reais na sua organização Bitwarden." } } diff --git a/apps/web/src/locales/ro/messages.json b/apps/web/src/locales/ro/messages.json index 0b4572578e4..bf23ee549e8 100644 --- a/apps/web/src/locales/ro/messages.json +++ b/apps/web/src/locales/ro/messages.json @@ -5,6 +5,9 @@ "criticalApplications": { "message": "Aplicațiile critice" }, + "noCriticalAppsAtRisk": { + "message": "No critical applications at risk" + }, "accessIntelligence": { "message": "Access Intelligence" }, @@ -1161,6 +1164,15 @@ "logInToBitwarden": { "message": "Log in to Bitwarden" }, + "enterTheCodeSentToYourEmail": { + "message": "Enter the code sent to your email" + }, + "enterTheCodeFromYourAuthenticatorApp": { + "message": "Enter the code from your authenticator app" + }, + "pressYourYubiKeyToAuthenticate": { + "message": "Press your YubiKey to authenticate" + }, "authenticationTimeout": { "message": "Authentication timeout" }, @@ -1443,12 +1455,22 @@ "rememberMe": { "message": "Memorare autentificare" }, + "dontAskAgainOnThisDeviceFor30Days": { + "message": "Don't ask again on this device for 30 days" + }, "sendVerificationCodeEmailAgain": { "message": "Retrimitere e-mail cu codul de verificare" }, "useAnotherTwoStepMethod": { "message": "Utilizare de metodă diferită de autentificare în două etape" }, + "selectAnotherMethod": { + "message": "Select another method", + "description": "Select another two-step login method" + }, + "useYourRecoveryCode": { + "message": "Use your recovery code" + }, "insertYubiKey": { "message": "Introduceți YubiKey în portul USB al calculatorului apoi apăsați butonul acestuia." }, @@ -1467,6 +1489,9 @@ "twoStepOptions": { "message": "Opțiuni de autentificare în două etape" }, + "selectTwoStepLoginMethod": { + "message": "Select two-step login method" + }, "recoveryCodeDesc": { "message": "Ați pierdut accesul la toți furnizorii de autentificare în două etape? Folosiți codul de recuperare pentru a dezactiva toți acești furnizori din contul dvs." }, @@ -1509,6 +1534,9 @@ "webAuthnMigrated": { "message": "(Migrate din FIDO)" }, + "openInNewTab": { + "message": "Open in new tab" + }, "emailTitle": { "message": "E-mail" }, @@ -4081,6 +4109,12 @@ "updateBrowserDesc": { "message": "Utilizați un browser nesuportat. Seiful web ar putea să nu funcționeze corect." }, + "youHaveAPendingLoginRequest": { + "message": "You have a pending login request from another device." + }, + "reviewLoginRequest": { + "message": "Review login request" + }, "freeTrialEndPromptCount": { "message": "Your free trial ends in $COUNT$ days.", "placeholders": { @@ -4758,6 +4792,15 @@ "masterPassPolicyDesc": { "message": "Setați cerințele pentru puterea parolei principale." }, + "passwordStrengthScore": { + "message": "Password strength score $SCORE$", + "placeholders": { + "score": { + "content": "$1", + "example": "4" + } + } + }, "twoStepLoginPolicyTitle": { "message": "Necesită autentificare în doi pași" }, @@ -5653,6 +5696,12 @@ "webAuthnAuthenticate": { "message": "Autentificare WebAuthn" }, + "readSecurityKey": { + "message": "Read security key" + }, + "awaitingSecurityKeyInteraction": { + "message": "Awaiting security key interaction..." + }, "webAuthnNotSupported": { "message": "WebAuthn nu este acceptat în acest browser." }, @@ -7199,6 +7248,12 @@ "duoRequiredByOrgForAccount": { "message": "Duo two-step login is required for your account." }, + "duoTwoFactorRequiredPageSubtitle": { + "message": "Duo two-step login is required for your account. Follow the steps below to finish logging in." + }, + "followTheStepsBelowToFinishLoggingIn": { + "message": "Follow the steps below to finish logging in." + }, "launchDuo": { "message": "Launch Duo" }, @@ -10437,5 +10492,23 @@ }, "removeUnlockWithPinPolicyDesc": { "message": "Do not allow members to unlock their account with a PIN." + }, + "limitedEventLogs": { + "message": "$PRODUCT_TYPE$ plans do not have access to real event logs", + "placeholders": { + "product_type": { + "content": "$1", + "example": "Teams" + } + } + }, + "upgradeForFullEvents": { + "message": "Get full access to organization event logs by upgrading to a Teams or Enterprise plan." + }, + "upgradeEventLogTitle": { + "message": "Upgrade for real event log data" + }, + "upgradeEventLogMessage": { + "message": "These events are examples only and do not reflect real events within your Bitwarden organization." } } diff --git a/apps/web/src/locales/ru/messages.json b/apps/web/src/locales/ru/messages.json index 11f00e2fb4b..fb1e5b1a09d 100644 --- a/apps/web/src/locales/ru/messages.json +++ b/apps/web/src/locales/ru/messages.json @@ -5,6 +5,9 @@ "criticalApplications": { "message": "Критичные приложения" }, + "noCriticalAppsAtRisk": { + "message": "Никакие критически важные приложения не подвергаются риску" + }, "accessIntelligence": { "message": "Управление доступом" }, @@ -1161,6 +1164,15 @@ "logInToBitwarden": { "message": "Войти в Bitwarden" }, + "enterTheCodeSentToYourEmail": { + "message": "Введите код, отправленный на ваш email" + }, + "enterTheCodeFromYourAuthenticatorApp": { + "message": "Введите код из приложения-аутентификатора" + }, + "pressYourYubiKeyToAuthenticate": { + "message": "Нажмите на YubiKey для аутентификации" + }, "authenticationTimeout": { "message": "Таймаут аутентификации" }, @@ -1443,12 +1455,22 @@ "rememberMe": { "message": "Запомнить меня" }, + "dontAskAgainOnThisDeviceFor30Days": { + "message": "Не спрашивать на этом устройстве в течение 30 дней" + }, "sendVerificationCodeEmailAgain": { "message": "Отправить код подтверждения еще раз" }, "useAnotherTwoStepMethod": { "message": "Использовать другой метод двухэтапной аутентификации" }, + "selectAnotherMethod": { + "message": "Выбрать другой способ", + "description": "Select another two-step login method" + }, + "useYourRecoveryCode": { + "message": "Использовать код восстановления" + }, "insertYubiKey": { "message": "Вставьте свой YubiKey в USB-порт компьютера и нажмите его кнопку." }, @@ -1467,6 +1489,9 @@ "twoStepOptions": { "message": "Настройки двухэтапной аутентификации" }, + "selectTwoStepLoginMethod": { + "message": "Выбрать другой метод двухэтапной аутентификации" + }, "recoveryCodeDesc": { "message": "Потеряли доступ ко всем вариантам двухэтапной аутентификации? Используйте код восстановления, чтобы отключить ее для вашего аккаунта." }, @@ -1509,6 +1534,9 @@ "webAuthnMigrated": { "message": "(Перенесено из FIDO)" }, + "openInNewTab": { + "message": "Открыть в новой вкладке" + }, "emailTitle": { "message": "Email" }, @@ -2210,13 +2238,13 @@ "message": "Просмотр элементов" }, "viewItemsHidePass": { - "message": "Просмотр элементов, скрытых паролей" + "message": "Просмотр элементов, пароли скрыты" }, "editItems": { - "message": "Изменить элементы" + "message": "Изменение элементов" }, "editItemsHidePass": { - "message": "Изменить элементы, скрытые пароли" + "message": "Изменение элементов, пароли скрыты" }, "disable": { "message": "Отключить" @@ -4081,6 +4109,12 @@ "updateBrowserDesc": { "message": "Вы используете неподдерживаемый браузер. Веб-хранилище может работать некорректно." }, + "youHaveAPendingLoginRequest": { + "message": "У вас есть незавершенный запрос на авторизацию с другого устройства." + }, + "reviewLoginRequest": { + "message": "Просмотр запроса на вход" + }, "freeTrialEndPromptCount": { "message": "Ваша бесплатная пробная версия заканчивается через $COUNT$ дней.", "placeholders": { @@ -4758,6 +4792,15 @@ "masterPassPolicyDesc": { "message": "Установите требования к надежности мастер-пароля." }, + "passwordStrengthScore": { + "message": "Оценка надежности пароля $SCORE$", + "placeholders": { + "score": { + "content": "$1", + "example": "4" + } + } + }, "twoStepLoginPolicyTitle": { "message": "Требуется двухэтапная аутентификация" }, @@ -5653,6 +5696,12 @@ "webAuthnAuthenticate": { "message": "Аутентификация WebAutn" }, + "readSecurityKey": { + "message": "Считать ключ безопасности" + }, + "awaitingSecurityKeyInteraction": { + "message": "Ожидание взаимодействия с ключом безопасности..." + }, "webAuthnNotSupported": { "message": "WebAuthn не поддерживается в этом браузере." }, @@ -7199,6 +7248,12 @@ "duoRequiredByOrgForAccount": { "message": "Для вашего аккаунта требуется двухэтапная аутентификация Duo." }, + "duoTwoFactorRequiredPageSubtitle": { + "message": "Duo two-step login is required for your account. Follow the steps below to finish logging in." + }, + "followTheStepsBelowToFinishLoggingIn": { + "message": "Следуйте указаниям ниже, чтобы завершить авторизацию." + }, "launchDuo": { "message": "Запустить Duo" }, @@ -10437,5 +10492,23 @@ }, "removeUnlockWithPinPolicyDesc": { "message": "Не разрешать пользователям разблокировать свои аккаунты с помощью PIN-кода." + }, + "limitedEventLogs": { + "message": "Планы $PRODUCT_TYPE$ не имеют доступа к реальным журналам событий", + "placeholders": { + "product_type": { + "content": "$1", + "example": "Teams" + } + } + }, + "upgradeForFullEvents": { + "message": "Получите полный доступ к журналам событий организации, перейдя на план Teams или Enterprise." + }, + "upgradeEventLogTitle": { + "message": "Upgrade for real event log data" + }, + "upgradeEventLogMessage": { + "message": "Эти события являются лишь примерами и не отражают реальных событий в вашей организации Bitwarden." } } diff --git a/apps/web/src/locales/si/messages.json b/apps/web/src/locales/si/messages.json index d7d7133d056..fff2413cf4d 100644 --- a/apps/web/src/locales/si/messages.json +++ b/apps/web/src/locales/si/messages.json @@ -5,6 +5,9 @@ "criticalApplications": { "message": "Critical applications" }, + "noCriticalAppsAtRisk": { + "message": "No critical applications at risk" + }, "accessIntelligence": { "message": "Access Intelligence" }, @@ -1161,6 +1164,15 @@ "logInToBitwarden": { "message": "Log in to Bitwarden" }, + "enterTheCodeSentToYourEmail": { + "message": "Enter the code sent to your email" + }, + "enterTheCodeFromYourAuthenticatorApp": { + "message": "Enter the code from your authenticator app" + }, + "pressYourYubiKeyToAuthenticate": { + "message": "Press your YubiKey to authenticate" + }, "authenticationTimeout": { "message": "Authentication timeout" }, @@ -1443,12 +1455,22 @@ "rememberMe": { "message": "Remember me" }, + "dontAskAgainOnThisDeviceFor30Days": { + "message": "Don't ask again on this device for 30 days" + }, "sendVerificationCodeEmailAgain": { "message": "Send verification code email again" }, "useAnotherTwoStepMethod": { "message": "Use another two-step login method" }, + "selectAnotherMethod": { + "message": "Select another method", + "description": "Select another two-step login method" + }, + "useYourRecoveryCode": { + "message": "Use your recovery code" + }, "insertYubiKey": { "message": "Insert your YubiKey into your computer's USB port, then touch its button." }, @@ -1467,6 +1489,9 @@ "twoStepOptions": { "message": "Two-step login options" }, + "selectTwoStepLoginMethod": { + "message": "Select two-step login method" + }, "recoveryCodeDesc": { "message": "Lost access to all of your two-step login providers? Use your recovery code to turn off all two-step login providers from your account." }, @@ -1509,6 +1534,9 @@ "webAuthnMigrated": { "message": "(Migrated from FIDO)" }, + "openInNewTab": { + "message": "Open in new tab" + }, "emailTitle": { "message": "වි-තැපෑල" }, @@ -4081,6 +4109,12 @@ "updateBrowserDesc": { "message": "You are using an unsupported web browser. The web vault may not function properly." }, + "youHaveAPendingLoginRequest": { + "message": "You have a pending login request from another device." + }, + "reviewLoginRequest": { + "message": "Review login request" + }, "freeTrialEndPromptCount": { "message": "Your free trial ends in $COUNT$ days.", "placeholders": { @@ -4758,6 +4792,15 @@ "masterPassPolicyDesc": { "message": "Set requirements for master password strength." }, + "passwordStrengthScore": { + "message": "Password strength score $SCORE$", + "placeholders": { + "score": { + "content": "$1", + "example": "4" + } + } + }, "twoStepLoginPolicyTitle": { "message": "Require two-step login" }, @@ -5653,6 +5696,12 @@ "webAuthnAuthenticate": { "message": "Authenticate WebAuthn" }, + "readSecurityKey": { + "message": "Read security key" + }, + "awaitingSecurityKeyInteraction": { + "message": "Awaiting security key interaction..." + }, "webAuthnNotSupported": { "message": "WebAuthn is not supported in this browser." }, @@ -7199,6 +7248,12 @@ "duoRequiredByOrgForAccount": { "message": "Duo two-step login is required for your account." }, + "duoTwoFactorRequiredPageSubtitle": { + "message": "Duo two-step login is required for your account. Follow the steps below to finish logging in." + }, + "followTheStepsBelowToFinishLoggingIn": { + "message": "Follow the steps below to finish logging in." + }, "launchDuo": { "message": "Launch Duo" }, @@ -10437,5 +10492,23 @@ }, "removeUnlockWithPinPolicyDesc": { "message": "Do not allow members to unlock their account with a PIN." + }, + "limitedEventLogs": { + "message": "$PRODUCT_TYPE$ plans do not have access to real event logs", + "placeholders": { + "product_type": { + "content": "$1", + "example": "Teams" + } + } + }, + "upgradeForFullEvents": { + "message": "Get full access to organization event logs by upgrading to a Teams or Enterprise plan." + }, + "upgradeEventLogTitle": { + "message": "Upgrade for real event log data" + }, + "upgradeEventLogMessage": { + "message": "These events are examples only and do not reflect real events within your Bitwarden organization." } } diff --git a/apps/web/src/locales/sk/messages.json b/apps/web/src/locales/sk/messages.json index f7843acb742..61390245659 100644 --- a/apps/web/src/locales/sk/messages.json +++ b/apps/web/src/locales/sk/messages.json @@ -5,6 +5,9 @@ "criticalApplications": { "message": "Kritické aplikácie" }, + "noCriticalAppsAtRisk": { + "message": "No critical applications at risk" + }, "accessIntelligence": { "message": "Prehľad o prístupe" }, @@ -1161,6 +1164,15 @@ "logInToBitwarden": { "message": "Prihlásenie do Bitwardenu" }, + "enterTheCodeSentToYourEmail": { + "message": "Zadajte kód zaslaný na váš e-mail" + }, + "enterTheCodeFromYourAuthenticatorApp": { + "message": "Zadajte kód z overovacej aplikácie" + }, + "pressYourYubiKeyToAuthenticate": { + "message": "Stlačte YubiKey na overenie" + }, "authenticationTimeout": { "message": "Časový limit overenia" }, @@ -1443,12 +1455,22 @@ "rememberMe": { "message": "Zapamätaj si ma" }, + "dontAskAgainOnThisDeviceFor30Days": { + "message": "Nepýtať sa znova na tomto zariadení 30 dní" + }, "sendVerificationCodeEmailAgain": { "message": "Znovu zaslať overovací kód emailom" }, "useAnotherTwoStepMethod": { "message": "Použiť inú dvojstupňovú metódu prihlásenia" }, + "selectAnotherMethod": { + "message": "Vyberte iný spôsob", + "description": "Select another two-step login method" + }, + "useYourRecoveryCode": { + "message": "Použiť obnovovací kód" + }, "insertYubiKey": { "message": "Vložte váš YubiKey do USB portu počítača a stlačte jeho tlačidlo." }, @@ -1467,6 +1489,9 @@ "twoStepOptions": { "message": "Možnosti dvojstupňového prihlásenia" }, + "selectTwoStepLoginMethod": { + "message": "Vyberte metódu dvojstupňového prihlásenia" + }, "recoveryCodeDesc": { "message": "Stratili ste prístup ku všetkým vašim dvojstupňovým poskytovateľom? Použite váš záchranný kód pre vypnutie všetkých poskytovateľov vo vašom účte." }, @@ -1509,6 +1534,9 @@ "webAuthnMigrated": { "message": "(Migrované z FIDO)" }, + "openInNewTab": { + "message": "Otvoriť v novej karte" + }, "emailTitle": { "message": "Email" }, @@ -4081,6 +4109,12 @@ "updateBrowserDesc": { "message": "Používate nepodporovaný prehliadač. Webový trezor nemusí úplne fungovať." }, + "youHaveAPendingLoginRequest": { + "message": "Máte čakajúcu požiadavku na prihlásenie z iného zariadenia." + }, + "reviewLoginRequest": { + "message": "Skontrolovať požiadavku o prihlásenie" + }, "freeTrialEndPromptCount": { "message": "Vaše bezplatné skúšobné obdobie vyprší o $COUNT$ dní.", "placeholders": { @@ -4758,6 +4792,15 @@ "masterPassPolicyDesc": { "message": "Nastavte minimálne požiadavky pre silu hlavného hesla." }, + "passwordStrengthScore": { + "message": "Sila hesla $SCORE$", + "placeholders": { + "score": { + "content": "$1", + "example": "4" + } + } + }, "twoStepLoginPolicyTitle": { "message": "Vyžadovať dvojstupňové prihlásenie" }, @@ -5653,6 +5696,12 @@ "webAuthnAuthenticate": { "message": "Overiť cez WebAuthn" }, + "readSecurityKey": { + "message": "Prečítať bezpečnostný kľúč" + }, + "awaitingSecurityKeyInteraction": { + "message": "Čaká sa na interakciu s bezpečnostným kľúčom..." + }, "webAuthnNotSupported": { "message": "Tento prehliadač nepodporuje WebAuthn." }, @@ -7199,6 +7248,12 @@ "duoRequiredByOrgForAccount": { "message": "Pre váš účet je potrebné dvojstupňové prihlásenie DUO." }, + "duoTwoFactorRequiredPageSubtitle": { + "message": "Pre váš účet sa vyžaduje dvojstupňové prihlásenie Duo. Na dokončenie prihlásenia postupujte podľa pokynov." + }, + "followTheStepsBelowToFinishLoggingIn": { + "message": "Na dokončenie prihlásenia postupujte podľa pokynov." + }, "launchDuo": { "message": "Spustiť DUO" }, @@ -10433,9 +10488,27 @@ "message": "Počet pridelených sedení presahuje počet dostupných sedení." }, "removeUnlockWithPinPolicyTitle": { - "message": "Remove Unlock with PIN" + "message": "Odstrániť odomknutie PIN kódom" }, "removeUnlockWithPinPolicyDesc": { - "message": "Do not allow members to unlock their account with a PIN." + "message": "Neumožnite vaším členom odomykať si konto PIN kódom." + }, + "limitedEventLogs": { + "message": "$PRODUCT_TYPE$ plans do not have access to real event logs", + "placeholders": { + "product_type": { + "content": "$1", + "example": "Teams" + } + } + }, + "upgradeForFullEvents": { + "message": "Get full access to organization event logs by upgrading to a Teams or Enterprise plan." + }, + "upgradeEventLogTitle": { + "message": "Upgrade for real event log data" + }, + "upgradeEventLogMessage": { + "message": "These events are examples only and do not reflect real events within your Bitwarden organization." } } diff --git a/apps/web/src/locales/sl/messages.json b/apps/web/src/locales/sl/messages.json index fad209c3c03..a0358d28ee9 100644 --- a/apps/web/src/locales/sl/messages.json +++ b/apps/web/src/locales/sl/messages.json @@ -5,6 +5,9 @@ "criticalApplications": { "message": "Kritične aplikacije" }, + "noCriticalAppsAtRisk": { + "message": "No critical applications at risk" + }, "accessIntelligence": { "message": "Analiza dostopa" }, @@ -1161,6 +1164,15 @@ "logInToBitwarden": { "message": "Log in to Bitwarden" }, + "enterTheCodeSentToYourEmail": { + "message": "Enter the code sent to your email" + }, + "enterTheCodeFromYourAuthenticatorApp": { + "message": "Enter the code from your authenticator app" + }, + "pressYourYubiKeyToAuthenticate": { + "message": "Press your YubiKey to authenticate" + }, "authenticationTimeout": { "message": "Authentication timeout" }, @@ -1443,12 +1455,22 @@ "rememberMe": { "message": "Zapomni si me" }, + "dontAskAgainOnThisDeviceFor30Days": { + "message": "Don't ask again on this device for 30 days" + }, "sendVerificationCodeEmailAgain": { "message": "Ponovno posreduj potrditveno kodo na e-poštni naslov" }, "useAnotherTwoStepMethod": { "message": "Uporabi drug dvostopenjski način vpisa" }, + "selectAnotherMethod": { + "message": "Select another method", + "description": "Select another two-step login method" + }, + "useYourRecoveryCode": { + "message": "Use your recovery code" + }, "insertYubiKey": { "message": "Svoj YubiKey ključek vstavite v USB režo in pritisnite na njegovo tipko." }, @@ -1467,6 +1489,9 @@ "twoStepOptions": { "message": "Možnosti dvostopenjske prijave" }, + "selectTwoStepLoginMethod": { + "message": "Select two-step login method" + }, "recoveryCodeDesc": { "message": "Ste izgubili dostop do vseh vaših ponudnikov dvostopenjse prijave? Uporabite svoje kode za obnovitev in tako onemogočite dvostopenjsko prijavo v svoj račun." }, @@ -1509,6 +1534,9 @@ "webAuthnMigrated": { "message": "(Preseljeno iz FIDO)" }, + "openInNewTab": { + "message": "Open in new tab" + }, "emailTitle": { "message": "E-pošta" }, @@ -4081,6 +4109,12 @@ "updateBrowserDesc": { "message": "You are using an unsupported web browser. The web vault may not function properly." }, + "youHaveAPendingLoginRequest": { + "message": "You have a pending login request from another device." + }, + "reviewLoginRequest": { + "message": "Review login request" + }, "freeTrialEndPromptCount": { "message": "Your free trial ends in $COUNT$ days.", "placeholders": { @@ -4758,6 +4792,15 @@ "masterPassPolicyDesc": { "message": "Nastavite zahteve za moč glavnega gesla." }, + "passwordStrengthScore": { + "message": "Password strength score $SCORE$", + "placeholders": { + "score": { + "content": "$1", + "example": "4" + } + } + }, "twoStepLoginPolicyTitle": { "message": "Require two-step login" }, @@ -5653,6 +5696,12 @@ "webAuthnAuthenticate": { "message": "Authenticate WebAuthn" }, + "readSecurityKey": { + "message": "Read security key" + }, + "awaitingSecurityKeyInteraction": { + "message": "Awaiting security key interaction..." + }, "webAuthnNotSupported": { "message": "WebAuthn is not supported in this browser." }, @@ -7199,6 +7248,12 @@ "duoRequiredByOrgForAccount": { "message": "Duo two-step login is required for your account." }, + "duoTwoFactorRequiredPageSubtitle": { + "message": "Duo two-step login is required for your account. Follow the steps below to finish logging in." + }, + "followTheStepsBelowToFinishLoggingIn": { + "message": "Follow the steps below to finish logging in." + }, "launchDuo": { "message": "Launch Duo" }, @@ -10437,5 +10492,23 @@ }, "removeUnlockWithPinPolicyDesc": { "message": "Do not allow members to unlock their account with a PIN." + }, + "limitedEventLogs": { + "message": "$PRODUCT_TYPE$ plans do not have access to real event logs", + "placeholders": { + "product_type": { + "content": "$1", + "example": "Teams" + } + } + }, + "upgradeForFullEvents": { + "message": "Get full access to organization event logs by upgrading to a Teams or Enterprise plan." + }, + "upgradeEventLogTitle": { + "message": "Upgrade for real event log data" + }, + "upgradeEventLogMessage": { + "message": "These events are examples only and do not reflect real events within your Bitwarden organization." } } diff --git a/apps/web/src/locales/sr/messages.json b/apps/web/src/locales/sr/messages.json index 6540a709174..f261fe8c90b 100644 --- a/apps/web/src/locales/sr/messages.json +++ b/apps/web/src/locales/sr/messages.json @@ -5,6 +5,9 @@ "criticalApplications": { "message": "Критичне апликације" }, + "noCriticalAppsAtRisk": { + "message": "No critical applications at risk" + }, "accessIntelligence": { "message": "Приступи интелигенцији" }, @@ -465,16 +468,16 @@ "message": "Уреди фасциклу" }, "newFolder": { - "message": "New folder" + "message": "Нова фасцикла" }, "folderName": { - "message": "Folder name" + "message": "Име фасцикле" }, "folderHintText": { - "message": "Nest a folder by adding the parent folder's name followed by a “/”. Example: Social/Forums" + "message": "Угнездите фасциклу додавањем имена надређене фасцкле праћеног знаком „/“. Пример: Друштвени/Форуми" }, "deleteFolderPermanently": { - "message": "Are you sure you want to permanently delete this folder?" + "message": "Да ли сте сигурни да желите да трајно избришете ову фасциклу?" }, "baseDomain": { "message": "Главни домен", @@ -1161,6 +1164,15 @@ "logInToBitwarden": { "message": "Пријавите се на Bitwarden" }, + "enterTheCodeSentToYourEmail": { + "message": "Унесите кôд послат на ваш имејл" + }, + "enterTheCodeFromYourAuthenticatorApp": { + "message": "Унесите кôд из апликације за аутентификацију" + }, + "pressYourYubiKeyToAuthenticate": { + "message": "Стисните Ваш YubiKey за аутентификацију" + }, "authenticationTimeout": { "message": "Истекло је време аутентификације" }, @@ -1399,7 +1411,7 @@ "message": "Одбиј приступ" }, "notificationSentDeviceAnchor": { - "message": "web app" + "message": "веб апликација" }, "notificationSentDevicePart2": { "message": "Потврдите да се фраза отиска прста поклапа са овом испод пре одобравања." @@ -1443,12 +1455,22 @@ "rememberMe": { "message": "Запамти ме" }, + "dontAskAgainOnThisDeviceFor30Days": { + "message": "Не питајте поново на овом уређају 30 дана" + }, "sendVerificationCodeEmailAgain": { "message": "Поново послати верификациони код на Е-пошту" }, "useAnotherTwoStepMethod": { "message": "Користите другу методу пријављивања у два корака" }, + "selectAnotherMethod": { + "message": "Изаберите другу методу", + "description": "Select another two-step login method" + }, + "useYourRecoveryCode": { + "message": "Употребите шифру за опоравак" + }, "insertYubiKey": { "message": "Убаците свој YubiKey у УСБ порт рачунара, а затим додирните његово дугме." }, @@ -1467,6 +1489,9 @@ "twoStepOptions": { "message": "Опције дво-коракне пријаве" }, + "selectTwoStepLoginMethod": { + "message": "Одабрати методу пријављивања у два корака" + }, "recoveryCodeDesc": { "message": "Изгубили сте приступ свим својим двофакторским добављачима? Употребите код за опоравак да онемогућите све двофакторске добављаче из налога." }, @@ -1509,6 +1534,9 @@ "webAuthnMigrated": { "message": "(Мигрирао из FIDO)" }, + "openInNewTab": { + "message": "Отвори у новом језичку" + }, "emailTitle": { "message": "Е-пошта" }, @@ -1888,16 +1916,16 @@ "message": "Укључи заштиту пријаве на новом уређају" }, "turnOffNewDeviceLoginProtectionModalDesc": { - "message": "Proceed below to turn off the verification emails bitwarden sends when you login from a new device." + "message": "Наставите доле да бисте искључили верификационе имејлове које Bitwarden шаље када се пријавите са новог уређаја." }, "turnOnNewDeviceLoginProtectionModalDesc": { - "message": "Proceed below to have bitwarden send you verification emails when you login from a new device." + "message": "Наставите доле да бисте Bitwarden Ва- шаље верификационе имејлове када се пријавите са новог уређаја." }, "turnOffNewDeviceLoginProtectionWarning": { - "message": "With new device login protection turned off, anyone with your master password can access your account from any device. To protect your account without verification emails, set up two-step login." + "message": "Ако је заштита нових пријава искључена, је било ко са вашом главном лозинком може приступити вашем налогу са било којег уређаја. Да бисте заштитили свој рачун без верификационих имејлова, поставите пријаву у два корака." }, "accountNewDeviceLoginProtectionSaved": { - "message": "New device login protection changes saved" + "message": "Промене нових уређаји за заштиту пријаве су сачуване" }, "sessionsDeauthorized": { "message": "Одузето овлашћење свих сесија" @@ -2163,7 +2191,7 @@ "message": "Омогућавање пријаве у два корака може вас трајно закључати са вашег Bitwarden-а налога. Код за опоравак омогућава вам приступ вашем налогу у случају да више не можете да користите свог уобичајеног добављача услуге пријављивања у два корака (нпр. ако изгубите уређај). Подршка Bitwarden-а неће вам моћи помоћи ако изгубите приступ свом налогу. Препоручујемо да запишете или одштампате код за опоравак и сачувате га на сигурном месту." }, "yourSingleUseRecoveryCode": { - "message": "Your single-use recovery code can be used to turn off two-step login in the event that you lose access to your two-step login provider. Bitwarden recommends you write down the recovery code and keep it in a safe place." + "message": "Ваш јединствени кôд за опоравак може се користити за искључивање у два корака у случају да изгубите приступ свом двоструком провајдеру пријаве. Bitwarden препоручује да запишете кôд за опоравак и држите га на сигурном месту." }, "viewRecoveryCode": { "message": "Погледати шифру за опоравак" @@ -2414,7 +2442,7 @@ "message": "Догодила се грешка приликом читања безбедносног кључа. Покушајте поново." }, "twoFactorWebAuthnWarning1": { - "message": "Due to platform limitations, WebAuthn cannot be used on all Bitwarden applications. You should set up another two-step login provider so that you can access your account when WebAuthn cannot be used." + "message": "Због ограничења платформе, WebAuthn се не могу користити на свим Bitwarden апликацијама. Требали бисте подесити другог добављача услуге пријављивања у два корака како бисте могли да приступите свом налогу када WebAuthn не могу да се користе." }, "twoFactorRecoveryYourCode": { "message": "Ваш Bitwarden код за опоравак пријаве у два корака" @@ -4081,6 +4109,12 @@ "updateBrowserDesc": { "message": "Користите неподржани веб прегледач. Веб сеф можда неће правилно функционисати." }, + "youHaveAPendingLoginRequest": { + "message": "Имате захтев за пријаву на чекању са другог уређаја." + }, + "reviewLoginRequest": { + "message": "Прегледајте захтев за пријаву" + }, "freeTrialEndPromptCount": { "message": "Ваша проба се завршава за $COUNT$ дана.", "placeholders": { @@ -4176,7 +4210,7 @@ "message": "Ако не можете да приступите свом налогу путем уобичајених метода пријављивања у два корака, можете користити свој код за опоравак пријаве да бисте онемогућили све добављаче услуга у два корака на свом налогу." }, "logInBelowUsingYourSingleUseRecoveryCode": { - "message": "Log in below using your single-use recovery code. This will turn off all two-step providers on your account." + "message": "Пријавите се испод коришћења вашег једнократног кôда за опоравак. Ово ће искључити све провајдере у два корака на вашем налогу." }, "recoverAccountTwoStep": { "message": "Опоравак пријаве у два корака" @@ -4470,7 +4504,7 @@ "message": "Ажурирање кључа за шифровање не може да се настави" }, "editFieldLabel": { - "message": "Edit $LABEL$", + "message": "Уреди $LABEL$", "placeholders": { "label": { "content": "$1", @@ -4479,7 +4513,7 @@ } }, "reorderToggleButton": { - "message": "Reorder $LABEL$. Use arrow key to move item up or down.", + "message": "Преместити $LABEL$. Користите тастер са стрелицом да бисте померили ставку.", "placeholders": { "label": { "content": "$1", @@ -4758,6 +4792,15 @@ "masterPassPolicyDesc": { "message": "Поставите минималне захтеве за чврстоћу главне лозинке." }, + "passwordStrengthScore": { + "message": "Снага лозинкe $SCORE$", + "placeholders": { + "score": { + "content": "$1", + "example": "4" + } + } + }, "twoStepLoginPolicyTitle": { "message": "Потребна дво-степенска пријава" }, @@ -5653,6 +5696,12 @@ "webAuthnAuthenticate": { "message": "WebAutn аутентификација" }, + "readSecurityKey": { + "message": "Read security key" + }, + "awaitingSecurityKeyInteraction": { + "message": "Awaiting security key interaction..." + }, "webAuthnNotSupported": { "message": "WebAuthn није подржано у овом прегледачу." }, @@ -7199,6 +7248,12 @@ "duoRequiredByOrgForAccount": { "message": "DUO пријава у два корака је потребна за ваш налог." }, + "duoTwoFactorRequiredPageSubtitle": { + "message": "Duo two-step login is required for your account. Follow the steps below to finish logging in." + }, + "followTheStepsBelowToFinishLoggingIn": { + "message": "Follow the steps below to finish logging in." + }, "launchDuo": { "message": "Покренути DUO" }, @@ -8462,16 +8517,16 @@ "message": "Одобри захтев" }, "deviceApproved": { - "message": "Device approved" + "message": "Уређај одобрен" }, "deviceRemoved": { - "message": "Device removed" + "message": "Уређај је уклоњен" }, "removeDevice": { - "message": "Remove device" + "message": "Уклони уређај" }, "removeDeviceConfirmation": { - "message": "Are you sure you want to remove this device?" + "message": "Да ли сте сигурни да желите да уклоните овај уређај?" }, "noDeviceRequests": { "message": "Нема захтева уређаја" @@ -10291,38 +10346,38 @@ "message": "Domain claimed" }, "organizationNameMaxLength": { - "message": "Organization name cannot exceed 50 characters." + "message": "Име организације не може прећи 50 знакова." }, "openingExtension": { - "message": "Opening the Bitwarden browser extension" + "message": "Отварање Bitwarden додатка прегледача" }, "somethingWentWrong": { - "message": "Something went wrong..." + "message": "Нешто није у реду..." }, "openingExtensionError": { - "message": "We had trouble opening the Bitwarden browser extension. Click the button to open it now." + "message": "Имали смо проблема са отварањем додатка. Кликните на дугме да бисте га сада отворили." }, "openExtension": { - "message": "Open extension" + "message": "Отвори додатак" }, "doNotHaveExtension": { - "message": "Don't have the Bitwarden browser extension?" + "message": "Немате додатак за Bitwarden?" }, "installExtension": { - "message": "Install extension" + "message": "Инсталирајте додатак" }, "openedExtension": { - "message": "Opened the browser extension" + "message": "Отворите додатак претраживача" }, "openedExtensionViewAtRiskPasswords": { - "message": "Successfully opened the Bitwarden browser extension. You can now review your at-risk passwords." + "message": "Успешно је отворен додатак. Сада можете да прегледате своје ризичне лозинке." }, "openExtensionManuallyPart1": { - "message": "We had trouble opening the Bitwarden browser extension. Open the Bitwarden icon", + "message": "Имали смо проблема са отварањем додатка. Отворите Bitwarden иконицу", "description": "This will be used as part of a larger sentence, broken up to include the Bitwarden icon. The full sentence will read 'We had trouble opening the Bitwarden browser extension. Open the Bitwarden icon [Bitwarden Icon] from the toolbar.'" }, "openExtensionManuallyPart2": { - "message": "from the toolbar.", + "message": "са алатне траке.", "description": "This will be used as part of a larger sentence, broken up to include the Bitwarden icon. The full sentence will read 'We had trouble opening the Bitwarden browser extension. Open the Bitwarden icon [Bitwarden Icon] from the toolbar.'" }, "resellerRenewalWarningMsg": { @@ -10390,7 +10445,7 @@ "message": "This action will delete the member account including all items in their vault. This replaces the previous Remove action." }, "deleteManagedUserWarning": { - "message": "Delete is a new action!" + "message": "Избриши је нова акција!" }, "seatsRemaining": { "message": "You have $REMAINING$ seats remaining out of $TOTAL$ seats assigned to this organization. Contact your provider to manage your subscription.", @@ -10406,7 +10461,7 @@ } }, "existingOrganization": { - "message": "Existing organization" + "message": "Постојећа организација" }, "selectOrganizationProviderPortal": { "message": "Select an organization to add to your Provider Portal." @@ -10437,5 +10492,23 @@ }, "removeUnlockWithPinPolicyDesc": { "message": "Do not allow members to unlock their account with a PIN." + }, + "limitedEventLogs": { + "message": "$PRODUCT_TYPE$ plans do not have access to real event logs", + "placeholders": { + "product_type": { + "content": "$1", + "example": "Teams" + } + } + }, + "upgradeForFullEvents": { + "message": "Get full access to organization event logs by upgrading to a Teams or Enterprise plan." + }, + "upgradeEventLogTitle": { + "message": "Upgrade for real event log data" + }, + "upgradeEventLogMessage": { + "message": "These events are examples only and do not reflect real events within your Bitwarden organization." } } diff --git a/apps/web/src/locales/sr_CS/messages.json b/apps/web/src/locales/sr_CS/messages.json index 6b5a1e6def2..ffad2e5525d 100644 --- a/apps/web/src/locales/sr_CS/messages.json +++ b/apps/web/src/locales/sr_CS/messages.json @@ -5,6 +5,9 @@ "criticalApplications": { "message": "Kritične aplikacije" }, + "noCriticalAppsAtRisk": { + "message": "No critical applications at risk" + }, "accessIntelligence": { "message": "Pristupi inteligenciji" }, @@ -1161,6 +1164,15 @@ "logInToBitwarden": { "message": "Log in to Bitwarden" }, + "enterTheCodeSentToYourEmail": { + "message": "Enter the code sent to your email" + }, + "enterTheCodeFromYourAuthenticatorApp": { + "message": "Enter the code from your authenticator app" + }, + "pressYourYubiKeyToAuthenticate": { + "message": "Press your YubiKey to authenticate" + }, "authenticationTimeout": { "message": "Authentication timeout" }, @@ -1443,12 +1455,22 @@ "rememberMe": { "message": "Zapamti me" }, + "dontAskAgainOnThisDeviceFor30Days": { + "message": "Don't ask again on this device for 30 days" + }, "sendVerificationCodeEmailAgain": { "message": "Send verification code email again" }, "useAnotherTwoStepMethod": { "message": "Use another two-step login method" }, + "selectAnotherMethod": { + "message": "Select another method", + "description": "Select another two-step login method" + }, + "useYourRecoveryCode": { + "message": "Use your recovery code" + }, "insertYubiKey": { "message": "Povežite Vaš YubiKey preko USB porta na vašem računaru, pa pritisnite dugme na njemu." }, @@ -1467,6 +1489,9 @@ "twoStepOptions": { "message": "Two-step login options" }, + "selectTwoStepLoginMethod": { + "message": "Select two-step login method" + }, "recoveryCodeDesc": { "message": "Lost access to all of your two-step login providers? Use your recovery code to turn off all two-step login providers from your account." }, @@ -1509,6 +1534,9 @@ "webAuthnMigrated": { "message": "(Migrated from FIDO)" }, + "openInNewTab": { + "message": "Open in new tab" + }, "emailTitle": { "message": "Email" }, @@ -4081,6 +4109,12 @@ "updateBrowserDesc": { "message": "You are using an unsupported web browser. The web vault may not function properly." }, + "youHaveAPendingLoginRequest": { + "message": "You have a pending login request from another device." + }, + "reviewLoginRequest": { + "message": "Review login request" + }, "freeTrialEndPromptCount": { "message": "Your free trial ends in $COUNT$ days.", "placeholders": { @@ -4758,6 +4792,15 @@ "masterPassPolicyDesc": { "message": "Set requirements for master password strength." }, + "passwordStrengthScore": { + "message": "Password strength score $SCORE$", + "placeholders": { + "score": { + "content": "$1", + "example": "4" + } + } + }, "twoStepLoginPolicyTitle": { "message": "Require two-step login" }, @@ -5653,6 +5696,12 @@ "webAuthnAuthenticate": { "message": "Authenticate WebAuthn" }, + "readSecurityKey": { + "message": "Read security key" + }, + "awaitingSecurityKeyInteraction": { + "message": "Awaiting security key interaction..." + }, "webAuthnNotSupported": { "message": "WebAuthn is not supported in this browser." }, @@ -7199,6 +7248,12 @@ "duoRequiredByOrgForAccount": { "message": "Duo two-step login is required for your account." }, + "duoTwoFactorRequiredPageSubtitle": { + "message": "Duo two-step login is required for your account. Follow the steps below to finish logging in." + }, + "followTheStepsBelowToFinishLoggingIn": { + "message": "Follow the steps below to finish logging in." + }, "launchDuo": { "message": "Launch Duo" }, @@ -10437,5 +10492,23 @@ }, "removeUnlockWithPinPolicyDesc": { "message": "Do not allow members to unlock their account with a PIN." + }, + "limitedEventLogs": { + "message": "$PRODUCT_TYPE$ plans do not have access to real event logs", + "placeholders": { + "product_type": { + "content": "$1", + "example": "Teams" + } + } + }, + "upgradeForFullEvents": { + "message": "Get full access to organization event logs by upgrading to a Teams or Enterprise plan." + }, + "upgradeEventLogTitle": { + "message": "Upgrade for real event log data" + }, + "upgradeEventLogMessage": { + "message": "These events are examples only and do not reflect real events within your Bitwarden organization." } } diff --git a/apps/web/src/locales/sv/messages.json b/apps/web/src/locales/sv/messages.json index d3aeee603b8..bbcf4b6fa7e 100644 --- a/apps/web/src/locales/sv/messages.json +++ b/apps/web/src/locales/sv/messages.json @@ -5,6 +5,9 @@ "criticalApplications": { "message": "Kritiska applikationer" }, + "noCriticalAppsAtRisk": { + "message": "No critical applications at risk" + }, "accessIntelligence": { "message": "Access Intelligence" }, @@ -1161,6 +1164,15 @@ "logInToBitwarden": { "message": "Logga in på Bitwarden" }, + "enterTheCodeSentToYourEmail": { + "message": "Enter the code sent to your email" + }, + "enterTheCodeFromYourAuthenticatorApp": { + "message": "Enter the code from your authenticator app" + }, + "pressYourYubiKeyToAuthenticate": { + "message": "Press your YubiKey to authenticate" + }, "authenticationTimeout": { "message": "Authentication timeout" }, @@ -1443,12 +1455,22 @@ "rememberMe": { "message": "Kom ihåg mig" }, + "dontAskAgainOnThisDeviceFor30Days": { + "message": "Don't ask again on this device for 30 days" + }, "sendVerificationCodeEmailAgain": { "message": "Skicka e-postmeddelandet med verifieringskoden igen" }, "useAnotherTwoStepMethod": { "message": "Använd en annan metod för tvåstegsverifiering" }, + "selectAnotherMethod": { + "message": "Select another method", + "description": "Select another two-step login method" + }, + "useYourRecoveryCode": { + "message": "Use your recovery code" + }, "insertYubiKey": { "message": "Sätt in din YubiKey i din dators USB-port och tryck på dess knapp." }, @@ -1467,6 +1489,9 @@ "twoStepOptions": { "message": "Alternativ för tvåstegsverifiering" }, + "selectTwoStepLoginMethod": { + "message": "Select two-step login method" + }, "recoveryCodeDesc": { "message": "Förlorat åtkomst till alla dina metoder för tvåstegsverifiering? Använd din återställningskod för att inaktivera tvåstegsverifiering på ditt konto." }, @@ -1509,6 +1534,9 @@ "webAuthnMigrated": { "message": "(Migrerad från FIDO)" }, + "openInNewTab": { + "message": "Open in new tab" + }, "emailTitle": { "message": "E-post" }, @@ -4081,6 +4109,12 @@ "updateBrowserDesc": { "message": "Du använder en webbläsare som inte stöds. Webbvalvet kanske inte fungerar som det ska." }, + "youHaveAPendingLoginRequest": { + "message": "You have a pending login request from another device." + }, + "reviewLoginRequest": { + "message": "Review login request" + }, "freeTrialEndPromptCount": { "message": "Your free trial ends in $COUNT$ days.", "placeholders": { @@ -4758,6 +4792,15 @@ "masterPassPolicyDesc": { "message": "Ange minimikrav för huvudlösenordsstyrka." }, + "passwordStrengthScore": { + "message": "Password strength score $SCORE$", + "placeholders": { + "score": { + "content": "$1", + "example": "4" + } + } + }, "twoStepLoginPolicyTitle": { "message": "Kräv tvåstegsverifiering" }, @@ -5653,6 +5696,12 @@ "webAuthnAuthenticate": { "message": "Autentisera WebAuthn" }, + "readSecurityKey": { + "message": "Read security key" + }, + "awaitingSecurityKeyInteraction": { + "message": "Awaiting security key interaction..." + }, "webAuthnNotSupported": { "message": "WebAuthn stöds inte i denna webbläsare." }, @@ -7199,6 +7248,12 @@ "duoRequiredByOrgForAccount": { "message": "Duo two-step login is required for your account." }, + "duoTwoFactorRequiredPageSubtitle": { + "message": "Duo two-step login is required for your account. Follow the steps below to finish logging in." + }, + "followTheStepsBelowToFinishLoggingIn": { + "message": "Follow the steps below to finish logging in." + }, "launchDuo": { "message": "Starta Duo" }, @@ -10437,5 +10492,23 @@ }, "removeUnlockWithPinPolicyDesc": { "message": "Do not allow members to unlock their account with a PIN." + }, + "limitedEventLogs": { + "message": "$PRODUCT_TYPE$ plans do not have access to real event logs", + "placeholders": { + "product_type": { + "content": "$1", + "example": "Teams" + } + } + }, + "upgradeForFullEvents": { + "message": "Get full access to organization event logs by upgrading to a Teams or Enterprise plan." + }, + "upgradeEventLogTitle": { + "message": "Upgrade for real event log data" + }, + "upgradeEventLogMessage": { + "message": "These events are examples only and do not reflect real events within your Bitwarden organization." } } diff --git a/apps/web/src/locales/te/messages.json b/apps/web/src/locales/te/messages.json index 1c4e2e55201..aed10e3ad71 100644 --- a/apps/web/src/locales/te/messages.json +++ b/apps/web/src/locales/te/messages.json @@ -5,6 +5,9 @@ "criticalApplications": { "message": "Critical applications" }, + "noCriticalAppsAtRisk": { + "message": "No critical applications at risk" + }, "accessIntelligence": { "message": "Access Intelligence" }, @@ -1161,6 +1164,15 @@ "logInToBitwarden": { "message": "Log in to Bitwarden" }, + "enterTheCodeSentToYourEmail": { + "message": "Enter the code sent to your email" + }, + "enterTheCodeFromYourAuthenticatorApp": { + "message": "Enter the code from your authenticator app" + }, + "pressYourYubiKeyToAuthenticate": { + "message": "Press your YubiKey to authenticate" + }, "authenticationTimeout": { "message": "Authentication timeout" }, @@ -1443,12 +1455,22 @@ "rememberMe": { "message": "Remember me" }, + "dontAskAgainOnThisDeviceFor30Days": { + "message": "Don't ask again on this device for 30 days" + }, "sendVerificationCodeEmailAgain": { "message": "Send verification code email again" }, "useAnotherTwoStepMethod": { "message": "Use another two-step login method" }, + "selectAnotherMethod": { + "message": "Select another method", + "description": "Select another two-step login method" + }, + "useYourRecoveryCode": { + "message": "Use your recovery code" + }, "insertYubiKey": { "message": "Insert your YubiKey into your computer's USB port, then touch its button." }, @@ -1467,6 +1489,9 @@ "twoStepOptions": { "message": "Two-step login options" }, + "selectTwoStepLoginMethod": { + "message": "Select two-step login method" + }, "recoveryCodeDesc": { "message": "Lost access to all of your two-step login providers? Use your recovery code to turn off all two-step login providers from your account." }, @@ -1509,6 +1534,9 @@ "webAuthnMigrated": { "message": "(Migrated from FIDO)" }, + "openInNewTab": { + "message": "Open in new tab" + }, "emailTitle": { "message": "Email" }, @@ -4081,6 +4109,12 @@ "updateBrowserDesc": { "message": "You are using an unsupported web browser. The web vault may not function properly." }, + "youHaveAPendingLoginRequest": { + "message": "You have a pending login request from another device." + }, + "reviewLoginRequest": { + "message": "Review login request" + }, "freeTrialEndPromptCount": { "message": "Your free trial ends in $COUNT$ days.", "placeholders": { @@ -4758,6 +4792,15 @@ "masterPassPolicyDesc": { "message": "Set requirements for master password strength." }, + "passwordStrengthScore": { + "message": "Password strength score $SCORE$", + "placeholders": { + "score": { + "content": "$1", + "example": "4" + } + } + }, "twoStepLoginPolicyTitle": { "message": "Require two-step login" }, @@ -5653,6 +5696,12 @@ "webAuthnAuthenticate": { "message": "Authenticate WebAuthn" }, + "readSecurityKey": { + "message": "Read security key" + }, + "awaitingSecurityKeyInteraction": { + "message": "Awaiting security key interaction..." + }, "webAuthnNotSupported": { "message": "WebAuthn is not supported in this browser." }, @@ -7199,6 +7248,12 @@ "duoRequiredByOrgForAccount": { "message": "Duo two-step login is required for your account." }, + "duoTwoFactorRequiredPageSubtitle": { + "message": "Duo two-step login is required for your account. Follow the steps below to finish logging in." + }, + "followTheStepsBelowToFinishLoggingIn": { + "message": "Follow the steps below to finish logging in." + }, "launchDuo": { "message": "Launch Duo" }, @@ -10437,5 +10492,23 @@ }, "removeUnlockWithPinPolicyDesc": { "message": "Do not allow members to unlock their account with a PIN." + }, + "limitedEventLogs": { + "message": "$PRODUCT_TYPE$ plans do not have access to real event logs", + "placeholders": { + "product_type": { + "content": "$1", + "example": "Teams" + } + } + }, + "upgradeForFullEvents": { + "message": "Get full access to organization event logs by upgrading to a Teams or Enterprise plan." + }, + "upgradeEventLogTitle": { + "message": "Upgrade for real event log data" + }, + "upgradeEventLogMessage": { + "message": "These events are examples only and do not reflect real events within your Bitwarden organization." } } diff --git a/apps/web/src/locales/th/messages.json b/apps/web/src/locales/th/messages.json index d78b2e863de..f6bb3f7005a 100644 --- a/apps/web/src/locales/th/messages.json +++ b/apps/web/src/locales/th/messages.json @@ -5,6 +5,9 @@ "criticalApplications": { "message": "Critical applications" }, + "noCriticalAppsAtRisk": { + "message": "No critical applications at risk" + }, "accessIntelligence": { "message": "Access Intelligence" }, @@ -1161,6 +1164,15 @@ "logInToBitwarden": { "message": "Log in to Bitwarden" }, + "enterTheCodeSentToYourEmail": { + "message": "Enter the code sent to your email" + }, + "enterTheCodeFromYourAuthenticatorApp": { + "message": "Enter the code from your authenticator app" + }, + "pressYourYubiKeyToAuthenticate": { + "message": "Press your YubiKey to authenticate" + }, "authenticationTimeout": { "message": "Authentication timeout" }, @@ -1443,12 +1455,22 @@ "rememberMe": { "message": "จำการเข้าระบบของฉันไว้" }, + "dontAskAgainOnThisDeviceFor30Days": { + "message": "Don't ask again on this device for 30 days" + }, "sendVerificationCodeEmailAgain": { "message": "ส่งรหัสยืนยันไปยังอีเมลอีกครั้ง" }, "useAnotherTwoStepMethod": { "message": "ใช้วิธีลงชื่อเข้าใช้แบบสองขั้นตอนวิธีอื่น" }, + "selectAnotherMethod": { + "message": "Select another method", + "description": "Select another two-step login method" + }, + "useYourRecoveryCode": { + "message": "Use your recovery code" + }, "insertYubiKey": { "message": "Insert your YubiKey into your computer's USB port, then touch its button." }, @@ -1467,6 +1489,9 @@ "twoStepOptions": { "message": "ตัวเลือกการเข้าสู่ระบบแบบสองขั้นตอน" }, + "selectTwoStepLoginMethod": { + "message": "Select two-step login method" + }, "recoveryCodeDesc": { "message": "Lost access to all of your two-step login providers? Use your recovery code to turn off all two-step login providers from your account." }, @@ -1509,6 +1534,9 @@ "webAuthnMigrated": { "message": "(Migrated from FIDO)" }, + "openInNewTab": { + "message": "Open in new tab" + }, "emailTitle": { "message": "อีเมล" }, @@ -4081,6 +4109,12 @@ "updateBrowserDesc": { "message": "You are using an unsupported web browser. The web vault may not function properly." }, + "youHaveAPendingLoginRequest": { + "message": "You have a pending login request from another device." + }, + "reviewLoginRequest": { + "message": "Review login request" + }, "freeTrialEndPromptCount": { "message": "Your free trial ends in $COUNT$ days.", "placeholders": { @@ -4758,6 +4792,15 @@ "masterPassPolicyDesc": { "message": "Set requirements for master password strength." }, + "passwordStrengthScore": { + "message": "Password strength score $SCORE$", + "placeholders": { + "score": { + "content": "$1", + "example": "4" + } + } + }, "twoStepLoginPolicyTitle": { "message": "Require two-step login" }, @@ -5653,6 +5696,12 @@ "webAuthnAuthenticate": { "message": "Authenticate WebAuthn" }, + "readSecurityKey": { + "message": "Read security key" + }, + "awaitingSecurityKeyInteraction": { + "message": "Awaiting security key interaction..." + }, "webAuthnNotSupported": { "message": "WebAuthn is not supported in this browser." }, @@ -7199,6 +7248,12 @@ "duoRequiredByOrgForAccount": { "message": "Duo two-step login is required for your account." }, + "duoTwoFactorRequiredPageSubtitle": { + "message": "Duo two-step login is required for your account. Follow the steps below to finish logging in." + }, + "followTheStepsBelowToFinishLoggingIn": { + "message": "Follow the steps below to finish logging in." + }, "launchDuo": { "message": "Launch Duo" }, @@ -10437,5 +10492,23 @@ }, "removeUnlockWithPinPolicyDesc": { "message": "Do not allow members to unlock their account with a PIN." + }, + "limitedEventLogs": { + "message": "$PRODUCT_TYPE$ plans do not have access to real event logs", + "placeholders": { + "product_type": { + "content": "$1", + "example": "Teams" + } + } + }, + "upgradeForFullEvents": { + "message": "Get full access to organization event logs by upgrading to a Teams or Enterprise plan." + }, + "upgradeEventLogTitle": { + "message": "Upgrade for real event log data" + }, + "upgradeEventLogMessage": { + "message": "These events are examples only and do not reflect real events within your Bitwarden organization." } } diff --git a/apps/web/src/locales/tr/messages.json b/apps/web/src/locales/tr/messages.json index 94c9633e225..3502742bc02 100644 --- a/apps/web/src/locales/tr/messages.json +++ b/apps/web/src/locales/tr/messages.json @@ -5,6 +5,9 @@ "criticalApplications": { "message": "Kritik uygulamalar" }, + "noCriticalAppsAtRisk": { + "message": "No critical applications at risk" + }, "accessIntelligence": { "message": "Access Intelligence" }, @@ -1161,6 +1164,15 @@ "logInToBitwarden": { "message": "Log in to Bitwarden" }, + "enterTheCodeSentToYourEmail": { + "message": "E-posta adresinize gönderilen kodu girin" + }, + "enterTheCodeFromYourAuthenticatorApp": { + "message": "Kimlik doğrulama uygulamanızdaki kodu girin" + }, + "pressYourYubiKeyToAuthenticate": { + "message": "Press your YubiKey to authenticate" + }, "authenticationTimeout": { "message": "Authentication timeout" }, @@ -1443,12 +1455,22 @@ "rememberMe": { "message": "Beni hatırla" }, + "dontAskAgainOnThisDeviceFor30Days": { + "message": "Don't ask again on this device for 30 days" + }, "sendVerificationCodeEmailAgain": { "message": "Doğrulama kodu e-postasını yeniden gönder" }, "useAnotherTwoStepMethod": { "message": "Başka bir iki aşamalı giriş yöntemini kullan" }, + "selectAnotherMethod": { + "message": "Select another method", + "description": "Select another two-step login method" + }, + "useYourRecoveryCode": { + "message": "Use your recovery code" + }, "insertYubiKey": { "message": "YubiKey'inizi bilgisayarınızın USB portuna takın, ardından düğmesine dokunun." }, @@ -1467,6 +1489,9 @@ "twoStepOptions": { "message": "İki aşamalı giriş seçenekleri" }, + "selectTwoStepLoginMethod": { + "message": "Select two-step login method" + }, "recoveryCodeDesc": { "message": "İki aşamalı giriş sağlayıcılarınıza ulaşamıyor musunuz? Kurtarma kodunuzu kullanarak hesabınızdaki tüm iki aşamalı giriş sağlayıcılarını devre dışı bırakabilirsiniz." }, @@ -1509,6 +1534,9 @@ "webAuthnMigrated": { "message": "(FIDO'dan taşındı)" }, + "openInNewTab": { + "message": "Yeni sekmede aç" + }, "emailTitle": { "message": "E-posta" }, @@ -4081,6 +4109,12 @@ "updateBrowserDesc": { "message": "Desteklenmeyen bir web tarayıcısı kullanıyorsunuz. Web kasası düzgün çalışmayabilir." }, + "youHaveAPendingLoginRequest": { + "message": "You have a pending login request from another device." + }, + "reviewLoginRequest": { + "message": "Review login request" + }, "freeTrialEndPromptCount": { "message": "Your free trial ends in $COUNT$ days.", "placeholders": { @@ -4758,6 +4792,15 @@ "masterPassPolicyDesc": { "message": "Ana parola gücü gereksinimlerini ayarlayın." }, + "passwordStrengthScore": { + "message": "Password strength score $SCORE$", + "placeholders": { + "score": { + "content": "$1", + "example": "4" + } + } + }, "twoStepLoginPolicyTitle": { "message": "İki adımlı girişi zorunlu tut" }, @@ -5653,6 +5696,12 @@ "webAuthnAuthenticate": { "message": "WebAutn ile doğrula" }, + "readSecurityKey": { + "message": "Read security key" + }, + "awaitingSecurityKeyInteraction": { + "message": "Awaiting security key interaction..." + }, "webAuthnNotSupported": { "message": "WebAuthn bu tarayıcıda desteklenmiyor." }, @@ -7199,6 +7248,12 @@ "duoRequiredByOrgForAccount": { "message": "Hesabınız için Duo iki adımlı giriş gereklidir." }, + "duoTwoFactorRequiredPageSubtitle": { + "message": "Duo two-step login is required for your account. Follow the steps below to finish logging in." + }, + "followTheStepsBelowToFinishLoggingIn": { + "message": "Follow the steps below to finish logging in." + }, "launchDuo": { "message": "Duo'yu başlat" }, @@ -10437,5 +10492,23 @@ }, "removeUnlockWithPinPolicyDesc": { "message": "Do not allow members to unlock their account with a PIN." + }, + "limitedEventLogs": { + "message": "$PRODUCT_TYPE$ plans do not have access to real event logs", + "placeholders": { + "product_type": { + "content": "$1", + "example": "Teams" + } + } + }, + "upgradeForFullEvents": { + "message": "Get full access to organization event logs by upgrading to a Teams or Enterprise plan." + }, + "upgradeEventLogTitle": { + "message": "Upgrade for real event log data" + }, + "upgradeEventLogMessage": { + "message": "These events are examples only and do not reflect real events within your Bitwarden organization." } } diff --git a/apps/web/src/locales/uk/messages.json b/apps/web/src/locales/uk/messages.json index 85f9cfafab1..c963b69547c 100644 --- a/apps/web/src/locales/uk/messages.json +++ b/apps/web/src/locales/uk/messages.json @@ -5,6 +5,9 @@ "criticalApplications": { "message": "Критичні програми" }, + "noCriticalAppsAtRisk": { + "message": "No critical applications at risk" + }, "accessIntelligence": { "message": "Управління доступом" }, @@ -1161,6 +1164,15 @@ "logInToBitwarden": { "message": "Увійти в Bitwarden" }, + "enterTheCodeSentToYourEmail": { + "message": "Enter the code sent to your email" + }, + "enterTheCodeFromYourAuthenticatorApp": { + "message": "Enter the code from your authenticator app" + }, + "pressYourYubiKeyToAuthenticate": { + "message": "Press your YubiKey to authenticate" + }, "authenticationTimeout": { "message": "Час очікування автентифікації" }, @@ -1443,12 +1455,22 @@ "rememberMe": { "message": "Запам'ятати мене" }, + "dontAskAgainOnThisDeviceFor30Days": { + "message": "Don't ask again on this device for 30 days" + }, "sendVerificationCodeEmailAgain": { "message": "Надіслати код підтвердження ще раз" }, "useAnotherTwoStepMethod": { "message": "Інший спосіб двоетапної перевірки" }, + "selectAnotherMethod": { + "message": "Select another method", + "description": "Select another two-step login method" + }, + "useYourRecoveryCode": { + "message": "Use your recovery code" + }, "insertYubiKey": { "message": "Вставте свій YubiKey в USB порт комп'ютера, потім торкніться цієї кнопки." }, @@ -1467,6 +1489,9 @@ "twoStepOptions": { "message": "Налаштування двоетапної перевірки" }, + "selectTwoStepLoginMethod": { + "message": "Select two-step login method" + }, "recoveryCodeDesc": { "message": "Втратили доступ до всіх провайдерів двоетапної перевірки? Скористайтеся кодом відновлення, щоб вимкнути двоетапну перевірку для свого облікового запису." }, @@ -1509,6 +1534,9 @@ "webAuthnMigrated": { "message": "(Перенесено з FIDO)" }, + "openInNewTab": { + "message": "Open in new tab" + }, "emailTitle": { "message": "Е-пошта" }, @@ -4081,6 +4109,12 @@ "updateBrowserDesc": { "message": "Ви використовуєте непідтримуваний браузер. Вебсховище може працювати неправильно." }, + "youHaveAPendingLoginRequest": { + "message": "You have a pending login request from another device." + }, + "reviewLoginRequest": { + "message": "Review login request" + }, "freeTrialEndPromptCount": { "message": "Ваш безплатний пробний період завершується через $COUNT$ днів.", "placeholders": { @@ -4758,6 +4792,15 @@ "masterPassPolicyDesc": { "message": "Встановіть вимоги надійності головного пароля." }, + "passwordStrengthScore": { + "message": "Password strength score $SCORE$", + "placeholders": { + "score": { + "content": "$1", + "example": "4" + } + } + }, "twoStepLoginPolicyTitle": { "message": "Вимагати двоетапну перевірку" }, @@ -5653,6 +5696,12 @@ "webAuthnAuthenticate": { "message": "Автентифікація WebAuthn" }, + "readSecurityKey": { + "message": "Read security key" + }, + "awaitingSecurityKeyInteraction": { + "message": "Awaiting security key interaction..." + }, "webAuthnNotSupported": { "message": "WebAuthn не підтримується в цьому браузері." }, @@ -7199,6 +7248,12 @@ "duoRequiredByOrgForAccount": { "message": "Для вашого облікового запису необхідна двоетапна перевірка з Duo." }, + "duoTwoFactorRequiredPageSubtitle": { + "message": "Duo two-step login is required for your account. Follow the steps below to finish logging in." + }, + "followTheStepsBelowToFinishLoggingIn": { + "message": "Follow the steps below to finish logging in." + }, "launchDuo": { "message": "Запустити Duo" }, @@ -10437,5 +10492,23 @@ }, "removeUnlockWithPinPolicyDesc": { "message": "Do not allow members to unlock their account with a PIN." + }, + "limitedEventLogs": { + "message": "$PRODUCT_TYPE$ plans do not have access to real event logs", + "placeholders": { + "product_type": { + "content": "$1", + "example": "Teams" + } + } + }, + "upgradeForFullEvents": { + "message": "Get full access to organization event logs by upgrading to a Teams or Enterprise plan." + }, + "upgradeEventLogTitle": { + "message": "Upgrade for real event log data" + }, + "upgradeEventLogMessage": { + "message": "These events are examples only and do not reflect real events within your Bitwarden organization." } } diff --git a/apps/web/src/locales/vi/messages.json b/apps/web/src/locales/vi/messages.json index e1d5e54b550..53a215d2ded 100644 --- a/apps/web/src/locales/vi/messages.json +++ b/apps/web/src/locales/vi/messages.json @@ -5,6 +5,9 @@ "criticalApplications": { "message": "Critical applications" }, + "noCriticalAppsAtRisk": { + "message": "No critical applications at risk" + }, "accessIntelligence": { "message": "Access Intelligence" }, @@ -1161,6 +1164,15 @@ "logInToBitwarden": { "message": "Log in to Bitwarden" }, + "enterTheCodeSentToYourEmail": { + "message": "Enter the code sent to your email" + }, + "enterTheCodeFromYourAuthenticatorApp": { + "message": "Enter the code from your authenticator app" + }, + "pressYourYubiKeyToAuthenticate": { + "message": "Press your YubiKey to authenticate" + }, "authenticationTimeout": { "message": "Authentication timeout" }, @@ -1443,12 +1455,22 @@ "rememberMe": { "message": "Ghi nhớ đăng nhập" }, + "dontAskAgainOnThisDeviceFor30Days": { + "message": "Don't ask again on this device for 30 days" + }, "sendVerificationCodeEmailAgain": { "message": "Gửi lại email xác minh" }, "useAnotherTwoStepMethod": { "message": "Dùng phương pháp xác mnih hai bước khác" }, + "selectAnotherMethod": { + "message": "Select another method", + "description": "Select another two-step login method" + }, + "useYourRecoveryCode": { + "message": "Use your recovery code" + }, "insertYubiKey": { "message": "Cắm YubiKey vào cổng USB trên máy tính bạn và bấm nút trên Yubikey." }, @@ -1467,6 +1489,9 @@ "twoStepOptions": { "message": "Tùy chọn xác minh hai bước" }, + "selectTwoStepLoginMethod": { + "message": "Select two-step login method" + }, "recoveryCodeDesc": { "message": "Bạn bị mất quyền truy cập vào tất cả các dịch vụ xác minh hai bước? Sử dụng mã phục hồi của bạn để tắt chúng trên tài khoản bạn." }, @@ -1509,6 +1534,9 @@ "webAuthnMigrated": { "message": "(Migrated from FIDO)" }, + "openInNewTab": { + "message": "Open in new tab" + }, "emailTitle": { "message": "Email" }, @@ -4081,6 +4109,12 @@ "updateBrowserDesc": { "message": "You are using an unsupported web browser. The web vault may not function properly." }, + "youHaveAPendingLoginRequest": { + "message": "You have a pending login request from another device." + }, + "reviewLoginRequest": { + "message": "Review login request" + }, "freeTrialEndPromptCount": { "message": "Your free trial ends in $COUNT$ days.", "placeholders": { @@ -4758,6 +4792,15 @@ "masterPassPolicyDesc": { "message": "Set requirements for master password strength." }, + "passwordStrengthScore": { + "message": "Password strength score $SCORE$", + "placeholders": { + "score": { + "content": "$1", + "example": "4" + } + } + }, "twoStepLoginPolicyTitle": { "message": "Require two-step login" }, @@ -5653,6 +5696,12 @@ "webAuthnAuthenticate": { "message": "Authenticate WebAuthn" }, + "readSecurityKey": { + "message": "Read security key" + }, + "awaitingSecurityKeyInteraction": { + "message": "Awaiting security key interaction..." + }, "webAuthnNotSupported": { "message": "WebAuthn is not supported in this browser." }, @@ -7199,6 +7248,12 @@ "duoRequiredByOrgForAccount": { "message": "Duo two-step login is required for your account." }, + "duoTwoFactorRequiredPageSubtitle": { + "message": "Duo two-step login is required for your account. Follow the steps below to finish logging in." + }, + "followTheStepsBelowToFinishLoggingIn": { + "message": "Follow the steps below to finish logging in." + }, "launchDuo": { "message": "Launch Duo" }, @@ -10437,5 +10492,23 @@ }, "removeUnlockWithPinPolicyDesc": { "message": "Do not allow members to unlock their account with a PIN." + }, + "limitedEventLogs": { + "message": "$PRODUCT_TYPE$ plans do not have access to real event logs", + "placeholders": { + "product_type": { + "content": "$1", + "example": "Teams" + } + } + }, + "upgradeForFullEvents": { + "message": "Get full access to organization event logs by upgrading to a Teams or Enterprise plan." + }, + "upgradeEventLogTitle": { + "message": "Upgrade for real event log data" + }, + "upgradeEventLogMessage": { + "message": "These events are examples only and do not reflect real events within your Bitwarden organization." } } diff --git a/apps/web/src/locales/zh_CN/messages.json b/apps/web/src/locales/zh_CN/messages.json index 616bdd68360..8d73dbd72e6 100644 --- a/apps/web/src/locales/zh_CN/messages.json +++ b/apps/web/src/locales/zh_CN/messages.json @@ -5,6 +5,9 @@ "criticalApplications": { "message": "关键应用程序" }, + "noCriticalAppsAtRisk": { + "message": "没有关键应用程序存在风险" + }, "accessIntelligence": { "message": "Access Intelligence" }, @@ -15,7 +18,7 @@ "message": "密码风险" }, "reviewAtRiskPasswords": { - "message": "跨应用程序审查有风险的密码(弱密码、暴露的密码或重复使用的密码)。选择最关键的应用程序,优先为用户采取安全措施,以解决密码风险问题。" + "message": "审查各个应用程序中存在风险的密码(弱、暴露或重复使用)。选择最关键的应用程序,优先为用户采取安全措施,以解决存在风险的密码问题。" }, "dataLastUpdated": { "message": "数据最后更新于:$DATE$", @@ -78,13 +81,13 @@ } }, "noAppsInOrgDescription": { - "message": "当用户保存登录信息时,应用程序会出现在这里,显示所有有风险的密码。标记关键应用程序并通知用户更新密码。" + "message": "当用户保存登录信息时,应用程序会出现在这里,显示所有存在风险的密码。标记关键应用程序并通知用户更新密码。" }, "noCriticalAppsTitle": { "message": "您未将任何应用程序标记为关键" }, "noCriticalAppsDescription": { - "message": "选择最关键的应用程序来发现有风险的密码,并通知用户更改这些密码。" + "message": "选择最关键的应用程序来发现存在风险的密码,并通知用户更改这些密码。" }, "markCriticalApps": { "message": "标记关键应用程序" @@ -99,7 +102,7 @@ "message": "应用程序" }, "atRiskPasswords": { - "message": "有风险的密码" + "message": "存在风险的密码" }, "requestPasswordChange": { "message": "请求更改密码" @@ -111,10 +114,10 @@ "message": "搜索应用程序" }, "atRiskMembers": { - "message": "有风险的成员" + "message": "存在风险的成员" }, "atRiskMembersWithCount": { - "message": "有风险的成员 ($COUNT$)", + "message": "存在风险的成员 ($COUNT$)", "placeholders": { "count": { "content": "$1", @@ -123,7 +126,7 @@ } }, "atRiskApplicationsWithCount": { - "message": "有风险的应用程序 ($COUNT$)", + "message": "存在风险的应用程序 ($COUNT$)", "placeholders": { "count": { "content": "$1", @@ -150,7 +153,7 @@ "message": "总的成员" }, "atRiskApplications": { - "message": "有风险的应用程序" + "message": "存在风险的应用程序" }, "totalApplications": { "message": "总的应用程序" @@ -474,10 +477,10 @@ "message": "通过在父文件夹名后面添加「/」来嵌套文件夹。示例:Social/Forums" }, "deleteFolderPermanently": { - "message": "您确定要永久删除这个文件夹吗?" + "message": "确定要永久删除这个文件夹吗?" }, "baseDomain": { - "message": "基础域", + "message": "基础域名", "description": "Domain name. Example: website.com" }, "domainName": { @@ -1132,10 +1135,10 @@ "message": "如果所有通行密钥被移除,不使用主密码您将无法登录新的设备。" }, "passkeyLimitReachedInfo": { - "message": "通行密钥已达上限。移除一个通行密钥以添加另一个。" + "message": "已达到通行密钥上限。请移除一个通行密钥后再添加其他通行密钥。" }, "tryAgain": { - "message": "请重试" + "message": "重试" }, "createAccount": { "message": "创建账户" @@ -1161,6 +1164,15 @@ "logInToBitwarden": { "message": "登录到 Bitwarden" }, + "enterTheCodeSentToYourEmail": { + "message": "输入发送到您的电子邮箱的代码" + }, + "enterTheCodeFromYourAuthenticatorApp": { + "message": "输入来自您的验证器 App 的代码" + }, + "pressYourYubiKeyToAuthenticate": { + "message": "按下 YubiKey 以验证身份" + }, "authenticationTimeout": { "message": "身份验证超时" }, @@ -1443,17 +1455,27 @@ "rememberMe": { "message": "记住我" }, + "dontAskAgainOnThisDeviceFor30Days": { + "message": "30 天内在此设备上不再询问" + }, "sendVerificationCodeEmailAgain": { "message": "再次发送验证码电子邮件" }, "useAnotherTwoStepMethod": { "message": "使用其他两步登录方式" }, + "selectAnotherMethod": { + "message": "选择其他方式", + "description": "Select another two-step login method" + }, + "useYourRecoveryCode": { + "message": "使用您的恢复代码" + }, "insertYubiKey": { "message": "将您的 YubiKey 插入计算机的 USB 端口,然后触摸其按钮。" }, "insertU2f": { - "message": "将您的安全钥匙插入计算机的 USB 端口。如果它有按钮,请触摸它。" + "message": "将您的安全密钥插入计算机的 USB 端口。如果它有按钮,请触摸它。" }, "loginUnavailable": { "message": "登录不可用" @@ -1462,11 +1484,14 @@ "message": "此账户已启用两步登录,但此浏览器不支持任何已配置的两步登录提供程序。" }, "noTwoStepProviders2": { - "message": "请使用支持的网页浏览器(例如 Chrome)和/或添加其他支持更广泛的提供程序(例如验证器 App)。" + "message": "请使用受支持的网页浏览器(例如 Chrome),和/或添加其他跨网页浏览器支持更好的提供程序(例如验证器 App)。" }, "twoStepOptions": { "message": "两步登录选项" }, + "selectTwoStepLoginMethod": { + "message": "选择两步登录方式" + }, "recoveryCodeDesc": { "message": "失去对您所有的双重身份验证设备的访问?请使用您的恢复代码来关闭您账户中所有的两步登录提供程序。" }, @@ -1481,7 +1506,7 @@ "description": "'Bitwarden Authenticator' is a product name and should not be translated." }, "yubiKeyTitleV2": { - "message": "Yubico OTP 安全钥匙" + "message": "Yubico OTP 安全密钥" }, "yubiKeyDesc": { "message": "使用 YubiKey 4、5 或 NEO 设备。" @@ -1491,24 +1516,27 @@ "description": "'Duo Security' and 'Duo Mobile' are product names and should not be translated." }, "duoOrganizationDesc": { - "message": "为您的组织使用 Duo Security 的 Duo 移动 App、短信、电话或 U2F 安全钥匙来进行验证。", + "message": "为您的组织使用 Duo Security 的 Duo 移动 App、短信、电话或 U2F 安全密钥来进行验证。", "description": "'Duo Security' and 'Duo Mobile' are product names and should not be translated." }, "u2fDesc": { - "message": "使用任何 FIDO U2F 兼容的安全钥匙访问您的账户。" + "message": "使用任何 FIDO U2F 兼容的安全密钥访问您的账户。" }, "u2fTitle": { - "message": "FIDO U2F 安全钥匙" + "message": "FIDO U2F 安全密钥" }, "webAuthnTitle": { "message": "通行密钥" }, "webAuthnDesc": { - "message": "使用您设备的生物识别或 WebAuthn 兼容的安全钥匙。" + "message": "使用您设备的生物识别或 FIDO2 兼容的安全密钥。" }, "webAuthnMigrated": { "message": "(迁移自 FIDO)" }, + "openInNewTab": { + "message": "在新标签页中打开" + }, "emailTitle": { "message": "电子邮箱" }, @@ -2117,7 +2145,7 @@ "message": "自定义" }, "newCustomDomain": { - "message": "添加自定义域名" + "message": "新增自定义域名" }, "newCustomDomainDesc": { "message": "输入用逗号分隔的域名列表。只能输入「基础」域名,不要输入子域名。例如,输入「google.com」而不是「www.google.com」。您也可以输入「androidapp://package.name」以将 Android App 与其他网站域名关联。" @@ -2147,14 +2175,14 @@ "message": "为您的组织启用两步登录。" }, "twoStepLoginEnterpriseDescStart": { - "message": "要为成员实施 Bitwarden 两步登录选项,请使用 ", + "message": "要为成员强制实施 Bitwarden 两步登录选项,请使用 ", "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Enforce Bitwarden Two-step Login options for members by using the Two-step Login Policy.'" }, "twoStepLoginPolicy": { "message": "两步登录策略" }, "twoStepLoginOrganizationDuoDesc": { - "message": "要实施 Duo 方式的两步登录,请使用下面的选项。" + "message": "要强制实施 Duo 方式的两步登录,请使用下面的选项。" }, "twoStepLoginOrganizationSsoDesc": { "message": "如果您已设置或计划设置 SSO,两步登录可能已经通过您的身份提供程序强制实施了。" @@ -2324,7 +2352,7 @@ } }, "webAuthnkeyX": { - "message": "WebAuthn 钥匙 $INDEX$", + "message": "WebAuthn 密钥 $INDEX$", "placeholders": { "index": { "content": "$1", @@ -2336,7 +2364,7 @@ "message": "NFC 支持" }, "twoFactorYubikeySupportsNfc": { - "message": "我的一把钥匙支持 NFC。" + "message": "我的一把密钥支持 NFC。" }, "twoFactorYubikeySupportsNfcDesc": { "message": "如果您的某个 YubiKey 支持 NFC(例如 YubiKey NEO),移动设备在检测到 NFC 可用时将提示您。" @@ -2345,7 +2373,7 @@ "message": "YubiKey 已更新" }, "disableAllKeys": { - "message": "禁用全部钥匙" + "message": "禁用全部密钥" }, "twoFactorDuoDesc": { "message": "输入 Duo 管理面板提供的 Bitwarden 应用程序信息。" @@ -2372,28 +2400,28 @@ "message": "发送电子邮件" }, "twoFactorU2fAdd": { - "message": "添加一个 FIDO U2F 安全钥匙到您的帐户" + "message": "添加一个 FIDO U2F 安全密钥到您的账户" }, "removeU2fConfirmation": { - "message": "确认要删除此安全钥匙吗?" + "message": "确定要移除此安全密钥吗?" }, "twoFactorWebAuthnAdd": { - "message": "添加一个 WebAuthn 安全钥匙到您的账户" + "message": "添加一个 WebAuthn 安全密钥到您的账户" }, "readKey": { - "message": "读取钥匙" + "message": "读取密钥" }, "keyCompromised": { - "message": "密钥被破坏。" + "message": "密钥已损坏。" }, "twoFactorU2fGiveName": { - "message": "给安全钥匙起一个友好的名称来标识它。" + "message": "给安全密钥起一个友好的名称来标识它。" }, "twoFactorU2fPlugInReadKey": { - "message": "将安全钥匙插入计算机的 USB 端口,然后点击「读取钥匙」按钮。" + "message": "将安全密钥插入计算机的 USB 端口,然后点击「读取密钥」按钮。" }, "twoFactorU2fTouchButton": { - "message": "如果安全钥匙有按钮,请触摸它。" + "message": "如果安全密钥有按钮,请触摸它。" }, "twoFactorU2fSaveForm": { "message": "保存表单。" @@ -2405,13 +2433,13 @@ "message": "桌面/笔记本电脑上支持 U2F 的浏览器(开启了 FIDO U2F 的 Chrome、Opera、Vivaldi 或 Firefox)中的网页版密码库和浏览器扩展。" }, "twoFactorU2fWaiting": { - "message": "等待您触摸安全钥匙上的按钮" + "message": "等待您触摸安全密钥上的按钮" }, "twoFactorU2fClickSave": { - "message": "单击下面的「保存」按钮,以启用此安全钥匙用于两步登录。" + "message": "单击下面的「保存」按钮,以启用此安全密钥用于两步登录。" }, "twoFactorU2fProblemReadingTryAgain": { - "message": "读取安全钥匙时出现问题,请重试。" + "message": "读取安全密钥时出现问题。请重试。" }, "twoFactorWebAuthnWarning1": { "message": "由于平台限制,WebAuthn 不能在所有 Bitwarden 应用程序上使用。您应该启用另一个两步登录提供程序,以便在无法使用 WebAuthn 时可以访问您的账户。" @@ -2652,7 +2680,7 @@ "message": "泄漏报告于" }, "reportError": { - "message": "加载报告时发生错误,请重试。" + "message": "加载报告时发生错误。请重试" }, "billing": { "message": "计费" @@ -2745,7 +2773,7 @@ "message": "Bitwarden 家庭版计划。" }, "addons": { - "message": "附加" + "message": "插件" }, "premiumAccess": { "message": "高级会员" @@ -2857,7 +2885,7 @@ "message": "恢复订阅" }, "reinstateConfirmation": { - "message": "确定要移除待处理的取消请求并恢复订阅吗?" + "message": "确定要移除待取消的请求并恢复订阅吗?" }, "reinstated": { "message": "您的订阅已恢复。" @@ -3025,7 +3053,7 @@ "message": "必须验证您的账户电子邮箱地址。" }, "newOrganizationDesc": { - "message": "组织允许您与他人共享您的密码库的部分内容,以及管理特定实体(例如家族、小型团队或大型公司)的相关用户。" + "message": "组织允许您与他人共享您的密码库的部分内容,以及管理特定实体(例如家庭、小型团队或大型公司)的相关用户。" }, "generalInformation": { "message": "常规信息" @@ -3315,7 +3343,7 @@ } }, "removeUserConfirmation": { - "message": "确实要移除此用户吗?" + "message": "确定要移除此用户吗?" }, "removeOrgUserConfirmation": { "message": "移除成员后,他们将不再具有对组织数据的访问权限,并且此操作无法撤销。要将此成员添加回组织,必须再次邀请他们并加入。" @@ -4064,7 +4092,7 @@ "message": "电子邮箱已验证" }, "emailVerifiedFailed": { - "message": "无法验证您的电子邮箱。尝试发送新的验证电子邮件。" + "message": "无法验证您的电子邮箱。请尝试发送新的验证电子邮件。" }, "emailVerificationRequired": { "message": "需要验证电子邮箱" @@ -4081,6 +4109,12 @@ "updateBrowserDesc": { "message": "您使用的是不受支持的 Web 浏览器。网页密码库可能无法正常运行。" }, + "youHaveAPendingLoginRequest": { + "message": "您有一个来自其他设备的待处理登录请求。" + }, + "reviewLoginRequest": { + "message": "审查登录请求" + }, "freeTrialEndPromptCount": { "message": "您的免费试用将于 $COUNT$ 天后结束。", "placeholders": { @@ -4143,7 +4177,7 @@ } }, "joinOrganizationDesc": { - "message": "您已被邀请加入上面的组织。要接受邀请,您需要登录或者创建一个 Bitwarden 账户。" + "message": "您已被邀请加入上面的组织。要接受邀请,您需要登录或者创建一个新的 Bitwarden 账户。" }, "finishJoiningThisOrganizationBySettingAMasterPassword": { "message": "通过设置主密码完成加入此组织。" @@ -4488,7 +4522,7 @@ } }, "keyUpdateFoldersFailed": { - "message": "更新您的加密密钥时,无法解密您的文件夹。要继续更新,文件夹必须被删除。继续操作不会删除密码库项目。" + "message": "更新加密密钥时,无法解密您的文件夹。要继续更新,必须删除文件夹。继续操作不会删除任何密码库项目。" }, "keyUpdated": { "message": "密钥已更新" @@ -4500,7 +4534,7 @@ "message": "为了提高安全性,我们更改了加密方案。请在下方输入您的主密码以立即更新您的加密密钥。" }, "updateEncryptionKeyWarning": { - "message": "更新加密密钥后,您需要注销所有正在使用的 Bitwarden 应用程序(比如移动 App 或者浏览器扩展)后重新登录。注销或者重新登录(这将下载新的加密密钥)失败可能会导致数据损坏。我们会尝试自动为您注销,但是,可能会有所延迟。" + "message": "更新加密密钥后,您需要注销所有当前使用的 Bitwarden 应用程序(例如移动 App 或浏览器扩展)然后重新登录。注销或者重新登录(这将下载新的加密密钥)失败可能会导致数据损坏。我们会尝试自动为您注销,但可能会有所延迟。" }, "updateEncryptionKeyExportWarning": { "message": "您保存的任何已加密导出也将变为无效。" @@ -4758,6 +4792,15 @@ "masterPassPolicyDesc": { "message": "设置主密码强度要求。" }, + "passwordStrengthScore": { + "message": "密码强度评分 $SCORE$", + "placeholders": { + "score": { + "content": "$1", + "example": "4" + } + } + }, "twoStepLoginPolicyTitle": { "message": "要求两步登录" }, @@ -5018,7 +5061,7 @@ "message": "不是所有者或管理员并且已是其他组织的成员的组织成员将从您的组织中移除。" }, "singleOrgPolicyMemberWarning": { - "message": "不符合要求的成员将被置于撤销状态,直到他们离开所有其他组织。管理员可以豁免,达到要求后,管理员可以恢复他们的成员资格。" + "message": "不符合要求的成员将被置于已撤销状态,直到他们退出所有其他组织,管理员不受此约束。达到要求后,管理员可以恢复他们的成员资格。" }, "requireSso": { "message": "要求单点登录身份验证" @@ -5036,7 +5079,7 @@ "message": "单一组织策略未启用。" }, "requireSsoExemption": { - "message": "组织的所有者和管理员豁免此策略。" + "message": "组织的所有者和管理员不受此策略的约束。" }, "sendTypeFile": { "message": "文件" @@ -5045,7 +5088,7 @@ "message": "文本" }, "createSend": { - "message": "创建 Send", + "message": "新增 Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "editSend": { @@ -5132,7 +5175,7 @@ "message": "密码已移除" }, "removePasswordConfirmation": { - "message": "确定移除此密码?" + "message": "确定要移除此密码吗?" }, "hideEmail": { "message": "对接收者隐藏我的电子邮箱地址。" @@ -5189,7 +5232,7 @@ "message": "紧急访问" }, "emergencyAccessDesc": { - "message": "授予和管理可信联系人的紧急访问权限。可信联系人可以在紧急情况下请求获取查看或接管您账户的权限。查阅我们的帮助页面以了解更多关于零知识共享的工作原理和细节。" + "message": "授予和管理可信联系人的紧急访问权限。可信联系人可以在紧急情况下请求获取查看或接管您账户的权限。请访问我们的帮助页面,了解更多关于零知识共享的工作原理和细节。" }, "emergencyAccessOwnerWarning": { "message": "您是一个或多个组织的拥有者。如果您授予紧急联系人接管权限,他们在接管后可作为拥有者持有您的所有权限。" @@ -5334,7 +5377,7 @@ "message": "通过禁用个人密码库选项,要求成员将项目保存到组织。" }, "personalOwnershipExemption": { - "message": "组织的所有者和管理员豁免此策略。" + "message": "组织的所有者和管理员不受此策略的约束。" }, "personalOwnershipSubmitError": { "message": "由于某个企业策略,您不能将项目保存到您的个人密码库。将所有权选项更改为组织,并从可用的集合中选择。" @@ -5347,7 +5390,7 @@ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "disableSendExemption": { - "message": "可以管理组织策略的组织成员豁免此策略。" + "message": "可以管理组织策略的组织成员不受此策略的约束。" }, "sendDisabled": { "message": "Send 已禁用", @@ -5366,7 +5409,7 @@ "description": "'Sends' is a plural noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendOptionsExemption": { - "message": "可以管理组织策略的组织成员豁免此策略。" + "message": "可以管理组织策略的组织成员不受此策略的约束。" }, "disableHideEmail": { "message": "创建或编辑 Send 时,始终向接收者显示成员的电子邮箱地址。", @@ -5537,7 +5580,7 @@ "message": "集中管理机密。" }, "centralizeSecretsManagementDescription": { - "message": "在一个位置安全地存储和管理机密,以防止机密扩散到您的组织。" + "message": "在一个位置安全地存储和管理机密,防止机密在组织内扩散。" }, "preventSecretLeaks": { "message": "防止机密遭泄漏。" @@ -5653,6 +5696,12 @@ "webAuthnAuthenticate": { "message": "验证 WebAuthn" }, + "readSecurityKey": { + "message": "读取安全密钥" + }, + "awaitingSecurityKeyInteraction": { + "message": "等待安全密钥交互..." + }, "webAuthnNotSupported": { "message": "此浏览器不支持 WebAuthn。" }, @@ -6301,7 +6350,7 @@ "message": "输入您的个人电子邮箱以兑换 Bitwarden 家庭" }, "sponsoredFamiliesLeaveCopy": { - "message": "如果您移除邀请或邀请被赞助组织移除,您的家庭赞助将在下一个续费日到期。" + "message": "如果您移除邀请或您被从赞助组织中移除,您的家庭赞助将在下一个续费日到期。" }, "acceptBitwardenFamiliesHelp": { "message": "接受现有组织的邀请或创建一个新的家庭组织。" @@ -7199,6 +7248,12 @@ "duoRequiredByOrgForAccount": { "message": "您的账户要求使用 Duo 两步登录。" }, + "duoTwoFactorRequiredPageSubtitle": { + "message": "您的账户要求使用 Duo 两步登录。请按照以下步骤完成登录。" + }, + "followTheStepsBelowToFinishLoggingIn": { + "message": "按照以下步骤完成登录。" + }, "launchDuo": { "message": "启动 Duo" }, @@ -7697,7 +7752,7 @@ "message": "更新" }, "plusNMore": { - "message": "+ $QUANTITY$ 及更多", + "message": "还有 $QUANTITY$ 个", "placeholders": { "quantity": { "content": "$1", @@ -8395,7 +8450,7 @@ "description": "Used as a card title description on the set password page to explain why the user is there" }, "cardMetrics": { - "message": "总计 $TOTAL$", + "message": "满分 $TOTAL$", "placeholders": { "total": { "content": "$1", @@ -8828,7 +8883,7 @@ } }, "addAPaymentMethod": { - "message": "请添加一个付款方式。", + "message": "请添加一个付款方式", "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'To maintain your subscription for $ORG$, add a payment method'" }, "organizationInformation": { @@ -8852,7 +8907,7 @@ "description": "Used as a form field label for a select input on the offboarding survey." }, "anyOtherFeedback": { - "message": "您还有其他反馈信息要分享吗?", + "message": "您还有其他反馈意见要分享吗?", "description": "Used as a form field label for a textarea input on the offboarding survey." }, "missingFeatures": { @@ -9564,7 +9619,7 @@ "message": "确保成员具有对合适的凭据的访问权限,以及他们的账户是安全的。使用此报告获取包含会员访问权限和账户配置的 CSV 文件 。" }, "memberAccessReportPageDesc": { - "message": "审计组织成员在各个群组、集合和集合项目之间的访问权限。CSV 导出文件提供了每位成员的详细信息,包括集合权限和账户配置的相关信息。" + "message": "审计组织成员在群组、集合和集合项目中的访问权限。CSV 导出文件提供了每位成员的详细信息,包括集合权限和账户配置信息。" }, "memberAccessReportNoCollection": { "message": "(无集合)" @@ -10040,7 +10095,7 @@ "message": "最大文件大小为 500 MB" }, "permanentlyDeleteAttachmentConfirmation": { - "message": "您确定要永久删除此附件吗?" + "message": "确定要永久删除此附件吗?" }, "manageSubscriptionFromThe": { "message": "管理订阅,通过", @@ -10056,7 +10111,7 @@ "message": "声明域名将开启单一组织策略。" }, "single-org-revoked-user-warning": { - "message": "不符合要求的成员将被撤销。管理员可以在他们离开所有其他组织后恢复其成员资格。" + "message": "不符合要求的成员将被撤销。管理员可以在他们退出所有其他组织后恢复其成员资格。" }, "deleteOrganizationUser": { "message": "删除 $NAME$", @@ -10266,7 +10321,7 @@ } }, "updatedRevokeSponsorshipConfirmationForSentSponsorship": { - "message": "如果您移除 $EMAIL$,将无法兑换此家庭计划赞助,确定要继续吗?", + "message": "如果您移除 $EMAIL$,将无法兑换此家庭计划赞助。确定要继续吗?", "placeholders": { "email": { "content": "$1", @@ -10315,7 +10370,7 @@ "message": "已打开浏览器扩展" }, "openedExtensionViewAtRiskPasswords": { - "message": "成功打开 Bitwarden 浏览器扩展。您现在可以审查有风险的密码了。" + "message": "成功打开 Bitwarden 浏览器扩展。您现在可以审查存在风险的密码了。" }, "openExtensionManuallyPart1": { "message": "我们无法打开 Bitwarden 浏览器扩展。请从工具栏打开 Bitwarden 图标", @@ -10437,5 +10492,23 @@ }, "removeUnlockWithPinPolicyDesc": { "message": "不允许成员使用 PIN 码解锁他们的账户。" + }, + "limitedEventLogs": { + "message": "$PRODUCT_TYPE$ 计划无法访问真实的事件日志", + "placeholders": { + "product_type": { + "content": "$1", + "example": "Teams" + } + } + }, + "upgradeForFullEvents": { + "message": "升级到团队或企业计划,即可获得对组织事件日志的完整访问权限。" + }, + "upgradeEventLogTitle": { + "message": "升级以访问真实的事件日志数据" + }, + "upgradeEventLogMessage": { + "message": "这些事件仅为示例,并不反映您 Bitwarden 组织内的真实事件。" } } diff --git a/apps/web/src/locales/zh_TW/messages.json b/apps/web/src/locales/zh_TW/messages.json index 23dfe159033..caae6aebce6 100644 --- a/apps/web/src/locales/zh_TW/messages.json +++ b/apps/web/src/locales/zh_TW/messages.json @@ -5,6 +5,9 @@ "criticalApplications": { "message": "重要應用程式" }, + "noCriticalAppsAtRisk": { + "message": "No critical applications at risk" + }, "accessIntelligence": { "message": "存取資訊" }, @@ -1161,6 +1164,15 @@ "logInToBitwarden": { "message": "登入 Bitwarden" }, + "enterTheCodeSentToYourEmail": { + "message": "Enter the code sent to your email" + }, + "enterTheCodeFromYourAuthenticatorApp": { + "message": "Enter the code from your authenticator app" + }, + "pressYourYubiKeyToAuthenticate": { + "message": "Press your YubiKey to authenticate" + }, "authenticationTimeout": { "message": "驗證逾時" }, @@ -1443,12 +1455,22 @@ "rememberMe": { "message": "記住我" }, + "dontAskAgainOnThisDeviceFor30Days": { + "message": "Don't ask again on this device for 30 days" + }, "sendVerificationCodeEmailAgain": { "message": "再次傳送​​包含驗證碼的電子郵件" }, "useAnotherTwoStepMethod": { "message": "使用另一種兩步驟登入方法" }, + "selectAnotherMethod": { + "message": "Select another method", + "description": "Select another two-step login method" + }, + "useYourRecoveryCode": { + "message": "Use your recovery code" + }, "insertYubiKey": { "message": "將您的 YubiKey 插入電腦的 USB 連接埠,然後觸摸其按鈕。" }, @@ -1467,6 +1489,9 @@ "twoStepOptions": { "message": "兩步驟登入選項" }, + "selectTwoStepLoginMethod": { + "message": "Select two-step login method" + }, "recoveryCodeDesc": { "message": "無法使用任何兩步驟登入方式嗎?請使用您的復原碼停用所有兩步驟登入方式。" }, @@ -1509,6 +1534,9 @@ "webAuthnMigrated": { "message": "(遷移自 FIDO)" }, + "openInNewTab": { + "message": "Open in new tab" + }, "emailTitle": { "message": "電子郵件" }, @@ -4081,6 +4109,12 @@ "updateBrowserDesc": { "message": "未支援您使用的瀏覽器。網頁版密碼庫可能無法正常運作。" }, + "youHaveAPendingLoginRequest": { + "message": "You have a pending login request from another device." + }, + "reviewLoginRequest": { + "message": "Review login request" + }, "freeTrialEndPromptCount": { "message": "您的免費試用將於 $COUNT$ 天後結束。", "placeholders": { @@ -4758,6 +4792,15 @@ "masterPassPolicyDesc": { "message": "設定主密碼強度要求。" }, + "passwordStrengthScore": { + "message": "Password strength score $SCORE$", + "placeholders": { + "score": { + "content": "$1", + "example": "4" + } + } + }, "twoStepLoginPolicyTitle": { "message": "要求兩步驟登入" }, @@ -5653,6 +5696,12 @@ "webAuthnAuthenticate": { "message": "驗證 WebAuthn" }, + "readSecurityKey": { + "message": "Read security key" + }, + "awaitingSecurityKeyInteraction": { + "message": "Awaiting security key interaction..." + }, "webAuthnNotSupported": { "message": "此瀏覽器不支援 WebAuthn。" }, @@ -7199,6 +7248,12 @@ "duoRequiredByOrgForAccount": { "message": "Duo two-step login is required for your account." }, + "duoTwoFactorRequiredPageSubtitle": { + "message": "Duo two-step login is required for your account. Follow the steps below to finish logging in." + }, + "followTheStepsBelowToFinishLoggingIn": { + "message": "Follow the steps below to finish logging in." + }, "launchDuo": { "message": "啟動 Duo" }, @@ -10437,5 +10492,23 @@ }, "removeUnlockWithPinPolicyDesc": { "message": "Do not allow members to unlock their account with a PIN." + }, + "limitedEventLogs": { + "message": "$PRODUCT_TYPE$ plans do not have access to real event logs", + "placeholders": { + "product_type": { + "content": "$1", + "example": "Teams" + } + } + }, + "upgradeForFullEvents": { + "message": "Get full access to organization event logs by upgrading to a Teams or Enterprise plan." + }, + "upgradeEventLogTitle": { + "message": "Upgrade for real event log data" + }, + "upgradeEventLogMessage": { + "message": "These events are examples only and do not reflect real events within your Bitwarden organization." } } diff --git a/apps/web/src/polyfills.ts b/apps/web/src/polyfills.ts index 33af553f786..3971ed3207f 100644 --- a/apps/web/src/polyfills.ts +++ b/apps/web/src/polyfills.ts @@ -1,4 +1,5 @@ import "core-js/stable"; +import "core-js/proposals/explicit-resource-management"; import "zone.js"; if (process.env.NODE_ENV === "production") { diff --git a/bitwarden_license/bit-web/src/app/admin-console/policies/maximum-vault-timeout.component.ts b/bitwarden_license/bit-web/src/app/admin-console/policies/maximum-vault-timeout.component.ts index a0ad1cd3010..9d09ead800e 100644 --- a/bitwarden_license/bit-web/src/app/admin-console/policies/maximum-vault-timeout.component.ts +++ b/bitwarden_license/bit-web/src/app/admin-console/policies/maximum-vault-timeout.component.ts @@ -5,7 +5,7 @@ import { FormBuilder, FormControl } from "@angular/forms"; import { PolicyType } from "@bitwarden/common/admin-console/enums"; import { PolicyRequest } from "@bitwarden/common/admin-console/models/request/policy.request"; -import { VaultTimeoutAction } from "@bitwarden/common/enums/vault-timeout-action.enum"; +import { VaultTimeoutAction } from "@bitwarden/common/key-management/vault-timeout"; import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; import { BasePolicy, diff --git a/bitwarden_license/bit-web/src/app/tools/access-intelligence/critical-applications.component.html b/bitwarden_license/bit-web/src/app/tools/access-intelligence/critical-applications.component.html index 73b0af312b6..d9ad4dce0ff 100644 --- a/bitwarden_license/bit-web/src/app/tools/access-intelligence/critical-applications.component.html +++ b/bitwarden_license/bit-web/src/app/tools/access-intelligence/critical-applications.component.html @@ -37,7 +37,11 @@ (click)="requestPasswordChange()" > - {{ "requestPasswordChange" | i18n }} + {{ + enableRequestPasswordChange + ? ("requestPasswordChange" | i18n) + : ("noCriticalAppsAtRisk" | i18n) + }}

diff --git a/libs/angular/src/auth/guards/lock.guard.spec.ts b/libs/angular/src/auth/guards/lock.guard.spec.ts index d801ef0f8f9..1b09a415999 100644 --- a/libs/angular/src/auth/guards/lock.guard.spec.ts +++ b/libs/angular/src/auth/guards/lock.guard.spec.ts @@ -5,7 +5,6 @@ import { MockProxy, mock } from "jest-mock-extended"; import { BehaviorSubject, of } from "rxjs"; import { EmptyComponent } from "@bitwarden/angular/platform/guard/feature-flag.guard.spec"; -import { VaultTimeoutSettingsService } from "@bitwarden/common/abstractions/vault-timeout/vault-timeout-settings.service"; import { Account, AccountInfo, @@ -16,6 +15,7 @@ import { DeviceTrustServiceAbstraction } from "@bitwarden/common/auth/abstractio import { UserVerificationService } from "@bitwarden/common/auth/abstractions/user-verification/user-verification.service.abstraction"; import { AuthenticationStatus } from "@bitwarden/common/auth/enums/authentication-status"; import { ClientType } from "@bitwarden/common/enums"; +import { VaultTimeoutSettingsService } from "@bitwarden/common/key-management/vault-timeout"; import { MessagingService } from "@bitwarden/common/platform/abstractions/messaging.service"; import { PlatformUtilsService } from "@bitwarden/common/platform/abstractions/platform-utils.service"; import { UserId } from "@bitwarden/common/types/guid"; diff --git a/libs/angular/src/auth/guards/lock.guard.ts b/libs/angular/src/auth/guards/lock.guard.ts index 244e9935281..c7627442c69 100644 --- a/libs/angular/src/auth/guards/lock.guard.ts +++ b/libs/angular/src/auth/guards/lock.guard.ts @@ -7,13 +7,13 @@ import { } from "@angular/router"; import { firstValueFrom } from "rxjs"; -import { VaultTimeoutSettingsService } from "@bitwarden/common/abstractions/vault-timeout/vault-timeout-settings.service"; import { AccountService } from "@bitwarden/common/auth/abstractions/account.service"; import { AuthService } from "@bitwarden/common/auth/abstractions/auth.service"; import { DeviceTrustServiceAbstraction } from "@bitwarden/common/auth/abstractions/device-trust.service.abstraction"; import { UserVerificationService } from "@bitwarden/common/auth/abstractions/user-verification/user-verification.service.abstraction"; import { AuthenticationStatus } from "@bitwarden/common/auth/enums/authentication-status"; import { ClientType } from "@bitwarden/common/enums"; +import { VaultTimeoutSettingsService } from "@bitwarden/common/key-management/vault-timeout"; import { MessagingService } from "@bitwarden/common/platform/abstractions/messaging.service"; import { PlatformUtilsService } from "@bitwarden/common/platform/abstractions/platform-utils.service"; import { KeyService } from "@bitwarden/key-management"; diff --git a/libs/angular/src/services/injection-tokens.ts b/libs/angular/src/services/injection-tokens.ts index 2c740d5bb42..a63d862b0d8 100644 --- a/libs/angular/src/services/injection-tokens.ts +++ b/libs/angular/src/services/injection-tokens.ts @@ -4,6 +4,7 @@ import { Observable, Subject } from "rxjs"; import { LogoutReason } from "@bitwarden/auth/common"; import { ClientType } from "@bitwarden/common/enums"; +import { VaultTimeout } from "@bitwarden/common/key-management/vault-timeout"; import { RegionConfig } from "@bitwarden/common/platform/abstractions/environment.service"; import { AbstractStorageService, @@ -12,7 +13,6 @@ import { import { Theme } from "@bitwarden/common/platform/enums"; import { StateFactory } from "@bitwarden/common/platform/factories/state-factory"; import { Message } from "@bitwarden/common/platform/messaging"; -import { VaultTimeout } from "@bitwarden/common/types/vault-timeout.type"; import { SafeInjectionToken } from "@bitwarden/ui-common"; // Re-export the SafeInjectionToken from ui-common export { SafeInjectionToken } from "@bitwarden/ui-common"; diff --git a/libs/angular/src/services/jslib-services.module.ts b/libs/angular/src/services/jslib-services.module.ts index 10f3f32fb85..dc6c049101a 100644 --- a/libs/angular/src/services/jslib-services.module.ts +++ b/libs/angular/src/services/jslib-services.module.ts @@ -45,8 +45,6 @@ import { DefaultAuthRequestApiService, DefaultLoginSuccessHandlerService, LoginSuccessHandlerService, - PasswordLoginStrategy, - PasswordLoginStrategyData, LoginApprovalComponentServiceAbstraction, } from "@bitwarden/auth/common"; import { ApiService as ApiServiceAbstraction } from "@bitwarden/common/abstractions/api.service"; @@ -54,8 +52,6 @@ import { AuditService as AuditServiceAbstraction } from "@bitwarden/common/abstr import { EventCollectionService as EventCollectionServiceAbstraction } from "@bitwarden/common/abstractions/event/event-collection.service"; import { EventUploadService as EventUploadServiceAbstraction } from "@bitwarden/common/abstractions/event/event-upload.service"; import { SearchService as SearchServiceAbstraction } from "@bitwarden/common/abstractions/search.service"; -import { VaultTimeoutSettingsService as VaultTimeoutSettingsServiceAbstraction } from "@bitwarden/common/abstractions/vault-timeout/vault-timeout-settings.service"; -import { VaultTimeoutService as VaultTimeoutServiceAbstraction } from "@bitwarden/common/abstractions/vault-timeout/vault-timeout.service"; import { OrganizationApiServiceAbstraction } from "@bitwarden/common/admin-console/abstractions/organization/organization-api.service.abstraction"; import { InternalOrganizationServiceAbstraction, @@ -157,6 +153,12 @@ import { BulkEncryptService } from "@bitwarden/common/key-management/crypto/abst import { EncryptService } from "@bitwarden/common/key-management/crypto/abstractions/encrypt.service"; import { BulkEncryptServiceImplementation } from "@bitwarden/common/key-management/crypto/services/bulk-encrypt.service.implementation"; import { MultithreadEncryptServiceImplementation } from "@bitwarden/common/key-management/crypto/services/multithread-encrypt.service.implementation"; +import { + DefaultVaultTimeoutService, + DefaultVaultTimeoutSettingsService, + VaultTimeoutService, + VaultTimeoutSettingsService, +} from "@bitwarden/common/key-management/vault-timeout"; import { AppIdService as AppIdServiceAbstraction } from "@bitwarden/common/platform/abstractions/app-id.service"; import { BroadcasterService } from "@bitwarden/common/platform/abstractions/broadcaster.service"; import { ConfigApiServiceAbstraction } from "@bitwarden/common/platform/abstractions/config/config-api.service.abstraction"; @@ -243,8 +245,6 @@ import { AuditService } from "@bitwarden/common/services/audit.service"; import { EventCollectionService } from "@bitwarden/common/services/event/event-collection.service"; import { EventUploadService } from "@bitwarden/common/services/event/event-upload.service"; 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 { PasswordStrengthService, PasswordStrengthServiceAbstraction, @@ -463,7 +463,7 @@ const safeProviders: SafeProvider[] = [ InternalUserDecryptionOptionsServiceAbstraction, GlobalStateProvider, BillingAccountProfileStateService, - VaultTimeoutSettingsServiceAbstraction, + VaultTimeoutSettingsService, KdfConfigService, TaskSchedulerService, ], @@ -697,7 +697,7 @@ const safeProviders: SafeProvider[] = [ REFRESH_ACCESS_TOKEN_ERROR_CALLBACK, LogService, LOGOUT_CALLBACK, - VaultTimeoutSettingsServiceAbstraction, + VaultTimeoutSettingsService, ], }), safeProvider({ @@ -762,8 +762,8 @@ const safeProviders: SafeProvider[] = [ deps: [MessageListener], }), safeProvider({ - provide: VaultTimeoutSettingsServiceAbstraction, - useClass: VaultTimeoutSettingsService, + provide: VaultTimeoutSettingsService, + useClass: DefaultVaultTimeoutSettingsService, deps: [ AccountServiceAbstraction, PinServiceAbstraction, @@ -778,8 +778,8 @@ const safeProviders: SafeProvider[] = [ ], }), safeProvider({ - provide: VaultTimeoutService, - useClass: VaultTimeoutService, + provide: DefaultVaultTimeoutService, + useClass: DefaultVaultTimeoutService, deps: [ AccountServiceAbstraction, InternalMasterPasswordServiceAbstraction, @@ -791,7 +791,7 @@ const safeProviders: SafeProvider[] = [ SearchServiceAbstraction, StateServiceAbstraction, AuthServiceAbstraction, - VaultTimeoutSettingsServiceAbstraction, + VaultTimeoutSettingsService, StateEventRunnerService, TaskSchedulerService, LogService, @@ -801,8 +801,8 @@ const safeProviders: SafeProvider[] = [ ], }), safeProvider({ - provide: VaultTimeoutServiceAbstraction, - useExisting: VaultTimeoutService, + provide: VaultTimeoutService, + useExisting: DefaultVaultTimeoutService, }), safeProvider({ provide: SsoLoginServiceAbstraction, @@ -1458,37 +1458,6 @@ const safeProviders: SafeProvider[] = [ useClass: DefaultLoginSuccessHandlerService, deps: [SyncService, UserAsymmetricKeysRegenerationService], }), - safeProvider({ - provide: PasswordLoginStrategy, - useClass: PasswordLoginStrategy, - deps: [ - PasswordLoginStrategyData, - PasswordStrengthServiceAbstraction, - PolicyServiceAbstraction, - LoginStrategyServiceAbstraction, - AccountServiceAbstraction, - InternalMasterPasswordServiceAbstraction, - KeyService, - EncryptService, - ApiServiceAbstraction, - TokenServiceAbstraction, - AppIdServiceAbstraction, - PlatformUtilsServiceAbstraction, - MessagingServiceAbstraction, - LogService, - StateServiceAbstraction, - TwoFactorServiceAbstraction, - InternalUserDecryptionOptionsServiceAbstraction, - BillingAccountProfileStateService, - VaultTimeoutSettingsServiceAbstraction, - KdfConfigService, - ], - }), - safeProvider({ - provide: PasswordLoginStrategyData, - useClass: PasswordLoginStrategyData, - deps: [], - }), safeProvider({ provide: TaskService, useClass: DefaultTaskService, diff --git a/libs/angular/src/vault/components/vault-items.component.ts b/libs/angular/src/vault/components/vault-items.component.ts index fb76ff500eb..fa25bfc8254 100644 --- a/libs/angular/src/vault/components/vault-items.component.ts +++ b/libs/angular/src/vault/components/vault-items.component.ts @@ -1,8 +1,7 @@ // FIXME: Update this file to be type safe and remove this and next line // @ts-strict-ignore import { Directive, EventEmitter, Input, OnDestroy, OnInit, Output } from "@angular/core"; -import { takeUntilDestroyed } from "@angular/core/rxjs-interop"; -import { BehaviorSubject, Subject, firstValueFrom, from, map, switchMap, takeUntil } from "rxjs"; +import { BehaviorSubject, Subject, firstValueFrom, from, switchMap, takeUntil } from "rxjs"; import { SearchService } from "@bitwarden/common/abstractions/search.service"; import { Organization } from "@bitwarden/common/admin-console/models/domain/organization"; @@ -22,11 +21,9 @@ export class VaultItemsComponent implements OnInit, OnDestroy { loaded = false; ciphers: CipherView[] = []; - searchPlaceholder: string = null; filter: (cipher: CipherView) => boolean = null; deleted = false; organization: Organization; - accessEvents = false; protected searchPending = false; @@ -45,20 +42,7 @@ export class VaultItemsComponent implements OnInit, OnDestroy { protected searchService: SearchService, protected cipherService: CipherService, protected accountService: AccountService, - ) { - this.accountService.activeAccount$ - .pipe( - getUserId, - switchMap((userId) => - this.cipherService.cipherViews$(userId).pipe(map((ciphers) => ({ userId, ciphers }))), - ), - takeUntilDestroyed(), - ) - .subscribe(({ userId, ciphers }) => { - void this.doSearch(ciphers, userId); - this.loaded = true; - }); - } + ) {} ngOnInit(): void { this._searchText$ diff --git a/libs/auth/src/angular/login/login.component.ts b/libs/auth/src/angular/login/login.component.ts index 47109b00bbb..c291a64a8c5 100644 --- a/libs/auth/src/angular/login/login.component.ts +++ b/libs/auth/src/angular/login/login.component.ts @@ -161,8 +161,9 @@ export class LoginComponent implements OnInit, OnDestroy { tap(async (flag) => { // If the flag is turned OFF, we must force a reload to ensure the correct UI is shown if (!flag) { + const qParams = await firstValueFrom(this.activatedRoute.queryParams); const uniqueQueryParams = { - ...this.activatedRoute.queryParams, + ...qParams, // adding a unique timestamp to the query params to force a reload t: new Date().getTime().toString(), // Adding a unique timestamp as a query parameter }; @@ -629,12 +630,7 @@ export class LoginComponent implements OnInit, OnDestroy { * Handle the SSO button click. */ async handleSsoClick() { - // Make sure the email is not empty, for type safety const email = this.formGroup.value.email; - if (!email) { - this.logService.error("Email is required for SSO"); - return; - } // Make sure the email is valid const isEmailValid = await this.validateEmail(); @@ -642,6 +638,12 @@ export class LoginComponent implements OnInit, OnDestroy { return; } + // Make sure the email is not empty, for type safety + if (!email) { + this.logService.error("Email is required for SSO"); + return; + } + // Save the email configuration for the login component await this.saveEmailSettings(); diff --git a/libs/auth/src/angular/new-device-verification/new-device-verification.component.ts b/libs/auth/src/angular/new-device-verification/new-device-verification.component.ts index 6e0f9eec05e..6c48a471d08 100644 --- a/libs/auth/src/angular/new-device-verification/new-device-verification.component.ts +++ b/libs/auth/src/angular/new-device-verification/new-device-verification.component.ts @@ -20,7 +20,6 @@ import { import { LoginEmailServiceAbstraction } from "../../common/abstractions/login-email.service"; import { LoginStrategyServiceAbstraction } from "../../common/abstractions/login-strategy.service"; -import { PasswordLoginStrategy } from "../../common/login-strategies/password-login.strategy"; /** * Component for verifying a new device via a one-time password (OTP). @@ -58,7 +57,6 @@ export class NewDeviceVerificationComponent implements OnInit, OnDestroy { constructor( private router: Router, private formBuilder: FormBuilder, - private passwordLoginStrategy: PasswordLoginStrategy, private apiService: ApiService, private loginStrategyService: LoginStrategyServiceAbstraction, private logService: LogService, diff --git a/libs/auth/src/angular/sso/sso.component.ts b/libs/auth/src/angular/sso/sso.component.ts index 9f81ab2a748..ce63769ffca 100644 --- a/libs/auth/src/angular/sso/sso.component.ts +++ b/libs/auth/src/angular/sso/sso.component.ts @@ -155,13 +155,6 @@ export class SsoComponent implements OnInit { return; } - // Detect if we are on the first portion of the SSO flow - // and have been sent here from another client with the info in query params - if (this.hasParametersFromOtherClientRedirect(qParams)) { - this.initializeFromRedirectFromOtherClient(qParams); - return; - } - // Detect if we have landed here but only have an SSO identifier in the URL. // This is used by integrations that want to "short-circuit" the login to send users // directly to their IdP to simulate IdP-initiated SSO, so we submit automatically. @@ -172,8 +165,15 @@ export class SsoComponent implements OnInit { return; } - // If we're routed here with no additional parameters, we'll try to determine the - // identifier using claimed domain or local state saved from their last attempt. + // Detect if we are on the first portion of the SSO flow + // and have been sent here from another client with the info in query params. + // If so, we want to initialize the SSO flow with those values. + if (this.hasParametersFromOtherClientRedirect(qParams)) { + this.initializeFromRedirectFromOtherClient(qParams); + } + + // Try to determine the identifier using claimed domain or local state + // persisted from the user's last login attempt. await this.initializeIdentifierFromEmailOrStorage(); } @@ -427,7 +427,6 @@ export class SsoComponent implements OnInit { ); this.formPromise = this.loginStrategyService.logIn(credentials); const authResult = await this.formPromise; - if (authResult.requiresTwoFactor) { return await this.handleTwoFactorRequired(orgSsoIdentifier); } @@ -441,16 +440,10 @@ export class SsoComponent implements OnInit { // - Browser SSO on extension open // Note: you cannot set this in state before 2FA b/c there won't be an account in state. - // Grabbing the active user id right before making the state set to ensure it exists. - const userId = (await firstValueFrom(this.accountService.activeAccount$))?.id; - await this.ssoLoginService.setActiveUserOrganizationSsoIdentifier(orgSsoIdentifier, userId); - - // Users enrolled in admin acct recovery can be forced to set a new password after - // having the admin set a temp password for them (affects TDE & standard users) - if (authResult.forcePasswordReset == ForceSetPasswordReason.AdminForcePasswordReset) { - // Weak password is not a valid scenario here b/c we cannot have evaluated a MP yet - return await this.handleForcePasswordReset(orgSsoIdentifier); - } + await this.ssoLoginService.setActiveUserOrganizationSsoIdentifier( + orgSsoIdentifier, + authResult.userId, + ); // must come after 2fa check since user decryption options aren't available if 2fa is required const userDecryptionOpts = await firstValueFrom( diff --git a/libs/auth/src/angular/vault-timeout-input/vault-timeout-input.component.spec.ts b/libs/auth/src/angular/vault-timeout-input/vault-timeout-input.component.spec.ts index 6b39c90fc9b..d510d671d69 100644 --- a/libs/auth/src/angular/vault-timeout-input/vault-timeout-input.component.spec.ts +++ b/libs/auth/src/angular/vault-timeout-input/vault-timeout-input.component.spec.ts @@ -1,10 +1,12 @@ import { ComponentFixture, TestBed } from "@angular/core/testing"; import { BehaviorSubject } from "rxjs"; -import { VaultTimeoutSettingsService } from "@bitwarden/common/abstractions/vault-timeout/vault-timeout-settings.service"; import { PolicyService } from "@bitwarden/common/admin-console/abstractions/policy/policy.service.abstraction"; +import { + VaultTimeoutSettingsService, + VaultTimeoutStringType, +} from "@bitwarden/common/key-management/vault-timeout"; import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; -import { VaultTimeoutStringType } from "@bitwarden/common/types/vault-timeout.type"; import { VaultTimeoutInputComponent } from "./vault-timeout-input.component"; diff --git a/libs/auth/src/angular/vault-timeout-input/vault-timeout-input.component.ts b/libs/auth/src/angular/vault-timeout-input/vault-timeout-input.component.ts index f7199d06499..91af1e8adbe 100644 --- a/libs/auth/src/angular/vault-timeout-input/vault-timeout-input.component.ts +++ b/libs/auth/src/angular/vault-timeout-input/vault-timeout-input.component.ts @@ -17,13 +17,16 @@ import { import { filter, map, Observable, Subject, takeUntil } from "rxjs"; import { JslibModule } from "@bitwarden/angular/jslib.module"; -import { VaultTimeoutSettingsService } from "@bitwarden/common/abstractions/vault-timeout/vault-timeout-settings.service"; import { PolicyService } from "@bitwarden/common/admin-console/abstractions/policy/policy.service.abstraction"; import { PolicyType } from "@bitwarden/common/admin-console/enums"; import { Policy } from "@bitwarden/common/admin-console/models/domain/policy"; -import { VaultTimeoutAction } from "@bitwarden/common/enums/vault-timeout-action.enum"; +import { + VaultTimeout, + VaultTimeoutAction, + VaultTimeoutOption, + VaultTimeoutSettingsService, +} from "@bitwarden/common/key-management/vault-timeout"; import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; -import { VaultTimeout, VaultTimeoutOption } from "@bitwarden/common/types/vault-timeout.type"; import { FormFieldModule, SelectModule } from "@bitwarden/components"; type VaultTimeoutForm = FormGroup<{ diff --git a/libs/auth/src/common/login-strategies/auth-request-login.strategy.spec.ts b/libs/auth/src/common/login-strategies/auth-request-login.strategy.spec.ts index 7c56e2a58c8..0646da4862b 100644 --- a/libs/auth/src/common/login-strategies/auth-request-login.strategy.spec.ts +++ b/libs/auth/src/common/login-strategies/auth-request-login.strategy.spec.ts @@ -8,16 +8,19 @@ import { TwoFactorService } from "@bitwarden/common/auth/abstractions/two-factor import { IdentityTokenResponse } from "@bitwarden/common/auth/models/response/identity-token.response"; import { FakeMasterPasswordService } from "@bitwarden/common/auth/services/master-password/fake-master-password.service"; import { BillingAccountProfileStateService } from "@bitwarden/common/billing/abstractions/account/billing-account-profile-state.service"; -import { VaultTimeoutAction } from "@bitwarden/common/enums/vault-timeout-action.enum"; import { EncryptService } from "@bitwarden/common/key-management/crypto/abstractions/encrypt.service"; +import { + VaultTimeoutAction, + VaultTimeoutSettingsService, +} from "@bitwarden/common/key-management/vault-timeout"; import { AppIdService } from "@bitwarden/common/platform/abstractions/app-id.service"; +import { EnvironmentService } from "@bitwarden/common/platform/abstractions/environment.service"; import { LogService } from "@bitwarden/common/platform/abstractions/log.service"; import { MessagingService } from "@bitwarden/common/platform/abstractions/messaging.service"; import { 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 { SymmetricCryptoKey } from "@bitwarden/common/platform/models/domain/symmetric-crypto-key"; -import { VaultTimeoutSettingsService } from "@bitwarden/common/services/vault-timeout/vault-timeout-settings.service"; import { FakeAccountService, mockAccountServiceWith } from "@bitwarden/common/spec"; import { CsprngArray } from "@bitwarden/common/types/csprng"; import { UserId } from "@bitwarden/common/types/guid"; @@ -51,6 +54,7 @@ describe("AuthRequestLoginStrategy", () => { let billingAccountProfileStateService: MockProxy; let vaultTimeoutSettingsService: MockProxy; let kdfConfigService: MockProxy; + let environmentService: MockProxy; const mockUserId = Utils.newGuid() as UserId; let accountService: FakeAccountService; @@ -86,6 +90,7 @@ describe("AuthRequestLoginStrategy", () => { billingAccountProfileStateService = mock(); vaultTimeoutSettingsService = mock(); kdfConfigService = mock(); + environmentService = mock(); accountService = mockAccountServiceWith(mockUserId); masterPasswordService = new FakeMasterPasswordService(); @@ -115,6 +120,7 @@ describe("AuthRequestLoginStrategy", () => { billingAccountProfileStateService, vaultTimeoutSettingsService, kdfConfigService, + environmentService, ); tokenResponse = identityTokenResponseFactory(); diff --git a/libs/auth/src/common/login-strategies/login.strategy.spec.ts b/libs/auth/src/common/login-strategies/login.strategy.spec.ts index fbd6b79f19d..b4a1e6a77d9 100644 --- a/libs/auth/src/common/login-strategies/login.strategy.spec.ts +++ b/libs/auth/src/common/login-strategies/login.strategy.spec.ts @@ -2,7 +2,6 @@ import { mock, MockProxy } from "jest-mock-extended"; import { BehaviorSubject } from "rxjs"; import { ApiService } from "@bitwarden/common/abstractions/api.service"; -import { VaultTimeoutSettingsService } from "@bitwarden/common/abstractions/vault-timeout/vault-timeout-settings.service"; import { PolicyService } from "@bitwarden/common/admin-console/abstractions/policy/policy.service.abstraction"; import { AccountService } from "@bitwarden/common/auth/abstractions/account.service"; import { TokenService } from "@bitwarden/common/auth/abstractions/token.service"; @@ -20,9 +19,13 @@ import { MasterPasswordPolicyResponse } from "@bitwarden/common/auth/models/resp import { IUserDecryptionOptionsServerResponse } from "@bitwarden/common/auth/models/response/user-decryption-options/user-decryption-options.response"; import { FakeMasterPasswordService } from "@bitwarden/common/auth/services/master-password/fake-master-password.service"; import { BillingAccountProfileStateService } from "@bitwarden/common/billing/abstractions/account/billing-account-profile-state.service"; -import { VaultTimeoutAction } from "@bitwarden/common/enums/vault-timeout-action.enum"; import { EncryptService } from "@bitwarden/common/key-management/crypto/abstractions/encrypt.service"; +import { + VaultTimeoutAction, + VaultTimeoutSettingsService, +} from "@bitwarden/common/key-management/vault-timeout"; import { AppIdService } from "@bitwarden/common/platform/abstractions/app-id.service"; +import { EnvironmentService } from "@bitwarden/common/platform/abstractions/environment.service"; import { LogService } from "@bitwarden/common/platform/abstractions/log.service"; import { MessagingService } from "@bitwarden/common/platform/abstractions/messaging.service"; import { PlatformUtilsService } from "@bitwarden/common/platform/abstractions/platform-utils.service"; @@ -121,6 +124,7 @@ describe("LoginStrategy", () => { let billingAccountProfileStateService: MockProxy; let vaultTimeoutSettingsService: MockProxy; let kdfConfigService: MockProxy; + let environmentService: MockProxy; let passwordLoginStrategy: PasswordLoginStrategy; let credentials: PasswordLoginCredentials; @@ -145,6 +149,7 @@ describe("LoginStrategy", () => { policyService = mock(); passwordStrengthService = mock(); billingAccountProfileStateService = mock(); + environmentService = mock(); vaultTimeoutSettingsService = mock(); @@ -173,6 +178,7 @@ describe("LoginStrategy", () => { billingAccountProfileStateService, vaultTimeoutSettingsService, kdfConfigService, + environmentService, ); credentials = new PasswordLoginCredentials(email, masterPassword); }); @@ -494,6 +500,7 @@ describe("LoginStrategy", () => { billingAccountProfileStateService, vaultTimeoutSettingsService, kdfConfigService, + environmentService, ); apiService.postIdentityToken.mockResolvedValue(identityTokenResponseFactory()); @@ -557,6 +564,7 @@ describe("LoginStrategy", () => { billingAccountProfileStateService, vaultTimeoutSettingsService, kdfConfigService, + environmentService, ); const result = await passwordLoginStrategy.logIn(credentials); diff --git a/libs/auth/src/common/login-strategies/login.strategy.ts b/libs/auth/src/common/login-strategies/login.strategy.ts index b4eef1a0276..89802c609c0 100644 --- a/libs/auth/src/common/login-strategies/login.strategy.ts +++ b/libs/auth/src/common/login-strategies/login.strategy.ts @@ -1,7 +1,6 @@ import { BehaviorSubject, filter, firstValueFrom, timeout, Observable } from "rxjs"; import { ApiService } from "@bitwarden/common/abstractions/api.service"; -import { VaultTimeoutSettingsService } from "@bitwarden/common/abstractions/vault-timeout/vault-timeout-settings.service"; import { AccountService } from "@bitwarden/common/auth/abstractions/account.service"; import { InternalMasterPasswordServiceAbstraction } from "@bitwarden/common/auth/abstractions/master-password.service.abstraction"; import { TokenService } from "@bitwarden/common/auth/abstractions/token.service"; @@ -21,10 +20,14 @@ import { IdentityTokenResponse } from "@bitwarden/common/auth/models/response/id import { IdentityTwoFactorResponse } from "@bitwarden/common/auth/models/response/identity-two-factor.response"; import { BillingAccountProfileStateService } from "@bitwarden/common/billing/abstractions/account/billing-account-profile-state.service"; import { ClientType } from "@bitwarden/common/enums"; -import { VaultTimeoutAction } from "@bitwarden/common/enums/vault-timeout-action.enum"; import { EncryptService } from "@bitwarden/common/key-management/crypto/abstractions/encrypt.service"; +import { + VaultTimeoutAction, + VaultTimeoutSettingsService, +} from "@bitwarden/common/key-management/vault-timeout"; import { KeysRequest } from "@bitwarden/common/models/request/keys.request"; import { AppIdService } from "@bitwarden/common/platform/abstractions/app-id.service"; +import { EnvironmentService } from "@bitwarden/common/platform/abstractions/environment.service"; import { LogService } from "@bitwarden/common/platform/abstractions/log.service"; import { MessagingService } from "@bitwarden/common/platform/abstractions/messaging.service"; import { PlatformUtilsService } from "@bitwarden/common/platform/abstractions/platform-utils.service"; @@ -91,6 +94,7 @@ export abstract class LoginStrategy { protected billingAccountProfileStateService: BillingAccountProfileStateService, protected vaultTimeoutSettingsService: VaultTimeoutSettingsService, protected KdfConfigService: KdfConfigService, + protected environmentService: EnvironmentService, ) {} abstract exportCache(): CacheData; @@ -194,6 +198,10 @@ export abstract class LoginStrategy { emailVerified: accountInformation.email_verified ?? false, }); + // User env must be seeded from currently set env before switching to the account + // to avoid any incorrect emissions of the global default env. + await this.environmentService.seedUserEnvironment(userId); + await this.accountService.switchAccount(userId); await this.stateService.addAccount( diff --git a/libs/auth/src/common/login-strategies/password-login.strategy.spec.ts b/libs/auth/src/common/login-strategies/password-login.strategy.spec.ts index 1b0613d4da3..0821405e535 100644 --- a/libs/auth/src/common/login-strategies/password-login.strategy.spec.ts +++ b/libs/auth/src/common/login-strategies/password-login.strategy.spec.ts @@ -12,9 +12,13 @@ import { IdentityTwoFactorResponse } from "@bitwarden/common/auth/models/respons import { MasterPasswordPolicyResponse } from "@bitwarden/common/auth/models/response/master-password-policy.response"; import { FakeMasterPasswordService } from "@bitwarden/common/auth/services/master-password/fake-master-password.service"; import { BillingAccountProfileStateService } from "@bitwarden/common/billing/abstractions/account/billing-account-profile-state.service"; -import { VaultTimeoutAction } from "@bitwarden/common/enums/vault-timeout-action.enum"; import { EncryptService } from "@bitwarden/common/key-management/crypto/abstractions/encrypt.service"; +import { + VaultTimeoutAction, + VaultTimeoutSettingsService, +} from "@bitwarden/common/key-management/vault-timeout"; import { AppIdService } from "@bitwarden/common/platform/abstractions/app-id.service"; +import { EnvironmentService } from "@bitwarden/common/platform/abstractions/environment.service"; import { LogService } from "@bitwarden/common/platform/abstractions/log.service"; import { MessagingService } from "@bitwarden/common/platform/abstractions/messaging.service"; import { PlatformUtilsService } from "@bitwarden/common/platform/abstractions/platform-utils.service"; @@ -22,7 +26,6 @@ import { StateService } from "@bitwarden/common/platform/abstractions/state.serv import { HashPurpose } from "@bitwarden/common/platform/enums"; import { Utils } from "@bitwarden/common/platform/misc/utils"; import { SymmetricCryptoKey } from "@bitwarden/common/platform/models/domain/symmetric-crypto-key"; -import { VaultTimeoutSettingsService } from "@bitwarden/common/services/vault-timeout/vault-timeout-settings.service"; import { FakeAccountService, mockAccountServiceWith } from "@bitwarden/common/spec"; import { PasswordStrengthServiceAbstraction, @@ -78,6 +81,7 @@ describe("PasswordLoginStrategy", () => { let billingAccountProfileStateService: MockProxy; let vaultTimeoutSettingsService: MockProxy; let kdfConfigService: MockProxy; + let environmentService: MockProxy; let passwordLoginStrategy: PasswordLoginStrategy; let credentials: PasswordLoginCredentials; @@ -104,6 +108,7 @@ describe("PasswordLoginStrategy", () => { billingAccountProfileStateService = mock(); vaultTimeoutSettingsService = mock(); kdfConfigService = mock(); + environmentService = mock(); appIdService.getAppId.mockResolvedValue(deviceId); tokenService.decodeAccessToken.mockResolvedValue({ @@ -142,6 +147,7 @@ describe("PasswordLoginStrategy", () => { billingAccountProfileStateService, vaultTimeoutSettingsService, kdfConfigService, + environmentService, ); credentials = new PasswordLoginCredentials(email, masterPassword); tokenResponse = identityTokenResponseFactory(masterPasswordPolicy); diff --git a/libs/auth/src/common/login-strategies/sso-login.strategy.spec.ts b/libs/auth/src/common/login-strategies/sso-login.strategy.spec.ts index 96b08e98e37..6efb17a8d26 100644 --- a/libs/auth/src/common/login-strategies/sso-login.strategy.spec.ts +++ b/libs/auth/src/common/login-strategies/sso-login.strategy.spec.ts @@ -12,10 +12,14 @@ import { IdentityTokenResponse } from "@bitwarden/common/auth/models/response/id import { IUserDecryptionOptionsServerResponse } from "@bitwarden/common/auth/models/response/user-decryption-options/user-decryption-options.response"; import { FakeMasterPasswordService } from "@bitwarden/common/auth/services/master-password/fake-master-password.service"; import { BillingAccountProfileStateService } from "@bitwarden/common/billing/abstractions/account/billing-account-profile-state.service"; -import { VaultTimeoutAction } from "@bitwarden/common/enums/vault-timeout-action.enum"; import { EncryptService } from "@bitwarden/common/key-management/crypto/abstractions/encrypt.service"; +import { + VaultTimeoutAction, + VaultTimeoutSettingsService, +} from "@bitwarden/common/key-management/vault-timeout"; import { ErrorResponse } from "@bitwarden/common/models/response/error.response"; import { AppIdService } from "@bitwarden/common/platform/abstractions/app-id.service"; +import { EnvironmentService } from "@bitwarden/common/platform/abstractions/environment.service"; import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; import { LogService } from "@bitwarden/common/platform/abstractions/log.service"; import { MessagingService } from "@bitwarden/common/platform/abstractions/messaging.service"; @@ -23,7 +27,6 @@ import { PlatformUtilsService } from "@bitwarden/common/platform/abstractions/pl import { StateService } from "@bitwarden/common/platform/abstractions/state.service"; import { Utils } from "@bitwarden/common/platform/misc/utils"; import { SymmetricCryptoKey } from "@bitwarden/common/platform/models/domain/symmetric-crypto-key"; -import { VaultTimeoutSettingsService } from "@bitwarden/common/services/vault-timeout/vault-timeout-settings.service"; import { FakeAccountService, mockAccountServiceWith } from "@bitwarden/common/spec"; import { CsprngArray } from "@bitwarden/common/types/csprng"; import { UserId } from "@bitwarden/common/types/guid"; @@ -61,6 +64,7 @@ describe("SsoLoginStrategy", () => { let billingAccountProfileStateService: MockProxy; let vaultTimeoutSettingsService: MockProxy; let kdfConfigService: MockProxy; + let environmentService: MockProxy; let ssoLoginStrategy: SsoLoginStrategy; let credentials: SsoLoginCredentials; @@ -96,6 +100,7 @@ describe("SsoLoginStrategy", () => { billingAccountProfileStateService = mock(); vaultTimeoutSettingsService = mock(); kdfConfigService = mock(); + environmentService = mock(); tokenService.getTwoFactorToken.mockResolvedValue(null); appIdService.getAppId.mockResolvedValue(deviceId); @@ -140,6 +145,7 @@ describe("SsoLoginStrategy", () => { billingAccountProfileStateService, vaultTimeoutSettingsService, kdfConfigService, + environmentService, ); credentials = new SsoLoginCredentials(ssoCode, ssoCodeVerifier, ssoRedirectUrl, ssoOrgId); }); diff --git a/libs/auth/src/common/login-strategies/user-api-login.strategy.spec.ts b/libs/auth/src/common/login-strategies/user-api-login.strategy.spec.ts index dd3e7f0134d..c0c7e828b68 100644 --- a/libs/auth/src/common/login-strategies/user-api-login.strategy.spec.ts +++ b/libs/auth/src/common/login-strategies/user-api-login.strategy.spec.ts @@ -7,8 +7,11 @@ import { TokenService } from "@bitwarden/common/auth/abstractions/token.service" import { TwoFactorService } from "@bitwarden/common/auth/abstractions/two-factor.service"; import { FakeMasterPasswordService } from "@bitwarden/common/auth/services/master-password/fake-master-password.service"; import { BillingAccountProfileStateService } from "@bitwarden/common/billing/abstractions/account/billing-account-profile-state.service"; -import { VaultTimeoutAction } from "@bitwarden/common/enums/vault-timeout-action.enum"; import { EncryptService } from "@bitwarden/common/key-management/crypto/abstractions/encrypt.service"; +import { + VaultTimeoutAction, + VaultTimeoutSettingsService, +} from "@bitwarden/common/key-management/vault-timeout"; import { AppIdService } from "@bitwarden/common/platform/abstractions/app-id.service"; import { Environment, @@ -20,7 +23,6 @@ import { PlatformUtilsService } from "@bitwarden/common/platform/abstractions/pl import { StateService } from "@bitwarden/common/platform/abstractions/state.service"; import { Utils } from "@bitwarden/common/platform/misc/utils"; import { SymmetricCryptoKey } from "@bitwarden/common/platform/models/domain/symmetric-crypto-key"; -import { VaultTimeoutSettingsService } from "@bitwarden/common/services/vault-timeout/vault-timeout-settings.service"; import { FakeAccountService, mockAccountServiceWith } from "@bitwarden/common/spec"; import { CsprngArray } from "@bitwarden/common/types/csprng"; import { UserId } from "@bitwarden/common/types/guid"; @@ -95,7 +97,6 @@ describe("UserApiLoginStrategy", () => { apiLogInStrategy = new UserApiLoginStrategy( cache, - environmentService, keyConnectorService, accountService, masterPasswordService, @@ -113,6 +114,7 @@ describe("UserApiLoginStrategy", () => { billingAccountProfileStateService, vaultTimeoutSettingsService, kdfConfigService, + environmentService, ); credentials = new UserApiLoginCredentials(apiClientId, apiClientSecret); diff --git a/libs/auth/src/common/login-strategies/user-api-login.strategy.ts b/libs/auth/src/common/login-strategies/user-api-login.strategy.ts index ef13e631300..0bff20b4a65 100644 --- a/libs/auth/src/common/login-strategies/user-api-login.strategy.ts +++ b/libs/auth/src/common/login-strategies/user-api-login.strategy.ts @@ -6,8 +6,7 @@ import { Jsonify } from "type-fest"; import { KeyConnectorService } from "@bitwarden/common/auth/abstractions/key-connector.service"; import { UserApiTokenRequest } from "@bitwarden/common/auth/models/request/identity-token/user-api-token.request"; import { IdentityTokenResponse } from "@bitwarden/common/auth/models/response/identity-token.response"; -import { VaultTimeoutAction } from "@bitwarden/common/enums/vault-timeout-action.enum"; -import { EnvironmentService } from "@bitwarden/common/platform/abstractions/environment.service"; +import { VaultTimeoutAction } from "@bitwarden/common/key-management/vault-timeout"; import { UserId } from "@bitwarden/common/types/guid"; import { UserApiLoginCredentials } from "../models/domain/login-credentials"; @@ -31,7 +30,6 @@ export class UserApiLoginStrategy extends LoginStrategy { constructor( data: UserApiLoginStrategyData, - private environmentService: EnvironmentService, private keyConnectorService: KeyConnectorService, ...sharedDeps: ConstructorParameters ) { diff --git a/libs/auth/src/common/login-strategies/webauthn-login.strategy.spec.ts b/libs/auth/src/common/login-strategies/webauthn-login.strategy.spec.ts index fd8817a8c21..837c6a2a910 100644 --- a/libs/auth/src/common/login-strategies/webauthn-login.strategy.spec.ts +++ b/libs/auth/src/common/login-strategies/webauthn-login.strategy.spec.ts @@ -10,16 +10,19 @@ import { IUserDecryptionOptionsServerResponse } from "@bitwarden/common/auth/mod import { FakeMasterPasswordService } from "@bitwarden/common/auth/services/master-password/fake-master-password.service"; import { WebAuthnLoginAssertionResponseRequest } from "@bitwarden/common/auth/services/webauthn-login/request/webauthn-login-assertion-response.request"; import { BillingAccountProfileStateService } from "@bitwarden/common/billing/abstractions/account/billing-account-profile-state.service"; -import { VaultTimeoutAction } from "@bitwarden/common/enums/vault-timeout-action.enum"; import { EncryptService } from "@bitwarden/common/key-management/crypto/abstractions/encrypt.service"; +import { + VaultTimeoutAction, + VaultTimeoutSettingsService, +} from "@bitwarden/common/key-management/vault-timeout"; import { AppIdService } from "@bitwarden/common/platform/abstractions/app-id.service"; +import { EnvironmentService } from "@bitwarden/common/platform/abstractions/environment.service"; import { LogService } from "@bitwarden/common/platform/abstractions/log.service"; import { MessagingService } from "@bitwarden/common/platform/abstractions/messaging.service"; import { 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 { SymmetricCryptoKey } from "@bitwarden/common/platform/models/domain/symmetric-crypto-key"; -import { VaultTimeoutSettingsService } from "@bitwarden/common/services/vault-timeout/vault-timeout-settings.service"; import { FakeAccountService, mockAccountServiceWith } from "@bitwarden/common/spec"; import { UserId } from "@bitwarden/common/types/guid"; import { PrfKey, UserKey } from "@bitwarden/common/types/key"; @@ -50,6 +53,7 @@ describe("WebAuthnLoginStrategy", () => { let billingAccountProfileStateService: MockProxy; let vaultTimeoutSettingsService: MockProxy; let kdfConfigService: MockProxy; + let environmentService: MockProxy; let webAuthnLoginStrategy!: WebAuthnLoginStrategy; @@ -93,6 +97,7 @@ describe("WebAuthnLoginStrategy", () => { billingAccountProfileStateService = mock(); vaultTimeoutSettingsService = mock(); kdfConfigService = mock(); + environmentService = mock(); tokenService.getTwoFactorToken.mockResolvedValue(null); appIdService.getAppId.mockResolvedValue(deviceId); @@ -118,6 +123,7 @@ describe("WebAuthnLoginStrategy", () => { billingAccountProfileStateService, vaultTimeoutSettingsService, kdfConfigService, + environmentService, ); // Create credentials diff --git a/libs/auth/src/common/services/accounts/lock.service.ts b/libs/auth/src/common/services/accounts/lock.service.ts index 334a795f7bc..1f42873408d 100644 --- a/libs/auth/src/common/services/accounts/lock.service.ts +++ b/libs/auth/src/common/services/accounts/lock.service.ts @@ -1,7 +1,7 @@ import { combineLatest, firstValueFrom, map } from "rxjs"; -import { VaultTimeoutService } from "@bitwarden/common/abstractions/vault-timeout/vault-timeout.service"; import { AccountService } from "@bitwarden/common/auth/abstractions/account.service"; +import { VaultTimeoutService } from "@bitwarden/common/key-management/vault-timeout"; import { UserId } from "@bitwarden/common/types/guid"; export abstract class LockService { diff --git a/libs/auth/src/common/services/accounts/lock.services.spec.ts b/libs/auth/src/common/services/accounts/lock.services.spec.ts index eecc3dd787f..27310298028 100644 --- a/libs/auth/src/common/services/accounts/lock.services.spec.ts +++ b/libs/auth/src/common/services/accounts/lock.services.spec.ts @@ -1,6 +1,6 @@ import { mock } from "jest-mock-extended"; -import { VaultTimeoutService } from "@bitwarden/common/abstractions/vault-timeout/vault-timeout.service"; +import { VaultTimeoutService } from "@bitwarden/common/key-management/vault-timeout"; import { mockAccountServiceWith } from "@bitwarden/common/spec"; import { UserId } from "@bitwarden/common/types/guid"; diff --git a/libs/auth/src/common/services/auth-request/auth-request-api.service.ts b/libs/auth/src/common/services/auth-request/auth-request-api.service.ts index 180e0079396..c9fec1400c9 100644 --- a/libs/auth/src/common/services/auth-request/auth-request-api.service.ts +++ b/libs/auth/src/common/services/auth-request/auth-request-api.service.ts @@ -16,7 +16,7 @@ export class DefaultAuthRequestApiService implements AuthRequestApiService { const path = `/auth-requests/${requestId}`; const response = await this.apiService.send("GET", path, null, true, true); - return response; + return new AuthRequestResponse(response); } catch (e: unknown) { this.logService.error(e); throw e; @@ -28,7 +28,7 @@ export class DefaultAuthRequestApiService implements AuthRequestApiService { const path = `/auth-requests/${requestId}/response?code=${accessCode}`; const response = await this.apiService.send("GET", path, null, false, true); - return response; + return new AuthRequestResponse(response); } catch (e: unknown) { this.logService.error(e); throw e; @@ -45,7 +45,7 @@ export class DefaultAuthRequestApiService implements AuthRequestApiService { true, ); - return response; + return new AuthRequestResponse(response); } catch (e: unknown) { this.logService.error(e); throw e; @@ -54,9 +54,22 @@ export class DefaultAuthRequestApiService implements AuthRequestApiService { async postAuthRequest(request: AuthRequest): Promise { try { - const response = await this.apiService.send("POST", "/auth-requests/", request, false, true); + // Submit the current device identifier in the header as well as in the POST body. + // The value in the header will be used to build the request context and ensure that the resulting + // notifications have the current device as a source. + const response = await this.apiService.send( + "POST", + "/auth-requests/", + request, + false, + true, + null, + (headers) => { + headers.set("Device-Identifier", request.deviceIdentifier); + }, + ); - return response; + return new AuthRequestResponse(response); } catch (e: unknown) { this.logService.error(e); throw e; diff --git a/libs/auth/src/common/services/login-strategies/login-strategy.service.spec.ts b/libs/auth/src/common/services/login-strategies/login-strategy.service.spec.ts index 117e5c1f864..d8d16fa3701 100644 --- a/libs/auth/src/common/services/login-strategies/login-strategy.service.spec.ts +++ b/libs/auth/src/common/services/login-strategies/login-strategy.service.spec.ts @@ -2,7 +2,6 @@ import { MockProxy, mock } from "jest-mock-extended"; import { BehaviorSubject } from "rxjs"; import { ApiService } from "@bitwarden/common/abstractions/api.service"; -import { VaultTimeoutSettingsService } from "@bitwarden/common/abstractions/vault-timeout/vault-timeout-settings.service"; import { PolicyService } from "@bitwarden/common/admin-console/abstractions/policy/policy.service.abstraction"; import { DeviceTrustServiceAbstraction } from "@bitwarden/common/auth/abstractions/device-trust.service.abstraction"; import { KeyConnectorService } from "@bitwarden/common/auth/abstractions/key-connector.service"; @@ -16,8 +15,11 @@ import { IdentityTwoFactorResponse } from "@bitwarden/common/auth/models/respons import { PreloginResponse } from "@bitwarden/common/auth/models/response/prelogin.response"; import { FakeMasterPasswordService } from "@bitwarden/common/auth/services/master-password/fake-master-password.service"; import { BillingAccountProfileStateService } from "@bitwarden/common/billing/abstractions/account/billing-account-profile-state.service"; -import { VaultTimeoutAction } from "@bitwarden/common/enums/vault-timeout-action.enum"; import { EncryptService } from "@bitwarden/common/key-management/crypto/abstractions/encrypt.service"; +import { + VaultTimeoutAction, + VaultTimeoutSettingsService, +} from "@bitwarden/common/key-management/vault-timeout"; import { AppIdService } from "@bitwarden/common/platform/abstractions/app-id.service"; import { EnvironmentService } from "@bitwarden/common/platform/abstractions/environment.service"; import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; diff --git a/libs/auth/src/common/services/login-strategies/login-strategy.service.ts b/libs/auth/src/common/services/login-strategies/login-strategy.service.ts index 849b8e5eba1..4068c09338b 100644 --- a/libs/auth/src/common/services/login-strategies/login-strategy.service.ts +++ b/libs/auth/src/common/services/login-strategies/login-strategy.service.ts @@ -10,7 +10,6 @@ import { } from "rxjs"; import { ApiService } from "@bitwarden/common/abstractions/api.service"; -import { VaultTimeoutSettingsService } from "@bitwarden/common/abstractions/vault-timeout/vault-timeout-settings.service"; import { PolicyService } from "@bitwarden/common/admin-console/abstractions/policy/policy.service.abstraction"; import { AccountService } from "@bitwarden/common/auth/abstractions/account.service"; import { DeviceTrustServiceAbstraction } from "@bitwarden/common/auth/abstractions/device-trust.service.abstraction"; @@ -23,6 +22,7 @@ import { AuthResult } from "@bitwarden/common/auth/models/domain/auth-result"; import { TokenTwoFactorRequest } from "@bitwarden/common/auth/models/request/identity-token/token-two-factor.request"; import { BillingAccountProfileStateService } from "@bitwarden/common/billing/abstractions/account/billing-account-profile-state.service"; import { EncryptService } from "@bitwarden/common/key-management/crypto/abstractions/encrypt.service"; +import { VaultTimeoutSettingsService } from "@bitwarden/common/key-management/vault-timeout"; import { PreloginRequest } from "@bitwarden/common/models/request/prelogin.request"; import { ErrorResponse } from "@bitwarden/common/models/response/error.response"; import { AppIdService } from "@bitwarden/common/platform/abstractions/app-id.service"; @@ -402,6 +402,7 @@ export class LoginStrategyService implements LoginStrategyServiceAbstraction { this.billingAccountProfileStateService, this.vaultTimeoutSettingsService, this.kdfConfigService, + this.environmentService, ]; return source.pipe( @@ -430,7 +431,6 @@ export class LoginStrategyService implements LoginStrategyServiceAbstraction { case AuthenticationType.UserApiKey: return new UserApiLoginStrategy( data?.userApiKey ?? new UserApiLoginStrategyData(), - this.environmentService, this.keyConnectorService, ...sharedDeps, ); diff --git a/libs/common/src/abstractions/api.service.ts b/libs/common/src/abstractions/api.service.ts index 5bd2221860b..fe3f356719b 100644 --- a/libs/common/src/abstractions/api.service.ts +++ b/libs/common/src/abstractions/api.service.ts @@ -142,7 +142,7 @@ export abstract class ApiService { body: any, authed: boolean, hasResponse: boolean, - apiUrl?: string, + apiUrl?: string | null, alterHeaders?: (headers: Headers) => void, ) => Promise; diff --git a/libs/common/src/auth/abstractions/token.service.ts b/libs/common/src/auth/abstractions/token.service.ts index 4695e45e658..0c8db6fdcd1 100644 --- a/libs/common/src/auth/abstractions/token.service.ts +++ b/libs/common/src/auth/abstractions/token.service.ts @@ -2,9 +2,8 @@ // @ts-strict-ignore import { Observable } from "rxjs"; -import { VaultTimeoutAction } from "../../enums/vault-timeout-action.enum"; +import { VaultTimeout, VaultTimeoutAction } from "../../key-management/vault-timeout"; import { UserId } from "../../types/guid"; -import { VaultTimeout } from "../../types/vault-timeout.type"; import { SetTokensResult } from "../models/domain/set-tokens-result"; import { DecodedAccessToken } from "../services/token.service"; diff --git a/libs/common/src/auth/services/token.service.spec.ts b/libs/common/src/auth/services/token.service.spec.ts index 339f570a003..449f5d17ad1 100644 --- a/libs/common/src/auth/services/token.service.spec.ts +++ b/libs/common/src/auth/services/token.service.spec.ts @@ -1,11 +1,17 @@ +// FIXME: Update this file to be type safe and remove this and next line +// @ts-strict-ignore import { MockProxy, mock } from "jest-mock-extended"; import { firstValueFrom } from "rxjs"; import { LogoutReason } from "@bitwarden/auth/common"; import { FakeSingleUserStateProvider, FakeGlobalStateProvider } from "../../../spec"; -import { VaultTimeoutAction } from "../../enums/vault-timeout-action.enum"; import { EncryptService } from "../../key-management/crypto/abstractions/encrypt.service"; +import { + VaultTimeout, + VaultTimeoutAction, + VaultTimeoutStringType, +} from "../../key-management/vault-timeout"; import { KeyGenerationService } from "../../platform/abstractions/key-generation.service"; import { LogService } from "../../platform/abstractions/log.service"; import { AbstractStorageService } from "../../platform/abstractions/storage.service"; @@ -14,7 +20,6 @@ import { StorageOptions } from "../../platform/models/domain/storage-options"; import { SymmetricCryptoKey } from "../../platform/models/domain/symmetric-crypto-key"; import { CsprngArray } from "../../types/csprng"; import { UserId } from "../../types/guid"; -import { VaultTimeout, VaultTimeoutStringType } from "../../types/vault-timeout.type"; import { SetTokensResult } from "../models/domain/set-tokens-result"; import { ACCOUNT_ACTIVE_ACCOUNT_ID } from "./account.service"; diff --git a/libs/common/src/auth/services/token.service.ts b/libs/common/src/auth/services/token.service.ts index 72e082f2002..7b87e55cfc7 100644 --- a/libs/common/src/auth/services/token.service.ts +++ b/libs/common/src/auth/services/token.service.ts @@ -5,8 +5,12 @@ import { Opaque } from "type-fest"; import { LogoutReason, decodeJwtTokenToJson } from "@bitwarden/auth/common"; -import { VaultTimeoutAction } from "../../enums/vault-timeout-action.enum"; import { EncryptService } from "../../key-management/crypto/abstractions/encrypt.service"; +import { + VaultTimeout, + VaultTimeoutAction, + VaultTimeoutStringType, +} from "../../key-management/vault-timeout"; import { KeyGenerationService } from "../../platform/abstractions/key-generation.service"; import { LogService } from "../../platform/abstractions/log.service"; import { AbstractStorageService } from "../../platform/abstractions/storage.service"; @@ -22,7 +26,6 @@ import { UserKeyDefinition, } from "../../platform/state"; import { UserId } from "../../types/guid"; -import { VaultTimeout, VaultTimeoutStringType } from "../../types/vault-timeout.type"; import { TokenService as TokenServiceAbstraction } from "../abstractions/token.service"; import { SetTokensResult } from "../models/domain/set-tokens-result"; diff --git a/libs/common/src/auth/services/user-verification/user-verification.service.spec.ts b/libs/common/src/auth/services/user-verification/user-verification.service.spec.ts index 677b6ff4499..8660b9428a1 100644 --- a/libs/common/src/auth/services/user-verification/user-verification.service.spec.ts +++ b/libs/common/src/auth/services/user-verification/user-verification.service.spec.ts @@ -16,7 +16,7 @@ import { } from "@bitwarden/key-management"; import { FakeAccountService, mockAccountServiceWith } from "../../../../spec"; -import { VaultTimeoutSettingsService } from "../../../abstractions/vault-timeout/vault-timeout-settings.service"; +import { VaultTimeoutSettingsService } from "../../../key-management/vault-timeout"; import { I18nService } from "../../../platform/abstractions/i18n.service"; import { HashPurpose } from "../../../platform/enums"; import { Utils } from "../../../platform/misc/utils"; diff --git a/libs/common/src/enums/feature-flag.enum.ts b/libs/common/src/enums/feature-flag.enum.ts index 85373377068..fced7b977cd 100644 --- a/libs/common/src/enums/feature-flag.enum.ts +++ b/libs/common/src/enums/feature-flag.enum.ts @@ -45,7 +45,6 @@ export enum FeatureFlag { PrivateKeyRegeneration = "pm-12241-private-key-regeneration", ResellerManagedOrgAlert = "PM-15814-alert-owners-of-reseller-managed-orgs", AccountDeprovisioningBanner = "pm-17120-account-deprovisioning-admin-console-banner", - NewDeviceVerification = "new-device-verification", PM15179_AddExistingOrgsFromProviderPortal = "pm-15179-add-existing-orgs-from-provider-portal", RecoveryCodeLogin = "pm-17128-recovery-code-login", PM12276_BreadcrumbEventLogs = "pm-12276-breadcrumbing-for-business-features", @@ -105,7 +104,6 @@ export const DefaultFeatureFlagValue = { [FeatureFlag.PrivateKeyRegeneration]: FALSE, [FeatureFlag.ResellerManagedOrgAlert]: FALSE, [FeatureFlag.AccountDeprovisioningBanner]: FALSE, - [FeatureFlag.NewDeviceVerification]: FALSE, [FeatureFlag.PM15179_AddExistingOrgsFromProviderPortal]: FALSE, [FeatureFlag.RecoveryCodeLogin]: FALSE, [FeatureFlag.PM12276_BreadcrumbEventLogs]: FALSE, diff --git a/libs/common/src/key-management/crypto/services/encrypt.service.spec.ts b/libs/common/src/key-management/crypto/services/encrypt.service.spec.ts index 8d75b528596..cff695f4829 100644 --- a/libs/common/src/key-management/crypto/services/encrypt.service.spec.ts +++ b/libs/common/src/key-management/crypto/services/encrypt.service.spec.ts @@ -26,11 +26,63 @@ describe("EncryptService", () => { encryptService = new EncryptServiceImplementation(cryptoFunctionService, logService, true); }); + describe("encrypt", () => { + it("throws if no key is provided", () => { + return expect(encryptService.encrypt(null, null)).rejects.toThrow( + "No encryption key provided.", + ); + }); + it("returns null if no data is provided", async () => { + const key = mock(); + const actual = await encryptService.encrypt(null, key); + expect(actual).toBeNull(); + }); + it("creates an EncString for Aes256Cbc", async () => { + const key = new SymmetricCryptoKey(makeStaticByteArray(32)); + const plainValue = "data"; + cryptoFunctionService.aesEncrypt.mockResolvedValue(makeStaticByteArray(4, 100)); + cryptoFunctionService.randomBytes.mockResolvedValue(makeStaticByteArray(16) as CsprngArray); + const result = await encryptService.encrypt(plainValue, key); + expect(cryptoFunctionService.aesEncrypt).toHaveBeenCalledWith( + Utils.fromByteStringToArray(plainValue), + makeStaticByteArray(16), + makeStaticByteArray(32), + ); + expect(cryptoFunctionService.hmac).not.toHaveBeenCalled(); + + expect(Utils.fromB64ToArray(result.data).length).toEqual(4); + expect(Utils.fromB64ToArray(result.iv).length).toEqual(16); + }); + it("creates an EncString for Aes256Cbc_HmacSha256_B64", async () => { + const key = new SymmetricCryptoKey(makeStaticByteArray(64)); + const plainValue = "data"; + cryptoFunctionService.hmac.mockResolvedValue(makeStaticByteArray(32)); + cryptoFunctionService.aesEncrypt.mockResolvedValue(makeStaticByteArray(4, 100)); + cryptoFunctionService.randomBytes.mockResolvedValue(makeStaticByteArray(16) as CsprngArray); + const result = await encryptService.encrypt(plainValue, key); + expect(cryptoFunctionService.aesEncrypt).toHaveBeenCalledWith( + Utils.fromByteStringToArray(plainValue), + makeStaticByteArray(16), + makeStaticByteArray(32), + ); + + const macData = new Uint8Array(16 + 4); + macData.set(makeStaticByteArray(16)); + macData.set(makeStaticByteArray(4, 100), 16); + expect(cryptoFunctionService.hmac).toHaveBeenCalledWith( + macData, + makeStaticByteArray(32, 32), + "sha256", + ); + + expect(Utils.fromB64ToArray(result.data).length).toEqual(4); + expect(Utils.fromB64ToArray(result.iv).length).toEqual(16); + expect(Utils.fromB64ToArray(result.mac).length).toEqual(32); + }); + }); + describe("encryptToBytes", () => { const plainValue = makeStaticByteArray(16, 1); - const iv = makeStaticByteArray(16, 30); - const mac = makeStaticByteArray(32, 40); - const encryptedData = makeStaticByteArray(20, 50); it("throws if no key is provided", () => { return expect(encryptService.encryptToBytes(plainValue, null)).rejects.toThrow( @@ -38,55 +90,47 @@ describe("EncryptService", () => { ); }); - describe("encrypts data", () => { - beforeEach(() => { - cryptoFunctionService.randomBytes.calledWith(16).mockResolvedValueOnce(iv as CsprngArray); - cryptoFunctionService.aesEncrypt.mockResolvedValue(encryptedData); - }); + it("encrypts data with provided Aes256Cbc key and returns correct encbuffer", async () => { + const key = new SymmetricCryptoKey(makeStaticByteArray(32, 0)); + const iv = makeStaticByteArray(16, 80); + const cipherText = makeStaticByteArray(20, 150); + cryptoFunctionService.randomBytes.mockResolvedValue(iv as CsprngArray); + cryptoFunctionService.aesEncrypt.mockResolvedValue(cipherText); - it("using a key which supports mac", async () => { - const key = mock(); - const encType = EncryptionType.AesCbc128_HmacSha256_B64; - key.encType = encType; + const actual = await encryptService.encryptToBytes(plainValue, key); + const expectedBytes = new Uint8Array(1 + iv.byteLength + cipherText.byteLength); + expectedBytes.set([EncryptionType.AesCbc256_B64]); + expectedBytes.set(iv, 1); + expectedBytes.set(cipherText, 1 + iv.byteLength); - key.macKey = makeStaticByteArray(16, 20); + expect(actual.buffer).toEqualBuffer(expectedBytes); + }); - cryptoFunctionService.hmac.mockResolvedValue(mac); + it("encrypts data with provided Aes256Cbc_HmacSha256 key and returns correct encbuffer", async () => { + const key = new SymmetricCryptoKey(makeStaticByteArray(64, 0)); + const iv = makeStaticByteArray(16, 80); + const mac = makeStaticByteArray(32, 100); + const cipherText = makeStaticByteArray(20, 150); + cryptoFunctionService.randomBytes.mockResolvedValue(iv as CsprngArray); + cryptoFunctionService.aesEncrypt.mockResolvedValue(cipherText); + cryptoFunctionService.hmac.mockResolvedValue(mac); - const actual = await encryptService.encryptToBytes(plainValue, key); + const actual = await encryptService.encryptToBytes(plainValue, key); + const expectedBytes = new Uint8Array( + 1 + iv.byteLength + mac.byteLength + cipherText.byteLength, + ); + expectedBytes.set([EncryptionType.AesCbc256_HmacSha256_B64]); + expectedBytes.set(iv, 1); + expectedBytes.set(mac, 1 + iv.byteLength); + expectedBytes.set(cipherText, 1 + iv.byteLength + mac.byteLength); - expect(actual.encryptionType).toEqual(encType); - expect(actual.ivBytes).toEqualBuffer(iv); - expect(actual.macBytes).toEqualBuffer(mac); - expect(actual.dataBytes).toEqualBuffer(encryptedData); - expect(actual.buffer.byteLength).toEqual( - 1 + iv.byteLength + mac.byteLength + encryptedData.byteLength, - ); - }); - - it("using a key which doesn't support mac", async () => { - const key = mock(); - const encType = EncryptionType.AesCbc256_B64; - key.encType = encType; - - key.macKey = null; - - const actual = await encryptService.encryptToBytes(plainValue, key); - - expect(cryptoFunctionService.hmac).not.toBeCalled(); - - expect(actual.encryptionType).toEqual(encType); - expect(actual.ivBytes).toEqualBuffer(iv); - expect(actual.macBytes).toBeNull(); - expect(actual.dataBytes).toEqualBuffer(encryptedData); - expect(actual.buffer.byteLength).toEqual(1 + iv.byteLength + encryptedData.byteLength); - }); + expect(actual.buffer).toEqualBuffer(expectedBytes); }); }); describe("decryptToBytes", () => { const encType = EncryptionType.AesCbc256_HmacSha256_B64; - const key = new SymmetricCryptoKey(makeStaticByteArray(64, 100), encType); + const key = new SymmetricCryptoKey(makeStaticByteArray(64, 100)); const computedMac = new Uint8Array(1); const encBuffer = new EncArrayBuffer(makeStaticByteArray(60, encType)); @@ -106,7 +150,28 @@ describe("EncryptService", () => { ); }); - it("decrypts data with provided key", async () => { + it("decrypts data with provided key for Aes256Cbc", async () => { + const decryptedBytes = makeStaticByteArray(10, 200); + + cryptoFunctionService.hmac.mockResolvedValue(makeStaticByteArray(1)); + cryptoFunctionService.compare.mockResolvedValue(true); + cryptoFunctionService.aesDecrypt.mockResolvedValueOnce(decryptedBytes); + + const actual = await encryptService.decryptToBytes(encBuffer, key); + + expect(cryptoFunctionService.aesDecrypt).toBeCalledWith( + expect.toEqualBuffer(encBuffer.dataBytes), + expect.toEqualBuffer(encBuffer.ivBytes), + expect.toEqualBuffer(key.encKey), + "cbc", + ); + + expect(actual).toEqualBuffer(decryptedBytes); + }); + + it("decrypts data with provided key for Aes256Cbc", async () => { + const key = new SymmetricCryptoKey(makeStaticByteArray(32, 0)); + const encBuffer = new EncArrayBuffer(makeStaticByteArray(60, EncryptionType.AesCbc256_B64)); const decryptedBytes = makeStaticByteArray(10, 200); cryptoFunctionService.hmac.mockResolvedValue(makeStaticByteArray(1)); @@ -155,8 +220,17 @@ describe("EncryptService", () => { expect(actual).toBeNull(); }); - it("returns null if encTypes don't match", async () => { - key.encType = EncryptionType.AesCbc256_B64; + it("returns null if mac could not be calculated", async () => { + cryptoFunctionService.hmac.mockResolvedValue(null); + + const actual = await encryptService.decryptToBytes(encBuffer, key); + expect(cryptoFunctionService.hmac).toHaveBeenCalled(); + expect(cryptoFunctionService.aesDecrypt).not.toHaveBeenCalled(); + expect(actual).toBeNull(); + }); + + it("returns null if key is Aes256Cbc but encbuffer is Aes256Cbc_HmacSha256", async () => { + const key = new SymmetricCryptoKey(makeStaticByteArray(32, 0)); cryptoFunctionService.compare.mockResolvedValue(true); const actual = await encryptService.decryptToBytes(encBuffer, key); @@ -164,6 +238,91 @@ describe("EncryptService", () => { expect(actual).toBeNull(); expect(cryptoFunctionService.aesDecrypt).not.toHaveBeenCalled(); }); + + it("returns null if key is Aes256Cbc_HmacSha256 but encbuffer is Aes256Cbc", async () => { + const key = new SymmetricCryptoKey(makeStaticByteArray(64, 0)); + cryptoFunctionService.compare.mockResolvedValue(true); + const buffer = new EncArrayBuffer(makeStaticByteArray(200, EncryptionType.AesCbc256_B64)); + const actual = await encryptService.decryptToBytes(buffer, key); + + expect(actual).toBeNull(); + expect(cryptoFunctionService.aesDecrypt).not.toHaveBeenCalled(); + }); + }); + + describe("decryptToUtf8", () => { + it("throws if no key is provided", () => { + return expect(encryptService.decryptToUtf8(null, null)).rejects.toThrow( + "No key provided for decryption.", + ); + }); + + it("decrypts data with provided key for Aes256Cbc_HmacSha256", async () => { + const key = new SymmetricCryptoKey(makeStaticByteArray(64, 0)); + const encString = new EncString(EncryptionType.AesCbc256_HmacSha256_B64, "data", "iv", "mac"); + cryptoFunctionService.aesDecryptFastParameters.mockReturnValue({ + macData: makeStaticByteArray(32, 0), + macKey: makeStaticByteArray(32, 0), + mac: makeStaticByteArray(32, 0), + } as any); + cryptoFunctionService.hmacFast.mockResolvedValue(makeStaticByteArray(32, 0)); + cryptoFunctionService.compareFast.mockResolvedValue(true); + cryptoFunctionService.aesDecryptFast.mockResolvedValue("data"); + + const actual = await encryptService.decryptToUtf8(encString, key); + expect(actual).toEqual("data"); + expect(cryptoFunctionService.compareFast).toHaveBeenCalledWith( + makeStaticByteArray(32, 0), + makeStaticByteArray(32, 0), + ); + }); + + it("decrypts data with provided key for Aes256Cbc", async () => { + const key = new SymmetricCryptoKey(makeStaticByteArray(32, 0)); + const encString = new EncString(EncryptionType.AesCbc256_B64, "data"); + cryptoFunctionService.aesDecryptFastParameters.mockReturnValue({} as any); + cryptoFunctionService.hmacFast.mockResolvedValue(makeStaticByteArray(32, 0)); + cryptoFunctionService.compareFast.mockResolvedValue(true); + cryptoFunctionService.aesDecryptFast.mockResolvedValue("data"); + + const actual = await encryptService.decryptToUtf8(encString, key); + expect(actual).toEqual("data"); + expect(cryptoFunctionService.compareFast).not.toHaveBeenCalled(); + }); + + it("returns null if key is Aes256Cbc_HmacSha256 but EncString is Aes256Cbc", async () => { + const key = new SymmetricCryptoKey(makeStaticByteArray(64, 0)); + const encString = new EncString(EncryptionType.AesCbc256_B64, "data"); + + const actual = await encryptService.decryptToUtf8(encString, key); + expect(actual).toBeNull(); + expect(logService.error).toHaveBeenCalled(); + }); + + it("returns null if key is Aes256Cbc but encstring is AesCbc256_HmacSha256", async () => { + const key = new SymmetricCryptoKey(makeStaticByteArray(32, 0)); + const encString = new EncString(EncryptionType.AesCbc256_HmacSha256_B64, "data", "iv", "mac"); + + const actual = await encryptService.decryptToUtf8(encString, key); + expect(actual).toBeNull(); + expect(logService.error).toHaveBeenCalled(); + }); + + it("returns null if macs don't match", async () => { + const key = new SymmetricCryptoKey(makeStaticByteArray(64, 0)); + const encString = new EncString(EncryptionType.AesCbc256_HmacSha256_B64, "data", "iv", "mac"); + cryptoFunctionService.aesDecryptFastParameters.mockReturnValue({ + macData: makeStaticByteArray(32, 0), + macKey: makeStaticByteArray(32, 0), + mac: makeStaticByteArray(32, 0), + } as any); + cryptoFunctionService.hmacFast.mockResolvedValue(makeStaticByteArray(32, 0)); + cryptoFunctionService.compareFast.mockResolvedValue(false); + cryptoFunctionService.aesDecryptFast.mockResolvedValue("data"); + + const actual = await encryptService.decryptToUtf8(encString, key); + expect(actual).toBeNull(); + }); }); describe("rsa", () => { @@ -262,4 +421,31 @@ describe("EncryptService", () => { expect(actual).toEqual(key); }); }); + + describe("hash", () => { + it("hashes a string and returns b64", async () => { + cryptoFunctionService.hash.mockResolvedValue(Uint8Array.from([1, 2, 3])); + expect(await encryptService.hash("test", "sha256")).toEqual("AQID"); + expect(cryptoFunctionService.hash).toHaveBeenCalledWith("test", "sha256"); + }); + }); + + describe("decryptItems", () => { + it("returns empty array if no items are provided", async () => { + const key = mock(); + const actual = await encryptService.decryptItems(null, key); + expect(actual).toEqual([]); + }); + + it("returns items decrypted with provided key", async () => { + const key = mock(); + const decryptable = { + decrypt: jest.fn().mockResolvedValue("decrypted"), + }; + const items = [decryptable]; + const actual = await encryptService.decryptItems(items as any, key); + expect(actual).toEqual(["decrypted"]); + expect(decryptable.decrypt).toHaveBeenCalledWith(key); + }); + }); }); diff --git a/libs/common/src/key-management/services/default-process-reload.service.ts b/libs/common/src/key-management/services/default-process-reload.service.ts index 09fe4e7e10c..860dac54855 100644 --- a/libs/common/src/key-management/services/default-process-reload.service.ts +++ b/libs/common/src/key-management/services/default-process-reload.service.ts @@ -5,11 +5,13 @@ import { firstValueFrom, map, timeout } from "rxjs"; import { PinServiceAbstraction } from "@bitwarden/auth/common"; import { BiometricStateService } from "@bitwarden/key-management"; -import { VaultTimeoutSettingsService } from "../../abstractions/vault-timeout/vault-timeout-settings.service"; import { AccountService } from "../../auth/abstractions/account.service"; import { AuthService } from "../../auth/abstractions/auth.service"; import { AuthenticationStatus } from "../../auth/enums/authentication-status"; -import { VaultTimeoutAction } from "../../enums/vault-timeout-action.enum"; +import { + VaultTimeoutAction, + VaultTimeoutSettingsService, +} from "../../key-management/vault-timeout"; import { LogService } from "../../platform/abstractions/log.service"; import { MessagingService } from "../../platform/abstractions/messaging.service"; import { UserId } from "../../types/guid"; diff --git a/libs/common/src/abstractions/vault-timeout/vault-timeout-settings.service.ts b/libs/common/src/key-management/vault-timeout/abstractions/vault-timeout-settings.service.ts similarity index 92% rename from libs/common/src/abstractions/vault-timeout/vault-timeout-settings.service.ts rename to libs/common/src/key-management/vault-timeout/abstractions/vault-timeout-settings.service.ts index e1d91462876..7094a2c2f83 100644 --- a/libs/common/src/abstractions/vault-timeout/vault-timeout-settings.service.ts +++ b/libs/common/src/key-management/vault-timeout/abstractions/vault-timeout-settings.service.ts @@ -2,9 +2,9 @@ // @ts-strict-ignore import { Observable } from "rxjs"; -import { VaultTimeoutAction } from "../../enums/vault-timeout-action.enum"; -import { UserId } from "../../types/guid"; -import { VaultTimeout } from "../../types/vault-timeout.type"; +import { UserId } from "../../../types/guid"; +import { VaultTimeoutAction } from "../enums/vault-timeout-action.enum"; +import { VaultTimeout } from "../types/vault-timeout.type"; export abstract class VaultTimeoutSettingsService { /** diff --git a/libs/common/src/abstractions/vault-timeout/vault-timeout.service.ts b/libs/common/src/key-management/vault-timeout/abstractions/vault-timeout.service.ts similarity index 100% rename from libs/common/src/abstractions/vault-timeout/vault-timeout.service.ts rename to libs/common/src/key-management/vault-timeout/abstractions/vault-timeout.service.ts diff --git a/libs/common/src/enums/vault-timeout-action.enum.ts b/libs/common/src/key-management/vault-timeout/enums/vault-timeout-action.enum.ts similarity index 100% rename from libs/common/src/enums/vault-timeout-action.enum.ts rename to libs/common/src/key-management/vault-timeout/enums/vault-timeout-action.enum.ts diff --git a/libs/common/src/key-management/vault-timeout/index.ts b/libs/common/src/key-management/vault-timeout/index.ts new file mode 100644 index 00000000000..7741752a351 --- /dev/null +++ b/libs/common/src/key-management/vault-timeout/index.ts @@ -0,0 +1,10 @@ +export { VaultTimeoutSettingsService } from "./abstractions/vault-timeout-settings.service"; +export { VaultTimeoutSettingsService as DefaultVaultTimeoutSettingsService } from "./services/vault-timeout-settings.service"; +export { VaultTimeoutService } from "./abstractions/vault-timeout.service"; +export { VaultTimeoutService as DefaultVaultTimeoutService } from "./services/vault-timeout.service"; +export { VaultTimeoutAction } from "./enums/vault-timeout-action.enum"; +export { + VaultTimeout, + VaultTimeoutOption, + VaultTimeoutStringType, +} from "./types/vault-timeout.type"; diff --git a/libs/common/src/services/vault-timeout/vault-timeout-settings.service.spec.ts b/libs/common/src/key-management/vault-timeout/services/vault-timeout-settings.service.spec.ts similarity index 94% rename from libs/common/src/services/vault-timeout/vault-timeout-settings.service.spec.ts rename to libs/common/src/key-management/vault-timeout/services/vault-timeout-settings.service.spec.ts index 78c0bc43331..454a748344f 100644 --- a/libs/common/src/services/vault-timeout/vault-timeout-settings.service.spec.ts +++ b/libs/common/src/key-management/vault-timeout/services/vault-timeout-settings.service.spec.ts @@ -1,3 +1,5 @@ +// FIXME: Update this file to be type safe and remove this and next line +// @ts-strict-ignore import { mock, MockProxy } from "jest-mock-extended"; import { BehaviorSubject, firstValueFrom, map, of } from "rxjs"; @@ -8,22 +10,19 @@ import { } from "@bitwarden/auth/common"; import { BiometricStateService, KeyService } from "@bitwarden/key-management"; -import { FakeAccountService, mockAccountServiceWith, FakeStateProvider } from "../../../spec"; -import { VaultTimeoutSettingsService as VaultTimeoutSettingsServiceAbstraction } from "../../abstractions/vault-timeout/vault-timeout-settings.service"; -import { PolicyService } from "../../admin-console/abstractions/policy/policy.service.abstraction"; -import { Policy } from "../../admin-console/models/domain/policy"; -import { TokenService } from "../../auth/abstractions/token.service"; -import { VaultTimeoutAction } from "../../enums/vault-timeout-action.enum"; -import { LogService } from "../../platform/abstractions/log.service"; -import { Utils } from "../../platform/misc/utils"; -import { - VAULT_TIMEOUT, - VAULT_TIMEOUT_ACTION, -} from "../../services/vault-timeout/vault-timeout-settings.state"; -import { UserId } from "../../types/guid"; -import { VaultTimeout, VaultTimeoutStringType } from "../../types/vault-timeout.type"; +import { FakeAccountService, FakeStateProvider, mockAccountServiceWith } from "../../../../spec"; +import { PolicyService } from "../../../admin-console/abstractions/policy/policy.service.abstraction"; +import { Policy } from "../../../admin-console/models/domain/policy"; +import { TokenService } from "../../../auth/services/token.service"; +import { LogService } from "../../../platform/abstractions/log.service"; +import { Utils } from "../../../platform/misc/utils"; +import { UserId } from "../../../types/guid"; +import { VaultTimeoutSettingsService as VaultTimeoutSettingsServiceAbstraction } from "../abstractions/vault-timeout-settings.service"; +import { VaultTimeoutAction } from "../enums/vault-timeout-action.enum"; +import { VaultTimeout, VaultTimeoutStringType } from "../types/vault-timeout.type"; import { VaultTimeoutSettingsService } from "./vault-timeout-settings.service"; +import { VAULT_TIMEOUT, VAULT_TIMEOUT_ACTION } from "./vault-timeout-settings.state"; describe("VaultTimeoutSettingsService", () => { let accountService: FakeAccountService; diff --git a/libs/common/src/services/vault-timeout/vault-timeout-settings.service.ts b/libs/common/src/key-management/vault-timeout/services/vault-timeout-settings.service.ts similarity index 93% rename from libs/common/src/services/vault-timeout/vault-timeout-settings.service.ts rename to libs/common/src/key-management/vault-timeout/services/vault-timeout-settings.service.ts index 813f187043b..f29687bd9cf 100644 --- a/libs/common/src/services/vault-timeout/vault-timeout-settings.service.ts +++ b/libs/common/src/key-management/vault-timeout/services/vault-timeout-settings.service.ts @@ -21,17 +21,17 @@ import { } from "@bitwarden/auth/common"; import { BiometricStateService, KeyService } from "@bitwarden/key-management"; -import { VaultTimeoutSettingsService as VaultTimeoutSettingsServiceAbstraction } from "../../abstractions/vault-timeout/vault-timeout-settings.service"; -import { PolicyService } from "../../admin-console/abstractions/policy/policy.service.abstraction"; -import { PolicyType } from "../../admin-console/enums"; -import { Policy } from "../../admin-console/models/domain/policy"; -import { AccountService } from "../../auth/abstractions/account.service"; -import { TokenService } from "../../auth/abstractions/token.service"; -import { VaultTimeoutAction } from "../../enums/vault-timeout-action.enum"; -import { LogService } from "../../platform/abstractions/log.service"; -import { StateProvider } from "../../platform/state"; -import { UserId } from "../../types/guid"; -import { VaultTimeout, VaultTimeoutStringType } from "../../types/vault-timeout.type"; +import { PolicyService } from "../../../admin-console/abstractions/policy/policy.service.abstraction"; +import { PolicyType } from "../../../admin-console/enums"; +import { Policy } from "../../../admin-console/models/domain/policy"; +import { AccountService } from "../../../auth/abstractions/account.service"; +import { TokenService } from "../../../auth/abstractions/token.service"; +import { LogService } from "../../../platform/abstractions/log.service"; +import { StateProvider } from "../../../platform/state"; +import { UserId } from "../../../types/guid"; +import { VaultTimeoutSettingsService as VaultTimeoutSettingsServiceAbstraction } from "../abstractions/vault-timeout-settings.service"; +import { VaultTimeoutAction } from "../enums/vault-timeout-action.enum"; +import { VaultTimeout, VaultTimeoutStringType } from "../types/vault-timeout.type"; import { VAULT_TIMEOUT, VAULT_TIMEOUT_ACTION } from "./vault-timeout-settings.state"; diff --git a/libs/common/src/services/vault-timeout/vault-timeout-settings.state.spec.ts b/libs/common/src/key-management/vault-timeout/services/vault-timeout-settings.state.spec.ts similarity index 84% rename from libs/common/src/services/vault-timeout/vault-timeout-settings.state.spec.ts rename to libs/common/src/key-management/vault-timeout/services/vault-timeout-settings.state.spec.ts index 42a82e67ee3..fa8df244793 100644 --- a/libs/common/src/services/vault-timeout/vault-timeout-settings.state.spec.ts +++ b/libs/common/src/key-management/vault-timeout/services/vault-timeout-settings.state.spec.ts @@ -1,6 +1,6 @@ -import { VaultTimeoutAction } from "../../enums/vault-timeout-action.enum"; -import { UserKeyDefinition } from "../../platform/state"; -import { VaultTimeout } from "../../types/vault-timeout.type"; +import { UserKeyDefinition } from "../../../platform/state"; +import { VaultTimeoutAction } from "../enums/vault-timeout-action.enum"; +import { VaultTimeout } from "../types/vault-timeout.type"; import { VAULT_TIMEOUT, VAULT_TIMEOUT_ACTION } from "./vault-timeout-settings.state"; diff --git a/libs/common/src/services/vault-timeout/vault-timeout-settings.state.ts b/libs/common/src/key-management/vault-timeout/services/vault-timeout-settings.state.ts similarity index 83% rename from libs/common/src/services/vault-timeout/vault-timeout-settings.state.ts rename to libs/common/src/key-management/vault-timeout/services/vault-timeout-settings.state.ts index 46097d6a4cc..4d8a0de654a 100644 --- a/libs/common/src/services/vault-timeout/vault-timeout-settings.state.ts +++ b/libs/common/src/key-management/vault-timeout/services/vault-timeout-settings.state.ts @@ -1,6 +1,6 @@ -import { VaultTimeoutAction } from "../../enums/vault-timeout-action.enum"; -import { UserKeyDefinition, VAULT_TIMEOUT_SETTINGS_DISK_LOCAL } from "../../platform/state"; -import { VaultTimeout } from "../../types/vault-timeout.type"; +import { UserKeyDefinition, VAULT_TIMEOUT_SETTINGS_DISK_LOCAL } from "../../../platform/state"; +import { VaultTimeoutAction } from "../enums/vault-timeout-action.enum"; +import { VaultTimeout } from "../types/vault-timeout.type"; /** * Settings use disk storage and local storage on web so settings can persist after logout diff --git a/libs/common/src/services/vault-timeout/vault-timeout.service.spec.ts b/libs/common/src/key-management/vault-timeout/services/vault-timeout.service.spec.ts similarity index 91% rename from libs/common/src/services/vault-timeout/vault-timeout.service.spec.ts rename to libs/common/src/key-management/vault-timeout/services/vault-timeout.service.spec.ts index 986bbbf95a4..0be7daa3f6f 100644 --- a/libs/common/src/services/vault-timeout/vault-timeout.service.spec.ts +++ b/libs/common/src/key-management/vault-timeout/services/vault-timeout.service.spec.ts @@ -1,3 +1,5 @@ +// FIXME: Update this file to be type safe and remove this and next line +// @ts-strict-ignore import { MockProxy, any, mock } from "jest-mock-extended"; import { BehaviorSubject, from, of } from "rxjs"; @@ -5,26 +7,26 @@ import { CollectionService } from "@bitwarden/admin-console/common"; import { LogoutReason } from "@bitwarden/auth/common"; import { BiometricsService } from "@bitwarden/key-management"; -import { FakeAccountService, mockAccountServiceWith } from "../../../spec/fake-account-service"; -import { SearchService } from "../../abstractions/search.service"; -import { VaultTimeoutSettingsService } from "../../abstractions/vault-timeout/vault-timeout-settings.service"; -import { AccountInfo } from "../../auth/abstractions/account.service"; -import { AuthService } from "../../auth/abstractions/auth.service"; -import { AuthenticationStatus } from "../../auth/enums/authentication-status"; -import { FakeMasterPasswordService } from "../../auth/services/master-password/fake-master-password.service"; -import { VaultTimeoutAction } from "../../enums/vault-timeout-action.enum"; -import { LogService } from "../../platform/abstractions/log.service"; -import { MessagingService } from "../../platform/abstractions/messaging.service"; -import { PlatformUtilsService } from "../../platform/abstractions/platform-utils.service"; -import { StateService } from "../../platform/abstractions/state.service"; -import { Utils } from "../../platform/misc/utils"; -import { TaskSchedulerService } from "../../platform/scheduling"; -import { StateEventRunnerService } from "../../platform/state"; -import { UserId } from "../../types/guid"; -import { VaultTimeout, VaultTimeoutStringType } from "../../types/vault-timeout.type"; -import { CipherService } from "../../vault/abstractions/cipher.service"; -import { FolderService } from "../../vault/abstractions/folder/folder.service.abstraction"; +import { FakeAccountService, mockAccountServiceWith } from "../../../../spec"; +import { SearchService } from "../../../abstractions/search.service"; +import { AccountInfo } from "../../../auth/abstractions/account.service"; +import { AuthService } from "../../../auth/abstractions/auth.service"; +import { AuthenticationStatus } from "../../../auth/enums/authentication-status"; +import { FakeMasterPasswordService } from "../../../auth/services/master-password/fake-master-password.service"; +import { LogService } from "../../../platform/abstractions/log.service"; +import { MessagingService } from "../../../platform/abstractions/messaging.service"; +import { PlatformUtilsService } from "../../../platform/abstractions/platform-utils.service"; +import { StateService } from "../../../platform/abstractions/state.service"; +import { Utils } from "../../../platform/misc/utils"; +import { TaskSchedulerService } from "../../../platform/scheduling"; +import { StateEventRunnerService } from "../../../platform/state"; +import { UserId } from "../../../types/guid"; +import { CipherService } from "../../../vault/abstractions/cipher.service"; +import { FolderService } from "../../../vault/abstractions/folder/folder.service.abstraction"; +import { VaultTimeoutAction } from "../enums/vault-timeout-action.enum"; +import { VaultTimeout, VaultTimeoutStringType } from "../types/vault-timeout.type"; +import { VaultTimeoutSettingsService } from "./vault-timeout-settings.service"; import { VaultTimeoutService } from "./vault-timeout.service"; describe("VaultTimeoutService", () => { diff --git a/libs/common/src/services/vault-timeout/vault-timeout.service.ts b/libs/common/src/key-management/vault-timeout/services/vault-timeout.service.ts similarity index 85% rename from libs/common/src/services/vault-timeout/vault-timeout.service.ts rename to libs/common/src/key-management/vault-timeout/services/vault-timeout.service.ts index 08dc02bb1ab..efe8f081b6f 100644 --- a/libs/common/src/services/vault-timeout/vault-timeout.service.ts +++ b/libs/common/src/key-management/vault-timeout/services/vault-timeout.service.ts @@ -6,23 +6,23 @@ import { CollectionService } from "@bitwarden/admin-console/common"; import { LogoutReason } from "@bitwarden/auth/common"; import { BiometricsService } from "@bitwarden/key-management"; -import { SearchService } from "../../abstractions/search.service"; -import { VaultTimeoutSettingsService } from "../../abstractions/vault-timeout/vault-timeout-settings.service"; -import { VaultTimeoutService as VaultTimeoutServiceAbstraction } from "../../abstractions/vault-timeout/vault-timeout.service"; -import { AccountService } from "../../auth/abstractions/account.service"; -import { AuthService } from "../../auth/abstractions/auth.service"; -import { InternalMasterPasswordServiceAbstraction } from "../../auth/abstractions/master-password.service.abstraction"; -import { AuthenticationStatus } from "../../auth/enums/authentication-status"; -import { VaultTimeoutAction } from "../../enums/vault-timeout-action.enum"; -import { LogService } from "../../platform/abstractions/log.service"; -import { MessagingService } from "../../platform/abstractions/messaging.service"; -import { PlatformUtilsService } from "../../platform/abstractions/platform-utils.service"; -import { StateService } from "../../platform/abstractions/state.service"; -import { TaskSchedulerService, ScheduledTaskNames } from "../../platform/scheduling"; -import { StateEventRunnerService } from "../../platform/state"; -import { UserId } from "../../types/guid"; -import { CipherService } from "../../vault/abstractions/cipher.service"; -import { FolderService } from "../../vault/abstractions/folder/folder.service.abstraction"; +import { SearchService } from "../../../abstractions/search.service"; +import { AccountService } from "../../../auth/abstractions/account.service"; +import { AuthService } from "../../../auth/abstractions/auth.service"; +import { InternalMasterPasswordServiceAbstraction } from "../../../auth/abstractions/master-password.service.abstraction"; +import { AuthenticationStatus } from "../../../auth/enums/authentication-status"; +import { LogService } from "../../../platform/abstractions/log.service"; +import { MessagingService } from "../../../platform/abstractions/messaging.service"; +import { PlatformUtilsService } from "../../../platform/abstractions/platform-utils.service"; +import { StateService } from "../../../platform/abstractions/state.service"; +import { TaskSchedulerService, ScheduledTaskNames } from "../../../platform/scheduling"; +import { StateEventRunnerService } from "../../../platform/state"; +import { UserId } from "../../../types/guid"; +import { CipherService } from "../../../vault/abstractions/cipher.service"; +import { FolderService } from "../../../vault/abstractions/folder/folder.service.abstraction"; +import { VaultTimeoutSettingsService } from "../abstractions/vault-timeout-settings.service"; +import { VaultTimeoutService as VaultTimeoutServiceAbstraction } from "../abstractions/vault-timeout.service"; +import { VaultTimeoutAction } from "../enums/vault-timeout-action.enum"; export class VaultTimeoutService implements VaultTimeoutServiceAbstraction { private inited = false; diff --git a/libs/common/src/types/vault-timeout.type.ts b/libs/common/src/key-management/vault-timeout/types/vault-timeout.type.ts similarity index 100% rename from libs/common/src/types/vault-timeout.type.ts rename to libs/common/src/key-management/vault-timeout/types/vault-timeout.type.ts diff --git a/libs/common/src/models/response/notification.response.ts b/libs/common/src/models/response/notification.response.ts index 894a00ee885..aa0ecc97b58 100644 --- a/libs/common/src/models/response/notification.response.ts +++ b/libs/common/src/models/response/notification.response.ts @@ -12,7 +12,16 @@ export class NotificationResponse extends BaseResponse { this.contextId = this.getResponseProperty("ContextId"); this.type = this.getResponseProperty("Type"); - const payload = this.getResponseProperty("Payload"); + let payload = this.getResponseProperty("Payload"); + + if (typeof payload === "string") { + try { + payload = JSON.parse(payload); + } catch { + // guess it was a string + } + } + switch (this.type) { case NotificationType.SyncCipherCreate: case NotificationType.SyncCipherDelete: diff --git a/libs/common/src/platform/abstractions/environment.service.ts b/libs/common/src/platform/abstractions/environment.service.ts index 8d32fc4231d..4a10f856893 100644 --- a/libs/common/src/platform/abstractions/environment.service.ts +++ b/libs/common/src/platform/abstractions/environment.service.ts @@ -128,7 +128,7 @@ export abstract class EnvironmentService { /** * Get the environment from state. Useful if you need to get the environment for another user. */ - abstract getEnvironment$(userId?: string): Observable; + abstract getEnvironment$(userId: UserId): Observable; /** * @deprecated Use {@link getEnvironment$} instead. diff --git a/libs/common/src/platform/abstractions/sdk/sdk-load.service.ts b/libs/common/src/platform/abstractions/sdk/sdk-load.service.ts index 16482e797b2..fb443d61777 100644 --- a/libs/common/src/platform/abstractions/sdk/sdk-load.service.ts +++ b/libs/common/src/platform/abstractions/sdk/sdk-load.service.ts @@ -1,3 +1,52 @@ -export abstract class SdkLoadService { - abstract load(): Promise; +import { init_sdk } from "@bitwarden/sdk-internal"; + +// eslint-disable-next-line @typescript-eslint/no-unused-vars -- used in docs +import type { SdkService } from "./sdk.service"; + +export class SdkLoadFailedError extends Error { + constructor(error: unknown) { + super(`SDK loading failed: ${error}`); + } +} + +export abstract class SdkLoadService { + private static markAsReady: () => void; + private static markAsFailed: (error: unknown) => void; + + /** + * This promise is resolved when the SDK is ready to be used. Use it when your code might run early and/or is not able to use DI. + * Beware that WASM always requires a load step which makes it tricky to use functions and classes directly, it is therefore recommended + * to use the SDK through the {@link SdkService}. Only use this promise in advanced scenarios! + * + * @example + * ```typescript + * import { pureFunction } from "@bitwarden/sdk-internal"; + * + * async function myFunction() { + * await SdkLoadService.Ready; + * pureFunction(); + * } + * ``` + */ + static readonly Ready = new Promise((resolve, reject) => { + SdkLoadService.markAsReady = resolve; + SdkLoadService.markAsFailed = (error: unknown) => reject(new SdkLoadFailedError(error)); + }); + + /** + * Load WASM and initalize SDK-JS integrations such as logging. + * This method should be called once at the start of the application. + * Raw functions and classes from the SDK can be used after this method resolves. + */ + async loadAndInit(): Promise { + try { + await this.load(); + init_sdk(); + SdkLoadService.markAsReady(); + } catch (error) { + SdkLoadService.markAsFailed(error); + } + } + + protected abstract load(): Promise; } diff --git a/libs/common/src/platform/misc/reference-counting/rc.spec.ts b/libs/common/src/platform/misc/reference-counting/rc.spec.ts index 094abfe3615..f8767242ba5 100644 --- a/libs/common/src/platform/misc/reference-counting/rc.spec.ts +++ b/libs/common/src/platform/misc/reference-counting/rc.spec.ts @@ -1,11 +1,3 @@ -// Temporary workaround for Symbol.dispose -// remove when https://github.com/jestjs/jest/issues/14874 is resolved and *released* -const disposeSymbol: unique symbol = Symbol("Symbol.dispose"); -const asyncDisposeSymbol: unique symbol = Symbol("Symbol.asyncDispose"); -(Symbol as any).asyncDispose ??= asyncDisposeSymbol as unknown as SymbolConstructor["asyncDispose"]; -(Symbol as any).dispose ??= disposeSymbol as unknown as SymbolConstructor["dispose"]; - -// Import needs to be after the workaround import { Rc } from "./rc"; export class FreeableTestValue { diff --git a/libs/common/src/platform/models/domain/symmetric-crypto-key.spec.ts b/libs/common/src/platform/models/domain/symmetric-crypto-key.spec.ts index f39b298a27d..e4c43264eaf 100644 --- a/libs/common/src/platform/models/domain/symmetric-crypto-key.spec.ts +++ b/libs/common/src/platform/models/domain/symmetric-crypto-key.spec.ts @@ -20,7 +20,7 @@ describe("SymmetricCryptoKey", () => { expect(cryptoKey).toEqual({ encKey: key, encKeyB64: "AAECAwQFBgcICQoLDA0ODxAREhMUFRYXGBkaGxwdHh8=", - encType: 0, + encType: EncryptionType.AesCbc256_B64, key: key, keyB64: "AAECAwQFBgcICQoLDA0ODxAREhMUFRYXGBkaGxwdHh8=", macKey: null, @@ -49,7 +49,7 @@ describe("SymmetricCryptoKey", () => { expect(cryptoKey).toEqual({ encKey: key.slice(0, 32), encKeyB64: "AAECAwQFBgcICQoLDA0ODxAREhMUFRYXGBkaGxwdHh8=", - encType: 2, + encType: EncryptionType.AesCbc256_HmacSha256_B64, key: key, keyB64: "AAECAwQFBgcICQoLDA0ODxAREhMUFRYXGBkaGxwdHh8gISIjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+Pw==", @@ -83,4 +83,21 @@ describe("SymmetricCryptoKey", () => { expect(actual).toEqual(expected); expect(actual).toBeInstanceOf(SymmetricCryptoKey); }); + + describe("fromString", () => { + it("null string returns null", () => { + const actual = SymmetricCryptoKey.fromString(null); + + expect(actual).toBeNull(); + }); + + it("base64 string creates object", () => { + const key = makeStaticByteArray(64); + const expected = new SymmetricCryptoKey(key); + const actual = SymmetricCryptoKey.fromString(expected.keyB64); + + expect(actual).toEqual(expected); + expect(actual).toBeInstanceOf(SymmetricCryptoKey); + }); + }); }); diff --git a/libs/common/src/platform/notifications/internal/worker-webpush-connection.service.ts b/libs/common/src/platform/notifications/internal/worker-webpush-connection.service.ts index 631c624d667..74981b6782f 100644 --- a/libs/common/src/platform/notifications/internal/worker-webpush-connection.service.ts +++ b/libs/common/src/platform/notifications/internal/worker-webpush-connection.service.ts @@ -124,7 +124,9 @@ class MyWebPushConnector implements WebPushConnector { return this.webPushApiService.putSubscription(subscription.toJSON()); }).pipe( switchMap(() => this.pushEvent$), - map((e) => new NotificationResponse(e.data.json().data)), + map((e) => { + return new NotificationResponse(e.data.json().data); + }), ); }), ); diff --git a/libs/common/src/platform/services/config/config.service.spec.ts b/libs/common/src/platform/services/config/config.service.spec.ts index 369338f945f..ea3b56a32f1 100644 --- a/libs/common/src/platform/services/config/config.service.spec.ts +++ b/libs/common/src/platform/services/config/config.service.spec.ts @@ -361,8 +361,6 @@ describe("ConfigService", () => { const configs = await firstValueFrom(sut.serverConfig$.pipe(bufferCount(2))); - await jest.runOnlyPendingTimersAsync(); - expect(configs[0].gitHash).toBe("existing-data"); expect(configs[1].gitHash).toBe("slow-response"); }); diff --git a/libs/common/src/platform/services/default-environment.service.spec.ts b/libs/common/src/platform/services/default-environment.service.spec.ts index 870f887c160..553f80f83b8 100644 --- a/libs/common/src/platform/services/default-environment.service.spec.ts +++ b/libs/common/src/platform/services/default-environment.service.spec.ts @@ -304,85 +304,21 @@ describe("EnvironmentService", () => { }); }); - describe("getEnvironment", () => { + describe("getEnvironment$", () => { it.each([ { region: Region.US, expectedHost: "bitwarden.com" }, { region: Region.EU, expectedHost: "bitwarden.eu" }, - ])("gets it from user data if there is an active user", async ({ region, expectedHost }) => { - setGlobalData(Region.US, new EnvironmentUrls()); - setUserData(region, new EnvironmentUrls()); + ])("gets it from the passed in userId: %s", async ({ region, expectedHost }) => { + setUserData(Region.US, new EnvironmentUrls()); + setUserData(region, new EnvironmentUrls(), alternateTestUser); await switchUser(testUser); - const env = await firstValueFrom(sut.getEnvironment$()); - expect(env.getHostname()).toBe(expectedHost); + const env = await firstValueFrom(sut.getEnvironment$(alternateTestUser)); + expect(env?.getHostname()).toBe(expectedHost); }); - it.each([ - { region: Region.US, expectedHost: "bitwarden.com" }, - { region: Region.EU, expectedHost: "bitwarden.eu" }, - ])("gets it from global data if there is no active user", async ({ region, expectedHost }) => { - setGlobalData(region, new EnvironmentUrls()); - setUserData(Region.US, new EnvironmentUrls()); - - const env = await firstValueFrom(sut.getEnvironment$()); - expect(env.getHostname()).toBe(expectedHost); - }); - - it.each([ - { region: Region.US, expectedHost: "bitwarden.com" }, - { region: Region.EU, expectedHost: "bitwarden.eu" }, - ])( - "gets it from global state if there is no active user even if a user id is passed in.", - async ({ region, expectedHost }) => { - setGlobalData(region, new EnvironmentUrls()); - setUserData(Region.US, new EnvironmentUrls()); - - const env = await firstValueFrom(sut.getEnvironment$(testUser)); - expect(env.getHostname()).toBe(expectedHost); - }, - ); - - it.each([ - { region: Region.US, expectedHost: "bitwarden.com" }, - { region: Region.EU, expectedHost: "bitwarden.eu" }, - ])( - "gets it from the passed in userId if there is any active user: %s", - async ({ region, expectedHost }) => { - setGlobalData(Region.US, new EnvironmentUrls()); - setUserData(Region.US, new EnvironmentUrls()); - setUserData(region, new EnvironmentUrls(), alternateTestUser); - - await switchUser(testUser); - - const env = await firstValueFrom(sut.getEnvironment$(alternateTestUser)); - expect(env.getHostname()).toBe(expectedHost); - }, - ); - - it("gets it from base url saved in self host config", async () => { - const globalSelfHostUrls = new EnvironmentUrls(); - globalSelfHostUrls.base = "https://base.example.com"; - setGlobalData(Region.SelfHosted, globalSelfHostUrls); - setUserData(Region.EU, new EnvironmentUrls()); - - const env = await firstValueFrom(sut.getEnvironment$()); - expect(env.getHostname()).toBe("base.example.com"); - }); - - it("gets it from webVault url saved in self host config", async () => { - const globalSelfHostUrls = new EnvironmentUrls(); - globalSelfHostUrls.webVault = "https://vault.example.com"; - globalSelfHostUrls.base = "https://base.example.com"; - setGlobalData(Region.SelfHosted, globalSelfHostUrls); - setUserData(Region.EU, new EnvironmentUrls()); - - const env = await firstValueFrom(sut.getEnvironment$()); - expect(env.getHostname()).toBe("vault.example.com"); - }); - - it("gets it from saved self host config from passed in user when there is an active user", async () => { - setGlobalData(Region.US, new EnvironmentUrls()); + it("gets env from saved self host config from passed in user when there is a different active user", async () => { setUserData(Region.EU, new EnvironmentUrls()); const selfHostUserUrls = new EnvironmentUrls(); @@ -392,7 +328,31 @@ describe("EnvironmentService", () => { await switchUser(testUser); const env = await firstValueFrom(sut.getEnvironment$(alternateTestUser)); - expect(env.getHostname()).toBe("base.example.com"); + expect(env?.getHostname()).toBe("base.example.com"); + }); + }); + + describe("getEnvironment (deprecated)", () => { + it("gets self hosted env from active user when no user passed in", async () => { + const selfHostUserUrls = new EnvironmentUrls(); + selfHostUserUrls.base = "https://base.example.com"; + setUserData(Region.SelfHosted, selfHostUserUrls); + + await switchUser(testUser); + + const env = await sut.getEnvironment(); + expect(env?.getHostname()).toBe("base.example.com"); + }); + + it("gets self hosted env from passed in user", async () => { + const selfHostUserUrls = new EnvironmentUrls(); + selfHostUserUrls.base = "https://base.example.com"; + setUserData(Region.SelfHosted, selfHostUserUrls); + + await switchUser(testUser); + + const env = await sut.getEnvironment(testUser); + expect(env?.getHostname()).toBe("base.example.com"); }); }); diff --git a/libs/common/src/platform/services/default-environment.service.ts b/libs/common/src/platform/services/default-environment.service.ts index ac3e39b2bb3..df55693ba0b 100644 --- a/libs/common/src/platform/services/default-environment.service.ts +++ b/libs/common/src/platform/services/default-environment.service.ts @@ -271,19 +271,8 @@ export class DefaultEnvironmentService implements EnvironmentService { } } - getEnvironment$(userId?: UserId): Observable { - if (userId == null) { - return this.environment$; - } - - return this.activeAccountId$.pipe( - switchMap((activeUserId) => { - // Previous rules dictated that we only get from user scoped state if there is an active user. - if (activeUserId == null) { - return this.globalState.state$; - } - return this.stateProvider.getUser(userId ?? activeUserId, USER_ENVIRONMENT_KEY).state$; - }), + getEnvironment$(userId: UserId): Observable { + return this.stateProvider.getUser(userId, USER_ENVIRONMENT_KEY).state$.pipe( map((state) => { return this.buildEnvironment(state?.region, state?.urls); }), @@ -294,7 +283,10 @@ export class DefaultEnvironmentService implements EnvironmentService { * @deprecated Use getEnvironment$ instead. */ async getEnvironment(userId?: UserId): Promise { - return firstValueFrom(this.getEnvironment$(userId)); + // Add backwards compatibility support for null userId + const definedUserId = userId ?? (await firstValueFrom(this.activeAccountId$)); + + return firstValueFrom(this.getEnvironment$(definedUserId)); } async seedUserEnvironment(userId: UserId) { diff --git a/libs/common/src/platform/services/sdk/default-sdk-load.service.ts b/libs/common/src/platform/services/sdk/default-sdk-load.service.ts index eff641f0351..0c4114b8796 100644 --- a/libs/common/src/platform/services/sdk/default-sdk-load.service.ts +++ b/libs/common/src/platform/services/sdk/default-sdk-load.service.ts @@ -8,7 +8,7 @@ import { SdkLoadService } from "../../abstractions/sdk/sdk-load.service"; * * **Warning**: This requires WASM support and will fail if the environment does not support it. */ -export class DefaultSdkLoadService implements SdkLoadService { +export class DefaultSdkLoadService extends SdkLoadService { async load(): Promise { (sdk as any).init(bitwardenModule); } diff --git a/libs/common/src/platform/services/sdk/default-sdk.service.spec.ts b/libs/common/src/platform/services/sdk/default-sdk.service.spec.ts index fed4746acd3..a66b2a9cb6f 100644 --- a/libs/common/src/platform/services/sdk/default-sdk.service.spec.ts +++ b/libs/common/src/platform/services/sdk/default-sdk.service.spec.ts @@ -11,6 +11,7 @@ import { UserKey } from "../../../types/key"; import { Environment, EnvironmentService } from "../../abstractions/environment.service"; import { PlatformUtilsService } from "../../abstractions/platform-utils.service"; import { SdkClientFactory } from "../../abstractions/sdk/sdk-client-factory"; +import { SdkLoadService } from "../../abstractions/sdk/sdk-load.service"; import { UserNotLoggedInError } from "../../abstractions/sdk/sdk.service"; import { Rc } from "../../misc/reference-counting/rc"; import { EncryptedString } from "../../models/domain/enc-string"; @@ -18,6 +19,13 @@ import { SymmetricCryptoKey } from "../../models/domain/symmetric-crypto-key"; import { DefaultSdkService } from "./default-sdk.service"; +class TestSdkLoadService extends SdkLoadService { + protected override load(): Promise { + // Simulate successfull WASM load + return Promise.resolve(); + } +} + describe("DefaultSdkService", () => { describe("userClient$", () => { let sdkClientFactory!: MockProxy; @@ -28,7 +36,9 @@ describe("DefaultSdkService", () => { let keyService!: MockProxy; let service!: DefaultSdkService; - beforeEach(() => { + beforeEach(async () => { + await new TestSdkLoadService().loadAndInit(); + sdkClientFactory = mock(); environmentService = mock(); platformUtilsService = mock(); diff --git a/libs/common/src/platform/services/sdk/default-sdk.service.ts b/libs/common/src/platform/services/sdk/default-sdk.service.ts index 96a1dedf175..5c381c7dd1b 100644 --- a/libs/common/src/platform/services/sdk/default-sdk.service.ts +++ b/libs/common/src/platform/services/sdk/default-sdk.service.ts @@ -18,7 +18,6 @@ import { KeyService, KdfConfigService, KdfConfig, KdfType } from "@bitwarden/key import { BitwardenClient, ClientSettings, - LogLevel, DeviceType as SdkDeviceType, } from "@bitwarden/sdk-internal"; @@ -30,6 +29,7 @@ import { UserKey } from "../../../types/key"; import { Environment, EnvironmentService } from "../../abstractions/environment.service"; import { PlatformUtilsService } from "../../abstractions/platform-utils.service"; import { SdkClientFactory } from "../../abstractions/sdk/sdk-client-factory"; +import { SdkLoadService } from "../../abstractions/sdk/sdk-load.service"; import { SdkService, UserNotLoggedInError } from "../../abstractions/sdk/sdk.service"; import { compareValues } from "../../misc/compare-values"; import { Rc } from "../../misc/reference-counting/rc"; @@ -47,8 +47,9 @@ export class DefaultSdkService implements SdkService { client$ = this.environmentService.environment$.pipe( concatMap(async (env) => { + await SdkLoadService.Ready; const settings = this.toSettings(env); - return await this.sdkClientFactory.createSdkClient(settings, LogLevel.Info); + return await this.sdkClientFactory.createSdkClient(settings); }), shareReplay({ refCount: true, bufferSize: 1 }), ); @@ -135,6 +136,7 @@ export class DefaultSdkService implements SdkService { privateKey$, userKey$, orgKeys$, + SdkLoadService.Ready, // Makes sure we wait (once) for the SDK to be loaded ]).pipe( // switchMap is required to allow the clean-up logic to be executed when `combineLatest` emits a new value. switchMap(([env, account, kdfParams, privateKey, userKey, orgKeys]) => { @@ -146,7 +148,7 @@ export class DefaultSdkService implements SdkService { } const settings = this.toSettings(env); - const client = await this.sdkClientFactory.createSdkClient(settings, LogLevel.Info); + const client = await this.sdkClientFactory.createSdkClient(settings); await this.initializeClient(client, account, kdfParams, privateKey, userKey, orgKeys); diff --git a/libs/common/src/platform/services/sdk/noop-sdk-load.service.ts b/libs/common/src/platform/services/sdk/noop-sdk-load.service.ts index 60dac4f21f1..9fd04fdf833 100644 --- a/libs/common/src/platform/services/sdk/noop-sdk-load.service.ts +++ b/libs/common/src/platform/services/sdk/noop-sdk-load.service.ts @@ -2,6 +2,6 @@ import { SdkLoadService } from "../../abstractions/sdk/sdk-load.service"; export class NoopSdkLoadService extends SdkLoadService { async load() { - return; + throw new Error("SDK not available in this environment"); } } diff --git a/libs/common/src/platform/services/state.service.ts b/libs/common/src/platform/services/state.service.ts index d452732aa3d..a78a9b37a8c 100644 --- a/libs/common/src/platform/services/state.service.ts +++ b/libs/common/src/platform/services/state.service.ts @@ -134,7 +134,6 @@ export class StateService< } async addAccount(account: TAccount) { - await this.environmentService.seedUserEnvironment(account.profile.userId as UserId); await this.updateState(async (state) => { state.accounts[account.profile.userId] = account; return state; diff --git a/libs/common/src/platform/state/state-definitions.ts b/libs/common/src/platform/state/state-definitions.ts index c7901bc34e2..84d5b81ee73 100644 --- a/libs/common/src/platform/state/state-definitions.ts +++ b/libs/common/src/platform/state/state-definitions.ts @@ -199,3 +199,4 @@ export const NEW_DEVICE_VERIFICATION_NOTICE = new StateDefinition( ); export const VAULT_APPEARANCE = new StateDefinition("vaultAppearance", "disk"); export const SECURITY_TASKS_DISK = new StateDefinition("securityTasks", "disk"); +export const AT_RISK_PASSWORDS_PAGE_DISK = new StateDefinition("atRiskPasswordsPage", "disk"); diff --git a/libs/common/src/services/api.service.ts b/libs/common/src/services/api.service.ts index ad59ad0837a..7a43daccf6e 100644 --- a/libs/common/src/services/api.service.ts +++ b/libs/common/src/services/api.service.ts @@ -11,7 +11,6 @@ import { import { LogoutReason } from "@bitwarden/auth/common"; import { ApiService as ApiServiceAbstraction } from "../abstractions/api.service"; -import { VaultTimeoutSettingsService } from "../abstractions/vault-timeout/vault-timeout-settings.service"; import { OrganizationConnectionType } from "../admin-console/enums"; import { OrganizationSponsorshipCreateRequest } from "../admin-console/models/request/organization/organization-sponsorship-create.request"; import { OrganizationSponsorshipRedeemRequest } from "../admin-console/models/request/organization/organization-sponsorship-redeem.request"; @@ -105,7 +104,8 @@ import { PlanResponse } from "../billing/models/response/plan.response"; import { SubscriptionResponse } from "../billing/models/response/subscription.response"; import { TaxInfoResponse } from "../billing/models/response/tax-info.response"; import { DeviceType } from "../enums"; -import { VaultTimeoutAction } from "../enums/vault-timeout-action.enum"; +import { VaultTimeoutSettingsService } from "../key-management/vault-timeout"; +import { VaultTimeoutAction } from "../key-management/vault-timeout/enums/vault-timeout-action.enum"; import { CollectionBulkDeleteRequest } from "../models/request/collection-bulk-delete.request"; import { DeleteRecoverRequest } from "../models/request/delete-recover.request"; import { EventRequest } from "../models/request/event.request"; @@ -1863,7 +1863,7 @@ export class ApiService implements ApiServiceAbstraction { body: any, authed: boolean, hasResponse: boolean, - apiUrl?: string, + apiUrl?: string | null, alterHeaders?: (headers: Headers) => void, ): Promise { const env = await firstValueFrom(this.environmentService.environment$); diff --git a/libs/common/src/vault/services/cipher.service.ts b/libs/common/src/vault/services/cipher.service.ts index e66b6be0524..05c875e7546 100644 --- a/libs/common/src/vault/services/cipher.service.ts +++ b/libs/common/src/vault/services/cipher.service.ts @@ -980,10 +980,14 @@ export class CipherService implements CipherServiceAbstraction { async upsert(cipher: CipherData | CipherData[]): Promise> { const ciphers = cipher instanceof CipherData ? [cipher] : cipher; - return await this.updateEncryptedCipherState((current) => { + const res = await this.updateEncryptedCipherState((current) => { ciphers.forEach((c) => (current[c.id as CipherId] = c)); return current; }); + // Some state storage providers (e.g. Electron) don't update the state immediately, wait for next tick + // Otherwise, subscribers to cipherViews$ can get stale data + await new Promise((resolve) => setTimeout(resolve, 0)); + return res; } async replace(ciphers: { [id: string]: CipherData }, userId: UserId): Promise { @@ -1000,13 +1004,16 @@ export class CipherService implements CipherServiceAbstraction { userId: UserId = null, ): Promise> { userId ||= await firstValueFrom(this.stateProvider.activeUserId$); - await this.clearDecryptedCiphersState(userId); + await this.clearCache(userId); const updatedCiphers = await this.stateProvider .getUser(userId, ENCRYPTED_CIPHERS) .update((current) => { const result = update(current ?? {}); return result; }); + // Some state storage providers (e.g. Electron) don't update the state immediately, wait for next tick + // Otherwise, subscribers to cipherViews$ can get stale data + await new Promise((resolve) => setTimeout(resolve, 0)); return updatedCiphers; } diff --git a/libs/common/test.setup.ts b/libs/common/test.setup.ts index aa71b3e508a..9087c15c6b6 100644 --- a/libs/common/test.setup.ts +++ b/libs/common/test.setup.ts @@ -1,3 +1,5 @@ +import "core-js/proposals/explicit-resource-management"; + import { webcrypto } from "crypto"; import { addCustomMatchers } from "./spec"; diff --git a/libs/components/src/dialog/simple-dialog/simple-dialog.component.html b/libs/components/src/dialog/simple-dialog/simple-dialog.component.html index 1f154a8d543..d810838cabb 100644 --- a/libs/components/src/dialog/simple-dialog/simple-dialog.component.html +++ b/libs/components/src/dialog/simple-dialog/simple-dialog.component.html @@ -3,10 +3,12 @@ @fadeIn >
- @if (hasIcon) { - - } @else { - + @if (!hideIcon()) { + @if (hasIcon) { + + } @else { + + } }

({ + props: args, + template: ` + + Premium Subscription Available + Message Content + + + + + + `, + }), +}; + export const ScrollingContent: Story = { - render: (args: SimpleDialogComponent) => ({ + render: (args) => ({ props: args, template: ` diff --git a/libs/importer/src/importers/base-importer.ts b/libs/importer/src/importers/base-importer.ts index 1992f676e29..90af5344cfc 100644 --- a/libs/importer/src/importers/base-importer.ts +++ b/libs/importer/src/importers/base-importer.ts @@ -20,6 +20,7 @@ import { ImportResult } from "../models/import-result"; export abstract class BaseImporter { organizationId: string = null; + // FIXME: This should be replaced by injecting the log service. protected logService: LogService = new ConsoleLogService(false); protected newLineRegex = /(?:\r\n|\r|\n)/; diff --git a/libs/importer/src/importers/passsordxp/passwordxp-csv-importer.spec.ts b/libs/importer/src/importers/passsordxp/passwordxp-csv-importer.spec.ts index 1bcc79723ab..0decd1e2830 100644 --- a/libs/importer/src/importers/passsordxp/passwordxp-csv-importer.spec.ts +++ b/libs/importer/src/importers/passsordxp/passwordxp-csv-importer.spec.ts @@ -48,6 +48,8 @@ describe("PasswordXPCsvImporter", () => { beforeEach(() => { importer = new PasswordXPCsvImporter(); + // Importers currently create their own ConsoleLogService. This should be replaced by injecting a test log service. + jest.spyOn(console, "warn").mockImplementation(); }); it("should return success false if CSV data is null", async () => { diff --git a/libs/importer/src/importers/roboform-csv-importer.spec.ts b/libs/importer/src/importers/roboform-csv-importer.spec.ts index 2779a9ddb64..dd385e10b8d 100644 --- a/libs/importer/src/importers/roboform-csv-importer.spec.ts +++ b/libs/importer/src/importers/roboform-csv-importer.spec.ts @@ -5,6 +5,11 @@ import { data as dataNoFolder } from "./spec-data/roboform-csv/empty-folders"; import { data as dataFolder } from "./spec-data/roboform-csv/with-folders"; describe("Roboform CSV Importer", () => { + beforeEach(() => { + // Importers currently create their own ConsoleLogService. This should be replaced by injecting a test log service. + jest.spyOn(console, "warn").mockImplementation(); + }); + it("should parse CSV data", async () => { const importer = new RoboFormCsvImporter(); const result = await importer.parse(dataNoFolder); diff --git a/libs/importer/src/importers/securesafe-csv-importer.spec.ts b/libs/importer/src/importers/securesafe-csv-importer.spec.ts index 799c3c6e9d5..e5ddbf75382 100644 --- a/libs/importer/src/importers/securesafe-csv-importer.spec.ts +++ b/libs/importer/src/importers/securesafe-csv-importer.spec.ts @@ -51,6 +51,11 @@ const CipherData = [ ]; describe("SecureSafe CSV Importer", () => { + beforeEach(() => { + // Importers currently create their own ConsoleLogService. This should be replaced by injecting a test log service. + jest.spyOn(console, "warn").mockImplementation(); + }); + CipherData.forEach((data) => { it(data.title, async () => { const importer = new SecureSafeCsvImporter(); diff --git a/libs/key-management/src/key.service.spec.ts b/libs/key-management/src/key.service.spec.ts index 0b56273d3bd..ca14f31a229 100644 --- a/libs/key-management/src/key.service.spec.ts +++ b/libs/key-management/src/key.service.spec.ts @@ -5,6 +5,8 @@ import { PinServiceAbstraction } from "@bitwarden/auth/common"; import { EncryptedOrganizationKeyData } from "@bitwarden/common/admin-console/models/data/encrypted-organization-key.data"; import { FakeMasterPasswordService } from "@bitwarden/common/auth/services/master-password/fake-master-password.service"; import { EncryptService } from "@bitwarden/common/key-management/crypto/abstractions/encrypt.service"; +import { VaultTimeoutStringType } from "@bitwarden/common/key-management/vault-timeout"; +import { VAULT_TIMEOUT } from "@bitwarden/common/key-management/vault-timeout/services/vault-timeout-settings.state"; import { CryptoFunctionService } from "@bitwarden/common/platform/abstractions/crypto-function.service"; import { KeyGenerationService } from "@bitwarden/common/platform/abstractions/key-generation.service"; import { LogService } from "@bitwarden/common/platform/abstractions/log.service"; @@ -22,7 +24,6 @@ import { USER_KEY, } from "@bitwarden/common/platform/services/key-state/user-key.state"; import { UserKeyDefinition } from "@bitwarden/common/platform/state"; -import { VAULT_TIMEOUT } from "@bitwarden/common/services/vault-timeout/vault-timeout-settings.state"; import { awaitAsync, makeEncString, @@ -37,7 +38,6 @@ import { import { CsprngArray } from "@bitwarden/common/types/csprng"; import { OrganizationId, UserId } from "@bitwarden/common/types/guid"; import { UserKey, MasterKey } from "@bitwarden/common/types/key"; -import { VaultTimeoutStringType } from "@bitwarden/common/types/vault-timeout.type"; import { KdfConfigService } from "./abstractions/kdf-config.service"; import { UserPrivateKeyDecryptionFailedError } from "./abstractions/key.service"; diff --git a/libs/key-management/src/key.service.ts b/libs/key-management/src/key.service.ts index b174087b766..129c33f1e80 100644 --- a/libs/key-management/src/key.service.ts +++ b/libs/key-management/src/key.service.ts @@ -19,6 +19,8 @@ import { ProfileProviderResponse } from "@bitwarden/common/admin-console/models/ import { AccountService } from "@bitwarden/common/auth/abstractions/account.service"; import { InternalMasterPasswordServiceAbstraction } from "@bitwarden/common/auth/abstractions/master-password.service.abstraction"; import { EncryptService } from "@bitwarden/common/key-management/crypto/abstractions/encrypt.service"; +import { VaultTimeoutStringType } from "@bitwarden/common/key-management/vault-timeout"; +import { VAULT_TIMEOUT } from "@bitwarden/common/key-management/vault-timeout/services/vault-timeout-settings.state"; import { CryptoFunctionService } from "@bitwarden/common/platform/abstractions/crypto-function.service"; import { KeyGenerationService } from "@bitwarden/common/platform/abstractions/key-generation.service"; import { LogService } from "@bitwarden/common/platform/abstractions/log.service"; @@ -38,7 +40,6 @@ import { USER_KEY, } from "@bitwarden/common/platform/services/key-state/user-key.state"; import { ActiveUserState, StateProvider } from "@bitwarden/common/platform/state"; -import { VAULT_TIMEOUT } from "@bitwarden/common/services/vault-timeout/vault-timeout-settings.state"; import { CsprngArray } from "@bitwarden/common/types/csprng"; import { OrganizationId, ProviderId, UserId } from "@bitwarden/common/types/guid"; import { @@ -50,7 +51,6 @@ import { UserPrivateKey, UserPublicKey, } from "@bitwarden/common/types/key"; -import { VaultTimeoutStringType } from "@bitwarden/common/types/vault-timeout.type"; import { KdfConfigService } from "./abstractions/kdf-config.service"; import { diff --git a/libs/vault/src/components/carousel/carousel.component.html b/libs/vault/src/components/carousel/carousel.component.html index b3e124e02bb..04c6e559056 100644 --- a/libs/vault/src/components/carousel/carousel.component.html +++ b/libs/vault/src/components/carousel/carousel.component.html @@ -20,6 +20,6 @@ >

- +
diff --git a/libs/vault/src/components/carousel/carousel.component.ts b/libs/vault/src/components/carousel/carousel.component.ts index ab6d0a38f3e..2346ee29902 100644 --- a/libs/vault/src/components/carousel/carousel.component.ts +++ b/libs/vault/src/components/carousel/carousel.component.ts @@ -8,12 +8,12 @@ import { ContentChildren, ElementRef, EventEmitter, + inject, Input, Output, QueryList, ViewChild, ViewChildren, - inject, } from "@angular/core"; import { ButtonModule } from "@bitwarden/components"; @@ -89,7 +89,7 @@ export class VaultCarouselComponent implements AfterViewInit { this.slideChange.emit(index); } - ngAfterViewInit(): void { + async ngAfterViewInit() { this.keyManager = new FocusKeyManager(this.carouselButtons) .withHorizontalOrientation("ltr") .withWrap() @@ -98,7 +98,7 @@ export class VaultCarouselComponent implements AfterViewInit { // Set the first carousel button as active, this avoids having to double tab the arrow keys on initial focus. this.keyManager.setFirstItemActive(); - this.setMinHeightOfCarousel(); + await this.setMinHeightOfCarousel(); } /** @@ -106,7 +106,7 @@ export class VaultCarouselComponent implements AfterViewInit { * Render each slide in a temporary portal outlet to get the height of each slide * and store the tallest slide height. */ - private setMinHeightOfCarousel() { + private async setMinHeightOfCarousel() { // Store the height of the carousel button element. const heightOfButtonsPx = this.carouselButtonWrapper.nativeElement.offsetHeight; @@ -121,13 +121,14 @@ export class VaultCarouselComponent implements AfterViewInit { // to determine the height of the first slide. let tallestSlideHeightPx = containerHeight - heightOfButtonsPx; - this.slides.forEach((slide, index) => { - // Skip the first slide, the height is accounted for above. - if (index === this.selectedIndex) { - return; + for (let i = 0; i < this.slides.length; i++) { + if (i === this.selectedIndex) { + continue; } + this.tempSlideOutlet.attach(this.slides.get(i)!.content); - this.tempSlideOutlet.attach(slide.content); + // Wait for the slide to render. Otherwise, the previous slide may not have been removed from the DOM yet. + await new Promise(requestAnimationFrame); // Store the height of the current slide if is larger than the current stored height; if (this.tempSlideContainer.nativeElement.offsetHeight > tallestSlideHeightPx) { @@ -136,8 +137,7 @@ export class VaultCarouselComponent implements AfterViewInit { // cleanup the outlet this.tempSlideOutlet.detach(); - }); - + } // Set the min height of the entire carousel based on the largest slide. this.minHeight = `${tallestSlideHeightPx + heightOfButtonsPx}px`; this.changeDetectorRef.detectChanges(); diff --git a/libs/vault/src/components/carousel/carousel.module.ts b/libs/vault/src/components/carousel/carousel.module.ts new file mode 100644 index 00000000000..c426e7f89c2 --- /dev/null +++ b/libs/vault/src/components/carousel/carousel.module.ts @@ -0,0 +1,10 @@ +import { NgModule } from "@angular/core"; + +import { VaultCarouselSlideComponent } from "./carousel-slide/carousel-slide.component"; +import { VaultCarouselComponent } from "./carousel.component"; + +@NgModule({ + imports: [VaultCarouselComponent, VaultCarouselSlideComponent], + exports: [VaultCarouselComponent, VaultCarouselSlideComponent], +}) +export class VaultCarouselModule {} diff --git a/libs/vault/src/components/carousel/index.ts b/libs/vault/src/components/carousel/index.ts index a785c261020..b2fcfb087f5 100644 --- a/libs/vault/src/components/carousel/index.ts +++ b/libs/vault/src/components/carousel/index.ts @@ -1 +1 @@ -export { VaultCarouselComponent } from "./carousel.component"; +export { VaultCarouselModule } from "./carousel.module"; diff --git a/libs/vault/src/components/dark-image-source.directive.ts b/libs/vault/src/components/dark-image-source.directive.ts new file mode 100644 index 00000000000..6f3e03ef914 --- /dev/null +++ b/libs/vault/src/components/dark-image-source.directive.ts @@ -0,0 +1,62 @@ +import { + DestroyRef, + Directive, + ElementRef, + HostBinding, + inject, + input, + OnInit, +} from "@angular/core"; +import { takeUntilDestroyed } from "@angular/core/rxjs-interop"; +import { combineLatest, Observable } from "rxjs"; + +import { SYSTEM_THEME_OBSERVABLE } from "@bitwarden/angular/services/injection-tokens"; +import { Theme } from "@bitwarden/common/platform/enums"; +import { ThemeStateService } from "@bitwarden/common/platform/theming/theme-state.service"; + +/** + * Directive that will switch the image source based on the currently applied theme. + * + * @example + * ```html + * + * ``` + */ +@Directive({ + selector: "[appDarkImgSrc]", + standalone: true, +}) +export class DarkImageSourceDirective implements OnInit { + private themeService = inject(ThemeStateService); + private systemTheme$: Observable = inject(SYSTEM_THEME_OBSERVABLE); + private el = inject(ElementRef); + private destroyRef = inject(DestroyRef); + + /** + * The image source to use when the light theme is applied. Automatically assigned the value + * of the `` src attribute. + */ + protected lightImgSrc: string | undefined; + + /** + * The image source to use when the dark theme is applied. + */ + darkImgSrc = input.required({ alias: "appDarkImgSrc" }); + + @HostBinding("attr.src") src: string | undefined; + + ngOnInit() { + // Set the light image source from the element's current src attribute + this.lightImgSrc = this.el.nativeElement.getAttribute("src"); + + // Update the image source based on the active theme + combineLatest([this.themeService.selectedTheme$, this.systemTheme$]) + .pipe(takeUntilDestroyed(this.destroyRef)) + .subscribe(([theme, systemTheme]) => { + const appliedTheme = theme === "system" ? systemTheme : theme; + const isDark = + appliedTheme === "dark" || appliedTheme === "nord" || appliedTheme === "solarizedDark"; + this.src = isDark ? this.darkImgSrc() : this.lightImgSrc; + }); + } +} diff --git a/libs/vault/src/index.ts b/libs/vault/src/index.ts index ac905c1f5ef..e4857411d05 100644 --- a/libs/vault/src/index.ts +++ b/libs/vault/src/index.ts @@ -4,6 +4,7 @@ export { CopyCipherFieldService, CopyAction } from "./services/copy-cipher-field export { CopyCipherFieldDirective } from "./components/copy-cipher-field.directive"; export { OrgIconDirective } from "./components/org-icon.directive"; export { CanDeleteCipherDirective } from "./components/can-delete-cipher.directive"; +export { DarkImageSourceDirective } from "./components/dark-image-source.directive"; export * from "./utils/observable-utilities"; @@ -21,6 +22,7 @@ export { NewDeviceVerificationNoticePageOneComponent } from "./components/new-de export { NewDeviceVerificationNoticePageTwoComponent } from "./components/new-device-verification-notice/new-device-verification-notice-page-two.component"; export { DecryptionFailureDialogComponent } from "./components/decryption-failure-dialog/decryption-failure-dialog.component"; export * from "./components/add-edit-folder-dialog/add-edit-folder-dialog.component"; +export * from "./components/carousel"; export * as VaultIcons from "./icons"; diff --git a/package-lock.json b/package-lock.json index 1431f31daac..ab526f2730b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -24,7 +24,7 @@ "@angular/platform-browser": "18.2.13", "@angular/platform-browser-dynamic": "18.2.13", "@angular/router": "18.2.13", - "@bitwarden/sdk-internal": "0.2.0-main.105", + "@bitwarden/sdk-internal": "0.2.0-main.107", "@electron/fuses": "1.8.0", "@emotion/css": "11.13.5", "@koa/multer": "3.0.2", @@ -4651,9 +4651,9 @@ "link": true }, "node_modules/@bitwarden/sdk-internal": { - "version": "0.2.0-main.105", - "resolved": "https://registry.npmjs.org/@bitwarden/sdk-internal/-/sdk-internal-0.2.0-main.105.tgz", - "integrity": "sha512-MaQFJbuKTCbN9oZC/+opYVeegaNNJpiUv9/zx+gu8KxWmX0hyEkNPtHKxBjDt3kLLz69CudDtUxEgqOfcDsYAw==", + "version": "0.2.0-main.107", + "resolved": "https://registry.npmjs.org/@bitwarden/sdk-internal/-/sdk-internal-0.2.0-main.107.tgz", + "integrity": "sha512-xpOF6NAS0/em3jFBv4FI1ASy1Nuc7I1v41TVmG56wS+80y+NH1RnfGjp+a+XiO7Xxh3jssrxmjzihJjWQQA0rg==", "license": "GPL-3.0" }, "node_modules/@bitwarden/send-ui": { diff --git a/package.json b/package.json index 54b1f642086..cb941238fc2 100644 --- a/package.json +++ b/package.json @@ -154,7 +154,7 @@ "@angular/platform-browser": "18.2.13", "@angular/platform-browser-dynamic": "18.2.13", "@angular/router": "18.2.13", - "@bitwarden/sdk-internal": "0.2.0-main.105", + "@bitwarden/sdk-internal": "0.2.0-main.107", "@electron/fuses": "1.8.0", "@emotion/css": "11.13.5", "@koa/multer": "3.0.2", diff --git a/tsconfig.json b/tsconfig.json index 37f7aac05d8..fb50f1e7033 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -6,7 +6,7 @@ "noImplicitAny": true, "target": "ES2016", "module": "ES2020", - "lib": ["es5", "es6", "es7", "dom", "ES2021"], + "lib": ["es5", "es6", "es7", "dom", "ES2021", "ESNext.Disposable"], "sourceMap": true, "allowSyntheticDefaultImports": true, "experimentalDecorators": true,